Merge remote-tracking branch 'upstream/21.x' into main-202209301431
diff --git a/.bazelignore b/.bazelignore
index 5c3a81c..dc5c301 100644
--- a/.bazelignore
+++ b/.bazelignore
@@ -1,4 +1,4 @@
# These are fetched as external repositories.
-third_party/benchmark
+third_party/abseil-cpp
third_party/googletest
_build/
diff --git a/.bazelrc b/.bazelrc
new file mode 100644
index 0000000..554440c
--- /dev/null
+++ b/.bazelrc
@@ -0,0 +1 @@
+build --cxxopt=-std=c++14 --host_cxxopt=-std=c++14
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
index f9411a6..88bc074 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -2,7 +2,7 @@
name: Bug report
about: Create a report to help us improve
title: ''
-labels: ''
+labels: 'untriaged'
assignees: ''
---
@@ -16,7 +16,7 @@
-->
**What version of protobuf and what language are you using?**
-Version: main/v3.6.0/v3.5.0 etc.
+Version: main/v3.6.0/v3.5.0 etc. (NOTE: please try updating to the latest version of protoc/runtime possible beforehand to attempt to resolve your problem)
Language: C++/Java/Python/C#/Ruby/PHP/Objective-C/Javascript
**What operating system (Linux, Windows, ...) and version?**
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
index 28b9bc9..ada9ed7 100644
--- a/.github/ISSUE_TEMPLATE/feature_request.md
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -2,7 +2,7 @@
name: Feature request
about: Suggest an idea for this project
title: ''
-labels: ''
+labels: 'untriaged'
assignees: ''
---
diff --git a/.github/workflows/codespell.yml b/.github/workflows/codespell.yml
index 41dc715..d056ecc 100644
--- a/.github/workflows/codespell.yml
+++ b/.github/workflows/codespell.yml
@@ -13,4 +13,4 @@
with:
check_filenames: true
skip: ./.git,./conformance/third_party,*.snk,*.pb,*.pb.cc,*.pb.h,./src/google/protobuf/testdata,./objectivec/Tests,./python/compatibility_tests/v2.5.0/tests/google/protobuf/internal,./.github/workflows/codespell.yml
- ignore_words_list: "alow,alse,ba,cleare,copyable,cloneable,dedup,dur,errorprone,files',fo,fundementals,hel,importd,inout,leapyear,nd,nin,ois,ons,parseable,process',te,testof,ue,unparseable,wasn,wee,gae,keyserver,objext,od,optin,streem,sur"
+ ignore_words_list: "alow,alse,ba,chec,cleare,copyable,cloneable,dedup,dur,errorprone,files',fo,fundementals,hel,importd,inout,leapyear,nd,nin,ois,ons,parseable,process',te,testof,ue,unparseable,wasn,wee,gae,keyserver,objext,od,optin,streem,sur,falsy"
diff --git a/.github/workflows/generated_cmake.yml b/.github/workflows/generated_cmake.yml
new file mode 100644
index 0000000..640bd13
--- /dev/null
+++ b/.github/workflows/generated_cmake.yml
@@ -0,0 +1,29 @@
+name: Generate CMake File Lists
+
+on:
+ push:
+ branches:
+ - main
+ - '[0-9]+.x'
+ # The 21.x branch predates support for auto-generation of the CMake file
+ # lists, so we make sure to exclude it.
+ - '!21.x'
+
+jobs:
+ cmake:
+ if: github.repository == 'protocolbuffers/protobuf'
+ runs-on: ubuntu-latest
+
+ strategy:
+ fail-fast: false # Don't cancel all jobs if one fails.
+
+ steps:
+ - uses: actions/checkout@v3
+ with:
+ # Note: this token has an expiration date, so if the workflow starts
+ # failing then you may need to generate a fresh token.
+ token: ${{ secrets.BOT_ACCESS_TOKEN }}
+ - name: Configure name and email address in Git
+ run: cd ${{ github.workspace }} && git config user.name "Protobuf Team Bot" && git config user.email "protobuf-team-bot@google.com"
+ - name: Commit and push update
+ run: cd ${{ github.workspace }} && ./cmake/push_auto_update.sh
diff --git a/.gitignore b/.gitignore
index 62de6f1..ea95cc9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,29 +1,24 @@
-# autogen.sh-generated files
-Makefile.in
-src/Makefile.in
-config.guess
-config.h.in
-config.sub
-configure
-depcomp
-install-sh
-ltmain.sh
-missing
+# CMake-generated files
+.ninja_deps
+.ninja_logs
+cmake/protobuf/*.cmake
+cmake_install.cmake
+CMakeCache.txt
+CTestTestfile.cmake
+CMakeFiles/*
+Testing/Temporary/*
-aclocal.m4
-m4/libtool.m4
-m4/ltoptions.m4
-m4/ltsugar.m4
-m4/ltversion.m4
-m4/lt~obsolete.m4
-autom4te.cache
+/core
+/protoc
+/test_plugin
+/tests
+/lite-test
+/protoc-*.*
# downloaded files
/gmock
# in-tree configure-generated files
-Makefile
-src/Makefile
/config.h
config.log
config.status
@@ -38,8 +33,8 @@
*.o
*.lo
*.la
-src/.libs
*.so
+*.a
.dirstamp
@@ -60,8 +55,6 @@
python/docs/_build/
src/js_embed
-src/protoc
-src/unittest_proto_middleman
# vim generated
*.swp
diff --git a/.gitmodules b/.gitmodules
index bcd125a..e05b57b 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,7 +1,8 @@
-[submodule "third_party/benchmark"]
- path = third_party/benchmark
- url = https://github.com/google/benchmark.git
[submodule "third_party/googletest"]
path = third_party/googletest
url = https://github.com/google/googletest.git
ignore = dirty
+[submodule "third_party/abseil-cpp"]
+ path = third_party/abseil-cpp
+ url = https://github.com/abseil/abseil-cpp.git
+ branch = lts_2022_06_23
diff --git a/BUILD.bazel b/BUILD.bazel
index 0f6e41e..fd9ee70 100644
--- a/BUILD.bazel
+++ b/BUILD.bazel
@@ -1,252 +1,17 @@
# Bazel (https://bazel.build/) BUILD file for Protobuf.
-load("@bazel_skylib//rules:common_settings.bzl", "string_flag")
-load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library", "cc_test")
+load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library", "cc_proto_library")
load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
load("@rules_proto//proto:defs.bzl", "proto_lang_toolchain", "proto_library")
-load("@rules_python//python:defs.bzl", "py_library")
-load("@rules_java//java:defs.bzl", "java_binary", "java_lite_proto_library", "java_proto_library")
+load("@rules_java//java:defs.bzl", "java_lite_proto_library", "java_proto_library")
load("//build_defs:cpp_opts.bzl", "COPTS", "LINK_OPTS", "PROTOC_LINK_OPTS")
-load(
- ":protobuf.bzl",
- "adapt_proto_library",
- "cc_proto_library",
- "internal_copied_filegroup",
- "internal_protobuf_py_tests",
- "py_proto_library",
-)
+load(":protobuf.bzl", "internal_objc_proto_library", "internal_php_proto_library", "internal_py_proto_library", "internal_ruby_proto_library")
licenses(["notice"])
exports_files(["LICENSE"])
################################################################################
-# Protobuf Runtime Library
-################################################################################
-
-cc_library(
- name = "protobuf_lite",
- srcs = [
- # AUTOGEN(protobuf_lite_srcs)
- "src/google/protobuf/any_lite.cc",
- "src/google/protobuf/arena.cc",
- "src/google/protobuf/arenastring.cc",
- "src/google/protobuf/arenaz_sampler.cc",
- "src/google/protobuf/extension_set.cc",
- "src/google/protobuf/generated_enum_util.cc",
- "src/google/protobuf/generated_message_tctable_lite.cc",
- "src/google/protobuf/generated_message_util.cc",
- "src/google/protobuf/implicit_weak_message.cc",
- "src/google/protobuf/inlined_string_field.cc",
- "src/google/protobuf/io/coded_stream.cc",
- "src/google/protobuf/io/io_win32.cc",
- "src/google/protobuf/io/strtod.cc",
- "src/google/protobuf/io/zero_copy_stream.cc",
- "src/google/protobuf/io/zero_copy_stream_impl.cc",
- "src/google/protobuf/io/zero_copy_stream_impl_lite.cc",
- "src/google/protobuf/map.cc",
- "src/google/protobuf/message_lite.cc",
- "src/google/protobuf/parse_context.cc",
- "src/google/protobuf/repeated_field.cc",
- "src/google/protobuf/repeated_ptr_field.cc",
- "src/google/protobuf/stubs/bytestream.cc",
- "src/google/protobuf/stubs/common.cc",
- "src/google/protobuf/stubs/int128.cc",
- "src/google/protobuf/stubs/status.cc",
- "src/google/protobuf/stubs/statusor.cc",
- "src/google/protobuf/stubs/stringpiece.cc",
- "src/google/protobuf/stubs/stringprintf.cc",
- "src/google/protobuf/stubs/structurally_valid.cc",
- "src/google/protobuf/stubs/strutil.cc",
- "src/google/protobuf/stubs/time.cc",
- "src/google/protobuf/wire_format_lite.cc",
- ],
- hdrs = glob([
- "src/google/protobuf/**/*.h",
- "src/google/protobuf/**/*.inc",
- ]),
- copts = COPTS,
- includes = ["src/"],
- linkopts = LINK_OPTS,
- visibility = ["//visibility:public"],
-)
-
-cc_library(
- name = "protobuf",
- srcs = [
- # AUTOGEN(protobuf_srcs)
- "src/google/protobuf/any.cc",
- "src/google/protobuf/any.pb.cc",
- "src/google/protobuf/api.pb.cc",
- "src/google/protobuf/compiler/importer.cc",
- "src/google/protobuf/compiler/parser.cc",
- "src/google/protobuf/descriptor.cc",
- "src/google/protobuf/descriptor.pb.cc",
- "src/google/protobuf/descriptor_database.cc",
- "src/google/protobuf/duration.pb.cc",
- "src/google/protobuf/dynamic_message.cc",
- "src/google/protobuf/empty.pb.cc",
- "src/google/protobuf/extension_set_heavy.cc",
- "src/google/protobuf/field_mask.pb.cc",
- "src/google/protobuf/generated_message_bases.cc",
- "src/google/protobuf/generated_message_reflection.cc",
- "src/google/protobuf/generated_message_tctable_full.cc",
- "src/google/protobuf/io/gzip_stream.cc",
- "src/google/protobuf/io/printer.cc",
- "src/google/protobuf/io/tokenizer.cc",
- "src/google/protobuf/map_field.cc",
- "src/google/protobuf/message.cc",
- "src/google/protobuf/reflection_ops.cc",
- "src/google/protobuf/service.cc",
- "src/google/protobuf/source_context.pb.cc",
- "src/google/protobuf/struct.pb.cc",
- "src/google/protobuf/stubs/substitute.cc",
- "src/google/protobuf/text_format.cc",
- "src/google/protobuf/timestamp.pb.cc",
- "src/google/protobuf/type.pb.cc",
- "src/google/protobuf/unknown_field_set.cc",
- "src/google/protobuf/util/delimited_message_util.cc",
- "src/google/protobuf/util/field_comparator.cc",
- "src/google/protobuf/util/field_mask_util.cc",
- "src/google/protobuf/util/internal/datapiece.cc",
- "src/google/protobuf/util/internal/default_value_objectwriter.cc",
- "src/google/protobuf/util/internal/error_listener.cc",
- "src/google/protobuf/util/internal/field_mask_utility.cc",
- "src/google/protobuf/util/internal/json_escaping.cc",
- "src/google/protobuf/util/internal/json_objectwriter.cc",
- "src/google/protobuf/util/internal/json_stream_parser.cc",
- "src/google/protobuf/util/internal/object_writer.cc",
- "src/google/protobuf/util/internal/proto_writer.cc",
- "src/google/protobuf/util/internal/protostream_objectsource.cc",
- "src/google/protobuf/util/internal/protostream_objectwriter.cc",
- "src/google/protobuf/util/internal/type_info.cc",
- "src/google/protobuf/util/internal/utility.cc",
- "src/google/protobuf/util/json_util.cc",
- "src/google/protobuf/util/message_differencer.cc",
- "src/google/protobuf/util/time_util.cc",
- "src/google/protobuf/util/type_resolver_util.cc",
- "src/google/protobuf/wire_format.cc",
- "src/google/protobuf/wrappers.pb.cc",
- ],
- hdrs = glob([
- "src/**/*.h",
- "src/**/*.inc",
- ]),
- copts = COPTS,
- includes = ["src/"],
- linkopts = LINK_OPTS,
- visibility = ["//visibility:public"],
- deps = [":protobuf_lite"] + select({
- "//build_defs:config_msvc": [],
- "//conditions:default": ["@zlib//:zlib"],
- }),
-)
-
-# This provides just the header files for use in projects that need to build
-# shared libraries for dynamic loading. This target is available until Bazel
-# adds native support for such use cases.
-# TODO(keveman): Remove this target once the support gets added to Bazel.
-cc_library(
- name = "protobuf_headers",
- hdrs = glob([
- "src/**/*.h",
- "src/**/*.inc",
- ]),
- includes = ["src/"],
- visibility = ["//visibility:public"],
-)
-
-# DEPRECATED: Prefer :well_known_type_protos for the Well-Known Types
-# (https://developers.google.com/protocol-buffers/docs/reference/google.protobuf)
-# or :descriptor_proto(_srcs) for descriptor.proto (source), or
-# :compiler_plugin_proto for compiler/plugin.proto.
-filegroup(
- name = "well_known_protos",
- srcs = [
- "src/google/protobuf/compiler/plugin.proto",
- "src/google/protobuf/descriptor.proto",
- ":well_known_type_protos",
- ],
- deprecation = "Prefer :well_known_type_protos instead.",
- visibility = ["//visibility:public"],
-)
-
-filegroup(
- name = "well_known_type_protos",
- srcs = [
- "src/google/protobuf/any.proto",
- "src/google/protobuf/api.proto",
- "src/google/protobuf/duration.proto",
- "src/google/protobuf/empty.proto",
- "src/google/protobuf/field_mask.proto",
- "src/google/protobuf/source_context.proto",
- "src/google/protobuf/struct.proto",
- "src/google/protobuf/timestamp.proto",
- "src/google/protobuf/type.proto",
- "src/google/protobuf/wrappers.proto",
- ],
- visibility = ["//visibility:public"],
-)
-
-filegroup(
- name = "built_in_runtime_protos",
- srcs = [
- "src/google/protobuf/compiler/plugin.proto",
- "src/google/protobuf/descriptor.proto",
- ],
- visibility = ["//:__subpackages__"],
-)
-
-exports_files(
- srcs = [
- "src/google/protobuf/any.proto",
- "src/google/protobuf/api.proto",
- "src/google/protobuf/compiler/plugin.proto",
- "src/google/protobuf/descriptor.proto",
- "src/google/protobuf/duration.proto",
- "src/google/protobuf/empty.proto",
- "src/google/protobuf/field_mask.proto",
- "src/google/protobuf/source_context.proto",
- "src/google/protobuf/struct.proto",
- "src/google/protobuf/timestamp.proto",
- "src/google/protobuf/type.proto",
- "src/google/protobuf/wrappers.proto",
- ],
- visibility = ["//pkg:__pkg__"],
-)
-
-alias(
- name = "lite_well_known_protos",
- actual = ":well_known_type_protos",
- visibility = ["//visibility:public"],
-)
-
-adapt_proto_library(
- name = "cc_wkt_protos_genproto",
- visibility = ["//visibility:public"],
- deps = [
- "//:any_proto",
- "//:api_proto",
- "//:compiler_plugin_proto",
- "//:descriptor_proto",
- "//:duration_proto",
- "//:empty_proto",
- "//:field_mask_proto",
- "//:source_context_proto",
- "//:struct_proto",
- "//:timestamp_proto",
- "//:type_proto",
- "//:wrappers_proto",
- ],
-)
-
-cc_library(
- name = "cc_wkt_protos",
- deprecation = "Only for backward compatibility. Do not use.",
- visibility = ["//visibility:public"],
-)
-
-################################################################################
# Well Known Types Proto Library Rules
#
# https://developers.google.com/protocol-buffers/docs/reference/google.protobuf
@@ -256,507 +21,200 @@
#
# java_proto_library(
# name = "any_java_proto",
-# deps = ["@com_google_protobuf//:any_proto],
+# deps = ["@com_google_protobuf//:any_proto"],
# )
################################################################################
-proto_library(
+alias(
name = "any_proto",
- srcs = ["src/google/protobuf/any.proto"],
- strip_import_prefix = "src",
+ actual = "//src/google/protobuf:any_proto",
visibility = ["//visibility:public"],
)
-proto_library(
+alias(
name = "api_proto",
- srcs = ["src/google/protobuf/api.proto"],
- strip_import_prefix = "src",
+ actual = "//src/google/protobuf:api_proto",
visibility = ["//visibility:public"],
- deps = [
- "//:source_context_proto",
- "//:type_proto",
- ],
)
-proto_library(
+alias(
name = "duration_proto",
- srcs = ["//:src/google/protobuf/duration.proto"],
- strip_import_prefix = "src",
+ actual = "//src/google/protobuf:duration_proto",
visibility = ["//visibility:public"],
)
-proto_library(
+alias(
name = "empty_proto",
- srcs = ["src/google/protobuf/empty.proto"],
- strip_import_prefix = "src",
+ actual = "//src/google/protobuf:empty_proto",
visibility = ["//visibility:public"],
)
-proto_library(
+alias(
name = "field_mask_proto",
- srcs = ["src/google/protobuf/field_mask.proto"],
- strip_import_prefix = "src",
+ actual = "//src/google/protobuf:field_mask_proto",
visibility = ["//visibility:public"],
)
-proto_library(
+alias(
name = "source_context_proto",
- srcs = ["src/google/protobuf/source_context.proto"],
- strip_import_prefix = "src",
+ actual = "//src/google/protobuf:source_context_proto",
visibility = ["//visibility:public"],
)
-proto_library(
+alias(
name = "struct_proto",
- srcs = ["src/google/protobuf/struct.proto"],
- strip_import_prefix = "src",
+ actual = "//src/google/protobuf:struct_proto",
visibility = ["//visibility:public"],
)
-proto_library(
+alias(
name = "timestamp_proto",
- srcs = ["src/google/protobuf/timestamp.proto"],
- strip_import_prefix = "src",
+ actual = "//src/google/protobuf:timestamp_proto",
visibility = ["//visibility:public"],
)
-proto_library(
+alias(
name = "type_proto",
- srcs = ["src/google/protobuf/type.proto"],
- strip_import_prefix = "src",
+ actual = "//src/google/protobuf:type_proto",
visibility = ["//visibility:public"],
- deps = [
- "//:any_proto",
- "//:source_context_proto",
- ],
)
-proto_library(
+alias(
name = "wrappers_proto",
- srcs = ["src/google/protobuf/wrappers.proto"],
- strip_import_prefix = "src",
+ actual = "//src/google/protobuf:wrappers_proto",
visibility = ["//visibility:public"],
)
-# Built-in runtime types
-
-proto_library(
- name = "compiler_plugin_proto",
- srcs = ["src/google/protobuf/compiler/plugin.proto"],
- strip_import_prefix = "src",
+# Source files: these are aliases to a filegroup, not a `proto_library`.
+#
+# (This is _probably_ not what you want.)
+alias(
+ name = "lite_well_known_protos",
+ actual = "//src/google/protobuf:well_known_type_protos", # filegroup
visibility = ["//visibility:public"],
- deps = ["//:descriptor_proto"],
)
-proto_library(
+alias(
+ name = "well_known_type_protos",
+ actual = "//src/google/protobuf:well_known_type_protos", # filegroup
+ visibility = ["//visibility:public"],
+)
+
+# Built-in runtime protos: these are part of protobuf's internal
+# implementation, but are not Well-Known Types.
+
+alias(
name = "descriptor_proto",
- srcs = ["src/google/protobuf/descriptor.proto"],
- strip_import_prefix = "src",
+ actual = "//src/google/protobuf:descriptor_proto", # proto_library
visibility = ["//visibility:public"],
)
+alias(
+ name = "descriptor_proto_srcs",
+ actual = "//src/google/protobuf:descriptor_proto_srcs", # filegroup
+ visibility = ["//visibility:public"],
+)
+
+alias(
+ name = "compiler_plugin_proto",
+ actual = "//src/google/protobuf/compiler:plugin_proto", # proto_library
+ visibility = ["//visibility:public"],
+)
+
+cc_library(
+ name = "cc_wkt_protos",
+ deprecation = "Only for backward compatibility. Do not use.",
+ visibility = ["//visibility:public"],
+)
+
+# Source protos that are typically part of the protobuf runtime.
+#
+# DEPRECATED: Prefer :well_known_type_protos for the Well-Known Types
+# (https://developers.google.com/protocol-buffers/docs/reference/google.protobuf)
+# or :descriptor_proto(_srcs) for descriptor.proto (source), or
+# :compiler_plugin_proto for compiler/plugin.proto.
+filegroup(
+ name = "well_known_protos",
+ srcs = [
+ ":descriptor_proto_srcs",
+ ":well_known_type_protos",
+ "//src/google/protobuf/compiler:plugin.proto",
+ ],
+ deprecation = "Prefer :well_known_type_protos instead.",
+ visibility = ["//visibility:public"],
+)
+
+internal_ruby_proto_library(
+ name = "well_known_ruby_protos",
+ srcs = [":well_known_protos"],
+ includes = ["src"],
+ visibility = [
+ "//conformance:__pkg__",
+ "//ruby:__subpackages__",
+ ],
+)
+
################################################################################
# Protocol Buffers Compiler
################################################################################
-cc_library(
- name = "protoc_lib",
- srcs = [
- # AUTOGEN(protoc_lib_srcs)
- "src/google/protobuf/compiler/code_generator.cc",
- "src/google/protobuf/compiler/command_line_interface.cc",
- "src/google/protobuf/compiler/cpp/enum.cc",
- "src/google/protobuf/compiler/cpp/enum_field.cc",
- "src/google/protobuf/compiler/cpp/extension.cc",
- "src/google/protobuf/compiler/cpp/field.cc",
- "src/google/protobuf/compiler/cpp/file.cc",
- "src/google/protobuf/compiler/cpp/generator.cc",
- "src/google/protobuf/compiler/cpp/helpers.cc",
- "src/google/protobuf/compiler/cpp/map_field.cc",
- "src/google/protobuf/compiler/cpp/message.cc",
- "src/google/protobuf/compiler/cpp/message_field.cc",
- "src/google/protobuf/compiler/cpp/padding_optimizer.cc",
- "src/google/protobuf/compiler/cpp/parse_function_generator.cc",
- "src/google/protobuf/compiler/cpp/primitive_field.cc",
- "src/google/protobuf/compiler/cpp/service.cc",
- "src/google/protobuf/compiler/cpp/string_field.cc",
- "src/google/protobuf/compiler/csharp/csharp_doc_comment.cc",
- "src/google/protobuf/compiler/csharp/csharp_enum.cc",
- "src/google/protobuf/compiler/csharp/csharp_enum_field.cc",
- "src/google/protobuf/compiler/csharp/csharp_field_base.cc",
- "src/google/protobuf/compiler/csharp/csharp_generator.cc",
- "src/google/protobuf/compiler/csharp/csharp_helpers.cc",
- "src/google/protobuf/compiler/csharp/csharp_map_field.cc",
- "src/google/protobuf/compiler/csharp/csharp_message.cc",
- "src/google/protobuf/compiler/csharp/csharp_message_field.cc",
- "src/google/protobuf/compiler/csharp/csharp_primitive_field.cc",
- "src/google/protobuf/compiler/csharp/csharp_reflection_class.cc",
- "src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.cc",
- "src/google/protobuf/compiler/csharp/csharp_repeated_message_field.cc",
- "src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc",
- "src/google/protobuf/compiler/csharp/csharp_source_generator_base.cc",
- "src/google/protobuf/compiler/csharp/csharp_wrapper_field.cc",
- "src/google/protobuf/compiler/java/context.cc",
- "src/google/protobuf/compiler/java/doc_comment.cc",
- "src/google/protobuf/compiler/java/enum.cc",
- "src/google/protobuf/compiler/java/enum_field.cc",
- "src/google/protobuf/compiler/java/enum_field_lite.cc",
- "src/google/protobuf/compiler/java/enum_lite.cc",
- "src/google/protobuf/compiler/java/extension.cc",
- "src/google/protobuf/compiler/java/extension_lite.cc",
- "src/google/protobuf/compiler/java/field.cc",
- "src/google/protobuf/compiler/java/file.cc",
- "src/google/protobuf/compiler/java/generator.cc",
- "src/google/protobuf/compiler/java/generator_factory.cc",
- "src/google/protobuf/compiler/java/helpers.cc",
- "src/google/protobuf/compiler/java/kotlin_generator.cc",
- "src/google/protobuf/compiler/java/map_field.cc",
- "src/google/protobuf/compiler/java/map_field_lite.cc",
- "src/google/protobuf/compiler/java/message.cc",
- "src/google/protobuf/compiler/java/message_builder.cc",
- "src/google/protobuf/compiler/java/message_builder_lite.cc",
- "src/google/protobuf/compiler/java/message_field.cc",
- "src/google/protobuf/compiler/java/message_field_lite.cc",
- "src/google/protobuf/compiler/java/message_lite.cc",
- "src/google/protobuf/compiler/java/name_resolver.cc",
- "src/google/protobuf/compiler/java/primitive_field.cc",
- "src/google/protobuf/compiler/java/primitive_field_lite.cc",
- "src/google/protobuf/compiler/java/service.cc",
- "src/google/protobuf/compiler/java/shared_code_generator.cc",
- "src/google/protobuf/compiler/java/string_field.cc",
- "src/google/protobuf/compiler/java/string_field_lite.cc",
- "src/google/protobuf/compiler/objectivec/objectivec_enum.cc",
- "src/google/protobuf/compiler/objectivec/objectivec_enum_field.cc",
- "src/google/protobuf/compiler/objectivec/objectivec_extension.cc",
- "src/google/protobuf/compiler/objectivec/objectivec_field.cc",
- "src/google/protobuf/compiler/objectivec/objectivec_file.cc",
- "src/google/protobuf/compiler/objectivec/objectivec_generator.cc",
- "src/google/protobuf/compiler/objectivec/objectivec_helpers.cc",
- "src/google/protobuf/compiler/objectivec/objectivec_map_field.cc",
- "src/google/protobuf/compiler/objectivec/objectivec_message.cc",
- "src/google/protobuf/compiler/objectivec/objectivec_message_field.cc",
- "src/google/protobuf/compiler/objectivec/objectivec_oneof.cc",
- "src/google/protobuf/compiler/objectivec/objectivec_primitive_field.cc",
- "src/google/protobuf/compiler/php/php_generator.cc",
- "src/google/protobuf/compiler/plugin.cc",
- "src/google/protobuf/compiler/plugin.pb.cc",
- "src/google/protobuf/compiler/python/generator.cc",
- "src/google/protobuf/compiler/python/helpers.cc",
- "src/google/protobuf/compiler/python/pyi_generator.cc",
- "src/google/protobuf/compiler/ruby/ruby_generator.cc",
- "src/google/protobuf/compiler/subprocess.cc",
- "src/google/protobuf/compiler/zip_writer.cc",
- ],
- copts = COPTS,
- includes = ["src/"],
- linkopts = LINK_OPTS,
- visibility = ["//visibility:public"],
- deps = [":protobuf"],
-)
-
cc_binary(
name = "protoc",
- srcs = ["src/google/protobuf/compiler/main.cc"],
+ copts = COPTS,
linkopts = LINK_OPTS + PROTOC_LINK_OPTS,
visibility = ["//visibility:public"],
- deps = [":protoc_lib"],
+ deps = ["//src/google/protobuf/compiler:protoc_lib"],
)
################################################################################
-# Tests
+# C++ runtime
################################################################################
-filegroup(
- name = "testdata",
- srcs = glob(["src/google/protobuf/testdata/**/*"]),
- visibility = [
- "//:__subpackages__",
- "@upb//:__subpackages__",
- ],
+# The "lite" runtime works for .proto files that specify the option:
+# optimize_for = LITE_RUNTIME;
+#
+# The lite runtime does not include the `Reflection` APIs (including
+# `Descriptor` and related types) or Well-Known Types.
+#
+# See also:
+# https://developers.google.com/protocol-buffers/docs/reference/cpp-generated#message
+# https://developers.google.com/protocol-buffers/docs/reference/google.protobuf
+alias(
+ name = "protobuf_lite",
+ actual = "//src/google/protobuf:protobuf_lite",
+ visibility = ["//visibility:public"],
)
-RELATIVE_LITE_TEST_PROTOS = [
- # AUTOGEN(lite_test_protos)
- "google/protobuf/map_lite_unittest.proto",
- "google/protobuf/unittest_import_lite.proto",
- "google/protobuf/unittest_import_public_lite.proto",
- "google/protobuf/unittest_lite.proto",
-]
-
-LITE_TEST_PROTOS = ["src/" + s for s in RELATIVE_LITE_TEST_PROTOS]
-
-RELATIVE_TEST_PROTOS = [
- # AUTOGEN(test_protos)
- "google/protobuf/any_test.proto",
- "google/protobuf/compiler/cpp/test_bad_identifiers.proto",
- "google/protobuf/compiler/cpp/test_large_enum_value.proto",
- "google/protobuf/map_proto2_unittest.proto",
- "google/protobuf/map_unittest.proto",
- "google/protobuf/unittest.proto",
- "google/protobuf/unittest_arena.proto",
- "google/protobuf/unittest_custom_options.proto",
- "google/protobuf/unittest_drop_unknown_fields.proto",
- "google/protobuf/unittest_embed_optimize_for.proto",
- "google/protobuf/unittest_empty.proto",
- "google/protobuf/unittest_enormous_descriptor.proto",
- "google/protobuf/unittest_import.proto",
- "google/protobuf/unittest_import_public.proto",
- "google/protobuf/unittest_lazy_dependencies.proto",
- "google/protobuf/unittest_lazy_dependencies_custom_option.proto",
- "google/protobuf/unittest_lazy_dependencies_enum.proto",
- "google/protobuf/unittest_lite_imports_nonlite.proto",
- "google/protobuf/unittest_mset.proto",
- "google/protobuf/unittest_mset_wire_format.proto",
- "google/protobuf/unittest_no_field_presence.proto",
- "google/protobuf/unittest_no_generic_services.proto",
- "google/protobuf/unittest_optimize_for.proto",
- "google/protobuf/unittest_preserve_unknown_enum.proto",
- "google/protobuf/unittest_preserve_unknown_enum2.proto",
- "google/protobuf/unittest_proto3.proto",
- "google/protobuf/unittest_proto3_arena.proto",
- "google/protobuf/unittest_proto3_arena_lite.proto",
- "google/protobuf/unittest_proto3_lite.proto",
- "google/protobuf/unittest_proto3_optional.proto",
- "google/protobuf/unittest_well_known_types.proto",
- "google/protobuf/util/internal/testdata/anys.proto",
- "google/protobuf/util/internal/testdata/books.proto",
- "google/protobuf/util/internal/testdata/default_value.proto",
- "google/protobuf/util/internal/testdata/default_value_test.proto",
- "google/protobuf/util/internal/testdata/field_mask.proto",
- "google/protobuf/util/internal/testdata/maps.proto",
- "google/protobuf/util/internal/testdata/oneofs.proto",
- "google/protobuf/util/internal/testdata/proto3.proto",
- "google/protobuf/util/internal/testdata/struct.proto",
- "google/protobuf/util/internal/testdata/timestamp_duration.proto",
- "google/protobuf/util/internal/testdata/wrappers.proto",
- "google/protobuf/util/json_format.proto",
- "google/protobuf/util/json_format_proto3.proto",
- "google/protobuf/util/message_differencer_unittest.proto",
-]
-
-TEST_PROTOS = ["src/" + s for s in RELATIVE_TEST_PROTOS]
-
-GENERIC_RELATIVE_TEST_PROTOS = [
- "google/protobuf/map_proto2_unittest.proto",
- "google/protobuf/map_unittest.proto",
- "google/protobuf/unittest.proto",
- "google/protobuf/unittest_arena.proto",
- "google/protobuf/unittest_custom_options.proto",
- "google/protobuf/unittest_drop_unknown_fields.proto",
- "google/protobuf/unittest_embed_optimize_for.proto",
- "google/protobuf/unittest_empty.proto",
- "google/protobuf/unittest_enormous_descriptor.proto",
- "google/protobuf/unittest_import.proto",
- "google/protobuf/unittest_import_public.proto",
- "google/protobuf/unittest_lazy_dependencies.proto",
- "google/protobuf/unittest_lazy_dependencies_custom_option.proto",
- "google/protobuf/unittest_lazy_dependencies_enum.proto",
- "google/protobuf/unittest_lite_imports_nonlite.proto",
- "google/protobuf/unittest_mset.proto",
- "google/protobuf/unittest_mset_wire_format.proto",
- "google/protobuf/unittest_no_field_presence.proto",
- "google/protobuf/unittest_no_generic_services.proto",
- "google/protobuf/unittest_optimize_for.proto",
- "google/protobuf/unittest_preserve_unknown_enum.proto",
- "google/protobuf/unittest_preserve_unknown_enum2.proto",
- "google/protobuf/unittest_proto3.proto",
- "google/protobuf/unittest_proto3_arena.proto",
- "google/protobuf/unittest_proto3_arena_lite.proto",
- "google/protobuf/unittest_proto3_lite.proto",
- "google/protobuf/unittest_proto3_optional.proto",
- "google/protobuf/unittest_well_known_types.proto",
-]
-
-GENERIC_TEST_PROTOS = ["src/" + s for s in GENERIC_RELATIVE_TEST_PROTOS]
-
-proto_library(
- name = "generic_test_protos",
- srcs = LITE_TEST_PROTOS + GENERIC_TEST_PROTOS,
- strip_import_prefix = "src",
- visibility = ["//:__subpackages__"],
- deps = [
- "//:any_proto",
- "//:api_proto",
- "//:descriptor_proto",
- "//:duration_proto",
- "//:empty_proto",
- "//:field_mask_proto",
- "//:source_context_proto",
- "//:struct_proto",
- "//:timestamp_proto",
- "//:type_proto",
- "//:wrappers_proto",
- ],
-)
-
-cc_proto_library(
- name = "cc_test_protos",
- srcs = LITE_TEST_PROTOS + TEST_PROTOS,
- include = "src",
- default_runtime = ":protobuf",
- protoc = ":protoc",
- deps = [":cc_wkt_protos"],
-)
-
-COMMON_TEST_SRCS = [
- # AUTOGEN(common_test_srcs)
- "src/google/protobuf/arena_test_util.cc",
- "src/google/protobuf/map_lite_test_util.cc",
- "src/google/protobuf/test_util_lite.cc",
- "src/google/protobuf/map_test_util.inc",
- "src/google/protobuf/reflection_tester.cc",
- "src/google/protobuf/test_util.cc",
- "src/google/protobuf/test_util.inc",
- "src/google/protobuf/testing/file.cc",
- "src/google/protobuf/testing/googletest.cc",
-]
-
-cc_binary(
- name = "test_plugin",
- testonly = True,
- srcs = [
- # AUTOGEN(test_plugin_srcs)
- "src/google/protobuf/compiler/mock_code_generator.cc",
- "src/google/protobuf/compiler/test_plugin.cc",
- "src/google/protobuf/testing/file.cc",
- ],
- deps = [
- ":protobuf",
- ":protoc_lib",
- "@com_google_googletest//:gtest",
- ],
-)
-
-cc_test(
- name = "win32_test",
- srcs = ["src/google/protobuf/io/io_win32_unittest.cc"],
- tags = [
- "manual",
- "windows",
- ],
- deps = [
- ":protobuf_lite",
- "@com_google_googletest//:gtest",
- "@com_google_googletest//:gtest_main",
- ],
-)
-
-cc_test(
- name = "protobuf_test",
- srcs = COMMON_TEST_SRCS + [
- # AUTOGEN(test_srcs)
- "src/google/protobuf/any_test.cc",
- "src/google/protobuf/arena_unittest.cc",
- "src/google/protobuf/arenastring_unittest.cc",
- "src/google/protobuf/arenaz_sampler_test.cc",
- "src/google/protobuf/compiler/annotation_test_util.cc",
- "src/google/protobuf/compiler/command_line_interface_unittest.cc",
- "src/google/protobuf/compiler/cpp/bootstrap_unittest.cc",
- "src/google/protobuf/compiler/cpp/metadata_test.cc",
- "src/google/protobuf/compiler/cpp/move_unittest.cc",
- "src/google/protobuf/compiler/cpp/plugin_unittest.cc",
- "src/google/protobuf/compiler/cpp/unittest.cc",
- "src/google/protobuf/compiler/cpp/unittest.inc",
- "src/google/protobuf/compiler/csharp/csharp_bootstrap_unittest.cc",
- "src/google/protobuf/compiler/csharp/csharp_generator_unittest.cc",
- "src/google/protobuf/compiler/importer_unittest.cc",
- "src/google/protobuf/compiler/java/doc_comment_unittest.cc",
- "src/google/protobuf/compiler/java/plugin_unittest.cc",
- "src/google/protobuf/compiler/mock_code_generator.cc",
- "src/google/protobuf/compiler/objectivec/objectivec_helpers_unittest.cc",
- "src/google/protobuf/compiler/parser_unittest.cc",
- "src/google/protobuf/compiler/python/plugin_unittest.cc",
- "src/google/protobuf/compiler/ruby/ruby_generator_unittest.cc",
- "src/google/protobuf/descriptor_database_unittest.cc",
- "src/google/protobuf/descriptor_unittest.cc",
- "src/google/protobuf/drop_unknown_fields_test.cc",
- "src/google/protobuf/dynamic_message_unittest.cc",
- "src/google/protobuf/extension_set_unittest.cc",
- "src/google/protobuf/generated_message_reflection_unittest.cc",
- "src/google/protobuf/generated_message_tctable_lite_test.cc",
- "src/google/protobuf/inlined_string_field_unittest.cc",
- "src/google/protobuf/io/coded_stream_unittest.cc",
- "src/google/protobuf/io/io_win32_unittest.cc",
- "src/google/protobuf/io/printer_unittest.cc",
- "src/google/protobuf/io/tokenizer_unittest.cc",
- "src/google/protobuf/io/zero_copy_stream_unittest.cc",
- "src/google/protobuf/map_field_test.cc",
- "src/google/protobuf/map_test.cc",
- "src/google/protobuf/map_test.inc",
- "src/google/protobuf/message_unittest.cc",
- "src/google/protobuf/message_unittest.inc",
- "src/google/protobuf/no_field_presence_test.cc",
- "src/google/protobuf/preserve_unknown_enum_test.cc",
- "src/google/protobuf/proto3_arena_lite_unittest.cc",
- "src/google/protobuf/proto3_arena_unittest.cc",
- "src/google/protobuf/proto3_lite_unittest.cc",
- "src/google/protobuf/proto3_lite_unittest.inc",
- "src/google/protobuf/reflection_ops_unittest.cc",
- "src/google/protobuf/repeated_field_reflection_unittest.cc",
- "src/google/protobuf/repeated_field_unittest.cc",
- "src/google/protobuf/stubs/bytestream_unittest.cc",
- "src/google/protobuf/stubs/common_unittest.cc",
- "src/google/protobuf/stubs/int128_unittest.cc",
- "src/google/protobuf/stubs/status_test.cc",
- "src/google/protobuf/stubs/statusor_test.cc",
- "src/google/protobuf/stubs/stringpiece_unittest.cc",
- "src/google/protobuf/stubs/stringprintf_unittest.cc",
- "src/google/protobuf/stubs/structurally_valid_unittest.cc",
- "src/google/protobuf/stubs/strutil_unittest.cc",
- "src/google/protobuf/stubs/template_util_unittest.cc",
- "src/google/protobuf/stubs/time_test.cc",
- "src/google/protobuf/text_format_unittest.cc",
- "src/google/protobuf/unknown_field_set_unittest.cc",
- "src/google/protobuf/util/delimited_message_util_test.cc",
- "src/google/protobuf/util/field_comparator_test.cc",
- "src/google/protobuf/util/field_mask_util_test.cc",
- "src/google/protobuf/util/internal/default_value_objectwriter_test.cc",
- "src/google/protobuf/util/internal/json_objectwriter_test.cc",
- "src/google/protobuf/util/internal/json_stream_parser_test.cc",
- "src/google/protobuf/util/internal/protostream_objectsource_test.cc",
- "src/google/protobuf/util/internal/protostream_objectwriter_test.cc",
- "src/google/protobuf/util/internal/type_info_test_helper.cc",
- "src/google/protobuf/util/json_util_test.cc",
- "src/google/protobuf/util/message_differencer_unittest.cc",
- "src/google/protobuf/util/time_util_test.cc",
- "src/google/protobuf/util/type_resolver_util_test.cc",
- "src/google/protobuf/well_known_types_unittest.cc",
- "src/google/protobuf/wire_format_unittest.cc",
- "src/google/protobuf/wire_format_unittest.inc",
- ],
- copts = COPTS + select({
- "//build_defs:config_msvc": [],
- "//conditions:default": [
- "-Wno-deprecated-declarations",
- ],
- }),
- data = [
- # Files for csharp_bootstrap_unittest.cc.
- "//conformance:all_files",
- ":test_plugin",
- ] + glob([
- "src/google/protobuf/**/*",
- ]) + glob(
- [
- # Files for csharp_bootstrap_unittest.cc.
- "csharp/src/**/*",
- ],
- allow_empty = True,
- ),
- includes = [
- "src/",
- ],
+cc_library(
+ name = "protobuf",
+ hdrs = glob([
+ "src/**/*.h",
+ "src/**/*.inc",
+ ]),
+ copts = COPTS,
+ include_prefix = "google/protobuf/io",
linkopts = LINK_OPTS,
+ visibility = ["//visibility:public"],
deps = [
- ":cc_test_protos",
- ":protobuf",
- ":protoc_lib",
- "@com_google_googletest//:gtest",
- "@com_google_googletest//:gtest_main",
- ] + select({
- "//build_defs:config_msvc": [],
- "//conditions:default": ["@zlib//:zlib"],
- }),
+ "//src/google/protobuf",
+ "//src/google/protobuf/compiler:importer",
+ "//src/google/protobuf/util:delimited_message_util",
+ "//src/google/protobuf/util:differencer",
+ "//src/google/protobuf/util:field_mask_util",
+ "//src/google/protobuf/util:json_util",
+ "//src/google/protobuf/util:time_util",
+ "//src/google/protobuf/util:type_resolver_util",
+ ],
+)
+
+# This provides just the header files for use in projects that need to build
+# shared libraries for dynamic loading. This target is available until Bazel
+# adds native support for such use cases.
+# TODO(keveman): Remove this target once the support gets added to Bazel.
+alias(
+ name = "protobuf_headers",
+ actual = "//src/google/protobuf:protobuf_headers",
+ visibility = ["//visibility:public"],
)
################################################################################
@@ -797,288 +255,57 @@
# Python support
################################################################################
-py_library(
- name = "python_srcs",
- srcs = glob(
- [
- "python/google/protobuf/**/*.py",
- ],
- ),
- imports = ["python"],
- srcs_version = "PY2AND3",
- visibility = ["@upb//:__subpackages__"],
-)
-
-py_library(
- name = "python_test_srcs",
- srcs = glob(
- [
- "python/google/protobuf/internal/*_test.py",
- "python/google/protobuf/internal/test_util.py",
- ],
- ),
- imports = ["python"],
- srcs_version = "PY3",
- visibility = ["@upb//:__subpackages__"],
-)
-
-cc_binary(
- name = "python/google/protobuf/internal/_api_implementation.so",
- srcs = ["python/google/protobuf/internal/api_implementation.cc"],
- copts = COPTS + [
- "-DPYTHON_PROTO2_CPP_IMPL_V2",
- ],
- linkshared = 1,
- linkstatic = 1,
- tags = [
- # Exclude this target from wildcard expansion (//...) because it may
- # not even be buildable. It will be built if it is needed according
- # to :use_fast_cpp_protos.
- # https://docs.bazel.build/versions/master/be/common-definitions.html#common-attributes
- "manual",
- ],
- deps = select({
- "//conditions:default": [],
- ":use_fast_cpp_protos": ["//external:python_headers"],
- }),
-)
-
-cc_binary(
- name = "python/google/protobuf/pyext/_message.so",
- srcs = glob([
- "python/google/protobuf/pyext/*.cc",
- "python/google/protobuf/pyext/*.h",
- ]),
- copts = COPTS + [
- "-DGOOGLE_PROTOBUF_HAS_ONEOF=1",
- ] + select({
- "//conditions:default": [],
- ":allow_oversize_protos": ["-DPROTOBUF_PYTHON_ALLOW_OVERSIZE_PROTOS=1"],
- }),
- includes = [
- "python/",
- "src/",
- ],
- linkshared = 1,
- linkstatic = 1,
- tags = [
- # Exclude this target from wildcard expansion (//...) because it may
- # not even be buildable. It will be built if it is needed according
- # to :use_fast_cpp_protos.
- # https://docs.bazel.build/versions/master/be/common-definitions.html#common-attributes
- "manual",
- ],
- deps = [
- ":protobuf",
- ":proto_api",
- ] + select({
- "//conditions:default": [],
- ":use_fast_cpp_protos": ["//external:python_headers"],
- }),
-)
-
-config_setting(
- name = "use_fast_cpp_protos",
- values = {
- "define": "use_fast_cpp_protos=true",
- },
- visibility = [
- # Public, but Protobuf only visibility.
- "//:__subpackages__",
- ],
-)
-
-config_setting(
- name = "allow_oversize_protos",
- values = {
- "define": "allow_oversize_protos=true",
- },
- visibility = [
- # Public, but Protobuf only visibility.
- "//:__subpackages__",
- ],
-)
-
-# Copy the builtin proto files from src/google/protobuf to
-# python/google/protobuf. This way, the generated Python sources will be in the
-# same directory as the Python runtime sources. This is necessary for the
-# modules to be imported correctly since they are all part of the same Python
-# package.
-internal_copied_filegroup(
- name = "protos_python",
- srcs = [
- "src/google/protobuf/any.proto",
- "src/google/protobuf/api.proto",
- "src/google/protobuf/compiler/plugin.proto",
- "src/google/protobuf/descriptor.proto",
- "src/google/protobuf/duration.proto",
- "src/google/protobuf/empty.proto",
- "src/google/protobuf/field_mask.proto",
- "src/google/protobuf/source_context.proto",
- "src/google/protobuf/struct.proto",
- "src/google/protobuf/timestamp.proto",
- "src/google/protobuf/type.proto",
- "src/google/protobuf/wrappers.proto",
- ],
- dest = "python",
- strip_prefix = "src",
-)
-
-py_proto_library(
- name = "well_known_types_py_pb2",
- srcs = [
- "python/google/protobuf/any.proto",
- "python/google/protobuf/api.proto",
- "python/google/protobuf/compiler/plugin.proto",
- "python/google/protobuf/descriptor.proto",
- "python/google/protobuf/duration.proto",
- "python/google/protobuf/empty.proto",
- "python/google/protobuf/field_mask.proto",
- "python/google/protobuf/source_context.proto",
- "python/google/protobuf/struct.proto",
- "python/google/protobuf/timestamp.proto",
- "python/google/protobuf/type.proto",
- "python/google/protobuf/wrappers.proto",
- ],
- include = "python",
- default_runtime = "",
- protoc = ":protoc",
- srcs_version = "PY2AND3",
- visibility = ["//visibility:public"],
-)
-
-py_library(
+alias(
name = "protobuf_python",
- data = select({
- "//conditions:default": [],
- ":use_fast_cpp_protos": [
- ":python/google/protobuf/internal/_api_implementation.so",
- ":python/google/protobuf/pyext/_message.so",
- ],
- }),
+ actual = "//python:protobuf_python",
visibility = ["//visibility:public"],
- deps = [
- ":python_srcs",
- ":well_known_types_py_pb2",
- ],
)
-# Copy the test proto files from src/google/protobuf to
-# python/google/protobuf. This way, the generated Python sources will be in the
-# same directory as the Python runtime sources. This is necessary for the
-# modules to be imported correctly by the tests since they are all part of the
-# same Python package.
-internal_copied_filegroup(
- name = "protos_python_test",
- srcs = LITE_TEST_PROTOS + TEST_PROTOS,
- dest = "python",
- strip_prefix = "src",
+alias(
+ name = "python_srcs",
+ actual = "//python:python_srcs",
+ visibility = ["@upb//:__subpackages__"],
)
-# TODO(dzc): Remove this once py_proto_library can have labels in srcs, in
-# which case we can simply add :protos_python_test in srcs.
-COPIED_LITE_TEST_PROTOS = ["python/" + s for s in RELATIVE_LITE_TEST_PROTOS]
+alias(
+ name = "python_test_srcs",
+ actual = "//python:python_test_srcs",
+ visibility = ["@upb//:__subpackages__"],
+)
-COPIED_TEST_PROTOS = ["python/" + s for s in RELATIVE_TEST_PROTOS]
+alias(
+ name = "well_known_types_py_pb2",
+ actual = "//python:well_known_types_py_pb2",
+ visibility = ["//visibility:public"],
+)
-py_proto_library(
+alias(
name = "python_common_test_protos",
- srcs = COPIED_LITE_TEST_PROTOS + COPIED_TEST_PROTOS,
- include = "python",
- default_runtime = "",
- protoc = ":protoc",
- srcs_version = "PY2AND3",
+ actual = "//python:python_common_test_protos",
visibility = ["//visibility:public"],
- deps = [":well_known_types_py_pb2"],
)
-py_proto_library(
+alias(
name = "python_specific_test_protos",
- srcs = glob([
- "python/google/protobuf/internal/*.proto",
- "python/google/protobuf/internal/import_test_package/*.proto",
- ]),
- include = "python",
- default_runtime = ":protobuf_python",
- protoc = ":protoc",
- srcs_version = "PY2AND3",
+ actual = "//python:python_specific_test_protos",
visibility = ["//visibility:public"],
- deps = [":python_common_test_protos"],
-)
-
-py_library(
- name = "python_tests",
- srcs = glob(
- [
- "python/google/protobuf/internal/*_test.py",
- "python/google/protobuf/internal/test_util.py",
- "python/google/protobuf/internal/import_test_package/__init__.py",
- ],
- ),
- imports = ["python"],
- srcs_version = "PY2AND3",
- deps = [
- ":protobuf_python",
- ":python_common_test_protos",
- ":python_specific_test_protos",
- ],
-)
-
-internal_protobuf_py_tests(
- name = "python_tests_batch",
- data = glob([
- "src/google/protobuf/**/*",
- ]),
- modules = [
- "descriptor_database_test",
- "descriptor_pool_test",
- "descriptor_test",
- "generator_test",
- "json_format_test",
- "message_factory_test",
- "message_test",
- "proto_builder_test",
- "reflection_test",
- "service_reflection_test",
- "symbol_database_test",
- "text_encoding_test",
- "text_format_test",
- "unknown_fields_test",
- "wire_format_test",
- ],
- deps = [":python_tests"],
-)
-
-cc_library(
- name = "proto_api",
- hdrs = ["python/google/protobuf/proto_api.h"],
- visibility = ["//visibility:public"],
- deps = [
- "//external:python_headers",
- ],
)
proto_lang_toolchain(
name = "cc_toolchain",
blacklisted_protos = [
- "@com_google_protobuf//:any_proto",
- "@com_google_protobuf//:api_proto",
"@com_google_protobuf//:compiler_plugin_proto",
"@com_google_protobuf//:descriptor_proto",
- "@com_google_protobuf//:duration_proto",
- "@com_google_protobuf//:empty_proto",
- "@com_google_protobuf//:field_mask_proto",
- "@com_google_protobuf//:source_context_proto",
- "@com_google_protobuf//:struct_proto",
- "@com_google_protobuf//:timestamp_proto",
- "@com_google_protobuf//:type_proto",
- "@com_google_protobuf//:wrappers_proto",
],
command_line = "--cpp_out=$(OUT)",
runtime = ":protobuf",
visibility = ["//visibility:public"],
)
+################################################################################
+# Objective-C support
+################################################################################
+
alias(
name = "objectivec",
actual = "//objectivec",
@@ -1094,84 +321,80 @@
)
################################################################################
-# Test generated proto support
+# Test protos
################################################################################
+alias(
+ name = "lite_test_proto_srcs",
+ actual = "//src/google/protobuf:lite_test_proto_srcs", # proto_library
+ visibility = ["//:__subpackages__"],
+)
+
+alias(
+ name = "lite_test_protos",
+ actual = "//src/google/protobuf:lite_test_protos", # proto_library
+ visibility = ["//:__subpackages__"],
+)
+
+alias(
+ name = "test_proto_srcs",
+ actual = "//src/google/protobuf:test_proto_srcs", # filegroup
+ visibility = ["//:__subpackages__"],
+)
+
+alias(
+ name = "test_protos",
+ actual = "//src/google/protobuf:test_protos", # proto_library
+ visibility = ["//:__subpackages__"],
+)
+
+# Validate generated proto source inputs:
+
genrule(
name = "generated_protos",
- srcs = ["src/google/protobuf/unittest_import.proto"],
+ testonly = 1,
+ srcs = ["//src/google/protobuf:test_proto_srcs"],
outs = ["unittest_gen_import.proto"],
- cmd = "cat $(SRCS) | sed 's|google/|src/google/|' > $(OUTS)",
+ cmd = "cat src/google/protobuf/unittest_import.proto > $@",
)
proto_library(
name = "generated_protos_proto",
- srcs = [
- "src/google/protobuf/unittest_import_public.proto",
- "unittest_gen_import.proto",
- ],
+ testonly = 1,
+ srcs = [":generated_protos"],
+ deps = ["//src/google/protobuf:generic_test_protos"],
)
-py_proto_library(
+internal_py_proto_library(
name = "generated_protos_py",
- srcs = [
- "src/google/protobuf/unittest_import_public.proto",
- "unittest_gen_import.proto",
- ],
+ testonly = 1,
+ srcs = [":generated_protos"],
default_runtime = "",
protoc = ":protoc",
+ deps = ["//python:python_common_test_protos"],
)
################################################################################
# Conformance tests
################################################################################
-alias(
- name = "conformance_test_runner",
- actual = "//conformance:conformance_test_runner",
- visibility = ["//visibility:public"],
-)
-
-proto_library(
- name = "test_messages_proto2_proto",
- strip_import_prefix = "src",
- srcs = ["src/google/protobuf/test_messages_proto2.proto"],
- visibility = ["//visibility:public"],
-)
-
-proto_library(
- name = "test_messages_proto3_proto",
- strip_import_prefix = "src",
- srcs = ["src/google/protobuf/test_messages_proto3.proto"],
- visibility = ["//visibility:public"],
- deps = [
- ":any_proto",
- ":duration_proto",
- ":field_mask_proto",
- ":struct_proto",
- ":timestamp_proto",
- ":wrappers_proto",
+cc_proto_library(
+ name = "test_messages_proto2_cc_proto",
+ visibility = [
+ "//conformance:__pkg__",
+ "//src:__subpackages__",
],
+ deps = ["//src/google/protobuf:test_messages_proto2_proto"],
)
-# TODO: re-enable this test if appropriate, or replace with something that
-# uses the new setup.
-# sh_test(
-# name = "build_files_updated_unittest",
-# srcs = [
-# "build_files_updated_unittest.sh",
-# ],
-# data = [
-# "BUILD",
-# "cmake/extract_includes.bat.in",
-# "cmake/libprotobuf.cmake",
-# "cmake/libprotobuf-lite.cmake",
-# "cmake/libprotoc.cmake",
-# "cmake/tests.cmake",
-# "src/Makefile.am",
-# "update_file_lists.sh",
-# ],
-# )
+cc_proto_library(
+ name = "test_messages_proto3_cc_proto",
+ visibility = [
+ "//conformance:__pkg__",
+ "//src:__subpackages__",
+ ],
+ deps = ["//src/google/protobuf:test_messages_proto3_proto"],
+)
java_proto_library(
name = "test_messages_proto2_java_proto",
@@ -1179,7 +402,7 @@
"//conformance:__pkg__",
"//java:__subpackages__",
],
- deps = [":test_messages_proto2_proto"],
+ deps = ["//src/google/protobuf:test_messages_proto2_proto"],
)
java_proto_library(
@@ -1188,7 +411,7 @@
"//conformance:__pkg__",
"//java:__subpackages__",
],
- deps = [":test_messages_proto3_proto"],
+ deps = ["//src/google/protobuf:test_messages_proto3_proto"],
)
java_lite_proto_library(
@@ -1197,7 +420,7 @@
"//conformance:__pkg__",
"//java:__subpackages__",
],
- deps = [":test_messages_proto2_proto"],
+ deps = ["//src/google/protobuf:test_messages_proto2_proto"],
)
java_lite_proto_library(
@@ -1206,7 +429,89 @@
"//conformance:__pkg__",
"//java:__subpackages__",
],
- deps = [":test_messages_proto3_proto"],
+ deps = ["//src/google/protobuf:test_messages_proto3_proto"],
+)
+
+internal_objc_proto_library(
+ name = "test_messages_proto2_objc_proto",
+ testonly = 1,
+ srcs = ["//src/google/protobuf:test_messages_proto2.proto"],
+ includes = ["src/google/protobuf"],
+ visibility = [
+ "//conformance:__pkg__",
+ "//objectivec:__subpackages__",
+ ],
+)
+
+internal_objc_proto_library(
+ name = "test_messages_proto3_objc_proto",
+ testonly = 1,
+ srcs = ["//src/google/protobuf:test_messages_proto3.proto"],
+ includes = [
+ "src/google/protobuf",
+ # The above must come first.
+ "src",
+ ],
+ proto_deps = [":well_known_protos"],
+ visibility = [
+ "//conformance:__pkg__",
+ "//objectivec:__subpackages__",
+ ],
+)
+
+internal_php_proto_library(
+ name = "test_messages_proto3_php_proto",
+ testonly = 1,
+ srcs = ["//src/google/protobuf:test_messages_proto3.proto"],
+ outs = [
+ "GPBMetadata/TestMessagesProto3.php",
+ "Protobuf_test_messages/Proto3/EnumOnlyProto3.php",
+ "Protobuf_test_messages/Proto3/EnumOnlyProto3/PBBool.php",
+ "Protobuf_test_messages/Proto3/ForeignEnum.php",
+ "Protobuf_test_messages/Proto3/ForeignMessage.php",
+ "Protobuf_test_messages/Proto3/NullHypothesisProto3.php",
+ "Protobuf_test_messages/Proto3/TestAllTypesProto3.php",
+ "Protobuf_test_messages/Proto3/TestAllTypesProto3/AliasedEnum.php",
+ "Protobuf_test_messages/Proto3/TestAllTypesProto3/NestedEnum.php",
+ "Protobuf_test_messages/Proto3/TestAllTypesProto3/NestedMessage.php",
+ ],
+ includes = [
+ "src/google/protobuf",
+ # The above must come first.
+ "src",
+ ],
+ proto_deps = [":well_known_protos"],
+ visibility = [
+ "//conformance:__pkg__",
+ "//php:__subpackages__",
+ ],
+)
+
+internal_ruby_proto_library(
+ name = "test_messages_proto2_ruby_proto",
+ testonly = 1,
+ srcs = ["//src/google/protobuf:test_messages_proto2.proto"],
+ includes = ["src/google/protobuf"],
+ visibility = [
+ "//conformance:__pkg__",
+ "//ruby:__subpackages__",
+ ],
+)
+
+internal_ruby_proto_library(
+ name = "test_messages_proto3_ruby_proto",
+ testonly = 1,
+ srcs = ["//src/google/protobuf:test_messages_proto3.proto"],
+ includes = [
+ "src/google/protobuf",
+ # The above must come first.
+ "src",
+ ],
+ proto_deps = [":well_known_protos"],
+ visibility = [
+ "//conformance:__pkg__",
+ "//ruby:__subpackages__",
+ ],
)
filegroup(
@@ -1215,46 +520,6 @@
visibility = ["//visibility:public"],
)
-# Kotlin proto rules
-
-proto_library(
- name = "kt_unittest_lite",
- srcs = [
- "src/google/protobuf/map_lite_unittest.proto",
- "src/google/protobuf/unittest_import_lite.proto",
- "src/google/protobuf/unittest_import_public_lite.proto",
- "src/google/protobuf/unittest_lite.proto",
- ],
- visibility = ["//java/kotlin-lite:__subpackages__"],
- strip_import_prefix = "src",
-)
-
-proto_library(
- name = "kt_unittest",
- srcs = [
- "src/google/protobuf/map_proto2_unittest.proto",
- "src/google/protobuf/unittest.proto",
- "src/google/protobuf/unittest_import.proto",
- "src/google/protobuf/unittest_import_public.proto",
- ],
- visibility = ["//java/kotlin:__subpackages__"],
- strip_import_prefix = "src",
-)
-
-proto_library(
- name = "kt_proto3_unittest",
- srcs = [
- "src/google/protobuf/unittest_import.proto",
- "src/google/protobuf/unittest_import_public.proto",
- "src/google/protobuf/unittest_proto3.proto",
- ],
- visibility = [
- "//java/kotlin:__subpackages__",
- "//java/kotlin-lite:__subpackages__",
- ],
- strip_import_prefix = "src",
-)
-
################################################################################
# Packaging rules
################################################################################
@@ -1268,22 +533,6 @@
"cmake/*.cmake",
"cmake/*.in",
"editors/*",
-
- # Several of these files are generated by autogen.sh, so using
- # glob() lets us ignore them if they are missing. (This is not good
- # practice, though.)
- "Makefile.in",
- "aclocal.m4",
- "ar-lib",
- "compile",
- "config*",
- "depcomp",
- "install-sh",
- "ltmain.sh",
- "m4/*.m4",
- "missing",
- "protobuf*.pc.in",
- "test-driver",
],
allow_empty = True,
) + [
@@ -1292,37 +541,20 @@
"CMakeLists.txt",
"CONTRIBUTORS.txt",
"LICENSE",
- "Makefile.am",
"README.md",
"WORKSPACE",
- "autogen.sh",
- "build_files_updated_unittest.sh",
"cmake/CMakeLists.txt",
"cmake/README.md",
+ "cmake/update_file_lists.sh",
"generate_descriptor_proto.sh",
"maven_install.json",
- "update_file_lists.sh",
"//third_party:BUILD.bazel",
"//third_party:zlib.BUILD",
- "//util/python:BUILD.bazel",
],
strip_prefix = strip_prefix.from_root(""),
visibility = ["//pkg:__pkg__"],
)
-# C++ runtime
-pkg_files(
- name = "cpp_dist_files",
- srcs = glob(
- ["src/**/*"],
- exclude = [
- "src/google/protobuf/compiler/objectivec/method_dump.sh", # not in autotools dist
- ],
- ),
- strip_prefix = strip_prefix.from_root(""),
- visibility = ["//pkg:__pkg__"],
-)
-
# Additional files for C#
pkg_files(
name = "csharp_dist_files",
@@ -1340,29 +572,3 @@
],
visibility = ["//pkg:__pkg__"],
)
-
-# Python runtime
-pkg_files(
- name = "python_dist_files",
- srcs = glob([
- "python/google/**/*.proto",
- "python/google/**/*.py",
- "python/google/protobuf/internal/*.cc",
- "python/google/protobuf/pyext/*.cc",
- "python/google/protobuf/pyext/*.h",
- ]) + [
- "python/MANIFEST.in",
- "python/README.md",
- "python/google/protobuf/proto_api.h",
- "python/google/protobuf/pyext/README",
- "python/google/protobuf/python_protobuf.h",
- "python/mox.py",
- "python/release.sh",
- "python/setup.cfg",
- "python/setup.py",
- "python/stubout.py",
- "python/tox.ini",
- ],
- strip_prefix = strip_prefix.from_root(""),
- visibility = ["//pkg:__pkg__"],
-)
diff --git a/CHANGES.txt b/CHANGES.txt
index b890eed..ff30066 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,3 +1,55 @@
+2022-07-01 Unreleased version
+ C++
+ * cpp_generated_lib_linked support is removed in protoc
+ * Reduced .pb.o object file size slightly by explicitly instantiating
+ InternalMetadata templates in the runtime.
+ * Add C++20 keywords guarded by PROTOBUF_FUTURE_CPP20_KEYWORDS
+ * Fixed crash in ThreadLocalStorage for pre-C++17 compilers on 32-bit ARM.
+ * Clarified that JSON API non-OK statuses are not a stable API.
+ * Added a default implementation of MessageDifferencer::Reporter methods.
+ * proto2::MapPair is now an alias to std::pair.
+ * Hide C++ RepeatedField::UnsafeArenaSwap
+ * Use table-driven parser for reflection based objects.
+ * Update Map's InternalSwap() to take a pointer to the other Map.
+ * Add ARM-optimized Varint decoding functions.
+ * Minor optimization for parsing groups
+ * Declare ReflectiveProtoHook class
+ * Reduce size of VarintParse code in protocol buffers, by calling the shared
+ routine after handling just one-byte varint encoding inline, rather than
+ handling one-byte and two-byte varints inline.
+ * Avoid inlining some large heavily duplicated routines in repeated_ptr_field.h
+ * Add ReflectiveProtoHook to Reflection.
+ * Turns on table-driven parser for reflection based objects.
+ * Save code space by avoiding inlining of large-in-aggregate code-space MessageLite::~MessageLite destructor.
+ * Undefine the macro `linux` when compiling protobuf
+ * Reduce memory consumption of MessageSet parsing.
+ * Save code space by avoiding inlining of large-in-aggregate code-space MessageLite::~MessageLite destructor.
+ * Breaking change: delete Arena::Init
+ * Make a PROTOBUF_POISON/UNPOISON to reduce noise in the source
+
+
+ Kotlin
+ * Suppress deprecation warnings in Kotlin generated code.
+ * Kotlin generated code comments now use kdoc format instead of javadoc.
+ * Escape keywords in package names in proto generated code
+ * Add Kotlin enum int value getters and setters
+
+ Java
+ * Performance improvement for repeated use of FieldMaskUtil#merge by caching
+ constructed FieldMaskTrees.
+ * Optimized Java proto serialization gencode for protos having many extension ranges with few fields in between.
+ * More thoroughly annotate public generated code in Java lite protocol buffers.
+ * Fixed Bug in proto3 java lite repeated enum fields. Failed to call copyOnWrite before modifying previously built message. Causes modification to already "built" messages that should be immutable.
+ * Fix Java reflection serialization of empty packed fields.
+
+ Python
+ * Changes ordering of printed fields in .pyi files from lexicographic to the same ordering found in the proto descriptor.
+ * Adds GeneratedCodeInfo annotations to python proto .pyi outputs as a base64 encoded docstring in the last line of the .pyi file for code analysis tools.
+ * Fix message factory's behavior in python cpp extension to return same message classes for same descriptor, even if the factories are different.
+
+ Compiler
+ * Print full path name of source .proto file on error
+
2022-09-29 version 21.7 (C++/Java/Python/PHP/Objective-C/C#/Ruby)
Java
* Refactoring java full runtime to reuse sub-message builders and prepare to
@@ -27,7 +79,6 @@
Python
* Fixed comparison of maps in Python.
-
2022-07-25 version 21.4 (C++/Java/Python/PHP/Objective-C/C#/Ruby)
C++
@@ -164,6 +215,7 @@
Java
* Update protobuf_version.bzl to separate protoc and per-language java … (#9900)
* 6x speedup in ArrayEncoder.writeUInt32NotTag
+ * Java generated code is no longer compatible with runtimes 2.6.1 and earlier
Python
* Increment python major version to 4 in version.json for python upb (#9926)
@@ -175,6 +227,7 @@
* Due to the breaking changes for Python, the major version number for Python
has been incremented.
* The binary wheel for macOS now supports Apple silicon.
+ * In TextFormat, transform UnicodeDecodeError into ParseError.
PHP
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 04cb330..dead8be 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -19,6 +19,10 @@
if(POLICY CMP0091)
cmake_policy(SET CMP0091 NEW)
endif()
+# Honor visibility properties for all target types.
+if(POLICY CMP0063)
+ cmake_policy(SET CMP0063 NEW)
+endif()
# Project
project(protobuf C CXX)
@@ -32,15 +36,32 @@
get_filename_component(protobuf_SOURCE_DIR ${protobuf_SOURCE_DIR} DIRECTORY)
endif()
-# Add c++11 flags
-if (CYGWIN)
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
+# Add C++14 flags
+if(NOT CMAKE_CXX_STANDARD)
+ set(CMAKE_CXX_STANDARD 14)
+endif()
+if(CYGWIN)
+ string(REGEX_MATCH "-std=gnu\\+\\+([0-9]+)" _protobuf_CXX_STD "${CMAKE_CXX_FLAGS}")
+endif()
+if(NOT _protobuf_CXX_STD)
+ set(_protobuf_CXX_STD "${CMAKE_CXX_STANDARD}")
+endif()
+if(_protobuf_CXX_STD LESS "14")
+ message(FATAL_ERROR "Protocol Buffers requires at least C++14, but is configured for C++${_protobuf_CXX_STD}")
+endif()
+if(CYGWIN)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++${_protobuf_CXX_STD}")
else()
- set(CMAKE_CXX_STANDARD 11)
+ set(CMAKE_CXX_STANDARD ${_protobuf_CXX_STD})
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
endif()
+# For -fvisibility=hidden and -fvisibility-inlines-hidden
+set(CMAKE_C_VISIBILITY_PRESET hidden)
+set(CMAKE_CXX_VISIBILITY_PRESET hidden)
+set(CMAKE_VISIBILITY_INLINES_HIDDEN ON)
+
# The Intel compiler isn't able to deal with noinline member functions of
# template classes defined in headers. As such it spams the output with
# warning #2196: routine is both "inline" and "noinline"
@@ -57,9 +78,11 @@
option(protobuf_BUILD_TESTS "Build tests" ON)
option(protobuf_BUILD_CONFORMANCE "Build conformance tests" OFF)
option(protobuf_BUILD_EXAMPLES "Build examples" OFF)
+option(protobuf_BUILD_PROTOBUF_BINARIES "Build protobuf libraries and protoc compiler" ON)
option(protobuf_BUILD_PROTOC_BINARIES "Build libprotoc and protoc compiler" ON)
option(protobuf_BUILD_LIBPROTOC "Build libprotoc" OFF)
option(protobuf_DISABLE_RTTI "Remove runtime type information in the binaries" OFF)
+option(protobuf_TEST_XML_OUTDIR "Output directory for XML logs from tests." "")
if (BUILD_SHARED_LIBS)
set(protobuf_BUILD_SHARED_LIBS_DEFAULT ON)
else (BUILD_SHARED_LIBS)
@@ -77,27 +100,23 @@
# User options
include(${protobuf_SOURCE_DIR}/cmake/protobuf-options.cmake)
+if (protobuf_BUILD_SHARED_LIBS)
+ # This is necessary for linking in Abseil.
+ set(CMAKE_POSITION_INDEPENDENT_CODE ON)
+endif ()
+
+# Version metadata
+set(protobuf_VERSION_STRING "3.21.4")
+set(protobuf_DESCRIPTION "Protocol Buffers")
+set(protobuf_CONTACT "protobuf@googlegroups.com")
+
# Overrides for option dependencies
if (protobuf_BUILD_PROTOC_BINARIES OR protobuf_BUILD_TESTS)
set(protobuf_BUILD_LIBPROTOC ON)
endif ()
-# Path to main configure script
-set(protobuf_CONFIGURE_SCRIPT "${protobuf_SOURCE_DIR}/configure.ac")
-
-# Parse configure script
-set(protobuf_AC_INIT_REGEX
- "^AC_INIT\\(\\[([^]]+)\\],\\[([^]]+)\\],\\[([^]]+)\\],\\[([^]]+)\\]\\)$")
-file(STRINGS "${protobuf_CONFIGURE_SCRIPT}" protobuf_AC_INIT_LINE
- LIMIT_COUNT 1 REGEX "^AC_INIT")
-# Description
-string(REGEX REPLACE "${protobuf_AC_INIT_REGEX}" "\\1"
- protobuf_DESCRIPTION "${protobuf_AC_INIT_LINE}")
-# Version
-string(REGEX REPLACE "${protobuf_AC_INIT_REGEX}" "\\2"
- protobuf_VERSION_STRING "${protobuf_AC_INIT_LINE}")
-# Contact
-string(REGEX REPLACE "${protobuf_AC_INIT_REGEX}" "\\3"
- protobuf_CONTACT "${protobuf_AC_INIT_LINE}")
+if (NOT protobuf_BUILD_PROTOBUF_BINARIES)
+ set(protobuf_INSTALL OFF)
+endif()
# Parse version tweaks
set(protobuf_VERSION_REGEX "^([0-9]+)\\.([0-9]+)\\.([0-9]+)([-]rc[-]|\\.)?([0-9]*)$")
string(REGEX REPLACE "${protobuf_VERSION_REGEX}" "\\1"
@@ -162,6 +181,14 @@
find_package(Threads REQUIRED)
+# We can install dependencies from submodules if we're running
+# CMake v3.13 or newer.
+if(CMAKE_VERSION VERSION_LESS 3.13)
+ set(_protobuf_INSTALL_SUPPORTED_FROM_MODULE OFF)
+else()
+ set(_protobuf_INSTALL_SUPPORTED_FROM_MODULE ON)
+endif()
+
set(_protobuf_FIND_ZLIB)
if (protobuf_WITH_ZLIB)
find_package(ZLIB)
@@ -194,7 +221,7 @@
if (NOT MSVC)
include(CheckCXXSourceCompiles)
set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
- set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS} -std=c++11)
+ set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS} -std=c++14)
check_cxx_source_compiles("
#include <atomic>
int main() {
@@ -242,12 +269,12 @@
if (MSVC)
if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
# Build with multiple processes
- add_definitions(/MP)
+ add_compile_options(/MP)
endif()
# Set source file and execution character sets to UTF-8
- add_definitions(/utf-8)
+ add_compile_options(/utf-8)
# MSVC warning suppressions
- add_definitions(
+ add_compile_options(
/wd4065 # switch statement contains 'default' but no 'case' labels
/wd4244 # 'conversion' conversion from 'type1' to 'type2', possible loss of data
/wd4251 # 'identifier' : class 'type' needs to have dll-interface to be used by clients of class 'type2'
@@ -262,23 +289,16 @@
/wd4996 # The compiler encountered a deprecated declaration.
)
# Allow big object
- add_definitions(/bigobj)
+ add_compile_options(/bigobj)
string(REPLACE "/" "\\" PROTOBUF_SOURCE_WIN32_PATH ${protobuf_SOURCE_DIR})
string(REPLACE "/" "\\" PROTOBUF_BINARY_WIN32_PATH ${protobuf_BINARY_DIR})
string(REPLACE "." "," protobuf_RC_FILEVERSION "${protobuf_VERSION}")
- configure_file(${protobuf_SOURCE_DIR}/cmake/extract_includes.bat.in extract_includes.bat)
# Suppress linker warnings about files with no symbols defined.
- set(CMAKE_STATIC_LINKER_FLAGS "${CMAKE_STATIC_LINKER_FLAGS} /ignore:4221")
+ string(APPEND CMAKE_STATIC_LINKER_FLAGS " /ignore:4221")
- if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
- # Configure Resource Compiler
- enable_language(RC)
- # use English language (0x409) in resource compiler
- set(rc_flags "/l0x409")
- # fix rc.exe invocations because of usage of add_definitions()
- set(CMAKE_RC_COMPILE_OBJECT "<CMAKE_RC_COMPILER> ${rc_flags} <DEFINES> /fo<OBJECT> <SOURCE>")
- endif()
+ # use English language (0x409) in resource compiler
+ string(APPEND CMAKE_RC_FLAGS " -l0x409")
# Generate the version.rc file used elsewhere.
configure_file(${protobuf_SOURCE_DIR}/cmake/version.rc.in ${CMAKE_CURRENT_BINARY_DIR}/version.rc @ONLY)
@@ -304,28 +324,54 @@
add_definitions(-DUNICODE -D_UNICODE)
endif (protobuf_UNICODE)
-include(${protobuf_SOURCE_DIR}/cmake/libprotobuf-lite.cmake)
-include(${protobuf_SOURCE_DIR}/cmake/libprotobuf.cmake)
-if (protobuf_BUILD_LIBPROTOC)
- include(${protobuf_SOURCE_DIR}/cmake/libprotoc.cmake)
-endif (protobuf_BUILD_LIBPROTOC)
-if (protobuf_BUILD_PROTOC_BINARIES)
- include(${protobuf_SOURCE_DIR}/cmake/protoc.cmake)
- if (NOT DEFINED protobuf_PROTOC_EXE)
- set(protobuf_PROTOC_EXE protoc)
- endif (NOT DEFINED protobuf_PROTOC_EXE)
-endif (protobuf_BUILD_PROTOC_BINARIES)
+set(protobuf_ABSL_PROVIDER "module" CACHE STRING "Provider of absl library")
+set_property(CACHE protobuf_ABSL_PROVIDER PROPERTY STRINGS "module" "package")
-# Ensure we have a protoc executable if we need one
+include(${protobuf_SOURCE_DIR}/cmake/abseil-cpp.cmake)
+
+if (protobuf_BUILD_PROTOBUF_BINARIES)
+ include(${protobuf_SOURCE_DIR}/cmake/libprotobuf-lite.cmake)
+ if (NOT DEFINED protobuf_LIB_PROTOBUF_LITE)
+ set(protobuf_LIB_PROTOBUF_LITE libprotobuf-lite)
+ endif ()
+ include(${protobuf_SOURCE_DIR}/cmake/libprotobuf.cmake)
+ if (NOT DEFINED protobuf_LIB_PROTOBUF)
+ set(protobuf_LIB_PROTOBUF libprotobuf)
+ endif ()
+ if (protobuf_BUILD_LIBPROTOC)
+ include(${protobuf_SOURCE_DIR}/cmake/libprotoc.cmake)
+ if (NOT DEFINED protobuf_LIB_PROTOC)
+ set(protobuf_LIB_PROTOC libprotoc)
+ endif ()
+ endif ()
+ if (protobuf_BUILD_PROTOC_BINARIES)
+ include(${protobuf_SOURCE_DIR}/cmake/protoc.cmake)
+ if (NOT DEFINED protobuf_PROTOC_EXE)
+ set(protobuf_PROTOC_EXE protoc)
+ endif ()
+ endif ()
+else ()
+ find_package(Protobuf NO_MODULE)
+ if (Protobuf_FOUND)
+ set(protobuf_PROTOC_EXE protobuf::protoc)
+ set(protobuf_LIB_PROTOC protobuf::libprotoc)
+ set(protobuf_LIB_PROTOBUF protobuf::libprotobuf)
+ set(protobuf_LIB_PROTOBUF_LITE protobuf::libprotobuf-lite)
+ message(STATUS "CMake installation of Protobuf found.")
+ endif ()
+endif ()
+
+# Ensure we have a protoc executable and protobuf libraries if we need one
if (protobuf_BUILD_TESTS OR protobuf_BUILD_CONFORMANCE OR protobuf_BUILD_EXAMPLES)
if (NOT DEFINED protobuf_PROTOC_EXE)
- find_program(protobuf_PROTOC_EXE protoc)
- if (NOT protobuf_PROTOC_EXE)
- message(FATAL "Build requires 'protoc' but binary not found and not building protoc.")
- endif ()
+ find_program(protobuf_PROTOC_EXE protoc REQUIRED)
+ message(STATUS "Found system ${protobuf_PROTOC_EXE}.")
endif ()
if(protobuf_VERBOSE)
message(STATUS "Using protoc : ${protobuf_PROTOC_EXE}")
+ message(STATUS "Using libprotobuf : ${protobuf_LIB_PROTOBUF}")
+ message(STATUS "Using libprotobuf-lite : ${protobuf_LIB_PROTOBUF_LITE}")
+ message(STATUS "Using libprotoc : ${protobuf_LIB_PROTOC}")
endif(protobuf_VERBOSE)
endif ()
diff --git a/Makefile.am b/Makefile.am
deleted file mode 100644
index 4c7c711..0000000
--- a/Makefile.am
+++ /dev/null
@@ -1,1291 +0,0 @@
-## Process this file with automake to produce Makefile.in
-
-ACLOCAL_AMFLAGS = -I m4
-
-AUTOMAKE_OPTIONS = foreign
-
-# Build . before src so that our all-local and clean-local hooks kicks in at
-# the right time.
-SUBDIRS = . src
-
-# Always include third_party directories in distributions.
-#
-# Note that distribution artifacts will be produced by Bazel in the future.
-# See pkg/BUILD.bazel for overall definitions.
-DIST_SUBDIRS = src conformance benchmarks third_party/googletest
-
-# Build gmock before we build protobuf tests. We don't add gmock to SUBDIRS
-# because then "make check" would also build and run all of gmock's own tests,
-# which takes a lot of time and is generally not useful to us. Also, we don't
-# want "make install" to recurse into gmock since we don't want to overwrite
-# the installed version of gmock if there is one.
-check-local:
- @echo "Making lib/libgmock.a lib/libgmock_main.a in gmock"
- @cd third_party/googletest/googletest && $(MAKE) $(AM_MAKEFLAGS) lib/libgtest.la lib/libgtest_main.la
- @cd third_party/googletest/googlemock && $(MAKE) $(AM_MAKEFLAGS) lib/libgmock.la lib/libgmock_main.la
-
-# We would like to clean gmock when "make clean" is invoked. But we have to
-# be careful because clean-local is also invoked during "make distclean", but
-# "make distclean" already recurses into gmock because it's listed among the
-# DIST_SUBDIRS. distclean will delete gmock/Makefile, so if we then try to
-# cd to the directory again and "make clean" it will fail. So, check that the
-# Makefile exists before recursing.
-clean-local:
- @if test -e third_party/googletest/Makefile; then \
- echo "Making clean in googletest"; \
- cd third_party/googletest && $(MAKE) $(AM_MAKEFLAGS) clean; \
- fi; \
- if test -e conformance/Makefile; then \
- echo "Making clean in conformance"; \
- cd conformance && $(MAKE) $(AM_MAKEFLAGS) clean; \
- fi; \
- if test -e benchmarks/Makefile; then \
- echo "Making clean in benchmarks"; \
- cd benchmarks && $(MAKE) $(AM_MAKEFLAGS) clean; \
- fi; \
- if test -e objectivec/DevTools; then \
- echo "Cleaning any ObjC pyc files"; \
- rm -f objectivec/DevTools/*.pyc; \
- fi
-
-pkgconfigdir = $(libdir)/pkgconfig
-pkgconfig_DATA = protobuf.pc protobuf-lite.pc
-
-# Note: please keep this in sync with the dist_files rule in csharp/BUILD.bazel.
-csharp_EXTRA_DIST= \
- global.json \
- csharp/.editorconfig \
- csharp/.gitignore \
- csharp/CHANGES.txt \
- csharp/Google.Protobuf.Tools.targets \
- csharp/Google.Protobuf.Tools.nuspec \
- csharp/NuGet.Config \
- csharp/README.md \
- csharp/build_packages.bat \
- csharp/build_tools.sh \
- csharp/buildall.bat \
- csharp/buildall.sh \
- csharp/generate_protos.sh \
- csharp/install_dotnet_sdk.ps1 \
- csharp/keys/Google.Protobuf.public.snk \
- csharp/keys/Google.Protobuf.snk \
- csharp/keys/README.md \
- csharp/protos/README.md \
- csharp/protos/map_unittest_proto3.proto \
- csharp/protos/old_extensions1.proto \
- csharp/protos/old_extensions2.proto \
- csharp/protos/unittest_issue6936_a.proto \
- csharp/protos/unittest_issue6936_b.proto \
- csharp/protos/unittest_issue6936_c.proto \
- csharp/protos/unittest_custom_options_proto3.proto \
- csharp/protos/unittest_import_public_proto3.proto \
- csharp/protos/unittest_import_public.proto \
- csharp/protos/unittest_import_proto3.proto \
- csharp/protos/unittest_import.proto \
- csharp/protos/unittest_issues.proto \
- csharp/protos/unittest_proto3.proto \
- csharp/protos/unittest_selfreferential_options.proto \
- csharp/protos/unittest.proto \
- csharp/src/AddressBook/AddPerson.cs \
- csharp/src/AddressBook/Addressbook.cs \
- csharp/src/AddressBook/AddressBook.csproj \
- csharp/src/AddressBook/ListPeople.cs \
- csharp/src/AddressBook/Program.cs \
- csharp/src/AddressBook/SampleUsage.cs \
- csharp/src/Google.Protobuf.Benchmarks/BenchmarkDatasetConfig.cs \
- csharp/src/Google.Protobuf.Benchmarks/BenchmarkMessage1Proto3.cs \
- csharp/src/Google.Protobuf.Benchmarks/Benchmarks.cs \
- csharp/src/Google.Protobuf.Benchmarks/ByteStringBenchmark.cs \
- csharp/src/Google.Protobuf.Benchmarks/Google.Protobuf.Benchmarks.csproj \
- csharp/src/Google.Protobuf.Benchmarks/GoogleMessageBenchmark.cs \
- csharp/src/Google.Protobuf.Benchmarks/ParseMessagesBenchmark.cs \
- csharp/src/Google.Protobuf.Benchmarks/ParseRawPrimitivesBenchmark.cs \
- csharp/src/Google.Protobuf.Benchmarks/Program.cs \
- csharp/src/Google.Protobuf.Benchmarks/wrapper_benchmark_messages.proto \
- csharp/src/Google.Protobuf.Benchmarks/WrapperBenchmarkMessages.cs \
- csharp/src/Google.Protobuf.Benchmarks/WriteMessagesBenchmark.cs \
- csharp/src/Google.Protobuf.Benchmarks/WriteRawPrimitivesBenchmark.cs \
- csharp/src/Google.Protobuf.Conformance/Conformance.cs \
- csharp/src/Google.Protobuf.Conformance/Google.Protobuf.Conformance.csproj \
- csharp/src/Google.Protobuf.Conformance/Program.cs \
- csharp/src/Google.Protobuf.JsonDump/Google.Protobuf.JsonDump.csproj \
- csharp/src/Google.Protobuf.JsonDump/Program.cs \
- csharp/src/Google.Protobuf.Test/Buffers/ArrayBufferWriter.cs \
- csharp/src/Google.Protobuf.Test/ByteStringTest.cs \
- csharp/src/Google.Protobuf.Test/CodedInputStreamExtensions.cs \
- csharp/src/Google.Protobuf.Test/CodedInputStreamTest.cs \
- csharp/src/Google.Protobuf.Test/CodedOutputStreamTest.cs \
- csharp/src/Google.Protobuf.Test/Collections/MapFieldTest.cs \
- csharp/src/Google.Protobuf.Test/Collections/ProtobufEqualityComparersTest.cs \
- csharp/src/Google.Protobuf.Test/Collections/RepeatedFieldTest.cs \
- csharp/src/Google.Protobuf.Test/Compatibility/PropertyInfoExtensionsTest.cs \
- csharp/src/Google.Protobuf.Test/Compatibility/StreamExtensionsTest.cs \
- csharp/src/Google.Protobuf.Test/Compatibility/TypeExtensionsTest.cs \
- csharp/src/Google.Protobuf.Test/DeprecatedMemberTest.cs \
- csharp/src/Google.Protobuf.Test/EqualityTester.cs \
- csharp/src/Google.Protobuf.Test/ExtensionSetTest.cs \
- csharp/src/Google.Protobuf.Test/FieldCodecTest.cs \
- csharp/src/Google.Protobuf.Test/FieldMaskTreeTest.cs \
- csharp/src/Google.Protobuf.Test/GeneratedMessageTest.cs \
- csharp/src/Google.Protobuf.Test/GeneratedMessageTest.Proto2.cs \
- csharp/src/Google.Protobuf.Test/Google.Protobuf.Test.csproj \
- csharp/src/Google.Protobuf.Test/IssuesTest.cs \
- csharp/src/Google.Protobuf.Test/JsonFormatterTest.cs \
- csharp/src/Google.Protobuf.Test/JsonParserTest.cs \
- csharp/src/Google.Protobuf.Test/JsonTokenizerTest.cs \
- csharp/src/Google.Protobuf.Test/LegacyGeneratedCodeTest.cs \
- csharp/src/Google.Protobuf.Test/MessageParsingHelpers.cs \
- csharp/src/Google.Protobuf.Test/Proto3OptionalTest.cs \
- csharp/src/Google.Protobuf.Test/ReadOnlySequenceFactory.cs \
- csharp/src/Google.Protobuf.Test/RefStructCompatibilityTest.cs \
- csharp/src/Google.Protobuf.Test/Reflection/CustomOptionsTest.cs \
- csharp/src/Google.Protobuf.Test/Reflection/DescriptorDeclarationTest.cs \
- csharp/src/Google.Protobuf.Test/Reflection/DescriptorsTest.cs \
- csharp/src/Google.Protobuf.Test/Reflection/FieldAccessTest.cs \
- csharp/src/Google.Protobuf.Test/Reflection/TypeRegistryTest.cs \
- csharp/src/Google.Protobuf.Test/SampleEnum.cs \
- csharp/src/Google.Protobuf.Test/SampleMessages.cs \
- csharp/src/Google.Protobuf.Test/SampleNaNs.cs \
- csharp/src/Google.Protobuf.Test/TestCornerCases.cs \
- csharp/src/Google.Protobuf.Test.TestProtos/Google.Protobuf.Test.TestProtos.csproj \
- csharp/src/Google.Protobuf.Test.TestProtos/UnittestIssue6936A.cs \
- csharp/src/Google.Protobuf.Test.TestProtos/UnittestIssue6936B.cs \
- csharp/src/Google.Protobuf.Test.TestProtos/UnittestIssue6936C.cs \
- csharp/src/Google.Protobuf.Test.TestProtos/ForeignMessagePartial.cs \
- csharp/src/Google.Protobuf.Test.TestProtos/MapUnittestProto3.cs \
- csharp/src/Google.Protobuf.Test.TestProtos/OldExtensions1.cs \
- csharp/src/Google.Protobuf.Test.TestProtos/OldExtensions2.cs \
- csharp/src/Google.Protobuf.Test.TestProtos/TestMessagesProto2.cs \
- csharp/src/Google.Protobuf.Test.TestProtos/TestMessagesProto3.cs \
- csharp/src/Google.Protobuf.Test.TestProtos/UnittestCustomOptionsProto3.cs \
- csharp/src/Google.Protobuf.Test.TestProtos/UnittestImportProto3.cs \
- csharp/src/Google.Protobuf.Test.TestProtos/UnittestImportPublicProto3.cs \
- csharp/src/Google.Protobuf.Test.TestProtos/UnittestImportPublic.cs \
- csharp/src/Google.Protobuf.Test.TestProtos/UnittestImport.cs \
- csharp/src/Google.Protobuf.Test.TestProtos/UnittestIssues.cs \
- csharp/src/Google.Protobuf.Test.TestProtos/UnittestProto3.cs \
- csharp/src/Google.Protobuf.Test.TestProtos/UnittestProto3Optional.cs \
- csharp/src/Google.Protobuf.Test.TestProtos/UnittestSelfreferentialOptions.cs \
- csharp/src/Google.Protobuf.Test.TestProtos/UnittestWellKnownTypes.cs \
- csharp/src/Google.Protobuf.Test.TestProtos/Unittest.cs \
- csharp/src/Google.Protobuf.Test/WellKnownTypes/AnyTest.cs \
- csharp/src/Google.Protobuf.Test/WellKnownTypes/DurationTest.cs \
- csharp/src/Google.Protobuf.Test/WellKnownTypes/FieldMaskTest.cs \
- csharp/src/Google.Protobuf.Test/WellKnownTypes/TimestampTest.cs \
- csharp/src/Google.Protobuf.Test/WellKnownTypes/WrappersTest.cs \
- csharp/src/Google.Protobuf.Test/UnknownFieldSetTest.cs \
- csharp/src/Google.Protobuf.Test/testprotos.pb \
- csharp/src/Google.Protobuf.sln \
- csharp/src/Google.Protobuf/ByteArray.cs \
- csharp/src/Google.Protobuf/ByteString.cs \
- csharp/src/Google.Protobuf/ByteStringAsync.cs \
- csharp/src/Google.Protobuf/CodedInputStream.cs \
- csharp/src/Google.Protobuf/CodedOutputStream.ComputeSize.cs \
- csharp/src/Google.Protobuf/CodedOutputStream.cs \
- csharp/src/Google.Protobuf/Collections/Lists.cs \
- csharp/src/Google.Protobuf/Collections/MapField.cs \
- csharp/src/Google.Protobuf/Collections/ProtobufEqualityComparers.cs \
- csharp/src/Google.Protobuf/Collections/ReadOnlyDictionary.cs \
- csharp/src/Google.Protobuf/Collections/RepeatedField.cs \
- csharp/src/Google.Protobuf/Compatibility/DynamicallyAccessedMembersAttribute.cs \
- csharp/src/Google.Protobuf/Compatibility/DynamicallyAccessedMemberTypes.cs \
- csharp/src/Google.Protobuf/Compatibility/MethodInfoExtensions.cs \
- csharp/src/Google.Protobuf/Compatibility/PropertyInfoExtensions.cs \
- csharp/src/Google.Protobuf/Compatibility/RequiresUnreferencedCodeAttribute.cs \
- csharp/src/Google.Protobuf/Compatibility/StreamExtensions.cs \
- csharp/src/Google.Protobuf/Compatibility/TypeExtensions.cs \
- csharp/src/Google.Protobuf/Compatibility/UnconditionalSuppressMessageAttribute.cs \
- csharp/src/Google.Protobuf/Extension.cs \
- csharp/src/Google.Protobuf/ExtensionRegistry.cs \
- csharp/src/Google.Protobuf/ExtensionSet.cs \
- csharp/src/Google.Protobuf/ExtensionValue.cs \
- csharp/src/Google.Protobuf/FieldCodec.cs \
- csharp/src/Google.Protobuf/FieldMaskTree.cs \
- csharp/src/Google.Protobuf/FrameworkPortability.cs \
- csharp/src/Google.Protobuf/Google.Protobuf.csproj \
- csharp/src/Google.Protobuf/IBufferMessage.cs \
- csharp/src/Google.Protobuf/ICustomDiagnosticMessage.cs \
- csharp/src/Google.Protobuf/IDeepCloneable.cs \
- csharp/src/Google.Protobuf/IExtendableMessage.cs \
- csharp/src/Google.Protobuf/IMessage.cs \
- csharp/src/Google.Protobuf/InvalidJsonException.cs \
- csharp/src/Google.Protobuf/InvalidProtocolBufferException.cs \
- csharp/src/Google.Protobuf/JsonFormatter.cs \
- csharp/src/Google.Protobuf/JsonParser.cs \
- csharp/src/Google.Protobuf/JsonToken.cs \
- csharp/src/Google.Protobuf/JsonTokenizer.cs \
- csharp/src/Google.Protobuf/LimitedInputStream.cs \
- csharp/src/Google.Protobuf/MessageExtensions.cs \
- csharp/src/Google.Protobuf/MessageParser.cs \
- csharp/src/Google.Protobuf/ObjectIntPair.cs \
- csharp/src/Google.Protobuf/ParseContext.cs \
- csharp/src/Google.Protobuf/ParserInternalState.cs \
- csharp/src/Google.Protobuf/ParsingPrimitives.cs \
- csharp/src/Google.Protobuf/ParsingPrimitivesMessages.cs \
- csharp/src/Google.Protobuf/ParsingPrimitivesWrappers.cs \
- csharp/src/Google.Protobuf/ProtoPreconditions.cs \
- csharp/src/Google.Protobuf/SegmentedBufferHelper.cs \
- csharp/src/Google.Protobuf/Properties/AssemblyInfo.cs \
- csharp/src/Google.Protobuf/Reflection/CustomOptions.cs \
- csharp/src/Google.Protobuf/Reflection/Descriptor.cs \
- csharp/src/Google.Protobuf/Reflection/DescriptorBase.cs \
- csharp/src/Google.Protobuf/Reflection/DescriptorDeclaration.cs \
- csharp/src/Google.Protobuf/Reflection/DescriptorPool.cs \
- csharp/src/Google.Protobuf/Reflection/DescriptorUtil.cs \
- csharp/src/Google.Protobuf/Reflection/DescriptorValidationException.cs \
- csharp/src/Google.Protobuf/Reflection/EnumDescriptor.cs \
- csharp/src/Google.Protobuf/Reflection/EnumValueDescriptor.cs \
- csharp/src/Google.Protobuf/Reflection/ExtensionAccessor.cs \
- csharp/src/Google.Protobuf/Reflection/ExtensionCollection.cs \
- csharp/src/Google.Protobuf/Reflection/FieldAccessorBase.cs \
- csharp/src/Google.Protobuf/Reflection/FieldDescriptor.cs \
- csharp/src/Google.Protobuf/Reflection/FieldType.cs \
- csharp/src/Google.Protobuf/Reflection/FileDescriptor.cs \
- csharp/src/Google.Protobuf/Reflection/GeneratedClrTypeInfo.cs \
- csharp/src/Google.Protobuf/Reflection/IDescriptor.cs \
- csharp/src/Google.Protobuf/Reflection/IFieldAccessor.cs \
- csharp/src/Google.Protobuf/Reflection/MapFieldAccessor.cs \
- csharp/src/Google.Protobuf/Reflection/MessageDescriptor.cs \
- csharp/src/Google.Protobuf/Reflection/MethodDescriptor.cs \
- csharp/src/Google.Protobuf/Reflection/OneofAccessor.cs \
- csharp/src/Google.Protobuf/Reflection/OneofDescriptor.cs \
- csharp/src/Google.Protobuf/Reflection/OriginalNameAttribute.cs \
- csharp/src/Google.Protobuf/Reflection/PackageDescriptor.cs \
- csharp/src/Google.Protobuf/Reflection/ReflectionUtil.cs \
- csharp/src/Google.Protobuf/Reflection/RepeatedFieldAccessor.cs \
- csharp/src/Google.Protobuf/Reflection/ServiceDescriptor.cs \
- csharp/src/Google.Protobuf/Reflection/SingleFieldAccessor.cs \
- csharp/src/Google.Protobuf/Reflection/TypeRegistry.cs \
- csharp/src/Google.Protobuf/WellKnownTypes/Any.cs \
- csharp/src/Google.Protobuf/WellKnownTypes/AnyPartial.cs \
- csharp/src/Google.Protobuf/WellKnownTypes/Api.cs \
- csharp/src/Google.Protobuf/WellKnownTypes/Duration.cs \
- csharp/src/Google.Protobuf/WellKnownTypes/DurationPartial.cs \
- csharp/src/Google.Protobuf/WellKnownTypes/Empty.cs \
- csharp/src/Google.Protobuf/WellKnownTypes/FieldMask.cs \
- csharp/src/Google.Protobuf/WellKnownTypes/FieldMaskPartial.cs \
- csharp/src/Google.Protobuf/WellKnownTypes/SourceContext.cs \
- csharp/src/Google.Protobuf/WellKnownTypes/Struct.cs \
- csharp/src/Google.Protobuf/WellKnownTypes/TimeExtensions.cs \
- csharp/src/Google.Protobuf/WellKnownTypes/Timestamp.cs \
- csharp/src/Google.Protobuf/WellKnownTypes/TimestampPartial.cs \
- csharp/src/Google.Protobuf/WellKnownTypes/Type.cs \
- csharp/src/Google.Protobuf/WellKnownTypes/ValuePartial.cs \
- csharp/src/Google.Protobuf/WellKnownTypes/Wrappers.cs \
- csharp/src/Google.Protobuf/WellKnownTypes/WrappersPartial.cs \
- csharp/src/Google.Protobuf/WireFormat.cs \
- csharp/src/Google.Protobuf/WritingPrimitivesMessages.cs \
- csharp/src/Google.Protobuf/WritingPrimitives.cs \
- csharp/src/Google.Protobuf/WriterInternalState.cs \
- csharp/src/Google.Protobuf/WriteContext.cs \
- csharp/src/Google.Protobuf/WriteBufferHelper.cs \
- csharp/src/Google.Protobuf/UnknownField.cs \
- csharp/src/Google.Protobuf/UnknownFieldSet.cs \
- csharp/src/Google.Protobuf/UnsafeByteOperations.cs
-
-# Note: please keep this in sync with the dist_files rules under java/.../BUILD.bazel.
-java_EXTRA_DIST= \
- java/README.md \
- java/bom/pom.xml \
- java/core/BUILD.bazel \
- java/core/generate-sources-build.xml \
- java/core/generate-test-sources-build.xml \
- java/core/pom.xml \
- java/core/pom_template.xml \
- java/core/src/main/java/com/google/protobuf/AbstractMessage.java \
- java/core/src/main/java/com/google/protobuf/AbstractMessageLite.java \
- java/core/src/main/java/com/google/protobuf/AbstractParser.java \
- java/core/src/main/java/com/google/protobuf/AbstractProtobufList.java \
- java/core/src/main/java/com/google/protobuf/AllocatedBuffer.java \
- java/core/src/main/java/com/google/protobuf/Android.java \
- java/core/src/main/java/com/google/protobuf/ArrayDecoders.java \
- java/core/src/main/java/com/google/protobuf/BinaryReader.java \
- java/core/src/main/java/com/google/protobuf/BinaryWriter.java \
- java/core/src/main/java/com/google/protobuf/BlockingRpcChannel.java \
- java/core/src/main/java/com/google/protobuf/BlockingService.java \
- java/core/src/main/java/com/google/protobuf/BooleanArrayList.java \
- java/core/src/main/java/com/google/protobuf/BufferAllocator.java \
- java/core/src/main/java/com/google/protobuf/ByteBufferWriter.java \
- java/core/src/main/java/com/google/protobuf/ByteOutput.java \
- java/core/src/main/java/com/google/protobuf/ByteString.java \
- java/core/src/main/java/com/google/protobuf/CanIgnoreReturnValue.java \
- java/core/src/main/java/com/google/protobuf/CheckReturnValue.java \
- java/core/src/main/java/com/google/protobuf/CodedInputStream.java \
- java/core/src/main/java/com/google/protobuf/CodedInputStreamReader.java \
- java/core/src/main/java/com/google/protobuf/CodedOutputStream.java \
- java/core/src/main/java/com/google/protobuf/CodedOutputStreamWriter.java \
- java/core/src/main/java/com/google/protobuf/CompileTimeConstant.java \
- java/core/src/main/java/com/google/protobuf/DescriptorMessageInfoFactory.java \
- java/core/src/main/java/com/google/protobuf/Descriptors.java \
- java/core/src/main/java/com/google/protobuf/DiscardUnknownFieldsParser.java \
- java/core/src/main/java/com/google/protobuf/DoubleArrayList.java \
- java/core/src/main/java/com/google/protobuf/DynamicMessage.java \
- java/core/src/main/java/com/google/protobuf/ExperimentalApi.java \
- java/core/src/main/java/com/google/protobuf/Extension.java \
- java/core/src/main/java/com/google/protobuf/ExtensionLite.java \
- java/core/src/main/java/com/google/protobuf/ExtensionRegistry.java \
- java/core/src/main/java/com/google/protobuf/ExtensionRegistryFactory.java \
- java/core/src/main/java/com/google/protobuf/ExtensionRegistryLite.java \
- java/core/src/main/java/com/google/protobuf/ExtensionSchema.java \
- java/core/src/main/java/com/google/protobuf/ExtensionSchemaFull.java \
- java/core/src/main/java/com/google/protobuf/ExtensionSchemaLite.java \
- java/core/src/main/java/com/google/protobuf/ExtensionSchemas.java \
- java/core/src/main/java/com/google/protobuf/FieldInfo.java \
- java/core/src/main/java/com/google/protobuf/FieldSet.java \
- java/core/src/main/java/com/google/protobuf/FieldType.java \
- java/core/src/main/java/com/google/protobuf/FloatArrayList.java \
- java/core/src/main/java/com/google/protobuf/GeneratedMessage.java \
- java/core/src/main/java/com/google/protobuf/GeneratedMessageInfoFactory.java \
- java/core/src/main/java/com/google/protobuf/GeneratedMessageLite.java \
- java/core/src/main/java/com/google/protobuf/GeneratedMessageV3.java \
- java/core/src/main/java/com/google/protobuf/InlineMe.java \
- java/core/src/main/java/com/google/protobuf/IntArrayList.java \
- java/core/src/main/java/com/google/protobuf/Internal.java \
- java/core/src/main/java/com/google/protobuf/InvalidProtocolBufferException.java \
- java/core/src/main/java/com/google/protobuf/IterableByteBufferInputStream.java \
- java/core/src/main/java/com/google/protobuf/JavaType.java \
- java/core/src/main/java/com/google/protobuf/LazyField.java \
- java/core/src/main/java/com/google/protobuf/LazyFieldLite.java \
- java/core/src/main/java/com/google/protobuf/LazyStringArrayList.java \
- java/core/src/main/java/com/google/protobuf/LazyStringList.java \
- java/core/src/main/java/com/google/protobuf/ListFieldSchema.java \
- java/core/src/main/java/com/google/protobuf/LongArrayList.java \
- java/core/src/main/java/com/google/protobuf/ManifestSchemaFactory.java \
- java/core/src/main/java/com/google/protobuf/MapEntry.java \
- java/core/src/main/java/com/google/protobuf/MapEntryLite.java \
- java/core/src/main/java/com/google/protobuf/MapField.java \
- java/core/src/main/java/com/google/protobuf/MapFieldLite.java \
- java/core/src/main/java/com/google/protobuf/MapFieldSchema.java \
- java/core/src/main/java/com/google/protobuf/MapFieldSchemaFull.java \
- java/core/src/main/java/com/google/protobuf/MapFieldSchemaLite.java \
- java/core/src/main/java/com/google/protobuf/MapFieldSchemas.java \
- java/core/src/main/java/com/google/protobuf/Message.java \
- java/core/src/main/java/com/google/protobuf/MessageInfo.java \
- java/core/src/main/java/com/google/protobuf/MessageInfoFactory.java \
- java/core/src/main/java/com/google/protobuf/MessageLite.java \
- java/core/src/main/java/com/google/protobuf/MessageLiteOrBuilder.java \
- java/core/src/main/java/com/google/protobuf/MessageLiteToString.java \
- java/core/src/main/java/com/google/protobuf/MessageOrBuilder.java \
- java/core/src/main/java/com/google/protobuf/MessageReflection.java \
- java/core/src/main/java/com/google/protobuf/MessageSchema.java \
- java/core/src/main/java/com/google/protobuf/MessageSetSchema.java \
- java/core/src/main/java/com/google/protobuf/MutabilityOracle.java \
- java/core/src/main/java/com/google/protobuf/NewInstanceSchema.java \
- java/core/src/main/java/com/google/protobuf/NewInstanceSchemaFull.java \
- java/core/src/main/java/com/google/protobuf/NewInstanceSchemaLite.java \
- java/core/src/main/java/com/google/protobuf/NewInstanceSchemas.java \
- java/core/src/main/java/com/google/protobuf/NioByteString.java \
- java/core/src/main/java/com/google/protobuf/OneofInfo.java \
- java/core/src/main/java/com/google/protobuf/Parser.java \
- java/core/src/main/java/com/google/protobuf/PrimitiveNonBoxingCollection.java \
- java/core/src/main/java/com/google/protobuf/ProtoSyntax.java \
- java/core/src/main/java/com/google/protobuf/Protobuf.java \
- java/core/src/main/java/com/google/protobuf/ProtobufArrayList.java \
- java/core/src/main/java/com/google/protobuf/ProtobufLists.java \
- java/core/src/main/java/com/google/protobuf/ProtocolMessageEnum.java \
- java/core/src/main/java/com/google/protobuf/ProtocolStringList.java \
- java/core/src/main/java/com/google/protobuf/RawMessageInfo.java \
- java/core/src/main/java/com/google/protobuf/Reader.java \
- java/core/src/main/java/com/google/protobuf/RepeatedFieldBuilder.java \
- java/core/src/main/java/com/google/protobuf/RepeatedFieldBuilderV3.java \
- java/core/src/main/java/com/google/protobuf/RopeByteString.java \
- java/core/src/main/java/com/google/protobuf/RpcCallback.java \
- java/core/src/main/java/com/google/protobuf/RpcChannel.java \
- java/core/src/main/java/com/google/protobuf/RpcController.java \
- java/core/src/main/java/com/google/protobuf/RpcUtil.java \
- java/core/src/main/java/com/google/protobuf/Schema.java \
- java/core/src/main/java/com/google/protobuf/SchemaFactory.java \
- java/core/src/main/java/com/google/protobuf/SchemaUtil.java \
- java/core/src/main/java/com/google/protobuf/Service.java \
- java/core/src/main/java/com/google/protobuf/ServiceException.java \
- java/core/src/main/java/com/google/protobuf/SingleFieldBuilder.java \
- java/core/src/main/java/com/google/protobuf/SingleFieldBuilderV3.java \
- java/core/src/main/java/com/google/protobuf/SmallSortedMap.java \
- java/core/src/main/java/com/google/protobuf/StructuralMessageInfo.java \
- java/core/src/main/java/com/google/protobuf/TextFormat.java \
- java/core/src/main/java/com/google/protobuf/TextFormatEscaper.java \
- java/core/src/main/java/com/google/protobuf/TextFormatParseInfoTree.java \
- java/core/src/main/java/com/google/protobuf/TextFormatParseLocation.java \
- java/core/src/main/java/com/google/protobuf/TypeRegistry.java \
- java/core/src/main/java/com/google/protobuf/UninitializedMessageException.java \
- java/core/src/main/java/com/google/protobuf/UnknownFieldSchema.java \
- java/core/src/main/java/com/google/protobuf/UnknownFieldSet.java \
- java/core/src/main/java/com/google/protobuf/UnknownFieldSetLite.java \
- java/core/src/main/java/com/google/protobuf/UnknownFieldSetLiteSchema.java \
- java/core/src/main/java/com/google/protobuf/UnknownFieldSetSchema.java \
- java/core/src/main/java/com/google/protobuf/UnmodifiableLazyStringList.java \
- java/core/src/main/java/com/google/protobuf/UnsafeByteOperations.java \
- java/core/src/main/java/com/google/protobuf/UnsafeUtil.java \
- java/core/src/main/java/com/google/protobuf/Utf8.java \
- java/core/src/main/java/com/google/protobuf/WireFormat.java \
- java/core/src/main/java/com/google/protobuf/Writer.java \
- java/core/src/test/java/com/google/protobuf/AbstractMessageTest.java \
- java/core/src/test/java/com/google/protobuf/AbstractProto2LiteSchemaTest.java \
- java/core/src/test/java/com/google/protobuf/AbstractProto2SchemaTest.java \
- java/core/src/test/java/com/google/protobuf/AbstractProto3LiteSchemaTest.java \
- java/core/src/test/java/com/google/protobuf/AbstractProto3SchemaTest.java \
- java/core/src/test/java/com/google/protobuf/AbstractSchemaTest.java \
- java/core/src/test/java/com/google/protobuf/AnyTest.java \
- java/core/src/test/java/com/google/protobuf/ArrayDecodersTest.java \
- java/core/src/test/java/com/google/protobuf/BinaryProtocolTest.java \
- java/core/src/test/java/com/google/protobuf/BooleanArrayListTest.java \
- java/core/src/test/java/com/google/protobuf/BoundedByteStringTest.java \
- java/core/src/test/java/com/google/protobuf/ByteBufferWriterTest.java \
- java/core/src/test/java/com/google/protobuf/ByteStringTest.java \
- java/core/src/test/java/com/google/protobuf/CachedFieldSizeTest.java \
- java/core/src/test/java/com/google/protobuf/CheckUtf8Test.java \
- java/core/src/test/java/com/google/protobuf/CodedAdapterTest.java \
- java/core/src/test/java/com/google/protobuf/CodedInputStreamTest.java \
- java/core/src/test/java/com/google/protobuf/CodedOutputStreamTest.java \
- java/core/src/test/java/com/google/protobuf/DecodeUtf8Test.java \
- java/core/src/test/java/com/google/protobuf/DeprecatedFieldTest.java \
- java/core/src/test/java/com/google/protobuf/DescriptorsTest.java \
- java/core/src/test/java/com/google/protobuf/DiscardUnknownFieldsTest.java \
- java/core/src/test/java/com/google/protobuf/DoubleArrayListTest.java \
- java/core/src/test/java/com/google/protobuf/DynamicMessageTest.java \
- java/core/src/test/java/com/google/protobuf/EnumTest.java \
- java/core/src/test/java/com/google/protobuf/ExperimentalMessageFactory.java \
- java/core/src/test/java/com/google/protobuf/ExperimentalSerializationUtil.java \
- java/core/src/test/java/com/google/protobuf/ExperimentalTestDataProvider.java \
- java/core/src/test/java/com/google/protobuf/ExtensionRegistryFactoryTest.java \
- java/core/src/test/java/com/google/protobuf/FieldPresenceTest.java \
- java/core/src/test/java/com/google/protobuf/FloatArrayListTest.java \
- java/core/src/test/java/com/google/protobuf/GeneratedMessageTest.java \
- java/core/src/test/java/com/google/protobuf/IntArrayListTest.java \
- java/core/src/test/java/com/google/protobuf/InvalidProtocolBufferExceptionTest.java \
- java/core/src/test/java/com/google/protobuf/IsValidUtf8Test.java \
- java/core/src/test/java/com/google/protobuf/IsValidUtf8TestUtil.java \
- java/core/src/test/java/com/google/protobuf/LazyFieldLiteTest.java \
- java/core/src/test/java/com/google/protobuf/LazyFieldTest.java \
- java/core/src/test/java/com/google/protobuf/LazyMessageLiteTest.java \
- java/core/src/test/java/com/google/protobuf/LazyStringArrayListTest.java \
- java/core/src/test/java/com/google/protobuf/LazyStringEndToEndTest.java \
- java/core/src/test/java/com/google/protobuf/LiteEqualsAndHashTest.java \
- java/core/src/test/java/com/google/protobuf/LiteralByteStringTest.java \
- java/core/src/test/java/com/google/protobuf/LongArrayListTest.java \
- java/core/src/test/java/com/google/protobuf/MapForProto2LiteTest.java \
- java/core/src/test/java/com/google/protobuf/MapForProto2Test.java \
- java/core/src/test/java/com/google/protobuf/MapLiteTest.java \
- java/core/src/test/java/com/google/protobuf/MapTest.java \
- java/core/src/test/java/com/google/protobuf/MessageTest.java \
- java/core/src/test/java/com/google/protobuf/NestedBuildersTest.java \
- java/core/src/test/java/com/google/protobuf/NioByteStringTest.java \
- java/core/src/test/java/com/google/protobuf/PackedFieldTest.java \
- java/core/src/test/java/com/google/protobuf/ParseExceptionsTest.java \
- java/core/src/test/java/com/google/protobuf/ParserLiteTest.java \
- java/core/src/test/java/com/google/protobuf/ParserTest.java \
- java/core/src/test/java/com/google/protobuf/Proto2ExtensionLookupSchemaTest.java \
- java/core/src/test/java/com/google/protobuf/Proto2LiteSchemaTest.java \
- java/core/src/test/java/com/google/protobuf/Proto2MessageFactory.java \
- java/core/src/test/java/com/google/protobuf/Proto2MessageLiteFactory.java \
- java/core/src/test/java/com/google/protobuf/Proto2SchemaTest.java \
- java/core/src/test/java/com/google/protobuf/Proto2UnknownEnumValueTest.java \
- java/core/src/test/java/com/google/protobuf/Proto3LiteSchemaTest.java \
- java/core/src/test/java/com/google/protobuf/Proto3MessageFactory.java \
- java/core/src/test/java/com/google/protobuf/Proto3MessageLiteFactory.java \
- java/core/src/test/java/com/google/protobuf/Proto3SchemaTest.java \
- java/core/src/test/java/com/google/protobuf/ProtobufArrayListTest.java \
- java/core/src/test/java/com/google/protobuf/RepeatedFieldBuilderV3Test.java \
- java/core/src/test/java/com/google/protobuf/RopeByteStringSubstringTest.java \
- java/core/src/test/java/com/google/protobuf/RopeByteStringTest.java \
- java/core/src/test/java/com/google/protobuf/ServiceTest.java \
- java/core/src/test/java/com/google/protobuf/SingleFieldBuilderV3Test.java \
- java/core/src/test/java/com/google/protobuf/SmallSortedMapTest.java \
- java/core/src/test/java/com/google/protobuf/TestBadIdentifiers.java \
- java/core/src/test/java/com/google/protobuf/TestBadIdentifiersLite.java \
- java/core/src/test/java/com/google/protobuf/TestSchemas.java \
- java/core/src/test/java/com/google/protobuf/TestSchemasLite.java \
- java/core/src/test/java/com/google/protobuf/TestUtil.java \
- java/core/src/test/java/com/google/protobuf/TestUtilLite.java \
- java/core/src/test/java/com/google/protobuf/TextFormatParseInfoTreeTest.java \
- java/core/src/test/java/com/google/protobuf/TextFormatParseLocationTest.java \
- java/core/src/test/java/com/google/protobuf/TextFormatTest.java \
- java/core/src/test/java/com/google/protobuf/TypeRegistryTest.java \
- java/core/src/test/java/com/google/protobuf/UnknownEnumValueTest.java \
- java/core/src/test/java/com/google/protobuf/UnknownFieldSetTest.java \
- java/core/src/test/java/com/google/protobuf/UnknownFieldSetPerformanceTest.java \
- java/core/src/test/java/com/google/protobuf/UnmodifiableLazyStringListTest.java \
- java/core/src/test/java/com/google/protobuf/Utf8Test.java \
- java/core/src/test/java/com/google/protobuf/WellKnownTypesTest.java \
- java/core/src/test/java/com/google/protobuf/WireFormatLiteTest.java \
- java/core/src/test/java/com/google/protobuf/WireFormatTest.java \
- java/core/src/test/java/com/google/protobuf/WrappersLiteOfMethodTest.java \
- java/core/src/test/java/com/google/protobuf/WrappersOfMethodTest.java \
- java/core/src/test/proto/com/google/protobuf/any_test.proto \
- java/core/src/test/proto/com/google/protobuf/cached_field_size_test.proto \
- java/core/src/test/proto/com/google/protobuf/deprecated_file.proto \
- java/core/src/test/proto/com/google/protobuf/dynamic_message_test.proto \
- java/core/src/test/proto/com/google/protobuf/field_presence_test.proto \
- java/core/src/test/proto/com/google/protobuf/lazy_fields_lite.proto \
- java/core/src/test/proto/com/google/protobuf/lite_equals_and_hash.proto \
- java/core/src/test/proto/com/google/protobuf/map_for_proto2_lite_test.proto \
- java/core/src/test/proto/com/google/protobuf/map_for_proto2_test.proto \
- java/core/src/test/proto/com/google/protobuf/map_initialization_order_test.proto \
- java/core/src/test/proto/com/google/protobuf/map_lite_test.proto \
- java/core/src/test/proto/com/google/protobuf/map_test.proto \
- java/core/src/test/proto/com/google/protobuf/multiple_files_test.proto \
- java/core/src/test/proto/com/google/protobuf/nested_builders_test.proto \
- java/core/src/test/proto/com/google/protobuf/nested_extension.proto \
- java/core/src/test/proto/com/google/protobuf/nested_extension_lite.proto \
- java/core/src/test/proto/com/google/protobuf/non_nested_extension.proto \
- java/core/src/test/proto/com/google/protobuf/non_nested_extension_lite.proto \
- java/core/src/test/proto/com/google/protobuf/outer_class_name_test.proto \
- java/core/src/test/proto/com/google/protobuf/outer_class_name_test2.proto \
- java/core/src/test/proto/com/google/protobuf/outer_class_name_test3.proto \
- java/core/src/test/proto/com/google/protobuf/packed_field_test.proto \
- java/core/src/test/proto/com/google/protobuf/proto2_message.proto \
- java/core/src/test/proto/com/google/protobuf/proto2_message_lite.proto \
- java/core/src/test/proto/com/google/protobuf/proto2_unknown_enum_values.proto \
- java/core/src/test/proto/com/google/protobuf/proto3_message.proto \
- java/core/src/test/proto/com/google/protobuf/proto3_message_lite.proto \
- java/core/src/test/proto/com/google/protobuf/test_bad_identifiers.proto \
- java/core/src/test/proto/com/google/protobuf/test_check_utf8.proto \
- java/core/src/test/proto/com/google/protobuf/test_check_utf8_size.proto \
- java/core/src/test/proto/com/google/protobuf/test_custom_options.proto \
- java/core/src/test/proto/com/google/protobuf/wrappers_test.proto \
- java/internal/BUILD.bazel \
- java/internal/testing.bzl \
- java/kotlin/BUILD.bazel \
- java/kotlin/generate-sources-build.xml \
- java/kotlin/generate-test-sources-build.xml \
- java/kotlin/pom.xml \
- java/kotlin/pom_template.xml \
- java/kotlin/src/main/kotlin/com/google/protobuf/Anies.kt \
- java/kotlin/src/main/kotlin/com/google/protobuf/ByteStrings.kt \
- java/kotlin/src/main/kotlin/com/google/protobuf/DslList.kt \
- java/kotlin/src/main/kotlin/com/google/protobuf/DslMap.kt \
- java/kotlin/src/main/kotlin/com/google/protobuf/DslProxy.kt \
- java/kotlin/src/main/kotlin/com/google/protobuf/ExtendableMessageExtensions.kt \
- java/kotlin/src/main/kotlin/com/google/protobuf/ExtensionList.kt \
- java/kotlin/src/main/kotlin/com/google/protobuf/OnlyForUseByGeneratedProtoCode.kt\
- java/kotlin/src/main/kotlin/com/google/protobuf/ProtoDslMarker.kt \
- java/kotlin/src/main/kotlin/com/google/protobuf/UnmodifiableCollections.kt \
- java/kotlin/src/test/kotlin/com/google/protobuf/AniesTest.kt \
- java/kotlin/src/test/kotlin/com/google/protobuf/ByteStringsTest.kt \
- java/kotlin/src/test/kotlin/com/google/protobuf/DslListTest.kt \
- java/kotlin/src/test/kotlin/com/google/protobuf/DslMapTest.kt \
- java/kotlin/src/test/kotlin/com/google/protobuf/ExtendableMessageExtensionsTest.kt\
- java/kotlin/src/test/kotlin/com/google/protobuf/ExtensionListTest.kt \
- java/kotlin/src/test/kotlin/com/google/protobuf/Proto2Test.kt \
- java/kotlin/src/test/kotlin/com/google/protobuf/Proto3Test.kt \
- java/kotlin/src/test/proto/com/google/protobuf/evil_names_proto2.proto \
- java/kotlin/src/test/proto/com/google/protobuf/evil_names_proto3.proto \
- java/kotlin/src/test/proto/com/google/protobuf/example_extensible_message.proto \
- java/kotlin/src/test/proto/com/google/protobuf/multiple_files_proto3.proto \
- java/kotlin-lite/BUILD.bazel \
- java/kotlin-lite/generate-sources-build.xml \
- java/kotlin-lite/generate-test-sources-build.xml \
- java/kotlin-lite/lite.awk \
- java/kotlin-lite/pom.xml \
- java/kotlin-lite/pom_template.xml \
- java/kotlin-lite/process-lite-sources-build.xml \
- java/kotlin-lite/src/main/kotlin/com/google/protobuf/ExtendableMessageLiteExtensions.kt\
- java/kotlin-lite/src/test/kotlin/com/google/protobuf/ExtendableMessageLiteExtensionsTest.kt\
- java/kotlin-lite/src/test/kotlin/com/google/protobuf/Proto2LiteTest.kt \
- java/lite.md \
- java/lite/BUILD.bazel \
- java/lite/generate-sources-build.xml \
- java/lite/generate-test-sources-build.xml \
- java/lite/lite.awk \
- java/lite/pom.xml \
- java/lite/pom_template.xml \
- java/lite/process-lite-sources-build.xml \
- java/lite/src/test/java/com/google/protobuf/LiteTest.java \
- java/BUILD.bazel \
- java/pom.xml \
- java/util/BUILD.bazel \
- java/util/pom.xml \
- java/util/pom_template.xml \
- java/util/src/main/java/com/google/protobuf/util/Durations.java \
- java/util/src/main/java/com/google/protobuf/util/FieldMaskTree.java \
- java/util/src/main/java/com/google/protobuf/util/FieldMaskUtil.java \
- java/util/src/main/java/com/google/protobuf/util/JsonFormat.java \
- java/util/src/main/java/com/google/protobuf/util/Structs.java \
- java/util/src/main/java/com/google/protobuf/util/Timestamps.java \
- java/util/src/main/java/com/google/protobuf/util/Values.java \
- java/util/src/test/java/com/google/protobuf/util/DurationsTest.java \
- java/util/src/test/java/com/google/protobuf/util/FieldMaskTreeTest.java \
- java/util/src/test/java/com/google/protobuf/util/FieldMaskUtilTest.java \
- java/util/src/test/java/com/google/protobuf/util/JsonFormatTest.java \
- java/util/src/test/java/com/google/protobuf/util/StructsTest.java \
- java/util/src/test/java/com/google/protobuf/util/TimestampsTest.java \
- java/util/src/test/java/com/google/protobuf/util/ValuesTest.java \
- java/util/src/test/proto/com/google/protobuf/util/json_test.proto
-
-# Note: please keep this in sync with the dist_files rule in objectivec/BUILD.bazel.
-objectivec_EXTRA_DIST= \
- objectivec/.clang-format \
- objectivec/BUILD.bazel \
- objectivec/DevTools/check_version_stamps.sh \
- objectivec/DevTools/compile_testing_protos.sh \
- objectivec/DevTools/full_mac_build.sh \
- objectivec/DevTools/pddm.py \
- objectivec/DevTools/pddm_tests.py \
- objectivec/generate_well_known_types.sh \
- objectivec/google/protobuf/Any.pbobjc.h \
- objectivec/google/protobuf/Api.pbobjc.h \
- objectivec/google/protobuf/Duration.pbobjc.h \
- objectivec/google/protobuf/Empty.pbobjc.h \
- objectivec/google/protobuf/FieldMask.pbobjc.h \
- objectivec/google/protobuf/SourceContext.pbobjc.h \
- objectivec/google/protobuf/Struct.pbobjc.h \
- objectivec/google/protobuf/Timestamp.pbobjc.h \
- objectivec/google/protobuf/Type.pbobjc.h \
- objectivec/google/protobuf/Wrappers.pbobjc.h \
- objectivec/GPBAny.pbobjc.h \
- objectivec/GPBAny.pbobjc.m \
- objectivec/GPBApi.pbobjc.h \
- objectivec/GPBApi.pbobjc.m \
- objectivec/GPBArray.h \
- objectivec/GPBArray.m \
- objectivec/GPBArray_PackagePrivate.h \
- objectivec/GPBBootstrap.h \
- objectivec/GPBCodedInputStream.h \
- objectivec/GPBCodedInputStream.m \
- objectivec/GPBCodedInputStream_PackagePrivate.h \
- objectivec/GPBCodedOutputStream.h \
- objectivec/GPBCodedOutputStream.m \
- objectivec/GPBCodedOutputStream_PackagePrivate.h \
- objectivec/GPBDescriptor.h \
- objectivec/GPBDescriptor.m \
- objectivec/GPBDescriptor_PackagePrivate.h \
- objectivec/GPBDictionary.h \
- objectivec/GPBDictionary.m \
- objectivec/GPBDictionary_PackagePrivate.h \
- objectivec/GPBDuration.pbobjc.h \
- objectivec/GPBDuration.pbobjc.m \
- objectivec/GPBEmpty.pbobjc.h \
- objectivec/GPBEmpty.pbobjc.m \
- objectivec/GPBExtensionInternals.h \
- objectivec/GPBExtensionInternals.m \
- objectivec/GPBExtensionRegistry.h \
- objectivec/GPBExtensionRegistry.m \
- objectivec/GPBFieldMask.pbobjc.h \
- objectivec/GPBFieldMask.pbobjc.m \
- objectivec/GPBMessage.h \
- objectivec/GPBMessage.m \
- objectivec/GPBMessage_PackagePrivate.h \
- objectivec/GPBProtocolBuffers.h \
- objectivec/GPBProtocolBuffers.m \
- objectivec/GPBProtocolBuffers_RuntimeSupport.h \
- objectivec/GPBRootObject.h \
- objectivec/GPBRootObject.m \
- objectivec/GPBRootObject_PackagePrivate.h \
- objectivec/GPBRuntimeTypes.h \
- objectivec/GPBSourceContext.pbobjc.h \
- objectivec/GPBSourceContext.pbobjc.m \
- objectivec/GPBStruct.pbobjc.h \
- objectivec/GPBStruct.pbobjc.m \
- objectivec/GPBTimestamp.pbobjc.h \
- objectivec/GPBTimestamp.pbobjc.m \
- objectivec/GPBType.pbobjc.h \
- objectivec/GPBType.pbobjc.m \
- objectivec/GPBUnknownField.h \
- objectivec/GPBUnknownField.m \
- objectivec/GPBUnknownField_PackagePrivate.h \
- objectivec/GPBUnknownFieldSet.h \
- objectivec/GPBUnknownFieldSet.m \
- objectivec/GPBUnknownFieldSet_PackagePrivate.h \
- objectivec/GPBUtilities.h \
- objectivec/GPBUtilities.m \
- objectivec/GPBUtilities_PackagePrivate.h \
- objectivec/GPBWellKnownTypes.h \
- objectivec/GPBWellKnownTypes.m \
- objectivec/GPBWireFormat.h \
- objectivec/GPBWireFormat.m \
- objectivec/GPBWrappers.pbobjc.h \
- objectivec/GPBWrappers.pbobjc.m \
- objectivec/ProtocolBuffers_iOS.xcodeproj/project.pbxproj \
- objectivec/ProtocolBuffers_iOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata \
- objectivec/ProtocolBuffers_iOS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist \
- objectivec/ProtocolBuffers_iOS.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings \
- objectivec/ProtocolBuffers_iOS.xcodeproj/xcshareddata/xcschemes/PerformanceTests.xcscheme \
- objectivec/ProtocolBuffers_iOS.xcodeproj/xcshareddata/xcschemes/ProtocolBuffers.xcscheme \
- objectivec/ProtocolBuffers_OSX.xcodeproj/project.pbxproj \
- objectivec/ProtocolBuffers_OSX.xcodeproj/project.xcworkspace/contents.xcworkspacedata \
- objectivec/ProtocolBuffers_OSX.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist \
- objectivec/ProtocolBuffers_OSX.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings \
- objectivec/ProtocolBuffers_OSX.xcodeproj/xcshareddata/xcschemes/PerformanceTests.xcscheme \
- objectivec/ProtocolBuffers_OSX.xcodeproj/xcshareddata/xcschemes/ProtocolBuffers.xcscheme \
- objectivec/ProtocolBuffers_tvOS.xcodeproj/project.pbxproj \
- objectivec/ProtocolBuffers_tvOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata \
- objectivec/ProtocolBuffers_tvOS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist \
- objectivec/ProtocolBuffers_tvOS.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings \
- objectivec/ProtocolBuffers_tvOS.xcodeproj/xcshareddata/xcschemes/PerformanceTests.xcscheme \
- objectivec/ProtocolBuffers_tvOS.xcodeproj/xcshareddata/xcschemes/ProtocolBuffers.xcscheme \
- objectivec/README.md \
- objectivec/Tests/golden_message \
- objectivec/Tests/golden_packed_fields_message \
- objectivec/Tests/GPBARCUnittestProtos.m \
- objectivec/Tests/GPBArrayTests.m \
- objectivec/Tests/GPBCodedInputStreamTests.m \
- objectivec/Tests/GPBCodedOuputStreamTests.m \
- objectivec/Tests/GPBCompileTest01.m \
- objectivec/Tests/GPBCompileTest02.m \
- objectivec/Tests/GPBCompileTest03.m \
- objectivec/Tests/GPBCompileTest04.m \
- objectivec/Tests/GPBCompileTest05.m \
- objectivec/Tests/GPBCompileTest06.m \
- objectivec/Tests/GPBCompileTest07.m \
- objectivec/Tests/GPBCompileTest08.m \
- objectivec/Tests/GPBCompileTest09.m \
- objectivec/Tests/GPBCompileTest10.m \
- objectivec/Tests/GPBCompileTest11.m \
- objectivec/Tests/GPBCompileTest12.m \
- objectivec/Tests/GPBCompileTest13.m \
- objectivec/Tests/GPBCompileTest14.m \
- objectivec/Tests/GPBCompileTest15.m \
- objectivec/Tests/GPBCompileTest16.m \
- objectivec/Tests/GPBCompileTest17.m \
- objectivec/Tests/GPBCompileTest18.m \
- objectivec/Tests/GPBCompileTest19.m \
- objectivec/Tests/GPBCompileTest20.m \
- objectivec/Tests/GPBCompileTest21.m \
- objectivec/Tests/GPBCompileTest22.m \
- objectivec/Tests/GPBCompileTest23.m \
- objectivec/Tests/GPBCompileTest24.m \
- objectivec/Tests/GPBCompileTest25.m \
- objectivec/Tests/GPBConcurrencyTests.m \
- objectivec/Tests/GPBDescriptorTests.m \
- objectivec/Tests/GPBDictionaryTests+Bool.m \
- objectivec/Tests/GPBDictionaryTests+Int32.m \
- objectivec/Tests/GPBDictionaryTests+Int64.m \
- objectivec/Tests/GPBDictionaryTests+String.m \
- objectivec/Tests/GPBDictionaryTests+UInt32.m \
- objectivec/Tests/GPBDictionaryTests+UInt64.m \
- objectivec/Tests/GPBDictionaryTests.m \
- objectivec/Tests/GPBDictionaryTests.pddm \
- objectivec/Tests/GPBExtensionRegistryTest.m \
- objectivec/Tests/GPBMessageTests+ClassNames.m \
- objectivec/Tests/GPBMessageTests+Merge.m \
- objectivec/Tests/GPBMessageTests+Runtime.m \
- objectivec/Tests/GPBMessageTests+Serialization.m \
- objectivec/Tests/GPBMessageTests.m \
- objectivec/Tests/GPBObjectiveCPlusPlusTest.mm \
- objectivec/Tests/GPBPerfTests.m \
- objectivec/Tests/GPBSwiftTests.swift \
- objectivec/Tests/GPBTestUtilities.h \
- objectivec/Tests/GPBTestUtilities.m \
- objectivec/Tests/GPBUnittestProtos.m \
- objectivec/Tests/GPBUnittestProtos2.m \
- objectivec/Tests/GPBUnknownFieldSetTest.m \
- objectivec/Tests/GPBUtilitiesTests.m \
- objectivec/Tests/GPBWellKnownTypesTest.m \
- objectivec/Tests/GPBWireFormatTests.m \
- objectivec/Tests/text_format_extensions_unittest_data.txt \
- objectivec/Tests/text_format_map_unittest_data.txt \
- objectivec/Tests/text_format_unittest_data.txt \
- objectivec/Tests/unittest_cycle.proto \
- objectivec/Tests/unittest_deprecated.proto \
- objectivec/Tests/unittest_deprecated_file.proto \
- objectivec/Tests/unittest_extension_chain_a.proto \
- objectivec/Tests/unittest_extension_chain_b.proto \
- objectivec/Tests/unittest_extension_chain_c.proto \
- objectivec/Tests/unittest_extension_chain_d.proto \
- objectivec/Tests/unittest_extension_chain_e.proto \
- objectivec/Tests/unittest_extension_chain_f.proto \
- objectivec/Tests/unittest_extension_chain_g.proto \
- objectivec/Tests/unittest_objc.proto \
- objectivec/Tests/unittest_objc_options.proto \
- objectivec/Tests/unittest_objc_startup.proto \
- objectivec/Tests/unittest_runtime_proto2.proto \
- objectivec/Tests/unittest_runtime_proto3.proto \
- objectivec/Tests/UnitTests-Bridging-Header.h \
- objectivec/Tests/UnitTests-Info.plist \
- Protobuf.podspec
-
-# Note: please keep this in sync with the dist_files rule in php/BUILD.bazel.
-php_EXTRA_DIST= \
- php/README.md \
- php/REFCOUNTING.md \
- php/composer.json \
- php/composer.json.dist \
- php/ext/google/protobuf/arena.c \
- php/ext/google/protobuf/arena.h \
- php/ext/google/protobuf/array.c \
- php/ext/google/protobuf/array.h \
- php/ext/google/protobuf/config.m4 \
- php/ext/google/protobuf/convert.c \
- php/ext/google/protobuf/convert.h \
- php/ext/google/protobuf/def.c \
- php/ext/google/protobuf/def.h \
- php/ext/google/protobuf/map.c \
- php/ext/google/protobuf/map.h \
- php/ext/google/protobuf/message.c \
- php/ext/google/protobuf/message.h \
- php/ext/google/protobuf/names.c \
- php/ext/google/protobuf/names.h \
- php/ext/google/protobuf/package.xml \
- php/ext/google/protobuf/php-upb.c \
- php/ext/google/protobuf/php-upb.h \
- php/ext/google/protobuf/php_protobuf.h \
- php/ext/google/protobuf/protobuf.c \
- php/ext/google/protobuf/protobuf.h \
- php/ext/google/protobuf/wkt.inc \
- php/ext/google/protobuf/tests/unnecessary_zval.phpt \
- php/generate_descriptor_protos.sh \
- php/generate_test_protos.sh \
- php/release.sh \
- php/src/GPBMetadata/Google/Protobuf/Any.php \
- php/src/GPBMetadata/Google/Protobuf/Api.php \
- php/src/GPBMetadata/Google/Protobuf/Duration.php \
- php/src/GPBMetadata/Google/Protobuf/FieldMask.php \
- php/src/GPBMetadata/Google/Protobuf/GPBEmpty.php \
- php/src/GPBMetadata/Google/Protobuf/Internal/Descriptor.php \
- php/src/GPBMetadata/Google/Protobuf/SourceContext.php \
- php/src/GPBMetadata/Google/Protobuf/Struct.php \
- php/src/GPBMetadata/Google/Protobuf/Timestamp.php \
- php/src/GPBMetadata/Google/Protobuf/Type.php \
- php/src/GPBMetadata/Google/Protobuf/Wrappers.php \
- php/src/Google/Protobuf/Any.php \
- php/src/Google/Protobuf/Api.php \
- php/src/Google/Protobuf/BoolValue.php \
- php/src/Google/Protobuf/BytesValue.php \
- php/src/Google/Protobuf/Descriptor.php \
- php/src/Google/Protobuf/DescriptorPool.php \
- php/src/Google/Protobuf/DoubleValue.php \
- php/src/Google/Protobuf/Duration.php \
- php/src/Google/Protobuf/Enum.php \
- php/src/Google/Protobuf/EnumDescriptor.php \
- php/src/Google/Protobuf/EnumValue.php \
- php/src/Google/Protobuf/EnumValueDescriptor.php \
- php/src/Google/Protobuf/Field.php \
- php/src/Google/Protobuf/FieldDescriptor.php \
- php/src/Google/Protobuf/FieldMask.php \
- php/src/Google/Protobuf/Field/Cardinality.php \
- php/src/Google/Protobuf/Field_Cardinality.php \
- php/src/Google/Protobuf/Field/Kind.php \
- php/src/Google/Protobuf/Field_Kind.php \
- php/src/Google/Protobuf/FloatValue.php \
- php/src/Google/Protobuf/GPBEmpty.php \
- php/src/Google/Protobuf/Int32Value.php \
- php/src/Google/Protobuf/Int64Value.php \
- php/src/Google/Protobuf/Internal/AnyBase.php \
- php/src/Google/Protobuf/Internal/CodedInputStream.php \
- php/src/Google/Protobuf/Internal/CodedOutputStream.php \
- php/src/Google/Protobuf/Internal/Descriptor.php \
- php/src/Google/Protobuf/Internal/DescriptorPool.php \
- php/src/Google/Protobuf/Internal/DescriptorProto.php \
- php/src/Google/Protobuf/Internal/DescriptorProto/ExtensionRange.php \
- php/src/Google/Protobuf/Internal/DescriptorProto/ReservedRange.php \
- php/src/Google/Protobuf/Internal/EnumBuilderContext.php \
- php/src/Google/Protobuf/Internal/EnumDescriptor.php \
- php/src/Google/Protobuf/Internal/EnumDescriptorProto.php \
- php/src/Google/Protobuf/Internal/EnumDescriptorProto/EnumReservedRange.php \
- php/src/Google/Protobuf/Internal/EnumOptions.php \
- php/src/Google/Protobuf/Internal/EnumValueDescriptorProto.php \
- php/src/Google/Protobuf/Internal/EnumValueOptions.php \
- php/src/Google/Protobuf/Internal/ExtensionRangeOptions.php \
- php/src/Google/Protobuf/Internal/FieldDescriptorProto.php \
- php/src/Google/Protobuf/Internal/FieldDescriptor.php \
- php/src/Google/Protobuf/Internal/FieldDescriptorProto.php \
- php/src/Google/Protobuf/Internal/FieldDescriptorProto/Label.php \
- php/src/Google/Protobuf/Internal/FieldDescriptorProto/Type.php \
- php/src/Google/Protobuf/Internal/FieldOptions.php \
- php/src/Google/Protobuf/Internal/FieldOptions/CType.php \
- php/src/Google/Protobuf/Internal/FieldOptions/JSType.php \
- php/src/Google/Protobuf/Internal/FileDescriptor.php \
- php/src/Google/Protobuf/Internal/FileDescriptorProto.php \
- php/src/Google/Protobuf/Internal/FileDescriptorSet.php \
- php/src/Google/Protobuf/Internal/FileOptions.php \
- php/src/Google/Protobuf/Internal/FileOptions/OptimizeMode.php \
- php/src/Google/Protobuf/Internal/GPBDecodeException.php \
- php/src/Google/Protobuf/Internal/GPBJsonWire.php \
- php/src/Google/Protobuf/Internal/GPBLabel.php \
- php/src/Google/Protobuf/Internal/GPBType.php \
- php/src/Google/Protobuf/Internal/GPBUtil.php \
- php/src/Google/Protobuf/Internal/GPBWire.php \
- php/src/Google/Protobuf/Internal/GPBWireType.php \
- php/src/Google/Protobuf/Internal/GeneratedCodeInfo.php \
- php/src/Google/Protobuf/Internal/GeneratedCodeInfo/Annotation.php \
- php/src/Google/Protobuf/Internal/GetPublicDescriptorTrait.php \
- php/src/Google/Protobuf/Internal/HasPublicDescriptorTrait.php \
- php/src/Google/Protobuf/Internal/MapEntry.php \
- php/src/Google/Protobuf/Internal/MapField.php \
- php/src/Google/Protobuf/Internal/MapFieldIter.php \
- php/src/Google/Protobuf/Internal/Message.php \
- php/src/Google/Protobuf/Internal/MessageBuilderContext.php \
- php/src/Google/Protobuf/Internal/MessageOptions.php \
- php/src/Google/Protobuf/Internal/MethodDescriptorProto.php \
- php/src/Google/Protobuf/Internal/MethodOptions.php \
- php/src/Google/Protobuf/Internal/MethodOptions/IdempotencyLevel.php \
- php/src/Google/Protobuf/Internal/OneofDescriptor.php \
- php/src/Google/Protobuf/Internal/OneofDescriptorProto.php \
- php/src/Google/Protobuf/Internal/OneofField.php \
- php/src/Google/Protobuf/Internal/OneofOptions.php \
- php/src/Google/Protobuf/Internal/RawInputStream.php \
- php/src/Google/Protobuf/Internal/RepeatedField.php \
- php/src/Google/Protobuf/Internal/RepeatedFieldIter.php \
- php/src/Google/Protobuf/Internal/ServiceDescriptorProto.php \
- php/src/Google/Protobuf/Internal/ServiceOptions.php \
- php/src/Google/Protobuf/Internal/SourceCodeInfo.php \
- php/src/Google/Protobuf/Internal/SourceCodeInfo/Location.php \
- php/src/Google/Protobuf/Internal/TimestampBase.php \
- php/src/Google/Protobuf/Internal/UninterpretedOption.php \
- php/src/Google/Protobuf/Internal/UninterpretedOption/NamePart.php \
- php/src/Google/Protobuf/Internal/DescriptorProto_ExtensionRange.php \
- php/src/Google/Protobuf/Internal/DescriptorProto_ReservedRange.php \
- php/src/Google/Protobuf/Internal/EnumDescriptorProto_EnumReservedRange.php \
- php/src/Google/Protobuf/Internal/FieldDescriptorProto_Label.php \
- php/src/Google/Protobuf/Internal/FieldDescriptorProto_Type.php \
- php/src/Google/Protobuf/Internal/FieldOptions_CType.php \
- php/src/Google/Protobuf/Internal/FieldOptions_JSType.php \
- php/src/Google/Protobuf/Internal/FileOptions_OptimizeMode.php \
- php/src/Google/Protobuf/Internal/GeneratedCodeInfo_Annotation.php \
- php/src/Google/Protobuf/Internal/MethodOptions_IdempotencyLevel.php \
- php/src/Google/Protobuf/Internal/SourceCodeInfo_Location.php \
- php/src/Google/Protobuf/Internal/UninterpretedOption_NamePart.php \
- php/src/Google/Protobuf/ListValue.php \
- php/src/Google/Protobuf/Method.php \
- php/src/Google/Protobuf/Mixin.php \
- php/src/Google/Protobuf/NullValue.php \
- php/src/Google/Protobuf/OneofDescriptor.php \
- php/src/Google/Protobuf/Option.php \
- php/src/Google/Protobuf/SourceContext.php \
- php/src/Google/Protobuf/StringValue.php \
- php/src/Google/Protobuf/Struct.php \
- php/src/Google/Protobuf/Syntax.php \
- php/src/Google/Protobuf/Timestamp.php \
- php/src/Google/Protobuf/Type.php \
- php/src/Google/Protobuf/UInt32Value.php \
- php/src/Google/Protobuf/UInt64Value.php \
- php/src/Google/Protobuf/Value.php \
- php/src/phpdoc.dist.xml \
- php/tests/ArrayTest.php \
- php/tests/compatibility_test.sh \
- php/tests/compile_extension.sh \
- php/tests/DescriptorsTest.php \
- php/tests/EncodeDecodeTest.php \
- php/tests/force_c_ext.php \
- php/tests/gdb_test.sh \
- php/tests/generated_previous/GPBMetadata/ProtoPrevious/TestPreviouslyUnreservedMessage.php \
- php/tests/generated_previous/Previous/readonly.php \
- php/tests/GeneratedClassTest.php \
- php/tests/GeneratedPhpdocTest.php \
- php/tests/GeneratedServiceTest.php \
- php/tests/MapFieldTest.php \
- php/tests/memory_leak_test.php \
- php/tests/memory_leak_test.sh \
- php/tests/multirequest.php \
- php/tests/multirequest.sh \
- php/tests/PhpImplementationTest.php \
- php/tests/PreviouslyGeneratedClassTest.php \
- php/tests/proto/empty/echo.proto \
- php/tests/proto/test.proto \
- php/tests/proto/test_descriptors.proto \
- php/tests/proto/test_empty_php_namespace.proto \
- php/tests/proto/test_import_descriptor_proto.proto \
- php/tests/proto/test_include.proto \
- php/tests/proto/test_no_namespace.proto \
- php/tests/proto/test_php_namespace.proto \
- php/tests/proto/test_prefix.proto \
- php/tests/proto/test_reserved_enum_lower.proto \
- php/tests/proto/test_reserved_enum_upper.proto \
- php/tests/proto/test_reserved_enum_value_lower.proto \
- php/tests/proto/test_reserved_enum_value_upper.proto \
- php/tests/proto/test_reserved_message_lower.proto \
- php/tests/proto/test_reserved_message_upper.proto \
- php/tests/proto/test_service.proto \
- php/tests/proto/test_service_namespace.proto \
- php/tests/proto/test_wrapper_type_setters.proto \
- php/tests/proto_previous/test_previously_unreserved_message.proto \
- php/tests/test_base.php \
- php/tests/test_util.php \
- php/tests/valgrind.supp \
- php/tests/WellKnownTest.php \
- php/tests/WrapperTypeSettersTest.php
-
-# Note: please keep this in sync with the python_dist_files rule in BUILD.bazel.
-python_EXTRA_DIST= \
- python/MANIFEST.in \
- python/google/__init__.py \
- python/google/protobuf/__init__.py \
- python/google/protobuf/compiler/__init__.py \
- python/google/protobuf/descriptor.py \
- python/google/protobuf/descriptor_database.py \
- python/google/protobuf/descriptor_pool.py \
- python/google/protobuf/internal/__init__.py \
- python/google/protobuf/internal/_parameterized.py \
- python/google/protobuf/internal/any_test.proto \
- python/google/protobuf/internal/any_test.proto \
- python/google/protobuf/internal/api_implementation.cc \
- python/google/protobuf/internal/api_implementation.py \
- python/google/protobuf/internal/builder.py \
- python/google/protobuf/internal/containers.py \
- python/google/protobuf/internal/decoder.py \
- python/google/protobuf/internal/descriptor_database_test.py \
- python/google/protobuf/internal/descriptor_pool_test.py \
- python/google/protobuf/internal/descriptor_pool_test1.proto \
- python/google/protobuf/internal/descriptor_pool_test2.proto \
- python/google/protobuf/internal/descriptor_test.py \
- python/google/protobuf/internal/encoder.py \
- python/google/protobuf/internal/enum_type_wrapper.py \
- python/google/protobuf/internal/extension_dict.py \
- python/google/protobuf/internal/factory_test1.proto \
- python/google/protobuf/internal/factory_test2.proto \
- python/google/protobuf/internal/file_options_test.proto \
- python/google/protobuf/internal/generator_test.py \
- python/google/protobuf/internal/import_test.py \
- python/google/protobuf/internal/import_test_package/__init__.py \
- python/google/protobuf/internal/import_test_package/import_public.proto \
- python/google/protobuf/internal/import_test_package/import_public_nested.proto \
- python/google/protobuf/internal/import_test_package/inner.proto \
- python/google/protobuf/internal/import_test_package/outer.proto \
- python/google/protobuf/internal/json_format_test.py \
- python/google/protobuf/internal/keywords_test.py \
- python/google/protobuf/internal/message_factory_test.py \
- python/google/protobuf/internal/message_listener.py \
- python/google/protobuf/internal/message_set_extensions.proto \
- python/google/protobuf/internal/message_test.py \
- python/google/protobuf/internal/missing_enum_values.proto \
- python/google/protobuf/internal/more_extensions.proto \
- python/google/protobuf/internal/more_extensions_dynamic.proto \
- python/google/protobuf/internal/more_messages.proto \
- python/google/protobuf/internal/no_package.proto \
- python/google/protobuf/internal/packed_field_test.proto \
- python/google/protobuf/internal/proto_builder_test.py \
- python/google/protobuf/internal/python_message.py \
- python/google/protobuf/internal/python_protobuf.cc \
- python/google/protobuf/internal/reflection_test.py \
- python/google/protobuf/internal/service_reflection_test.py \
- python/google/protobuf/internal/symbol_database_test.py \
- python/google/protobuf/internal/test_bad_identifiers.proto \
- python/google/protobuf/internal/test_proto3_optional.proto \
- python/google/protobuf/internal/test_util.py \
- python/google/protobuf/internal/testing_refleaks.py \
- python/google/protobuf/internal/text_encoding_test.py \
- python/google/protobuf/internal/text_format_test.py \
- python/google/protobuf/internal/type_checkers.py \
- python/google/protobuf/internal/unknown_fields_test.py \
- python/google/protobuf/internal/well_known_types.py \
- python/google/protobuf/internal/well_known_types.py \
- python/google/protobuf/internal/well_known_types_test.py \
- python/google/protobuf/internal/well_known_types_test.py \
- python/google/protobuf/internal/wire_format.py \
- python/google/protobuf/internal/wire_format_test.py \
- python/google/protobuf/json_format.py \
- python/google/protobuf/message.py \
- python/google/protobuf/message_factory.py \
- python/google/protobuf/proto_api.h \
- python/google/protobuf/proto_builder.py \
- python/google/protobuf/pyext/README \
- python/google/protobuf/pyext/__init__.py \
- python/google/protobuf/pyext/cpp_message.py \
- python/google/protobuf/pyext/descriptor.cc \
- python/google/protobuf/pyext/descriptor.h \
- python/google/protobuf/pyext/descriptor_containers.cc \
- python/google/protobuf/pyext/descriptor_containers.h \
- python/google/protobuf/pyext/descriptor_database.cc \
- python/google/protobuf/pyext/descriptor_database.h \
- python/google/protobuf/pyext/descriptor_pool.cc \
- python/google/protobuf/pyext/descriptor_pool.h \
- python/google/protobuf/pyext/extension_dict.cc \
- python/google/protobuf/pyext/extension_dict.h \
- python/google/protobuf/pyext/map_container.cc \
- python/google/protobuf/pyext/map_container.h \
- python/google/protobuf/pyext/message.cc \
- python/google/protobuf/pyext/message.h \
- python/google/protobuf/pyext/field.cc \
- python/google/protobuf/pyext/field.h \
- python/google/protobuf/pyext/unknown_fields.cc \
- python/google/protobuf/pyext/unknown_fields.h \
- python/google/protobuf/pyext/message_factory.cc \
- python/google/protobuf/pyext/message_factory.h \
- python/google/protobuf/pyext/message_module.cc \
- python/google/protobuf/pyext/proto2_api_test.proto \
- python/google/protobuf/pyext/python.proto \
- python/google/protobuf/pyext/repeated_composite_container.cc \
- python/google/protobuf/pyext/repeated_composite_container.h \
- python/google/protobuf/pyext/repeated_scalar_container.cc \
- python/google/protobuf/pyext/repeated_scalar_container.h \
- python/google/protobuf/pyext/safe_numerics.h \
- python/google/protobuf/pyext/scoped_pyobject_ptr.h \
- python/google/protobuf/pyext/unknown_field_set.cc \
- python/google/protobuf/pyext/unknown_field_set.h \
- python/google/protobuf/python_protobuf.h \
- python/google/protobuf/reflection.py \
- python/google/protobuf/service.py \
- python/google/protobuf/service_reflection.py \
- python/google/protobuf/symbol_database.py \
- python/google/protobuf/text_encoding.py \
- python/google/protobuf/text_format.py \
- python/google/protobuf/unknown_fields.py \
- python/google/protobuf/util/__init__.py \
- python/release.sh \
- python/mox.py \
- python/setup.cfg \
- python/setup.py \
- python/stubout.py \
- python/tox.ini \
- python/README.md
-
-# Note: please keep this in sync with the dist_files rule in ruby/BUILD.bazel.
-ruby_EXTRA_DIST= \
- ruby/Gemfile \
- ruby/.gitignore \
- ruby/README.md \
- ruby/Rakefile \
- ruby/compatibility_tests/v3.0.0/tests/test_import.proto \
- ruby/compatibility_tests/v3.0.0/tests/stress.rb \
- ruby/compatibility_tests/v3.0.0/tests/repeated_field_test.rb \
- ruby/compatibility_tests/v3.0.0/tests/generated_code_test.rb \
- ruby/compatibility_tests/v3.0.0/tests/generated_code.proto \
- ruby/compatibility_tests/v3.0.0/tests/basic.rb \
- ruby/compatibility_tests/v3.0.0/test.sh \
- ruby/compatibility_tests/v3.0.0/Rakefile \
- ruby/compatibility_tests/v3.0.0/README.md \
- ruby/ext/google/protobuf_c/convert.c \
- ruby/ext/google/protobuf_c/convert.h \
- ruby/ext/google/protobuf_c/defs.c \
- ruby/ext/google/protobuf_c/defs.h \
- ruby/ext/google/protobuf_c/extconf.rb \
- ruby/ext/google/protobuf_c/map.c \
- ruby/ext/google/protobuf_c/map.h \
- ruby/ext/google/protobuf_c/message.c \
- ruby/ext/google/protobuf_c/message.h \
- ruby/ext/google/protobuf_c/protobuf.c \
- ruby/ext/google/protobuf_c/protobuf.h \
- ruby/ext/google/protobuf_c/repeated_field.c \
- ruby/ext/google/protobuf_c/repeated_field.h \
- ruby/ext/google/protobuf_c/ruby-upb.c \
- ruby/ext/google/protobuf_c/ruby-upb.h \
- ruby/ext/google/protobuf_c/wrap_memcpy.c \
- ruby/google-protobuf.gemspec \
- ruby/lib/google/protobuf/descriptor_dsl.rb \
- ruby/lib/google/protobuf/message_exts.rb \
- ruby/lib/google/protobuf/repeated_field.rb \
- ruby/lib/google/protobuf/well_known_types.rb \
- ruby/lib/google/protobuf.rb \
- ruby/pom.xml \
- ruby/src/main/java/com/google/protobuf/jruby/RubyDescriptor.java \
- ruby/src/main/java/com/google/protobuf/jruby/RubyDescriptorPool.java \
- ruby/src/main/java/com/google/protobuf/jruby/RubyEnum.java \
- ruby/src/main/java/com/google/protobuf/jruby/RubyEnumDescriptor.java \
- ruby/src/main/java/com/google/protobuf/jruby/RubyFieldDescriptor.java \
- ruby/src/main/java/com/google/protobuf/jruby/RubyFileDescriptor.java \
- ruby/src/main/java/com/google/protobuf/jruby/RubyMap.java \
- ruby/src/main/java/com/google/protobuf/jruby/RubyMessage.java \
- ruby/src/main/java/com/google/protobuf/jruby/RubyOneofDescriptor.java \
- ruby/src/main/java/com/google/protobuf/jruby/RubyProtobuf.java \
- ruby/src/main/java/com/google/protobuf/jruby/RubyRepeatedField.java \
- ruby/src/main/java/com/google/protobuf/jruby/SentinelOuterClass.java \
- ruby/src/main/java/com/google/protobuf/jruby/Utils.java \
- ruby/src/main/java/google/ProtobufJavaService.java \
- ruby/src/main/sentinel.proto \
- ruby/tests/basic_proto2.rb \
- ruby/tests/basic_test_proto2.proto \
- ruby/tests/basic_test.proto \
- ruby/tests/basic.rb \
- ruby/tests/common_tests.rb \
- ruby/tests/encode_decode_test.rb \
- ruby/tests/gc_test.rb \
- ruby/tests/repeated_field_test.rb \
- ruby/tests/stress.rb \
- ruby/tests/generated_code_proto2_test.rb \
- ruby/tests/generated_code_proto2.proto \
- ruby/tests/generated_code.proto \
- ruby/tests/multi_level_nesting_test.proto \
- ruby/tests/multi_level_nesting_test.rb \
- ruby/tests/test_import_proto2.proto \
- ruby/tests/test_import.proto \
- ruby/tests/test_ruby_package_proto2.proto \
- ruby/tests/test_ruby_package.proto \
- ruby/tests/generated_code_test.rb \
- ruby/tests/well_known_types_test.rb \
- ruby/tests/type_errors.rb \
- ruby/travis-test.sh
-
-all_EXTRA_DIST=$(csharp_EXTRA_DIST) $(java_EXTRA_DIST) $(objectivec_EXTRA_DIST) $(php_EXTRA_DIST) $(python_EXTRA_DIST) $(ruby_EXTRA_DIST)
-
-# Note: please keep this in sync with the common_dist_files rule in BUILD.bazel.
-EXTRA_DIST = $(@DIST_LANG@_EXTRA_DIST) \
- autogen.sh \
- generate_descriptor_proto.sh \
- README.md \
- LICENSE \
- CONTRIBUTORS.txt \
- CHANGES.txt \
- update_file_lists.sh \
- BUILD.bazel \
- WORKSPACE \
- CMakeLists.txt \
- build_defs/BUILD.bazel \
- build_defs/cc_proto_blacklist_test.bzl \
- build_defs/compiler_config_setting.bzl \
- build_defs/cpp_opts.bzl \
- build_files_updated_unittest.sh \
- cmake/CMakeLists.txt \
- cmake/README.md \
- cmake/conformance.cmake \
- cmake/examples.cmake \
- cmake/extract_includes.bat.in \
- cmake/install.cmake \
- cmake/libprotobuf-lite.cmake \
- cmake/libprotobuf.cmake \
- cmake/libprotoc.cmake \
- cmake/protobuf-config-version.cmake.in \
- cmake/protobuf-config.cmake.in \
- cmake/protobuf-lite.pc.cmake \
- cmake/protobuf-module.cmake.in \
- cmake/protobuf-options.cmake \
- cmake/protobuf.pc.cmake \
- cmake/protoc.cmake \
- cmake/tests.cmake \
- cmake/version.rc.in \
- csharp/BUILD.bazel \
- editors/README.txt \
- editors/proto.vim \
- editors/protobuf-mode.el \
- examples/AddPerson.java \
- examples/BUILD.bazel \
- examples/CMakeLists.txt \
- examples/ListPeople.java \
- examples/Makefile \
- examples/README.md \
- examples/WORKSPACE \
- examples/add_person.cc \
- examples/add_person.dart \
- examples/add_person.py \
- examples/addressbook.proto \
- examples/go/cmd/add_person/add_person.go \
- examples/go/cmd/add_person/add_person_test.go \
- examples/go/cmd/list_people/list_people.go \
- examples/go/cmd/list_people/list_people_test.go \
- examples/go/go.sum \
- examples/go/go.mod \
- examples/list_people.cc \
- examples/list_people.dart \
- examples/list_people.py \
- examples/pubspec.yaml \
- conformance/BUILD.bazel \
- conformance/defs.bzl \
- maven_install.json \
- php/BUILD.bazel \
- protobuf.bzl \
- protobuf_deps.bzl \
- protobuf_release.bzl \
- protobuf_version.bzl \
- ruby/BUILD.bazel \
- third_party/zlib.BUILD \
- util/python/BUILD.bazel
-
-# Deletes all the files generated by autogen.sh.
-MAINTAINERCLEANFILES = \
- aclocal.m4 \
- ar-lib \
- config.guess \
- config.sub \
- configure \
- depcomp \
- install-sh \
- ltmain.sh \
- Makefile.in \
- missing \
- mkinstalldirs \
- config.h.in \
- stamp.h.in \
- m4/ltsugar.m4 \
- m4/libtool.m4 \
- m4/ltversion.m4 \
- m4/lt~obsolete.m4 \
- m4/ltoptions.m4
diff --git a/Protobuf.podspec b/Protobuf.podspec
index 627430d..d60e531 100644
--- a/Protobuf.podspec
+++ b/Protobuf.podspec
@@ -34,10 +34,10 @@
s.user_target_xcconfig = { 'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited) GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1' }
s.pod_target_xcconfig = { 'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited) GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1' }
- s.ios.deployment_target = '9.0'
- s.osx.deployment_target = '10.9'
- s.tvos.deployment_target = '9.0'
- s.watchos.deployment_target = '2.0'
+ s.ios.deployment_target = '10.0'
+ s.osx.deployment_target = '10.12'
+ s.tvos.deployment_target = '12.0'
+ s.watchos.deployment_target = '6.0'
s.requires_arc = false
# The unittest need the generate sources from the testing related .proto
diff --git a/README.md b/README.md
index c2e6575..3377f3a 100644
--- a/README.md
+++ b/README.md
@@ -42,8 +42,7 @@
or you are using C++, it's recommended to build your own protoc binary from
source.
-If you would like to build protoc binary from source, see the [C++ Installation
-Instructions](src/README.md).
+If you would like to build protoc binary from source, see the [C++ Installation Instructions](src/README.md).
Protobuf Runtime Installation
-----------------------------
@@ -63,6 +62,7 @@
| Go | [protocolbuffers/protobuf-go](https://github.com/protocolbuffers/protobuf-go)|
| PHP | [php](php) |
| Dart | [dart-lang/protobuf](https://github.com/dart-lang/protobuf) |
+| Javascript | [protocolbuffers/protobuf-javascript](https://github.com/protocolbuffers/protobuf-javascript)|
Quick Start
-----------
@@ -82,3 +82,10 @@
web at:
https://developers.google.com/protocol-buffers/
+
+Developer Community
+-------------------
+
+To be alerted to upcoming changes in Protocol Buffers and connect with protobuf developers and users,
+[join the Google Group](https://groups.google.com/g/protobuf).
+
diff --git a/WORKSPACE b/WORKSPACE
index d01122a..13c2bb0 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -9,32 +9,25 @@
http_archive(
name = "com_google_googletest",
- sha256 = "9dc9157a9a1551ec7a7e43daea9a694a0bb5fb8bec81235d8a1e6ef64c716dcb",
- strip_prefix = "googletest-release-1.10.0",
+ sha256 = "ea54c9845568cb31c03f2eddc7a40f7f83912d04ab977ff50ec33278119548dd",
+ strip_prefix = "googletest-4c9a3bb62bf3ba1f1010bf96f9c8ed767b363774",
urls = [
- "https://mirror.bazel.build/github.com/google/googletest/archive/release-1.10.0.tar.gz",
- "https://github.com/google/googletest/archive/release-1.10.0.tar.gz",
+ "https://github.com/google/googletest/archive/4c9a3bb62bf3ba1f1010bf96f9c8ed767b363774.tar.gz",
],
)
+# Bazel platform rules.
http_archive(
- name = "com_github_google_benchmark",
- sha256 = "2a778d821997df7d8646c9c59b8edb9a573a6e04c534c01892a40aa524a7b68c",
- strip_prefix = "benchmark-bf585a2789e30585b4e3ce6baf11ef2750b54677",
- urls = [
- "https://github.com/google/benchmark/archive/bf585a2789e30585b4e3ce6baf11ef2750b54677.zip",
- ],
+ name = "platforms",
+ sha256 = "a879ea428c6d56ab0ec18224f976515948822451473a80d06c2e50af0bbe5121",
+ strip_prefix = "platforms-da5541f26b7de1dc8e04c075c99df5351742a4a2",
+ urls = ["https://github.com/bazelbuild/platforms/archive/da5541f26b7de1dc8e04c075c99df5351742a4a2.zip"], # 2022-05-27
)
# Load common dependencies.
load("//:protobuf_deps.bzl", "PROTOBUF_MAVEN_ARTIFACTS", "protobuf_deps")
protobuf_deps()
-bind(
- name = "python_headers",
- actual = "//util/python:python_headers",
-)
-
load("@rules_jvm_external//:defs.bzl", "maven_install")
maven_install(
@@ -69,3 +62,11 @@
load("@upb//bazel:workspace_deps.bzl", "upb_deps")
upb_deps()
+
+load("@upb//bazel:system_python.bzl", "system_python")
+system_python(name = "local_config_python")
+
+bind(
+ name = "python_headers",
+ actual = "@local_config_python//:python_headers",
+)
diff --git a/appveyor.yml b/appveyor.yml
index 91f737a..1e2834b 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -3,16 +3,16 @@
environment:
matrix:
- # Only test few combinations: "Visual Studio 2015 (14) + Win64/MinGW + Debug + DLL". We can
+ # Only test few combinations: "Visual Studio 2017 (15) + Win64/MinGW + Debug + DLL". We can
# test more combinations but AppVeyor just takes too long to finish (each
# combination takes ~15mins).
- platform: MinGW
language: cpp
- image: Visual Studio 2015
+ image: Visual Studio 2017
- platform: Win64
language: cpp
- image: Visual Studio 2015
+ image: Visual Studio 2017
BUILD_DLL: ON
UNICODE: ON
@@ -35,8 +35,8 @@
before_build:
- if %platform%==MinGW set generator=MinGW Makefiles
- - if %platform%==Win32 set generator=Visual Studio 14
- - if %platform%==Win64 set generator=Visual Studio 14 Win64
+ - if %platform%==Win32 set generator=Visual Studio 15
+ - if %platform%==Win64 set generator=Visual Studio 15 Win64
- if %platform%==Win32 set vcplatform=Win32
- if %platform%==Win64 set vcplatform=x64
diff --git a/autogen.sh b/autogen.sh
deleted file mode 100755
index 105bf09..0000000
--- a/autogen.sh
+++ /dev/null
@@ -1,44 +0,0 @@
-#!/bin/sh
-
-# Run this script to generate the configure script and other files that will
-# be included in the distribution. These files are not checked in because they
-# are automatically generated.
-
-set -e
-
-if [ ! -z "$@" ]; then
- for argument in "$@"; do
- case $argument in
- # make curl silent
- "-s")
- curlopts="-s"
- ;;
- esac
- done
-fi
-
-# Check that we're being run from the right directory.
-if test ! -f src/google/protobuf/stubs/common.h; then
- cat >&2 << __EOF__
-Could not find source code. Make sure you are running this script from the
-root of the distribution tree.
-__EOF__
- exit 1
-fi
-
-set -ex
-
-# The absence of a m4 directory in googletest causes autoreconf to fail when
-# building under the CentOS docker image. It's a warning in regular build on
-# Ubuntu/gLinux as well. (This is only needed if git submodules have been
-# initialized, which is typically only needed for testing; see the installation
-# instructions for details.)
-if test -d third_party/googletest; then
- mkdir -p third_party/googletest/m4
-fi
-
-# TODO(kenton): Remove the ",no-obsolete" part and fix the resulting warnings.
-autoreconf -f -i -Wall,no-obsolete
-
-rm -rf autom4te.cache config.h.in~
-exit 0
diff --git a/benchmarks/BUILD.bazel b/benchmarks/BUILD.bazel
deleted file mode 100644
index 36f6283..0000000
--- a/benchmarks/BUILD.bazel
+++ /dev/null
@@ -1,98 +0,0 @@
-load("@rules_cc//cc:defs.bzl", "cc_proto_library")
-load("@rules_java//java:defs.bzl", "java_proto_library")
-load("@rules_pkg//:mappings.bzl", "pkg_filegroup", "pkg_files", "strip_prefix")
-load("@rules_proto//proto:defs.bzl", "proto_library")
-
-proto_library(
- name = "benchmarks_proto",
- srcs = [
- "benchmarks.proto",
- ],
- strip_import_prefix = "/benchmarks",
- visibility = [
- "//benchmarks:__subpackages__",
- ],
-)
-
-cc_proto_library(
- name = "benchmarks_cc_proto",
- visibility = [
- "//benchmarks:__subpackages__",
- ],
- deps = [
- "benchmarks_proto",
- ],
-)
-
-java_proto_library(
- name = "benchmarks_java_proto",
- visibility = [
- "//benchmarks:__subpackages__",
- ],
- deps = [
- "benchmarks_proto",
- ],
-)
-
-proto_library(
- name = "google_size_proto",
- srcs = [
- "google_size.proto",
- ],
- strip_import_prefix = "/benchmarks",
- visibility = [
- "//benchmarks:__subpackages__",
- ],
-)
-
-cc_proto_library(
- name = "google_size_cc_proto",
- visibility = [
- "//benchmarks:__subpackages__",
- ],
- deps = [
- "google_size_proto",
- ],
-)
-
-java_proto_library(
- name = "google_size_java_proto",
- visibility = [
- "//benchmarks:__subpackages__",
- ],
- deps = [
- "google_size_proto",
- ],
-)
-
-pkg_files(
- name = "dist_files",
- srcs = glob(
- [
- "*",
- "python/*.cc",
- "util/*.cc",
- ],
- exclude = [
- "__init__.py", # not in autotools dist
- "go/*",
- ],
- ),
- strip_prefix = strip_prefix.from_root(""),
-)
-
-# Convenience filegroup for all files that should be packaged.
-pkg_filegroup(
- name = "all_dist_files",
- srcs = [
- ":dist_files",
- "//benchmarks/cpp:dist_files",
- # "//benchmarks/datasets:dist_files", # not in autotools dist
- "//benchmarks/datasets/google_message1/proto2:dist_files",
- "//benchmarks/datasets/google_message1/proto3:dist_files",
- "//benchmarks/datasets/google_message2:dist_files",
- "//benchmarks/datasets/google_message3:dist_files",
- "//benchmarks/datasets/google_message4:dist_files",
- ],
- visibility = ["//pkg:__pkg__"],
-)
diff --git a/benchmarks/Makefile.am b/benchmarks/Makefile.am
deleted file mode 100644
index ed57978..0000000
--- a/benchmarks/Makefile.am
+++ /dev/null
@@ -1,664 +0,0 @@
-benchmarks_protoc_inputs_benchmark_wrapper = \
- benchmarks.proto
-
-benchmarks_protoc_inputs = \
- datasets/google_message1/proto3/benchmark_message1_proto3.proto
-
-benchmarks_protoc_inputs_proto2 = \
- datasets/google_message1/proto2/benchmark_message1_proto2.proto \
- datasets/google_message2/benchmark_message2.proto \
- datasets/google_message3/benchmark_message3.proto \
- datasets/google_message3/benchmark_message3_1.proto \
- datasets/google_message3/benchmark_message3_2.proto \
- datasets/google_message3/benchmark_message3_3.proto \
- datasets/google_message3/benchmark_message3_4.proto \
- datasets/google_message3/benchmark_message3_5.proto \
- datasets/google_message3/benchmark_message3_6.proto \
- datasets/google_message3/benchmark_message3_7.proto \
- datasets/google_message3/benchmark_message3_8.proto \
- datasets/google_message4/benchmark_message4.proto \
- datasets/google_message4/benchmark_message4_1.proto \
- datasets/google_message4/benchmark_message4_2.proto \
- datasets/google_message4/benchmark_message4_3.proto
-
-make_tmp_dir:
- mkdir -p 'tmp/java/src/main/java'
- touch make_tmp_dir
-
-
-# We have to cd to $(srcdir) before executing protoc because $(protoc_inputs) is
-# relative to srcdir, which may not be the same as the current directory when
-# building out-of-tree.
-protoc_middleman: make_tmp_dir $(top_srcdir)/src/protoc$(EXEEXT) $(benchmarks_protoc_inputs) $(well_known_type_protoc_inputs) $(benchmarks_protoc_inputs_benchmark_wrapper)
- oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --cpp_out=$$oldpwd/cpp --java_out=$$oldpwd/tmp/java/src/main/java --python_out=$$oldpwd/tmp $(benchmarks_protoc_inputs) $(benchmarks_protoc_inputs_benchmark_wrapper) )
- touch protoc_middleman
-
-protoc_middleman2: make_tmp_dir $(top_srcdir)/src/protoc$(EXEEXT) $(benchmarks_protoc_inputs_proto2) $(well_known_type_protoc_inputs)
- oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --cpp_out=$$oldpwd/cpp --java_out=$$oldpwd/tmp/java/src/main/java --python_out=$$oldpwd/tmp $(benchmarks_protoc_inputs_proto2) )
- touch protoc_middleman2
-
-all_data = $$(find $$(cd $(srcdir) && pwd) -type f -name "dataset.*.pb" -not -path "$$(cd $(srcdir) && pwd)/tmp/*")
-
-############# CPP RULES ##############
-
-benchmarks_protoc_outputs = \
- cpp/benchmarks.pb.cc \
- cpp/datasets/google_message1/proto3/benchmark_message1_proto3.pb.cc
-
-benchmarks_protoc_outputs_header = \
- cpp/benchmarks.pb.h \
- cpp/datasets/google_message1/proto3/benchmark_message1_proto3.pb.h
-
-benchmarks_protoc_outputs_proto2_header = \
- cpp/datasets/google_message1/proto2/benchmark_message1_proto2.pb.h \
- cpp/datasets/google_message2/benchmark_message2.pb.h \
- cpp/datasets/google_message3/benchmark_message3.pb.h \
- cpp/datasets/google_message3/benchmark_message3_1.pb.h \
- cpp/datasets/google_message3/benchmark_message3_2.pb.h \
- cpp/datasets/google_message3/benchmark_message3_3.pb.h \
- cpp/datasets/google_message3/benchmark_message3_4.pb.h \
- cpp/datasets/google_message3/benchmark_message3_5.pb.h \
- cpp/datasets/google_message3/benchmark_message3_6.pb.h \
- cpp/datasets/google_message3/benchmark_message3_7.pb.h \
- cpp/datasets/google_message3/benchmark_message3_8.pb.h \
- cpp/datasets/google_message4/benchmark_message4.pb.h \
- cpp/datasets/google_message4/benchmark_message4_1.pb.h \
- cpp/datasets/google_message4/benchmark_message4_2.pb.h \
- cpp/datasets/google_message4/benchmark_message4_3.pb.h
-
-benchmarks_protoc_outputs_proto2 = \
- cpp/datasets/google_message1/proto2/benchmark_message1_proto2.pb.cc \
- cpp/datasets/google_message2/benchmark_message2.pb.cc \
- cpp/datasets/google_message3/benchmark_message3.pb.cc \
- cpp/datasets/google_message3/benchmark_message3_1.pb.cc \
- cpp/datasets/google_message3/benchmark_message3_2.pb.cc \
- cpp/datasets/google_message3/benchmark_message3_3.pb.cc \
- cpp/datasets/google_message3/benchmark_message3_4.pb.cc \
- cpp/datasets/google_message3/benchmark_message3_5.pb.cc \
- cpp/datasets/google_message3/benchmark_message3_6.pb.cc \
- cpp/datasets/google_message3/benchmark_message3_7.pb.cc \
- cpp/datasets/google_message3/benchmark_message3_8.pb.cc \
- cpp/datasets/google_message4/benchmark_message4.pb.cc \
- cpp/datasets/google_message4/benchmark_message4_1.pb.cc \
- cpp/datasets/google_message4/benchmark_message4_2.pb.cc \
- cpp/datasets/google_message4/benchmark_message4_3.pb.cc
-
-
-$(benchmarks_protoc_outputs): protoc_middleman
-$(benchmarks_protoc_outputs_header): protoc_middleman
-$(benchmarks_protoc_outputs_proto2): protoc_middleman2
-$(benchmarks_protoc_outputs_proto2_header): protoc_middleman2
-
-initialize_submodule:
- oldpwd=`pwd`
- cd $(top_srcdir) && git submodule update --init -r third_party/benchmark && cd third_party/benchmark \
- && cmake -DCMAKE_BUILD_TYPE=Release && make
- cd $$oldpwd
- touch initialize_submodule
-
-$(top_srcdir)/third_party/benchmark/src/libbenchmark.a: initialize_submodule
-
-AM_CXXFLAGS = $(NO_OPT_CXXFLAGS) $(PROTOBUF_OPT_FLAG) -Wall -Wwrite-strings -Woverloaded-virtual -Wno-sign-compare
-
-bin_PROGRAMS = cpp-benchmark
-
-cpp_benchmark_LDADD = $(top_srcdir)/src/libprotobuf.la $(top_srcdir)/third_party/benchmark/src/libbenchmark.a
-cpp_benchmark_SOURCES = cpp/cpp_benchmark.cc
-cpp_benchmark_CPPFLAGS = -I$(top_srcdir)/src -I$(srcdir)/cpp -I$(top_srcdir)/third_party/benchmark/include
-# Explicit deps because BUILT_SOURCES are only done before a "make all/check"
-# so a direct "make test_cpp" could fail if parallel enough.
-# See: https://www.gnu.org/software/automake/manual/html_node/Built-Sources-Example.html#Recording-Dependencies-manually
-cpp/cpp_benchmark-cpp_benchmark.$(OBJEXT): $(benchmarks_protoc_outputs) $(benchmarks_protoc_outputs_proto2) $(benchmarks_protoc_outputs_header) $(benchmarks_protoc_outputs_proto2_header) $(top_srcdir)/src/libprotobuf.la $(top_srcdir)/third_party/benchmark/src/libbenchmark.a
-cpp/benchmark-cpp_benchmark.$(OBJEXT): $(benchmarks_protoc_outputs) $(benchmarks_protoc_outputs_proto2) $(benchmarks_protoc_outputs_header) $(benchmarks_protoc_outputs_proto2_header) $(top_srcdir)/src/libprotobuf.la $(top_srcdir)/third_party/benchmark/src/libbenchmark.a
-nodist_cpp_benchmark_SOURCES = \
- $(benchmarks_protoc_outputs) \
- $(benchmarks_protoc_outputs_proto2) \
- $(benchmarks_protoc_outputs_proto2_header) \
- $(benchmarks_protoc_outputs_header)
-
-cpp: protoc_middleman protoc_middleman2 cpp-benchmark initialize_submodule
- ./cpp-benchmark $(all_data)
-
-############ CPP RULES END ############
-
-############# JAVA RULES ##############
-
-java_benchmark_testing_files = \
- java/src/main/java/com/google/protobuf/ProtoCaliperBenchmark.java
-
-javac_middleman: $(java_benchmark_testing_files) protoc_middleman protoc_middleman2
- cp -r $(srcdir)/java tmp
- mkdir -p tmp/java/lib
- cp $(top_srcdir)/java/core/target/*.jar tmp/java/lib/protobuf-java.jar
- cd tmp/java && mvn clean compile assembly:single -Dprotobuf.version=$(PACKAGE_VERSION) && cd ../..
- @touch javac_middleman
-
-java-benchmark: javac_middleman
- @echo "Writing shortcut script java-benchmark..."
- @echo '#! /bin/bash' > java-benchmark
- @echo 'all_data=""' >> java-benchmark
- @echo 'conf=()' >> java-benchmark
- @echo 'data_files=""' >> java-benchmark
- @echo 'for arg in $$@; do if [[ $${arg:0:1} == "-" ]]; then conf+=($$arg); else data_files+="$$arg,"; fi; done' >> java-benchmark
- @echo 'java -cp '\"tmp/java/target/*:$(top_srcdir)/java/core/target/*:$(top_srcdir)/java/util/target/*\"" \\" >>java-benchmark
- @echo ' com.google.caliper.runner.CaliperMain com.google.protobuf.ProtoCaliperBenchmark -i runtime '"\\" >> java-benchmark
- @echo ' -b serializeToByteArray,serializeToMemoryStream,deserializeFromByteArray,deserializeFromMemoryStream '"\\" >> java-benchmark
- @echo ' -DdataFile=$${data_files:0:-1} $${conf[*]}' >> java-benchmark
- @chmod +x java-benchmark
-
-java: protoc_middleman protoc_middleman2 java-benchmark
- ./java-benchmark $(all_data)
-
-############# JAVA RULES END ##############
-
-
-############# PYTHON RULES ##############
-
-python_add_init: protoc_middleman protoc_middleman2
- all_file=`find tmp -type f -regex '.*\.py'` && \
- for file in $${all_file[@]}; do \
- path="$${file%/*}"; \
- while true; do \
- touch "$$path/__init__.py" && chmod +x "$$path/__init__.py"; \
- if [[ $$path != *"/"* ]]; then break; fi; \
- path=$${path%/*}; \
- done \
- done
-
-python_cpp_pkg_flags = `pkg-config --cflags --libs python3`
-
-lib_LTLIBRARIES = libbenchmark_messages.la
-libbenchmark_messages_la_SOURCES = python/python_benchmark_messages.cc
-libbenchmark_messages_la_LIBADD = $(top_srcdir)/src/.libs/libprotobuf.la
-libbenchmark_messages_la_LDFLAGS = -version-info 1:0:0 -export-dynamic
-libbenchmark_messages_la_CPPFLAGS = -I$(top_srcdir)/src -I$(srcdir)/cpp $(python_cpp_pkg_flags)
-libbenchmark_messages_la-python_benchmark_messages.$(OBJEXT): $(benchmarks_protoc_outputs_header) $(benchmarks_protoc_outputs_proto2_header) $(benchmarks_protoc_outputs) $(benchmarks_protoc_outputs_proto2)
-nodist_libbenchmark_messages_la_SOURCES = \
- $(benchmarks_protoc_outputs) \
- $(benchmarks_protoc_outputs_proto2) \
- $(benchmarks_protoc_outputs_proto2_header) \
- $(benchmarks_protoc_outputs_header)
-
-python-pure-python-benchmark: python_add_init
- @echo "Writing shortcut script python-pure-python-benchmark..."
- @echo '#! /bin/bash' > python-pure-python-benchmark
- @echo export LD_LIBRARY_PATH=$(top_srcdir)/src/.libs >> python-pure-python-benchmark
- @echo export DYLD_LIBRARY_PATH=$(top_srcdir)/src/.libs >> python-pure-python-benchmark
- @echo export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=\'python\' >> python-pure-python-benchmark
- @echo cp $(srcdir)/python/py_benchmark.py tmp >> python-pure-python-benchmark
- @echo python3 tmp/py_benchmark.py '$$@' >> python-pure-python-benchmark
- @chmod +x python-pure-python-benchmark
-
-python-cpp-reflection-benchmark: python_add_init
- @echo "Writing shortcut script python-cpp-reflection-benchmark..."
- @echo '#! /bin/bash' > python-cpp-reflection-benchmark
- @echo export LD_LIBRARY_PATH=$(top_srcdir)/src/.libs >> python-cpp-reflection-benchmark
- @echo export DYLD_LIBRARY_PATH=$(top_srcdir)/src/.libs >> python-cpp-reflection-benchmark
- @echo export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=\'cpp\' >> python-cpp-reflection-benchmark
- @echo cp $(srcdir)/python/py_benchmark.py tmp >> python-cpp-reflection-benchmark
- @echo python3 tmp/py_benchmark.py '$$@' >> python-cpp-reflection-benchmark
- @chmod +x python-cpp-reflection-benchmark
-
-python-cpp-generated-code-benchmark: python_add_init libbenchmark_messages.la
- @echo "Writing shortcut script python-cpp-generated-code-benchmark..."
- @echo '#! /bin/bash' > python-cpp-generated-code-benchmark
- @echo export LD_LIBRARY_PATH=$(top_srcdir)/src/.libs >> python-cpp-generated-code-benchmark
- @echo export DYLD_LIBRARY_PATH=$(top_srcdir)/src/.libs >> python-cpp-generated-code-benchmark
- @echo export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=\'cpp\' >> python-cpp-generated-code-benchmark
- @echo cp $(srcdir)/python/py_benchmark.py tmp >> python-cpp-generated-code-benchmark
- @echo python3 tmp/py_benchmark.py --cpp_generated '$$@' >> python-cpp-generated-code-benchmark
- @chmod +x python-cpp-generated-code-benchmark
-
-python-pure-python: python-pure-python-benchmark
- ./python-pure-python-benchmark $(all_data)
-
-python-cpp-reflection: python-cpp-reflection-benchmark
- ./python-cpp-reflection-benchmark $(all_data)
-
-python-cpp-generated-code: python-cpp-generated-code-benchmark
- ./python-cpp-generated-code-benchmark $(all_data)
-
-############# PYTHON RULES END ##############
-
-############# GO RULES BEGIN ##############
-
-benchmarks_protoc_inputs_proto2_message1 = \
- datasets/google_message1/proto2/benchmark_message1_proto2.proto
-
-benchmarks_protoc_inputs_proto2_message2 = \
- datasets/google_message2/benchmark_message2.proto
-
-benchmarks_protoc_inputs_proto2_message3 = \
- datasets/google_message3/benchmark_message3.proto \
- datasets/google_message3/benchmark_message3_1.proto \
- datasets/google_message3/benchmark_message3_2.proto \
- datasets/google_message3/benchmark_message3_3.proto \
- datasets/google_message3/benchmark_message3_4.proto \
- datasets/google_message3/benchmark_message3_5.proto \
- datasets/google_message3/benchmark_message3_6.proto \
- datasets/google_message3/benchmark_message3_7.proto \
- datasets/google_message3/benchmark_message3_8.proto
-
-benchmarks_protoc_inputs_proto2_message4 = \
- datasets/google_message4/benchmark_message4.proto \
- datasets/google_message4/benchmark_message4_1.proto \
- datasets/google_message4/benchmark_message4_2.proto \
- datasets/google_message4/benchmark_message4_3.proto
-
-go_protoc_middleman: make_tmp_dir $(top_srcdir)/src/protoc$(EXEEXT) $(benchmarks_protoc_inputs) $(well_known_type_protoc_inputs) $(benchmarks_protoc_inputs_proto2_message1) $(benchmarks_protoc_inputs_proto2_message2) $(benchmarks_protoc_inputs_proto2_message3) $(benchmarks_protoc_inputs_proto2_message4) $(well_known_type_protoc_inputs)
- oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --go_out=$$oldpwd/tmp $(benchmarks_protoc_inputs) )
- oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --go_out=$$oldpwd/tmp $(benchmarks_protoc_inputs_benchmark_wrapper) )
- oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --go_out=$$oldpwd/tmp $(benchmarks_protoc_inputs_proto2_message1) )
- oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --go_out=$$oldpwd/tmp $(benchmarks_protoc_inputs_proto2_message2) )
- oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --go_out=$$oldpwd/tmp $(benchmarks_protoc_inputs_proto2_message3) )
- oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --go_out=$$oldpwd/tmp $(benchmarks_protoc_inputs_proto2_message4) )
- touch go_protoc_middleman
-
-go-benchmark: go_protoc_middleman
- @echo "Writing shortcut script go-benchmark..."
- @echo '#! /bin/bash' > go-benchmark
- @echo 'cd $(srcdir)/go' >> go-benchmark
- @echo 'all_data=""' >> go-benchmark
- @echo 'conf=()' >> go-benchmark
- @echo 'data_files=()' >> go-benchmark
- @echo 'for arg in $$@; do if [[ $${arg:0:1} == "-" ]]; then conf+=($$arg); else data_files+=("$$arg"); fi; done' >> go-benchmark
- @echo 'go test -bench=. $${conf[*]} -- $${data_files[*]}' >> go-benchmark
- @echo 'cd ..' >> go-benchmark
- @chmod +x go-benchmark
-
-go: go_protoc_middleman go-benchmark
- ./go-benchmark $(all_data)
-
-############# GO RULES END ##############
-
-############# GOGO RULES BEGIN ############
-
-cpp_no_group_benchmarks_protoc_outputs_header = \
- gogo/cpp_no_group/benchmarks.pb.h \
- gogo/cpp_no_group/datasets/google_message1/proto3/benchmark_message1_proto3.pb.h
-
-cpp_no_group_benchmarks_protoc_outputs = \
- gogo/cpp_no_group/benchmarks.pb.cc \
- gogo/cpp_no_group/datasets/google_message1/proto3/benchmark_message1_proto3.pb.cc
-
-cpp_no_group_benchmarks_protoc_outputs_proto2_header = \
- gogo/cpp_no_group/datasets/google_message1/proto2/benchmark_message1_proto2.pb.h \
- gogo/cpp_no_group/datasets/google_message2/benchmark_message2.pb.h \
- gogo/cpp_no_group/datasets/google_message3/benchmark_message3.pb.h \
- gogo/cpp_no_group/datasets/google_message3/benchmark_message3_1.pb.h \
- gogo/cpp_no_group/datasets/google_message3/benchmark_message3_2.pb.h \
- gogo/cpp_no_group/datasets/google_message3/benchmark_message3_3.pb.h \
- gogo/cpp_no_group/datasets/google_message3/benchmark_message3_4.pb.h \
- gogo/cpp_no_group/datasets/google_message3/benchmark_message3_5.pb.h \
- gogo/cpp_no_group/datasets/google_message3/benchmark_message3_6.pb.h \
- gogo/cpp_no_group/datasets/google_message3/benchmark_message3_7.pb.h \
- gogo/cpp_no_group/datasets/google_message3/benchmark_message3_8.pb.h \
- gogo/cpp_no_group/datasets/google_message4/benchmark_message4.pb.h \
- gogo/cpp_no_group/datasets/google_message4/benchmark_message4_1.pb.h \
- gogo/cpp_no_group/datasets/google_message4/benchmark_message4_2.pb.h \
- gogo/cpp_no_group/datasets/google_message4/benchmark_message4_3.pb.h
-
-cpp_no_group_benchmarks_protoc_outputs_proto2 = \
- gogo/cpp_no_group/datasets/google_message1/proto2/benchmark_message1_proto2.pb.cc \
- gogo/cpp_no_group/datasets/google_message2/benchmark_message2.pb.cc \
- gogo/cpp_no_group/datasets/google_message3/benchmark_message3.pb.cc \
- gogo/cpp_no_group/datasets/google_message3/benchmark_message3_1.pb.cc \
- gogo/cpp_no_group/datasets/google_message3/benchmark_message3_2.pb.cc \
- gogo/cpp_no_group/datasets/google_message3/benchmark_message3_3.pb.cc \
- gogo/cpp_no_group/datasets/google_message3/benchmark_message3_4.pb.cc \
- gogo/cpp_no_group/datasets/google_message3/benchmark_message3_5.pb.cc \
- gogo/cpp_no_group/datasets/google_message3/benchmark_message3_6.pb.cc \
- gogo/cpp_no_group/datasets/google_message3/benchmark_message3_7.pb.cc \
- gogo/cpp_no_group/datasets/google_message3/benchmark_message3_8.pb.cc \
- gogo/cpp_no_group/datasets/google_message4/benchmark_message4.pb.cc \
- gogo/cpp_no_group/datasets/google_message4/benchmark_message4_1.pb.cc \
- gogo/cpp_no_group/datasets/google_message4/benchmark_message4_2.pb.cc \
- gogo/cpp_no_group/datasets/google_message4/benchmark_message4_3.pb.cc
-
-$(cpp_no_group_benchmarks_protoc_outputs): cpp_no_group_protoc_middleman
-$(cpp_no_group_benchmarks_protoc_outputs_header): cpp_no_group_protoc_middleman
-$(cpp_no_group_benchmarks_protoc_outputs_proto2): cpp_no_group_protoc_middleman
-$(cpp_no_group_benchmarks_protoc_outputs_proto2_header): cpp_no_group_protoc_middleman
-
-generate_cpp_no_group_benchmark_code:
- cp $(srcdir)/cpp/cpp_benchmark.cc gogo/cpp_no_group/cpp_benchmark.cc
- sed -i -e "s/\#include \"datasets/\#include \"gogo\/cpp_no_group\/datasets/g" gogo/cpp_no_group/cpp_benchmark.cc
- sed -i -e "s/\#include \"benchmarks.pb.h/\#include \"gogo\/cpp_no_group\/benchmarks.pb.h/g" gogo/cpp_no_group/cpp_benchmark.cc
- touch generate_cpp_no_group_benchmark_code
-
-bin_PROGRAMS += cpp-no-group-benchmark
-cpp_no_group_benchmark_LDADD = $(top_srcdir)/src/libprotobuf.la $(top_srcdir)/third_party/benchmark/src/libbenchmark.a
-cpp_no_group_benchmark_SOURCES = gogo/cpp_no_group/cpp_benchmark.cc
-cpp_no_group_benchmark_CPPFLAGS = -I$(top_srcdir)/src -I$(srcdir)/gogo/cpp_no_group -I$(top_srcdir)/third_party/benchmark/include
-# Explicit deps because BUILT_SOURCES are only done before a "make all/check"
-# so a direct "make test_cpp" could fail if parallel enough.
-# See: https://www.gnu.org/software/automake/manual/html_node/Built-Sources-Example.html#Recording-Dependencies-manually
-gogo/cpp_no_group/cpp_no_group_benchmark-cpp_benchmark.$(OBJEXT): $(cpp_no_group_benchmarks_protoc_outputs) $(cpp_no_group_benchmarks_protoc_outputs_proto2) $(cpp_no_group_benchmarks_protoc_outputs_header) \
- $(cpp_no_group_benchmarks_protoc_outputs_proto2_header) $(top_srcdir)/third_party/benchmark/src/libbenchmark.a generate_cpp_no_group_benchmark_code
-gogo/cpp_no_group/cpp_benchmark.cc: generate_cpp_no_group_benchmark_code
-nodist_cpp_no_group_benchmark_SOURCES = \
- $(cpp_no_group_benchmarks_protoc_outputs_proto2) \
- $(cpp_no_group_benchmarks_protoc_outputs) \
- $(cpp_no_group_benchmarks_protoc_outputs_header) \
- $(cpp_no_group_benchmarks_protoc_outputs_proto2_header)
-
-cpp_no_group: cpp_no_group_protoc_middleman generate_gogo_data cpp-no-group-benchmark
- ./cpp-no-group-benchmark $(gogo_data)
-
-gogo_proto_middleman: protoc-gen-gogoproto
- mkdir -p "tmp/gogo_proto"
- oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I$(srcdir) -I$(top_srcdir) --plugin=protoc-gen-gogoproto --gogoproto_out=$$oldpwd/tmp/gogo_proto $(benchmarks_protoc_inputs) $(benchmarks_protoc_inputs_benchmark_wrapper) $(benchmarks_protoc_inputs_proto2) )
- touch gogo_proto_middleman
-
-gogo_data = $$(for data in $(all_data); do echo "tmp/gogo_data$${data\#$(srcdir)}"; done | xargs)
-
-generate_gogo_data: protoc_middleman protoc_middleman2 gogo-data-scrubber
- mkdir -p `dirname $(gogo_data)`
- ./gogo-data-scrubber $(all_data) $(gogo_data)
- touch generate_gogo_data
-
-make_tmp_dir_gogo:
- mkdir -p tmp/go_no_group/benchmark_code
- mkdir -p tmp/gogofast/benchmark_code
- mkdir -p tmp/gogofaster/benchmark_code
- mkdir -p tmp/gogoslick/benchmark_code
- touch make_tmp_dir_gogo
-
-go_no_group_protoc_middleman: make_tmp_dir_gogo $(top_srcdir)/src/protoc$(EXEEXT) gogo_proto_middleman $(well_known_type_protoc_inputs)
- oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --go_out=$$oldpwd/tmp/go_no_group $(benchmarks_protoc_inputs) )
- oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --go_out=$$oldpwd/tmp/go_no_group $(benchmarks_protoc_inputs_benchmark_wrapper) )
- oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --go_out=$$oldpwd/tmp/go_no_group $(benchmarks_protoc_inputs_proto2_message1) )
- oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --go_out=$$oldpwd/tmp/go_no_group $(benchmarks_protoc_inputs_proto2_message2) )
- oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --go_out=$$oldpwd/tmp/go_no_group $(benchmarks_protoc_inputs_proto2_message3) )
- oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --go_out=$$oldpwd/tmp/go_no_group $(benchmarks_protoc_inputs_proto2_message4) )
- touch go_no_group_protoc_middleman
-
-cpp_no_group_protoc_middleman: make_tmp_dir_gogo $(top_srcdir)/src/protoc$(EXEEXT) gogo_proto_middleman $(well_known_type_protoc_inputs)
- oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --cpp_out=$$oldpwd/gogo/cpp_no_group $(benchmarks_protoc_inputs) )
- oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --cpp_out=$$oldpwd/gogo/cpp_no_group $(benchmarks_protoc_inputs_benchmark_wrapper) )
- oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --cpp_out=$$oldpwd/gogo/cpp_no_group $(benchmarks_protoc_inputs_proto2_message1) )
- oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --cpp_out=$$oldpwd/gogo/cpp_no_group $(benchmarks_protoc_inputs_proto2_message2) )
- oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --cpp_out=$$oldpwd/gogo/cpp_no_group $(benchmarks_protoc_inputs_proto2_message3) )
- oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --cpp_out=$$oldpwd/gogo/cpp_no_group $(benchmarks_protoc_inputs_proto2_message4) )
- touch cpp_no_group_protoc_middleman
-
-gogofast_protoc_middleman: make_tmp_dir_gogo $(top_srcdir)/src/protoc$(EXEEXT) gogo_proto_middleman $(well_known_type_protoc_inputs)
- oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogofast_out=$$oldpwd/tmp/gogofast $(benchmarks_protoc_inputs) )
- oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogofast_out=$$oldpwd/tmp/gogofast $(benchmarks_protoc_inputs_benchmark_wrapper) )
- oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogofast_out=$$oldpwd/tmp/gogofast $(benchmarks_protoc_inputs_proto2_message1) )
- oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogofast_out=$$oldpwd/tmp/gogofast $(benchmarks_protoc_inputs_proto2_message2) )
- oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogofast_out=$$oldpwd/tmp/gogofast $(benchmarks_protoc_inputs_proto2_message3) )
- oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogofast_out=$$oldpwd/tmp/gogofast $(benchmarks_protoc_inputs_proto2_message4) )
- touch gogofast_protoc_middleman
-
-gogofaster_protoc_middleman: make_tmp_dir_gogo $(top_srcdir)/src/protoc$(EXEEXT) gogo_proto_middleman $(well_known_type_protoc_inputs)
- oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogofaster_out=$$oldpwd/tmp/gogofaster $(benchmarks_protoc_inputs) )
- oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogofaster_out=$$oldpwd/tmp/gogofaster $(benchmarks_protoc_inputs_benchmark_wrapper) )
- oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogofaster_out=$$oldpwd/tmp/gogofaster $(benchmarks_protoc_inputs_proto2_message1) )
- oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogofaster_out=$$oldpwd/tmp/gogofaster $(benchmarks_protoc_inputs_proto2_message2) )
- oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogofaster_out=$$oldpwd/tmp/gogofaster $(benchmarks_protoc_inputs_proto2_message3) )
- oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogofaster_out=$$oldpwd/tmp/gogofaster $(benchmarks_protoc_inputs_proto2_message4) )
- touch gogofaster_protoc_middleman
-
-gogoslick_protoc_middleman: make_tmp_dir_gogo $(top_srcdir)/src/protoc$(EXEEXT) gogo_proto_middleman $(well_known_type_protoc_inputs)
- oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogoslick_out=$$oldpwd/tmp/gogoslick $(benchmarks_protoc_inputs) )
- oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogoslick_out=$$oldpwd/tmp/gogoslick $(benchmarks_protoc_inputs_benchmark_wrapper) )
- oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogoslick_out=$$oldpwd/tmp/gogoslick $(benchmarks_protoc_inputs_proto2_message1) )
- oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogoslick_out=$$oldpwd/tmp/gogoslick $(benchmarks_protoc_inputs_proto2_message2) )
- oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogoslick_out=$$oldpwd/tmp/gogoslick $(benchmarks_protoc_inputs_proto2_message3) )
- oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogoslick_out=$$oldpwd/tmp/gogoslick $(benchmarks_protoc_inputs_proto2_message4) )
- touch gogoslick_protoc_middleman
-
-generate-gogo-benchmark-code:
- @echo '#! /bin/bash' > generate-gogo-benchmark-code
- @echo 'cp $(srcdir)/go/go_benchmark_test.go tmp/$$1/benchmark_code/$$1_benchmark1_test.go' >> generate-gogo-benchmark-code
- @echo 'sed -i -e "s/\.\.\/tmp/../g" tmp/$$1/benchmark_code/$$1_benchmark1_test.go' >> generate-gogo-benchmark-code
- @echo 'sed -i -e "s/b\.Run(\"\(.*\)\"/b.Run(\"\1\_$$1\"/g" tmp/$$1/benchmark_code/$$1_benchmark1_test.go' >> generate-gogo-benchmark-code
- @echo 'if [[ $$2 == 1 ]]; then sed -i -e "s/github\.com\/golang/github.com\/gogo/g" tmp/$$1/benchmark_code/$$1_benchmark1_test.go; fi ' >> generate-gogo-benchmark-code
- @chmod +x generate-gogo-benchmark-code
-
-generate_all_gogo_benchmark_code: generate-gogo-benchmark-code make_tmp_dir_gogo
- ./generate-gogo-benchmark-code go_no_group 0
- ./generate-gogo-benchmark-code gogofast 1
- ./generate-gogo-benchmark-code gogofaster 1
- ./generate-gogo-benchmark-code gogoslick 1
-
-gogo-benchmark:
- @echo "Writing shortcut script gogo-benchmark..."
- @echo '#! /bin/bash' > gogo-benchmark
- @echo 'cd tmp/$$1/benchmark_code' >> gogo-benchmark
- @echo 'shift' >> gogo-benchmark
- @echo 'all_data=""' >> gogo-benchmark
- @echo 'for data_file in $$@; do all_data="$$all_data ../../../$$data_file"; done' >> gogo-benchmark
- @echo 'go test -bench=. -- $$all_data' >> gogo-benchmark
- @echo 'cd ../..' >> gogo-benchmark
- @chmod +x gogo-benchmark
-
-go_no_group: go_no_group_protoc_middleman generate_gogo_data generate_all_gogo_benchmark_code gogo-benchmark
- ./gogo-benchmark go_no_group $(gogo_data)
-
-gogofast: gogofast_protoc_middleman generate_gogo_data gogo-benchmark generate_all_gogo_benchmark_code
- ./gogo-benchmark gogofast $(gogo_data)
-
-gogofaster: gogofaster_protoc_middleman generate_gogo_data gogo-benchmark generate_all_gogo_benchmark_code
- ./gogo-benchmark gogofaster $(gogo_data)
-
-gogoslick: gogoslick_protoc_middleman generate_gogo_data gogo-benchmark generate_all_gogo_benchmark_code
- ./gogo-benchmark gogoslick $(gogo_data)
-
-
-############# GOGO RULES END ############
-
-
-############ UTIL RULES BEGIN ############
-
-bin_PROGRAMS += protoc-gen-gogoproto gogo-data-scrubber protoc-gen-proto2_to_proto3 proto3-data-stripper
-
-protoc_gen_gogoproto_LDADD = $(top_srcdir)/src/libprotobuf.la $(top_srcdir)/src/libprotoc.la
-protoc_gen_gogoproto_SOURCES = util/protoc-gen-gogoproto.cc
-protoc_gen_gogoproto_CPPFLAGS = -I$(top_srcdir)/src -I$(srcdir)/cpp -I$(srcdir)/util
-
-gogo_data_scrubber_LDADD = $(top_srcdir)/src/libprotobuf.la
-gogo_data_scrubber_SOURCES = util/gogo_data_scrubber.cc
-gogo_data_scrubber_CPPFLAGS = -I$(top_srcdir)/src -I$(srcdir)/cpp -I$(srcdir)/util
-util/gogo_data_scrubber-gogo_data_scrubber.$(OBJEXT): $(benchmarks_protoc_outputs) $(benchmarks_protoc_outputs_proto2) $(benchmarks_protoc_outputs_header) $(benchmarks_protoc_outputs_proto2_header)
-nodist_gogo_data_scrubber_SOURCES = \
- $(benchmarks_protoc_outputs) \
- $(benchmarks_protoc_outputs_proto2) \
- $(benchmarks_protoc_outputs_proto2_header) \
- $(benchmarks_protoc_outputs_header)
-
-protoc_gen_proto2_to_proto3_LDADD = $(top_srcdir)/src/libprotobuf.la $(top_srcdir)/src/libprotoc.la
-protoc_gen_proto2_to_proto3_SOURCES = util/protoc-gen-proto2_to_proto3.cc
-protoc_gen_proto2_to_proto3_CPPFLAGS = -I$(top_srcdir)/src -I$(srcdir)/cpp -I$(srcdir)/util
-
-proto3_data_stripper_LDADD = $(top_srcdir)/src/libprotobuf.la
-proto3_data_stripper_SOURCES = util/proto3_data_stripper.cc
-proto3_data_stripper_CPPFLAGS = -I$(top_srcdir)/src -I$(srcdir)/cpp -I$(srcdir)/util
-util/proto3_data_stripper-proto3_data_stripper.$(OBJEXT): $(benchmarks_protoc_outputs) $(benchmarks_protoc_outputs_proto2) $(benchmarks_protoc_outputs_header) $(benchmarks_protoc_outputs_proto2_header)
-nodist_proto3_data_stripper_SOURCES = \
- $(benchmarks_protoc_outputs) \
- $(benchmarks_protoc_outputs_proto2) \
- $(benchmarks_protoc_outputs_proto2_header) \
- $(benchmarks_protoc_outputs_header)
-
-
-############ UTIL RULES END ############
-
-############ PROTO3 PREPARATION BEGIN #############
-
-proto3_proto_middleman: protoc-gen-proto2_to_proto3
- mkdir -p "tmp/proto3_proto"
- oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I$(srcdir) -I$(top_srcdir) --plugin=protoc-gen-proto2_to_proto3 --proto2_to_proto3_out=$$oldpwd/tmp/proto3_proto $(benchmarks_protoc_inputs) $(benchmarks_protoc_inputs_benchmark_wrapper) $(benchmarks_protoc_inputs_proto2) )
- touch proto3_proto_middleman
-
-full_srcdir = $$(cd $(srcdir) && pwd)
-proto3_data = $$(for data in $(all_data); do echo $(full_srcdir)"/tmp/proto3_data$${data\#$(full_srcdir)}"; done | xargs)
-
-generate_proto3_data: protoc_middleman protoc_middleman2 proto3-data-stripper
- mkdir -p `dirname $(proto3_data)`
- ./proto3-data-stripper $(all_data) $(proto3_data)
- touch generate_proto3_data
-
-############ PROTO3 PREPARATION END #############
-
-############ PHP RULES BEGIN #################
-
-proto3_middleman_php: proto3_proto_middleman
- mkdir -p "tmp/php"
- oldpwd=`pwd` && ( cd tmp/proto3_proto && $$oldpwd/../src/protoc$(EXEEXT) -I$(srcdir) -I$(top_srcdir) --php_out=$$oldpwd/tmp/php $(benchmarks_protoc_inputs) $(benchmarks_protoc_inputs_benchmark_wrapper) $(benchmarks_protoc_inputs_proto2) )
- touch proto3_middleman_php
-
-php-benchmark: proto3_middleman_php generate_proto3_data
- mkdir -p "tmp/php/Google/Protobuf/Benchmark" && cp php/PhpBenchmark.php "tmp/php/Google/Protobuf/Benchmark"
- cp php/autoload.php "tmp/php"
- @echo "Writing shortcut script php-benchmark..."
- @echo '#! /bin/bash' > php-benchmark
- @echo 'export PROTOBUF_PHP_SRCDIR="$$(cd $(top_srcdir) && pwd)/php/src"' >> php-benchmark
- @echo 'cd tmp/php' >> php-benchmark
- @echo 'export CURRENT_DIR=$$(pwd)' >> php-benchmark
- @echo 'php -d auto_prepend_file="autoload.php" -d include_path="$$(pwd)" Google/Protobuf/Benchmark/PhpBenchmark.php $$@' >> php-benchmark
- @echo 'cd ../..' >> php-benchmark
- @chmod +x php-benchmark
-
-php: php-benchmark proto3_middleman_php
- ./php-benchmark --behavior_prefix="php" $(proto3_data)
-
-php_c_extension:
- cd $(top_srcdir)/php/ext/google/protobuf && phpize && ./configure CFLAGS='-O3' && make -j8
-
-php-c-benchmark: proto3_middleman_php generate_proto3_data php_c_extension php_c_extension
- mkdir -p "tmp/php/Google/Protobuf/Benchmark" && cp php/PhpBenchmark.php "tmp/php/Google/Protobuf/Benchmark"
- cp php/autoload.php "tmp/php"
- @echo "Writing shortcut script php-c-benchmark..."
- @echo '#! /bin/bash' > php-c-benchmark
- @echo 'export PROTOBUF_PHP_SRCDIR="$$(cd $(top_srcdir) && pwd)/php/src"' >> php-c-benchmark
- @echo 'export PROTOBUF_PHP_EXTDIR="$$PROTOBUF_PHP_SRCDIR/../ext/google/protobuf/modules"' >> php-c-benchmark
- @echo 'cd tmp/php' >> php-c-benchmark
- @echo 'export CURRENT_DIR=$$(pwd)' >> php-c-benchmark
- @echo 'php -d auto_prepend_file="autoload.php" -d include_path="$$(pwd)" -d extension="$$PROTOBUF_PHP_EXTDIR/protobuf.so" Google/Protobuf/Benchmark/PhpBenchmark.php $$@' >> php-c-benchmark
- @echo 'cd ../..' >> php-c-benchmark
- @chmod +x php-c-benchmark
-
-php_c: php-c-benchmark proto3_middleman_php
- ./php-c-benchmark --behavior_prefix="php_c" $(proto3_data)
-
-
-############ PHP RULES END #################
-
-############ protobuf.js RULE BEGIN #############
-
-pbjs_preparation:
- mkdir -p tmp/protobuf.js
- cd tmp/protobuf.js && git clone https://github.com/dcodeIO/protobuf.js.git && \
- cd protobuf.js && npm install && npm run build
- cd tmp/protobuf.js && npm install benchmark
- cp protobuf.js/* tmp/protobuf.js
- cp js/benchmark_suite.js tmp/protobuf.js
- touch pbjs_preparation
-
-pbjs_middleman: pbjs_preparation
- export OLDDIR=$$(pwd) && cd tmp/protobuf.js && node generate_pbjs_files.js --target static-module --include_path=$$OLDDIR -o generated_bundle_code.js $(benchmarks_protoc_inputs) $(benchmarks_protoc_inputs_benchmark_wrapper) $(benchmarks_protoc_inputs_proto2)
- touch pbjs_middleman
-
-pbjs-benchmark: pbjs_middleman
- @echo '#! /bin/bash' > pbjs-benchmark
- @echo 'cd tmp/protobuf.js' >> pbjs-benchmark
- @echo 'sed -i "s/protobufjs/.\/protobuf.js/g" generated_bundle_code.js' >> pbjs-benchmark
- @echo 'env NODE_PATH=".:./node_modules:$$NODE_PATH" node protobufjs_benchmark.js $$@' >> pbjs-benchmark
- @chmod +x pbjs-benchmark
-
-pbjs: pbjs-benchmark
- ./pbjs-benchmark $(all_data)
-
-############ protobuf.js RULE END #############
-
-############ JS RULE BEGIN #############
-
-js_preparation:
- mkdir -p tmp/js
- oldpwd=$$(pwd) && cd $(top_srcdir)/js && npm install && npm test
- cd tmp/js && npm install benchmark
- cp js/* tmp/js
- touch js_preparation
-
-js_middleman: js_preparation
- oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --js_out=import_style=commonjs,binary:$$oldpwd/tmp/js $(benchmarks_protoc_inputs) $(benchmarks_protoc_inputs_benchmark_wrapper) $(benchmarks_protoc_inputs_proto2))
- touch js_middleman
-
-js-benchmark: js_middleman
- @echo '#! /bin/bash' > js-benchmark
- @echo 'export TOP_JS_SRCDIR=$$(cd $(top_srcdir)/js && pwd)' >> js-benchmark
- @echo 'cd tmp/js' >> js-benchmark
- @echo 'env NODE_PATH="$$TOP_JS_SRCDIR:.:./node_modules:$$NODE_PATH" node --max-old-space-size=4096 js_benchmark.js $$@' >> js-benchmark
- @chmod +x js-benchmark
-
-js: js-benchmark
- ./js-benchmark $(all_data)
-
-############ JS RULE END #############
-
-EXTRA_DIST = \
- $(benchmarks_protoc_inputs_benchmark_wrapper) \
- $(benchmarks_protoc_inputs) \
- $(benchmarks_protoc_inputs_proto2) \
- google_size.proto
-
-MAINTAINERCLEANFILES = \
- Makefile.in
-
-CLEANFILES = \
- $(benchmarks_protoc_outputs) \
- $(benchmarks_protoc_outputs_header) \
- $(benchmarks_protoc_outputs_proto2) \
- $(benchmarks_protoc_outputs_proto2_header) \
- initialize_submodule \
- make_tmp_dir \
- protoc_middleman \
- protoc_middleman2 \
- javac_middleman \
- java-benchmark \
- python_cpp_proto_library \
- python-pure-python-benchmark \
- python-cpp-reflection-benchmark \
- python-cpp-generated-code-benchmark \
- go-benchmark \
- go_protoc_middleman \
- make_tmp_dir_gogo \
- gogo_proto_middleman \
- generate_gogo_data \
- go_no_group_protoc_middleman \
- go_no_group \
- go-no-group-benchmark \
- $(cpp_no_group_benchmarks_protoc_outputs_header) \
- $(cpp_no_group_benchmarks_protoc_outputs) \
- $(cpp_no_group_benchmarks_protoc_outputs_proto2_header) \
- $(cpp_no_group_benchmarks_protoc_outputs_proto2) \
- generate_all_gogo_benchmark_code \
- generate-gogo-benchmark-code \
- cpp_no_group_protoc_middleman \
- generate_cpp_no_group_benchmark_code \
- generate_gogo_benchmark_code \
- gogofast_protoc_middleman \
- gogofast \
- gogofaster_protoc_middleman \
- gogofaster \
- gogoslick_protoc_middleman \
- gogoslick \
- gogo-benchmark \
- gogo/cpp_no_group/cpp_benchmark.* \
- proto3_proto_middleman \
- generate_proto3_data \
- php-benchmark \
- php-c-benchmark \
- proto3_middleman_php \
- pbjs_preparation \
- pbjs_middleman \
- pbjs-benchmark \
- js_preparation \
- js_middleman \
- js-benchmark
-
-clean-local:
- -rm -rf tmp/*
-
diff --git a/benchmarks/README.md b/benchmarks/README.md
deleted file mode 100644
index 70c3596..0000000
--- a/benchmarks/README.md
+++ /dev/null
@@ -1,239 +0,0 @@
-
-# Protocol Buffers Benchmarks
-
-This directory contains benchmarking schemas and data sets that you
-can use to test a variety of performance scenarios against your
-protobuf language runtime. If you are looking for performance
-numbers of officially supported languages, see [Protobuf Performance](
-https://github.com/protocolbuffers/protobuf/blob/main/docs/performance.md).
-
-## Prerequisite
-
-First, you need to follow the instruction in the root directory's README to
-build your language's protobuf, then:
-
-### CPP
-You need to install [cmake](https://cmake.org/) before building the benchmark.
-
-We are using [google/benchmark](https://github.com/google/benchmark) as the
-benchmark tool for testing cpp. This will be automatically made during build the
-cpp benchmark.
-
-The cpp protobuf performance can be improved by linking with
-[TCMalloc](https://google.github.io/tcmalloc).
-
-### Java
-We're using maven to build the java benchmarks, which is the same as to build
-the Java protobuf. There're no other tools need to install. We're using
-[google/caliper](https://github.com/google/caliper) as benchmark tool, which
-can be automatically included by maven.
-
-### Python
-We're using python C++ API for testing the generated
-CPP proto version of python protobuf, which is also a prerequisite for Python
-protobuf cpp implementation. You need to install the correct version of Python
-C++ extension package before run generated CPP proto version of Python
-protobuf's benchmark. e.g. under Ubuntu, you need to
-
-```
-$ sudo apt-get install python-dev
-$ sudo apt-get install python3-dev
-```
-And you also need to make sure `pkg-config` is installed.
-
-### Go
-Go protobufs are maintained at [github.com/golang/protobuf](
-http://github.com/golang/protobuf). If not done already, you need to install the
-toolchain and the Go protoc-gen-go plugin for protoc.
-
-To install protoc-gen-go, run:
-
-```
-$ go get -u github.com/golang/protobuf/protoc-gen-go
-$ export PATH=$PATH:$(go env GOPATH)/bin
-```
-
-The first command installs `protoc-gen-go` into the `bin` directory in your local `GOPATH`.
-The second command adds the `bin` directory to your `PATH` so that `protoc` can locate the plugin later.
-
-### PHP
-PHP benchmark's requirement is the same as PHP protobuf's requirements. The benchmark will automatically
-include PHP protobuf's src and build the c extension if required.
-
-### Node.js
-Node.js benchmark need [node](https://nodejs.org/en/)(higher than V6) and [npm](https://www.npmjs.com/) package manager installed. This benchmark is using the [benchmark](https://www.npmjs.com/package/benchmark) framework to test, which needn't to manually install. And another prerequisite is [protobuf js](https://github.com/protocolbuffers/protobuf/tree/main/js), which needn't to manually install either
-
-### C#
-The C# benchmark code is built as part of the main Google.Protobuf
-solution. It requires the .NET Core SDK, and depends on
-[BenchmarkDotNet](https://github.com/dotnet/BenchmarkDotNet), which
-will be downloaded automatically.
-
-## Run instructions
-
-To run all the benchmark dataset:
-
-### Java:
-
-First build the Java binary in the usual way with Maven:
-
-```
-$ cd java
-$ mvn install
-```
-
-Assuming that completes successfully,
-
-```
-$ cd ../benchmarks
-$ make java
-```
-
-### CPP:
-
-```
-$ make cpp
-```
-
-For linking with tcmalloc:
-
-```
-$ env LD_PRELOAD={directory to libtcmalloc.so} make cpp
-```
-
-### Python:
-
-We have three versions of python protobuf implementation: pure python, cpp
-reflection and cpp generated code. To run these version benchmark, you need to:
-
-#### Pure Python:
-
-```
-$ make python-pure-python
-```
-
-#### CPP reflection:
-
-```
-$ make python-cpp-reflection
-```
-
-#### CPP generated code:
-
-```
-$ make python-cpp-generated-code
-```
-
-### Go
-```
-$ make go
-```
-
-
-### PHP
-We have two version of php protobuf implementation: pure php, php with c extension. To run these version benchmark, you need to:
-#### Pure PHP
-```
-$ make php
-```
-#### PHP with c extension
-```
-$ make php_c
-```
-
-### Node.js
-```
-$ make js
-```
-
-To run a specific dataset or run with specific options:
-
-### Java:
-
-```
-$ make java-benchmark
-$ ./java-benchmark $(specific generated dataset file name) [$(caliper options)]
-```
-
-### CPP:
-
-```
-$ make cpp-benchmark
-$ ./cpp-benchmark $(specific generated dataset file name) [$(benchmark options)]
-```
-
-### Python:
-
-For Python benchmark we have `--json` for outputting the json result
-
-#### Pure Python:
-
-```
-$ make python-pure-python-benchmark
-$ ./python-pure-python-benchmark [--json] $(specific generated dataset file name)
-```
-
-#### CPP reflection:
-
-```
-$ make python-cpp-reflection-benchmark
-$ ./python-cpp-reflection-benchmark [--json] $(specific generated dataset file name)
-```
-
-#### CPP generated code:
-
-```
-$ make python-cpp-generated-code-benchmark
-$ ./python-cpp-generated-code-benchmark [--json] $(specific generated dataset file name)
-```
-
-### Go:
-```
-$ make go-benchmark
-$ ./go-benchmark $(specific generated dataset file name) [go testing options]
-```
-
-### PHP
-#### Pure PHP
-```
-$ make php-benchmark
-$ ./php-benchmark $(specific generated dataset file name)
-```
-#### PHP with c extension
-```
-$ make php-c-benchmark
-$ ./php-c-benchmark $(specific generated dataset file name)
-```
-
-### Node.js
-```
-$ make js-benchmark
-$ ./js-benchmark $(specific generated dataset file name)
-```
-
-### C#
-From `csharp/src/Google.Protobuf.Benchmarks`, run:
-
-```
-$ dotnet run -c Release
-```
-
-We intend to add support for this within the makefile in due course.
-
-## Benchmark datasets
-
-Each data set is in the format of benchmarks.proto:
-
-1. name is the benchmark dataset's name.
-2. message_name is the benchmark's message type full name (including package and message name)
-3. payload is the list of raw data.
-
-The schema for the datasets is described in `benchmarks.proto`.
-
-Benchmark likely want to run several benchmarks against each data set (parse,
-serialize, possibly JSON, possibly using different APIs, etc).
-
-We would like to add more data sets. In general we will favor data sets
-that make the overall suite diverse without being too large or having
-too many similar tests. Ideally everyone can run through the entire
-suite without the test run getting too long.
diff --git a/benchmarks/__init__.py b/benchmarks/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/benchmarks/__init__.py
+++ /dev/null
diff --git a/benchmarks/benchmarks.proto b/benchmarks/benchmarks.proto
deleted file mode 100644
index 51c0b54..0000000
--- a/benchmarks/benchmarks.proto
+++ /dev/null
@@ -1,63 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-syntax = "proto3";
-package benchmarks;
-option java_package = "com.google.protobuf.benchmarks";
-
-message BenchmarkDataset {
- // Name of the benchmark dataset. This should be unique across all datasets.
- // Should only contain word characters: [a-zA-Z0-9_]
- string name = 1;
-
- // Fully-qualified name of the protobuf message for this dataset.
- // It will be one of the messages defined benchmark_messages_proto2.proto
- // or benchmark_messages_proto3.proto.
- //
- // Implementations that do not support reflection can implement this with
- // an explicit "if/else" chain that lists every known message defined
- // in those files.
- string message_name = 2;
-
- // The payload(s) for this dataset. They should be parsed or serialized
- // in sequence, in a loop, ie.
- //
- // while (!benchmarkDone) { // Benchmark runner decides when to exit.
- // for (i = 0; i < benchmark.payload.length; i++) {
- // parse(benchmark.payload[i])
- // }
- // }
- //
- // This is intended to let datasets include a variety of data to provide
- // potentially more realistic results than just parsing the same message
- // over and over. A single message parsed repeatedly could yield unusually
- // good branch prediction performance.
- repeated bytes payload = 3;
-}
diff --git a/benchmarks/cpp/BUILD.bazel b/benchmarks/cpp/BUILD.bazel
deleted file mode 100644
index 7a3d3ba..0000000
--- a/benchmarks/cpp/BUILD.bazel
+++ /dev/null
@@ -1,26 +0,0 @@
-load("@rules_cc//cc:defs.bzl", "cc_binary")
-load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
-
-cc_binary(
- name = "cpp",
- srcs = [
- "cpp_benchmark.cc",
- ],
- tags = ["benchmark"],
- deps = [
- "//:protobuf",
- "//benchmarks:benchmarks_cc_proto",
- "//benchmarks/datasets:cc_protos",
- "@com_github_google_benchmark//:benchmark_main",
- ],
-)
-
-pkg_files(
- name = "dist_files",
- srcs = [
- "BUILD.bazel",
- "cpp_benchmark.cc",
- ],
- strip_prefix = strip_prefix.from_root(""),
- visibility = ["//benchmarks:__pkg__"],
-)
diff --git a/benchmarks/cpp/cpp_benchmark.cc b/benchmarks/cpp/cpp_benchmark.cc
deleted file mode 100644
index 036d234..0000000
--- a/benchmarks/cpp/cpp_benchmark.cc
+++ /dev/null
@@ -1,254 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#include <fstream>
-#include <iostream>
-#include "benchmark/benchmark.h"
-#include "benchmarks.pb.h"
-#include "datasets/google_message1/proto2/benchmark_message1_proto2.pb.h"
-#include "datasets/google_message1/proto3/benchmark_message1_proto3.pb.h"
-#include "datasets/google_message2/benchmark_message2.pb.h"
-#include "datasets/google_message3/benchmark_message3.pb.h"
-#include "datasets/google_message4/benchmark_message4.pb.h"
-
-
-#define PREFIX "dataset."
-#define SUFFIX ".pb"
-
-using benchmarks::BenchmarkDataset;
-using google::protobuf::Arena;
-using google::protobuf::Descriptor;
-using google::protobuf::DescriptorPool;
-using google::protobuf::Message;
-using google::protobuf::MessageFactory;
-
-class Fixture : public benchmark::Fixture {
- public:
- Fixture(const BenchmarkDataset& dataset, const std::string& suffix) {
- for (int i = 0; i < dataset.payload_size(); i++) {
- payloads_.push_back(dataset.payload(i));
- }
-
- const Descriptor* d =
- DescriptorPool::generated_pool()->FindMessageTypeByName(
- dataset.message_name());
-
- if (!d) {
- std::cerr << "Couldn't find message named '" << dataset.message_name()
- << "\n";
- }
-
- prototype_ = MessageFactory::generated_factory()->GetPrototype(d);
- SetName((dataset.name() + suffix).c_str());
- }
-
- protected:
- std::vector<std::string> payloads_;
- const Message* prototype_;
-};
-
-class WrappingCounter {
- public:
- WrappingCounter(size_t limit) : value_(0), limit_(limit) {}
-
- size_t Next() {
- size_t ret = value_;
- if (++value_ == limit_) {
- value_ = 0;
- }
- return ret;
- }
-
- private:
- size_t value_;
- size_t limit_;
-};
-
-template <class T>
-class ParseNewFixture : public Fixture {
- public:
- ParseNewFixture(const BenchmarkDataset& dataset)
- : Fixture(dataset, "_parse_new") {}
-
- virtual void BenchmarkCase(benchmark::State& state) {
- WrappingCounter i(payloads_.size());
- size_t total = 0;
-
- while (state.KeepRunning()) {
- T m;
- const std::string& payload = payloads_[i.Next()];
- total += payload.size();
- m.ParseFromString(payload);
- }
-
- state.SetBytesProcessed(total);
- }
-};
-
-template <class T>
-class ParseNewArenaFixture : public Fixture {
- public:
- ParseNewArenaFixture(const BenchmarkDataset& dataset)
- : Fixture(dataset, "_parse_newarena") {}
-
- virtual void BenchmarkCase(benchmark::State& state) {
- WrappingCounter i(payloads_.size());
- size_t total = 0;
- Arena arena;
-
- while (state.KeepRunning()) {
- arena.Reset();
- Message* m = Arena::CreateMessage<T>(&arena);
- const std::string& payload = payloads_[i.Next()];
- total += payload.size();
- m->ParseFromString(payload);
- }
-
- state.SetBytesProcessed(total);
- }
-};
-
-template <class T>
-class ParseReuseFixture : public Fixture {
- public:
- ParseReuseFixture(const BenchmarkDataset& dataset)
- : Fixture(dataset, "_parse_reuse") {}
-
- virtual void BenchmarkCase(benchmark::State& state) {
- T m;
- WrappingCounter i(payloads_.size());
- size_t total = 0;
-
- while (state.KeepRunning()) {
- const std::string& payload = payloads_[i.Next()];
- total += payload.size();
- m.ParseFromString(payload);
- }
-
- state.SetBytesProcessed(total);
- }
-};
-
-template <class T>
-class SerializeFixture : public Fixture {
- public:
- SerializeFixture(const BenchmarkDataset& dataset)
- : Fixture(dataset, "_serialize") {
- for (size_t i = 0; i < payloads_.size(); i++) {
- message_.push_back(new T);
- message_.back()->ParseFromString(payloads_[i]);
- }
- }
-
- ~SerializeFixture() {
- for (size_t i = 0; i < message_.size(); i++) {
- delete message_[i];
- }
- }
-
- virtual void BenchmarkCase(benchmark::State& state) {
- size_t total = 0;
- std::string str;
- WrappingCounter i(payloads_.size());
-
- while (state.KeepRunning()) {
- str.clear();
- message_[i.Next()]->SerializeToString(&str);
- total += str.size();
- }
-
- state.SetBytesProcessed(total);
- }
-
- private:
- std::vector<T*> message_;
-};
-
-std::string ReadFile(const std::string& name) {
- std::ifstream file(name.c_str());
- GOOGLE_CHECK(file.is_open()) << "Couldn't find file '" << name <<
- "', please make sure you are running "
- "this command from the benchmarks/ "
- "directory.\n";
- return std::string((std::istreambuf_iterator<char>(file)),
- std::istreambuf_iterator<char>());
-}
-
-template <class T>
-void RegisterBenchmarksForType(const BenchmarkDataset& dataset) {
- ::benchmark::internal::RegisterBenchmarkInternal(
- new ParseNewFixture<T>(dataset));
- ::benchmark::internal::RegisterBenchmarkInternal(
- new ParseReuseFixture<T>(dataset));
- ::benchmark::internal::RegisterBenchmarkInternal(
- new ParseNewArenaFixture<T>(dataset));
- ::benchmark::internal::RegisterBenchmarkInternal(
- new SerializeFixture<T>(dataset));
-}
-
-void RegisterBenchmarks(const std::string& dataset_bytes) {
- BenchmarkDataset dataset;
- GOOGLE_CHECK(dataset.ParseFromString(dataset_bytes));
-
- if (dataset.message_name() == "benchmarks.proto3.GoogleMessage1") {
- RegisterBenchmarksForType<benchmarks::proto3::GoogleMessage1>(dataset);
- } else if (dataset.message_name() == "benchmarks.proto2.GoogleMessage1") {
- RegisterBenchmarksForType<benchmarks::proto2::GoogleMessage1>(dataset);
- } else if (dataset.message_name() == "benchmarks.proto2.GoogleMessage2") {
- RegisterBenchmarksForType<benchmarks::proto2::GoogleMessage2>(dataset);
- } else if (dataset.message_name() ==
- "benchmarks.google_message3.GoogleMessage3") {
- RegisterBenchmarksForType
- <benchmarks::google_message3::GoogleMessage3>(dataset);
- } else if (dataset.message_name() ==
- "benchmarks.google_message4.GoogleMessage4") {
- RegisterBenchmarksForType
- <benchmarks::google_message4::GoogleMessage4>(dataset);
- } else {
- std::cerr << "Unknown message type: " << dataset.message_name();
- exit(1);
- }
-}
-
-int main(int argc, char *argv[]) {
- ::benchmark::Initialize(&argc, argv);
- if (argc == 1) {
- std::cerr << "Usage: ./cpp-benchmark <input data>" << std::endl;
- std::cerr << "input data is in the format of \"benchmarks.proto\""
- << std::endl;
- return 1;
- } else {
- for (int i = 1; i < argc; i++) {
- RegisterBenchmarks(ReadFile(argv[i]));
- }
- }
-
- ::benchmark::RunSpecifiedBenchmarks();
-}
diff --git a/benchmarks/datasets/BUILD.bazel b/benchmarks/datasets/BUILD.bazel
deleted file mode 100644
index 2a8b402..0000000
--- a/benchmarks/datasets/BUILD.bazel
+++ /dev/null
@@ -1,67 +0,0 @@
-load("@rules_cc//cc:defs.bzl", "cc_library")
-load("@rules_java//java:defs.bzl", "java_library")
-load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
-load("@rules_proto//proto:defs.bzl", "proto_library")
-
-filegroup(
- name = "datasets",
- srcs = [
- "//benchmarks/datasets/google_message1/proto2:datasets",
- "//benchmarks/datasets/google_message1/proto3:datasets",
- "//benchmarks/datasets/google_message2:datasets",
- "//benchmarks/datasets/google_message3:datasets",
- "//benchmarks/datasets/google_message4:datasets",
- ],
- visibility = [
- "//benchmarks:__subpackages__",
- ],
-)
-
-proto_library(
- name = "protos",
- visibility = [
- "//benchmarks:__subpackages__",
- ],
- deps = [
- "//benchmarks/datasets/google_message1/proto2:benchmark_message1_proto2_proto",
- "//benchmarks/datasets/google_message1/proto3:benchmark_message1_proto3_proto",
- "//benchmarks/datasets/google_message2:benchmark_message2_proto",
- "//benchmarks/datasets/google_message3:benchmark_message3_proto",
- "//benchmarks/datasets/google_message4:benchmark_message4_proto",
- ],
-)
-
-cc_library(
- name = "cc_protos",
- visibility = [
- "//benchmarks:__subpackages__",
- ],
- deps = [
- "//benchmarks/datasets/google_message1/proto2:benchmark_message1_proto2_cc_proto",
- "//benchmarks/datasets/google_message1/proto3:benchmark_message1_proto3_cc_proto",
- "//benchmarks/datasets/google_message2:benchmark_message2_cc_proto",
- "//benchmarks/datasets/google_message3:benchmark_message3_cc_proto",
- "//benchmarks/datasets/google_message4:benchmark_message4_cc_proto",
- ],
-)
-
-java_library(
- name = "java_protos",
- visibility = [
- "//benchmarks:__subpackages__",
- ],
- exports = [
- "//benchmarks/datasets/google_message1/proto2:benchmark_message1_proto2_java_proto",
- "//benchmarks/datasets/google_message1/proto3:benchmark_message1_proto3_java_proto",
- "//benchmarks/datasets/google_message2:benchmark_message2_java_proto",
- "//benchmarks/datasets/google_message3:benchmark_message3_java_proto",
- "//benchmarks/datasets/google_message4:benchmark_message4_java_proto",
- ],
-)
-
-pkg_files(
- name = "dist_files",
- srcs = ["BUILD.bazel"],
- strip_prefix = strip_prefix.from_root(""),
- visibility = ["//benchmarks:__pkg__"],
-)
diff --git a/benchmarks/datasets/google_message1/proto2/BUILD.bazel b/benchmarks/datasets/google_message1/proto2/BUILD.bazel
deleted file mode 100644
index 30caed5..0000000
--- a/benchmarks/datasets/google_message1/proto2/BUILD.bazel
+++ /dev/null
@@ -1,52 +0,0 @@
-load("@rules_cc//cc:defs.bzl", "cc_proto_library")
-load("@rules_java//java:defs.bzl", "java_proto_library")
-load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
-load("@rules_proto//proto:defs.bzl", "proto_library")
-
-filegroup(
- name = "datasets",
- srcs = [
- "dataset.google_message1_proto2.pb",
- ],
- visibility = [
- "//benchmarks/datasets:__pkg__",
- ],
-)
-
-proto_library(
- name = "benchmark_message1_proto2_proto",
- srcs = [
- "benchmark_message1_proto2.proto",
- ],
- strip_import_prefix = "/benchmarks",
- visibility = [
- "//benchmarks/datasets:__pkg__",
- ],
-)
-
-cc_proto_library(
- name = "benchmark_message1_proto2_cc_proto",
- visibility = [
- "//benchmarks/datasets:__pkg__",
- ],
- deps = [
- "benchmark_message1_proto2_proto",
- ],
-)
-
-java_proto_library(
- name = "benchmark_message1_proto2_java_proto",
- visibility = [
- "//benchmarks/datasets:__pkg__",
- ],
- deps = [
- "benchmark_message1_proto2_proto",
- ],
-)
-
-pkg_files(
- name = "dist_files",
- srcs = glob(["*"]),
- strip_prefix = strip_prefix.from_root(""),
- visibility = ["//benchmarks:__pkg__"],
-)
diff --git a/benchmarks/datasets/google_message1/proto2/benchmark_message1_proto2.proto b/benchmarks/datasets/google_message1/proto2/benchmark_message1_proto2.proto
deleted file mode 100644
index e404b9f..0000000
--- a/benchmarks/datasets/google_message1/proto2/benchmark_message1_proto2.proto
+++ /dev/null
@@ -1,108 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// Benchmark messages for proto2.
-
-syntax = "proto2";
-
-package benchmarks.proto2;
-option java_package = "com.google.protobuf.benchmarks";
-
-// This is the default, but we specify it here explicitly.
-option optimize_for = SPEED;
-
-option cc_enable_arenas = true;
-
-message GoogleMessage1 {
- required string field1 = 1;
- optional string field9 = 9;
- optional string field18 = 18;
- optional bool field80 = 80 [default = false];
- optional bool field81 = 81 [default = true];
- required int32 field2 = 2;
- required int32 field3 = 3;
- optional int32 field280 = 280;
- optional int32 field6 = 6 [default = 0];
- optional int64 field22 = 22;
- optional string field4 = 4;
- repeated fixed64 field5 = 5;
- optional bool field59 = 59 [default = false];
- optional string field7 = 7;
- optional int32 field16 = 16;
- optional int32 field130 = 130 [default = 0];
- optional bool field12 = 12 [default = true];
- optional bool field17 = 17 [default = true];
- optional bool field13 = 13 [default = true];
- optional bool field14 = 14 [default = true];
- optional int32 field104 = 104 [default = 0];
- optional int32 field100 = 100 [default = 0];
- optional int32 field101 = 101 [default = 0];
- optional string field102 = 102;
- optional string field103 = 103;
- optional int32 field29 = 29 [default = 0];
- optional bool field30 = 30 [default = false];
- optional int32 field60 = 60 [default = -1];
- optional int32 field271 = 271 [default = -1];
- optional int32 field272 = 272 [default = -1];
- optional int32 field150 = 150;
- optional int32 field23 = 23 [default = 0];
- optional bool field24 = 24 [default = false];
- optional int32 field25 = 25 [default = 0];
- optional GoogleMessage1SubMessage field15 = 15;
- optional bool field78 = 78;
- optional int32 field67 = 67 [default = 0];
- optional int32 field68 = 68;
- optional int32 field128 = 128 [default = 0];
- optional string field129 = 129 [default = "xxxxxxxxxxxxxxxxxxxxx"];
- optional int32 field131 = 131 [default = 0];
-}
-
-message GoogleMessage1SubMessage {
- optional int32 field1 = 1 [default = 0];
- optional int32 field2 = 2 [default = 0];
- optional int32 field3 = 3 [default = 0];
- optional string field15 = 15;
- optional bool field12 = 12 [default = true];
- optional int64 field13 = 13;
- optional int64 field14 = 14;
- optional int32 field16 = 16;
- optional int32 field19 = 19 [default = 2];
- optional bool field20 = 20 [default = true];
- optional bool field28 = 28 [default = true];
- optional fixed64 field21 = 21;
- optional int32 field22 = 22;
- optional bool field23 = 23 [default = false];
- optional bool field206 = 206 [default = false];
- optional fixed32 field203 = 203;
- optional int32 field204 = 204;
- optional string field205 = 205;
- optional uint64 field207 = 207;
- optional uint64 field300 = 300;
-}
diff --git a/benchmarks/datasets/google_message1/proto2/dataset.google_message1_proto2.pb b/benchmarks/datasets/google_message1/proto2/dataset.google_message1_proto2.pb
deleted file mode 100644
index f6fe784..0000000
--- a/benchmarks/datasets/google_message1/proto2/dataset.google_message1_proto2.pb
+++ /dev/null
Binary files differ
diff --git a/benchmarks/datasets/google_message1/proto3/BUILD.bazel b/benchmarks/datasets/google_message1/proto3/BUILD.bazel
deleted file mode 100644
index 0dc59d1..0000000
--- a/benchmarks/datasets/google_message1/proto3/BUILD.bazel
+++ /dev/null
@@ -1,52 +0,0 @@
-load("@rules_cc//cc:defs.bzl", "cc_proto_library")
-load("@rules_java//java:defs.bzl", "java_proto_library")
-load("@rules_proto//proto:defs.bzl", "proto_library")
-load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
-
-filegroup(
- name = "datasets",
- srcs = [
- "dataset.google_message1_proto3.pb",
- ],
- visibility = [
- "//benchmarks/datasets:__pkg__",
- ],
-)
-
-proto_library(
- name = "benchmark_message1_proto3_proto",
- srcs = [
- "benchmark_message1_proto3.proto",
- ],
- strip_import_prefix = "/benchmarks",
- visibility = [
- "//benchmarks/datasets:__pkg__",
- ],
-)
-
-cc_proto_library(
- name = "benchmark_message1_proto3_cc_proto",
- visibility = [
- "//benchmarks/datasets:__pkg__",
- ],
- deps = [
- "benchmark_message1_proto3_proto",
- ],
-)
-
-java_proto_library(
- name = "benchmark_message1_proto3_java_proto",
- visibility = [
- "//benchmarks/datasets:__pkg__",
- ],
- deps = [
- "benchmark_message1_proto3_proto",
- ],
-)
-
-pkg_files(
- name = "dist_files",
- srcs = glob(["*"]),
- strip_prefix = strip_prefix.from_root(""),
- visibility = ["//benchmarks:__pkg__"],
-)
diff --git a/benchmarks/datasets/google_message1/proto3/benchmark_message1_proto3.proto b/benchmarks/datasets/google_message1/proto3/benchmark_message1_proto3.proto
deleted file mode 100644
index 8aee2f6..0000000
--- a/benchmarks/datasets/google_message1/proto3/benchmark_message1_proto3.proto
+++ /dev/null
@@ -1,108 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// Benchmark messages for proto3.
-
-syntax = "proto3";
-
-package benchmarks.proto3;
-option java_package = "com.google.protobuf.benchmarks";
-
-// This is the default, but we specify it here explicitly.
-option optimize_for = SPEED;
-
-option cc_enable_arenas = true;
-
-message GoogleMessage1 {
- string field1 = 1;
- string field9 = 9;
- string field18 = 18;
- bool field80 = 80;
- bool field81 = 81;
- int32 field2 = 2;
- int32 field3 = 3;
- int32 field280 = 280;
- int32 field6 = 6;
- int64 field22 = 22;
- string field4 = 4;
- repeated fixed64 field5 = 5;
- bool field59 = 59;
- string field7 = 7;
- int32 field16 = 16;
- int32 field130 = 130;
- bool field12 = 12;
- bool field17 = 17;
- bool field13 = 13;
- bool field14 = 14;
- int32 field104 = 104;
- int32 field100 = 100;
- int32 field101 = 101;
- string field102 = 102;
- string field103 = 103;
- int32 field29 = 29;
- bool field30 = 30;
- int32 field60 = 60;
- int32 field271 = 271;
- int32 field272 = 272;
- int32 field150 = 150;
- int32 field23 = 23;
- bool field24 = 24;
- int32 field25 = 25;
- GoogleMessage1SubMessage field15 = 15;
- bool field78 = 78;
- int32 field67 = 67;
- int32 field68 = 68;
- int32 field128 = 128;
- string field129 = 129;
- int32 field131 = 131;
-}
-
-message GoogleMessage1SubMessage {
- int32 field1 = 1;
- int32 field2 = 2;
- int32 field3 = 3;
- string field15 = 15;
- bool field12 = 12;
- int64 field13 = 13;
- int64 field14 = 14;
- int32 field16 = 16;
- int32 field19 = 19;
- bool field20 = 20;
- bool field28 = 28;
- fixed64 field21 = 21;
- int32 field22 = 22;
- bool field23 = 23;
- bool field206 = 206;
- fixed32 field203 = 203;
- int32 field204 = 204;
- string field205 = 205;
- uint64 field207 = 207;
- uint64 field300 = 300;
-}
diff --git a/benchmarks/datasets/google_message1/proto3/dataset.google_message1_proto3.pb b/benchmarks/datasets/google_message1/proto3/dataset.google_message1_proto3.pb
deleted file mode 100644
index 4955bed..0000000
--- a/benchmarks/datasets/google_message1/proto3/dataset.google_message1_proto3.pb
+++ /dev/null
Binary files differ
diff --git a/benchmarks/datasets/google_message2/BUILD.bazel b/benchmarks/datasets/google_message2/BUILD.bazel
deleted file mode 100644
index f3d66a2..0000000
--- a/benchmarks/datasets/google_message2/BUILD.bazel
+++ /dev/null
@@ -1,52 +0,0 @@
-load("@rules_cc//cc:defs.bzl", "cc_proto_library")
-load("@rules_java//java:defs.bzl", "java_proto_library")
-load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
-load("@rules_proto//proto:defs.bzl", "proto_library")
-
-filegroup(
- name = "datasets",
- srcs = [
- "dataset.google_message2.pb",
- ],
- visibility = [
- "//benchmarks/datasets:__pkg__",
- ],
-)
-
-proto_library(
- name = "benchmark_message2_proto",
- srcs = [
- "benchmark_message2.proto",
- ],
- strip_import_prefix = "/benchmarks",
- visibility = [
- "//benchmarks/datasets:__pkg__",
- ],
-)
-
-cc_proto_library(
- name = "benchmark_message2_cc_proto",
- visibility = [
- "//benchmarks/datasets:__pkg__",
- ],
- deps = [
- "benchmark_message2_proto",
- ],
-)
-
-java_proto_library(
- name = "benchmark_message2_java_proto",
- visibility = [
- "//benchmarks/datasets:__pkg__",
- ],
- deps = [
- "benchmark_message2_proto",
- ],
-)
-
-pkg_files(
- name = "dist_files",
- srcs = glob(["*"]),
- strip_prefix = strip_prefix.from_root(""),
- visibility = ["//benchmarks:__pkg__"],
-)
diff --git a/benchmarks/datasets/google_message2/benchmark_message2.proto b/benchmarks/datasets/google_message2/benchmark_message2.proto
deleted file mode 100644
index 500c5d6..0000000
--- a/benchmarks/datasets/google_message2/benchmark_message2.proto
+++ /dev/null
@@ -1,108 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// LINT: ALLOW_GROUPS
-
-// Benchmark messages for proto2.
-
-syntax = "proto2";
-
-package benchmarks.proto2;
-option java_package = "com.google.protobuf.benchmarks";
-
-// This is the default, but we specify it here explicitly.
-option optimize_for = SPEED;
-
-option cc_enable_arenas = true;
-
-message GoogleMessage2 {
- optional string field1 = 1;
- optional int64 field3 = 3;
- optional int64 field4 = 4;
- optional int64 field30 = 30;
- optional bool field75 = 75 [default = false];
- optional string field6 = 6;
- optional bytes field2 = 2;
- optional int32 field21 = 21 [default = 0];
- optional int32 field71 = 71;
- optional float field25 = 25;
- optional int32 field109 = 109 [default = 0];
- optional int32 field210 = 210 [default = 0];
- optional int32 field211 = 211 [default = 0];
- optional int32 field212 = 212 [default = 0];
- optional int32 field213 = 213 [default = 0];
- optional int32 field216 = 216 [default = 0];
- optional int32 field217 = 217 [default = 0];
- optional int32 field218 = 218 [default = 0];
- optional int32 field220 = 220 [default = 0];
- optional int32 field221 = 221 [default = 0];
- optional float field222 = 222 [default = 0.0];
- optional int32 field63 = 63;
-
- repeated group Group1 = 10 {
- required float field11 = 11;
- optional float field26 = 26;
- optional string field12 = 12;
- optional string field13 = 13;
- repeated string field14 = 14;
- required uint64 field15 = 15;
- optional int32 field5 = 5;
- optional string field27 = 27;
- optional int32 field28 = 28;
- optional string field29 = 29;
- optional string field16 = 16;
- repeated string field22 = 22;
- repeated int32 field73 = 73;
- optional int32 field20 = 20 [default = 0];
- optional string field24 = 24;
- optional GoogleMessage2GroupedMessage field31 = 31;
- }
- repeated string field128 = 128;
- optional int64 field131 = 131;
- repeated string field127 = 127;
- optional int32 field129 = 129;
- repeated int64 field130 = 130;
- optional bool field205 = 205 [default = false];
- optional bool field206 = 206 [default = false];
-}
-
-message GoogleMessage2GroupedMessage {
- optional float field1 = 1;
- optional float field2 = 2;
- optional float field3 = 3 [default = 0.0];
- optional bool field4 = 4;
- optional bool field5 = 5;
- optional bool field6 = 6 [default = true];
- optional bool field7 = 7 [default = false];
- optional float field8 = 8;
- optional bool field9 = 9;
- optional float field10 = 10;
- optional int64 field11 = 11;
-}
diff --git a/benchmarks/datasets/google_message2/dataset.google_message2.pb b/benchmarks/datasets/google_message2/dataset.google_message2.pb
deleted file mode 100644
index 3fa0e49..0000000
--- a/benchmarks/datasets/google_message2/dataset.google_message2.pb
+++ /dev/null
Binary files differ
diff --git a/benchmarks/datasets/google_message3/BUILD.bazel b/benchmarks/datasets/google_message3/BUILD.bazel
deleted file mode 100644
index a729e50..0000000
--- a/benchmarks/datasets/google_message3/BUILD.bazel
+++ /dev/null
@@ -1,58 +0,0 @@
-load("@rules_cc//cc:defs.bzl", "cc_proto_library")
-load("@rules_java//java:defs.bzl", "java_proto_library")
-load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
-load("@rules_proto//proto:defs.bzl", "proto_library")
-
-filegroup(
- name = "datasets",
- srcs = [],
- visibility = [
- "//benchmarks/datasets:__pkg__",
- ],
-)
-
-proto_library(
- name = "benchmark_message3_proto",
- srcs = [
- "benchmark_message3.proto",
- "benchmark_message3_1.proto",
- "benchmark_message3_2.proto",
- "benchmark_message3_3.proto",
- "benchmark_message3_4.proto",
- "benchmark_message3_5.proto",
- "benchmark_message3_6.proto",
- "benchmark_message3_7.proto",
- "benchmark_message3_8.proto",
- ],
- strip_import_prefix = "/benchmarks",
- visibility = [
- "//benchmarks/datasets:__pkg__",
- ],
-)
-
-cc_proto_library(
- name = "benchmark_message3_cc_proto",
- visibility = [
- "//benchmarks/datasets:__pkg__",
- ],
- deps = [
- "benchmark_message3_proto",
- ],
-)
-
-java_proto_library(
- name = "benchmark_message3_java_proto",
- visibility = [
- "//benchmarks/datasets:__pkg__",
- ],
- deps = [
- "benchmark_message3_proto",
- ],
-)
-
-pkg_files(
- name = "dist_files",
- srcs = glob(["*"]),
- strip_prefix = strip_prefix.from_root(""),
- visibility = ["//benchmarks:__pkg__"],
-)
diff --git a/benchmarks/datasets/google_message3/benchmark_message3.proto b/benchmarks/datasets/google_message3/benchmark_message3.proto
deleted file mode 100644
index 82422f9..0000000
--- a/benchmarks/datasets/google_message3/benchmark_message3.proto
+++ /dev/null
@@ -1,566 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// LINT: ALLOW_GROUPS
-
-syntax = "proto2";
-
-package benchmarks.google_message3;
-
-import "datasets/google_message3/benchmark_message3_1.proto";
-import "datasets/google_message3/benchmark_message3_2.proto";
-import "datasets/google_message3/benchmark_message3_3.proto";
-import "datasets/google_message3/benchmark_message3_4.proto";
-import "datasets/google_message3/benchmark_message3_5.proto";
-import "datasets/google_message3/benchmark_message3_7.proto";
-import "datasets/google_message3/benchmark_message3_8.proto";
-
-option cc_enable_arenas = true;
-option java_package = "com.google.protobuf.benchmarks";
-
-message GoogleMessage3 {
- optional .benchmarks.google_message3.Message37487 field37519 = 2;
- optional .benchmarks.google_message3.Message36876 field37520 = 3;
- optional .benchmarks.google_message3.Message13062 field37521 = 4;
- optional .benchmarks.google_message3.Message952 field37522 = 5;
- optional .benchmarks.google_message3.UnusedEmptyMessage field37523 = 6;
- optional .benchmarks.google_message3.UnusedEmptyMessage field37524 = 7;
- optional .benchmarks.google_message3.UnusedEmptyMessage field37525 = 8;
- optional .benchmarks.google_message3.UnusedEmptyMessage field37526 = 9;
- optional .benchmarks.google_message3.UnusedEmptyMessage field37527 = 10;
- optional .benchmarks.google_message3.UnusedEmptyMessage field37528 = 11;
- optional .benchmarks.google_message3.UnusedEmptyMessage field37529 = 12;
- optional .benchmarks.google_message3.UnusedEmptyMessage field37530 = 13;
- optional .benchmarks.google_message3.UnusedEmptyMessage field37531 = 14;
- optional .benchmarks.google_message3.UnusedEmptyMessage field37532 = 15;
- optional .benchmarks.google_message3.UnusedEmptyMessage field37533 = 16;
-}
-
-message Message1327 {
- repeated .benchmarks.google_message3.UnusedEmptyMessage field1369 = 1;
- repeated .benchmarks.google_message3.Message1328 field1370 = 3;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field1371 = 5;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field1372 = 6;
- extend .benchmarks.google_message3.Message0 {
- optional .benchmarks.google_message3.Message1327 field1373 = 23104162;
- }
-}
-
-message Message3672 {
- optional .benchmarks.google_message3.Enum3476 field3727 = 1;
- optional int32 field3728 = 11;
- optional int32 field3729 = 2;
- repeated group Message3673 = 3 {
- required .benchmarks.google_message3.Enum3476 field3738 = 4;
- required int32 field3739 = 5;
- }
- repeated group Message3674 = 6 {
- required .benchmarks.google_message3.Enum3476 field3740 = 7;
- required int32 field3741 = 8;
- }
- optional bool field3732 = 9;
- optional int32 field3733 = 10;
- optional .benchmarks.google_message3.Enum3476 field3734 = 20;
- optional int32 field3735 = 21;
- optional .benchmarks.google_message3.UnusedEmptyMessage field3736 = 50;
- extend .benchmarks.google_message3.Message0 {
- optional .benchmarks.google_message3.Message3672 field3737 = 3144435;
- }
-}
-
-message Message3804 {
- required int64 field3818 = 1;
- required bool field3819 = 2;
- repeated .benchmarks.google_message3.Enum3805 field3820 = 4;
- optional int32 field3821 = 5;
- optional bool field3822 = 6;
- optional int64 field3823 = 7;
- optional .benchmarks.google_message3.Enum3783 field3824 = 8;
- extend .benchmarks.google_message3.Message0 {
- optional .benchmarks.google_message3.Message3804 field3825 = 59241828;
- }
-}
-
-message Message6849 {
- repeated .benchmarks.google_message3.Message6850 field6910 = 1;
- extend .benchmarks.google_message3.Message0 {
- optional .benchmarks.google_message3.Message6849 field6911 = 107558455;
- }
-}
-
-message Message6866 {
- repeated .benchmarks.google_message3.Message6863 field6973 = 1;
- extend .benchmarks.google_message3.Message0 {
- optional .benchmarks.google_message3.Message6866 field6974 = 22259060;
- }
-}
-
-message Message6870 {
- repeated .benchmarks.google_message3.Message6871 field6991 = 1;
- extend .benchmarks.google_message3.Message0 {
- optional .benchmarks.google_message3.Message6870 field6992 = 90034652;
- }
-}
-
-message Message7651 {
- optional string field7685 = 1;
- optional int64 field7686 = 2;
- optional int64 field7687 = 3;
- optional int64 field7688 = 4;
- optional int32 field7689 = 5;
- optional int32 field7690 = 6;
- optional int32 field7691 = 7;
- optional int32 field7692 = 8;
- optional int32 field7693 = 9;
- optional int32 field7694 = 10;
- optional int32 field7695 = 11;
- optional int32 field7696 = 12;
- optional int32 field7697 = 13;
- optional int32 field7698 = 14;
- optional int32 field7699 = 15;
- optional int32 field7700 = 16;
- optional int32 field7701 = 17;
- optional int32 field7702 = 18;
- optional bool field7703 = 19;
- repeated int32 field7704 = 20;
- repeated int32 field7705 = 21;
- repeated string field7706 = 22;
- repeated string field7707 = 23;
- optional .benchmarks.google_message3.UnusedEmptyMessage field7708 = 24;
- optional int32 field7709 = 25;
- optional int32 field7710 = 26;
- optional int32 field7711 = 27;
- optional int32 field7712 = 43;
- optional int32 field7713 = 28;
- optional int32 field7714 = 29;
- repeated .benchmarks.google_message3.Message7547 field7715 = 30;
- repeated .benchmarks.google_message3.Message7547 field7716 = 31;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field7717 = 32;
- repeated string field7718 = 33;
- repeated string field7719 = 34;
- repeated .benchmarks.google_message3.Message7648 field7720 = 35;
- optional bool field7721 = 36;
- optional bool field7722 = 37;
- optional bool field7723 = 38;
- optional bool field7724 = 39;
- optional .benchmarks.google_message3.UnusedEmptyMessage field7725 = 40;
- optional .benchmarks.google_message3.UnusedEnum field7726 = 41;
- optional .benchmarks.google_message3.Enum7654 field7727 = 42;
- optional string field7728 = 44;
- optional .benchmarks.google_message3.UnusedEmptyMessage field7729 = 45;
- extend .benchmarks.google_message3.Message0 {
- optional .benchmarks.google_message3.Message7651 field7730 = 55876009;
- }
-}
-
-message Message7864 {
- optional string field7866 = 1;
- optional string field7867 = 2;
- repeated .benchmarks.google_message3.Message7865 field7868 = 5;
- repeated .benchmarks.google_message3.Message7865 field7869 = 6;
- repeated .benchmarks.google_message3.Message7865 field7870 = 7;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field7871 = 8;
- extend .benchmarks.google_message3.Message0 {
- optional .benchmarks.google_message3.Message7864 field7872 = 44542730;
- }
-}
-
-message Message7929 {
- optional int64 field7942 = 1;
- optional int64 field7943 = 4;
- optional int64 field7944 = 5;
- optional int64 field7945 = 12;
- optional int64 field7946 = 13;
- optional int64 field7947 = 18;
- optional int64 field7948 = 6;
- optional int64 field7949 = 7;
- repeated .benchmarks.google_message3.Message7919 field7950 = 8;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field7951 = 20;
- repeated .benchmarks.google_message3.Message7920 field7952 = 14;
- repeated .benchmarks.google_message3.Message7921 field7953 = 15;
- repeated .benchmarks.google_message3.Message7928 field7954 = 17;
- optional int64 field7955 = 19;
- optional bool field7956 = 2;
- optional int64 field7957 = 3;
- optional int64 field7958 = 9;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field7959 = 10;
- repeated bytes field7960 = 11;
- optional int64 field7961 = 16;
- extend .benchmarks.google_message3.Message0 {
- optional .benchmarks.google_message3.Message7929 field7962 = 53392238;
- }
-}
-
-message Message8508 {
- repeated .benchmarks.google_message3.Message8511 field8517 = 8;
- repeated .benchmarks.google_message3.Message8512 field8518 = 9;
- repeated .benchmarks.google_message3.Message8513 field8519 = 11;
- optional bool field8520 = 13;
- optional .benchmarks.google_message3.Message8514 field8521 = 14;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field8522 = 15;
- repeated .benchmarks.google_message3.Message8515 field8523 = 16;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field8524 = 17;
- optional int64 field8525 = 1;
- optional float field8526 = 2;
- optional int64 field8527 = 3;
- optional int64 field8528 = 4;
- optional int32 field8529 = 5;
- optional bytes field8530 = 6;
- repeated bytes field8531 = 7;
- optional bool field8532 = 10;
- optional bytes field8533 = 12;
- extend .benchmarks.google_message3.Message0 {
- optional .benchmarks.google_message3.Message8508 field8534 = 3811804;
- }
-}
-
-message Message9122 {
- optional float field9132 = 1;
- optional float field9133 = 2;
- extend .benchmarks.google_message3.Message0 {
- optional .benchmarks.google_message3.Message9122 field9134 = 120398939;
- }
-}
-
-message Message10177 {
- repeated .benchmarks.google_message3.Message10155 field10270 = 1;
- extend .benchmarks.google_message3.Message0 {
- optional .benchmarks.google_message3.Message10177 field10271 = 26801105;
- }
-}
-
-message Message10278 {
- repeated int32 field10286 = 1 [packed = true];
- repeated int32 field10287 = 2 [packed = true];
- optional int32 field10288 = 3;
- extend .benchmarks.google_message3.Message10155 {
- optional .benchmarks.google_message3.Message10278 field10289 = 29374161;
- }
-}
-
-message Message10323 {
- repeated .benchmarks.google_message3.Message10320 field10360 = 1;
- extend .benchmarks.google_message3.Message10155 {
- optional .benchmarks.google_message3.Message10323 field10361 = 27922524;
- }
-}
-
-message Message10324 {
- repeated .benchmarks.google_message3.Message10322 field10362 = 1;
- optional .benchmarks.google_message3.Message10321 field10363 = 2;
- extend .benchmarks.google_message3.Message10155 {
- optional .benchmarks.google_message3.Message10324 field10364 = 27832297;
- }
-}
-
-message Message11990 {
- repeated .benchmarks.google_message3.Message11988 field12030 = 1;
- extend .benchmarks.google_message3.Message0 {
- optional .benchmarks.google_message3.Message11990 field12031 = 21265426;
- }
-}
-
-message Message12691 {
- optional string field12713 = 1;
- optional int32 field12714 = 2;
- optional .benchmarks.google_message3.Message12668 field12715 = 3;
- extend .benchmarks.google_message3.Message0 {
- optional .benchmarks.google_message3.Message12691 field12716 = 28426536;
- }
-}
-
-message Message12870 {
- required int32 field12879 = 1;
- optional int32 field12880 = 7;
- required int32 field12881 = 2;
- optional uint64 field12882 = 3;
- optional string field12883 = 2001;
- optional fixed64 field12884 = 4;
- repeated fixed64 field12885 = 14;
- optional int32 field12886 = 9;
- optional int64 field12887 = 18;
- repeated .benchmarks.google_message3.Message12870 field12888 = 8;
- optional int32 field12889 = 5;
- optional uint64 field12890 = 6;
- optional int32 field12891 = 10;
- optional int32 field12892 = 11;
- optional double field12893 = 12;
- optional .benchmarks.google_message3.Message12825 field12894 = 13;
- optional double field12895 = 15;
- optional string field12896 = 16;
- optional .benchmarks.google_message3.Enum12871 field12897 = 17;
- optional int32 field12898 = 19;
- extend .benchmarks.google_message3.Message0 {
- optional .benchmarks.google_message3.Message12870 field12899 = 5447656;
- }
-}
-
-message Message13154 {
- required float field13164 = 1;
- required float field13165 = 2;
- extend .benchmarks.google_message3.Message13145 {
- optional .benchmarks.google_message3.Message13154 field13166 = 47301086;
- }
-}
-
-message Message16507 {
- optional bool field16510 = 3;
- optional bool field16511 = 4;
- optional bool field16512 = 14;
- repeated string field16513 = 5;
- repeated string field16514 = 6;
- optional string field16515 = 8;
- repeated int32 field16516 = 9;
- repeated int32 field16517 = 10;
- optional int32 field16518 = 7;
- optional string field16519 = 15;
- repeated string field16520 = 11;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field16521 = 27;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field16522 = 22;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field16523 = 28;
- optional string field16524 = 18;
- optional int32 field16525 = 19;
- optional int32 field16526 = 20;
- optional .benchmarks.google_message3.UnusedEmptyMessage field16527 = 23;
- optional bool field16528 = 24;
- repeated string field16529 = 25;
- optional double field16530 = 26;
- optional .benchmarks.google_message3.Message16478 field16531 = 30;
- optional bool field16532 = 31;
- optional string field16533 = 32;
- optional bool field16534 = 33;
- optional bool field16535 = 35;
- optional bool field16536 = 36;
- optional bool field16537 = 37;
- optional bool field16538 = 38;
- optional bool field16539 = 39;
- optional bool field16540 = 40;
- repeated string field16541 = 41;
- extensions 21 to 21;
- extend .benchmarks.google_message3.Message0 {
- optional .benchmarks.google_message3.Message16507 field16542 = 5569941;
- }
-}
-
-message Message16564 {
- repeated .benchmarks.google_message3.Message16552 field16568 = 1;
- extend .benchmarks.google_message3.Message0 {
- optional .benchmarks.google_message3.Message16564 field16569 = 25830030;
- }
-}
-
-message Message16661 {
- repeated .benchmarks.google_message3.Message16660 field16671 = 1;
- repeated uint64 field16672 = 2;
- extend .benchmarks.google_message3.Message0 {
- optional .benchmarks.google_message3.Message16661 field16673 = 31274398;
- }
-}
-
-message Message16746 {
- repeated .benchmarks.google_message3.Message16727 field16806 = 1;
- optional bool field16807 = 2;
- optional bool field16808 = 3;
- repeated .benchmarks.google_message3.Message16725 field16809 = 4;
- extend .benchmarks.google_message3.Message0 {
- optional .benchmarks.google_message3.Message16746 field16810 = 28406765;
- }
-}
-
-message Message17786 {
- repeated group Message17787 = 1 {
- required int32 field18177 = 2;
- required int32 field18178 = 3;
- optional .benchmarks.google_message3.Message17783 field18179 = 4;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18180 = 5;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18181 = 6;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field18182 = 8;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18183 = 9;
- optional .benchmarks.google_message3.Message17726 field18184 = 10;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18185 = 11;
- optional .benchmarks.google_message3.Message16945 field18186 = 102;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18187 = 12;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18188 = 13;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18189 = 7;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18190 = 100;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18191 = 101;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18192 = 14;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18193 = 19;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18194 = 22;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18195 = 24;
- optional .benchmarks.google_message3.Enum16925 field18196 = 21;
- optional bool field18197 = 18;
- repeated .benchmarks.google_message3.UnusedEnum field18198 = 23;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18199 = 15;
- optional string field18200 = 16;
- optional string field18201 = 17;
- optional bool field18202 = 99;
- }
- repeated .benchmarks.google_message3.Message17782 field18175 = 20;
- extend .benchmarks.google_message3.Message0 {
- optional .benchmarks.google_message3.Message17786 field18176 = 11823055;
- }
-}
-
-message Message22857 {
- repeated .benchmarks.google_message3.Message22853 field22874 = 1;
- extend .benchmarks.google_message3.Message10155 {
- optional .benchmarks.google_message3.Message22857 field22875 = 67799715;
- }
-}
-
-message Message24404 {
- repeated group Message24405 = 1 {
- required int32 field24686 = 2;
- required int32 field24687 = 3;
- optional .benchmarks.google_message3.Message24317 field24688 = 4;
- optional .benchmarks.google_message3.UnusedEmptyMessage field24689 = 5;
- optional .benchmarks.google_message3.Message24376 field24690 = 6;
- optional .benchmarks.google_message3.Message24345 field24691 = 7;
- optional .benchmarks.google_message3.UnusedEmptyMessage field24692 = 8;
- optional .benchmarks.google_message3.Message24379 field24693 = 9;
- optional .benchmarks.google_message3.UnusedEmptyMessage field24694 = 10;
- optional .benchmarks.google_message3.UnusedEmptyMessage field24695 = 11;
- optional .benchmarks.google_message3.Message24391 field24696 = 12;
- optional .benchmarks.google_message3.UnusedEmptyMessage field24697 = 13;
- optional .benchmarks.google_message3.UnusedEmptyMessage field24698 = 14;
- optional .benchmarks.google_message3.UnusedEmptyMessage field24699 = 22;
- optional .benchmarks.google_message3.UnusedEmptyMessage field24700 = 23;
- optional .benchmarks.google_message3.UnusedEmptyMessage field24701 = 25;
- optional .benchmarks.google_message3.Enum16925 field24702 = 18;
- optional float field24703 = 20;
- optional bool field24704 = 19;
- repeated .benchmarks.google_message3.Enum16891 field24705 = 24;
- optional .benchmarks.google_message3.UnusedEmptyMessage field24706 = 15;
- optional string field24707 = 16;
- optional string field24708 = 17;
- optional float field24709 = 21;
- optional bool field24710 = 26;
- optional .benchmarks.google_message3.UnusedEnum field24711 = 27;
- optional bool field24712 = 28;
- optional .benchmarks.google_message3.UnusedEnum field24713 = 29;
- optional bool field24714 = 31;
- optional bool field24715 = 99;
- optional int64 field24716 = 32;
- }
- optional .benchmarks.google_message3.Message24403 field24684 = 30;
- extend .benchmarks.google_message3.Message0 {
- optional .benchmarks.google_message3.Message24404 field24685 = 9129287;
- }
-}
-
-message Message27300 {
- repeated .benchmarks.google_message3.UnusedEmptyMessage field27302 = 1;
- optional string field27303 = 2;
- extend .benchmarks.google_message3.Message0 {
- optional .benchmarks.google_message3.Message27300 field27304 = 24956467;
- }
-}
-
-message Message27453 {
- optional string field27459 = 15;
- repeated string field27460 = 1;
- repeated float field27461 = 6;
- repeated int32 field27462 = 27;
- repeated int32 field27463 = 28;
- repeated .benchmarks.google_message3.Message27454 field27464 = 24;
- repeated string field27465 = 2;
- repeated float field27466 = 7;
- repeated string field27467 = 22;
- repeated string field27468 = 23;
- optional string field27469 = 26;
- repeated .benchmarks.google_message3.Message27357 field27470 = 8;
- optional .benchmarks.google_message3.Message27360 field27471 = 16;
- optional string field27472 = 25;
- optional string field27473 = 11;
- optional bool field27474 = 13;
- optional bool field27475 = 14;
- optional bool field27476 = 17;
- optional .benchmarks.google_message3.UnusedEmptyMessage field27477 = 12;
- optional bool field27478 = 34268945;
- optional bool field27479 = 20;
- optional string field27480 = 21;
- optional .benchmarks.google_message3.UnusedEmptyMessage field27481 = 10;
- extend .benchmarks.google_message3.Message0 {
- optional .benchmarks.google_message3.Message27453 field27482 = 8086204;
- }
-}
-
-extend .benchmarks.google_message3.Message16945 {
- optional string field17026 = 472;
- repeated string field17027 = 818;
- optional .benchmarks.google_message3.Message0 field17031 = 215;
- repeated .benchmarks.google_message3.Message0 field17032 = 292;
- repeated .benchmarks.google_message3.Message0 field17038 = 234;
- repeated .benchmarks.google_message3.Message0 field17039 = 235;
- optional .benchmarks.google_message3.Message0 field17042 = 246;
- optional string field17043 = 224;
- optional string field17044 = 225;
- repeated string field17048 = 63;
- repeated string field17049 = 64;
- repeated .benchmarks.google_message3.Message0 field17052 = 233;
- repeated .benchmarks.google_message3.Message0 field17053 = 66;
- repeated string field17056 = 275;
- optional string field17057 = 226;
- repeated .benchmarks.google_message3.Message0 field17060 = 27;
- repeated string field17073 = 75;
- repeated .benchmarks.google_message3.Message0 field17076 = 77;
- repeated string field17078 = 296;
- repeated .benchmarks.google_message3.Message0 field17082 = 160;
- repeated .benchmarks.google_message3.Message0 field17091 = 585;
- repeated .benchmarks.google_message3.Message0 field17098 = 987;
- repeated .benchmarks.google_message3.Message0 field17101 = 157;
- repeated string field17102 = 158;
- repeated string field17107 = 166;
- repeated string field17133 = 567;
- repeated string field17134 = 572;
- repeated string field17160 = 49;
- repeated string field17168 = 32;
- repeated string field17170 = 34;
- repeated .benchmarks.google_message3.Message0 field17172 = 509;
- repeated string field17174 = 39;
- repeated .benchmarks.google_message3.Message0 field17175 = 40;
- repeated .benchmarks.google_message3.Message0 field17178 = 511;
- repeated .benchmarks.google_message3.Message0 field17185 = 50;
- repeated int32 field17207 = 1081;
- repeated .benchmarks.google_message3.Message0 field17238 = 184;
- repeated .benchmarks.google_message3.Message0 field17289 = 177;
- repeated .benchmarks.google_message3.Message0 field17290 = 178;
- repeated .benchmarks.google_message3.Message0 field17296 = 474;
- repeated string field17298 = 44;
- repeated .benchmarks.google_message3.Message0 field17301 = 47;
- optional .benchmarks.google_message3.Message0 field17412 = 21;
- repeated .benchmarks.google_message3.Message0 field17438 = 132;
- repeated .benchmarks.google_message3.Message0 field17458 = 512;
- repeated string field17460 = 560;
- repeated string field17466 = 552;
- repeated .benchmarks.google_message3.Message0 field17617 = 1080;
- repeated int32 field17618 = 1084;
-}
diff --git a/benchmarks/datasets/google_message3/benchmark_message3_1.proto b/benchmarks/datasets/google_message3/benchmark_message3_1.proto
deleted file mode 100644
index 1ee5c9e..0000000
--- a/benchmarks/datasets/google_message3/benchmark_message3_1.proto
+++ /dev/null
@@ -1,1298 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// LINT: ALLOW_GROUPS
-
-syntax = "proto2";
-
-package benchmarks.google_message3;
-
-import "datasets/google_message3/benchmark_message3_2.proto";
-import "datasets/google_message3/benchmark_message3_3.proto";
-import "datasets/google_message3/benchmark_message3_5.proto";
-import "datasets/google_message3/benchmark_message3_7.proto";
-import "datasets/google_message3/benchmark_message3_8.proto";
-
-option cc_enable_arenas = true;
-option java_package = "com.google.protobuf.benchmarks";
-
-message Message34390 {
- repeated .benchmarks.google_message3.Message34387 field34452 = 1;
- extend .benchmarks.google_message3.Message0 {
- optional .benchmarks.google_message3.Message34390 field34453 = 92144610;
- }
-}
-
-message Message34624 {
- optional .benchmarks.google_message3.Message34621 field34683 = 1;
- optional .benchmarks.google_message3.Message34621 field34684 = 2;
- extend .benchmarks.google_message3.Message0 {
- optional .benchmarks.google_message3.Message34624 field34685 = 18178548;
- }
-}
-
-message Message34791 {
- optional fixed64 field34793 = 1;
- repeated group Message34792 = 2 {
- required string field34808 = 3;
- optional string field34809 = 4;
- }
- optional int32 field34795 = 5;
- optional int32 field34796 = 6;
- optional int32 field34797 = 7;
- optional int32 field34798 = 8;
- optional int32 field34799 = 9;
- optional int32 field34800 = 10;
- optional bool field34801 = 11;
- optional float field34802 = 12;
- optional int32 field34803 = 13;
- optional string field34804 = 14;
- optional int64 field34805 = 15;
- repeated fixed64 field34806 = 17 [packed = true];
- extend .benchmarks.google_message3.Message0 {
- optional .benchmarks.google_message3.Message34791 field34807 = 6330340;
- }
-}
-
-message Message35483 {
- optional int32 field35499 = 1;
- optional string field35500 = 2;
- optional string field35501 = 3;
- optional string field35502 = 4;
- repeated .benchmarks.google_message3.Message35476 field35503 = 5;
- optional .benchmarks.google_message3.UnusedEmptyMessage field35504 = 6;
- extend .benchmarks.google_message3.Message0 {
- optional .benchmarks.google_message3.Message35483 field35505 = 7913554;
- }
-}
-
-message Message35807 {
- optional int32 field35810 = 1;
- optional int32 field35811 = 2;
- optional int32 field35812 = 3;
- optional int32 field35813 = 4;
- optional int32 field35814 = 5;
- optional int32 field35815 = 6;
- optional int32 field35816 = 7;
- optional int32 field35817 = 8;
- extend .benchmarks.google_message3.Message0 {
- optional .benchmarks.google_message3.Message35807 field35818 = 3803299;
- }
-}
-
-message Message37487 {
- optional bytes field37501 = 2;
- optional bool field37502 = 3;
-}
-
-message Message13062 {
- optional int64 field13075 = 1;
- optional string field13076 = 2;
- optional int32 field13077 = 3;
- optional string field13078 = 4;
- optional int32 field13079 = 5;
-}
-
-message Message952 {
- repeated .benchmarks.google_message3.Message949 field963 = 1;
-}
-
-message Message36876 {
- optional .benchmarks.google_message3.Message2356 field36980 = 1;
- repeated group Message36877 = 111 {
- required string field37044 = 112;
- optional int32 field37045 = 113;
- optional bytes field37046 = 114;
- optional int32 field37047 = 115;
- optional int32 field37048 = 157;
- }
- repeated group Message36878 = 168 {}
- repeated group Message36879 = 55 {
- required string field37050 = 56;
- optional int32 field37051 = 69;
- }
- repeated .benchmarks.google_message3.UnusedEmptyMessage field36984 = 78;
- optional group Message36880 = 137 {}
- optional uint64 field36986 = 59;
- optional bytes field36987 = 121;
- optional .benchmarks.google_message3.UnusedEmptyMessage field36988 = 2;
- optional .benchmarks.google_message3.Message7029 field36989 = 118;
- optional .benchmarks.google_message3.Message35573 field36990 = 11;
- optional .benchmarks.google_message3.UnusedEmptyMessage field36991 = 21;
- optional .benchmarks.google_message3.UnusedEmptyMessage field36992 = 22;
- optional float field36993 = 13;
- optional int32 field36994 = 20;
- optional bool field36995 = 51;
- optional bool field36996 = 57;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field36997 = 100;
- optional int32 field36998 = 47;
- optional int32 field36999 = 48;
- optional .benchmarks.google_message3.UnusedEmptyMessage field37000 = 68;
- repeated group Message36881 = 23 {}
- optional .benchmarks.google_message3.Message4144 field37002 = 125;
- repeated group Message36882 = 35 {}
- optional .benchmarks.google_message3.UnusedEmptyMessage field37004 = 49;
- optional .benchmarks.google_message3.Message18921 field37005 = 52;
- optional .benchmarks.google_message3.Message36858 field37006 = 46;
- optional .benchmarks.google_message3.Message18831 field37007 = 54;
- optional .benchmarks.google_message3.UnusedEmptyMessage field37008 = 58;
- optional .benchmarks.google_message3.Message18283 field37009 = 10;
- optional string field37010 = 44;
- optional string field37011 = 103;
- optional .benchmarks.google_message3.Message0 field37012 = 43;
- optional .benchmarks.google_message3.Message0 field37013 = 143;
- optional .benchmarks.google_message3.UnusedEmptyMessage field37014 = 53;
- optional .benchmarks.google_message3.Message36869 field37015 = 15;
- optional group Message36883 = 3 {}
- repeated group Message36884 = 16 {}
- repeated group Message36885 = 27 {}
- optional group Message36886 = 32 {}
- repeated .benchmarks.google_message3.UnusedEnum field37020 = 71;
- repeated int32 field37021 = 70;
- optional .benchmarks.google_message3.UnusedEmptyMessage field37022 = 66;
- optional .benchmarks.google_message3.Message13090 field37023 = 67;
- optional group Message36887 = 62 {}
- repeated .benchmarks.google_message3.Message10155 field37025 = 50;
- repeated .benchmarks.google_message3.Message11874 field37026 = 151;
- optional string field37027 = 12;
- optional int64 field37028 = 72;
- optional .benchmarks.google_message3.UnusedEmptyMessage field37029 = 73;
- optional .benchmarks.google_message3.Message35546 field37030 = 108;
- optional group Message36888 = 74 {
- optional uint64 field37089 = 75;
- optional bool field37090 = 76;
- optional uint64 field37091 = 165;
- optional double field37092 = 166;
- optional uint64 field37093 = 109;
- optional bytes field37094 = 122;
- }
- repeated .benchmarks.google_message3.Message19255 field37032 = 104;
- optional .benchmarks.google_message3.Message33968 field37033 = 105;
- optional bool field37034 = 106;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field37035 = 107;
- optional .benchmarks.google_message3.Message6644 field37036 = 110;
- optional bytes field37037 = 133;
- optional group Message36889 = 116 {
- optional int64 field37095 = 117;
- optional string field37096 = 145;
- optional int32 field37097 = 123;
- optional bool field37098 = 163;
- optional int32 field37099 = 164;
- optional int32 field37100 = 149;
- optional .benchmarks.google_message3.UnusedEmptyMessage field37101 = 129;
- optional .benchmarks.google_message3.Message13174 field37102 = 124;
- optional .benchmarks.google_message3.Message13169 field37103 = 128;
- optional uint64 field37104 = 132;
- repeated .benchmarks.google_message3.Enum36890 field37105 = 131;
- optional bool field37106 = 134;
- optional bool field37107 = 140;
- optional .benchmarks.google_message3.UnusedEmptyMessage field37108 = 135;
- optional float field37109 = 136;
- optional float field37110 = 156;
- optional bool field37111 = 142;
- optional int64 field37112 = 167;
- optional .benchmarks.google_message3.UnusedEmptyMessage field37113 = 146;
- optional bool field37114 = 148;
- optional .benchmarks.google_message3.UnusedEmptyMessage field37115 = 154;
- optional .benchmarks.google_message3.UnusedEnum field37116 = 158;
- repeated .benchmarks.google_message3.UnusedEnum field37117 = 159;
- optional int32 field37118 = 160;
- repeated string field37119 = 161;
- }
- repeated group Message36910 = 119 {}
- optional group Message36911 = 126 {
- optional .benchmarks.google_message3.UnusedEmptyMessage field37121 = 127;
- optional .benchmarks.google_message3.Message35538 field37122 = 130;
- optional .benchmarks.google_message3.Message35540 field37123 = 144;
- optional .benchmarks.google_message3.Message35542 field37124 = 150;
- }
- optional group Message36912 = 152 {
- optional .benchmarks.google_message3.Message3901 field37125 = 153;
- optional .benchmarks.google_message3.Message3901 field37126 = 162;
- }
- optional .benchmarks.google_message3.UnusedEmptyMessage field37042 = 155;
-}
-
-message Message1328 {}
-
-message Message6850 {}
-
-message Message6863 {
- optional .benchmarks.google_message3.Enum6858 field6931 = 1;
- optional .benchmarks.google_message3.Enum6858 field6932 = 2;
- optional .benchmarks.google_message3.UnusedEnum field6933 = 36;
- optional bool field6934 = 27;
- optional .benchmarks.google_message3.Message6773 field6935 = 26;
- optional int32 field6936 = 30;
- optional int32 field6937 = 37;
- optional .benchmarks.google_message3.Enum6815 field6938 = 31;
- optional string field6939 = 3;
- optional int32 field6940 = 4;
- optional .benchmarks.google_message3.Enum6822 field6941 = 15;
- optional bool field6942 = 10;
- optional bool field6943 = 17;
- optional float field6944 = 18;
- optional float field6945 = 19;
- optional int32 field6946 = 5;
- optional int32 field6947 = 6;
- optional bool field6948 = 7;
- optional int32 field6949 = 12;
- optional .benchmarks.google_message3.UnusedEmptyMessage field6950 = 8;
- optional uint64 field6951 = 9;
- optional string field6952 = 11;
- optional bytes field6953 = 13;
- optional int32 field6954 = 14;
- optional .benchmarks.google_message3.UnusedEmptyMessage field6955 = 16;
- optional .benchmarks.google_message3.UnusedEmptyMessage field6956 = 22;
- optional .benchmarks.google_message3.Message3886 field6957 = 38;
- optional string field6958 = 20;
- optional uint32 field6959 = 21;
- optional .benchmarks.google_message3.Message6743 field6960 = 23;
- optional .benchmarks.google_message3.UnusedEmptyMessage field6961 = 29;
- optional .benchmarks.google_message3.UnusedEmptyMessage field6962 = 33;
- optional bool field6963 = 34;
-}
-
-message Message6871 {}
-
-message Message7547 {
- required bytes field7549 = 1;
- required int32 field7550 = 2;
-}
-
-message Message7648 {
- optional string field7669 = 1;
- optional int32 field7670 = 2;
- optional int32 field7671 = 3;
- optional int32 field7672 = 4;
- optional int32 field7673 = 5;
- optional int32 field7674 = 6;
- optional float field7675 = 7;
- optional bool field7676 = 8;
- optional bool field7677 = 9;
- optional bool field7678 = 10;
- optional bool field7679 = 11;
- optional bool field7680 = 12;
-}
-
-message Message7865 {}
-
-message Message7928 {
- optional string field7940 = 1;
- optional int64 field7941 = 2;
-}
-
-message Message7919 {
- optional fixed64 field7931 = 1;
- optional int64 field7932 = 2;
- optional bytes field7933 = 3;
-}
-
-message Message7920 {
- optional int64 field7934 = 1;
- optional int64 field7935 = 2;
-}
-
-message Message7921 {
- optional int32 field7936 = 1;
- optional int64 field7937 = 2;
- optional float field7938 = 3;
- optional .benchmarks.google_message3.UnusedEnum field7939 = 4;
-}
-
-message Message8511 {
- optional .benchmarks.google_message3.Message8224 field8539 = 1;
- optional string field8540 = 2;
- optional bool field8541 = 3;
- optional int64 field8542 = 4;
- optional string field8543 = 5;
-}
-
-message Message8512 {
- optional .benchmarks.google_message3.Message8301 field8544 = 1;
- optional .benchmarks.google_message3.Message8302 field8545 = 2;
- optional string field8546 = 3;
- optional bool field8547 = 4;
- optional int64 field8548 = 5;
- optional string field8549 = 6;
-}
-
-message Message8513 {
- repeated .benchmarks.google_message3.Message8392 field8550 = 1;
- optional string field8551 = 2;
- optional bool field8552 = 3;
- optional string field8553 = 4;
-}
-
-message Message8514 {
- optional string field8554 = 1;
- optional int64 field8555 = 2;
- optional bool field8556 = 3;
- repeated .benchmarks.google_message3.Message8130 field8557 = 4;
- optional string field8558 = 5;
-}
-
-message Message8515 {
- optional .benchmarks.google_message3.Message8479 field8559 = 1;
- optional .benchmarks.google_message3.Message8478 field8560 = 2;
- optional string field8561 = 3;
-}
-
-message Message10320 {
- optional .benchmarks.google_message3.Enum10335 field10347 = 1;
- repeated .benchmarks.google_message3.Message10319 field10348 = 2;
- optional int32 field10349 = 3;
- optional int32 field10350 = 4;
- optional int32 field10351 = 5;
- optional int32 field10352 = 6;
- optional .benchmarks.google_message3.Enum10337 field10353 = 7;
-}
-
-message Message10321 {
- optional int32 field10354 = 1;
- optional int32 field10355 = 2;
- optional uint64 field10356 = 3;
-}
-
-message Message10322 {
- optional .benchmarks.google_message3.Message4016 field10357 = 1;
- optional bool field10358 = 2;
- optional bool field10359 = 3;
-}
-
-message Message11988 {
- optional string field12021 = 1;
- optional string field12022 = 2;
- optional .benchmarks.google_message3.UnusedEmptyMessage field12023 = 3;
- optional .benchmarks.google_message3.Message10155 field12024 = 4;
-}
-
-message Message12668 {
- repeated .benchmarks.google_message3.Message12669 field12677 = 1;
- optional int32 field12678 = 2;
- optional int32 field12679 = 3;
- optional int32 field12680 = 4;
-}
-
-message Message12825 {
- repeated .benchmarks.google_message3.Message12818 field12862 = 1;
- optional int32 field12863 = 2;
- optional .benchmarks.google_message3.Message12819 field12864 = 3;
- optional .benchmarks.google_message3.Message12820 field12865 = 4;
- optional int32 field12866 = 5;
- repeated .benchmarks.google_message3.Message12821 field12867 = 6;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field12868 = 7;
-}
-
-message Message16478 {
- repeated .benchmarks.google_message3.Message16479 field16481 = 1;
- optional bool field16482 = 3;
- optional int32 field16483 = 2;
-}
-
-message Message16552 {
- optional fixed64 field16565 = 1;
- optional int32 field16566 = 2;
- optional .benchmarks.google_message3.Enum16553 field16567 = 3;
-}
-
-message Message16660 {
- optional string field16668 = 1;
- optional string field16669 = 2;
- optional int32 field16670 = 3;
-}
-
-message Message16727 {
- required .benchmarks.google_message3.Enum16728 field16782 = 1;
- required string field16783 = 2;
- optional string field16784 = 3;
- optional int32 field16785 = 23;
- required string field16786 = 4;
- optional string field16787 = 5;
- optional string field16788 = 6;
- required .benchmarks.google_message3.Enum16732 field16789 = 7;
- optional string field16790 = 8;
- optional string field16791 = 9;
- optional string field16792 = 10;
- optional .benchmarks.google_message3.Enum16738 field16793 = 11;
- optional int32 field16794 = 12;
- repeated .benchmarks.google_message3.Message16722 field16795 = 13;
- optional bool field16796 = 19;
- optional bool field16797 = 24;
- optional string field16798 = 14;
- optional int64 field16799 = 15;
- optional bool field16800 = 16;
- optional string field16801 = 17;
- optional .benchmarks.google_message3.Enum16698 field16802 = 18;
- optional .benchmarks.google_message3.Message16724 field16803 = 20;
- optional bool field16804 = 22;
- optional .benchmarks.google_message3.UnusedEmptyMessage field16805 = 25;
- extensions 1000 to 536870911;
-}
-
-message Message16725 {
- optional .benchmarks.google_message3.Enum16728 field16774 = 1;
- repeated string field16775 = 2;
-}
-
-message Message17726 {
- optional string field17801 = 1;
- repeated string field17802 = 2;
- optional string field17803 = 3;
- repeated string field17804 = 4;
- optional string field17805 = 5;
- repeated string field17806 = 6;
- optional string field17807 = 7;
- optional string field17808 = 8;
- repeated string field17809 = 15;
- repeated string field17810 = 16;
- repeated string field17811 = 17;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field17812 = 18;
- optional string field17813 = 9;
- optional string field17814 = 10;
- optional string field17815 = 11;
- optional string field17816 = 12;
- optional string field17817 = 13;
- optional string field17818 = 14;
- optional string field17819 = 19;
- repeated .benchmarks.google_message3.Message17728 field17820 = 20;
- repeated .benchmarks.google_message3.Message17728 field17821 = 21;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field17822 = 30;
-}
-
-message Message17782 {
- optional string field18153 = 1;
- optional string field18154 = 2;
-}
-
-message Message17783 {
- optional string field18155 = 1;
- optional string field18156 = 2;
- optional string field18157 = 3;
- repeated group Message17784 = 4 {
- optional string field18162 = 5;
- optional string field18163 = 6;
- optional string field18164 = 7;
- repeated string field18165 = 8;
- optional string field18166 = 17;
- optional string field18167 = 18;
- }
- repeated group Message17785 = 9 {
- optional string field18168 = 10;
- optional string field18169 = 11;
- optional .benchmarks.google_message3.Message17783 field18170 = 12;
- optional string field18171 = 13;
- optional string field18172 = 14;
- repeated string field18173 = 15;
- }
- repeated string field18160 = 16;
-}
-
-message Message16945 {
- optional string field16946 = 1;
- optional string field16947 = 2;
- optional string field16948 = 3;
- optional string field16949 = 4;
- optional string field16950 = 5;
- optional .benchmarks.google_message3.UnusedEmptyMessage field16951 = 872;
- repeated .benchmarks.google_message3.Message0 field16952 = 16;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field16953 = 54;
- repeated .benchmarks.google_message3.Message0 field16954 = 55;
- repeated string field16955 = 58;
- repeated string field16956 = 59;
- repeated string field16957 = 62;
- repeated string field16958 = 37;
- repeated string field16959 = 18;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field16960 = 38;
- repeated .benchmarks.google_message3.Message0 field16961 = 67;
- repeated .benchmarks.google_message3.Message0 field16962 = 130;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field16963 = 136;
- repeated string field16964 = 138;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field16965 = 156;
- repeated string field16966 = 139;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field16967 = 126;
- repeated string field16968 = 152;
- repeated .benchmarks.google_message3.Message0 field16969 = 183;
- repeated string field16970 = 168;
- repeated string field16971 = 212;
- repeated string field16972 = 213;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field16973 = 189;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field16974 = 190;
- repeated string field16975 = 191;
- repeated string field16976 = 192;
- repeated .benchmarks.google_message3.Message0 field16977 = 193;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field16978 = 194;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field16979 = 195;
- repeated int32 field16980 = 196;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field16981 = 95;
- repeated string field16982 = 96;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field16983 = 97;
- repeated string field16984 = 1086;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field16985 = 98;
- repeated string field16986 = 99;
- repeated string field16987 = 100;
- repeated string field16988 = 48;
- optional string field16989 = 22;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field16990 = 51;
- repeated string field16991 = 81;
- repeated string field16992 = 85;
- repeated string field16993 = 169;
- optional .benchmarks.google_message3.UnusedEmptyMessage field16994 = 260;
- optional int32 field16995 = 198;
- optional int32 field16996 = 204;
- optional string field16997 = 1087;
- repeated string field16998 = 197;
- repeated string field16999 = 206;
- optional string field17000 = 211;
- repeated string field17001 = 205;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field17002 = 68;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field17003 = 69;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field17004 = 70;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field17005 = 71;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field17006 = 72;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field17007 = 19;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field17008 = 24;
- optional .benchmarks.google_message3.UnusedEmptyMessage field17009 = 23;
- repeated .benchmarks.google_message3.Message0 field17010 = 131;
- repeated string field17011 = 133;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field17012 = 142;
- repeated string field17013 = 143;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field17014 = 153;
- repeated .benchmarks.google_message3.Message0 field17015 = 170;
- repeated string field17016 = 171;
- repeated string field17017 = 172;
- repeated string field17018 = 173;
- repeated string field17019 = 174;
- repeated string field17020 = 175;
- repeated string field17021 = 186;
- repeated string field17022 = 101;
- repeated .benchmarks.google_message3.Message0 field17023 = 102;
- repeated string field17024 = 274;
- extensions 17 to 17;
- extensions 21 to 21;
- extensions 25 to 25;
- extensions 27 to 27;
- extensions 29 to 29;
- extensions 30 to 30;
- extensions 31 to 31;
- extensions 32 to 32;
- extensions 33 to 33;
- extensions 34 to 34;
- extensions 35 to 35;
- extensions 36 to 36;
- extensions 39 to 39;
- extensions 40 to 40;
- extensions 41 to 41;
- extensions 42 to 42;
- extensions 43 to 43;
- extensions 44 to 44;
- extensions 45 to 45;
- extensions 46 to 46;
- extensions 47 to 47;
- extensions 49 to 49;
- extensions 50 to 50;
- extensions 52 to 52;
- extensions 53 to 53;
- extensions 56 to 56;
- extensions 57 to 57;
- extensions 60 to 60;
- extensions 61 to 61;
- extensions 63 to 63;
- extensions 64 to 64;
- extensions 65 to 65;
- extensions 66 to 66;
- extensions 73 to 73;
- extensions 74 to 74;
- extensions 75 to 75;
- extensions 76 to 76;
- extensions 77 to 77;
- extensions 78 to 78;
- extensions 79 to 79;
- extensions 80 to 80;
- extensions 82 to 82;
- extensions 83 to 83;
- extensions 84 to 84;
- extensions 86 to 86;
- extensions 87 to 87;
- extensions 88 to 88;
- extensions 89 to 89;
- extensions 90 to 90;
- extensions 91 to 91;
- extensions 92 to 92;
- extensions 93 to 93;
- extensions 94 to 94;
- extensions 103 to 103;
- extensions 104 to 104;
- extensions 105 to 105;
- extensions 106 to 106;
- extensions 107 to 107;
- extensions 108 to 108;
- extensions 109 to 109;
- extensions 110 to 110;
- extensions 111 to 111;
- extensions 112 to 112;
- extensions 113 to 113;
- extensions 114 to 114;
- extensions 115 to 115;
- extensions 116 to 116;
- extensions 117 to 117;
- extensions 118 to 118;
- extensions 119 to 119;
- extensions 120 to 120;
- extensions 121 to 121;
- extensions 122 to 122;
- extensions 123 to 123;
- extensions 124 to 124;
- extensions 125 to 125;
- extensions 127 to 127;
- extensions 128 to 128;
- extensions 129 to 129;
- extensions 132 to 132;
- extensions 134 to 134;
- extensions 135 to 135;
- extensions 137 to 137;
- extensions 140 to 140;
- extensions 141 to 141;
- extensions 144 to 144;
- extensions 145 to 145;
- extensions 146 to 146;
- extensions 147 to 147;
- extensions 148 to 148;
- extensions 149 to 149;
- extensions 150 to 150;
- extensions 151 to 151;
- extensions 154 to 154;
- extensions 155 to 155;
- extensions 157 to 157;
- extensions 158 to 158;
- extensions 159 to 159;
- extensions 160 to 160;
- extensions 161 to 161;
- extensions 162 to 162;
- extensions 163 to 163;
- extensions 164 to 164;
- extensions 165 to 165;
- extensions 166 to 166;
- extensions 167 to 167;
- extensions 176 to 176;
- extensions 177 to 177;
- extensions 178 to 178;
- extensions 179 to 179;
- extensions 180 to 180;
- extensions 181 to 181;
- extensions 182 to 182;
- extensions 184 to 184;
- extensions 185 to 185;
- extensions 187 to 187;
- extensions 188 to 188;
- extensions 199 to 199;
- extensions 200 to 200;
- extensions 201 to 201;
- extensions 202 to 202;
- extensions 203 to 203;
- extensions 207 to 207;
- extensions 208 to 208;
- extensions 209 to 209;
- extensions 210 to 210;
- extensions 214 to 214;
- extensions 215 to 215;
- extensions 216 to 216;
- extensions 217 to 217;
- extensions 218 to 218;
- extensions 219 to 219;
- extensions 220 to 220;
- extensions 221 to 221;
- extensions 222 to 222;
- extensions 223 to 223;
- extensions 224 to 224;
- extensions 225 to 225;
- extensions 226 to 226;
- extensions 227 to 227;
- extensions 228 to 228;
- extensions 229 to 229;
- extensions 230 to 230;
- extensions 231 to 231;
- extensions 232 to 232;
- extensions 233 to 233;
- extensions 234 to 234;
- extensions 235 to 235;
- extensions 236 to 236;
- extensions 237 to 237;
- extensions 238 to 238;
- extensions 239 to 239;
- extensions 240 to 240;
- extensions 241 to 241;
- extensions 242 to 242;
- extensions 243 to 243;
- extensions 244 to 244;
- extensions 245 to 245;
- extensions 246 to 246;
- extensions 247 to 247;
- extensions 248 to 248;
- extensions 249 to 249;
- extensions 250 to 250;
- extensions 251 to 251;
- extensions 252 to 252;
- extensions 253 to 253;
- extensions 254 to 254;
- extensions 255 to 255;
- extensions 256 to 256;
- extensions 257 to 257;
- extensions 258 to 258;
- extensions 259 to 259;
- extensions 261 to 261;
- extensions 262 to 262;
- extensions 263 to 263;
- extensions 264 to 264;
- extensions 265 to 265;
- extensions 266 to 266;
- extensions 267 to 267;
- extensions 268 to 268;
- extensions 269 to 269;
- extensions 270 to 270;
- extensions 271 to 271;
- extensions 272 to 272;
- extensions 273 to 273;
- extensions 275 to 275;
- extensions 276 to 276;
- extensions 277 to 277;
- extensions 278 to 278;
- extensions 279 to 279;
- extensions 280 to 280;
- extensions 281 to 281;
- extensions 282 to 282;
- extensions 283 to 283;
- extensions 284 to 284;
- extensions 285 to 285;
- extensions 286 to 286;
- extensions 290 to 290;
- extensions 291 to 291;
- extensions 292 to 292;
- extensions 293 to 293;
- extensions 294 to 294;
- extensions 295 to 295;
- extensions 296 to 296;
- extensions 297 to 297;
- extensions 298 to 298;
- extensions 299 to 299;
- extensions 300 to 300;
- extensions 301 to 301;
- extensions 302 to 302;
- extensions 303 to 303;
- extensions 304 to 304;
- extensions 305 to 305;
- extensions 306 to 306;
- extensions 307 to 307;
- extensions 308 to 308;
- extensions 309 to 309;
- extensions 310 to 310;
- extensions 311 to 311;
- extensions 312 to 312;
- extensions 313 to 313;
- extensions 314 to 314;
- extensions 315 to 315;
- extensions 316 to 316;
- extensions 317 to 317;
- extensions 318 to 318;
- extensions 319 to 319;
- extensions 320 to 320;
- extensions 321 to 321;
- extensions 322 to 322;
- extensions 323 to 323;
- extensions 324 to 324;
- extensions 325 to 325;
- extensions 326 to 326;
- extensions 327 to 327;
- extensions 328 to 328;
- extensions 329 to 329;
- extensions 330 to 330;
- extensions 331 to 331;
- extensions 332 to 332;
- extensions 333 to 333;
- extensions 334 to 334;
- extensions 335 to 335;
- extensions 336 to 336;
- extensions 337 to 337;
- extensions 338 to 338;
- extensions 339 to 339;
- extensions 340 to 340;
- extensions 341 to 341;
- extensions 342 to 342;
- extensions 343 to 343;
- extensions 344 to 344;
- extensions 345 to 345;
- extensions 346 to 346;
- extensions 347 to 347;
- extensions 348 to 348;
- extensions 349 to 349;
- extensions 350 to 350;
- extensions 351 to 351;
- extensions 352 to 352;
- extensions 353 to 353;
- extensions 354 to 354;
- extensions 355 to 355;
- extensions 356 to 356;
- extensions 357 to 357;
- extensions 358 to 358;
- extensions 359 to 359;
- extensions 360 to 360;
- extensions 361 to 361;
- extensions 362 to 362;
- extensions 363 to 363;
- extensions 364 to 364;
- extensions 365 to 365;
- extensions 366 to 366;
- extensions 367 to 367;
- extensions 368 to 368;
- extensions 369 to 369;
- extensions 370 to 370;
- extensions 371 to 371;
- extensions 372 to 372;
- extensions 373 to 373;
- extensions 374 to 374;
- extensions 375 to 375;
- extensions 376 to 376;
- extensions 377 to 377;
- extensions 378 to 378;
- extensions 379 to 379;
- extensions 380 to 380;
- extensions 381 to 381;
- extensions 382 to 382;
- extensions 383 to 383;
- extensions 384 to 384;
- extensions 385 to 385;
- extensions 386 to 386;
- extensions 387 to 387;
- extensions 388 to 388;
- extensions 389 to 389;
- extensions 390 to 390;
- extensions 391 to 391;
- extensions 392 to 392;
- extensions 393 to 393;
- extensions 394 to 394;
- extensions 395 to 395;
- extensions 396 to 396;
- extensions 397 to 397;
- extensions 398 to 398;
- extensions 399 to 399;
- extensions 400 to 400;
- extensions 401 to 401;
- extensions 402 to 402;
- extensions 403 to 403;
- extensions 404 to 404;
- extensions 405 to 405;
- extensions 406 to 406;
- extensions 407 to 407;
- extensions 408 to 408;
- extensions 409 to 409;
- extensions 410 to 410;
- extensions 411 to 411;
- extensions 412 to 412;
- extensions 413 to 413;
- extensions 414 to 414;
- extensions 415 to 415;
- extensions 416 to 416;
- extensions 417 to 417;
- extensions 418 to 418;
- extensions 419 to 419;
- extensions 420 to 420;
- extensions 421 to 421;
- extensions 422 to 422;
- extensions 423 to 423;
- extensions 424 to 424;
- extensions 425 to 425;
- extensions 426 to 426;
- extensions 427 to 427;
- extensions 428 to 428;
- extensions 429 to 429;
- extensions 430 to 430;
- extensions 431 to 431;
- extensions 432 to 432;
- extensions 433 to 433;
- extensions 434 to 434;
- extensions 435 to 435;
- extensions 436 to 436;
- extensions 437 to 437;
- extensions 438 to 438;
- extensions 439 to 439;
- extensions 440 to 440;
- extensions 441 to 441;
- extensions 442 to 442;
- extensions 443 to 443;
- extensions 444 to 444;
- extensions 445 to 445;
- extensions 446 to 446;
- extensions 447 to 447;
- extensions 448 to 448;
- extensions 449 to 449;
- extensions 450 to 450;
- extensions 451 to 451;
- extensions 452 to 452;
- extensions 453 to 453;
- extensions 454 to 454;
- extensions 455 to 455;
- extensions 456 to 456;
- extensions 457 to 457;
- extensions 458 to 458;
- extensions 459 to 459;
- extensions 460 to 460;
- extensions 461 to 461;
- extensions 462 to 462;
- extensions 463 to 463;
- extensions 464 to 464;
- extensions 465 to 465;
- extensions 466 to 466;
- extensions 467 to 467;
- extensions 468 to 468;
- extensions 469 to 469;
- extensions 470 to 470;
- extensions 471 to 471;
- extensions 472 to 472;
- extensions 473 to 473;
- extensions 474 to 474;
- extensions 509 to 509;
- extensions 511 to 511;
- extensions 512 to 512;
- extensions 513 to 513;
- extensions 514 to 514;
- extensions 515 to 515;
- extensions 516 to 516;
- extensions 517 to 517;
- extensions 518 to 518;
- extensions 519 to 519;
- extensions 520 to 520;
- extensions 521 to 521;
- extensions 522 to 522;
- extensions 523 to 523;
- extensions 524 to 524;
- extensions 525 to 525;
- extensions 526 to 526;
- extensions 527 to 527;
- extensions 528 to 528;
- extensions 529 to 529;
- extensions 530 to 530;
- extensions 531 to 531;
- extensions 532 to 532;
- extensions 533 to 533;
- extensions 534 to 534;
- extensions 535 to 535;
- extensions 536 to 536;
- extensions 537 to 537;
- extensions 538 to 538;
- extensions 539 to 539;
- extensions 540 to 540;
- extensions 541 to 541;
- extensions 542 to 542;
- extensions 543 to 543;
- extensions 544 to 544;
- extensions 545 to 545;
- extensions 546 to 546;
- extensions 547 to 547;
- extensions 548 to 548;
- extensions 549 to 549;
- extensions 550 to 550;
- extensions 551 to 551;
- extensions 552 to 552;
- extensions 553 to 553;
- extensions 554 to 554;
- extensions 555 to 555;
- extensions 556 to 556;
- extensions 557 to 557;
- extensions 558 to 558;
- extensions 559 to 559;
- extensions 560 to 560;
- extensions 561 to 561;
- extensions 562 to 562;
- extensions 563 to 563;
- extensions 564 to 564;
- extensions 565 to 565;
- extensions 566 to 566;
- extensions 567 to 567;
- extensions 568 to 568;
- extensions 569 to 569;
- extensions 570 to 570;
- extensions 571 to 571;
- extensions 572 to 572;
- extensions 573 to 573;
- extensions 574 to 574;
- extensions 575 to 575;
- extensions 576 to 576;
- extensions 577 to 577;
- extensions 578 to 578;
- extensions 579 to 579;
- extensions 580 to 580;
- extensions 581 to 581;
- extensions 582 to 582;
- extensions 583 to 583;
- extensions 584 to 584;
- extensions 585 to 585;
- extensions 586 to 586;
- extensions 587 to 587;
- extensions 588 to 588;
- extensions 589 to 589;
- extensions 590 to 590;
- extensions 604 to 604;
- extensions 605 to 605;
- extensions 606 to 606;
- extensions 607 to 607;
- extensions 608 to 608;
- extensions 609 to 609;
- extensions 610 to 610;
- extensions 611 to 611;
- extensions 612 to 612;
- extensions 613 to 613;
- extensions 614 to 614;
- extensions 615 to 615;
- extensions 616 to 616;
- extensions 617 to 617;
- extensions 618 to 618;
- extensions 619 to 619;
- extensions 620 to 620;
- extensions 621 to 621;
- extensions 622 to 622;
- extensions 623 to 623;
- extensions 624 to 624;
- extensions 625 to 625;
- extensions 626 to 626;
- extensions 627 to 627;
- extensions 628 to 628;
- extensions 629 to 629;
- extensions 813 to 813;
- extensions 814 to 814;
- extensions 815 to 815;
- extensions 816 to 816;
- extensions 817 to 817;
- extensions 818 to 818;
- extensions 819 to 819;
- extensions 820 to 820;
- extensions 821 to 821;
- extensions 822 to 822;
- extensions 823 to 823;
- extensions 824 to 824;
- extensions 827 to 827;
- extensions 828 to 828;
- extensions 829 to 829;
- extensions 830 to 830;
- extensions 831 to 831;
- extensions 832 to 832;
- extensions 833 to 833;
- extensions 834 to 834;
- extensions 835 to 835;
- extensions 836 to 836;
- extensions 837 to 837;
- extensions 838 to 838;
- extensions 839 to 839;
- extensions 840 to 840;
- extensions 841 to 841;
- extensions 842 to 842;
- extensions 843 to 843;
- extensions 844 to 844;
- extensions 845 to 845;
- extensions 846 to 846;
- extensions 847 to 847;
- extensions 848 to 848;
- extensions 849 to 849;
- extensions 850 to 850;
- extensions 851 to 851;
- extensions 852 to 852;
- extensions 853 to 853;
- extensions 854 to 854;
- extensions 855 to 855;
- extensions 856 to 856;
- extensions 857 to 857;
- extensions 858 to 858;
- extensions 859 to 859;
- extensions 860 to 860;
- extensions 861 to 861;
- extensions 862 to 862;
- extensions 863 to 863;
- extensions 864 to 864;
- extensions 865 to 865;
- extensions 866 to 866;
- extensions 867 to 867;
- extensions 868 to 868;
- extensions 869 to 869;
- extensions 870 to 870;
- extensions 871 to 871;
- extensions 880 to 880;
- extensions 881 to 881;
- extensions 882 to 882;
- extensions 883 to 883;
- extensions 884 to 884;
- extensions 885 to 885;
- extensions 886 to 886;
- extensions 887 to 887;
- extensions 888 to 888;
- extensions 890 to 890;
- extensions 891 to 891;
- extensions 892 to 892;
- extensions 912 to 912;
- extensions 914 to 914;
- extensions 915 to 915;
- extensions 916 to 916;
- extensions 917 to 917;
- extensions 918 to 918;
- extensions 919 to 919;
- extensions 920 to 920;
- extensions 921 to 921;
- extensions 922 to 922;
- extensions 923 to 923;
- extensions 924 to 924;
- extensions 925 to 925;
- extensions 926 to 926;
- extensions 927 to 927;
- extensions 928 to 928;
- extensions 929 to 929;
- extensions 930 to 930;
- extensions 931 to 931;
- extensions 932 to 932;
- extensions 933 to 933;
- extensions 934 to 934;
- extensions 935 to 935;
- extensions 936 to 936;
- extensions 937 to 937;
- extensions 938 to 938;
- extensions 939 to 939;
- extensions 940 to 940;
- extensions 941 to 941;
- extensions 942 to 942;
- extensions 943 to 943;
- extensions 944 to 944;
- extensions 945 to 945;
- extensions 946 to 946;
- extensions 947 to 947;
- extensions 949 to 949;
- extensions 950 to 950;
- extensions 951 to 951;
- extensions 952 to 952;
- extensions 954 to 954;
- extensions 955 to 955;
- extensions 956 to 956;
- extensions 957 to 957;
- extensions 958 to 958;
- extensions 959 to 959;
- extensions 960 to 960;
- extensions 961 to 961;
- extensions 962 to 962;
- extensions 963 to 963;
- extensions 964 to 964;
- extensions 965 to 965;
- extensions 966 to 966;
- extensions 967 to 967;
- extensions 968 to 968;
- extensions 969 to 969;
- extensions 970 to 970;
- extensions 971 to 971;
- extensions 972 to 972;
- extensions 973 to 973;
- extensions 974 to 974;
- extensions 975 to 975;
- extensions 976 to 976;
- extensions 977 to 977;
- extensions 978 to 978;
- extensions 979 to 979;
- extensions 980 to 980;
- extensions 981 to 981;
- extensions 982 to 982;
- extensions 983 to 983;
- extensions 984 to 984;
- extensions 985 to 985;
- extensions 987 to 987;
- extensions 988 to 988;
- extensions 1000 to 1000;
- extensions 1001 to 1001;
- extensions 1002 to 1002;
- extensions 1003 to 1003;
- extensions 1004 to 1004;
- extensions 1005 to 1005;
- extensions 1006 to 1006;
- extensions 1007 to 1007;
- extensions 1008 to 1008;
- extensions 1009 to 1009;
- extensions 1010 to 1010;
- extensions 1011 to 1011;
- extensions 1012 to 1012;
- extensions 1013 to 1013;
- extensions 1014 to 1014;
- extensions 1015 to 1015;
- extensions 1016 to 1016;
- extensions 1017 to 1017;
- extensions 1018 to 1018;
- extensions 1019 to 1019;
- extensions 1020 to 1020;
- extensions 1021 to 1021;
- extensions 1022 to 1022;
- extensions 1023 to 1023;
- extensions 1024 to 1024;
- extensions 1025 to 1025;
- extensions 1026 to 1026;
- extensions 1027 to 1027;
- extensions 1028 to 1028;
- extensions 1029 to 1029;
- extensions 1030 to 1030;
- extensions 1031 to 1031;
- extensions 1032 to 1032;
- extensions 1033 to 1033;
- extensions 1034 to 1034;
- extensions 1035 to 1035;
- extensions 1036 to 1036;
- extensions 1037 to 1037;
- extensions 1038 to 1038;
- extensions 1039 to 1039;
- extensions 1040 to 1040;
- extensions 1041 to 1041;
- extensions 1042 to 1042;
- extensions 1043 to 1043;
- extensions 1044 to 1044;
- extensions 1045 to 1045;
- extensions 1046 to 1046;
- extensions 1047 to 1047;
- extensions 1048 to 1048;
- extensions 1049 to 1049;
- extensions 1050 to 1050;
- extensions 1051 to 1051;
- extensions 1052 to 1052;
- extensions 1053 to 1053;
- extensions 1054 to 1054;
- extensions 1055 to 1055;
- extensions 1056 to 1056;
- extensions 1057 to 1057;
- extensions 1058 to 1058;
- extensions 1079 to 1079;
- extensions 1080 to 1080;
- extensions 1081 to 1081;
- extensions 1082 to 1082;
- extensions 1083 to 1083;
- extensions 1084 to 1084;
- extensions 1085 to 1085;
- extend .benchmarks.google_message3.Message0 {
- optional .benchmarks.google_message3.Message16945 field17025 = 22068132;
- }
-}
diff --git a/benchmarks/datasets/google_message3/benchmark_message3_2.proto b/benchmarks/datasets/google_message3/benchmark_message3_2.proto
deleted file mode 100644
index d123a72..0000000
--- a/benchmarks/datasets/google_message3/benchmark_message3_2.proto
+++ /dev/null
@@ -1,528 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// LINT: ALLOW_GROUPS
-
-syntax = "proto2";
-
-package benchmarks.google_message3;
-
-import "datasets/google_message3/benchmark_message3_3.proto";
-import "datasets/google_message3/benchmark_message3_4.proto";
-import "datasets/google_message3/benchmark_message3_5.proto";
-import "datasets/google_message3/benchmark_message3_7.proto";
-import "datasets/google_message3/benchmark_message3_8.proto";
-
-option cc_enable_arenas = true;
-option java_package = "com.google.protobuf.benchmarks";
-
-message Message22853 {
- optional .benchmarks.google_message3.Enum22854 field22869 = 1;
- repeated uint32 field22870 = 2 [packed = true];
- repeated float field22871 = 3 [packed = true];
- repeated float field22872 = 5 [packed = true];
- optional .benchmarks.google_message3.UnusedEmptyMessage field22873 = 4;
-}
-
-message Message24345 {
- optional string field24533 = 1;
- optional .benchmarks.google_message3.UnusedEnum field24534 = 22;
- optional .benchmarks.google_message3.Message24346 field24535 = 2;
- optional string field24536 = 3;
- optional string field24537 = 4;
- optional .benchmarks.google_message3.UnusedEnum field24538 = 23;
- optional string field24539 = 5;
- required string field24540 = 6;
- optional string field24541 = 7;
- optional string field24542 = 8;
- optional .benchmarks.google_message3.Message24316 field24543 = 9;
- optional .benchmarks.google_message3.Message24376 field24544 = 10;
- optional string field24545 = 11;
- optional string field24546 = 19;
- optional string field24547 = 20;
- optional string field24548 = 21;
- optional .benchmarks.google_message3.UnusedEmptyMessage field24549 = 12;
- optional .benchmarks.google_message3.UnusedEmptyMessage field24550 = 13;
- repeated string field24551 = 14;
- optional string field24552 = 15;
- optional int32 field24553 = 18;
- optional .benchmarks.google_message3.Message24379 field24554 = 16;
- optional string field24555 = 17;
- repeated .benchmarks.google_message3.Message24356 field24556 = 24;
- repeated .benchmarks.google_message3.Message24366 field24557 = 25;
-}
-
-message Message24403 {
- optional .benchmarks.google_message3.Message24401 field24681 = 1;
- optional .benchmarks.google_message3.Message24402 field24682 = 2;
-}
-
-message Message24391 {
- optional string field24631 = 1;
- optional string field24632 = 2;
- repeated string field24633 = 3;
- optional string field24634 = 4;
- repeated string field24635 = 5;
- repeated string field24636 = 16;
- optional string field24637 = 17;
- optional .benchmarks.google_message3.UnusedEmptyMessage field24638 = 25;
- optional string field24639 = 7;
- optional string field24640 = 18;
- optional string field24641 = 19;
- optional string field24642 = 20;
- optional int32 field24643 = 24;
- optional .benchmarks.google_message3.Message24379 field24644 = 8;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field24645 = 9;
- optional .benchmarks.google_message3.UnusedEmptyMessage field24646 = 10;
- optional .benchmarks.google_message3.UnusedEmptyMessage field24647 = 11;
- optional .benchmarks.google_message3.UnusedEmptyMessage field24648 = 12;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field24649 = 13;
- optional .benchmarks.google_message3.UnusedEmptyMessage field24650 = 14;
- optional string field24651 = 21;
- optional int32 field24652 = 22;
- optional int32 field24653 = 23;
- repeated string field24654 = 15;
- repeated string field24655 = 6;
-}
-
-message Message27454 {}
-
-message Message27357 {
- optional string field27410 = 1;
- optional float field27411 = 2;
- optional string field27412 = 3;
- optional bool field27413 = 4;
- optional bool field27414 = 5;
-}
-
-message Message27360 {
- optional .benchmarks.google_message3.Message27358 field27426 = 1;
- optional .benchmarks.google_message3.Enum27361 field27427 = 2;
- optional .benchmarks.google_message3.Message27358 field27428 = 3;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field27429 = 4;
-}
-
-message Message34387 {
- optional string field34446 = 1;
- repeated .benchmarks.google_message3.Message34381 field34447 = 2;
- optional .benchmarks.google_message3.UnusedEnum field34448 = 3;
- optional .benchmarks.google_message3.Enum34388 field34449 = 4;
- optional int64 field34450 = 5;
-}
-
-message Message34621 {
- optional double field34651 = 1;
- optional double field34652 = 2;
- optional double field34653 = 3;
- optional double field34654 = 4;
- optional double field34655 = 11;
- optional .benchmarks.google_message3.UnusedEmptyMessage field34656 = 13;
- optional .benchmarks.google_message3.Message34619 field34657 = 14;
- optional string field34658 = 5;
- optional string field34659 = 9;
- optional double field34660 = 12;
- optional bytes field34661 = 19;
- optional string field34662 = 15;
- optional string field34663 = 16;
- optional string field34664 = 17;
- optional .benchmarks.google_message3.UnusedEmptyMessage field34665 = 18;
- optional .benchmarks.google_message3.Message34621 field34666 = 20;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field34667 = 100;
- optional .benchmarks.google_message3.UnusedEmptyMessage field34668 = 101;
- extend .benchmarks.google_message3.Message0 {
- optional .benchmarks.google_message3.Message34621 field34669 = 17562023;
- }
-}
-
-message Message35476 {
- optional string field35484 = 1;
- optional string field35485 = 2;
- optional string field35486 = 3;
- optional .benchmarks.google_message3.Enum35477 field35487 = 4;
- optional float field35488 = 5;
- optional float field35489 = 6;
- optional float field35490 = 7;
- optional float field35491 = 8;
- optional .benchmarks.google_message3.UnusedEmptyMessage field35492 = 9;
- optional int32 field35493 = 10;
- optional int32 field35494 = 11;
- optional int32 field35495 = 12;
- optional string field35496 = 13;
- optional string field35497 = 14;
-}
-
-message Message949 {
- optional string field955 = 1;
- optional int64 field956 = 2;
- optional int64 field957 = 3;
- optional .benchmarks.google_message3.Message730 field958 = 4;
- repeated string field959 = 5;
- optional string field960 = 6;
- optional bool field961 = 7;
-}
-
-message Message36869 {
- optional int32 field36970 = 1;
- optional int32 field36971 = 2;
-}
-
-message Message33968 {
- repeated group Message33969 = 1 {}
- repeated .benchmarks.google_message3.Message33958 field33989 = 3;
- optional .benchmarks.google_message3.UnusedEmptyMessage field33990 = 106;
- optional bool field33991 = 108;
- optional .benchmarks.google_message3.UnusedEnum field33992 = 107;
-}
-
-message Message6644 {
- optional .benchmarks.google_message3.UnusedEmptyMessage field6701 = 8;
- optional string field6702 = 1;
- optional double field6703 = 2;
- optional .benchmarks.google_message3.UnusedEmptyMessage field6704 = 9;
- optional bytes field6705 = 3;
- optional bytes field6706 = 19;
- optional .benchmarks.google_message3.Message6637 field6707 = 4;
- repeated .benchmarks.google_message3.Message6126 field6708 = 18;
- optional bool field6709 = 6;
- optional .benchmarks.google_message3.Message6643 field6710 = 10;
- optional string field6711 = 12;
- optional .benchmarks.google_message3.UnusedEmptyMessage field6712 = 14;
- optional .benchmarks.google_message3.UnusedEmptyMessage field6713 = 15;
- optional .benchmarks.google_message3.UnusedEmptyMessage field6714 = 16;
- optional int32 field6715 = 17;
- optional .benchmarks.google_message3.UnusedEmptyMessage field6716 = 20;
-}
-
-message Message18831 {
- repeated group Message18832 = 1 {
- optional int32 field18836 = 2;
- optional string field18837 = 5;
- optional float field18838 = 3;
- optional float field18839 = 9;
- optional int32 field18840 = 11;
- repeated uint64 field18841 = 4;
- repeated group Message18833 = 6 {
- required uint64 field18843 = 7;
- optional string field18844 = 8;
- optional float field18845 = 10;
- optional int32 field18846 = 12;
- optional bool field18847 = 13;
- }
- }
-}
-
-message Message13090 {
- optional .benchmarks.google_message3.Message13083 field13141 = 1;
- optional .benchmarks.google_message3.Message13088 field13142 = 2;
-}
-
-message Message11874 {
- optional .benchmarks.google_message3.Message10391 field11888 = 3;
- optional string field11889 = 4;
- optional .benchmarks.google_message3.Message11873 field11890 = 6;
- optional bool field11891 = 7;
- extensions 1 to 1;
- extensions 2 to 2;
- extensions 5 to 5;
-}
-
-message Message4144 {
- repeated group Message4145 = 1 {
- required .benchmarks.google_message3.Enum4146 field4165 = 2;
- required int32 field4166 = 3;
- optional .benchmarks.google_message3.Enum4160 field4167 = 9;
- optional bytes field4168 = 4;
- optional .benchmarks.google_message3.Enum4152 field4169 = 5;
- optional string field4170 = 6;
- }
-}
-
-message Message35573 {
- optional fixed64 field35695 = 16;
- optional string field35696 = 1000;
- optional string field35697 = 1004;
- optional int32 field35698 = 1003;
- repeated group Message35574 = 1012 {}
- optional int64 field35700 = 1011;
- optional int64 field35701 = 1005;
- optional int64 field35702 = 1006;
- optional int64 field35703 = 1007;
- optional int64 field35704 = 1008;
- repeated group Message35575 = 1 {
- optional int64 field35709 = 2;
- optional string field35710 = 3;
- optional string field35711 = 19;
- optional int32 field35712 = 20;
- optional int32 field35713 = 21;
- optional int32 field35714 = 22;
- optional bool field35715 = 23;
- optional int32 field35716 = 47;
- optional int32 field35717 = 48;
- optional bool field35718 = 24;
- optional fixed64 field35719 = 25;
- optional bytes field35720 = 52;
- optional int32 field35721 = 18;
- optional fixed32 field35722 = 43;
- optional bool field35723 = 26;
- optional int32 field35724 = 27;
- optional int32 field35725 = 17;
- optional bool field35726 = 45;
- repeated int32 field35727 = 33;
- repeated int32 field35728 = 58;
- optional float field35729 = 34;
- optional float field35730 = 1009;
- optional int32 field35731 = 28;
- repeated fixed64 field35732 = 1001;
- repeated fixed64 field35733 = 1002;
- optional int32 field35734 = 44;
- optional int32 field35735 = 50;
- optional int32 field35736 = 36;
- optional int32 field35737 = 40;
- optional bool field35738 = 1016;
- optional bool field35739 = 1010;
- optional int32 field35740 = 37;
- optional int32 field35741 = 38;
- optional string field35742 = 46;
- optional uint32 field35743 = 60;
- repeated bytes field35744 = 56;
- optional .benchmarks.google_message3.Message0 field35745 = 57;
- required group Message35576 = 4 {
- optional fixed64 field35747 = 5;
- optional int32 field35748 = 6;
- optional int32 field35749 = 49;
- optional int32 field35750 = 7;
- optional uint32 field35751 = 59;
- optional int32 field35752 = 14;
- optional int32 field35753 = 15;
- optional int32 field35754 = 35;
- optional bytes field35755 = 53;
- optional int32 field35756 = 8;
- optional string field35757 = 9;
- optional fixed64 field35758 = 10;
- optional int32 field35759 = 11;
- optional int32 field35760 = 12;
- optional int32 field35761 = 41;
- optional int32 field35762 = 30;
- optional int32 field35763 = 31;
- optional int32 field35764 = 13;
- optional bytes field35765 = 39;
- optional string field35766 = 29;
- optional int32 field35767 = 42;
- repeated int32 field35768 = 32;
- repeated int32 field35769 = 51;
- optional int64 field35770 = 54;
- optional .benchmarks.google_message3.Message0 field35771 = 55;
- }
- }
-}
-
-message Message36858 {
- repeated int32 field36956 = 1;
- repeated string field36957 = 2;
- repeated string field36958 = 12;
- optional int32 field36959 = 3;
- optional int32 field36960 = 4;
- optional int32 field36961 = 14;
- optional string field36962 = 11;
- optional bool field36963 = 5;
- optional bool field36964 = 13;
- optional int64 field36965 = 6;
- optional .benchmarks.google_message3.Message35506 field36966 = 7;
- repeated group Message36859 = 8 {
- required .benchmarks.google_message3.Enum36860 field36968 = 9;
- optional float field36969 = 10;
- }
-}
-
-message Message13174 {
- required int32 field13237 = 6;
- optional int32 field13238 = 3;
- required int32 field13239 = 4;
- optional int32 field13240 = 8;
- optional double field13241 = 5;
- optional double field13242 = 7;
- optional int32 field13243 = 17;
- optional int32 field13244 = 19;
- optional double field13245 = 20;
- optional int32 field13246 = 9;
- optional double field13247 = 10;
- optional int32 field13248 = 11;
- optional .benchmarks.google_message3.Message13151 field13249 = 21;
- optional int32 field13250 = 1;
- optional double field13251 = 2;
- optional double field13252 = 15;
- optional double field13253 = 16;
- optional double field13254 = 12;
- optional double field13255 = 13;
- optional double field13256 = 14;
- optional int32 field13257 = 18;
-}
-
-message Message18283 {
- optional .benchmarks.google_message3.UnusedEmptyMessage field18478 = 1;
- optional int32 field18479 = 4;
- optional int32 field18480 = 106;
- optional int32 field18481 = 107;
- optional int32 field18482 = 108;
- optional int32 field18483 = 109;
- optional int32 field18484 = 105;
- optional int32 field18485 = 113;
- optional int32 field18486 = 114;
- optional int32 field18487 = 124;
- optional int32 field18488 = 125;
- optional int32 field18489 = 128;
- optional int32 field18490 = 135;
- optional bool field18491 = 166;
- optional bool field18492 = 136;
- optional int32 field18493 = 140;
- optional int32 field18494 = 171;
- optional int32 field18495 = 148;
- optional int32 field18496 = 145;
- optional float field18497 = 117;
- optional int32 field18498 = 146;
- optional string field18499 = 3;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18500 = 5;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18501 = 6;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18502 = 9;
- optional .benchmarks.google_message3.Message18253 field18503 = 155;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18504 = 184;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18505 = 163;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18506 = 16;
- repeated int32 field18507 = 20;
- repeated int32 field18508 = 7;
- repeated string field18509 = 194;
- optional bytes field18510 = 30;
- optional int32 field18511 = 31;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18512 = 178;
- optional string field18513 = 8;
- optional float field18514 = 2;
- optional float field18515 = 100;
- optional float field18516 = 101;
- optional float field18517 = 102;
- optional int32 field18518 = 103;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field18519 = 104;
- optional int32 field18520 = 110;
- optional int32 field18521 = 112;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18522 = 111;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18523 = 115;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18524 = 119;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18525 = 127;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18526 = 185;
- optional int32 field18527 = 120;
- optional int32 field18528 = 132;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18529 = 126;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18530 = 129;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18531 = 131;
- optional fixed64 field18532 = 150;
- optional int32 field18533 = 133;
- optional int32 field18534 = 134;
- optional int32 field18535 = 139;
- optional fixed64 field18536 = 137;
- optional fixed64 field18537 = 138;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18538 = 141;
- optional int32 field18539 = 142;
- optional int32 field18540 = 181;
- optional .benchmarks.google_message3.Message16816 field18541 = 143;
- optional .benchmarks.google_message3.Message16685 field18542 = 154;
- optional int32 field18543 = 144;
- optional int64 field18544 = 147;
- optional int64 field18545 = 149;
- optional int32 field18546 = 151;
- optional int32 field18547 = 152;
- optional int32 field18548 = 153;
- optional float field18549 = 161;
- optional .benchmarks.google_message3.Message0 field18550 = 123;
- repeated int64 field18551 = 156;
- optional int32 field18552 = 157;
- repeated fixed64 field18553 = 188;
- optional int32 field18554 = 158;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18555 = 159;
- optional bool field18556 = 160;
- optional uint64 field18557 = 162;
- optional int32 field18558 = 164;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18559 = 10;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18560 = 167;
- optional int32 field18561 = 168;
- repeated fixed64 field18562 = 169;
- repeated string field18563 = 170;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18564 = 172;
- optional int64 field18565 = 173;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18566 = 174;
- optional int64 field18567 = 175;
- optional uint32 field18568 = 189;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18569 = 176;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18570 = 177;
- optional uint32 field18571 = 179;
- optional uint32 field18572 = 180;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18573 = 182;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18574 = 183;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18575 = 121;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18576 = 186;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18577 = 187;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18578 = 190;
- optional int32 field18579 = 191;
- optional float field18580 = 192;
- optional bool field18581 = 193;
- extensions 116 to 116;
- extensions 118 to 118;
- extensions 130 to 130;
- extensions 165 to 165;
-}
-
-message Message13169 {
- repeated .benchmarks.google_message3.Message13168 field13223 = 1;
- required .benchmarks.google_message3.Message13167 field13224 = 2;
- optional string field13225 = 3;
-}
-
-message Message19255 {
- optional string field19257 = 1;
-}
-
-message Message35542 {
- optional bool field35543 = 1;
- optional bool field35544 = 2;
- optional bool field35545 = 3;
-}
-
-message Message3901 {
- optional int32 field3990 = 1;
- optional int32 field3991 = 2;
- optional int32 field3992 = 3;
- optional int32 field3993 = 4;
- optional int32 field3994 = 7;
- optional int32 field3995 = 8;
- optional int32 field3996 = 9;
- optional int32 field3997 = 10;
- optional int32 field3998 = 11;
- optional int32 field3999 = 12;
- optional .benchmarks.google_message3.UnusedEnum field4000 = 6;
- optional int32 field4001 = 5;
-}
diff --git a/benchmarks/datasets/google_message3/benchmark_message3_3.proto b/benchmarks/datasets/google_message3/benchmark_message3_3.proto
deleted file mode 100644
index 2e534a6..0000000
--- a/benchmarks/datasets/google_message3/benchmark_message3_3.proto
+++ /dev/null
@@ -1,496 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// LINT: ALLOW_GROUPS
-
-syntax = "proto2";
-
-package benchmarks.google_message3;
-
-import "datasets/google_message3/benchmark_message3_4.proto";
-import "datasets/google_message3/benchmark_message3_5.proto";
-import "datasets/google_message3/benchmark_message3_7.proto";
-import "datasets/google_message3/benchmark_message3_8.proto";
-
-option cc_enable_arenas = true;
-option java_package = "com.google.protobuf.benchmarks";
-
-message Message35546 {
- optional int64 field35556 = 1;
- optional int32 field35557 = 2;
- optional bool field35558 = 3;
- optional int64 field35559 = 13;
- optional group Message35547 = 4 {
- required int32 field35569 = 5;
- required int32 field35570 = 6;
- }
- optional group Message35548 = 10 {
- required int64 field35571 = 11;
- required int64 field35572 = 12;
- }
- optional bool field35562 = 14;
- optional bool field35563 = 15;
- optional int32 field35564 = 16;
- optional bool field35565 = 17;
- optional bool field35566 = 18;
- optional string field35567 = 100;
-}
-
-message Message2356 {
- optional .benchmarks.google_message3.Message1374 field2368 = 121;
- optional uint64 field2369 = 1;
- optional int32 field2370 = 2;
- optional int32 field2371 = 17;
- required string field2372 = 3;
- optional int32 field2373 = 7;
- optional bytes field2374 = 8;
- optional string field2375 = 4;
- optional string field2376 = 101;
- optional int32 field2377 = 102;
- optional int32 field2378 = 103;
- optional int32 field2379 = 104;
- optional int32 field2380 = 113;
- optional int32 field2381 = 114;
- optional int32 field2382 = 115;
- optional int32 field2383 = 117;
- optional int32 field2384 = 118;
- optional int32 field2385 = 119;
- optional int32 field2386 = 105;
- optional bytes field2387 = 5;
- optional group Message2357 = 6 {
- optional int64 field2399 = 9;
- optional int32 field2400 = 10;
- optional int32 field2401 = 11;
- optional int32 field2402 = 12;
- optional int32 field2403 = 13;
- optional int32 field2404 = 116;
- optional int32 field2405 = 106;
- required bytes field2406 = 14;
- optional int32 field2407 = 45;
- optional int32 field2408 = 112;
- optional bool field2409 = 122;
- optional bytes field2410 = 124;
- }
- optional string field2389 = 120;
- optional group Message2358 = 107 {}
- repeated group Message2359 = 40 {
- optional string field2413 = 41;
- optional string field2414 = 42;
- optional string field2415 = 43;
- optional string field2416 = 44;
- optional int32 field2417 = 46;
- optional string field2418 = 47;
- optional float field2419 = 110;
- optional float field2420 = 111;
- }
- optional int32 field2392 = 50;
- optional .benchmarks.google_message3.UnusedEmptyMessage field2393 = 60;
- optional .benchmarks.google_message3.UnusedEmptyMessage field2394 = 70;
- optional .benchmarks.google_message3.UnusedEmptyMessage field2395 = 80;
- optional .benchmarks.google_message3.UnusedEmptyMessage field2396 = 90;
- optional string field2397 = 100;
- optional string field2398 = 123;
-}
-
-message Message7029 {
- required int32 field7183 = 1;
- optional int32 field7184 = 2;
- optional int32 field7185 = 3;
- optional int32 field7186 = 4;
- optional int32 field7187 = 5;
- optional int32 field7188 = 6;
- optional int32 field7189 = 17;
- optional int32 field7190 = 18;
- optional int32 field7191 = 49;
- optional int32 field7192 = 28;
- optional int32 field7193 = 33;
- optional int32 field7194 = 25;
- optional int32 field7195 = 26;
- optional int32 field7196 = 40;
- optional int32 field7197 = 41;
- optional int32 field7198 = 42;
- optional int32 field7199 = 43;
- optional int32 field7200 = 19;
- optional int32 field7201 = 7;
- optional int32 field7202 = 8;
- optional int32 field7203 = 9;
- optional int32 field7204 = 10;
- optional int32 field7205 = 11;
- optional int32 field7206 = 12;
- repeated group Message7030 = 13 {
- optional string field7226 = 14;
- optional string field7227 = 15;
- optional int64 field7228 = 16;
- }
- repeated group Message7031 = 21 {
- optional string field7229 = 22;
- optional int32 field7230 = 23;
- optional int32 field7231 = 24;
- optional int32 field7232 = 30;
- optional int32 field7233 = 31;
- optional int32 field7234 = 35;
- }
- optional int32 field7209 = 20;
- optional float field7210 = 27;
- optional int32 field7211 = 29;
- optional int32 field7212 = 32;
- optional string field7213 = 48;
- optional bool field7214 = 34;
- optional int32 field7215 = 36;
- optional float field7216 = 37;
- optional bool field7217 = 38;
- optional bool field7218 = 39;
- optional .benchmarks.google_message3.UnusedEmptyMessage field7219 = 44;
- optional int32 field7220 = 45;
- optional int32 field7221 = 46;
- optional int32 field7222 = 47;
- optional .benchmarks.google_message3.UnusedEmptyMessage field7223 = 50;
- optional int32 field7224 = 51;
-}
-
-message Message35538 {
- required int64 field35539 = 1;
-}
-
-message Message18921 {
- optional string field18946 = 1;
- optional fixed64 field18947 = 2;
- optional int32 field18948 = 3;
- optional double field18949 = 4;
- optional bool field18950 = 17;
- optional bool field18951 = 23;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18952 = 24;
- repeated group Message18922 = 5 {
- optional uint64 field18959 = 6;
- optional string field18960 = 13;
- optional bool field18961 = 21;
- optional bool field18962 = 33;
- optional int32 field18963 = 7;
- optional int32 field18964 = 8;
- optional string field18965 = 9;
- optional .benchmarks.google_message3.Message18856 field18966 = 10;
- optional uint64 field18967 = 34;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18968 = 11;
- optional uint64 field18969 = 35;
- optional float field18970 = 12;
- repeated string field18971 = 14;
- optional bool field18972 = 15;
- optional bool field18973 = 16;
- optional float field18974 = 22;
- optional int32 field18975 = 18;
- optional int32 field18976 = 19;
- optional int32 field18977 = 20;
- optional .benchmarks.google_message3.UnusedEmptyMessage field18978 = 25;
- optional .benchmarks.google_message3.UnusedEnum field18979 = 26;
- repeated string field18980 = 27;
- optional float field18981 = 28;
- }
- repeated .benchmarks.google_message3.UnusedEmptyMessage field18954 = 29;
- repeated .benchmarks.google_message3.Message18943 field18955 = 30;
- repeated .benchmarks.google_message3.Message18944 field18956 = 31;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field18957 = 32;
-}
-
-message Message35540 {
- optional bool field35541 = 1;
-}
-
-message Message3886 {
- repeated group Message3887 = 1 {
- required string field3932 = 2;
- optional string field3933 = 9;
- optional .benchmarks.google_message3.Message3850 field3934 = 3;
- optional bytes field3935 = 8;
- }
-}
-
-message Message6743 {
- optional .benchmarks.google_message3.Message6721 field6759 = 1;
- optional .benchmarks.google_message3.Message6723 field6760 = 2;
- optional .benchmarks.google_message3.Message6723 field6761 = 8;
- optional .benchmarks.google_message3.Message6725 field6762 = 3;
- optional .benchmarks.google_message3.Message6726 field6763 = 4;
- optional .benchmarks.google_message3.Message6733 field6764 = 5;
- optional .benchmarks.google_message3.Message6734 field6765 = 6;
- optional .benchmarks.google_message3.Message6742 field6766 = 7;
-}
-
-message Message6773 {
- optional .benchmarks.google_message3.Enum6769 field6794 = 1;
- optional int32 field6795 = 9;
- optional .benchmarks.google_message3.UnusedEnum field6796 = 10;
- optional int32 field6797 = 11;
- optional int32 field6798 = 2;
- optional .benchmarks.google_message3.Enum6774 field6799 = 3;
- optional double field6800 = 5;
- optional double field6801 = 7;
- optional double field6802 = 8;
- optional .benchmarks.google_message3.Enum6782 field6803 = 6;
-}
-
-message Message8224 {
- optional .benchmarks.google_message3.UnusedEmptyMessage field8255 = 1;
- optional .benchmarks.google_message3.Message8184 field8256 = 2;
- optional .benchmarks.google_message3.Message7966 field8257 = 3;
- optional string field8258 = 4;
- optional string field8259 = 5;
- optional bool field8260 = 6;
- optional int64 field8261 = 7;
- optional string field8262 = 8;
- optional int64 field8263 = 9;
- optional double field8264 = 10;
- optional int64 field8265 = 11;
- repeated string field8266 = 12;
- optional int64 field8267 = 13;
- optional int32 field8268 = 14;
- optional int32 field8269 = 15;
- optional int64 field8270 = 16;
- optional double field8271 = 17;
- optional .benchmarks.google_message3.UnusedEmptyMessage field8272 = 18;
- optional .benchmarks.google_message3.UnusedEmptyMessage field8273 = 19;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field8274 = 20;
- optional bool field8275 = 21;
- optional .benchmarks.google_message3.UnusedEmptyMessage field8276 = 22;
- optional .benchmarks.google_message3.UnusedEmptyMessage field8277 = 23;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field8278 = 24;
- optional .benchmarks.google_message3.UnusedEmptyMessage field8279 = 25;
- optional bool field8280 = 26;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field8281 = 27;
-}
-
-message Message8392 {
- optional string field8395 = 1;
- optional string field8396 = 2;
- optional .benchmarks.google_message3.Message7966 field8397 = 3;
- optional string field8398 = 4;
- optional string field8399 = 5;
- optional string field8400 = 6;
- optional string field8401 = 7;
- optional string field8402 = 8;
- optional string field8403 = 9;
-}
-
-message Message8130 {
- optional string field8156 = 1;
- optional string field8157 = 2;
- optional string field8158 = 4;
- optional .benchmarks.google_message3.UnusedEmptyMessage field8159 = 6;
- repeated string field8160 = 7;
- optional int64 field8161 = 8;
- optional .benchmarks.google_message3.UnusedEmptyMessage field8162 = 9;
- optional string field8163 = 10;
- optional string field8164 = 11;
- optional string field8165 = 12;
- optional string field8166 = 13;
- optional .benchmarks.google_message3.UnusedEmptyMessage field8167 = 14;
- optional .benchmarks.google_message3.UnusedEmptyMessage field8168 = 15;
- optional string field8169 = 16;
- optional .benchmarks.google_message3.UnusedEnum field8170 = 17;
- optional .benchmarks.google_message3.UnusedEnum field8171 = 18;
- optional bool field8172 = 19;
- optional bool field8173 = 20;
- optional double field8174 = 21;
- optional int32 field8175 = 22;
- optional int32 field8176 = 23;
- optional .benchmarks.google_message3.UnusedEmptyMessage field8177 = 24;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field8178 = 25;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field8179 = 26;
-}
-
-message Message8478 {
- optional string field8489 = 7;
- optional .benchmarks.google_message3.Message7966 field8490 = 1;
- optional .benchmarks.google_message3.Message8476 field8491 = 2;
- optional int64 field8492 = 3;
- optional .benchmarks.google_message3.Message8476 field8493 = 4;
- repeated .benchmarks.google_message3.Message8477 field8494 = 5;
- optional .benchmarks.google_message3.Message8454 field8495 = 6;
- optional .benchmarks.google_message3.UnusedEmptyMessage field8496 = 8;
-}
-
-message Message8479 {
- optional .benchmarks.google_message3.Message8475 field8497 = 1;
- optional .benchmarks.google_message3.Message7966 field8498 = 2;
- optional .benchmarks.google_message3.Message8476 field8499 = 3;
- optional .benchmarks.google_message3.Message8476 field8500 = 4;
- optional string field8501 = 6;
- optional string field8502 = 7;
- optional .benchmarks.google_message3.Message7966 field8503 = 8;
- optional .benchmarks.google_message3.Message8455 field8504 = 5;
- optional .benchmarks.google_message3.UnusedEmptyMessage field8505 = 9;
-}
-
-message Message10319 {
- optional .benchmarks.google_message3.Enum10325 field10340 = 1;
- optional int32 field10341 = 4;
- optional int32 field10342 = 5;
- optional bytes field10343 = 3;
- optional string field10344 = 2;
- optional string field10345 = 6;
- optional string field10346 = 7;
-}
-
-message Message4016 {
- required int32 field4017 = 1;
- required int32 field4018 = 2;
- required int32 field4019 = 3;
- required int32 field4020 = 4;
-}
-
-message Message12669 {
- optional .benchmarks.google_message3.Message12559 field12681 = 1;
- optional float field12682 = 2;
- optional bool field12683 = 3;
- optional .benchmarks.google_message3.Enum12670 field12684 = 4;
-}
-
-message Message12819 {
- optional double field12834 = 1;
- optional double field12835 = 2;
- optional double field12836 = 3;
- optional double field12837 = 4;
- optional double field12838 = 5;
- optional double field12839 = 6;
-}
-
-message Message12820 {
- optional int32 field12840 = 1;
- optional int32 field12841 = 2;
- optional int32 field12842 = 3;
- optional int32 field12843 = 8;
- optional int32 field12844 = 4;
- optional int32 field12845 = 5;
- optional int32 field12846 = 6;
- optional int32 field12847 = 7;
-}
-
-message Message12821 {
- optional int32 field12848 = 1;
- optional int32 field12849 = 2;
- optional int32 field12850 = 3;
- optional int32 field12851 = 4;
- optional int32 field12852 = 5;
-}
-
-message Message12818 {
- optional uint64 field12829 = 1;
- optional int32 field12830 = 2;
- optional int32 field12831 = 3;
- optional int32 field12832 = 5;
- repeated .benchmarks.google_message3.Message12817 field12833 = 4;
-}
-
-message Message16479 {
- optional .benchmarks.google_message3.Message16480 field16484 = 1;
- optional int32 field16485 = 5;
- optional float field16486 = 2;
- optional uint32 field16487 = 4;
- optional bool field16488 = 3;
- optional uint32 field16489 = 6;
-}
-
-message Message16722 {
- optional string field16752 = 1;
- optional string field16753 = 2;
- optional string field16754 = 3;
- optional int32 field16755 = 5;
- optional string field16756 = 4;
-}
-
-message Message16724 {
- optional int64 field16761 = 1;
- optional float field16762 = 2;
- optional int64 field16763 = 3;
- optional int64 field16764 = 4;
- optional bool field16765 = 5;
- repeated string field16766 = 6;
- repeated string field16767 = 7;
- optional .benchmarks.google_message3.UnusedEmptyMessage field16768 = 8;
- optional bool field16769 = 9;
- optional uint32 field16770 = 10;
- optional .benchmarks.google_message3.Enum16728 field16771 = 11;
- repeated int32 field16772 = 12;
- optional bool field16773 = 13;
-}
-
-message Message17728 {}
-
-message Message24356 {
- optional string field24559 = 1;
- optional string field24560 = 2;
- optional int32 field24561 = 14;
- optional string field24562 = 3;
- optional string field24563 = 4;
- optional string field24564 = 5;
- optional .benchmarks.google_message3.UnusedEnum field24565 = 13;
- optional string field24566 = 6;
- optional .benchmarks.google_message3.Enum24361 field24567 = 12;
- optional string field24568 = 7;
- optional string field24569 = 8;
- optional string field24570 = 9;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field24571 = 10;
- repeated string field24572 = 11;
- repeated string field24573 = 15;
-}
-
-message Message24376 {
- optional string field24589 = 1;
- optional string field24590 = 2;
- optional string field24591 = 3;
- required .benchmarks.google_message3.Message24377 field24592 = 4;
- optional .benchmarks.google_message3.Message24317 field24593 = 5;
- optional string field24594 = 6;
- optional .benchmarks.google_message3.Message24378 field24595 = 7;
- repeated string field24596 = 8;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field24597 = 14;
- repeated string field24598 = 9;
- repeated string field24599 = 10;
- repeated string field24600 = 11;
- optional string field24601 = 12;
- repeated string field24602 = 13;
-}
-
-message Message24366 {
- optional string field24574 = 1;
- optional string field24575 = 2;
- optional string field24576 = 3;
- optional int32 field24577 = 10;
- optional string field24578 = 13;
- optional string field24579 = 4;
- optional string field24580 = 5;
- optional .benchmarks.google_message3.UnusedEnum field24581 = 9;
- optional string field24582 = 14;
- optional .benchmarks.google_message3.UnusedEnum field24583 = 15;
- optional string field24584 = 6;
- optional string field24585 = 12;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field24586 = 7;
- repeated string field24587 = 8;
- repeated string field24588 = 11;
-}
diff --git a/benchmarks/datasets/google_message3/benchmark_message3_4.proto b/benchmarks/datasets/google_message3/benchmark_message3_4.proto
deleted file mode 100644
index b304148..0000000
--- a/benchmarks/datasets/google_message3/benchmark_message3_4.proto
+++ /dev/null
@@ -1,514 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// LINT: ALLOW_GROUPS
-
-syntax = "proto2";
-
-package benchmarks.google_message3;
-
-import "datasets/google_message3/benchmark_message3_5.proto";
-import "datasets/google_message3/benchmark_message3_6.proto";
-import "datasets/google_message3/benchmark_message3_7.proto";
-import "datasets/google_message3/benchmark_message3_8.proto";
-
-option cc_enable_arenas = true;
-option java_package = "com.google.protobuf.benchmarks";
-
-message Message24346 {}
-
-message Message24401 {
- optional .benchmarks.google_message3.Message24400 field24679 = 1;
-}
-
-message Message24402 {
- optional .benchmarks.google_message3.Message24400 field24680 = 1;
-}
-
-message Message24379 {
- optional string field24603 = 1;
- optional string field24604 = 2;
- optional string field24605 = 3;
- required .benchmarks.google_message3.Message24380 field24606 = 4;
- optional .benchmarks.google_message3.UnusedEmptyMessage field24607 = 5;
- optional string field24608 = 6;
- optional .benchmarks.google_message3.Message24381 field24609 = 7;
- repeated string field24610 = 8;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field24611 = 17;
- repeated string field24612 = 9;
- repeated string field24613 = 10;
- repeated string field24614 = 11;
- optional string field24615 = 14;
- optional string field24616 = 12;
- optional string field24617 = 16;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field24618 = 13;
- repeated string field24619 = 15;
- repeated string field24620 = 18;
-}
-
-message Message27358 {
- optional int32 field27415 = 1;
- optional int32 field27416 = 2;
-}
-
-message Message34381 {
- optional string field34398 = 1;
- optional .benchmarks.google_message3.UnusedEmptyMessage field34399 = 2;
- optional .benchmarks.google_message3.UnusedEmptyMessage field34400 = 3;
- optional .benchmarks.google_message3.UnusedEmptyMessage field34401 = 4;
- optional .benchmarks.google_message3.UnusedEmptyMessage field34402 = 5;
- optional bool field34403 = 6;
- optional bool field34404 = 7;
- optional .benchmarks.google_message3.UnusedEmptyMessage field34405 = 8;
- optional bool field34406 = 9;
- optional .benchmarks.google_message3.UnusedEmptyMessage field34407 = 10;
-}
-
-message Message34619 {
- optional double field34641 = 1;
- optional double field34642 = 2;
- optional double field34643 = 3;
- optional double field34644 = 4;
- optional double field34645 = 11;
- optional double field34646 = 5;
- optional .benchmarks.google_message3.UnusedEmptyMessage field34647 = 100;
-}
-
-message Message730 {
- optional string field897 = 19;
- repeated string field898 = 27;
- repeated string field899 = 28;
- repeated string field900 = 21;
- optional string field901 = 30;
- repeated uint32 field902 = 20;
- repeated uint32 field903 = 32;
- repeated string field904 = 16;
- repeated .benchmarks.google_message3.Message697 field905 = 6;
- repeated .benchmarks.google_message3.Message704 field906 = 7;
- repeated string field907 = 18;
- repeated .benchmarks.google_message3.Message703 field908 = 8;
- repeated string field909 = 9;
- optional .benchmarks.google_message3.Message716 field910 = 10;
- optional .benchmarks.google_message3.Message718 field911 = 11;
- optional bool field912 = 14;
- repeated .benchmarks.google_message3.Message715 field913 = 4;
- repeated string field914 = 17;
- repeated string field915 = 23;
- repeated .benchmarks.google_message3.Message719 field916 = 24;
- repeated .benchmarks.google_message3.Message728 field917 = 26;
- repeated .benchmarks.google_message3.Message702 field918 = 35;
- optional string field919 = 36;
- repeated string field920 = 37;
- optional int64 field921 = 38;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field922 = 39;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field923 = 1;
- optional .benchmarks.google_message3.UnusedEmptyMessage field924 = 2;
- optional .benchmarks.google_message3.UnusedEmptyMessage field925 = 3;
- optional .benchmarks.google_message3.UnusedEmptyMessage field926 = 5;
- optional .benchmarks.google_message3.UnusedEmptyMessage field927 = 13;
- repeated string field928 = 22;
- optional bytes field929 = 31;
- extensions 25 to 25;
- extensions 29 to 29;
- extensions 34 to 34;
- extensions 15 to 15;
-}
-
-message Message33958 {
- optional string field33977 = 1;
- optional string field33978 = 9;
- repeated group Message33959 = 2 {
- required string field33982 = 3;
- optional string field33983 = 4;
- optional string field33984 = 5;
- optional fixed64 field33985 = 8;
- optional bool field33986 = 10;
- optional .benchmarks.google_message3.Message0 field33987 = 6;
- }
- optional .benchmarks.google_message3.Enum33960 field33980 = 7;
- extend .benchmarks.google_message3.Message0 {
- optional .benchmarks.google_message3.Message33958 field33981 = 10747482;
- }
-}
-
-message Message6637 {
- optional .benchmarks.google_message3.UnusedEmptyMessage field6670 = 2;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field6671 = 1;
- optional int32 field6672 = 3;
- repeated string field6673 = 4;
- optional .benchmarks.google_message3.UnusedEmptyMessage field6674 = 5;
-}
-
-message Message6643 {
- optional .benchmarks.google_message3.UnusedEmptyMessage field6683 = 3;
- optional .benchmarks.google_message3.UnusedEmptyMessage field6684 = 4;
- optional double field6685 = 5;
- optional double field6686 = 6;
- optional int32 field6687 = 1;
- optional int32 field6688 = 2;
- optional double field6689 = 9;
- optional bytes field6690 = 10;
- optional int32 field6691 = 11;
- optional bool field6692 = 12;
- optional bool field6693 = 13;
- optional .benchmarks.google_message3.Message6578 field6694 = 15;
- optional .benchmarks.google_message3.UnusedEnum field6695 = 16;
- optional int64 field6696 = 17;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field6697 = 22;
- optional .benchmarks.google_message3.UnusedEmptyMessage field6698 = 19;
- optional .benchmarks.google_message3.UnusedEmptyMessage field6699 = 20;
- optional int32 field6700 = 21;
-}
-
-message Message6126 {
- required string field6152 = 1;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field6153 = 9;
- optional int32 field6154 = 14;
- optional bytes field6155 = 10;
- optional .benchmarks.google_message3.Message6024 field6156 = 12;
- optional int32 field6157 = 4;
- optional string field6158 = 5;
- optional int32 field6159 = 6;
- repeated int32 field6160 = 2;
- repeated int32 field6161 = 3;
- repeated .benchmarks.google_message3.Message6052 field6162 = 7;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field6163 = 11;
- optional .benchmarks.google_message3.Enum6065 field6164 = 15;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field6165 = 8;
- optional bool field6166 = 13;
- optional bool field6167 = 16;
- optional bool field6168 = 18;
- repeated .benchmarks.google_message3.Message6054 field6169 = 17;
- optional int32 field6170 = 19;
-}
-
-message Message13083 {
- optional float field13096 = 1;
- repeated group Message13084 = 2 {
- required float field13107 = 3;
- required int32 field13108 = 4;
- optional float field13109 = 5;
- repeated .benchmarks.google_message3.Enum13092 field13110 = 6;
- }
- optional float field13098 = 44;
- optional float field13099 = 45;
- optional uint64 field13100 = 46;
- optional float field13101 = 47;
- optional group Message13085 = 16 {}
- repeated group Message13086 = 23 {}
- repeated group Message13087 = 29 {}
- optional .benchmarks.google_message3.UnusedEmptyMessage field13105 = 43;
-}
-
-message Message13088 {
- repeated group Message13089 = 1 {
- required string field13139 = 2;
- optional float field13140 = 3;
- }
- optional int64 field13136 = 4;
- optional bool field13137 = 5;
-}
-
-message Message10391 {
- optional .benchmarks.google_message3.Enum10392 field10411 = 1;
- optional .benchmarks.google_message3.UnusedEnum field10412 = 2;
- optional int64 field10413 = 3;
- optional string field10414 = 4;
- optional string field10415 = 5;
- optional bytes field10416 = 6;
- optional bool field10417 = 8;
- optional .benchmarks.google_message3.UnusedEmptyMessage field10418 = 9;
- optional bool field10419 = 10;
-}
-
-message Message11873 {
- optional string field11876 = 1;
- optional string field11877 = 4;
- optional .benchmarks.google_message3.Message10573 field11878 = 5;
- optional .benchmarks.google_message3.Message10582 field11879 = 6;
- optional .benchmarks.google_message3.Message10824 field11880 = 7;
- optional .benchmarks.google_message3.Message10773 field11881 = 12;
- optional .benchmarks.google_message3.Message11866 field11882 = 8;
- optional .benchmarks.google_message3.Message10818 field11883 = 13;
- optional .benchmarks.google_message3.UnusedEmptyMessage field11884 = 16;
- optional .benchmarks.google_message3.Message10155 field11885 = 11;
- optional .benchmarks.google_message3.Message10469 field11886 = 14;
- optional .benchmarks.google_message3.UnusedEmptyMessage field11887 = 15;
- extensions 9 to 9;
- extensions 10 to 10;
-}
-
-message Message35506 {
- optional int32 field35524 = 1;
- optional string field35525 = 2;
- optional .benchmarks.google_message3.Enum35507 field35526 = 3;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field35527 = 4;
-}
-
-message Message13151 {
- repeated .benchmarks.google_message3.Message13145 field13158 = 1;
-}
-
-message Message18253 {
- repeated group Message18254 = 1 {
- required fixed64 field18362 = 2;
- required double field18363 = 3;
- }
-}
-
-message Message16685 {
- repeated .benchmarks.google_message3.Message16686 field16694 = 2;
-}
-
-message Message16816 {
- optional float field16826 = 1;
- optional .benchmarks.google_message3.Enum16819 field16827 = 2;
- optional float field16828 = 3;
- repeated group Message16817 = 4 {}
- optional bool field16830 = 7;
- optional bool field16831 = 8;
- repeated group Message16818 = 12 {}
- optional string field16833 = 10;
- optional bool field16834 = 13;
- optional bool field16835 = 14;
-}
-
-message Message13168 {
- required int32 field13212 = 1;
- optional fixed64 field13213 = 7;
- optional bool field13214 = 8;
- optional fixed64 field13215 = 10;
- optional bool field13216 = 11;
- optional .benchmarks.google_message3.Message12796 field13217 = 9;
- required double field13218 = 2;
- required bool field13219 = 3;
- optional int32 field13220 = 4;
- required bool field13221 = 5;
- optional int32 field13222 = 6;
-}
-
-message Message13167 {
- required int32 field13199 = 1;
- optional int32 field13200 = 2;
- optional int32 field13201 = 3;
- optional bool field13202 = 8;
- optional fixed64 field13203 = 12;
- optional bool field13204 = 13;
- optional .benchmarks.google_message3.Message12796 field13205 = 11;
- optional fixed64 field13206 = 9;
- optional bool field13207 = 10;
- repeated int32 field13208 = 4;
- optional int32 field13209 = 5;
- optional int32 field13210 = 6;
- optional int32 field13211 = 7;
-}
-
-message Message1374 {
- required string field1375 = 1;
- optional string field1376 = 2;
-}
-
-message Message18943 {}
-
-message Message18944 {}
-
-message Message18856 {
- optional string field18857 = 1;
- optional string field18858 = 2;
- optional bool field18859 = 31;
- optional string field18860 = 26;
- optional string field18861 = 3;
- optional string field18862 = 4;
- optional string field18863 = 5;
- optional string field18864 = 17;
- optional string field18865 = 6;
- optional string field18866 = 7;
- optional string field18867 = 8;
- optional string field18868 = 9;
- optional string field18869 = 10;
- optional string field18870 = 11;
- optional string field18871 = 21;
- optional string field18872 = 18;
- optional string field18873 = 19;
- optional string field18874 = 20;
- optional string field18875 = 22;
- optional string field18876 = 23;
- optional string field18877 = 24;
- optional string field18878 = 25;
- optional string field18879 = 12;
- optional string field18880 = 13;
- optional string field18881 = 29;
- optional string field18882 = 30;
- optional string field18883 = 15;
- optional string field18884 = 16;
- repeated string field18885 = 14;
- optional string field18886 = 27;
- optional string field18887 = 28;
-}
-
-message Message3850 {
- optional .benchmarks.google_message3.Enum3851 field3924 = 2;
- optional bool field3925 = 12;
- optional int32 field3926 = 4;
- optional bool field3927 = 10;
- optional bool field3928 = 13;
- optional bool field3929 = 14;
-}
-
-message Message6721 {
- optional .benchmarks.google_message3.Message6722 field6744 = 1;
- optional bool field6745 = 2;
- optional bool field6746 = 3;
- optional bool field6747 = 4;
-}
-
-message Message6742 {
- optional bool field6758 = 1;
-}
-
-message Message6726 {
- optional int64 field6752 = 1;
- repeated .benchmarks.google_message3.Message6727 field6753 = 2;
-}
-
-message Message6733 {
- optional int64 field6754 = 1;
- optional int64 field6755 = 2;
- optional bool field6756 = 3;
-}
-
-message Message6723 {
- optional int64 field6748 = 1;
- repeated .benchmarks.google_message3.Message6724 field6749 = 2;
-}
-
-message Message6725 {
- optional int32 field6750 = 1;
- optional int32 field6751 = 2;
-}
-
-message Message6734 {
- repeated .benchmarks.google_message3.Message6735 field6757 = 1;
-}
-
-message Message8184 {
- optional .benchmarks.google_message3.Message7966 field8228 = 1;
- optional bool field8229 = 2;
- repeated .benchmarks.google_message3.Message8183 field8230 = 3;
-}
-
-message Message8477 {
- optional .benchmarks.google_message3.Message7966 field8486 = 1;
- optional int64 field8487 = 2;
- optional string field8488 = 3;
-}
-
-message Message8454 {
- optional .benchmarks.google_message3.Message8449 field8465 = 1;
- optional int64 field8466 = 3;
- optional int32 field8467 = 4;
- optional bool field8468 = 5;
- extend .benchmarks.google_message3.Message8301 {
- optional .benchmarks.google_message3.Message8454 field8469 = 66;
- }
-}
-
-message Message8476 {
- optional string field8483 = 1;
- optional string field8484 = 2;
- optional string field8485 = 3;
-}
-
-message Message8455 {
- optional .benchmarks.google_message3.Message8449 field8470 = 1;
- repeated .benchmarks.google_message3.Message8456 field8471 = 2;
- optional .benchmarks.google_message3.Message8457 field8472 = 5;
- optional .benchmarks.google_message3.UnusedEmptyMessage field8473 = 6;
- extend .benchmarks.google_message3.Message8302 {
- optional .benchmarks.google_message3.Message8455 field8474 = 66;
- }
-}
-
-message Message8475 {
- optional string field8481 = 1;
- optional int64 field8482 = 2;
-}
-
-message Message12559 {}
-
-message Message12817 {
- optional int32 field12826 = 1;
- optional int32 field12827 = 2;
- optional int32 field12828 = 3;
-}
-
-message Message16480 {
- optional .benchmarks.google_message3.Message13358 field16490 = 1;
- optional .benchmarks.google_message3.Enum16042 field16491 = 2;
- optional .benchmarks.google_message3.Message13912 field16492 = 3;
- optional string field16493 = 4;
- optional string field16494 = 5;
- optional string field16495 = 6;
- optional string field16496 = 7;
- optional .benchmarks.google_message3.Message13358 field16497 = 8;
- optional fixed32 field16498 = 9;
-}
-
-message Message24317 {
- optional string field24446 = 1;
- optional .benchmarks.google_message3.Message24312 field24447 = 2;
- repeated .benchmarks.google_message3.Message24315 field24448 = 3;
- repeated .benchmarks.google_message3.Message24313 field24449 = 4;
- repeated .benchmarks.google_message3.Message24316 field24450 = 5;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field24451 = 6;
- optional .benchmarks.google_message3.UnusedEmptyMessage field24452 = 7;
- repeated string field24453 = 8;
- repeated string field24454 = 9;
- repeated string field24455 = 10;
- repeated string field24456 = 28;
- optional string field24457 = 11;
- optional string field24458 = 12;
- optional string field24459 = 13;
- optional string field24460 = 14;
- repeated string field24461 = 15;
- optional string field24462 = 16;
- repeated string field24463 = 17;
- repeated string field24464 = 18;
- repeated string field24465 = 19;
- repeated string field24466 = 20;
- repeated string field24467 = 21;
- repeated string field24468 = 22;
- repeated string field24469 = 23;
- repeated string field24470 = 24;
- optional string field24471 = 25;
- optional string field24472 = 26;
- repeated string field24473 = 27;
- optional bool field24474 = 40;
-}
diff --git a/benchmarks/datasets/google_message3/benchmark_message3_5.proto b/benchmarks/datasets/google_message3/benchmark_message3_5.proto
deleted file mode 100644
index e72d7ee..0000000
--- a/benchmarks/datasets/google_message3/benchmark_message3_5.proto
+++ /dev/null
@@ -1,496 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// LINT: ALLOW_GROUPS
-
-syntax = "proto2";
-
-package benchmarks.google_message3;
-
-import "datasets/google_message3/benchmark_message3_6.proto";
-import "datasets/google_message3/benchmark_message3_7.proto";
-import "datasets/google_message3/benchmark_message3_8.proto";
-
-option cc_enable_arenas = true;
-option java_package = "com.google.protobuf.benchmarks";
-
-message Message24377 {}
-
-message Message24378 {}
-
-message Message24400 {
- optional int32 field24674 = 1;
- optional int32 field24675 = 2;
- optional int32 field24676 = 3;
- optional int32 field24677 = 4;
- optional int32 field24678 = 5;
-}
-
-message Message24380 {}
-
-message Message24381 {}
-
-message Message719 {
- repeated string field881 = 1;
- repeated string field882 = 2;
- repeated string field883 = 3;
- optional .benchmarks.google_message3.Enum720 field884 = 4;
-}
-
-message Message728 {
- required string field887 = 1;
- repeated string field888 = 2;
- repeated .benchmarks.google_message3.Message703 field889 = 3;
- repeated .benchmarks.google_message3.Message715 field890 = 4;
- repeated string field891 = 5;
- repeated string field892 = 6;
- optional .benchmarks.google_message3.Message718 field893 = 7;
- optional .benchmarks.google_message3.Message716 field894 = 8;
- repeated string field895 = 9;
- extensions 10 to 10;
- extensions 11 to 11;
- extensions 12 to 12;
-}
-
-message Message704 {
- optional string field800 = 1;
- optional string field801 = 7;
- optional string field802 = 2;
- optional string field803 = 3;
- optional string field804 = 4;
- optional string field805 = 5;
- optional .benchmarks.google_message3.UnusedEmptyMessage field806 = 6;
-}
-
-message Message697 {
- optional string field743 = 7;
- repeated string field744 = 1;
- repeated string field745 = 2;
- repeated string field746 = 33;
- repeated string field747 = 29;
- repeated string field748 = 30;
- repeated string field749 = 31;
- repeated string field750 = 32;
- repeated string field751 = 13;
- repeated string field752 = 6;
- repeated string field753 = 3;
- repeated string field754 = 14;
- repeated string field755 = 15;
- repeated string field756 = 16;
- repeated string field757 = 4;
- repeated string field758 = 34;
- repeated string field759 = 35;
- repeated string field760 = 5;
- repeated string field761 = 17;
- repeated string field762 = 18;
- repeated string field763 = 19;
- optional bool field764 = 36;
- repeated string field765 = 8;
- repeated string field766 = 9;
- optional string field767 = 27;
- optional bool field768 = 25;
- optional .benchmarks.google_message3.Message700 field769 = 10;
- optional bool field770 = 11;
- optional bool field771 = 24;
- repeated string field772 = 12;
- repeated string field773 = 20;
- repeated string field774 = 21;
- repeated string field775 = 22;
- repeated .benchmarks.google_message3.Message699 field776 = 23;
- repeated .benchmarks.google_message3.Message698 field777 = 37;
- optional int64 field778 = 38;
- extensions 28 to 28;
- extensions 26 to 26;
-}
-
-message Message0 {
- option message_set_wire_format = true;
-
- extensions 4 to 2147483646;
-}
-
-message Message6578 {
- optional .benchmarks.google_message3.Enum6579 field6632 = 1;
- optional .benchmarks.google_message3.Enum6588 field6633 = 2;
-}
-
-message Message6024 {
- optional .benchmarks.google_message3.Enum6025 field6048 = 1;
- optional string field6049 = 2;
- optional .benchmarks.google_message3.UnusedEmptyMessage field6050 = 3;
-}
-
-message Message6052 {
- required string field6084 = 1;
- required bytes field6085 = 2;
-}
-
-message Message6054 {
- required string field6089 = 1;
- optional string field6090 = 2;
-}
-
-message Message10573 {
- repeated .benchmarks.google_message3.Message10576 field10580 = 1;
- optional string field10581 = 2;
- extensions 10000 to 536870911;
-}
-
-message Message10824 {
- required string field10825 = 1;
- optional int32 field10826 = 2;
-}
-
-message Message10582 {
- required bool field10583 = 1;
- required double field10584 = 2;
- optional bool field10585 = 3;
- optional double field10586 = 4;
- optional double field10587 = 5;
- optional bool field10588 = 6;
-}
-
-message Message10155 {
- required int32 field10195 = 1;
- required int32 field10196 = 2;
- optional .benchmarks.google_message3.Enum10157 field10197 = 59;
- optional int32 field10198 = 18;
- optional int32 field10199 = 19;
- optional int32 field10200 = 21;
- repeated group Message10156 = 50 {
- optional .benchmarks.google_message3.Enum8862 field10266 = 51;
- optional int32 field10267 = 52;
- optional int32 field10268 = 53;
- optional int32 field10269 = 54;
- }
- optional int32 field10202 = 3;
- optional int32 field10203 = 4;
- optional int32 field10204 = 5;
- optional bool field10205 = 84;
- optional bool field10206 = 33;
- optional int32 field10207 = 75;
- optional float field10208 = 26;
- optional int32 field10209 = 27;
- optional int32 field10210 = 49;
- optional int32 field10211 = 10;
- optional float field10212 = 78;
- optional .benchmarks.google_message3.Message9151 field10213 = 91;
- optional int32 field10214 = 11;
- optional int32 field10215 = 12;
- optional float field10216 = 41;
- optional .benchmarks.google_message3.Message10154 field10217 = 61;
- optional int32 field10218 = 23;
- optional bytes field10219 = 24;
- optional int32 field10220 = 65;
- repeated bytes field10221 = 66;
- optional int32 field10222 = 70;
- optional bytes field10223 = 71;
- repeated fixed64 field10224 = 73;
- optional float field10225 = 29;
- optional int32 field10226 = 30;
- optional float field10227 = 31;
- optional int32 field10228 = 32;
- optional float field10229 = 34;
- optional int32 field10230 = 35;
- optional string field10231 = 22;
- optional fixed64 field10232 = 13;
- optional fixed64 field10233 = 20;
- optional bool field10234 = 79;
- repeated .benchmarks.google_message3.Enum10167 field10235 = 80
- [packed = true];
- optional int32 field10236 = 14;
- optional int32 field10237 = 15;
- optional int32 field10238 = 28;
- repeated string field10239 = 16;
- optional .benchmarks.google_message3.Message9182 field10240 = 17;
- optional int32 field10241 = 63;
- optional float field10242 = 64;
- optional float field10243 = 37;
- repeated float field10244 = 43;
- optional int32 field10245 = 44;
- optional .benchmarks.google_message3.Message9242 field10246 = 45;
- optional .benchmarks.google_message3.UnusedEmptyMessage field10247 = 46;
- optional .benchmarks.google_message3.UnusedEmptyMessage field10248 = 62;
- optional .benchmarks.google_message3.Message8944 field10249 = 48;
- optional .benchmarks.google_message3.UnusedEmptyMessage field10250 = 87;
- optional int32 field10251 = 58;
- optional int32 field10252 = 92;
- optional .benchmarks.google_message3.Message9123 field10253 = 93;
- optional .benchmarks.google_message3.Message9160 field10254 = 60;
- optional .benchmarks.google_message3.Message8890 field10255 = 67;
- optional string field10256 = 69;
- optional int64 field10257 = 74;
- optional float field10258 = 82;
- optional float field10259 = 85;
- optional float field10260 = 86;
- optional int64 field10261 = 83;
- optional string field10262 = 77;
- optional bool field10263 = 88;
- repeated .benchmarks.google_message3.Message9628 field10264 = 94;
- extensions 57 to 57;
- extensions 1000 to 536870911;
-}
-
-message Message11866 {
- required .benchmarks.google_message3.Message11014 field11868 = 1;
- optional bool field11869 = 2;
- optional double field11870 = 3;
- optional double field11871 = 4;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field11872 = 5;
-}
-
-message Message10469 {
- optional string field10473 = 1;
- optional float field10474 = 2;
- optional int32 field10475 = 3;
- optional int32 field10476 = 4;
- optional int32 field10477 = 5;
- optional bool field10478 = 6;
- optional bool field10479 = 7;
- optional int32 field10480 = 8;
- optional float field10481 = 9;
-}
-
-message Message10818 {
- optional .benchmarks.google_message3.Message10800 field10819 = 1;
- optional .benchmarks.google_message3.Message10801 field10820 = 2;
-}
-
-message Message10773 {
- optional bool field10774 = 9;
- optional bool field10775 = 1;
- optional bool field10776 = 23;
- optional bool field10777 = 2;
- optional bool field10778 = 3;
- optional int32 field10779 = 4;
- optional int32 field10780 = 5;
- optional int32 field10781 = 6;
- optional int32 field10782 = 7;
- optional int32 field10783 = 8;
- optional int32 field10784 = 10;
- optional .benchmarks.google_message3.Message10749 field10785 = 11;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field10786 = 12;
- optional bool field10787 = 13;
- optional bool field10788 = 15;
- optional bool field10789 = 16;
- optional int32 field10790 = 17;
- optional int32 field10791 = 18;
- optional bool field10792 = 19;
- optional bool field10793 = 20;
- optional bool field10794 = 21;
- optional .benchmarks.google_message3.UnusedEnum field10795 = 14;
- optional .benchmarks.google_message3.UnusedEnum field10796 = 22;
-}
-
-message Message13145 {
- required .benchmarks.google_message3.Enum13146 field13155 = 1;
- optional float field13156 = 2;
- optional float field13157 = 3;
- extensions 1000 to 536870911;
-}
-
-message Message16686 {}
-
-message Message12796 {
- repeated fixed64 field12800 = 1;
- optional uint64 field12801 = 2;
-}
-
-message Message6722 {}
-
-message Message6727 {}
-
-message Message6724 {}
-
-message Message6735 {}
-
-message Message8183 {
- optional string field8226 = 1;
- optional string field8227 = 2;
-}
-
-message Message8301 {
- optional string field8328 = 1;
- optional .benchmarks.google_message3.Message7966 field8329 = 2;
- optional string field8330 = 3;
- optional string field8331 = 4;
- repeated .benchmarks.google_message3.Message8290 field8332 = 5;
- optional .benchmarks.google_message3.Message7966 field8333 = 6;
- repeated .benchmarks.google_message3.Message8298 field8334 = 7;
- optional .benchmarks.google_message3.Message8300 field8335 = 8;
- optional int64 field8336 = 9;
- optional .benchmarks.google_message3.UnusedEmptyMessage field8337 = 10;
- optional .benchmarks.google_message3.Message7965 field8338 = 11;
- extensions 64 to 536870911;
-}
-
-message Message8456 {}
-
-message Message8302 {
- optional string field8339 = 1;
- optional .benchmarks.google_message3.Message7966 field8340 = 2;
- optional string field8341 = 3;
- optional string field8342 = 4;
- optional string field8343 = 5;
- optional string field8344 = 6;
- optional string field8345 = 7;
- optional int64 field8346 = 8;
- optional int64 field8347 = 9;
- repeated .benchmarks.google_message3.Message8290 field8348 = 10;
- optional string field8349 = 11;
- optional .benchmarks.google_message3.UnusedEmptyMessage field8350 = 12;
- optional .benchmarks.google_message3.Message8291 field8351 = 13;
- optional int64 field8352 = 14;
- optional .benchmarks.google_message3.Message8296 field8353 = 15;
- optional string field8354 = 16;
- optional .benchmarks.google_message3.UnusedEmptyMessage field8355 = 17;
- repeated int32 field8356 = 18;
- repeated int32 field8357 = 19;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field8358 = 20;
- optional .benchmarks.google_message3.Message7965 field8359 = 21;
- extensions 64 to 536870911;
-}
-
-message Message8457 {}
-
-message Message8449 {
- optional string field8458 = 1;
- optional bool field8459 = 2;
- optional .benchmarks.google_message3.Enum8450 field8460 = 3;
- repeated string field8461 = 4;
- optional string field8462 = 5;
- optional string field8463 = 6;
- optional .benchmarks.google_message3.Message7966 field8464 = 7;
-}
-
-message Message13358 {
- required fixed64 field13359 = 1;
- required fixed64 field13360 = 2;
- optional .benchmarks.google_message3.UnusedEmptyMessage field13361 = 3;
-}
-
-message Message13912 {
- required fixed32 field13913 = 1;
- required fixed32 field13914 = 2;
- optional .benchmarks.google_message3.UnusedEmptyMessage field13915 = 500;
- optional .benchmarks.google_message3.UnusedEmptyMessage field13916 = 15;
-}
-
-message Message24316 {
- repeated string field24443 = 1;
- repeated string field24444 = 2;
- repeated string field24445 = 3;
-}
-
-message Message24312 {
- optional string field24421 = 1;
- optional string field24422 = 2;
- repeated string field24423 = 3;
- repeated string field24424 = 4;
- repeated string field24425 = 5;
- repeated string field24426 = 6;
-}
-
-message Message24313 {
- optional string field24427 = 1;
- optional string field24428 = 2;
- repeated string field24429 = 3;
- optional string field24430 = 4;
- optional string field24431 = 5;
- optional string field24432 = 6;
- optional string field24433 = 7;
- repeated string field24434 = 8;
- optional string field24435 = 9;
- repeated string field24436 = 10;
-}
-
-message Message24315 {
- required string field24440 = 1;
- repeated string field24441 = 2;
- repeated string field24442 = 3;
-}
-
-message Message716 {
- required string field872 = 1;
- required int32 field873 = 2;
- optional bool field874 = 3;
- optional .benchmarks.google_message3.Message717 field875 = 4;
-}
-
-message Message718 {
- repeated string field878 = 1;
- repeated string field879 = 2;
- optional string field880 = 3;
-}
-
-message Message703 {
- required string field795 = 1;
- repeated string field796 = 2;
- repeated string field797 = 3;
- optional string field798 = 4;
- repeated string field799 = 5;
-}
-
-message Message715 {
- required string field859 = 1;
- optional string field860 = 7;
- repeated .benchmarks.google_message3.Message707 field861 = 2;
- repeated .benchmarks.google_message3.Message708 field862 = 3;
- repeated .benchmarks.google_message3.Message711 field863 = 4;
- repeated .benchmarks.google_message3.Message712 field864 = 5;
- repeated .benchmarks.google_message3.Message713 field865 = 6;
- repeated .benchmarks.google_message3.Message714 field866 = 8;
- repeated .benchmarks.google_message3.Message710 field867 = 9;
- repeated .benchmarks.google_message3.Message709 field868 = 10;
- repeated .benchmarks.google_message3.Message705 field869 = 11;
- repeated .benchmarks.google_message3.Message702 field870 = 12;
- repeated .benchmarks.google_message3.Message706 field871 = 13;
-}
-
-message Message700 {
- repeated string field789 = 1;
- repeated string field790 = 2;
-}
-
-message Message699 {
- required string field787 = 1;
- repeated string field788 = 2;
-}
-
-message Message698 {
- optional string field779 = 1;
- optional string field780 = 2;
- optional string field781 = 3;
- optional string field782 = 4;
- optional uint64 field783 = 5;
- optional uint32 field784 = 6;
- optional int64 field785 = 7;
- repeated string field786 = 8;
-}
diff --git a/benchmarks/datasets/google_message3/benchmark_message3_6.proto b/benchmarks/datasets/google_message3/benchmark_message3_6.proto
deleted file mode 100644
index c766f7c..0000000
--- a/benchmarks/datasets/google_message3/benchmark_message3_6.proto
+++ /dev/null
@@ -1,483 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// LINT: ALLOW_GROUPS
-
-syntax = "proto2";
-
-package benchmarks.google_message3;
-
-import "datasets/google_message3/benchmark_message3_7.proto";
-import "datasets/google_message3/benchmark_message3_8.proto";
-
-option cc_enable_arenas = true;
-option java_package = "com.google.protobuf.benchmarks";
-
-message Message10576 {}
-
-message Message10154 {
- optional bytes field10192 = 1;
- optional int32 field10193 = 2;
-}
-
-message Message8944 {
- optional string field9045 = 2;
- optional string field9046 = 3;
- optional string field9047 = 23;
- optional string field9048 = 52;
- optional int32 field9049 = 53;
- optional int32 field9050 = 54;
- optional float field9051 = 55;
- optional float field9052 = 56;
- optional string field9053 = 57;
- optional int64 field9054 = 1;
- optional bool field9055 = 4;
- optional int32 field9056 = 5;
- optional int32 field9057 = 6;
- optional int32 field9058 = 7;
- optional float field9059 = 8;
- optional float field9060 = 11;
- optional float field9061 = 9;
- optional float field9062 = 10;
- optional float field9063 = 13;
- optional bool field9064 = 14;
- optional float field9065 = 70;
- optional int32 field9066 = 71;
- optional .benchmarks.google_message3.Enum8945 field9067 = 15;
- optional int32 field9068 = 16;
- optional int32 field9069 = 17;
- optional float field9070 = 18;
- optional float field9071 = 19;
- optional int32 field9072 = 28;
- optional int32 field9073 = 29;
- optional float field9074 = 60;
- optional float field9075 = 61;
- optional int32 field9076 = 72;
- optional int32 field9077 = 73;
- optional .benchmarks.google_message3.Enum8951 field9078 = 62;
- optional string field9079 = 20;
- optional string field9080 = 21;
- optional string field9081 = 22;
- optional double field9082 = 31;
- optional double field9083 = 32;
- optional double field9084 = 33;
- optional double field9085 = 36;
- optional .benchmarks.google_message3.UnusedEnum field9086 = 37;
- optional double field9087 = 38;
- optional double field9088 = 39;
- optional double field9089 = 63;
- optional double field9090 = 64;
- optional double field9091 = 65;
- optional double field9092 = 34;
- optional .benchmarks.google_message3.UnusedEnum field9093 = 35;
- optional .benchmarks.google_message3.UnusedEnum field9094 = 66;
- optional string field9095 = 40;
- optional string field9096 = 41;
- optional string field9097 = 42;
- optional string field9098 = 43;
- optional string field9099 = 44;
- optional string field9100 = 45;
- optional string field9101 = 46;
- optional string field9102 = 47;
- optional string field9103 = 48;
- optional string field9104 = 49;
- optional .benchmarks.google_message3.Message8939 field9105 = 100;
- optional int64 field9106 = 101;
-}
-
-message Message9182 {
- optional string field9205 = 1;
- optional string field9206 = 2;
- optional float field9207 = 16;
- optional int32 field9208 = 17;
- optional int32 field9209 = 27;
- optional int32 field9210 = 7;
- optional int32 field9211 = 8;
- optional float field9212 = 26;
- optional float field9213 = 22;
- optional bool field9214 = 28;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field9215 = 21;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field9216 = 25;
- repeated .benchmarks.google_message3.Message9181 field9217 = 29;
- optional bool field9218 = 18;
- optional bool field9219 = 19;
- optional bool field9220 = 20;
- optional .benchmarks.google_message3.Message9164 field9221 = 30;
- optional .benchmarks.google_message3.Message9165 field9222 = 31;
- optional .benchmarks.google_message3.Message9166 field9223 = 32;
- optional float field9224 = 33;
- optional .benchmarks.google_message3.Message9151 field9225 = 34;
- optional float field9226 = 35;
- optional float field9227 = 36;
- optional float field9228 = 37;
- optional float field9229 = 38;
- optional float field9230 = 39;
- extensions 3 to 6;
- extensions 9 to 15;
- extensions 23 to 23;
- extensions 24 to 24;
- extensions 1000 to 536870911;
-}
-
-message Message9160 {
- optional int32 field9161 = 1;
- optional bytes field9162 = 2;
-}
-
-message Message9242 {
- repeated .benchmarks.google_message3.Enum9243 field9327 = 1;
-}
-
-message Message8890 {
- repeated .benchmarks.google_message3.Message8888 field8916 = 1;
-}
-
-message Message9123 {
- optional float field9135 = 1;
-}
-
-message Message9628 {
- optional .benchmarks.google_message3.Message9627 field9673 = 1;
- optional string field9674 = 2;
- repeated int32 field9675 = 3;
- optional int32 field9676 = 4;
-}
-
-message Message11014 {
- optional int32 field11780 = 40;
- optional string field11781 = 46;
- optional bool field11782 = 47;
- optional .benchmarks.google_message3.Enum11107 field11783 = 1;
- optional int32 field11784 = 2;
- optional double field11785 = 4;
- optional int32 field11786 = 5;
- optional int32 field11787 = 6;
- optional double field11788 = 7;
- optional double field11789 = 8;
- optional int64 field11790 = 9;
- optional bool field11791 = 10;
- optional int64 field11792 = 28;
- optional bool field11793 = 37;
- optional .benchmarks.google_message3.Enum11541 field11794 = 44;
- optional double field11795 = 49;
- optional double field11796 = 51;
- optional int64 field11797 = 54;
- optional int64 field11798 = 55;
- optional .benchmarks.google_message3.UnusedEnum field11799 = 57;
- optional .benchmarks.google_message3.Enum11468 field11800 = 58;
- optional int32 field11801 = 59;
- optional .benchmarks.google_message3.UnusedEnum field11802 = 60;
- optional int32 field11803 = 61;
- optional int32 field11804 = 62;
- optional int32 field11805 = 69;
- optional .benchmarks.google_message3.UnusedEmptyMessage field11806 = 68;
- repeated .benchmarks.google_message3.Message11018 field11807 = 71;
- optional bool field11808 = 50;
- optional bool field11809 = 56;
- optional bool field11810 = 66;
- optional bool field11811 = 63;
- optional bool field11812 = 64;
- optional bool field11813 = 65;
- optional bool field11814 = 67;
- optional .benchmarks.google_message3.Enum11107 field11815 = 15;
- optional int64 field11816 = 16;
- optional double field11817 = 17;
- optional int64 field11818 = 18;
- optional int32 field11819 = 19;
- optional int64 field11820 = 20;
- optional int32 field11821 = 42;
- optional int64 field11822 = 52;
- optional int64 field11823 = 53;
- optional int64 field11824 = 41;
- optional double field11825 = 48;
- repeated .benchmarks.google_message3.Message11020 field11826 = 70;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field11827 = 72;
- optional double field11828 = 25;
- optional string field11829 = 26;
- optional int64 field11830 = 27;
- optional int64 field11831 = 32;
- optional uint64 field11832 = 33;
- optional bool field11833 = 29;
- optional bool field11834 = 34;
- optional string field11835 = 30;
- optional int32 field11836 = 3;
- optional int32 field11837 = 31;
- optional int32 field11838 = 73;
- optional int32 field11839 = 35;
- optional .benchmarks.google_message3.Enum11022 field11840 = 36;
- optional .benchmarks.google_message3.Message11013 field11841 = 38;
- optional double field11842 = 39;
- optional int32 field11843 = 45;
- optional bool field11844 = 74;
-}
-
-message Message10801 {
- optional .benchmarks.google_message3.Message10800 field10812 = 1;
- repeated .benchmarks.google_message3.Message10802 field10813 = 2;
- optional int32 field10814 = 3;
-}
-
-message Message10749 {
- repeated .benchmarks.google_message3.Message10748 field10754 = 1;
-}
-
-message Message8298 {
- optional .benchmarks.google_message3.Message7966 field8321 = 1;
- optional int64 field8322 = 2;
- optional string field8323 = 3;
-}
-
-message Message8300 {
- optional string field8326 = 1;
- optional .benchmarks.google_message3.Message7966 field8327 = 2;
-}
-
-message Message8291 {
- optional string field8306 = 1;
- optional int32 field8307 = 2;
- optional string field8308 = 3;
- optional string field8309 = 4;
- optional .benchmarks.google_message3.Enum8292 field8310 = 5;
-}
-
-message Message8296 {
- optional .benchmarks.google_message3.Message7966 field8311 = 1;
- optional string field8312 = 2;
- optional .benchmarks.google_message3.Message7966 field8313 = 3;
- optional int32 field8314 = 4;
- optional int32 field8315 = 5;
- optional string field8316 = 6;
-}
-
-message Message7965 {
- optional int32 field7967 = 1;
- optional int32 field7968 = 2;
-}
-
-message Message8290 {
- optional string field8304 = 1;
- optional string field8305 = 2;
-}
-
-message Message717 {
- repeated string field876 = 1;
- optional double field877 = 2;
-}
-
-message Message713 {
- required .benchmarks.google_message3.Message708 field852 = 1;
- repeated string field853 = 2;
-}
-
-message Message705 {
- required string field807 = 1;
- optional string field808 = 2;
- optional string field809 = 3;
- optional bool field810 = 4;
- optional string field811 = 5;
- optional string field812 = 6;
- repeated string field813 = 7;
-}
-
-message Message709 {
- repeated string field829 = 1;
- repeated string field830 = 2;
- repeated string field831 = 3;
- repeated string field832 = 4;
- repeated string field833 = 5;
-}
-
-message Message702 {
- optional string field793 = 1;
- optional string field794 = 2;
-}
-
-message Message714 {
- optional string field854 = 1;
- optional string field855 = 2;
- optional string field856 = 3;
- optional string field857 = 4;
- optional uint32 field858 = 5;
-}
-
-message Message710 {
- repeated string field834 = 1;
- optional string field835 = 2;
- optional string field836 = 3;
- repeated string field837 = 4;
- repeated string field838 = 5;
-}
-
-message Message706 {
- repeated string field814 = 1;
- optional string field815 = 2;
- repeated string field816 = 3;
- repeated string field817 = 4;
-}
-
-message Message707 {
- required string field818 = 1;
- required string field819 = 2;
- required string field820 = 3;
- optional bool field821 = 4;
- repeated string field822 = 5;
-}
-
-message Message711 {
- optional .benchmarks.google_message3.UnusedEmptyMessage field839 = 1;
- repeated string field840 = 4;
- repeated string field841 = 2;
- repeated string field842 = 3;
-}
-
-message Message712 {
- repeated string field843 = 1;
- required string field844 = 2;
- optional string field845 = 3;
- repeated string field846 = 4;
- repeated string field847 = 5;
- optional string field848 = 6;
- repeated string field849 = 7;
- optional string field850 = 8;
- optional string field851 = 9;
-}
-
-message Message8939 {
- optional string field9010 = 1;
- optional string field9011 = 2;
- optional string field9012 = 3;
- repeated string field9013 = 4;
- optional string field9014 = 5;
- repeated group Message8940 = 11 {}
- optional int64 field9016 = 21;
- optional int64 field9017 = 22;
- optional int64 field9018 = 23;
- optional group Message8941 = 31 {
- optional string field9033 = 32;
- optional string field9034 = 33;
- optional string field9035 = 34;
- optional string field9036 = 35;
- optional string field9037 = 36;
- optional string field9038 = 37;
- }
- optional .benchmarks.google_message3.Message8942 field9020 = 38;
- repeated .benchmarks.google_message3.UnusedEmptyMessage field9021 = 39;
- repeated string field9022 = 41;
- optional string field9023 = 42;
- optional string field9024 = 43;
- optional string field9025 = 44;
- optional string field9026 = 45;
- optional string field9027 = 46;
- optional string field9028 = 47;
- optional .benchmarks.google_message3.UnusedEnum field9029 = 48;
- optional .benchmarks.google_message3.UnusedEnum field9030 = 49;
- optional group Message8943 = 51 {
- optional string field9039 = 1;
- optional string field9040 = 2;
- optional string field9041 = 3;
- optional string field9042 = 4;
- optional string field9043 = 5;
- optional string field9044 = 6;
- }
-}
-
-message Message9181 {
- optional string field9204 = 1;
-}
-
-message Message9164 {
- optional int32 field9168 = 1;
- optional int32 field9169 = 2;
- optional int32 field9170 = 3;
-}
-
-message Message9165 {
- optional float field9171 = 1;
- optional float field9172 = 2;
-}
-
-message Message9166 {
- optional float field9173 = 1;
- optional int32 field9174 = 2;
-}
-
-message Message9151 {
- optional double field9152 = 1;
- optional double field9153 = 2;
- optional float field9154 = 3;
- optional float field9155 = 4;
- optional float field9156 = 5;
- optional float field9157 = 6;
- optional float field9158 = 7;
- optional float field9159 = 8;
-}
-
-message Message8888 {
- optional int32 field8908 = 1;
- optional .benchmarks.google_message3.Enum8900 field8909 = 4;
- repeated int32 field8910 = 2 [packed = true];
- optional bytes field8911 = 3;
-}
-
-message Message9627 {
- required int32 field9668 = 1;
- required int32 field9669 = 2;
- required int32 field9670 = 3;
- required int32 field9671 = 4;
- optional float field9672 = 5;
-}
-
-message Message11020 {}
-
-message Message11013 {
- optional bytes field11757 = 19;
- optional bytes field11758 = 1;
- optional bytes field11759 = 2;
- optional bytes field11760 = 3;
- optional bytes field11761 = 4;
- optional bytes field11762 = 5;
- optional bytes field11763 = 6;
- optional bytes field11764 = 7;
- optional bytes field11765 = 8;
- optional bytes field11766 = 9;
- optional bytes field11767 = 10;
- optional bytes field11768 = 11;
- optional bytes field11769 = 12;
- optional bytes field11770 = 13;
- optional bytes field11771 = 14;
- optional bytes field11772 = 15;
- optional bytes field11773 = 16;
- optional bytes field11774 = 17;
- optional bytes field11775 = 18;
- optional bytes field11776 = 20;
- optional bytes field11777 = 21;
- optional .benchmarks.google_message3.UnusedEmptyMessage field11778 = 23;
- repeated .benchmarks.google_message3.Message11011 field11779 = 22;
-}
diff --git a/benchmarks/datasets/google_message3/benchmark_message3_7.proto b/benchmarks/datasets/google_message3/benchmark_message3_7.proto
deleted file mode 100644
index 0f8f10c..0000000
--- a/benchmarks/datasets/google_message3/benchmark_message3_7.proto
+++ /dev/null
@@ -1,81 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-syntax = "proto2";
-
-package benchmarks.google_message3;
-
-option cc_enable_arenas = true;
-option java_package = "com.google.protobuf.benchmarks";
-
-message Message11018 {}
-
-message Message10800 {
- optional string field10808 = 1;
- optional int64 field10809 = 2;
- optional bool field10810 = 3;
- optional float field10811 = 4;
-}
-
-message Message10802 {}
-
-message Message10748 {
- optional string field10750 = 1;
- optional int32 field10751 = 2;
- optional int32 field10752 = 3;
- optional int32 field10753 = 4;
-}
-
-message Message7966 {
- optional string field7969 = 1;
- optional bool field7970 = 2;
-}
-
-message Message708 {
- optional .benchmarks.google_message3.Message741 field823 = 1;
- repeated string field824 = 6;
- optional string field825 = 2;
- optional string field826 = 3;
- repeated string field827 = 4;
- repeated string field828 = 5;
-}
-
-message Message8942 {}
-
-message Message11011 {
- required bytes field11752 = 1;
- required bytes field11753 = 2;
-}
-
-message UnusedEmptyMessage {}
-
-message Message741 {
- repeated string field936 = 1;
-}
diff --git a/benchmarks/datasets/google_message3/benchmark_message3_8.proto b/benchmarks/datasets/google_message3/benchmark_message3_8.proto
deleted file mode 100644
index 68fe8e9..0000000
--- a/benchmarks/datasets/google_message3/benchmark_message3_8.proto
+++ /dev/null
@@ -1,1925 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-syntax = "proto2";
-
-package benchmarks.google_message3;
-
-option cc_enable_arenas = true;
-option java_package = "com.google.protobuf.benchmarks";
-
-enum Enum720 {
- ENUM_VALUE721 = 1;
- ENUM_VALUE722 = 2;
-}
-
-enum Enum3476 {
- ENUM_VALUE3477 = 0;
- ENUM_VALUE3478 = 1;
- ENUM_VALUE3479 = 2;
- ENUM_VALUE3480 = 3;
- ENUM_VALUE3481 = 4;
- ENUM_VALUE3482 = 5;
- ENUM_VALUE3483 = 6;
- ENUM_VALUE3484 = 7;
- ENUM_VALUE3485 = 8;
- ENUM_VALUE3486 = 9;
- ENUM_VALUE3487 = 10;
- ENUM_VALUE3488 = 11;
- ENUM_VALUE3489 = 12;
- ENUM_VALUE3490 = 13;
- ENUM_VALUE3491 = 14;
- ENUM_VALUE3492 = 15;
- ENUM_VALUE3493 = 16;
- ENUM_VALUE3494 = 17;
- ENUM_VALUE3495 = 18;
- ENUM_VALUE3496 = 19;
- ENUM_VALUE3497 = 20;
- ENUM_VALUE3498 = 21;
- ENUM_VALUE3499 = 22;
- ENUM_VALUE3500 = 23;
- ENUM_VALUE3501 = 24;
- ENUM_VALUE3502 = 25;
- ENUM_VALUE3503 = 26;
- ENUM_VALUE3504 = 27;
- ENUM_VALUE3505 = 28;
- ENUM_VALUE3506 = 29;
- ENUM_VALUE3507 = 30;
- ENUM_VALUE3508 = 31;
- ENUM_VALUE3509 = 32;
- ENUM_VALUE3510 = 33;
- ENUM_VALUE3511 = 34;
- ENUM_VALUE3512 = 35;
- ENUM_VALUE3513 = 36;
- ENUM_VALUE3514 = 37;
- ENUM_VALUE3515 = 38;
- ENUM_VALUE3516 = 39;
- ENUM_VALUE3517 = 40;
- ENUM_VALUE3518 = 41;
- ENUM_VALUE3519 = 42;
- ENUM_VALUE3520 = 43;
- ENUM_VALUE3521 = 44;
- ENUM_VALUE3522 = 45;
- ENUM_VALUE3523 = 46;
- ENUM_VALUE3524 = 47;
- ENUM_VALUE3525 = 48;
- ENUM_VALUE3526 = 49;
- ENUM_VALUE3527 = 50;
- ENUM_VALUE3528 = 51;
- ENUM_VALUE3529 = 52;
- ENUM_VALUE3530 = 53;
- ENUM_VALUE3531 = 54;
- ENUM_VALUE3532 = 55;
- ENUM_VALUE3533 = 56;
- ENUM_VALUE3534 = 57;
- ENUM_VALUE3535 = 58;
- ENUM_VALUE3536 = 59;
- ENUM_VALUE3537 = 60;
- ENUM_VALUE3538 = 61;
- ENUM_VALUE3539 = 62;
- ENUM_VALUE3540 = 63;
- ENUM_VALUE3541 = 64;
- ENUM_VALUE3542 = 65;
- ENUM_VALUE3543 = 66;
- ENUM_VALUE3544 = 67;
- ENUM_VALUE3545 = 68;
- ENUM_VALUE3546 = 69;
- ENUM_VALUE3547 = 70;
- ENUM_VALUE3548 = 71;
- ENUM_VALUE3549 = 72;
- ENUM_VALUE3550 = 73;
- ENUM_VALUE3551 = 74;
- ENUM_VALUE3552 = 75;
- ENUM_VALUE3553 = 76;
- ENUM_VALUE3554 = 77;
- ENUM_VALUE3555 = 78;
- ENUM_VALUE3556 = 79;
- ENUM_VALUE3557 = 80;
- ENUM_VALUE3558 = 81;
- ENUM_VALUE3559 = 82;
- ENUM_VALUE3560 = 83;
- ENUM_VALUE3561 = 84;
- ENUM_VALUE3562 = 85;
- ENUM_VALUE3563 = 86;
- ENUM_VALUE3564 = 87;
- ENUM_VALUE3565 = 88;
- ENUM_VALUE3566 = 89;
- ENUM_VALUE3567 = 90;
- ENUM_VALUE3568 = 91;
- ENUM_VALUE3569 = 92;
- ENUM_VALUE3570 = 93;
- ENUM_VALUE3571 = 94;
- ENUM_VALUE3572 = 95;
- ENUM_VALUE3573 = 96;
- ENUM_VALUE3574 = 97;
- ENUM_VALUE3575 = 98;
- ENUM_VALUE3576 = 99;
- ENUM_VALUE3577 = 100;
- ENUM_VALUE3578 = 101;
- ENUM_VALUE3579 = 102;
- ENUM_VALUE3580 = 103;
- ENUM_VALUE3581 = 104;
- ENUM_VALUE3582 = 105;
- ENUM_VALUE3583 = 106;
- ENUM_VALUE3584 = 107;
- ENUM_VALUE3585 = 108;
- ENUM_VALUE3586 = 109;
- ENUM_VALUE3587 = 110;
- ENUM_VALUE3588 = 111;
- ENUM_VALUE3589 = 112;
- ENUM_VALUE3590 = 113;
- ENUM_VALUE3591 = 114;
- ENUM_VALUE3592 = 115;
- ENUM_VALUE3593 = 116;
- ENUM_VALUE3594 = 117;
- ENUM_VALUE3595 = 118;
- ENUM_VALUE3596 = 119;
- ENUM_VALUE3597 = 120;
- ENUM_VALUE3598 = 121;
- ENUM_VALUE3599 = 122;
- ENUM_VALUE3600 = 123;
- ENUM_VALUE3601 = 124;
- ENUM_VALUE3602 = 125;
- ENUM_VALUE3603 = 126;
- ENUM_VALUE3604 = 127;
- ENUM_VALUE3605 = 128;
- ENUM_VALUE3606 = 129;
- ENUM_VALUE3607 = 130;
- ENUM_VALUE3608 = 131;
- ENUM_VALUE3609 = 132;
- ENUM_VALUE3610 = 133;
- ENUM_VALUE3611 = 134;
- ENUM_VALUE3612 = 135;
- ENUM_VALUE3613 = 136;
- ENUM_VALUE3614 = 137;
- ENUM_VALUE3615 = 138;
- ENUM_VALUE3616 = 139;
- ENUM_VALUE3617 = 140;
- ENUM_VALUE3618 = 141;
- ENUM_VALUE3619 = 142;
- ENUM_VALUE3620 = 143;
- ENUM_VALUE3621 = 144;
- ENUM_VALUE3622 = 145;
- ENUM_VALUE3623 = 146;
- ENUM_VALUE3624 = 147;
- ENUM_VALUE3625 = 148;
- ENUM_VALUE3626 = 149;
- ENUM_VALUE3627 = 150;
- ENUM_VALUE3628 = 151;
- ENUM_VALUE3629 = 152;
- ENUM_VALUE3630 = 153;
- ENUM_VALUE3631 = 154;
- ENUM_VALUE3632 = 155;
- ENUM_VALUE3633 = 156;
- ENUM_VALUE3634 = 157;
- ENUM_VALUE3635 = 158;
- ENUM_VALUE3636 = 159;
- ENUM_VALUE3637 = 160;
- ENUM_VALUE3638 = 161;
- ENUM_VALUE3639 = 162;
- ENUM_VALUE3640 = 163;
- ENUM_VALUE3641 = 164;
- ENUM_VALUE3642 = 165;
- ENUM_VALUE3643 = 166;
- ENUM_VALUE3644 = 167;
- ENUM_VALUE3645 = 168;
- ENUM_VALUE3646 = 169;
- ENUM_VALUE3647 = 170;
- ENUM_VALUE3648 = 171;
- ENUM_VALUE3649 = 172;
- ENUM_VALUE3650 = 173;
- ENUM_VALUE3651 = 174;
- ENUM_VALUE3652 = 175;
- ENUM_VALUE3653 = 176;
- ENUM_VALUE3654 = 177;
- ENUM_VALUE3655 = 178;
- ENUM_VALUE3656 = 179;
- ENUM_VALUE3657 = 180;
- ENUM_VALUE3658 = 181;
- ENUM_VALUE3659 = 182;
- ENUM_VALUE3660 = 183;
-}
-
-enum Enum3805 {
- ENUM_VALUE3806 = 0;
- ENUM_VALUE3807 = 1;
- ENUM_VALUE3808 = 2;
- ENUM_VALUE3809 = 3;
- ENUM_VALUE3810 = 4;
- ENUM_VALUE3811 = 5;
- ENUM_VALUE3812 = 6;
- ENUM_VALUE3813 = 7;
- ENUM_VALUE3814 = 8;
- ENUM_VALUE3815 = 9;
- ENUM_VALUE3816 = 11;
- ENUM_VALUE3817 = 10;
-}
-
-enum Enum3783 {
- ENUM_VALUE3784 = 0;
- ENUM_VALUE3785 = 1;
- ENUM_VALUE3786 = 2;
- ENUM_VALUE3787 = 3;
- ENUM_VALUE3788 = 4;
- ENUM_VALUE3789 = 5;
- ENUM_VALUE3790 = 6;
- ENUM_VALUE3791 = 7;
- ENUM_VALUE3792 = 8;
- ENUM_VALUE3793 = 9;
- ENUM_VALUE3794 = 10;
- ENUM_VALUE3795 = 11;
- ENUM_VALUE3796 = 12;
- ENUM_VALUE3797 = 13;
- ENUM_VALUE3798 = 14;
- ENUM_VALUE3799 = 15;
- ENUM_VALUE3800 = 16;
- ENUM_VALUE3801 = 20;
- ENUM_VALUE3802 = 21;
- ENUM_VALUE3803 = 50;
-}
-
-enum Enum3851 {
- ENUM_VALUE3852 = 0;
- ENUM_VALUE3853 = 1;
- ENUM_VALUE3854 = 2;
- ENUM_VALUE3855 = 3;
- ENUM_VALUE3856 = 4;
- ENUM_VALUE3857 = 5;
- ENUM_VALUE3858 = 6;
- ENUM_VALUE3859 = 7;
- ENUM_VALUE3860 = 8;
- ENUM_VALUE3861 = 9;
- ENUM_VALUE3862 = 10;
- ENUM_VALUE3863 = 11;
- ENUM_VALUE3864 = 12;
- ENUM_VALUE3865 = 13;
- ENUM_VALUE3866 = 14;
- ENUM_VALUE3867 = 15;
- ENUM_VALUE3868 = 16;
- ENUM_VALUE3869 = 17;
-}
-
-enum UnusedEnum {
- UNUSED_ENUM_VALUE1 = 0;
- UNUSED_ENUM_VALUE2 = 1;
-}
-
-enum Enum4146 {
- ENUM_VALUE4147 = 0;
- ENUM_VALUE4148 = 1;
- ENUM_VALUE4149 = 2;
- ENUM_VALUE4150 = 3;
- ENUM_VALUE4151 = 4;
-}
-
-enum Enum4160 {
- ENUM_VALUE4161 = 0;
- ENUM_VALUE4162 = 1;
-}
-
-enum Enum4152 {
- ENUM_VALUE4153 = 0;
- ENUM_VALUE4154 = 1;
- ENUM_VALUE4155 = 2;
- ENUM_VALUE4156 = 3;
- ENUM_VALUE4157 = 4;
- ENUM_VALUE4158 = 5;
- ENUM_VALUE4159 = 6;
-}
-
-enum Enum6025 {
- ENUM_VALUE6026 = 0;
- ENUM_VALUE6027 = 1;
- ENUM_VALUE6028 = 2;
- ENUM_VALUE6029 = 3;
- ENUM_VALUE6030 = 4;
- ENUM_VALUE6031 = 5;
- ENUM_VALUE6032 = 6;
- ENUM_VALUE6033 = 7;
- ENUM_VALUE6034 = 8;
- ENUM_VALUE6035 = 9;
- ENUM_VALUE6036 = 10;
- ENUM_VALUE6037 = 11;
- ENUM_VALUE6038 = 12;
- ENUM_VALUE6039 = 13;
- ENUM_VALUE6040 = 14;
- ENUM_VALUE6041 = 15;
- ENUM_VALUE6042 = 16;
- ENUM_VALUE6043 = 17;
- ENUM_VALUE6044 = 18;
- ENUM_VALUE6045 = 19;
- ENUM_VALUE6046 = 20;
- ENUM_VALUE6047 = 21;
-}
-
-enum Enum6065 {
- ENUM_VALUE6066 = 0;
- ENUM_VALUE6067 = 1;
- ENUM_VALUE6068 = 2;
- ENUM_VALUE6069 = 3;
- ENUM_VALUE6070 = 4;
- ENUM_VALUE6071 = 5;
- ENUM_VALUE6072 = 6;
- ENUM_VALUE6073 = 7;
- ENUM_VALUE6074 = 8;
- ENUM_VALUE6075 = 9;
- ENUM_VALUE6076 = 10;
- ENUM_VALUE6077 = 11;
- ENUM_VALUE6078 = 12;
- ENUM_VALUE6079 = 13;
- ENUM_VALUE6080 = 14;
-}
-
-enum Enum6579 {
- ENUM_VALUE6580 = 0;
- ENUM_VALUE6581 = 2;
- ENUM_VALUE6582 = 3;
- ENUM_VALUE6583 = 5;
- ENUM_VALUE6584 = 10;
- ENUM_VALUE6585 = 15;
- ENUM_VALUE6586 = 25;
- ENUM_VALUE6587 = 30;
-}
-
-enum Enum6588 {
- ENUM_VALUE6589 = 0;
- ENUM_VALUE6590 = 1;
- ENUM_VALUE6591 = 2;
- ENUM_VALUE6592 = 3;
- ENUM_VALUE6593 = 4;
- ENUM_VALUE6594 = 5;
- ENUM_VALUE6595 = 6;
- ENUM_VALUE6596 = 7;
- ENUM_VALUE6597 = 8;
- ENUM_VALUE6598 = 9;
- ENUM_VALUE6599 = 10;
- ENUM_VALUE6600 = 11;
- ENUM_VALUE6601 = 12;
- ENUM_VALUE6602 = 13;
- ENUM_VALUE6603 = 14;
- ENUM_VALUE6604 = 15;
- ENUM_VALUE6605 = 16;
- ENUM_VALUE6606 = 17;
- ENUM_VALUE6607 = 19;
- ENUM_VALUE6608 = 20;
- ENUM_VALUE6609 = 21;
- ENUM_VALUE6610 = 22;
- ENUM_VALUE6611 = 23;
- ENUM_VALUE6612 = 24;
- ENUM_VALUE6613 = 25;
- ENUM_VALUE6614 = 26;
- ENUM_VALUE6615 = 27;
- ENUM_VALUE6616 = 28;
- ENUM_VALUE6617 = 29;
- ENUM_VALUE6618 = 30;
- ENUM_VALUE6619 = 31;
- ENUM_VALUE6620 = 32;
- ENUM_VALUE6621 = 33;
- ENUM_VALUE6622 = 34;
-}
-
-enum Enum6769 {
- ENUM_VALUE6770 = 0;
- ENUM_VALUE6771 = 1;
- ENUM_VALUE6772 = 2;
-}
-
-enum Enum6774 {
- ENUM_VALUE6775 = 0;
- ENUM_VALUE6776 = 1;
- ENUM_VALUE6777 = 2;
- ENUM_VALUE6778 = 3;
- ENUM_VALUE6779 = 4;
- ENUM_VALUE6780 = 5;
- ENUM_VALUE6781 = 6;
-}
-
-enum Enum6782 {
- ENUM_VALUE6783 = 0;
- ENUM_VALUE6784 = 1;
- ENUM_VALUE6785 = 2;
- ENUM_VALUE6786 = 3;
- ENUM_VALUE6787 = 4;
- ENUM_VALUE6788 = 5;
-}
-
-enum Enum6858 {
- ENUM_VALUE6859 = 1;
- ENUM_VALUE6860 = 2;
- ENUM_VALUE6861 = 3;
- ENUM_VALUE6862 = 4;
-}
-
-enum Enum6815 {
- ENUM_VALUE6816 = 0;
- ENUM_VALUE6817 = 1;
- ENUM_VALUE6818 = 2;
- ENUM_VALUE6819 = 3;
- ENUM_VALUE6820 = 4;
- ENUM_VALUE6821 = 5;
-}
-
-enum Enum6822 {
- ENUM_VALUE6823 = 0;
- ENUM_VALUE6824 = 1;
- ENUM_VALUE6825 = 2;
- ENUM_VALUE6826 = 3;
-}
-
-enum Enum7654 {
- ENUM_VALUE7655 = 1;
- ENUM_VALUE7656 = 2;
- ENUM_VALUE7657 = 3;
-}
-
-enum Enum8292 {
- ENUM_VALUE8293 = 0;
- ENUM_VALUE8294 = 1;
- ENUM_VALUE8295 = 2;
-}
-
-enum Enum8450 {
- ENUM_VALUE8451 = 0;
- ENUM_VALUE8452 = 1;
- ENUM_VALUE8453 = 2;
-}
-
-enum Enum8900 {
- ENUM_VALUE8901 = 0;
- ENUM_VALUE8902 = 1;
- ENUM_VALUE8903 = 2;
- ENUM_VALUE8904 = 3;
- ENUM_VALUE8905 = 4;
-}
-
-enum Enum8945 {
- ENUM_VALUE8946 = 0;
- ENUM_VALUE8947 = 1;
- ENUM_VALUE8948 = 2;
- ENUM_VALUE8949 = 3;
- ENUM_VALUE8950 = 4;
-}
-
-enum Enum8951 {
- ENUM_VALUE8952 = 1;
- ENUM_VALUE8953 = 2;
- ENUM_VALUE8954 = 3;
- ENUM_VALUE8955 = 4;
- ENUM_VALUE8956 = 5;
- ENUM_VALUE8957 = 6;
- ENUM_VALUE8958 = 7;
- ENUM_VALUE8959 = 8;
-}
-
-enum Enum9243 {
- ENUM_VALUE9244 = -1;
- ENUM_VALUE9245 = 0;
- ENUM_VALUE9246 = 1;
- ENUM_VALUE9247 = 2;
- ENUM_VALUE9248 = 3;
- ENUM_VALUE9249 = 4;
- ENUM_VALUE9250 = 5;
- ENUM_VALUE9251 = 6;
- ENUM_VALUE9252 = 7;
- ENUM_VALUE9253 = 8;
- ENUM_VALUE9254 = 9;
- ENUM_VALUE9255 = 10;
- ENUM_VALUE9256 = 11;
- ENUM_VALUE9257 = 12;
- ENUM_VALUE9258 = 13;
- ENUM_VALUE9259 = 14;
- ENUM_VALUE9260 = 15;
- ENUM_VALUE9261 = 16;
- ENUM_VALUE9262 = 17;
- ENUM_VALUE9263 = 71;
- ENUM_VALUE9264 = 72;
- ENUM_VALUE9265 = 73;
- ENUM_VALUE9266 = 74;
- ENUM_VALUE9267 = 18;
- ENUM_VALUE9268 = 20;
- ENUM_VALUE9269 = 21;
- ENUM_VALUE9270 = 22;
- ENUM_VALUE9271 = 23;
- ENUM_VALUE9272 = 61;
- ENUM_VALUE9273 = 62;
- ENUM_VALUE9274 = 63;
- ENUM_VALUE9275 = 64;
- ENUM_VALUE9276 = 66;
- ENUM_VALUE9277 = 67;
- ENUM_VALUE9278 = 24;
- ENUM_VALUE9279 = 25;
- ENUM_VALUE9280 = 26;
- ENUM_VALUE9281 = 27;
- ENUM_VALUE9282 = 28;
- ENUM_VALUE9283 = 29;
- ENUM_VALUE9284 = 30;
- ENUM_VALUE9285 = 31;
- ENUM_VALUE9286 = 32;
- ENUM_VALUE9287 = 33;
- ENUM_VALUE9288 = 34;
- ENUM_VALUE9289 = 35;
- ENUM_VALUE9290 = 36;
- ENUM_VALUE9291 = 37;
- ENUM_VALUE9292 = 38;
- ENUM_VALUE9293 = 39;
- ENUM_VALUE9294 = 40;
- ENUM_VALUE9295 = 41;
- ENUM_VALUE9296 = 42;
- ENUM_VALUE9297 = 43;
- ENUM_VALUE9298 = 44;
- ENUM_VALUE9299 = 45;
- ENUM_VALUE9300 = 46;
- ENUM_VALUE9301 = 47;
- ENUM_VALUE9302 = 48;
- ENUM_VALUE9303 = 49;
- ENUM_VALUE9304 = 50;
- ENUM_VALUE9305 = 51;
- ENUM_VALUE9306 = 52;
- ENUM_VALUE9307 = 53;
- ENUM_VALUE9308 = 54;
- ENUM_VALUE9309 = 55;
- ENUM_VALUE9310 = 56;
- ENUM_VALUE9311 = 57;
- ENUM_VALUE9312 = 58;
- ENUM_VALUE9313 = 59;
- ENUM_VALUE9314 = 60;
- ENUM_VALUE9315 = 68;
- ENUM_VALUE9316 = 69;
- ENUM_VALUE9317 = 70;
- ENUM_VALUE9318 = 1000;
- ENUM_VALUE9319 = 1001;
- ENUM_VALUE9320 = 1002;
- ENUM_VALUE9321 = 1003;
- ENUM_VALUE9322 = 1004;
- ENUM_VALUE9323 = 1005;
- ENUM_VALUE9324 = 1006;
- ENUM_VALUE9325 = 1007;
- ENUM_VALUE9326 = 65;
-}
-
-enum Enum10157 {
- ENUM_VALUE10158 = 0;
- ENUM_VALUE10159 = 1;
- ENUM_VALUE10160 = 2;
- ENUM_VALUE10161 = 3;
- ENUM_VALUE10162 = 4;
- ENUM_VALUE10163 = 5;
- ENUM_VALUE10164 = 6;
- ENUM_VALUE10165 = 7;
- ENUM_VALUE10166 = 8;
-}
-
-enum Enum10167 {
- ENUM_VALUE10168 = 0;
- ENUM_VALUE10169 = 1;
- ENUM_VALUE10170 = 2;
- ENUM_VALUE10171 = 3;
- ENUM_VALUE10172 = 4;
- ENUM_VALUE10173 = 5;
- ENUM_VALUE10174 = 6;
- ENUM_VALUE10175 = 7;
- ENUM_VALUE10176 = 8;
-}
-
-enum Enum8862 {
- ENUM_VALUE8863 = 0;
- ENUM_VALUE8864 = 1;
- ENUM_VALUE8865 = 2;
- ENUM_VALUE8866 = 3;
- ENUM_VALUE8867 = 4;
- ENUM_VALUE8868 = 5;
- ENUM_VALUE8869 = 6;
- ENUM_VALUE8870 = 7;
- ENUM_VALUE8871 = 13;
- ENUM_VALUE8872 = 14;
- ENUM_VALUE8873 = 8;
- ENUM_VALUE8874 = 9;
- ENUM_VALUE8875 = 10;
- ENUM_VALUE8876 = 11;
- ENUM_VALUE8877 = 12;
- ENUM_VALUE8878 = 15;
-}
-
-enum Enum10325 {
- ENUM_VALUE10326 = 0;
- ENUM_VALUE10327 = 1;
- ENUM_VALUE10328 = 2;
- ENUM_VALUE10329 = 3;
- ENUM_VALUE10330 = 4;
- ENUM_VALUE10331 = 5;
- ENUM_VALUE10332 = 6;
- ENUM_VALUE10333 = 7;
- ENUM_VALUE10334 = 8;
-}
-
-enum Enum10335 { ENUM_VALUE10336 = 0; }
-
-enum Enum10337 {
- ENUM_VALUE10338 = 0;
- ENUM_VALUE10339 = 1;
-}
-
-enum Enum10392 {
- ENUM_VALUE10393 = 0;
- ENUM_VALUE10394 = 1;
- ENUM_VALUE10395 = 2;
- ENUM_VALUE10396 = 3;
- ENUM_VALUE10397 = 4;
- ENUM_VALUE10398 = 5;
- ENUM_VALUE10399 = 6;
- ENUM_VALUE10400 = 7;
- ENUM_VALUE10401 = 8;
- ENUM_VALUE10402 = 15;
- ENUM_VALUE10403 = 9;
- ENUM_VALUE10404 = 10;
- ENUM_VALUE10405 = 11;
- ENUM_VALUE10406 = 12;
- ENUM_VALUE10407 = 13;
- ENUM_VALUE10408 = 14;
- ENUM_VALUE10409 = 101;
- ENUM_VALUE10410 = 102;
-}
-
-enum Enum11107 {
- ENUM_VALUE11108 = 0;
- ENUM_VALUE11109 = 1;
- ENUM_VALUE11110 = 2;
- ENUM_VALUE11111 = 3;
- ENUM_VALUE11112 = 4;
- ENUM_VALUE11113 = 5;
- ENUM_VALUE11114 = 6;
- ENUM_VALUE11115 = 7;
- ENUM_VALUE11116 = 8;
- ENUM_VALUE11117 = 9;
- ENUM_VALUE11118 = 10;
- ENUM_VALUE11119 = 11;
- ENUM_VALUE11120 = 12;
- ENUM_VALUE11121 = 13;
- ENUM_VALUE11122 = 14;
- ENUM_VALUE11123 = 15;
- ENUM_VALUE11124 = 16;
- ENUM_VALUE11125 = 17;
- ENUM_VALUE11126 = 18;
- ENUM_VALUE11127 = 19;
- ENUM_VALUE11128 = 20;
- ENUM_VALUE11129 = 21;
- ENUM_VALUE11130 = 22;
- ENUM_VALUE11131 = 23;
- ENUM_VALUE11132 = 24;
- ENUM_VALUE11133 = 25;
- ENUM_VALUE11134 = 26;
- ENUM_VALUE11135 = 27;
- ENUM_VALUE11136 = 28;
- ENUM_VALUE11137 = 29;
- ENUM_VALUE11138 = 30;
- ENUM_VALUE11139 = 31;
- ENUM_VALUE11140 = 32;
- ENUM_VALUE11141 = 33;
- ENUM_VALUE11142 = 34;
- ENUM_VALUE11143 = 35;
- ENUM_VALUE11144 = 36;
- ENUM_VALUE11145 = 37;
- ENUM_VALUE11146 = 38;
- ENUM_VALUE11147 = 39;
- ENUM_VALUE11148 = 40;
- ENUM_VALUE11149 = 41;
- ENUM_VALUE11150 = 42;
- ENUM_VALUE11151 = 43;
- ENUM_VALUE11152 = 44;
- ENUM_VALUE11153 = 45;
- ENUM_VALUE11154 = 46;
- ENUM_VALUE11155 = 47;
- ENUM_VALUE11156 = 48;
- ENUM_VALUE11157 = 49;
- ENUM_VALUE11158 = 50;
- ENUM_VALUE11159 = 51;
- ENUM_VALUE11160 = 52;
- ENUM_VALUE11161 = 53;
- ENUM_VALUE11162 = 54;
- ENUM_VALUE11163 = 55;
- ENUM_VALUE11164 = 56;
- ENUM_VALUE11165 = 57;
- ENUM_VALUE11166 = 58;
- ENUM_VALUE11167 = 59;
- ENUM_VALUE11168 = 60;
- ENUM_VALUE11169 = 61;
- ENUM_VALUE11170 = 62;
- ENUM_VALUE11171 = 63;
- ENUM_VALUE11172 = 64;
- ENUM_VALUE11173 = 65;
- ENUM_VALUE11174 = 66;
- ENUM_VALUE11175 = 67;
- ENUM_VALUE11176 = 68;
- ENUM_VALUE11177 = 69;
- ENUM_VALUE11178 = 70;
- ENUM_VALUE11179 = 71;
- ENUM_VALUE11180 = 72;
- ENUM_VALUE11181 = 73;
- ENUM_VALUE11182 = 74;
- ENUM_VALUE11183 = 75;
- ENUM_VALUE11184 = 76;
- ENUM_VALUE11185 = 77;
- ENUM_VALUE11186 = 78;
- ENUM_VALUE11187 = 79;
- ENUM_VALUE11188 = 80;
- ENUM_VALUE11189 = 81;
- ENUM_VALUE11190 = 82;
- ENUM_VALUE11191 = 83;
- ENUM_VALUE11192 = 84;
- ENUM_VALUE11193 = 85;
- ENUM_VALUE11194 = 86;
- ENUM_VALUE11195 = 87;
- ENUM_VALUE11196 = 88;
- ENUM_VALUE11197 = 89;
- ENUM_VALUE11198 = 90;
- ENUM_VALUE11199 = 91;
- ENUM_VALUE11200 = 92;
- ENUM_VALUE11201 = 93;
- ENUM_VALUE11202 = 94;
- ENUM_VALUE11203 = 95;
- ENUM_VALUE11204 = 96;
- ENUM_VALUE11205 = 97;
- ENUM_VALUE11206 = 98;
- ENUM_VALUE11207 = 99;
- ENUM_VALUE11208 = 100;
- ENUM_VALUE11209 = 101;
- ENUM_VALUE11210 = 102;
- ENUM_VALUE11211 = 103;
- ENUM_VALUE11212 = 104;
- ENUM_VALUE11213 = 105;
- ENUM_VALUE11214 = 106;
- ENUM_VALUE11215 = 107;
- ENUM_VALUE11216 = 108;
- ENUM_VALUE11217 = 109;
- ENUM_VALUE11218 = 110;
- ENUM_VALUE11219 = 111;
- ENUM_VALUE11220 = 112;
- ENUM_VALUE11221 = 113;
- ENUM_VALUE11222 = 114;
- ENUM_VALUE11223 = 115;
- ENUM_VALUE11224 = 116;
- ENUM_VALUE11225 = 117;
- ENUM_VALUE11226 = 118;
- ENUM_VALUE11227 = 119;
- ENUM_VALUE11228 = 120;
- ENUM_VALUE11229 = 121;
- ENUM_VALUE11230 = 122;
- ENUM_VALUE11231 = 123;
- ENUM_VALUE11232 = 124;
- ENUM_VALUE11233 = 125;
- ENUM_VALUE11234 = 126;
- ENUM_VALUE11235 = 127;
- ENUM_VALUE11236 = 128;
- ENUM_VALUE11237 = 129;
- ENUM_VALUE11238 = 130;
- ENUM_VALUE11239 = 131;
- ENUM_VALUE11240 = 132;
- ENUM_VALUE11241 = 133;
- ENUM_VALUE11242 = 134;
- ENUM_VALUE11243 = 135;
- ENUM_VALUE11244 = 136;
- ENUM_VALUE11245 = 137;
- ENUM_VALUE11246 = 138;
- ENUM_VALUE11247 = 139;
- ENUM_VALUE11248 = 140;
- ENUM_VALUE11249 = 141;
- ENUM_VALUE11250 = 142;
- ENUM_VALUE11251 = 143;
- ENUM_VALUE11252 = 144;
- ENUM_VALUE11253 = 145;
- ENUM_VALUE11254 = 146;
- ENUM_VALUE11255 = 147;
- ENUM_VALUE11256 = 148;
- ENUM_VALUE11257 = 149;
- ENUM_VALUE11258 = 150;
- ENUM_VALUE11259 = 151;
- ENUM_VALUE11260 = 152;
- ENUM_VALUE11261 = 153;
- ENUM_VALUE11262 = 154;
- ENUM_VALUE11263 = 155;
- ENUM_VALUE11264 = 156;
- ENUM_VALUE11265 = 157;
- ENUM_VALUE11266 = 158;
- ENUM_VALUE11267 = 159;
- ENUM_VALUE11268 = 160;
- ENUM_VALUE11269 = 161;
- ENUM_VALUE11270 = 163;
- ENUM_VALUE11271 = 164;
- ENUM_VALUE11272 = 165;
- ENUM_VALUE11273 = 166;
- ENUM_VALUE11274 = 167;
- ENUM_VALUE11275 = 168;
- ENUM_VALUE11276 = 169;
- ENUM_VALUE11277 = 170;
- ENUM_VALUE11278 = 171;
- ENUM_VALUE11279 = 172;
- ENUM_VALUE11280 = 173;
- ENUM_VALUE11281 = 174;
- ENUM_VALUE11282 = 175;
- ENUM_VALUE11283 = 176;
- ENUM_VALUE11284 = 177;
- ENUM_VALUE11285 = 178;
- ENUM_VALUE11286 = 179;
- ENUM_VALUE11287 = 180;
- ENUM_VALUE11288 = 181;
- ENUM_VALUE11289 = 182;
- ENUM_VALUE11290 = 183;
- ENUM_VALUE11291 = 184;
- ENUM_VALUE11292 = 185;
- ENUM_VALUE11293 = 187;
- ENUM_VALUE11294 = 188;
- ENUM_VALUE11295 = 189;
- ENUM_VALUE11296 = 190;
- ENUM_VALUE11297 = 191;
- ENUM_VALUE11298 = 192;
- ENUM_VALUE11299 = 193;
- ENUM_VALUE11300 = 194;
- ENUM_VALUE11301 = 195;
- ENUM_VALUE11302 = 196;
- ENUM_VALUE11303 = 197;
- ENUM_VALUE11304 = 198;
- ENUM_VALUE11305 = 65535;
- ENUM_VALUE11306 = 65536;
- ENUM_VALUE11307 = 65537;
- ENUM_VALUE11308 = 65538;
- ENUM_VALUE11309 = 65539;
- ENUM_VALUE11310 = 65540;
- ENUM_VALUE11311 = 65541;
- ENUM_VALUE11312 = 65542;
- ENUM_VALUE11313 = 65543;
- ENUM_VALUE11314 = 65544;
- ENUM_VALUE11315 = 65545;
- ENUM_VALUE11316 = 65546;
- ENUM_VALUE11317 = 65547;
- ENUM_VALUE11318 = 65548;
- ENUM_VALUE11319 = 65549;
- ENUM_VALUE11320 = 65550;
- ENUM_VALUE11321 = 65551;
- ENUM_VALUE11322 = 65552;
- ENUM_VALUE11323 = 65553;
- ENUM_VALUE11324 = 65554;
- ENUM_VALUE11325 = 65555;
- ENUM_VALUE11326 = 65556;
- ENUM_VALUE11327 = 65557;
- ENUM_VALUE11328 = 65558;
- ENUM_VALUE11329 = 65559;
- ENUM_VALUE11330 = 65560;
- ENUM_VALUE11331 = 65561;
- ENUM_VALUE11332 = 65562;
- ENUM_VALUE11333 = 65563;
- ENUM_VALUE11334 = 69632;
- ENUM_VALUE11335 = 69633;
- ENUM_VALUE11336 = 69634;
- ENUM_VALUE11337 = 69635;
- ENUM_VALUE11338 = 69636;
- ENUM_VALUE11339 = 69637;
- ENUM_VALUE11340 = 69638;
- ENUM_VALUE11341 = 69639;
- ENUM_VALUE11342 = 69640;
- ENUM_VALUE11343 = 69641;
- ENUM_VALUE11344 = 69642;
- ENUM_VALUE11345 = 69643;
- ENUM_VALUE11346 = 69644;
- ENUM_VALUE11347 = 69645;
- ENUM_VALUE11348 = 69646;
- ENUM_VALUE11349 = 69647;
- ENUM_VALUE11350 = 69648;
- ENUM_VALUE11351 = 69649;
- ENUM_VALUE11352 = 69650;
- ENUM_VALUE11353 = 69651;
- ENUM_VALUE11354 = 69652;
- ENUM_VALUE11355 = 69653;
- ENUM_VALUE11356 = 69654;
- ENUM_VALUE11357 = 69655;
- ENUM_VALUE11358 = 69656;
- ENUM_VALUE11359 = 69657;
- ENUM_VALUE11360 = 69658;
- ENUM_VALUE11361 = 69659;
- ENUM_VALUE11362 = 69660;
- ENUM_VALUE11363 = 69661;
- ENUM_VALUE11364 = 69662;
- ENUM_VALUE11365 = 73728;
- ENUM_VALUE11366 = 73729;
- ENUM_VALUE11367 = 77824;
- ENUM_VALUE11368 = 77825;
- ENUM_VALUE11369 = 81920;
- ENUM_VALUE11370 = 81921;
- ENUM_VALUE11371 = 81922;
- ENUM_VALUE11372 = 81923;
- ENUM_VALUE11373 = 86016;
- ENUM_VALUE11374 = 86017;
- ENUM_VALUE11375 = 86018;
- ENUM_VALUE11376 = 86019;
- ENUM_VALUE11377 = 86020;
- ENUM_VALUE11378 = 86021;
- ENUM_VALUE11379 = 86022;
- ENUM_VALUE11380 = 86023;
- ENUM_VALUE11381 = 86024;
- ENUM_VALUE11382 = 86025;
- ENUM_VALUE11383 = 86026;
- ENUM_VALUE11384 = 86027;
- ENUM_VALUE11385 = 86028;
- ENUM_VALUE11386 = 86029;
- ENUM_VALUE11387 = 86030;
- ENUM_VALUE11388 = 86031;
- ENUM_VALUE11389 = 86032;
- ENUM_VALUE11390 = 86033;
- ENUM_VALUE11391 = 86034;
- ENUM_VALUE11392 = 86035;
- ENUM_VALUE11393 = 86036;
- ENUM_VALUE11394 = 86037;
- ENUM_VALUE11395 = 86038;
- ENUM_VALUE11396 = 86039;
- ENUM_VALUE11397 = 86040;
- ENUM_VALUE11398 = 86041;
- ENUM_VALUE11399 = 86042;
- ENUM_VALUE11400 = 86043;
- ENUM_VALUE11401 = 86044;
- ENUM_VALUE11402 = 86045;
- ENUM_VALUE11403 = 86046;
- ENUM_VALUE11404 = 86047;
- ENUM_VALUE11405 = 86048;
- ENUM_VALUE11406 = 86049;
- ENUM_VALUE11407 = 86050;
- ENUM_VALUE11408 = 86051;
- ENUM_VALUE11409 = 86052;
- ENUM_VALUE11410 = 86053;
- ENUM_VALUE11411 = 86054;
- ENUM_VALUE11412 = 86055;
- ENUM_VALUE11413 = 86056;
- ENUM_VALUE11414 = 86057;
- ENUM_VALUE11415 = 86058;
- ENUM_VALUE11416 = 86059;
- ENUM_VALUE11417 = 86060;
- ENUM_VALUE11418 = 86061;
- ENUM_VALUE11419 = 86062;
- ENUM_VALUE11420 = 86063;
- ENUM_VALUE11421 = 86064;
- ENUM_VALUE11422 = 86065;
- ENUM_VALUE11423 = 86066;
- ENUM_VALUE11424 = 86067;
- ENUM_VALUE11425 = 86068;
- ENUM_VALUE11426 = 86069;
- ENUM_VALUE11427 = 86070;
- ENUM_VALUE11428 = 86071;
- ENUM_VALUE11429 = 86072;
- ENUM_VALUE11430 = 86073;
- ENUM_VALUE11431 = 86074;
- ENUM_VALUE11432 = 86077;
- ENUM_VALUE11433 = 86078;
- ENUM_VALUE11434 = 86079;
- ENUM_VALUE11435 = 86080;
- ENUM_VALUE11436 = 86081;
- ENUM_VALUE11437 = 86082;
- ENUM_VALUE11438 = 86083;
- ENUM_VALUE11439 = 86084;
- ENUM_VALUE11440 = 90112;
- ENUM_VALUE11441 = 94208;
- ENUM_VALUE11442 = 94209;
- ENUM_VALUE11443 = 94210;
- ENUM_VALUE11444 = 94211;
- ENUM_VALUE11445 = 94212;
- ENUM_VALUE11446 = 94213;
- ENUM_VALUE11447 = 94214;
- ENUM_VALUE11448 = 94215;
- ENUM_VALUE11449 = 94216;
- ENUM_VALUE11450 = 94217;
- ENUM_VALUE11451 = 94218;
- ENUM_VALUE11452 = 94219;
- ENUM_VALUE11453 = 94220;
- ENUM_VALUE11454 = 94221;
- ENUM_VALUE11455 = 94222;
- ENUM_VALUE11456 = 94223;
- ENUM_VALUE11457 = 94224;
- ENUM_VALUE11458 = 98304;
- ENUM_VALUE11459 = 98305;
- ENUM_VALUE11460 = 98306;
- ENUM_VALUE11461 = 98307;
- ENUM_VALUE11462 = 98308;
- ENUM_VALUE11463 = 102400;
- ENUM_VALUE11464 = 131072;
- ENUM_VALUE11465 = 131073;
- ENUM_VALUE11466 = 135168;
- ENUM_VALUE11467 = 9439507;
-}
-
-enum Enum11541 {
- ENUM_VALUE11542 = -1;
- ENUM_VALUE11543 = 0;
- ENUM_VALUE11544 = 1;
- ENUM_VALUE11545 = 2;
- ENUM_VALUE11546 = 3;
- ENUM_VALUE11547 = 4;
- ENUM_VALUE11548 = 5;
- ENUM_VALUE11549 = 6;
- ENUM_VALUE11550 = 7;
- ENUM_VALUE11551 = 8;
- ENUM_VALUE11552 = 9;
- ENUM_VALUE11553 = 10;
- ENUM_VALUE11554 = 11;
- ENUM_VALUE11555 = 12;
- ENUM_VALUE11556 = 13;
- ENUM_VALUE11557 = 14;
- ENUM_VALUE11558 = 15;
- ENUM_VALUE11559 = 16;
- ENUM_VALUE11560 = 17;
- ENUM_VALUE11561 = 18;
- ENUM_VALUE11562 = 19;
- ENUM_VALUE11563 = 20;
- ENUM_VALUE11564 = 21;
- ENUM_VALUE11565 = 22;
- ENUM_VALUE11566 = 23;
- ENUM_VALUE11567 = 24;
- ENUM_VALUE11568 = 25;
- ENUM_VALUE11569 = 26;
- ENUM_VALUE11570 = 27;
- ENUM_VALUE11571 = 28;
- ENUM_VALUE11572 = 29;
- ENUM_VALUE11573 = 30;
- ENUM_VALUE11574 = 31;
- ENUM_VALUE11575 = 32;
- ENUM_VALUE11576 = 33;
- ENUM_VALUE11577 = 34;
- ENUM_VALUE11578 = 35;
- ENUM_VALUE11579 = 36;
- ENUM_VALUE11580 = 37;
- ENUM_VALUE11581 = 38;
- ENUM_VALUE11582 = 39;
- ENUM_VALUE11583 = 40;
- ENUM_VALUE11584 = 41;
- ENUM_VALUE11585 = 42;
- ENUM_VALUE11586 = 43;
- ENUM_VALUE11587 = 44;
- ENUM_VALUE11588 = 45;
- ENUM_VALUE11589 = 46;
- ENUM_VALUE11590 = 47;
- ENUM_VALUE11591 = 48;
- ENUM_VALUE11592 = 49;
- ENUM_VALUE11593 = 50;
- ENUM_VALUE11594 = 51;
- ENUM_VALUE11595 = 52;
- ENUM_VALUE11596 = 53;
- ENUM_VALUE11597 = 54;
- ENUM_VALUE11598 = 55;
- ENUM_VALUE11599 = 56;
- ENUM_VALUE11600 = 57;
- ENUM_VALUE11601 = 58;
- ENUM_VALUE11602 = 59;
- ENUM_VALUE11603 = 60;
- ENUM_VALUE11604 = 61;
- ENUM_VALUE11605 = 62;
- ENUM_VALUE11606 = 63;
- ENUM_VALUE11607 = 64;
- ENUM_VALUE11608 = 65;
- ENUM_VALUE11609 = 66;
- ENUM_VALUE11610 = 67;
- ENUM_VALUE11611 = 68;
- ENUM_VALUE11612 = 69;
- ENUM_VALUE11613 = 70;
- ENUM_VALUE11614 = 71;
- ENUM_VALUE11615 = 72;
- ENUM_VALUE11616 = 73;
- ENUM_VALUE11617 = 74;
- ENUM_VALUE11618 = 75;
- ENUM_VALUE11619 = 76;
- ENUM_VALUE11620 = 77;
- ENUM_VALUE11621 = 78;
- ENUM_VALUE11622 = 79;
- ENUM_VALUE11623 = 80;
- ENUM_VALUE11624 = 81;
- ENUM_VALUE11625 = 82;
- ENUM_VALUE11626 = 83;
- ENUM_VALUE11627 = 84;
- ENUM_VALUE11628 = 85;
- ENUM_VALUE11629 = 86;
- ENUM_VALUE11630 = 87;
- ENUM_VALUE11631 = 88;
- ENUM_VALUE11632 = 89;
- ENUM_VALUE11633 = 90;
- ENUM_VALUE11634 = 91;
- ENUM_VALUE11635 = 92;
- ENUM_VALUE11636 = 93;
- ENUM_VALUE11637 = 94;
- ENUM_VALUE11638 = 95;
- ENUM_VALUE11639 = 96;
- ENUM_VALUE11640 = 97;
- ENUM_VALUE11641 = 98;
- ENUM_VALUE11642 = 99;
- ENUM_VALUE11643 = 100;
- ENUM_VALUE11644 = 101;
- ENUM_VALUE11645 = 102;
- ENUM_VALUE11646 = 103;
- ENUM_VALUE11647 = 104;
- ENUM_VALUE11648 = 105;
- ENUM_VALUE11649 = 106;
- ENUM_VALUE11650 = 107;
- ENUM_VALUE11651 = 108;
- ENUM_VALUE11652 = 109;
- ENUM_VALUE11653 = 110;
- ENUM_VALUE11654 = 111;
- ENUM_VALUE11655 = 112;
- ENUM_VALUE11656 = 113;
- ENUM_VALUE11657 = 114;
- ENUM_VALUE11658 = 115;
- ENUM_VALUE11659 = 116;
- ENUM_VALUE11660 = 117;
- ENUM_VALUE11661 = 118;
- ENUM_VALUE11662 = 119;
- ENUM_VALUE11663 = 120;
- ENUM_VALUE11664 = 121;
- ENUM_VALUE11665 = 122;
- ENUM_VALUE11666 = 123;
- ENUM_VALUE11667 = 124;
- ENUM_VALUE11668 = 125;
- ENUM_VALUE11669 = 126;
- ENUM_VALUE11670 = 127;
- ENUM_VALUE11671 = 128;
- ENUM_VALUE11672 = 129;
- ENUM_VALUE11673 = 130;
- ENUM_VALUE11674 = 131;
- ENUM_VALUE11675 = 132;
- ENUM_VALUE11676 = 133;
- ENUM_VALUE11677 = 134;
- ENUM_VALUE11678 = 135;
- ENUM_VALUE11679 = 136;
- ENUM_VALUE11680 = 137;
- ENUM_VALUE11681 = 138;
- ENUM_VALUE11682 = 139;
- ENUM_VALUE11683 = 140;
- ENUM_VALUE11684 = 141;
- ENUM_VALUE11685 = 142;
- ENUM_VALUE11686 = 143;
- ENUM_VALUE11687 = 144;
- ENUM_VALUE11688 = 145;
- ENUM_VALUE11689 = 146;
- ENUM_VALUE11690 = 147;
- ENUM_VALUE11691 = 148;
- ENUM_VALUE11692 = 149;
- ENUM_VALUE11693 = 150;
- ENUM_VALUE11694 = 151;
- ENUM_VALUE11695 = 152;
- ENUM_VALUE11696 = 153;
- ENUM_VALUE11697 = 154;
- ENUM_VALUE11698 = 155;
- ENUM_VALUE11699 = 156;
- ENUM_VALUE11700 = 157;
- ENUM_VALUE11701 = 158;
- ENUM_VALUE11702 = 159;
- ENUM_VALUE11703 = 160;
- ENUM_VALUE11704 = 161;
- ENUM_VALUE11705 = 162;
- ENUM_VALUE11706 = 163;
- ENUM_VALUE11707 = 164;
- ENUM_VALUE11708 = 165;
- ENUM_VALUE11709 = 166;
- ENUM_VALUE11710 = 167;
- ENUM_VALUE11711 = 168;
- ENUM_VALUE11712 = 169;
- ENUM_VALUE11713 = 170;
- ENUM_VALUE11714 = 171;
- ENUM_VALUE11715 = 172;
- ENUM_VALUE11716 = 173;
- ENUM_VALUE11717 = 174;
- ENUM_VALUE11718 = 175;
- ENUM_VALUE11719 = 176;
- ENUM_VALUE11720 = 177;
- ENUM_VALUE11721 = 178;
- ENUM_VALUE11722 = 179;
- ENUM_VALUE11723 = 180;
- ENUM_VALUE11724 = 181;
- ENUM_VALUE11725 = 182;
- ENUM_VALUE11726 = 183;
- ENUM_VALUE11727 = 184;
- ENUM_VALUE11728 = 185;
- ENUM_VALUE11729 = 186;
- ENUM_VALUE11730 = 187;
- ENUM_VALUE11731 = 188;
- ENUM_VALUE11732 = 16777215;
-}
-
-enum Enum11468 {
- ENUM_VALUE11469 = -99;
- ENUM_VALUE11470 = 0;
- ENUM_VALUE11471 = 1;
- ENUM_VALUE11472 = 2;
- ENUM_VALUE11473 = 3;
- ENUM_VALUE11474 = 4;
- ENUM_VALUE11475 = 28;
- ENUM_VALUE11476 = 22;
- ENUM_VALUE11477 = 38;
- ENUM_VALUE11478 = 512;
- ENUM_VALUE11479 = 2048;
- ENUM_VALUE11480 = 66;
- ENUM_VALUE11481 = 578;
- ENUM_VALUE11482 = 77;
- ENUM_VALUE11483 = 88;
- ENUM_VALUE11484 = 100;
- ENUM_VALUE11485 = 110;
- ENUM_VALUE11486 = 2158;
- ENUM_VALUE11487 = 122;
- ENUM_VALUE11488 = 2170;
- ENUM_VALUE11489 = 144;
- ENUM_VALUE11490 = 244;
- ENUM_VALUE11491 = 2292;
- ENUM_VALUE11492 = 44;
-}
-
-enum Enum11022 {
- ENUM_VALUE11023 = 0;
- ENUM_VALUE11024 = 1;
- ENUM_VALUE11025 = 2;
- ENUM_VALUE11026 = 3;
- ENUM_VALUE11027 = 4;
- ENUM_VALUE11028 = 5;
- ENUM_VALUE11029 = 6;
- ENUM_VALUE11030 = 7;
- ENUM_VALUE11031 = 8;
- ENUM_VALUE11032 = 9;
- ENUM_VALUE11033 = 10;
- ENUM_VALUE11034 = 11;
- ENUM_VALUE11035 = 12;
- ENUM_VALUE11036 = 13;
- ENUM_VALUE11037 = 14;
- ENUM_VALUE11038 = 15;
- ENUM_VALUE11039 = 16;
- ENUM_VALUE11040 = 17;
- ENUM_VALUE11041 = 18;
- ENUM_VALUE11042 = 19;
- ENUM_VALUE11043 = 20;
- ENUM_VALUE11044 = 21;
- ENUM_VALUE11045 = 22;
- ENUM_VALUE11046 = 23;
- ENUM_VALUE11047 = 24;
- ENUM_VALUE11048 = 25;
- ENUM_VALUE11049 = 26;
- ENUM_VALUE11050 = 27;
- ENUM_VALUE11051 = 28;
- ENUM_VALUE11052 = 29;
- ENUM_VALUE11053 = 30;
- ENUM_VALUE11054 = 31;
- ENUM_VALUE11055 = 32;
- ENUM_VALUE11056 = 33;
- ENUM_VALUE11057 = 34;
- ENUM_VALUE11058 = 35;
- ENUM_VALUE11059 = 36;
- ENUM_VALUE11060 = 37;
- ENUM_VALUE11061 = 38;
- ENUM_VALUE11062 = 39;
- ENUM_VALUE11063 = 40;
- ENUM_VALUE11064 = 41;
- ENUM_VALUE11065 = 42;
- ENUM_VALUE11066 = 43;
- ENUM_VALUE11067 = 44;
- ENUM_VALUE11068 = 45;
- ENUM_VALUE11069 = 46;
- ENUM_VALUE11070 = 47;
- ENUM_VALUE11071 = 48;
- ENUM_VALUE11072 = 49;
- ENUM_VALUE11073 = 50;
- ENUM_VALUE11074 = 51;
- ENUM_VALUE11075 = 52;
- ENUM_VALUE11076 = 53;
- ENUM_VALUE11077 = 54;
- ENUM_VALUE11078 = 55;
- ENUM_VALUE11079 = 56;
- ENUM_VALUE11080 = 57;
- ENUM_VALUE11081 = 58;
- ENUM_VALUE11082 = 59;
- ENUM_VALUE11083 = 60;
- ENUM_VALUE11084 = 61;
- ENUM_VALUE11085 = 62;
- ENUM_VALUE11086 = 63;
- ENUM_VALUE11087 = 64;
- ENUM_VALUE11088 = 65;
- ENUM_VALUE11089 = 66;
- ENUM_VALUE11090 = 67;
- ENUM_VALUE11091 = 68;
- ENUM_VALUE11092 = 69;
- ENUM_VALUE11093 = 70;
- ENUM_VALUE11094 = 71;
- ENUM_VALUE11095 = 72;
- ENUM_VALUE11096 = 73;
- ENUM_VALUE11097 = 74;
- ENUM_VALUE11098 = 75;
- ENUM_VALUE11099 = 76;
- ENUM_VALUE11100 = 77;
- ENUM_VALUE11101 = 78;
- ENUM_VALUE11102 = 79;
- ENUM_VALUE11103 = 80;
- ENUM_VALUE11104 = 81;
- ENUM_VALUE11105 = 82;
- ENUM_VALUE11106 = 83;
-}
-
-enum Enum12670 {
- ENUM_VALUE12671 = 0;
- ENUM_VALUE12672 = 1;
- ENUM_VALUE12673 = 2;
-}
-
-enum Enum12871 {
- ENUM_VALUE12872 = 1;
- ENUM_VALUE12873 = 2;
- ENUM_VALUE12874 = 3;
- ENUM_VALUE12875 = 4;
- ENUM_VALUE12876 = 5;
- ENUM_VALUE12877 = 6;
-}
-
-enum Enum13092 {
- ENUM_VALUE13093 = 1;
- ENUM_VALUE13094 = 2;
- ENUM_VALUE13095 = 3;
-}
-
-enum Enum13146 {
- ENUM_VALUE13147 = 0;
- ENUM_VALUE13148 = 1;
- ENUM_VALUE13149 = 2;
- ENUM_VALUE13150 = 3;
-}
-
-enum Enum16042 {
- ENUM_VALUE16043 = 0;
- ENUM_VALUE16044 = 1;
- ENUM_VALUE16045 = 17;
- ENUM_VALUE16046 = 273;
- ENUM_VALUE16047 = 274;
- ENUM_VALUE16048 = 4385;
- ENUM_VALUE16049 = 4386;
- ENUM_VALUE16050 = 4387;
- ENUM_VALUE16051 = 4388;
- ENUM_VALUE16052 = 4389;
- ENUM_VALUE16053 = 4390;
- ENUM_VALUE16054 = 4391;
- ENUM_VALUE16055 = 4392;
- ENUM_VALUE16056 = 4393;
- ENUM_VALUE16057 = 276;
- ENUM_VALUE16058 = 277;
- ENUM_VALUE16059 = 18;
- ENUM_VALUE16060 = 289;
- ENUM_VALUE16061 = 291;
- ENUM_VALUE16062 = 4657;
- ENUM_VALUE16063 = 74513;
- ENUM_VALUE16064 = 4658;
- ENUM_VALUE16065 = 4659;
- ENUM_VALUE16066 = 4660;
- ENUM_VALUE16067 = 4661;
- ENUM_VALUE16068 = 4662;
- ENUM_VALUE16069 = 4663;
- ENUM_VALUE16070 = 4664;
- ENUM_VALUE16071 = 292;
- ENUM_VALUE16072 = 4673;
- ENUM_VALUE16073 = 4674;
- ENUM_VALUE16074 = 293;
- ENUM_VALUE16075 = 19;
- ENUM_VALUE16076 = 20;
- ENUM_VALUE16077 = 321;
- ENUM_VALUE16078 = 5137;
- ENUM_VALUE16079 = 5138;
- ENUM_VALUE16080 = 5139;
- ENUM_VALUE16081 = 5140;
- ENUM_VALUE16082 = 5141;
- ENUM_VALUE16083 = 5142;
- ENUM_VALUE16084 = 82273;
- ENUM_VALUE16085 = 82274;
- ENUM_VALUE16086 = 82275;
- ENUM_VALUE16087 = 82276;
- ENUM_VALUE16088 = 82277;
- ENUM_VALUE16089 = 82278;
- ENUM_VALUE16090 = 5143;
- ENUM_VALUE16091 = 5144;
- ENUM_VALUE16092 = 5145;
- ENUM_VALUE16093 = 5146;
- ENUM_VALUE16094 = 82337;
- ENUM_VALUE16095 = 5147;
- ENUM_VALUE16096 = 5148;
- ENUM_VALUE16097 = 322;
- ENUM_VALUE16098 = 323;
- ENUM_VALUE16099 = 324;
- ENUM_VALUE16100 = 325;
- ENUM_VALUE16101 = 326;
- ENUM_VALUE16102 = 327;
- ENUM_VALUE16103 = 328;
- ENUM_VALUE16104 = 21;
- ENUM_VALUE16105 = 337;
- ENUM_VALUE16106 = 22;
- ENUM_VALUE16107 = 23;
- ENUM_VALUE16108 = 24;
- ENUM_VALUE16109 = 2;
- ENUM_VALUE16110 = 33;
- ENUM_VALUE16111 = 34;
- ENUM_VALUE16112 = 545;
- ENUM_VALUE16113 = 8721;
- ENUM_VALUE16114 = 8723;
- ENUM_VALUE16115 = 8724;
- ENUM_VALUE16116 = 546;
- ENUM_VALUE16117 = 8739;
- ENUM_VALUE16118 = 8740;
- ENUM_VALUE16119 = 547;
- ENUM_VALUE16120 = 548;
- ENUM_VALUE16121 = 549;
- ENUM_VALUE16122 = 550;
- ENUM_VALUE16123 = 551;
- ENUM_VALUE16124 = 552;
- ENUM_VALUE16125 = 553;
- ENUM_VALUE16126 = 35;
- ENUM_VALUE16127 = 36;
- ENUM_VALUE16128 = 37;
- ENUM_VALUE16129 = 593;
- ENUM_VALUE16130 = 594;
- ENUM_VALUE16131 = 595;
- ENUM_VALUE16132 = 596;
- ENUM_VALUE16133 = 597;
- ENUM_VALUE16134 = 38;
- ENUM_VALUE16135 = 609;
- ENUM_VALUE16136 = 610;
- ENUM_VALUE16137 = 617;
- ENUM_VALUE16138 = 614;
- ENUM_VALUE16139 = 615;
- ENUM_VALUE16140 = 616;
- ENUM_VALUE16141 = 618;
- ENUM_VALUE16142 = 620;
- ENUM_VALUE16143 = 9937;
- ENUM_VALUE16144 = 9938;
- ENUM_VALUE16145 = 9939;
- ENUM_VALUE16146 = 9940;
- ENUM_VALUE16147 = 9941;
- ENUM_VALUE16148 = 39;
- ENUM_VALUE16149 = 40;
- ENUM_VALUE16150 = 41;
- ENUM_VALUE16151 = 42;
- ENUM_VALUE16152 = 43;
- ENUM_VALUE16153 = 44;
- ENUM_VALUE16154 = 45;
- ENUM_VALUE16155 = 11793;
- ENUM_VALUE16156 = 3;
- ENUM_VALUE16157 = 49;
- ENUM_VALUE16158 = 50;
- ENUM_VALUE16159 = 51;
- ENUM_VALUE16160 = 817;
- ENUM_VALUE16161 = 818;
- ENUM_VALUE16162 = 819;
- ENUM_VALUE16163 = 52;
- ENUM_VALUE16164 = 833;
- ENUM_VALUE16165 = 53;
- ENUM_VALUE16166 = 54;
- ENUM_VALUE16167 = 4;
- ENUM_VALUE16168 = 1041;
- ENUM_VALUE16169 = 16657;
- ENUM_VALUE16170 = 16658;
- ENUM_VALUE16171 = 16659;
- ENUM_VALUE16172 = 16660;
- ENUM_VALUE16173 = 16661;
- ENUM_VALUE16174 = 1042;
- ENUM_VALUE16175 = 16673;
- ENUM_VALUE16176 = 1043;
- ENUM_VALUE16177 = 16689;
- ENUM_VALUE16178 = 16690;
- ENUM_VALUE16179 = 16691;
- ENUM_VALUE16180 = 16692;
- ENUM_VALUE16181 = 16693;
- ENUM_VALUE16182 = 16694;
- ENUM_VALUE16183 = 16695;
- ENUM_VALUE16184 = 1044;
- ENUM_VALUE16185 = 16705;
- ENUM_VALUE16186 = 16706;
- ENUM_VALUE16187 = 16707;
- ENUM_VALUE16188 = 16708;
- ENUM_VALUE16189 = 16709;
- ENUM_VALUE16190 = 16710;
- ENUM_VALUE16191 = 16711;
- ENUM_VALUE16192 = 16712;
- ENUM_VALUE16193 = 16713;
- ENUM_VALUE16194 = 1046;
- ENUM_VALUE16195 = 16737;
- ENUM_VALUE16196 = 1047;
- ENUM_VALUE16197 = 16753;
- ENUM_VALUE16198 = 268049;
- ENUM_VALUE16199 = 268050;
- ENUM_VALUE16200 = 268051;
- ENUM_VALUE16201 = 268052;
- ENUM_VALUE16202 = 1048;
- ENUM_VALUE16203 = 16769;
- ENUM_VALUE16204 = 16770;
- ENUM_VALUE16205 = 16771;
- ENUM_VALUE16206 = 16772;
- ENUM_VALUE16207 = 16773;
- ENUM_VALUE16208 = 1049;
- ENUM_VALUE16209 = 1056;
- ENUM_VALUE16210 = 1058;
- ENUM_VALUE16211 = 1059;
- ENUM_VALUE16212 = 1060;
- ENUM_VALUE16213 = 1061;
- ENUM_VALUE16214 = 5;
- ENUM_VALUE16215 = 6;
- ENUM_VALUE16216 = 97;
- ENUM_VALUE16217 = 98;
- ENUM_VALUE16218 = 99;
- ENUM_VALUE16219 = 100;
- ENUM_VALUE16220 = 101;
- ENUM_VALUE16221 = 102;
- ENUM_VALUE16222 = 103;
- ENUM_VALUE16223 = 104;
- ENUM_VALUE16224 = 105;
- ENUM_VALUE16225 = 106;
- ENUM_VALUE16226 = 108;
- ENUM_VALUE16227 = 1729;
- ENUM_VALUE16228 = 1730;
- ENUM_VALUE16229 = 1731;
- ENUM_VALUE16230 = 7;
- ENUM_VALUE16231 = 8;
- ENUM_VALUE16232 = 9;
- ENUM_VALUE16233 = 10;
- ENUM_VALUE16234 = 161;
- ENUM_VALUE16235 = 2577;
- ENUM_VALUE16236 = 41233;
- ENUM_VALUE16237 = 41234;
- ENUM_VALUE16238 = 2578;
- ENUM_VALUE16239 = 2579;
- ENUM_VALUE16240 = 41265;
- ENUM_VALUE16241 = 2580;
- ENUM_VALUE16242 = 2581;
- ENUM_VALUE16243 = 41297;
- ENUM_VALUE16244 = 41298;
- ENUM_VALUE16245 = 41299;
- ENUM_VALUE16246 = 41300;
- ENUM_VALUE16247 = 2582;
- ENUM_VALUE16248 = 2583;
- ENUM_VALUE16249 = 2584;
- ENUM_VALUE16250 = 162;
- ENUM_VALUE16251 = 2593;
- ENUM_VALUE16252 = 41489;
- ENUM_VALUE16253 = 663825;
- ENUM_VALUE16254 = 663826;
- ENUM_VALUE16255 = 41490;
- ENUM_VALUE16256 = 41491;
- ENUM_VALUE16257 = 41492;
- ENUM_VALUE16258 = 663873;
- ENUM_VALUE16259 = 2594;
- ENUM_VALUE16260 = 41505;
- ENUM_VALUE16261 = 41506;
- ENUM_VALUE16262 = 41507;
- ENUM_VALUE16263 = 2595;
- ENUM_VALUE16264 = 41521;
- ENUM_VALUE16265 = 41522;
- ENUM_VALUE16266 = 41523;
- ENUM_VALUE16267 = 41524;
- ENUM_VALUE16268 = 41525;
- ENUM_VALUE16269 = 664401;
- ENUM_VALUE16270 = 664402;
- ENUM_VALUE16271 = 41526;
- ENUM_VALUE16272 = 41527;
- ENUM_VALUE16273 = 2596;
- ENUM_VALUE16274 = 2597;
- ENUM_VALUE16275 = 2598;
- ENUM_VALUE16276 = 41569;
- ENUM_VALUE16277 = 41570;
- ENUM_VALUE16278 = 41571;
- ENUM_VALUE16279 = 41572;
- ENUM_VALUE16280 = 41573;
- ENUM_VALUE16281 = 665169;
- ENUM_VALUE16282 = 665170;
- ENUM_VALUE16283 = 665171;
- ENUM_VALUE16284 = 665172;
- ENUM_VALUE16285 = 2599;
- ENUM_VALUE16286 = 2600;
- ENUM_VALUE16287 = 2601;
- ENUM_VALUE16288 = 2603;
- ENUM_VALUE16289 = 2604;
- ENUM_VALUE16290 = 163;
- ENUM_VALUE16291 = 2608;
- ENUM_VALUE16292 = 2609;
- ENUM_VALUE16293 = 2610;
- ENUM_VALUE16294 = 2611;
- ENUM_VALUE16295 = 2612;
- ENUM_VALUE16296 = 164;
- ENUM_VALUE16297 = 2625;
- ENUM_VALUE16298 = 2626;
- ENUM_VALUE16299 = 42017;
- ENUM_VALUE16300 = 42018;
- ENUM_VALUE16301 = 42019;
- ENUM_VALUE16302 = 2627;
- ENUM_VALUE16303 = 2628;
- ENUM_VALUE16304 = 165;
- ENUM_VALUE16305 = 2641;
- ENUM_VALUE16306 = 42257;
- ENUM_VALUE16307 = 42258;
- ENUM_VALUE16308 = 2642;
- ENUM_VALUE16309 = 2643;
- ENUM_VALUE16310 = 2644;
- ENUM_VALUE16311 = 2646;
- ENUM_VALUE16312 = 2647;
- ENUM_VALUE16313 = 42353;
- ENUM_VALUE16314 = 2648;
- ENUM_VALUE16315 = 2649;
- ENUM_VALUE16316 = 2650;
- ENUM_VALUE16317 = 2651;
- ENUM_VALUE16318 = 2652;
- ENUM_VALUE16319 = 2653;
- ENUM_VALUE16320 = 2654;
- ENUM_VALUE16321 = 42481;
- ENUM_VALUE16322 = 42482;
- ENUM_VALUE16323 = 42483;
- ENUM_VALUE16324 = 166;
- ENUM_VALUE16325 = 2657;
- ENUM_VALUE16326 = 2658;
- ENUM_VALUE16327 = 42529;
- ENUM_VALUE16328 = 2659;
- ENUM_VALUE16329 = 2660;
- ENUM_VALUE16330 = 2661;
- ENUM_VALUE16331 = 2662;
- ENUM_VALUE16332 = 2663;
- ENUM_VALUE16333 = 42609;
- ENUM_VALUE16334 = 2664;
- ENUM_VALUE16335 = 2665;
- ENUM_VALUE16336 = 42753;
- ENUM_VALUE16337 = 42754;
- ENUM_VALUE16338 = 42755;
- ENUM_VALUE16339 = 11;
- ENUM_VALUE16340 = 177;
- ENUM_VALUE16341 = 2833;
- ENUM_VALUE16342 = 179;
- ENUM_VALUE16343 = 180;
- ENUM_VALUE16344 = 2881;
- ENUM_VALUE16345 = 182;
- ENUM_VALUE16346 = 183;
- ENUM_VALUE16347 = 12;
- ENUM_VALUE16348 = 3089;
- ENUM_VALUE16349 = 194;
- ENUM_VALUE16350 = 195;
- ENUM_VALUE16351 = 196;
- ENUM_VALUE16352 = 198;
- ENUM_VALUE16353 = 3169;
- ENUM_VALUE16354 = 199;
- ENUM_VALUE16355 = 200;
- ENUM_VALUE16356 = 208;
- ENUM_VALUE16357 = 3329;
- ENUM_VALUE16358 = 3330;
- ENUM_VALUE16359 = 3331;
- ENUM_VALUE16360 = 209;
- ENUM_VALUE16361 = 210;
- ENUM_VALUE16362 = 211;
- ENUM_VALUE16363 = 3377;
- ENUM_VALUE16364 = 3378;
- ENUM_VALUE16365 = 3379;
- ENUM_VALUE16366 = 3380;
- ENUM_VALUE16367 = 3381;
- ENUM_VALUE16368 = 865809;
- ENUM_VALUE16369 = 865810;
- ENUM_VALUE16370 = 865811;
- ENUM_VALUE16371 = 865812;
- ENUM_VALUE16372 = 865813;
- ENUM_VALUE16373 = 865814;
- ENUM_VALUE16374 = 865815;
- ENUM_VALUE16375 = 865816;
- ENUM_VALUE16376 = 865817;
- ENUM_VALUE16377 = 865818;
- ENUM_VALUE16378 = 865819;
- ENUM_VALUE16379 = 865820;
- ENUM_VALUE16380 = 865821;
- ENUM_VALUE16381 = 865822;
- ENUM_VALUE16382 = 865823;
- ENUM_VALUE16383 = 865824;
- ENUM_VALUE16384 = 865825;
- ENUM_VALUE16385 = 865826;
- ENUM_VALUE16386 = 865827;
- ENUM_VALUE16387 = 865828;
- ENUM_VALUE16388 = 865829;
- ENUM_VALUE16389 = 212;
- ENUM_VALUE16390 = 3393;
- ENUM_VALUE16391 = 3394;
- ENUM_VALUE16392 = 3395;
- ENUM_VALUE16393 = 213;
- ENUM_VALUE16394 = 214;
- ENUM_VALUE16395 = 215;
- ENUM_VALUE16396 = 3441;
- ENUM_VALUE16397 = 3442;
- ENUM_VALUE16398 = 216;
- ENUM_VALUE16399 = 217;
- ENUM_VALUE16400 = 3473;
- ENUM_VALUE16401 = 3474;
- ENUM_VALUE16402 = 3475;
- ENUM_VALUE16403 = 254;
- ENUM_VALUE16404 = 255;
-}
-
-enum Enum16553 {
- ENUM_VALUE16554 = 0;
- ENUM_VALUE16555 = 1;
- ENUM_VALUE16556 = 2;
- ENUM_VALUE16557 = 3;
- ENUM_VALUE16558 = 4;
- ENUM_VALUE16559 = 5;
- ENUM_VALUE16560 = 6;
- ENUM_VALUE16561 = 7;
- ENUM_VALUE16562 = 8;
- ENUM_VALUE16563 = 9;
-}
-
-enum Enum16728 {
- ENUM_VALUE16729 = 1;
- ENUM_VALUE16730 = 2;
- ENUM_VALUE16731 = 3;
-}
-
-enum Enum16732 {
- ENUM_VALUE16733 = 1;
- ENUM_VALUE16734 = 2;
- ENUM_VALUE16735 = 3;
- ENUM_VALUE16736 = 4;
- ENUM_VALUE16737 = 5;
-}
-
-enum Enum16738 {
- ENUM_VALUE16739 = 1;
- ENUM_VALUE16740 = 2;
- ENUM_VALUE16741 = 3;
- ENUM_VALUE16742 = 4;
- ENUM_VALUE16743 = 5;
- ENUM_VALUE16744 = 6;
- ENUM_VALUE16745 = 7;
-}
-
-enum Enum16698 {
- ENUM_VALUE16699 = -1;
- ENUM_VALUE16700 = 100;
- ENUM_VALUE16701 = 2;
- ENUM_VALUE16702 = 0;
- ENUM_VALUE16703 = 1;
- ENUM_VALUE16704 = 4;
- ENUM_VALUE16705 = 11;
- ENUM_VALUE16706 = 12;
- ENUM_VALUE16707 = 3;
- ENUM_VALUE16708 = 5;
- ENUM_VALUE16709 = 6;
- ENUM_VALUE16710 = 7;
- ENUM_VALUE16711 = 8;
- ENUM_VALUE16712 = 9;
- ENUM_VALUE16713 = 10;
- ENUM_VALUE16714 = 13;
- ENUM_VALUE16715 = 14;
- ENUM_VALUE16716 = 15;
- ENUM_VALUE16717 = 16;
- ENUM_VALUE16718 = 18;
- ENUM_VALUE16719 = 17;
- ENUM_VALUE16720 = 19;
- ENUM_VALUE16721 = 20;
-}
-
-enum Enum16819 {
- ENUM_VALUE16820 = 0;
- ENUM_VALUE16821 = 1;
- ENUM_VALUE16822 = 2;
- ENUM_VALUE16823 = 3;
- ENUM_VALUE16824 = 4;
- ENUM_VALUE16825 = 5;
-}
-
-enum Enum16925 {
- ENUM_VALUE16926 = 0;
- ENUM_VALUE16927 = 1;
- ENUM_VALUE16928 = 2;
- ENUM_VALUE16929 = 3;
- ENUM_VALUE16930 = 4;
- ENUM_VALUE16931 = 5;
- ENUM_VALUE16932 = 6;
- ENUM_VALUE16933 = 7;
- ENUM_VALUE16934 = 8;
- ENUM_VALUE16935 = 9;
- ENUM_VALUE16936 = 10;
- ENUM_VALUE16937 = 11;
- ENUM_VALUE16938 = 12;
- ENUM_VALUE16939 = 13;
-}
-
-enum Enum22854 {
- ENUM_VALUE22855 = 0;
- ENUM_VALUE22856 = 1;
-}
-
-enum Enum24361 {
- ENUM_VALUE24362 = 0;
- ENUM_VALUE24363 = 1;
- ENUM_VALUE24364 = 2;
- ENUM_VALUE24365 = 3;
-}
-
-enum Enum16891 {
- ENUM_VALUE16892 = 0;
- ENUM_VALUE16893 = 1;
- ENUM_VALUE16894 = 2;
- ENUM_VALUE16895 = 3;
- ENUM_VALUE16896 = 4;
- ENUM_VALUE16897 = 5;
- ENUM_VALUE16898 = 6;
- ENUM_VALUE16899 = 7;
- ENUM_VALUE16900 = 8;
- ENUM_VALUE16901 = 9;
- ENUM_VALUE16902 = 10;
- ENUM_VALUE16903 = 11;
- ENUM_VALUE16904 = 12;
- ENUM_VALUE16905 = 13;
- ENUM_VALUE16906 = 14;
- ENUM_VALUE16907 = 15;
- ENUM_VALUE16908 = 16;
- ENUM_VALUE16909 = 17;
- ENUM_VALUE16910 = 18;
- ENUM_VALUE16911 = 19;
- ENUM_VALUE16912 = 20;
- ENUM_VALUE16913 = 21;
- ENUM_VALUE16914 = 22;
- ENUM_VALUE16915 = 23;
- ENUM_VALUE16916 = 24;
- ENUM_VALUE16917 = 25;
- ENUM_VALUE16918 = 26;
- ENUM_VALUE16919 = 27;
- ENUM_VALUE16920 = 28;
- ENUM_VALUE16921 = 29;
- ENUM_VALUE16922 = 30;
- ENUM_VALUE16923 = 31;
-}
-
-enum Enum27361 {
- ENUM_VALUE27362 = 0;
- ENUM_VALUE27363 = 1;
- ENUM_VALUE27364 = 2;
- ENUM_VALUE27365 = 3;
- ENUM_VALUE27366 = 4;
-}
-
-enum Enum33960 {
- ENUM_VALUE33961 = 0;
- ENUM_VALUE33962 = 1;
- ENUM_VALUE33963 = 2;
- ENUM_VALUE33964 = 3;
- ENUM_VALUE33965 = 4;
- ENUM_VALUE33966 = 5;
- ENUM_VALUE33967 = 6;
-}
-
-enum Enum34388 { ENUM_VALUE34389 = 1; }
-
-enum Enum35477 {
- ENUM_VALUE35478 = 4;
- ENUM_VALUE35479 = 3;
- ENUM_VALUE35480 = 2;
- ENUM_VALUE35481 = 1;
- ENUM_VALUE35482 = 0;
-}
-
-enum Enum35507 {
- ENUM_VALUE35508 = 0;
- ENUM_VALUE35509 = 1;
- ENUM_VALUE35510 = 2;
- ENUM_VALUE35511 = 3;
- ENUM_VALUE35512 = 4;
- ENUM_VALUE35513 = 5;
- ENUM_VALUE35514 = 6;
- ENUM_VALUE35515 = 7;
- ENUM_VALUE35516 = 8;
- ENUM_VALUE35517 = 9;
-}
-
-enum Enum36860 {
- ENUM_VALUE36861 = 0;
- ENUM_VALUE36862 = 1;
- ENUM_VALUE36863 = 2;
- ENUM_VALUE36864 = 3;
- ENUM_VALUE36865 = 4;
- ENUM_VALUE36866 = 5;
- ENUM_VALUE36867 = 6;
- ENUM_VALUE36868 = 7;
-}
-
-enum Enum36890 {
- ENUM_VALUE36891 = 0;
- ENUM_VALUE36892 = 1;
-}
diff --git a/benchmarks/datasets/google_message4/BUILD.bazel b/benchmarks/datasets/google_message4/BUILD.bazel
deleted file mode 100644
index 33de093..0000000
--- a/benchmarks/datasets/google_message4/BUILD.bazel
+++ /dev/null
@@ -1,53 +0,0 @@
-load("@rules_cc//cc:defs.bzl", "cc_proto_library")
-load("@rules_java//java:defs.bzl", "java_proto_library")
-load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
-load("@rules_proto//proto:defs.bzl", "proto_library")
-
-filegroup(
- name = "datasets",
- srcs = [],
- visibility = [
- "//benchmarks/datasets:__pkg__",
- ],
-)
-
-proto_library(
- name = "benchmark_message4_proto",
- srcs = [
- "benchmark_message4.proto",
- "benchmark_message4_1.proto",
- "benchmark_message4_2.proto",
- "benchmark_message4_3.proto",
- ],
- strip_import_prefix = "/benchmarks",
- visibility = [
- "//benchmarks/datasets:__pkg__",
- ],
-)
-
-cc_proto_library(
- name = "benchmark_message4_cc_proto",
- visibility = [
- "//benchmarks/datasets:__pkg__",
- ],
- deps = [
- "benchmark_message4_proto",
- ],
-)
-
-java_proto_library(
- name = "benchmark_message4_java_proto",
- visibility = [
- "//benchmarks/datasets:__pkg__",
- ],
- deps = [
- "benchmark_message4_proto",
- ],
-)
-
-pkg_files(
- name = "dist_files",
- srcs = glob(["*"]),
- strip_prefix = strip_prefix.from_root(""),
- visibility = ["//benchmarks:__pkg__"],
-)
diff --git a/benchmarks/datasets/google_message4/benchmark_message4.proto b/benchmarks/datasets/google_message4/benchmark_message4.proto
deleted file mode 100644
index 424ed10..0000000
--- a/benchmarks/datasets/google_message4/benchmark_message4.proto
+++ /dev/null
@@ -1,484 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// LINT: ALLOW_GROUPS
-
-syntax = "proto2";
-
-package benchmarks.google_message4;
-
-import "datasets/google_message4/benchmark_message4_1.proto";
-import "datasets/google_message4/benchmark_message4_2.proto";
-import "datasets/google_message4/benchmark_message4_3.proto";
-
-option cc_enable_arenas = true;
-option java_package = "com.google.protobuf.benchmarks";
-
-message GoogleMessage4 {
- optional int32 field37503 = 1;
- optional .benchmarks.google_message4.UnusedEmptyMessage field37504 = 2;
- optional .benchmarks.google_message4.UnusedEmptyMessage field37505 = 3;
- optional .benchmarks.google_message4.UnusedEmptyMessage field37506 = 4;
- optional .benchmarks.google_message4.UnusedEmptyMessage field37507 = 5;
- optional .benchmarks.google_message4.Message37489 field37508 = 6;
- optional .benchmarks.google_message4.UnusedEmptyMessage field37509 = 7;
- optional .benchmarks.google_message4.UnusedEmptyMessage field37510 = 8;
- optional .benchmarks.google_message4.UnusedEmptyMessage field37511 = 9;
- optional .benchmarks.google_message4.UnusedEmptyMessage field37512 = 10;
- optional .benchmarks.google_message4.UnusedEmptyMessage field37513 = 11;
- optional .benchmarks.google_message4.UnusedEmptyMessage field37514 = 12;
- optional .benchmarks.google_message4.UnusedEmptyMessage field37515 = 13;
- optional .benchmarks.google_message4.UnusedEmptyMessage field37516 = 14;
- optional .benchmarks.google_message4.UnusedEmptyMessage field37517 = 15;
- optional .benchmarks.google_message4.UnusedEmptyMessage field37518 = 16;
-}
-
-message Message37489 {
- optional .benchmarks.google_message4.Message2517 field37534 = 3;
- optional .benchmarks.google_message4.Message7330 field37535 = 4;
- optional .benchmarks.google_message4.Message8815 field37536 = 6;
- optional .benchmarks.google_message4.Message8817 field37537 = 7;
- optional .benchmarks.google_message4.Message8835 field37538 = 8;
- optional .benchmarks.google_message4.Message8848 field37539 = 9;
- optional .benchmarks.google_message4.Message8856 field37540 = 11;
- optional .benchmarks.google_message4.Message12717 field37541 = 15;
- optional .benchmarks.google_message4.Message12748 field37542 = 20;
- optional .benchmarks.google_message4.Message7319 field37543 = 22;
- optional .benchmarks.google_message4.Message12908 field37544 = 24;
- optional .benchmarks.google_message4.Message12910 field37545 = 25;
- optional .benchmarks.google_message4.Message12960 field37546 = 30;
- optional .benchmarks.google_message4.Message176 field37547 = 33;
- optional .benchmarks.google_message4.Message13000 field37548 = 34;
- optional .benchmarks.google_message4.Message13035 field37549 = 35;
- optional .benchmarks.google_message4.Message37331 field37550 = 36;
- optional .benchmarks.google_message4.Message37329 field37551 = 37;
- optional .benchmarks.google_message4.Message37327 field37552 = 38;
- optional .benchmarks.google_message4.Message37333 field37553 = 39;
- optional .benchmarks.google_message4.Message37335 field37554 = 40;
-}
-
-message Message7319 {
- optional .benchmarks.google_message4.UnusedEmptyMessage field7321 = 1;
- optional .benchmarks.google_message4.UnusedEmptyMessage field7322 = 7;
-}
-
-message Message12717 {
- optional .benchmarks.google_message4.UnusedEmptyMessage field12719 = 1;
- optional string field12720 = 2;
- optional uint32 field12721 = 3;
- optional .benchmarks.google_message4.Message11976 field12722 = 4;
- repeated .benchmarks.google_message4.Message11948 field12723 = 5;
- optional .benchmarks.google_message4.Message11947 field12724 = 6;
- optional .benchmarks.google_message4.Message12687 field12725 = 7;
- repeated .benchmarks.google_message4.Message11948 field12726 = 8;
- optional int64 field12727 = 9;
-}
-
-message Message37331 {
- optional .benchmarks.google_message4.UnusedEmptyMessage field37367 = 4;
- required .benchmarks.google_message4.Message37326 field37368 = 1;
- required int64 field37369 = 2;
- required bytes field37370 = 3;
-}
-
-message Message8815 {
- optional .benchmarks.google_message4.UnusedEmptyMessage field8819 = 1;
- repeated .benchmarks.google_message4.Message8768 field8820 = 2;
- optional bool field8821 = 3;
-}
-
-message Message7330 {
- optional .benchmarks.google_message4.UnusedEmptyMessage field7332 = 1;
- optional .benchmarks.google_message4.Message3069 field7333 = 2;
- optional .benchmarks.google_message4.Message7320 field7334 = 3;
- optional .benchmarks.google_message4.UnusedEmptyMessage field7335 = 4;
- optional bool field7336 = 5;
- optional int64 field7337 = 6;
-}
-
-message Message12960 {
- optional .benchmarks.google_message4.UnusedEmptyMessage field12962 = 1;
- optional .benchmarks.google_message4.Message12948 field12963 = 2;
-}
-
-message Message176 {
- required string field408 = 1;
- optional int32 field409 = 4;
- optional string field410 = 50;
- optional int32 field411 = 2;
- optional uint64 field412 = 47;
- optional string field413 = 56;
- optional int32 field414 = 24;
- optional string field415 = 21;
- optional bytes field416 = 3;
- optional string field417 = 57;
- optional int32 field418 = 51;
- optional float field419 = 7;
- optional bool field420 = 5;
- optional bool field421 = 28;
- optional int32 field422 = 6;
- repeated int32 field423 = 40;
- optional .benchmarks.google_message4.UnusedEmptyMessage field424 = 41;
- optional bool field425 = 25;
- optional uint64 field426 = 26;
- optional int32 field427 = 38;
- optional bytes field428 = 15;
- optional bytes field429 = 55;
- optional bytes field430 = 16;
- optional bytes field431 = 23;
- optional bool field432 = 33;
- optional bytes field433 = 31;
- optional bytes field434 = 32;
- optional int32 field435 = 36;
- optional uint64 field436 = 17;
- optional int32 field437 = 45;
- optional uint64 field438 = 18;
- optional string field439 = 46;
- optional .benchmarks.google_message4.UnusedEmptyMessage field440 = 64;
- optional int32 field441 = 39;
- optional uint64 field442 = 48;
- optional bytes field443 = 19;
- optional bytes field444 = 42;
- optional bytes field445 = 43;
- optional string field446 = 44;
- optional string field447 = 49;
- optional int64 field448 = 20;
- optional bool field449 = 53;
- optional .benchmarks.google_message4.UnusedEmptyMessage field450 = 54;
- repeated .benchmarks.google_message4.UnusedEmptyMessage field451 = 22;
- optional .benchmarks.google_message4.UnusedEnum field452 = 27;
- optional int32 field453 = 29;
- optional int32 field454 = 30;
- optional .benchmarks.google_message4.UnusedEnum field455 = 37;
- optional .benchmarks.google_message4.UnusedEnum field456 = 34;
- optional int32 field457 = 35;
- repeated group Message178 = 101 {}
- optional bool field459 = 52;
- optional uint64 field460 = 58;
- optional uint64 field461 = 59;
- optional .benchmarks.google_message4.UnusedEmptyMessage field462 = 60;
- optional .benchmarks.google_message4.UnusedEmptyMessage field463 = 61;
- optional .benchmarks.google_message4.UnusedEnum field464 = 62;
- repeated string field465 = 63;
- optional .benchmarks.google_message4.UnusedEmptyMessage field466 = 65;
-}
-
-message Message8817 {
- optional .benchmarks.google_message4.UnusedEmptyMessage field8825 = 1;
- repeated .benchmarks.google_message4.Message8768 field8826 = 2;
- optional string field8827 = 3;
-}
-
-message Message8835 {
- optional .benchmarks.google_message4.UnusedEmptyMessage field8837 = 1;
- repeated string field8838 = 2;
- optional .benchmarks.google_message4.UnusedEnum field8839 = 3;
-}
-
-message Message37333 {
- optional .benchmarks.google_message4.UnusedEmptyMessage field37372 = 3;
- required .benchmarks.google_message4.Message37326 field37373 = 1;
- optional uint64 field37374 = 2;
-}
-
-message Message13000 {
- optional int64 field13015 = 1;
- repeated .benchmarks.google_message4.Message12979 field13016 = 2;
-}
-
-message Message37335 {
- optional .benchmarks.google_message4.UnusedEmptyMessage field37376 = 4;
- required .benchmarks.google_message4.Message37326 field37377 = 1;
- required .benchmarks.google_message4.Message37173 field37378 = 2;
- optional uint64 field37379 = 3;
-}
-
-message Message8848 {
- optional .benchmarks.google_message4.UnusedEmptyMessage field8850 = 1;
- optional string field8851 = 2;
- optional bytes field8852 = 3;
-}
-
-message Message13035 {
- optional int64 field13058 = 1;
- repeated int64 field13059 = 2;
-}
-
-message Message8856 {
- optional .benchmarks.google_message4.UnusedEmptyMessage field8858 = 1;
- optional string field8859 = 2;
-}
-
-message Message12908 {
- optional .benchmarks.google_message4.UnusedEmptyMessage field12912 = 1;
- optional string field12913 = 2;
- optional .benchmarks.google_message4.Message12799 field12914 = 3;
- optional int64 field12915 = 4;
- optional .benchmarks.google_message4.Message3804 field12916 = 5;
- optional .benchmarks.google_message4.Message12870 field12917 = 6;
-}
-
-message Message12910 {
- optional .benchmarks.google_message4.UnusedEmptyMessage field12920 = 1;
- optional .benchmarks.google_message4.Message12818 field12921 = 2;
- repeated .benchmarks.google_message4.Message12903 field12922 = 3;
-}
-
-message Message37327 {
- optional .benchmarks.google_message4.UnusedEmptyMessage field37347 = 11;
- required .benchmarks.google_message4.Message37326 field37348 = 1;
- optional bool field37349 = 2;
- optional bool field37350 = 3;
- optional bool field37351 = 4;
- optional bool field37352 = 5;
- optional bool field37353 = 6;
- optional .benchmarks.google_message4.UnusedEmptyMessage field37354 = 7;
- optional uint64 field37355 = 8;
- optional bool field37356 = 9;
- optional bool field37357 = 10;
-}
-
-message Message37329 {
- optional .benchmarks.google_message4.UnusedEmptyMessage field37359 = 6;
- required .benchmarks.google_message4.Message37326 field37360 = 1;
- required int64 field37361 = 2;
- required int64 field37362 = 3;
- optional bool field37363 = 4;
-}
-
-message Message2517 {
- optional .benchmarks.google_message4.UnusedEmptyMessage field2519 = 1;
- optional .benchmarks.google_message4.Message2356 field2520 = 2;
- optional .benchmarks.google_message4.Message0 field2521 = 3;
- optional .benchmarks.google_message4.Message2463 field2522 = 4;
- repeated .benchmarks.google_message4.Message971 field2523 = 5;
-}
-
-message Message12748 {
- optional .benchmarks.google_message4.UnusedEmptyMessage field12754 = 1;
- optional string field12755 = 2;
- optional string field12756 = 3;
- optional .benchmarks.google_message4.Enum12735 field12757 = 4;
-}
-
-message Message12687 {
- repeated .benchmarks.google_message4.Message12686 field12701 = 1;
-}
-
-message Message11948 {
- optional string field11954 = 1;
- repeated .benchmarks.google_message4.Message11949 field11955 = 2;
- optional bool field11956 = 3;
-}
-
-message Message11976 {
- repeated .benchmarks.google_message4.Message11975 field12002 = 1;
-}
-
-message Message7320 {
- optional .benchmarks.google_message4.UnusedEmptyMessage field7323 = 1;
- optional .benchmarks.google_message4.Message7287 field7324 = 8;
-}
-
-message Message3069 {
- optional .benchmarks.google_message4.Message3061 field3374 = 1;
- optional bytes field3375 = 2;
- repeated group Message3070 = 3 {
- required .benchmarks.google_message4.Enum3071 field3378 = 4;
- required bytes field3379 = 5;
- }
- extensions 10000 to 536870911;
-}
-
-message Message12948 {
- repeated .benchmarks.google_message4.Message12949 field12958 = 1;
-}
-
-message Message8768 {
- optional string field8782 = 1;
- optional .benchmarks.google_message4.Message8572 field8783 = 2;
- optional bool field8784 = 3;
- repeated .benchmarks.google_message4.Message8774 field8785 = 4;
- optional int64 field8786 = 5;
- optional .benchmarks.google_message4.UnusedEmptyMessage field8787 = 6;
- optional string field8788 = 7;
-}
-
-message Message12979 {
- required bytes field12981 = 1;
- repeated string field12982 = 2;
- optional .benchmarks.google_message4.UnusedEmptyMessage field12983 = 3;
- optional int64 field12984 = 4;
- optional string field12985 = 5;
- optional int32 field12986 = 6;
- optional .benchmarks.google_message4.UnusedEmptyMessage field12987 = 7;
-}
-
-message Message37173 {
- optional string field37252 = 1;
- optional int64 field37253 = 2;
- optional .benchmarks.google_message4.UnusedEnum field37254 = 4;
- optional bool field37255 = 5;
- optional bool field37256 = 6;
- optional bool field37257 = 7;
- optional string field37258 = 8;
- optional string field37259 = 9;
- optional uint32 field37260 = 10;
- optional fixed32 field37261 = 11;
- optional string field37262 = 12;
- optional string field37263 = 13;
- optional string field37264 = 14;
- optional int32 field37265 = 15;
- optional int64 field37266 = 16;
- optional int64 field37267 = 17;
- optional int32 field37268 = 18;
- optional int32 field37269 = 19;
- optional .benchmarks.google_message4.UnusedEmptyMessage field37270 = 20;
- optional .benchmarks.google_message4.UnusedEmptyMessage field37271 = 21;
- optional .benchmarks.google_message4.UnusedEmptyMessage field37272 = 22;
- optional .benchmarks.google_message4.UnusedEmptyMessage field37273 = 23;
- optional .benchmarks.google_message4.UnusedEmptyMessage field37274 = 24;
- optional string field37275 = 25;
- optional bool field37276 = 26;
-}
-
-message Message12799 {
- required string field12809 = 1;
- repeated fixed64 field12810 = 2;
- repeated .benchmarks.google_message4.Message12776 field12811 = 8;
- repeated int32 field12812 = 4;
- repeated .benchmarks.google_message4.Message12798 field12813 = 5;
- required int32 field12814 = 3;
- optional int32 field12815 = 6;
- optional .benchmarks.google_message4.Message12797 field12816 = 7;
-}
-
-message Message12870 {
- required int32 field12879 = 1;
- optional int32 field12880 = 7;
- required int32 field12881 = 2;
- optional uint64 field12882 = 3;
- optional string field12883 = 2001;
- optional fixed64 field12884 = 4;
- repeated fixed64 field12885 = 14;
- optional int32 field12886 = 9;
- optional int64 field12887 = 18;
- repeated .benchmarks.google_message4.Message12870 field12888 = 8;
- optional int32 field12889 = 5;
- optional uint64 field12890 = 6;
- optional int32 field12891 = 10;
- optional int32 field12892 = 11;
- optional double field12893 = 12;
- optional .benchmarks.google_message4.Message12825 field12894 = 13;
- optional double field12895 = 15;
- optional string field12896 = 16;
- optional .benchmarks.google_message4.Enum12871 field12897 = 17;
- optional int32 field12898 = 19;
-}
-
-message Message3804 {
- required int64 field3818 = 1;
- required bool field3819 = 2;
- repeated .benchmarks.google_message4.Enum3805 field3820 = 4;
- optional int32 field3821 = 5;
- optional bool field3822 = 6;
- optional int64 field3823 = 7;
- optional .benchmarks.google_message4.Enum3783 field3824 = 8;
-}
-
-message Message12903 {
- optional string field12905 = 1;
- optional .benchmarks.google_message4.Message8587 field12906 = 2;
- repeated .benchmarks.google_message4.Message8590 field12907 = 3;
-}
-
-message Message37326 {
- required string field37345 = 1;
- optional string field37346 = 2;
-}
-
-message Message2356 {
- optional .benchmarks.google_message4.Message1374 field2368 = 121;
- optional uint64 field2369 = 1;
- optional int32 field2370 = 2;
- optional int32 field2371 = 17;
- required string field2372 = 3;
- optional int32 field2373 = 7;
- optional bytes field2374 = 8;
- optional string field2375 = 4;
- optional string field2376 = 101;
- optional int32 field2377 = 102;
- optional int32 field2378 = 103;
- optional int32 field2379 = 104;
- optional int32 field2380 = 113;
- optional int32 field2381 = 114;
- optional int32 field2382 = 115;
- optional int32 field2383 = 117;
- optional int32 field2384 = 118;
- optional int32 field2385 = 119;
- optional int32 field2386 = 105;
- optional bytes field2387 = 5;
- optional group Message2357 = 6 {
- optional int64 field2399 = 9;
- optional int32 field2400 = 10;
- optional int32 field2401 = 11;
- optional int32 field2402 = 12;
- optional int32 field2403 = 13;
- optional int32 field2404 = 116;
- optional int32 field2405 = 106;
- required bytes field2406 = 14;
- optional int32 field2407 = 45;
- optional int32 field2408 = 112;
- optional bool field2409 = 122;
- optional bytes field2410 = 124;
- }
- optional string field2389 = 120;
- optional group Message2358 = 107 {}
- repeated group Message2359 = 40 {}
- optional int32 field2392 = 50;
- optional .benchmarks.google_message4.UnusedEmptyMessage field2393 = 60;
- optional .benchmarks.google_message4.UnusedEmptyMessage field2394 = 70;
- optional .benchmarks.google_message4.UnusedEmptyMessage field2395 = 80;
- optional .benchmarks.google_message4.UnusedEmptyMessage field2396 = 90;
- optional string field2397 = 100;
- optional string field2398 = 123;
-}
-
-message Message0 {
- option message_set_wire_format = true;
-
- extensions 4 to 2147483646;
-}
-
-message Message971 {
- optional string field972 = 1;
- optional int32 field973 = 2;
- optional bool field974 = 3;
-}
diff --git a/benchmarks/datasets/google_message4/benchmark_message4_1.proto b/benchmarks/datasets/google_message4/benchmark_message4_1.proto
deleted file mode 100644
index c5deecd..0000000
--- a/benchmarks/datasets/google_message4/benchmark_message4_1.proto
+++ /dev/null
@@ -1,500 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// LINT: ALLOW_GROUPS
-
-syntax = "proto2";
-
-package benchmarks.google_message4;
-
-import "datasets/google_message4/benchmark_message4_2.proto";
-import "datasets/google_message4/benchmark_message4_3.proto";
-
-option cc_enable_arenas = true;
-option java_package = "com.google.protobuf.benchmarks";
-
-message Message2463 {
- repeated .benchmarks.google_message4.Message2462 field2498 = 1;
-}
-
-message Message12686 {
- optional string field12699 = 1;
- optional .benchmarks.google_message4.Message12685 field12700 = 2;
-}
-
-message Message11949 {}
-
-message Message11975 {
- optional string field11992 = 1;
- optional int32 field11993 = 2;
- repeated .benchmarks.google_message4.Message10320 field11994 = 3;
- optional .benchmarks.google_message4.Message11947 field11995 = 4;
- optional .benchmarks.google_message4.Message11920 field11996 = 5;
- optional bool field11997 = 6;
- repeated string field11998 = 7;
- optional float field11999 = 8;
- repeated .benchmarks.google_message4.UnusedEnum field12000 = 9;
- optional int32 field12001 = 11;
-}
-
-message Message7287 {
- optional .benchmarks.google_message4.Message6133 field7311 = 1;
- optional .benchmarks.google_message4.UnusedEmptyMessage field7312 = 8;
- optional string field7313 = 3;
- optional .benchmarks.google_message4.Message6643 field7314 = 4;
- optional .benchmarks.google_message4.Enum7288 field7315 = 5;
- optional bytes field7316 = 6;
- optional .benchmarks.google_message4.UnusedEmptyMessage field7317 = 7;
- optional .benchmarks.google_message4.UnusedEmptyMessage field7318 = 9;
-}
-
-message Message3061 {
- optional string field3286 = 2;
- optional int32 field3287 = 77;
- optional string field3288 = 49;
- required .benchmarks.google_message4.Message3046 field3289 = 3;
- optional .benchmarks.google_message4.Message3046 field3290 = 58;
- optional group Message3062 = 4 {
- required int32 field3335 = 5;
- optional int32 field3336 = 6;
- optional int32 field3337 = 7;
- }
- optional .benchmarks.google_message4.Message3060 field3292 = 104;
- optional int64 field3293 = 32;
- optional int32 field3294 = 41;
- optional group Message3063 = 13 {
- required int32 field3338 = 14;
- optional .benchmarks.google_message4.Enum2851 field3339 = 18;
- optional int64 field3340 = 15;
- optional int64 field3341 = 23;
- }
- optional .benchmarks.google_message4.Enum2834 field3296 = 94;
- optional bool field3297 = 25;
- optional bool field3298 = 50;
- optional string field3299 = 89;
- optional string field3300 = 91;
- optional string field3301 = 105;
- optional .benchmarks.google_message4.Message3050 field3302 = 53;
- optional fixed64 field3303 = 51;
- optional fixed64 field3304 = 106;
- optional int32 field3305 = 60;
- optional string field3306 = 44;
- optional bytes field3307 = 81;
- optional string field3308 = 70;
- optional bytes field3309 = 45;
- optional .benchmarks.google_message4.Enum2806 field3310 = 71;
- optional int32 field3311 = 72;
- optional bytes field3312 = 78;
- optional int32 field3313 = 20;
- repeated group Message3064 = 8 {
- required .benchmarks.google_message4.Enum2602 field3342 = 9;
- optional int32 field3343 = 92;
- optional string field3344 = 10;
- optional bytes field3345 = 11;
- optional int32 field3346 = 12;
- optional .benchmarks.google_message4.Message3060 field3347 = 98;
- optional .benchmarks.google_message4.UnusedEmptyMessage field3348 = 82;
- optional .benchmarks.google_message4.Message3050 field3349 = 80;
- optional fixed64 field3350 = 52;
- optional int32 field3351 = 33;
- optional string field3352 = 42;
- optional string field3353 = 69;
- optional bytes field3354 = 43;
- optional .benchmarks.google_message4.Enum2806 field3355 = 73;
- optional int32 field3356 = 74;
- optional int32 field3357 = 90;
- optional bytes field3358 = 79;
- optional int32 field3359 = 19;
- optional .benchmarks.google_message4.Enum2834 field3360 = 95;
- }
- optional .benchmarks.google_message4.UnusedEmptyMessage field3315 = 39;
- optional int32 field3316 = 76;
- optional group Message3065 = 63 {}
- optional .benchmarks.google_message4.Enum2806 field3318 = 54;
- optional int32 field3319 = 46;
- repeated string field3320 = 24;
- optional fixed32 field3321 = 38;
- optional bytes field3322 = 99;
- optional fixed64 field3323 = 1;
- optional fixed64 field3324 = 97;
- repeated .benchmarks.google_message4.Message3040 field3325 = 16;
- repeated .benchmarks.google_message4.Message3041 field3326 = 61;
- optional group Message3066 = 21 {
- optional int32 field3366 = 22;
- optional int32 field3367 = 55;
- optional int32 field3368 = 88;
- optional int32 field3369 = 56;
- optional int32 field3370 = 75;
- optional int32 field3371 = 57;
- optional .benchmarks.google_message4.UnusedEmptyMessage field3372 = 85;
- optional .benchmarks.google_message4.UnusedEmptyMessage field3373 = 96;
- }
- optional .benchmarks.google_message4.UnusedEmptyMessage field3328 = 47;
- optional .benchmarks.google_message4.UnusedEmptyMessage field3329 = 48;
- optional fixed64 field3330 = 40;
- optional .benchmarks.google_message4.UnusedEmptyMessage field3331 = 86;
- optional .benchmarks.google_message4.UnusedEmptyMessage field3332 = 59;
- optional int32 field3333 = 17;
-}
-
-message Message12949 {}
-
-message Message8572 {
- optional bytes field8647 = 1;
- optional bytes field8648 = 3;
- optional .benchmarks.google_message4.Message3886 field8649 = 4;
- optional .benchmarks.google_message4.Message3919 field8650 = 57;
- optional bool field8651 = 5;
- optional int32 field8652 = 6;
- optional int32 field8653 = 49;
- optional .benchmarks.google_message4.Message7905 field8654 = 7;
- optional int32 field8655 = 10;
- optional .benchmarks.google_message4.UnusedEmptyMessage field8656 = 11;
- optional bool field8657 = 35;
- optional bytes field8658 = 12;
- optional string field8659 = 14;
- optional .benchmarks.google_message4.UnusedEmptyMessage field8660 = 13;
- optional bytes field8661 = 15;
- optional .benchmarks.google_message4.UnusedEmptyMessage field8662 = 17;
- optional int32 field8663 = 18;
- optional int32 field8664 = 19;
- optional bool field8665 = 20;
- optional .benchmarks.google_message4.Enum3476 field8666 = 31;
- optional bool field8667 = 36;
- optional .benchmarks.google_message4.UnusedEmptyMessage field8668 = 39;
- optional bytes field8669 = 22;
- optional int32 field8670 = 24;
- optional .benchmarks.google_message4.Message3052 field8671 = 25;
- optional bytes field8672 = 26;
- optional bytes field8673 = 28;
- optional int32 field8674 = 29;
- optional bytes field8675 = 30;
- optional bytes field8676 = 32;
- optional string field8677 = 33;
- optional int32 field8678 = 34;
- optional int32 field8679 = 37;
- optional double field8680 = 38;
- optional double field8681 = 42;
- optional .benchmarks.google_message4.Message3922 field8682 = 40;
- optional .benchmarks.google_message4.UnusedEmptyMessage field8683 = 43;
- optional int64 field8684 = 44;
- optional .benchmarks.google_message4.Message7929 field8685 = 45;
- optional uint64 field8686 = 46;
- optional uint32 field8687 = 48;
- optional .benchmarks.google_message4.Message7843 field8688 = 47;
- optional .benchmarks.google_message4.Message7864 field8689 = 50;
- optional .benchmarks.google_message4.UnusedEmptyMessage field8690 = 52;
- optional bool field8691 = 58;
- optional bool field8692 = 54;
- optional string field8693 = 55;
- optional .benchmarks.google_message4.UnusedEmptyMessage field8694 = 41;
- optional .benchmarks.google_message4.UnusedEmptyMessage field8695 = 53;
- optional .benchmarks.google_message4.Message8575 field8696 = 61;
-}
-
-message Message8774 {
- optional string field8810 = 1;
- optional string field8811 = 2;
- optional string field8812 = 3;
- optional string field8813 = 4;
- optional string field8814 = 5;
-}
-
-message Message12776 {
- optional string field12786 = 1;
- optional fixed64 field12787 = 11;
- optional int32 field12788 = 6;
- optional int32 field12789 = 13;
- optional int32 field12790 = 14;
- optional int32 field12791 = 15;
- optional int32 field12792 = 16;
- optional .benchmarks.google_message4.UnusedEmptyMessage field12793 = 8;
- optional .benchmarks.google_message4.Message12774 field12794 = 10;
- optional .benchmarks.google_message4.UnusedEmptyMessage field12795 = 12;
- extensions 2 to 2;
- extensions 3 to 3;
- extensions 4 to 4;
- extensions 5 to 5;
- extensions 7 to 7;
- extensions 9 to 9;
-}
-
-message Message12798 {
- optional int32 field12805 = 1;
- optional int32 field12806 = 2;
- optional .benchmarks.google_message4.Message12774 field12807 = 6;
- optional bool field12808 = 7;
-}
-
-message Message12797 {
- optional .benchmarks.google_message4.Message12796 field12802 = 1;
- repeated .benchmarks.google_message4.Message12796 field12803 = 2;
- optional string field12804 = 3;
-}
-
-message Message12825 {
- repeated .benchmarks.google_message4.Message12818 field12862 = 1;
- optional int32 field12863 = 2;
- optional .benchmarks.google_message4.Message12819 field12864 = 3;
- optional .benchmarks.google_message4.Message12820 field12865 = 4;
- optional int32 field12866 = 5;
- repeated .benchmarks.google_message4.Message12821 field12867 = 6;
- repeated .benchmarks.google_message4.UnusedEmptyMessage field12868 = 7;
-}
-
-message Message8590 {}
-
-message Message8587 {}
-
-message Message1374 {
- required string field1375 = 1;
- optional string field1376 = 2;
-}
-
-message Message2462 {
- required bytes field2496 = 1;
- required double field2497 = 2;
-}
-
-message Message12685 {
- repeated string field12692 = 1;
- repeated string field12693 = 2;
- optional int64 field12694 = 3;
- optional uint32 field12695 = 4;
- repeated string field12696 = 5;
- optional string field12697 = 6;
- optional string field12698 = 7;
-}
-
-message Message10320 {
- optional .benchmarks.google_message4.Enum10335 field10347 = 1;
- repeated .benchmarks.google_message4.Message10319 field10348 = 2;
- optional int32 field10349 = 3;
- optional int32 field10350 = 4;
- optional int32 field10351 = 5;
- optional int32 field10352 = 6;
- optional .benchmarks.google_message4.Enum10337 field10353 = 7;
-}
-
-message Message11947 {
- optional uint32 field11951 = 1;
- optional bool field11952 = 2;
- optional int32 field11953 = 3;
-}
-
-message Message11920 {
- optional .benchmarks.google_message4.Enum11901 field11945 = 1;
- optional .benchmarks.google_message4.UnusedEnum field11946 = 2;
-}
-
-message Message6643 {
- optional .benchmarks.google_message4.UnusedEmptyMessage field6683 = 3;
- optional .benchmarks.google_message4.UnusedEmptyMessage field6684 = 4;
- optional double field6685 = 5;
- optional double field6686 = 6;
- optional int32 field6687 = 1;
- optional int32 field6688 = 2;
- optional double field6689 = 9;
- optional bytes field6690 = 10;
- optional int32 field6691 = 11;
- optional bool field6692 = 12;
- optional bool field6693 = 13;
- optional .benchmarks.google_message4.Message6578 field6694 = 15;
- optional .benchmarks.google_message4.UnusedEnum field6695 = 16;
- optional int64 field6696 = 17;
- repeated .benchmarks.google_message4.UnusedEmptyMessage field6697 = 22;
- optional .benchmarks.google_message4.UnusedEmptyMessage field6698 = 19;
- optional .benchmarks.google_message4.UnusedEmptyMessage field6699 = 20;
- optional int32 field6700 = 21;
-}
-
-message Message6133 {
- optional .benchmarks.google_message4.Message4016 field6173 = 12;
- optional double field6174 = 16;
- required string field6175 = 1;
- required string field6176 = 2;
- required string field6177 = 3;
- optional string field6178 = 4;
- optional string field6179 = 8;
- repeated .benchmarks.google_message4.Message6109 field6180 = 5;
- repeated .benchmarks.google_message4.Message5908 field6181 = 13;
- repeated .benchmarks.google_message4.Message6107 field6182 = 7;
- repeated .benchmarks.google_message4.Message6126 field6183 = 9;
- repeated .benchmarks.google_message4.Message6129 field6184 = 15;
- optional int32 field6185 = 10;
- optional int32 field6186 = 11;
- optional .benchmarks.google_message4.Message4016 field6187 = 17;
- optional double field6188 = 14;
- optional double field6189 = 18;
- optional string field6190 = 19;
- optional string field6191 = 20;
- repeated .benchmarks.google_message4.Message5881 field6192 = 21;
-}
-
-message Message6109 {
- optional string field6140 = 1;
- required .benchmarks.google_message4.Enum6111 field6141 = 2;
- optional int32 field6142 = 9;
- optional string field6143 = 3;
- repeated .benchmarks.google_message4.Message6110 field6144 = 4;
- repeated int32 field6145 = 7;
- repeated int32 field6146 = 8;
- optional .benchmarks.google_message4.Message6133 field6147 = 10;
- repeated int32 field6148 = 11;
- optional string field6149 = 12;
- optional string field6150 = 13;
- optional bool field6151 = 14;
- extensions 1000 to 536870911;
-}
-
-message Message3046 {
- required .benchmarks.google_message4.Enum2593 field3222 = 1;
- optional int32 field3223 = 4;
-}
-
-message Message3060 {
- optional int64 field3283 = 1;
- optional int64 field3284 = 2;
- optional int64 field3285 = 3;
-}
-
-message Message3041 {
- optional string field3214 = 1;
- optional int32 field3215 = 2;
-}
-
-message Message3040 {
- required fixed64 field3209 = 1;
- repeated fixed64 field3210 = 4;
- optional int32 field3211 = 5;
- optional fixed64 field3212 = 2;
- required string field3213 = 3;
-}
-
-message Message3050 {
- optional bytes field3245 = 5;
- optional int32 field3246 = 2;
- optional bytes field3247 = 6;
- optional int32 field3248 = 4;
- optional fixed32 field3249 = 1;
- optional fixed32 field3250 = 3;
-}
-
-message Message7905 {
- optional int32 field7911 = 1;
- optional bool field7912 = 2;
- optional bytes field7913 = 3;
- optional int32 field7914 = 4;
- optional int32 field7915 = 5;
- optional bytes field7916 = 6;
- optional int32 field7917 = 7;
-}
-
-message Message3886 {
- repeated group Message3887 = 1 {
- required string field3932 = 2;
- optional string field3933 = 9;
- optional .benchmarks.google_message4.Message3850 field3934 = 3;
- optional bytes field3935 = 8;
- }
-}
-
-message Message7864 {
- optional string field7866 = 1;
- optional string field7867 = 2;
- repeated .benchmarks.google_message4.Message7865 field7868 = 5;
- repeated .benchmarks.google_message4.Message7865 field7869 = 6;
- repeated .benchmarks.google_message4.Message7865 field7870 = 7;
- repeated .benchmarks.google_message4.UnusedEmptyMessage field7871 = 8;
-}
-
-message Message3922 {
- optional uint64 field4012 = 1;
-}
-
-message Message3052 {
- repeated string field3254 = 1;
- repeated string field3255 = 2;
- repeated bytes field3256 = 3;
- repeated string field3257 = 4;
- optional bool field3258 = 5;
- optional int32 field3259 = 6;
- optional int32 field3260 = 7;
- optional string field3261 = 8;
- optional string field3262 = 9;
-}
-
-message Message8575 {}
-
-message Message7843 {
- optional bool field7844 = 5;
- optional int32 field7845 = 1;
- optional .benchmarks.google_message4.UnusedEmptyMessage field7846 = 22;
- repeated int32 field7847 = 3;
- repeated string field7848 = 11;
- optional .benchmarks.google_message4.UnusedEnum field7849 = 15;
- optional .benchmarks.google_message4.UnusedEmptyMessage field7850 = 6;
- optional .benchmarks.google_message4.UnusedEmptyMessage field7851 = 14;
- optional .benchmarks.google_message4.UnusedEmptyMessage field7852 = 10;
- optional .benchmarks.google_message4.Message7511 field7853 = 13;
- optional .benchmarks.google_message4.UnusedEmptyMessage field7854 = 16;
- optional .benchmarks.google_message4.UnusedEmptyMessage field7855 = 17;
- optional .benchmarks.google_message4.UnusedEmptyMessage field7856 = 19;
- optional .benchmarks.google_message4.UnusedEmptyMessage field7857 = 18;
- optional .benchmarks.google_message4.UnusedEnum field7858 = 20;
- optional int32 field7859 = 2;
-}
-
-message Message3919 {
- repeated .benchmarks.google_message4.Message3920 field4009 = 1;
-}
-
-message Message7929 {
- optional int64 field7942 = 1;
- optional int64 field7943 = 4;
- optional int64 field7944 = 5;
- optional int64 field7945 = 12;
- optional int64 field7946 = 13;
- optional int64 field7947 = 18;
- optional int64 field7948 = 6;
- optional int64 field7949 = 7;
- repeated .benchmarks.google_message4.Message7919 field7950 = 8;
- repeated .benchmarks.google_message4.UnusedEmptyMessage field7951 = 20;
- repeated .benchmarks.google_message4.Message7920 field7952 = 14;
- repeated .benchmarks.google_message4.Message7921 field7953 = 15;
- repeated .benchmarks.google_message4.Message7928 field7954 = 17;
- optional int64 field7955 = 19;
- optional bool field7956 = 2;
- optional int64 field7957 = 3;
- optional int64 field7958 = 9;
- repeated .benchmarks.google_message4.UnusedEmptyMessage field7959 = 10;
- repeated bytes field7960 = 11;
- optional int64 field7961 = 16;
-}
diff --git a/benchmarks/datasets/google_message4/benchmark_message4_2.proto b/benchmarks/datasets/google_message4/benchmark_message4_2.proto
deleted file mode 100644
index 0c4cdfd..0000000
--- a/benchmarks/datasets/google_message4/benchmark_message4_2.proto
+++ /dev/null
@@ -1,316 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-syntax = "proto2";
-
-package benchmarks.google_message4;
-
-import "datasets/google_message4/benchmark_message4_3.proto";
-
-option cc_enable_arenas = true;
-option java_package = "com.google.protobuf.benchmarks";
-
-message Message12774 {
- optional uint32 field12777 = 1;
- optional uint32 field12778 = 2;
- optional uint32 field12779 = 3;
- optional uint32 field12780 = 4;
- optional uint32 field12781 = 5;
- optional bool field12782 = 6;
-}
-
-message Message12796 {
- repeated fixed64 field12800 = 1;
- optional uint64 field12801 = 2;
-}
-
-message Message12821 {
- optional int32 field12848 = 1;
- optional int32 field12849 = 2;
- optional int32 field12850 = 3;
- optional int32 field12851 = 4;
- optional int32 field12852 = 5;
-}
-
-message Message12820 {
- optional int32 field12840 = 1;
- optional int32 field12841 = 2;
- optional int32 field12842 = 3;
- optional int32 field12843 = 8;
- optional int32 field12844 = 4;
- optional int32 field12845 = 5;
- optional int32 field12846 = 6;
- optional int32 field12847 = 7;
-}
-
-message Message12819 {
- optional double field12834 = 1;
- optional double field12835 = 2;
- optional double field12836 = 3;
- optional double field12837 = 4;
- optional double field12838 = 5;
- optional double field12839 = 6;
-}
-
-message Message12818 {
- optional uint64 field12829 = 1;
- optional int32 field12830 = 2;
- optional int32 field12831 = 3;
- optional int32 field12832 = 5;
- repeated .benchmarks.google_message4.Message12817 field12833 = 4;
-}
-
-message Message10319 {
- optional .benchmarks.google_message4.Enum10325 field10340 = 1;
- optional int32 field10341 = 4;
- optional int32 field10342 = 5;
- optional bytes field10343 = 3;
- optional string field10344 = 2;
- optional string field10345 = 6;
- optional string field10346 = 7;
-}
-
-message Message6578 {
- optional .benchmarks.google_message4.Enum6579 field6632 = 1;
- optional .benchmarks.google_message4.Enum6588 field6633 = 2;
-}
-
-message Message6126 {
- required string field6152 = 1;
- repeated .benchmarks.google_message4.Message6127 field6153 = 9;
- optional int32 field6154 = 14;
- optional bytes field6155 = 10;
- optional .benchmarks.google_message4.Message6024 field6156 = 12;
- optional int32 field6157 = 4;
- optional string field6158 = 5;
- optional int32 field6159 = 6;
- repeated int32 field6160 = 2;
- repeated int32 field6161 = 3;
- repeated .benchmarks.google_message4.Message6052 field6162 = 7;
- repeated .benchmarks.google_message4.UnusedEmptyMessage field6163 = 11;
- optional .benchmarks.google_message4.Enum6065 field6164 = 15;
- repeated .benchmarks.google_message4.Message6127 field6165 = 8;
- optional bool field6166 = 13;
- optional bool field6167 = 16;
- optional bool field6168 = 18;
- repeated .benchmarks.google_message4.Message6054 field6169 = 17;
- optional int32 field6170 = 19;
-}
-
-message Message5881 {
- required double field5897 = 1;
- optional string field5898 = 5;
- optional .benchmarks.google_message4.Message5861 field5899 = 2;
- optional .benchmarks.google_message4.UnusedEmptyMessage field5900 = 3;
- optional .benchmarks.google_message4.Message5867 field5901 = 4;
- optional .benchmarks.google_message4.Message5880 field5902 = 6;
-}
-
-message Message6110 {}
-
-message Message6107 {
- optional .benchmarks.google_message4.Message4016 field6134 = 1;
- optional int32 field6135 = 2;
- optional string field6136 = 3;
- repeated int32 field6137 = 4;
- optional int32 field6138 = 5;
- repeated .benchmarks.google_message4.Message6108 field6139 = 6;
-}
-
-message Message6129 {
- required .benchmarks.google_message4.Enum6130 field6171 = 1;
- required string field6172 = 2;
-}
-
-message Message5908 {
- optional string field5971 = 1;
- optional int32 field5972 = 2;
- optional int32 field5973 = 3;
- optional .benchmarks.google_message4.Enum5909 field5974 = 45;
- optional .benchmarks.google_message4.Enum5912 field5975 = 4;
- optional fixed32 field5976 = 50;
- optional fixed32 field5977 = 5;
- optional fixed32 field5978 = 6;
- optional string field5979 = 7;
- optional .benchmarks.google_message4.Enum5915 field5980 = 8;
- optional .benchmarks.google_message4.Message5903 field5981 = 9;
- optional .benchmarks.google_message4.Message5903 field5982 = 10;
- optional .benchmarks.google_message4.Enum5920 field5983 = 11;
- optional .benchmarks.google_message4.Enum5923 field5984 = 40;
- optional .benchmarks.google_message4.Message5903 field5985 = 41;
- optional .benchmarks.google_message4.Message5903 field5986 = 42;
- optional .benchmarks.google_message4.Enum5928 field5987 = 47;
- optional bool field5988 = 48;
- repeated fixed32 field5989 = 49;
- optional string field5990 = 12;
- optional .benchmarks.google_message4.Message5903 field5991 = 13;
- optional .benchmarks.google_message4.Message5903 field5992 = 14;
- optional .benchmarks.google_message4.Message5903 field5993 = 15;
- optional .benchmarks.google_message4.Message5903 field5994 = 16;
- optional .benchmarks.google_message4.Message5903 field5995 = 32;
- optional .benchmarks.google_message4.Message5903 field5996 = 33;
- optional .benchmarks.google_message4.Message5903 field5997 = 34;
- optional .benchmarks.google_message4.Message5903 field5998 = 35;
- optional .benchmarks.google_message4.Enum5931 field5999 = 17;
- optional .benchmarks.google_message4.Enum5935 field6000 = 18;
- optional .benchmarks.google_message4.Enum5939 field6001 = 36;
- optional .benchmarks.google_message4.Enum5939 field6002 = 37;
- repeated int32 field6003 = 19;
- optional uint32 field6004 = 20;
- optional uint32 field6005 = 21;
- optional uint32 field6006 = 22;
- optional uint32 field6007 = 23;
- optional .benchmarks.google_message4.Enum5946 field6008 = 24;
- optional .benchmarks.google_message4.Enum5946 field6009 = 25;
- optional .benchmarks.google_message4.Enum5946 field6010 = 26;
- optional .benchmarks.google_message4.Enum5946 field6011 = 27;
- optional fixed32 field6012 = 28;
- optional fixed32 field6013 = 29;
- optional fixed32 field6014 = 30;
- optional fixed32 field6015 = 31;
- optional int32 field6016 = 38;
- optional float field6017 = 39;
- optional .benchmarks.google_message4.Enum5957 field6018 = 43;
- optional .benchmarks.google_message4.Message5907 field6019 = 44;
- optional .benchmarks.google_message4.Enum5962 field6020 = 46;
-}
-
-message Message3850 {
- optional .benchmarks.google_message4.Enum3851 field3924 = 2;
- optional bool field3925 = 12;
- optional int32 field3926 = 4;
- optional bool field3927 = 10;
- optional bool field3928 = 13;
- optional bool field3929 = 14;
-}
-
-message Message7865 {}
-
-message Message7511 {
- optional bool field7523 = 1;
- optional .benchmarks.google_message4.Enum7512 field7524 = 2;
- optional int32 field7525 = 3;
- optional int32 field7526 = 4;
- optional bool field7527 = 5;
- optional int32 field7528 = 6;
- optional int32 field7529 = 7;
-}
-
-message Message3920 {}
-
-message Message7928 {
- optional string field7940 = 1;
- optional int64 field7941 = 2;
-}
-
-message Message7921 {
- optional int32 field7936 = 1;
- optional int64 field7937 = 2;
- optional float field7938 = 3;
- optional .benchmarks.google_message4.Enum7922 field7939 = 4;
-}
-
-message Message7920 {
- optional int64 field7934 = 1;
- optional int64 field7935 = 2;
-}
-
-message Message7919 {
- optional fixed64 field7931 = 1;
- optional int64 field7932 = 2;
- optional bytes field7933 = 3;
-}
-
-message Message12817 {
- optional int32 field12826 = 1;
- optional int32 field12827 = 2;
- optional int32 field12828 = 3;
-}
-
-message Message6054 {
- required string field6089 = 1;
- optional string field6090 = 2;
-}
-
-message Message6127 {}
-
-message Message6052 {
- required string field6084 = 1;
- required bytes field6085 = 2;
-}
-
-message Message6024 {
- optional .benchmarks.google_message4.Enum6025 field6048 = 1;
- optional string field6049 = 2;
- optional .benchmarks.google_message4.UnusedEmptyMessage field6050 = 3;
-}
-
-message Message5861 {
- required .benchmarks.google_message4.Enum5862 field5882 = 1;
- required string field5883 = 2;
- optional bool field5884 = 3;
- optional string field5885 = 4;
-}
-
-message Message5880 {
- optional string field5896 = 1;
-}
-
-message Message5867 {
- optional .benchmarks.google_message4.Enum5868 field5890 = 1;
- optional string field5891 = 2;
- optional .benchmarks.google_message4.Enum5873 field5892 = 3;
- optional int32 field5893 = 4;
- optional .benchmarks.google_message4.UnusedEnum field5894 = 5;
- optional bool field5895 = 6;
-}
-
-message Message4016 {
- required int32 field4017 = 1;
- required int32 field4018 = 2;
- required int32 field4019 = 3;
- required int32 field4020 = 4;
-}
-
-message Message6108 {}
-
-message Message5907 {
- optional .benchmarks.google_message4.Message5903 field5967 = 1;
- optional .benchmarks.google_message4.Message5903 field5968 = 2;
- optional .benchmarks.google_message4.Message5903 field5969 = 3;
- optional .benchmarks.google_message4.Message5903 field5970 = 4;
-}
-
-message UnusedEmptyMessage {}
-
-message Message5903 {
- required int32 field5965 = 1;
- optional .benchmarks.google_message4.Enum5904 field5966 = 2;
-}
diff --git a/benchmarks/datasets/google_message4/benchmark_message4_3.proto b/benchmarks/datasets/google_message4/benchmark_message4_3.proto
deleted file mode 100644
index 42e254b..0000000
--- a/benchmarks/datasets/google_message4/benchmark_message4_3.proto
+++ /dev/null
@@ -1,779 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-syntax = "proto2";
-
-package benchmarks.google_message4;
-
-option cc_enable_arenas = true;
-option java_package = "com.google.protobuf.benchmarks";
-
-enum UnusedEnum {
- UNUSED_ENUM_VALUE1 = 0;
- UNUSED_ENUM_VALUE2 = 1;
-}
-
-enum Enum2593 {
- ENUM_VALUE2594 = 0;
- ENUM_VALUE2595 = 1;
- ENUM_VALUE2596 = 2;
- ENUM_VALUE2597 = 3;
- ENUM_VALUE2598 = 4;
- ENUM_VALUE2599 = 5;
- ENUM_VALUE2600 = 6;
- ENUM_VALUE2601 = 7;
-}
-
-enum Enum2834 {
- ENUM_VALUE2835 = 0;
- ENUM_VALUE2836 = 1;
- ENUM_VALUE2837 = 2;
-}
-
-enum Enum2806 {
- ENUM_VALUE2807 = 0;
- ENUM_VALUE2808 = 1;
- ENUM_VALUE2809 = 2;
- ENUM_VALUE2810 = 3;
- ENUM_VALUE2811 = 4;
- ENUM_VALUE2812 = 5;
- ENUM_VALUE2813 = 6;
- ENUM_VALUE2814 = 7;
- ENUM_VALUE2815 = 8;
- ENUM_VALUE2816 = 9;
- ENUM_VALUE2817 = 10;
- ENUM_VALUE2818 = 11;
- ENUM_VALUE2819 = 12;
- ENUM_VALUE2820 = 13;
- ENUM_VALUE2821 = 14;
-}
-
-enum Enum2851 {
- option allow_alias = true;
-
- ENUM_VALUE2852 = 0;
- ENUM_VALUE2853 = 0;
- ENUM_VALUE2854 = 1;
- ENUM_VALUE2855 = 2;
- ENUM_VALUE2856 = 3;
- ENUM_VALUE2857 = 4;
- ENUM_VALUE2858 = 5;
- ENUM_VALUE2859 = 6;
- ENUM_VALUE2860 = 7;
- ENUM_VALUE2861 = 8;
- ENUM_VALUE2862 = 9;
- ENUM_VALUE2863 = 10;
- ENUM_VALUE2864 = 11;
- ENUM_VALUE2865 = 12;
- ENUM_VALUE2866 = 13;
- ENUM_VALUE2867 = 14;
- ENUM_VALUE2868 = 15;
- ENUM_VALUE2869 = 16;
- ENUM_VALUE2870 = 17;
- ENUM_VALUE2871 = 18;
- ENUM_VALUE2872 = 19;
- ENUM_VALUE2873 = 20;
- ENUM_VALUE2874 = 21;
- ENUM_VALUE2875 = 22;
- ENUM_VALUE2876 = 23;
- ENUM_VALUE2877 = 24;
- ENUM_VALUE2878 = 25;
- ENUM_VALUE2879 = 26;
- ENUM_VALUE2880 = 27;
- ENUM_VALUE2881 = 28;
- ENUM_VALUE2882 = 29;
- ENUM_VALUE2883 = 30;
- ENUM_VALUE2884 = 31;
- ENUM_VALUE2885 = 32;
- ENUM_VALUE2886 = 33;
- ENUM_VALUE2887 = 34;
- ENUM_VALUE2888 = 35;
- ENUM_VALUE2889 = 36;
- ENUM_VALUE2890 = 37;
- ENUM_VALUE2891 = 38;
- ENUM_VALUE2892 = 39;
- ENUM_VALUE2893 = 40;
- ENUM_VALUE2894 = 41;
- ENUM_VALUE2895 = 42;
- ENUM_VALUE2896 = 43;
- ENUM_VALUE2897 = 44;
- ENUM_VALUE2898 = 45;
- ENUM_VALUE2899 = 46;
- ENUM_VALUE2900 = 47;
- ENUM_VALUE2901 = 48;
- ENUM_VALUE2902 = 49;
- ENUM_VALUE2903 = 50;
- ENUM_VALUE2904 = 51;
- ENUM_VALUE2905 = 52;
- ENUM_VALUE2906 = 53;
- ENUM_VALUE2907 = 54;
- ENUM_VALUE2908 = 55;
- ENUM_VALUE2909 = 56;
- ENUM_VALUE2910 = 57;
- ENUM_VALUE2911 = 58;
- ENUM_VALUE2912 = 59;
- ENUM_VALUE2913 = 60;
- ENUM_VALUE2914 = 61;
- ENUM_VALUE2915 = 62;
- ENUM_VALUE2916 = 63;
- ENUM_VALUE2917 = 64;
- ENUM_VALUE2918 = 65;
- ENUM_VALUE2919 = 66;
- ENUM_VALUE2920 = 67;
- ENUM_VALUE2921 = 68;
- ENUM_VALUE2922 = 69;
- ENUM_VALUE2923 = 70;
- ENUM_VALUE2924 = 71;
- ENUM_VALUE2925 = 72;
- ENUM_VALUE2926 = 73;
- ENUM_VALUE2927 = 74;
- ENUM_VALUE2928 = 75;
- ENUM_VALUE2929 = 76;
- ENUM_VALUE2930 = 77;
- ENUM_VALUE2931 = 78;
- ENUM_VALUE2932 = 79;
- ENUM_VALUE2933 = 80;
- ENUM_VALUE2934 = 81;
- ENUM_VALUE2935 = 82;
- ENUM_VALUE2936 = 83;
- ENUM_VALUE2937 = 84;
- ENUM_VALUE2938 = 85;
- ENUM_VALUE2939 = 86;
- ENUM_VALUE2940 = 87;
- ENUM_VALUE2941 = 88;
- ENUM_VALUE2942 = 89;
- ENUM_VALUE2943 = 90;
- ENUM_VALUE2944 = 91;
- ENUM_VALUE2945 = 92;
- ENUM_VALUE2946 = 93;
- ENUM_VALUE2947 = 94;
- ENUM_VALUE2948 = 95;
- ENUM_VALUE2949 = 96;
- ENUM_VALUE2950 = 97;
- ENUM_VALUE2951 = 98;
- ENUM_VALUE2952 = 99;
- ENUM_VALUE2953 = 100;
- ENUM_VALUE2954 = 101;
- ENUM_VALUE2955 = 102;
- ENUM_VALUE2956 = 103;
- ENUM_VALUE2957 = 104;
- ENUM_VALUE2958 = 105;
- ENUM_VALUE2959 = 106;
- ENUM_VALUE2960 = 107;
- ENUM_VALUE2961 = 108;
- ENUM_VALUE2962 = 109;
- ENUM_VALUE2963 = 110;
- ENUM_VALUE2964 = 111;
- ENUM_VALUE2965 = 112;
- ENUM_VALUE2966 = 113;
- ENUM_VALUE2967 = 114;
- ENUM_VALUE2968 = 115;
- ENUM_VALUE2969 = 116;
- ENUM_VALUE2970 = 117;
- ENUM_VALUE2971 = 118;
- ENUM_VALUE2972 = 119;
-}
-
-enum Enum2602 {
- ENUM_VALUE2603 = 0;
- ENUM_VALUE2604 = 1;
- ENUM_VALUE2605 = 2;
- ENUM_VALUE2606 = 3;
- ENUM_VALUE2607 = 4;
- ENUM_VALUE2608 = 5;
- ENUM_VALUE2609 = 6;
- ENUM_VALUE2610 = 7;
- ENUM_VALUE2611 = 8;
- ENUM_VALUE2612 = 9;
- ENUM_VALUE2613 = 10;
- ENUM_VALUE2614 = 11;
-}
-
-enum Enum3071 {
- ENUM_VALUE3072 = 1;
- ENUM_VALUE3073 = 2;
- ENUM_VALUE3074 = 3;
- ENUM_VALUE3075 = 4;
- ENUM_VALUE3076 = 5;
- ENUM_VALUE3077 = 6;
- ENUM_VALUE3078 = 7;
- ENUM_VALUE3079 = 8;
- ENUM_VALUE3080 = 9;
- ENUM_VALUE3081 = 10;
- ENUM_VALUE3082 = 11;
- ENUM_VALUE3083 = 12;
- ENUM_VALUE3084 = 13;
- ENUM_VALUE3085 = 14;
- ENUM_VALUE3086 = 15;
- ENUM_VALUE3087 = 16;
- ENUM_VALUE3088 = 17;
- ENUM_VALUE3089 = 18;
- ENUM_VALUE3090 = 19;
- ENUM_VALUE3091 = 20;
- ENUM_VALUE3092 = 21;
- ENUM_VALUE3093 = 22;
- ENUM_VALUE3094 = 23;
- ENUM_VALUE3095 = 24;
- ENUM_VALUE3096 = 25;
- ENUM_VALUE3097 = 26;
- ENUM_VALUE3098 = 27;
- ENUM_VALUE3099 = 28;
-}
-
-enum Enum3805 {
- ENUM_VALUE3806 = 0;
- ENUM_VALUE3807 = 1;
- ENUM_VALUE3808 = 2;
- ENUM_VALUE3809 = 3;
- ENUM_VALUE3810 = 4;
- ENUM_VALUE3811 = 5;
- ENUM_VALUE3812 = 6;
- ENUM_VALUE3813 = 7;
- ENUM_VALUE3814 = 8;
- ENUM_VALUE3815 = 9;
- ENUM_VALUE3816 = 11;
- ENUM_VALUE3817 = 10;
-}
-
-enum Enum3783 {
- ENUM_VALUE3784 = 0;
- ENUM_VALUE3785 = 1;
- ENUM_VALUE3786 = 2;
- ENUM_VALUE3787 = 3;
- ENUM_VALUE3788 = 4;
- ENUM_VALUE3789 = 5;
- ENUM_VALUE3790 = 6;
- ENUM_VALUE3791 = 7;
- ENUM_VALUE3792 = 8;
- ENUM_VALUE3793 = 9;
- ENUM_VALUE3794 = 10;
- ENUM_VALUE3795 = 11;
- ENUM_VALUE3796 = 12;
- ENUM_VALUE3797 = 13;
- ENUM_VALUE3798 = 14;
- ENUM_VALUE3799 = 15;
- ENUM_VALUE3800 = 16;
- ENUM_VALUE3801 = 20;
- ENUM_VALUE3802 = 21;
- ENUM_VALUE3803 = 50;
-}
-
-enum Enum3851 {
- ENUM_VALUE3852 = 0;
- ENUM_VALUE3853 = 1;
- ENUM_VALUE3854 = 2;
- ENUM_VALUE3855 = 3;
- ENUM_VALUE3856 = 4;
- ENUM_VALUE3857 = 5;
- ENUM_VALUE3858 = 6;
- ENUM_VALUE3859 = 7;
- ENUM_VALUE3860 = 8;
- ENUM_VALUE3861 = 9;
- ENUM_VALUE3862 = 10;
- ENUM_VALUE3863 = 11;
- ENUM_VALUE3864 = 12;
- ENUM_VALUE3865 = 13;
- ENUM_VALUE3866 = 14;
- ENUM_VALUE3867 = 15;
- ENUM_VALUE3868 = 16;
- ENUM_VALUE3869 = 17;
-}
-
-enum Enum5862 {
- ENUM_VALUE5863 = 1;
- ENUM_VALUE5864 = 2;
- ENUM_VALUE5865 = 3;
-}
-
-enum Enum5868 {
- ENUM_VALUE5869 = 0;
- ENUM_VALUE5870 = 1;
- ENUM_VALUE5871 = 2;
- ENUM_VALUE5872 = 3;
-}
-
-enum Enum5873 {
- ENUM_VALUE5874 = 0;
- ENUM_VALUE5875 = 1;
- ENUM_VALUE5876 = 2;
-}
-
-enum Enum5904 {
- ENUM_VALUE5905 = 0;
- ENUM_VALUE5906 = 1;
-}
-
-enum Enum5909 {
- ENUM_VALUE5910 = 0;
- ENUM_VALUE5911 = 1;
-}
-
-enum Enum5912 {
- ENUM_VALUE5913 = 0;
- ENUM_VALUE5914 = 1;
-}
-
-enum Enum5915 {
- ENUM_VALUE5916 = 0;
- ENUM_VALUE5917 = 1;
- ENUM_VALUE5918 = 2;
- ENUM_VALUE5919 = 3;
-}
-
-enum Enum5920 {
- ENUM_VALUE5921 = 0;
- ENUM_VALUE5922 = 1;
-}
-
-enum Enum5923 {
- ENUM_VALUE5924 = 0;
- ENUM_VALUE5925 = 1;
- ENUM_VALUE5926 = 2;
- ENUM_VALUE5927 = 3;
-}
-
-enum Enum5928 {
- ENUM_VALUE5929 = 0;
- ENUM_VALUE5930 = 1;
-}
-
-enum Enum5931 {
- ENUM_VALUE5932 = 0;
- ENUM_VALUE5933 = 1;
- ENUM_VALUE5934 = 2;
-}
-
-enum Enum5935 {
- ENUM_VALUE5936 = 0;
- ENUM_VALUE5937 = 1;
- ENUM_VALUE5938 = 2;
-}
-
-enum Enum5939 {
- ENUM_VALUE5940 = 0;
- ENUM_VALUE5941 = 1;
- ENUM_VALUE5942 = 2;
- ENUM_VALUE5943 = 3;
- ENUM_VALUE5944 = 4;
- ENUM_VALUE5945 = 5;
-}
-
-enum Enum5946 {
- ENUM_VALUE5947 = 0;
- ENUM_VALUE5948 = 1;
- ENUM_VALUE5949 = 2;
- ENUM_VALUE5950 = 3;
- ENUM_VALUE5951 = 4;
- ENUM_VALUE5952 = 5;
- ENUM_VALUE5953 = 6;
- ENUM_VALUE5954 = 7;
- ENUM_VALUE5955 = 8;
- ENUM_VALUE5956 = 9;
-}
-
-enum Enum5957 {
- ENUM_VALUE5958 = 0;
- ENUM_VALUE5959 = 1;
- ENUM_VALUE5960 = 2;
- ENUM_VALUE5961 = 3;
-}
-
-enum Enum5962 {
- ENUM_VALUE5963 = 0;
- ENUM_VALUE5964 = 1;
-}
-
-enum Enum6025 {
- ENUM_VALUE6026 = 0;
- ENUM_VALUE6027 = 1;
- ENUM_VALUE6028 = 2;
- ENUM_VALUE6029 = 3;
- ENUM_VALUE6030 = 4;
- ENUM_VALUE6031 = 5;
- ENUM_VALUE6032 = 6;
- ENUM_VALUE6033 = 7;
- ENUM_VALUE6034 = 8;
- ENUM_VALUE6035 = 9;
- ENUM_VALUE6036 = 10;
- ENUM_VALUE6037 = 11;
- ENUM_VALUE6038 = 12;
- ENUM_VALUE6039 = 13;
- ENUM_VALUE6040 = 14;
- ENUM_VALUE6041 = 15;
- ENUM_VALUE6042 = 16;
- ENUM_VALUE6043 = 17;
- ENUM_VALUE6044 = 18;
- ENUM_VALUE6045 = 19;
- ENUM_VALUE6046 = 20;
- ENUM_VALUE6047 = 21;
-}
-
-enum Enum6111 {
- ENUM_VALUE6112 = 1;
- ENUM_VALUE6113 = 2;
- ENUM_VALUE6114 = 3;
- ENUM_VALUE6115 = 4;
- ENUM_VALUE6116 = 5;
- ENUM_VALUE6117 = 6;
- ENUM_VALUE6118 = 7;
- ENUM_VALUE6119 = 8;
- ENUM_VALUE6120 = 9;
- ENUM_VALUE6121 = 10;
- ENUM_VALUE6122 = 11;
- ENUM_VALUE6123 = 12;
- ENUM_VALUE6124 = 13;
- ENUM_VALUE6125 = 14;
-}
-
-enum Enum6065 {
- ENUM_VALUE6066 = 0;
- ENUM_VALUE6067 = 1;
- ENUM_VALUE6068 = 2;
- ENUM_VALUE6069 = 3;
- ENUM_VALUE6070 = 4;
- ENUM_VALUE6071 = 5;
- ENUM_VALUE6072 = 6;
- ENUM_VALUE6073 = 7;
- ENUM_VALUE6074 = 8;
- ENUM_VALUE6075 = 9;
- ENUM_VALUE6076 = 10;
- ENUM_VALUE6077 = 11;
- ENUM_VALUE6078 = 12;
- ENUM_VALUE6079 = 13;
- ENUM_VALUE6080 = 14;
-}
-
-enum Enum6130 {
- ENUM_VALUE6131 = 0;
- ENUM_VALUE6132 = 1;
-}
-
-enum Enum6579 {
- ENUM_VALUE6580 = 0;
- ENUM_VALUE6581 = 2;
- ENUM_VALUE6582 = 3;
- ENUM_VALUE6583 = 5;
- ENUM_VALUE6584 = 10;
- ENUM_VALUE6585 = 15;
- ENUM_VALUE6586 = 25;
- ENUM_VALUE6587 = 30;
-}
-
-enum Enum6588 {
- ENUM_VALUE6589 = 0;
- ENUM_VALUE6590 = 1;
- ENUM_VALUE6591 = 2;
- ENUM_VALUE6592 = 3;
- ENUM_VALUE6593 = 4;
- ENUM_VALUE6594 = 5;
- ENUM_VALUE6595 = 6;
- ENUM_VALUE6596 = 7;
- ENUM_VALUE6597 = 8;
- ENUM_VALUE6598 = 9;
- ENUM_VALUE6599 = 10;
- ENUM_VALUE6600 = 11;
- ENUM_VALUE6601 = 12;
- ENUM_VALUE6602 = 13;
- ENUM_VALUE6603 = 14;
- ENUM_VALUE6604 = 15;
- ENUM_VALUE6605 = 16;
- ENUM_VALUE6606 = 17;
- ENUM_VALUE6607 = 19;
- ENUM_VALUE6608 = 20;
- ENUM_VALUE6609 = 21;
- ENUM_VALUE6610 = 22;
- ENUM_VALUE6611 = 23;
- ENUM_VALUE6612 = 24;
- ENUM_VALUE6613 = 25;
- ENUM_VALUE6614 = 26;
- ENUM_VALUE6615 = 27;
- ENUM_VALUE6616 = 28;
- ENUM_VALUE6617 = 29;
- ENUM_VALUE6618 = 30;
- ENUM_VALUE6619 = 31;
- ENUM_VALUE6620 = 32;
- ENUM_VALUE6621 = 33;
- ENUM_VALUE6622 = 34;
-}
-
-enum Enum7288 {
- ENUM_VALUE7289 = 0;
- ENUM_VALUE7290 = 1;
- ENUM_VALUE7291 = 2;
- ENUM_VALUE7292 = 3;
-}
-
-enum Enum7512 {
- ENUM_VALUE7513 = 0;
- ENUM_VALUE7514 = 1;
- ENUM_VALUE7515 = 2;
- ENUM_VALUE7516 = 3;
- ENUM_VALUE7517 = 4;
- ENUM_VALUE7518 = 5;
- ENUM_VALUE7519 = 6;
- ENUM_VALUE7520 = 7;
-}
-
-enum Enum7922 {
- ENUM_VALUE7923 = 1;
- ENUM_VALUE7924 = 2;
- ENUM_VALUE7925 = 3;
- ENUM_VALUE7926 = 4;
- ENUM_VALUE7927 = 5;
-}
-
-enum Enum3476 {
- ENUM_VALUE3477 = 0;
- ENUM_VALUE3478 = 1;
- ENUM_VALUE3479 = 2;
- ENUM_VALUE3480 = 3;
- ENUM_VALUE3481 = 4;
- ENUM_VALUE3482 = 5;
- ENUM_VALUE3483 = 6;
- ENUM_VALUE3484 = 7;
- ENUM_VALUE3485 = 8;
- ENUM_VALUE3486 = 9;
- ENUM_VALUE3487 = 10;
- ENUM_VALUE3488 = 11;
- ENUM_VALUE3489 = 12;
- ENUM_VALUE3490 = 13;
- ENUM_VALUE3491 = 14;
- ENUM_VALUE3492 = 15;
- ENUM_VALUE3493 = 16;
- ENUM_VALUE3494 = 17;
- ENUM_VALUE3495 = 18;
- ENUM_VALUE3496 = 19;
- ENUM_VALUE3497 = 20;
- ENUM_VALUE3498 = 21;
- ENUM_VALUE3499 = 22;
- ENUM_VALUE3500 = 23;
- ENUM_VALUE3501 = 24;
- ENUM_VALUE3502 = 25;
- ENUM_VALUE3503 = 26;
- ENUM_VALUE3504 = 27;
- ENUM_VALUE3505 = 28;
- ENUM_VALUE3506 = 29;
- ENUM_VALUE3507 = 30;
- ENUM_VALUE3508 = 31;
- ENUM_VALUE3509 = 32;
- ENUM_VALUE3510 = 33;
- ENUM_VALUE3511 = 34;
- ENUM_VALUE3512 = 35;
- ENUM_VALUE3513 = 36;
- ENUM_VALUE3514 = 37;
- ENUM_VALUE3515 = 38;
- ENUM_VALUE3516 = 39;
- ENUM_VALUE3517 = 40;
- ENUM_VALUE3518 = 41;
- ENUM_VALUE3519 = 42;
- ENUM_VALUE3520 = 43;
- ENUM_VALUE3521 = 44;
- ENUM_VALUE3522 = 45;
- ENUM_VALUE3523 = 46;
- ENUM_VALUE3524 = 47;
- ENUM_VALUE3525 = 48;
- ENUM_VALUE3526 = 49;
- ENUM_VALUE3527 = 50;
- ENUM_VALUE3528 = 51;
- ENUM_VALUE3529 = 52;
- ENUM_VALUE3530 = 53;
- ENUM_VALUE3531 = 54;
- ENUM_VALUE3532 = 55;
- ENUM_VALUE3533 = 56;
- ENUM_VALUE3534 = 57;
- ENUM_VALUE3535 = 58;
- ENUM_VALUE3536 = 59;
- ENUM_VALUE3537 = 60;
- ENUM_VALUE3538 = 61;
- ENUM_VALUE3539 = 62;
- ENUM_VALUE3540 = 63;
- ENUM_VALUE3541 = 64;
- ENUM_VALUE3542 = 65;
- ENUM_VALUE3543 = 66;
- ENUM_VALUE3544 = 67;
- ENUM_VALUE3545 = 68;
- ENUM_VALUE3546 = 69;
- ENUM_VALUE3547 = 70;
- ENUM_VALUE3548 = 71;
- ENUM_VALUE3549 = 72;
- ENUM_VALUE3550 = 73;
- ENUM_VALUE3551 = 74;
- ENUM_VALUE3552 = 75;
- ENUM_VALUE3553 = 76;
- ENUM_VALUE3554 = 77;
- ENUM_VALUE3555 = 78;
- ENUM_VALUE3556 = 79;
- ENUM_VALUE3557 = 80;
- ENUM_VALUE3558 = 81;
- ENUM_VALUE3559 = 82;
- ENUM_VALUE3560 = 83;
- ENUM_VALUE3561 = 84;
- ENUM_VALUE3562 = 85;
- ENUM_VALUE3563 = 86;
- ENUM_VALUE3564 = 87;
- ENUM_VALUE3565 = 88;
- ENUM_VALUE3566 = 89;
- ENUM_VALUE3567 = 90;
- ENUM_VALUE3568 = 91;
- ENUM_VALUE3569 = 92;
- ENUM_VALUE3570 = 93;
- ENUM_VALUE3571 = 94;
- ENUM_VALUE3572 = 95;
- ENUM_VALUE3573 = 96;
- ENUM_VALUE3574 = 97;
- ENUM_VALUE3575 = 98;
- ENUM_VALUE3576 = 99;
- ENUM_VALUE3577 = 100;
- ENUM_VALUE3578 = 101;
- ENUM_VALUE3579 = 102;
- ENUM_VALUE3580 = 103;
- ENUM_VALUE3581 = 104;
- ENUM_VALUE3582 = 105;
- ENUM_VALUE3583 = 106;
- ENUM_VALUE3584 = 107;
- ENUM_VALUE3585 = 108;
- ENUM_VALUE3586 = 109;
- ENUM_VALUE3587 = 110;
- ENUM_VALUE3588 = 111;
- ENUM_VALUE3589 = 112;
- ENUM_VALUE3590 = 113;
- ENUM_VALUE3591 = 114;
- ENUM_VALUE3592 = 115;
- ENUM_VALUE3593 = 116;
- ENUM_VALUE3594 = 117;
- ENUM_VALUE3595 = 118;
- ENUM_VALUE3596 = 119;
- ENUM_VALUE3597 = 120;
- ENUM_VALUE3598 = 121;
- ENUM_VALUE3599 = 122;
- ENUM_VALUE3600 = 123;
- ENUM_VALUE3601 = 124;
- ENUM_VALUE3602 = 125;
- ENUM_VALUE3603 = 126;
- ENUM_VALUE3604 = 127;
- ENUM_VALUE3605 = 128;
- ENUM_VALUE3606 = 129;
- ENUM_VALUE3607 = 130;
- ENUM_VALUE3608 = 131;
- ENUM_VALUE3609 = 132;
- ENUM_VALUE3610 = 133;
- ENUM_VALUE3611 = 134;
- ENUM_VALUE3612 = 135;
- ENUM_VALUE3613 = 136;
- ENUM_VALUE3614 = 137;
- ENUM_VALUE3615 = 138;
- ENUM_VALUE3616 = 139;
- ENUM_VALUE3617 = 140;
- ENUM_VALUE3618 = 141;
- ENUM_VALUE3619 = 142;
- ENUM_VALUE3620 = 143;
- ENUM_VALUE3621 = 144;
- ENUM_VALUE3622 = 145;
- ENUM_VALUE3623 = 146;
- ENUM_VALUE3624 = 147;
- ENUM_VALUE3625 = 148;
- ENUM_VALUE3626 = 149;
- ENUM_VALUE3627 = 150;
- ENUM_VALUE3628 = 151;
- ENUM_VALUE3629 = 152;
- ENUM_VALUE3630 = 153;
- ENUM_VALUE3631 = 154;
- ENUM_VALUE3632 = 155;
- ENUM_VALUE3633 = 156;
- ENUM_VALUE3634 = 157;
- ENUM_VALUE3635 = 158;
- ENUM_VALUE3636 = 159;
- ENUM_VALUE3637 = 160;
- ENUM_VALUE3638 = 161;
- ENUM_VALUE3639 = 162;
- ENUM_VALUE3640 = 163;
- ENUM_VALUE3641 = 164;
- ENUM_VALUE3642 = 165;
- ENUM_VALUE3643 = 166;
- ENUM_VALUE3644 = 167;
- ENUM_VALUE3645 = 168;
- ENUM_VALUE3646 = 169;
- ENUM_VALUE3647 = 170;
- ENUM_VALUE3648 = 171;
- ENUM_VALUE3649 = 172;
- ENUM_VALUE3650 = 173;
- ENUM_VALUE3651 = 174;
- ENUM_VALUE3652 = 175;
- ENUM_VALUE3653 = 176;
- ENUM_VALUE3654 = 177;
- ENUM_VALUE3655 = 178;
- ENUM_VALUE3656 = 179;
- ENUM_VALUE3657 = 180;
- ENUM_VALUE3658 = 181;
- ENUM_VALUE3659 = 182;
- ENUM_VALUE3660 = 183;
-}
-
-enum Enum10325 {
- ENUM_VALUE10326 = 0;
- ENUM_VALUE10327 = 1;
- ENUM_VALUE10328 = 2;
- ENUM_VALUE10329 = 3;
- ENUM_VALUE10330 = 4;
- ENUM_VALUE10331 = 5;
- ENUM_VALUE10332 = 6;
- ENUM_VALUE10333 = 7;
- ENUM_VALUE10334 = 8;
-}
-
-enum Enum10335 { ENUM_VALUE10336 = 0; }
-
-enum Enum10337 {
- ENUM_VALUE10338 = 0;
- ENUM_VALUE10339 = 1;
-}
-
-enum Enum11901 {
- ENUM_VALUE11902 = 0;
- ENUM_VALUE11903 = 1;
- ENUM_VALUE11904 = 2;
- ENUM_VALUE11905 = 3;
-}
-
-enum Enum12735 {
- ENUM_VALUE12736 = 0;
- ENUM_VALUE12737 = 1;
- ENUM_VALUE12738 = 2;
- ENUM_VALUE12739 = 3;
-}
-
-enum Enum12871 {
- ENUM_VALUE12872 = 1;
- ENUM_VALUE12873 = 2;
- ENUM_VALUE12874 = 3;
- ENUM_VALUE12875 = 4;
- ENUM_VALUE12876 = 5;
- ENUM_VALUE12877 = 6;
-}
diff --git a/benchmarks/go/go_benchmark_test.go b/benchmarks/go/go_benchmark_test.go
deleted file mode 100644
index 8c741b7..0000000
--- a/benchmarks/go/go_benchmark_test.go
+++ /dev/null
@@ -1,124 +0,0 @@
-package main
-
-import (
- benchmarkWrapper "../tmp"
- googleMessage1Proto2 "../tmp/datasets/google_message1/proto2"
- googleMessage1Proto3 "../tmp/datasets/google_message1/proto3"
- googleMessage2 "../tmp/datasets/google_message2"
- googleMessage3 "../tmp/datasets/google_message3"
- googleMessage4 "../tmp/datasets/google_message4"
- "flag"
- "github.com/golang/protobuf/proto"
- "io/ioutil"
- "testing"
-)
-
-// Data is returned by the Load function.
-type Dataset struct {
- name string
- newMessage func() proto.Message
- marshaled [][]byte
- unmarshaled []proto.Message
-}
-
-var datasets []Dataset
-
-// This is used to getDefaultInstance for a message type.
-func generateNewMessageFunction(dataset benchmarkWrapper.BenchmarkDataset) func() proto.Message {
- switch dataset.MessageName {
- case "benchmarks.proto3.GoogleMessage1":
- return func() proto.Message { return new(googleMessage1Proto3.GoogleMessage1) }
- case "benchmarks.proto2.GoogleMessage1":
- return func() proto.Message { return new(googleMessage1Proto2.GoogleMessage1) }
- case "benchmarks.proto2.GoogleMessage2":
- return func() proto.Message { return new(googleMessage2.GoogleMessage2) }
- case "benchmarks.google_message3.GoogleMessage3":
- return func() proto.Message { return new(googleMessage3.GoogleMessage3) }
- case "benchmarks.google_message4.GoogleMessage4":
- return func() proto.Message { return new(googleMessage4.GoogleMessage4) }
- default:
- panic("Unknown message type: " + dataset.MessageName)
- }
-}
-
-func init() {
- flag.Parse()
- for _, f := range flag.Args() {
- // Load the benchmark.
- b, err := ioutil.ReadFile(f)
- if err != nil {
- panic(err)
- }
-
- // Parse the benchmark.
- var dm benchmarkWrapper.BenchmarkDataset
- if err := proto.Unmarshal(b, &dm); err != nil {
- panic(err)
- }
-
- // Determine the concrete protobuf message type to use.
- var ds Dataset
- ds.newMessage = generateNewMessageFunction(dm)
-
- // Unmarshal each test message.
- for _, payload := range dm.Payload {
- ds.marshaled = append(ds.marshaled, payload)
- m := ds.newMessage()
- if err := proto.Unmarshal(payload, m); err != nil {
- panic(err)
- }
- ds.unmarshaled = append(ds.unmarshaled, m)
- }
- ds.name = f
-
- datasets = append(datasets, ds)
- }
-}
-
-func Benchmark(b *testing.B) {
- for _, ds := range datasets {
- b.Run(ds.name, func(b *testing.B) {
- b.Run("Unmarshal", func(b *testing.B) {
- for i := 0; i < b.N; i++ {
- for j, payload := range ds.marshaled {
- out := ds.newMessage()
- if err := proto.Unmarshal(payload, out); err != nil {
- b.Fatalf("can't unmarshal message %d %v", j, err)
- }
- }
- }
- })
- b.Run("Marshal", func(b *testing.B) {
- for i := 0; i < b.N; i++ {
- for j, m := range ds.unmarshaled {
- if _, err := proto.Marshal(m); err != nil {
- b.Fatalf("can't marshal message %d %+v: %v", j, m, err)
- }
- }
- }
- })
- b.Run("Size", func(b *testing.B) {
- for i := 0; i < b.N; i++ {
- for _, m := range ds.unmarshaled {
- proto.Size(m)
- }
- }
- })
- b.Run("Clone", func(b *testing.B) {
- for i := 0; i < b.N; i++ {
- for _, m := range ds.unmarshaled {
- proto.Clone(m)
- }
- }
- })
- b.Run("Merge", func(b *testing.B) {
- for i := 0; i < b.N; i++ {
- for _, m := range ds.unmarshaled {
- out := ds.newMessage()
- proto.Merge(out, m)
- }
- }
- })
- })
- }
-}
diff --git a/benchmarks/google_size.proto b/benchmarks/google_size.proto
deleted file mode 100644
index d2d319f..0000000
--- a/benchmarks/google_size.proto
+++ /dev/null
@@ -1,138 +0,0 @@
-syntax = "proto2";
-
-package benchmarks;
-
-option java_outer_classname = "GoogleSize";
-option optimize_for = CODE_SIZE;
-
-message SizeMessage1 {
- required string field1 = 1;
- optional string field9 = 9;
- optional string field18 = 18;
- optional bool field80 = 80 [default=false];
- optional bool field81 = 81 [default=true];
- required int32 field2 = 2;
- required int32 field3 = 3;
- optional int32 field280 = 280;
- optional int32 field6 = 6 [default=0];
- optional int64 field22 = 22;
- optional string field4 = 4;
- repeated fixed64 field5 = 5;
- optional bool field59 = 59 [default=false];
- optional string field7 = 7;
- optional int32 field16 = 16;
- optional int32 field130 = 130 [default=0];
- optional bool field12 = 12 [default=true];
- optional bool field17 = 17 [default=true];
- optional bool field13 = 13 [default=true];
- optional bool field14 = 14 [default=true];
- optional int32 field104 = 104 [default=0];
- optional int32 field100 = 100 [default=0];
- optional int32 field101 = 101 [default=0];
- optional string field102 = 102;
- optional string field103 = 103;
- optional int32 field29 = 29 [default=0];
- optional bool field30 = 30 [default=false];
- optional int32 field60 = 60 [default=-1];
- optional int32 field271 = 271 [default=-1];
- optional int32 field272 = 272 [default=-1];
- optional int32 field150 = 150;
- optional int32 field23 = 23 [default=0];
- optional bool field24 = 24 [default=false];
- optional int32 field25 = 25 [default=0];
- optional SizeMessage1SubMessage field15 = 15;
- optional bool field78 = 78;
- optional int32 field67 = 67 [default=0];
- optional int32 field68 = 68;
- optional int32 field128 = 128 [default=0];
- optional string field129 = 129 [default="xxxxxxxxxxxxxxxxxxxxx"];
- optional int32 field131 = 131 [default=0];
-}
-
-message SizeMessage1SubMessage {
- optional int32 field1 = 1 [default=0];
- optional int32 field2 = 2 [default=0];
- optional int32 field3 = 3 [default=0];
- optional string field15 = 15;
- optional bool field12 = 12 [default=true];
- optional int64 field13 = 13;
- optional int64 field14 = 14;
- optional int32 field16 = 16;
- optional int32 field19 = 19 [default=2];
- optional bool field20 = 20 [default=true];
- optional bool field28 = 28 [default=true];
- optional fixed64 field21 = 21;
- optional int32 field22 = 22;
- optional bool field23 = 23 [ default=false ];
- optional bool field206 = 206 [default=false];
- optional fixed32 field203 = 203;
- optional int32 field204 = 204;
- optional string field205 = 205;
- optional uint64 field207 = 207;
- optional uint64 field300 = 300;
-}
-
-message SizeMessage2 {
- optional string field1 = 1;
- optional int64 field3 = 3;
- optional int64 field4 = 4;
- optional int64 field30 = 30;
- optional bool field75 = 75 [default=false];
- optional string field6 = 6;
- optional bytes field2 = 2;
- optional int32 field21 = 21 [default=0];
- optional int32 field71 = 71;
- optional float field25 = 25;
- optional int32 field109 = 109 [default=0];
- optional int32 field210 = 210 [default=0];
- optional int32 field211 = 211 [default=0];
- optional int32 field212 = 212 [default=0];
- optional int32 field213 = 213 [default=0];
- optional int32 field216 = 216 [default=0];
- optional int32 field217 = 217 [default=0];
- optional int32 field218 = 218 [default=0];
- optional int32 field220 = 220 [default=0];
- optional int32 field221 = 221 [default=0];
- optional float field222 = 222 [default=0.0];
- optional int32 field63 = 63;
-
- repeated group Group1 = 10 {
- required float field11 = 11;
- optional float field26 = 26;
- optional string field12 = 12;
- optional string field13 = 13;
- repeated string field14 = 14;
- required uint64 field15 = 15;
- optional int32 field5 = 5;
- optional string field27 = 27;
- optional int32 field28 = 28;
- optional string field29 = 29;
- optional string field16 = 16;
- repeated string field22 = 22;
- repeated int32 field73 = 73;
- optional int32 field20 = 20 [default=0];
- optional string field24 = 24;
- optional SizeMessage2GroupedMessage field31 = 31;
- }
- repeated string field128 = 128;
- optional int64 field131 = 131;
- repeated string field127 = 127;
- optional int32 field129 = 129;
- repeated int64 field130 = 130;
- optional bool field205 = 205 [default=false];
- optional bool field206 = 206 [default=false];
-}
-
-message SizeMessage2GroupedMessage {
- optional float field1 = 1;
- optional float field2 = 2;
- optional float field3 = 3 [default=0.0];
- optional bool field4 = 4;
- optional bool field5 = 5;
- optional bool field6 = 6 [default=true];
- optional bool field7 = 7 [default=false];
- optional float field8 = 8;
- optional bool field9 = 9;
- optional float field10 = 10;
- optional int64 field11 = 11;
-}
diff --git a/benchmarks/java/pom.xml b/benchmarks/java/pom.xml
deleted file mode 100644
index c0dc940..0000000
--- a/benchmarks/java/pom.xml
+++ /dev/null
@@ -1,98 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
- <modelVersion>4.0.0</modelVersion>
- <artifactId>protobuf-java-benchmark</artifactId>
- <groupId>com.google.protobuf</groupId>
- <version>1.0.0</version>
- <name>Protocol Buffers [Benchmark]</name>
- <description>The benchmark tools for Protobuf Java.</description>
-
- <dependencies>
- <dependency>
- <groupId>com.google.protobuf</groupId>
- <artifactId>protobuf-java</artifactId>
- <version>${protobuf.version}</version>
- <type>jar</type>
- <scope>system</scope>
- <systemPath>${project.basedir}/lib/protobuf-java.jar</systemPath>
- </dependency>
- <dependency>
- <groupId>com.google.caliper</groupId>
- <artifactId>caliper</artifactId>
- <version>1.0-beta-3</version>
- </dependency>
- </dependencies>
-
- <build>
- <pluginManagement>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-assembly-plugin</artifactId>
- <version>2.4.1</version>
- <configuration>
- <!-- get all project dependencies -->
- <descriptorRefs>
- <descriptorRef>jar-with-dependencies</descriptorRef>
- </descriptorRefs>
- <!-- MainClass in mainfest make a executable jar -->
- <archive>
- <manifest>
- <mainClass>com.mkyong.core.utils.App</mainClass>
- </manifest>
- </archive>
- </configuration>
- <executions>
- <execution>
- <id>make-assembly</id>
- <!-- bind to the packaging phase -->
- <phase>package</phase>
- <goals>
- <goal>single</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <version>3.5.1</version>
- <configuration>
- <source>1.8</source>
- <target>1.8</target>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-jar-plugin</artifactId>
- <version>2.5</version>
- <configuration>
- <archive>
- <manifest>
- <addClasspath>true</addClasspath>
- <mainClass>com.google.protocolbuffers.ProtoBench</mainClass>
- </manifest>
- </archive>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-source-plugin</artifactId>
- <version>2.4</version>
- <executions>
- <execution>
- <id>attach-sources</id>
- <goals>
- <goal>jar-no-fork</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </pluginManagement>
- </build>
-</project>
-
diff --git a/benchmarks/java/src/main/java/com/google/protobuf/ProtoCaliperBenchmark.java b/benchmarks/java/src/main/java/com/google/protobuf/ProtoCaliperBenchmark.java
deleted file mode 100644
index ef30749..0000000
--- a/benchmarks/java/src/main/java/com/google/protobuf/ProtoCaliperBenchmark.java
+++ /dev/null
@@ -1,208 +0,0 @@
-package com.google.protobuf;
-
-import com.google.caliper.BeforeExperiment;
-import com.google.caliper.Benchmark;
-import com.google.caliper.Param;
-import com.google.protobuf.benchmarks.Benchmarks.BenchmarkDataset;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.RandomAccessFile;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Basic benchmarks for Java protobuf parsing.
- */
-public class ProtoCaliperBenchmark {
- public enum BenchmarkMessageType {
- GOOGLE_MESSAGE1_PROTO3 {
- @Override
- ExtensionRegistry getExtensionRegistry() {
- return ExtensionRegistry.newInstance();
- }
- @Override
- Message getDefaultInstance() {
- return com.google.protobuf.benchmarks.BenchmarkMessage1Proto3.GoogleMessage1
- .getDefaultInstance();
- }
- },
- GOOGLE_MESSAGE1_PROTO2 {
- @Override ExtensionRegistry getExtensionRegistry() {
- return ExtensionRegistry.newInstance();
- }
- @Override
- Message getDefaultInstance() {
- return com.google.protobuf.benchmarks.BenchmarkMessage1Proto2.GoogleMessage1
- .getDefaultInstance();
- }
- },
- GOOGLE_MESSAGE2 {
- @Override
- ExtensionRegistry getExtensionRegistry() {
- return ExtensionRegistry.newInstance();
- }
- @Override
- Message getDefaultInstance() {
- return com.google.protobuf.benchmarks.BenchmarkMessage2.GoogleMessage2.getDefaultInstance();
- }
- },
- GOOGLE_MESSAGE3 {
- @Override
- ExtensionRegistry getExtensionRegistry() {
- ExtensionRegistry extensions = ExtensionRegistry.newInstance();
- com.google.protobuf.benchmarks.BenchmarkMessage38.registerAllExtensions(extensions);
- com.google.protobuf.benchmarks.BenchmarkMessage37.registerAllExtensions(extensions);
- com.google.protobuf.benchmarks.BenchmarkMessage36.registerAllExtensions(extensions);
- com.google.protobuf.benchmarks.BenchmarkMessage35.registerAllExtensions(extensions);
- com.google.protobuf.benchmarks.BenchmarkMessage34.registerAllExtensions(extensions);
- com.google.protobuf.benchmarks.BenchmarkMessage33.registerAllExtensions(extensions);
- com.google.protobuf.benchmarks.BenchmarkMessage32.registerAllExtensions(extensions);
- com.google.protobuf.benchmarks.BenchmarkMessage31.registerAllExtensions(extensions);
- com.google.protobuf.benchmarks.BenchmarkMessage3.registerAllExtensions(extensions);
- return extensions;
- }
- @Override
- Message getDefaultInstance() {
- return com.google.protobuf.benchmarks.BenchmarkMessage3.GoogleMessage3.getDefaultInstance();
- }
- },
- GOOGLE_MESSAGE4 {
- @Override
- ExtensionRegistry getExtensionRegistry() {
- ExtensionRegistry extensions = ExtensionRegistry.newInstance();
- com.google.protobuf.benchmarks.BenchmarkMessage43.registerAllExtensions(extensions);
- com.google.protobuf.benchmarks.BenchmarkMessage42.registerAllExtensions(extensions);
- com.google.protobuf.benchmarks.BenchmarkMessage41.registerAllExtensions(extensions);
- com.google.protobuf.benchmarks.BenchmarkMessage4.registerAllExtensions(extensions);
- return extensions;
- }
- @Override
- Message getDefaultInstance() {
- return com.google.protobuf.benchmarks.BenchmarkMessage4.GoogleMessage4.getDefaultInstance();
- }
- };
-
- abstract ExtensionRegistry getExtensionRegistry();
- abstract Message getDefaultInstance();
- }
-
- private BenchmarkMessageType benchmarkMessageType;
- @Param("")
- private String dataFile;
-
- private byte[] inputData;
- private BenchmarkDataset benchmarkDataset;
- private Message defaultMessage;
- private ExtensionRegistry extensions;
- private List<byte[]> inputDataList;
- private List<ByteArrayInputStream> inputStreamList;
- private List<ByteString> inputStringList;
- private List<Message> sampleMessageList;
-
- private BenchmarkMessageType getMessageType() throws IOException {
- if (benchmarkDataset.getMessageName().equals("benchmarks.proto3.GoogleMessage1")) {
- return BenchmarkMessageType.GOOGLE_MESSAGE1_PROTO3;
- } else if (benchmarkDataset.getMessageName().equals("benchmarks.proto2.GoogleMessage1")) {
- return BenchmarkMessageType.GOOGLE_MESSAGE1_PROTO2;
- } else if (benchmarkDataset.getMessageName().equals("benchmarks.proto2.GoogleMessage2")) {
- return BenchmarkMessageType.GOOGLE_MESSAGE2;
- } else if (benchmarkDataset.getMessageName().
- equals("benchmarks.google_message3.GoogleMessage3")) {
- return BenchmarkMessageType.GOOGLE_MESSAGE3;
- } else if (benchmarkDataset.getMessageName().
- equals("benchmarks.google_message4.GoogleMessage4")) {
- return BenchmarkMessageType.GOOGLE_MESSAGE4;
- } else {
- throw new IllegalStateException("Invalid DataFile! There's no testing message named "
- + benchmarkDataset.getMessageName());
- }
- }
-
- @BeforeExperiment
- void setUp() throws IOException {
- if (!dataFile.equals("")) {
- RandomAccessFile file = new RandomAccessFile(new File(dataFile), "r");
- inputData = new byte[(int) file.length()];
- file.readFully(inputData);
- benchmarkDataset = BenchmarkDataset.parseFrom(inputData);
- benchmarkMessageType = getMessageType();
- } else {
- inputData = new byte[0];
- benchmarkDataset = BenchmarkDataset.parseFrom(inputData);
- benchmarkMessageType = BenchmarkMessageType.GOOGLE_MESSAGE2;
- }
- defaultMessage = benchmarkMessageType.getDefaultInstance();
- extensions = benchmarkMessageType.getExtensionRegistry();
- inputDataList = new ArrayList<byte[]>();
- inputStreamList = new ArrayList<ByteArrayInputStream>();
- inputStringList = new ArrayList<ByteString>();
- sampleMessageList = new ArrayList<Message>();
-
- for (int i = 0; i < benchmarkDataset.getPayloadCount(); i++) {
- byte[] singleInputData = benchmarkDataset.getPayload(i).toByteArray();
- inputDataList.add(benchmarkDataset.getPayload(i).toByteArray());
- inputStreamList.add(new ByteArrayInputStream(
- benchmarkDataset.getPayload(i).toByteArray()));
- inputStringList.add(benchmarkDataset.getPayload(i));
- sampleMessageList.add(
- defaultMessage.newBuilderForType().mergeFrom(singleInputData, extensions).build());
- }
- }
-
- @SuppressWarnings("IgnoredPureGetter")
- @Benchmark
- void serializeToByteArray(int reps) throws IOException {
- if (sampleMessageList.size() == 0) {
- return;
- }
- for (int i = 0; i < reps; i++) {
- for (int j = 0; j < sampleMessageList.size(); j++) {
- sampleMessageList.get(j).toByteArray();
- }
- }
- }
-
- @Benchmark
- void serializeToMemoryStream(int reps) throws IOException {
- if (sampleMessageList.size() == 0) {
- return;
- }
- for (int i = 0; i < reps; i++) {
- for (int j = 0; j < sampleMessageList.size(); j++) {
- ByteArrayOutputStream output = new ByteArrayOutputStream();
- sampleMessageList.get(j).writeTo(output);
- }
- }
- }
-
- @Benchmark
- void deserializeFromByteArray(int reps) throws IOException {
- if (inputDataList.size() == 0) {
- return;
- }
- for (int i = 0; i < reps; i++) {
- for (int j = 0; j < inputDataList.size(); j++) {
- benchmarkMessageType.getDefaultInstance().getParserForType().parseFrom(
- inputDataList.get(j), extensions);
- }
- }
- }
-
- @Benchmark
- void deserializeFromMemoryStream(int reps) throws IOException {
- if (inputStreamList.size() == 0) {
- return;
- }
- for (int i = 0; i < reps; i++) {
- for (int j = 0; j < inputStreamList.size(); j++) {
- benchmarkMessageType.getDefaultInstance().getParserForType().parseFrom(
- inputStreamList.get(j), extensions);
- inputStreamList.get(j).reset();
- }
- }
- }
-}
-
-
diff --git a/benchmarks/js/benchmark_suite.js b/benchmarks/js/benchmark_suite.js
deleted file mode 100644
index c5c3e51..0000000
--- a/benchmarks/js/benchmark_suite.js
+++ /dev/null
@@ -1,33 +0,0 @@
-var benchmark = require("benchmark");
-
-function newBenchmark(messageName, filename, language) {
- var benches = [];
- return {
- suite: new benchmark.Suite(messageName + filename + language )
- .on("add", function(event) {
- benches.push(event.target);
- })
- .on("start", function() {
- process.stdout.write(
- "benchmarking message " + messageName
- + " of dataset file " + filename
- + "'s performance ..." + "\n\n");
- })
- .on("cycle", function(event) {
- process.stdout.write(String(event.target) + "\n");
- })
- .on("complete", function() {
- var getHz = function(bench) {
- return 1 / (bench.stats.mean + bench.stats.moe);
- }
- benches.forEach(function(val, index) {
- benches[index] = getHz(val);
- });
- }),
- benches: benches
- }
-}
-
-module.exports = {
- newBenchmark: newBenchmark
-}
diff --git a/benchmarks/js/js_benchmark.js b/benchmarks/js/js_benchmark.js
deleted file mode 100644
index 9ba4828..0000000
--- a/benchmarks/js/js_benchmark.js
+++ /dev/null
@@ -1,82 +0,0 @@
-require('./datasets/google_message1/proto2/benchmark_message1_proto2_pb.js');
-require('./datasets/google_message1/proto3/benchmark_message1_proto3_pb.js');
-require('./datasets/google_message2/benchmark_message2_pb.js');
-require('./datasets/google_message3/benchmark_message3_pb.js');
-require('./datasets/google_message4/benchmark_message4_pb.js');
-require('./benchmarks_pb.js');
-
-var fs = require('fs');
-var benchmarkSuite = require("./benchmark_suite.js");
-
-
-function getNewPrototype(name) {
- var message = eval("proto." + name);
- if (typeof(message) == "undefined") {
- throw "type " + name + " is undefined";
- }
- return message;
-}
-
-var results = [];
-var json_file = "";
-
-console.log("#####################################################");
-console.log("Js Benchmark: ");
-process.argv.forEach(function(filename, index) {
- if (index < 2) {
- return;
- }
- if (filename.indexOf("--json_output") != -1) {
- json_file = filename.replace(/^--json_output=/, '');
- return;
- }
-
- var benchmarkDataset =
- proto.benchmarks.BenchmarkDataset.deserializeBinary(fs.readFileSync(filename));
- var messageList = [];
- var totalBytes = 0;
- benchmarkDataset.getPayloadList().forEach(function(onePayload) {
- var message = getNewPrototype(benchmarkDataset.getMessageName());
- messageList.push(message.deserializeBinary(onePayload));
- totalBytes += onePayload.length;
- });
-
- var scenarios = benchmarkSuite.newBenchmark(
- benchmarkDataset.getMessageName(), filename, "js");
- scenarios.suite
- .add("js deserialize", function() {
- benchmarkDataset.getPayloadList().forEach(function(onePayload) {
- var protoType = getNewPrototype(benchmarkDataset.getMessageName());
- protoType.deserializeBinary(onePayload);
- });
- })
- .add("js serialize", function() {
- var protoType = getNewPrototype(benchmarkDataset.getMessageName());
- messageList.forEach(function(message) {
- message.serializeBinary();
- });
- })
- .run({"Async": false});
-
- results.push({
- filename: filename,
- benchmarks: {
- protobufjs_decoding: scenarios.benches[0] * totalBytes / 1024 / 1024,
- protobufjs_encoding: scenarios.benches[1] * totalBytes / 1024 / 1024
- }
- })
-
- console.log("Throughput for deserialize: "
- + scenarios.benches[0] * totalBytes / 1024 / 1024 + "MB/s" );
- console.log("Throughput for serialize: "
- + scenarios.benches[1] * totalBytes / 1024 / 1024 + "MB/s" );
- console.log("");
-});
-console.log("#####################################################");
-
-if (json_file != "") {
- fs.writeFile(json_file, JSON.stringify(results), (err) => {
- if (err) throw err;
- });
-}
-
diff --git a/benchmarks/php/PhpBenchmark.php b/benchmarks/php/PhpBenchmark.php
deleted file mode 100644
index d3db61d..0000000
--- a/benchmarks/php/PhpBenchmark.php
+++ /dev/null
@@ -1,170 +0,0 @@
-<?php
-
-namespace Google\Protobuf\Benchmark;
-ini_set('memory_limit', '4096M');
-
-const NAME = "PhpBenchmark.php";
-
-function _require_all($dir, &$prefix) {
- // require all php files
- foreach (glob("$dir/*") as $path) {
- if (preg_match('/\.php$/', $path) &&
- substr($path, -strlen(NAME)) != NAME) {
- require_once(substr($path, strlen($prefix) + 1));
- } elseif (is_dir($path)) {
- _require_all($path, $prefix);
- }
- }
-}
-// include all file
-foreach (explode(PATH_SEPARATOR, get_include_path()) as $one_include_path) {
- _require_all($one_include_path, $one_include_path);
-}
-
-use Benchmarks\BenchmarkDataset;
-
-class BenchmarkMethod
-{
- // $args[0]: dataset
- // $args[1]: message class
- static function parse(&$args) {
- $payloads = $args[0]->getPayload();
- for ($i = $payloads->count() - 1; $i >= 0; $i--) {
- (new $args[1]())->mergeFromString($payloads->offsetGet($i));
- }
- }
-
- // $args: array of message
- static function serialize(&$args) {
- foreach ($args as &$temp_message) {
- $temp_message->serializeToString();
- }
- }
-}
-
-class Benchmark
-{
- private $benchmark_name;
- private $args;
- private $benchmark_time;
- private $total_bytes;
- private $coefficient;
-
- public function __construct($benchmark_name, $args, $total_bytes,
- $benchmark_time = 5.0) {
- $this->args = $args;
- $this->benchmark_name = $benchmark_name;
- $this->benchmark_time = $benchmark_time;
- $this->total_bytes = $total_bytes;
- $this->coefficient = pow (10, 0) / pow(2, 20);
- }
-
- public function runBenchmark() {
- $t = $this->runBenchmarkWithTimes(1);
- $times = ceil($this->benchmark_time / $t);
- return $this->total_bytes * $times /
- ($times == 1 ? $t : $this->runBenchmarkWithTimes($times)) *
- $this->coefficient;
- }
-
- private function runBenchmarkWithTimes($times) {
- $st = microtime(true);
- for ($i = 0; $i < $times; $i++) {
- call_user_func_array($this->benchmark_name, array(&$this->args));
- }
- $en = microtime(true);
- return $en - $st;
- }
-}
-
-function getMessageName(&$dataset) {
- switch ($dataset->getMessageName()) {
- case "benchmarks.proto3.GoogleMessage1":
- return "\Benchmarks\Proto3\GoogleMessage1";
- case "benchmarks.proto2.GoogleMessage1":
- return "\Benchmarks\Proto2\GoogleMessage1";
- case "benchmarks.proto2.GoogleMessage2":
- return "\Benchmarks\Proto2\GoogleMessage2";
- case "benchmarks.google_message3.GoogleMessage3":
- return "\Benchmarks\Google_message3\GoogleMessage3";
- case "benchmarks.google_message4.GoogleMessage4":
- return "\Benchmarks\Google_message4\GoogleMessage4";
- default:
- exit("Message " . $dataset->getMessageName() . " not found !");
- }
-}
-
-function runBenchmark($file, $behavior_prefix) {
- $datafile = fopen($file, "r") or die("Unable to open file " . $file);
- $bytes = fread($datafile, filesize($file));
- $dataset = new BenchmarkDataset(NULL);
- $dataset->mergeFromString($bytes);
- $message_name = getMessageName($dataset);
- $message_list = array();
- $total_bytes = 0;
- $payloads = $dataset->getPayload();
- for ($i = $payloads->count() - 1; $i >= 0; $i--) {
- $new_message = new $message_name();
- $new_message->mergeFromString($payloads->offsetGet($i));
- array_push($message_list, $new_message);
- $total_bytes += strlen($payloads->offsetGet($i));
- }
-
- $parse_benchmark = new Benchmark(
- "\Google\Protobuf\Benchmark\BenchmarkMethod::parse",
- array($dataset, $message_name), $total_bytes);
- $serialize_benchmark = new Benchmark(
- "\Google\Protobuf\Benchmark\BenchmarkMethod::serialize",
- $message_list, $total_bytes);
-
- return array(
- "filename" => $file,
- "benchmarks" => array(
- $behavior_prefix . "_parse" => $parse_benchmark->runBenchmark(),
- $behavior_prefix . "_serailize" => $serialize_benchmark->runBenchmark()
- ),
- "message_name" => $dataset->getMessageName()
- );
-}
-
-// main
-$json_output = false;
-$results = array();
-$behavior_prefix = "";
-
-foreach ($argv as $index => $arg) {
- if ($index == 0) {
- continue;
- }
- if ($arg == "--json") {
- $json_output = true;
- } else if (strpos($arg, "--behavior_prefix") == 0) {
- $behavior_prefix = str_replace("--behavior_prefix=", "", $arg);
- }
-}
-
-foreach ($argv as $index => $arg) {
- if ($index == 0) {
- continue;
- }
- if (substr($arg, 0, 2) == "--") {
- continue;
- } else {
- array_push($results, runBenchmark($arg, $behavior_prefix));
- }
-}
-
-if ($json_output) {
- print json_encode($results);
-} else {
- print "PHP protobuf benchmark result:\n\n";
- foreach ($results as $result) {
- printf("result for test data file: %s\n", $result["filename"]);
- foreach ($result["benchmarks"] as $benchmark => $throughput) {
- printf(" Throughput for benchmark %s: %.2f MB/s\n",
- $benchmark, $throughput);
- }
- }
-}
-
-?>
diff --git a/benchmarks/php/autoload.php b/benchmarks/php/autoload.php
deleted file mode 100644
index 52a8741..0000000
--- a/benchmarks/php/autoload.php
+++ /dev/null
@@ -1,25 +0,0 @@
-<?php
-
-define("GOOGLE_INTERNAL_NAMESPACE", "Google\\Protobuf\\Internal\\");
-define("GOOGLE_NAMESPACE", "Google\\Protobuf\\");
-define("GOOGLE_GPBMETADATA_NAMESPACE", "GPBMetadata\\Google\\Protobuf\\");
-define("BENCHMARK_NAMESPACE", "Benchmarks");
-define("BENCHMARK_GPBMETADATA_NAMESPACE", "GPBMetadata\\Benchmarks");
-
-function protobuf_autoloader_impl($class, $prefix, $include_path) {
- $length = strlen($prefix);
- if ((substr($class, 0, $length) === $prefix)) {
- $path = $include_path . '/' . implode('/', array_map('ucwords', explode('\\', $class))) . '.php';
- include_once $path;
- }
-}
-
-function protobuf_autoloader($class) {
- protobuf_autoloader_impl($class, GOOGLE_INTERNAL_NAMESPACE, getenv('PROTOBUF_PHP_SRCDIR'));
- protobuf_autoloader_impl($class, GOOGLE_NAMESPACE, getenv('PROTOBUF_PHP_SRCDIR'));
- protobuf_autoloader_impl($class, GOOGLE_GPBMETADATA_NAMESPACE, getenv('PROTOBUF_PHP_SRCDIR'));
- protobuf_autoloader_impl($class, BENCHMARK_NAMESPACE, getenv('CURRENT_DIR'));
- protobuf_autoloader_impl($class, BENCHMARK_GPBMETADATA_NAMESPACE, getenv('CURRENT_DIR'));
-}
-
-spl_autoload_register('protobuf_autoloader');
diff --git a/benchmarks/protobuf.js/generate_pbjs_files.js b/benchmarks/protobuf.js/generate_pbjs_files.js
deleted file mode 100644
index 11945bf..0000000
--- a/benchmarks/protobuf.js/generate_pbjs_files.js
+++ /dev/null
@@ -1,25 +0,0 @@
-var pbjs = require("./protobuf.js/cli").pbjs
-
-var argv = [];
-var protoFiles = [];
-var prefix = "";
-process.argv.forEach(function(val, index) {
- var arg = val;
- if (arg.length > 6 && arg.substring(arg.length - 6) == ".proto") {
- protoFiles.push(arg);
- } else if (arg.length > 15 && arg.substring(0, 15) == "--include_path=") {
- prefix = arg.substring(15);
- } else if (index >= 2) {
- argv.push(arg);
- }
-});
-protoFiles.forEach(function(val) {
- argv.push(prefix + "/" + val);
-});
-
-pbjs.main(argv, function(err, output){
- if (err) {
- console.log(err);
- }
-});
-
diff --git a/benchmarks/protobuf.js/protobufjs_benchmark.js b/benchmarks/protobuf.js/protobufjs_benchmark.js
deleted file mode 100644
index e062d1c..0000000
--- a/benchmarks/protobuf.js/protobufjs_benchmark.js
+++ /dev/null
@@ -1,66 +0,0 @@
-var root = require("./generated_bundle_code.js");
-var fs = require('fs');
-var benchmark = require("./node_modules/benchmark");
-var benchmarkSuite = require("./benchmark_suite.js");
-
-
-function getNewPrototype(name) {
- var message = eval("root." + name);
- if (typeof(message) == "undefined") {
- throw "type " + name + " is undefined";
- }
- return message;
-}
-
-
-var results = [];
-
-console.log("#####################################################");
-console.log("ProtobufJs Benchmark: ");
-process.argv.forEach(function(filename, index) {
- if (index < 2) {
- return;
- }
- var benchmarkDataset =
- root.benchmarks.BenchmarkDataset.decode(fs.readFileSync(filename));
- var messageList = [];
- var totalBytes = 0;
- benchmarkDataset.payload.forEach(function(onePayload) {
- var message = getNewPrototype(benchmarkDataset.messageName);
- messageList.push(message.decode(onePayload));
- totalBytes += onePayload.length;
- });
-
- var scenarios = benchmarkSuite.newBenchmark(
- benchmarkDataset.messageName, filename, "protobufjs");
- scenarios.suite
- .add("protobuf.js static decoding", function() {
- benchmarkDataset.payload.forEach(function(onePayload) {
- var protoType = getNewPrototype(benchmarkDataset.messageName);
- protoType.decode(onePayload);
- });
- })
- .add("protobuf.js static encoding", function() {
- var protoType = getNewPrototype(benchmarkDataset.messageName);
- messageList.forEach(function(message) {
- protoType.encode(message).finish();
- });
- })
- .run({"Async": false});
-
- results.push({
- filename: filename,
- benchmarks: {
- protobufjs_decoding: scenarios.benches[0] * totalBytes,
- protobufjs_encoding: scenarios.benches[1] * totalBytes
- }
- })
-
- console.log("Throughput for decoding: "
- + scenarios.benches[0] * totalBytes / 1024 / 1024 + "MB/s" );
- console.log("Throughput for encoding: "
- + scenarios.benches[1] * totalBytes / 1024 / 1024 + "MB/s" );
- console.log("");
-});
-console.log("#####################################################");
-
diff --git a/benchmarks/python/__init__.py b/benchmarks/python/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/benchmarks/python/__init__.py
+++ /dev/null
diff --git a/benchmarks/python/py_benchmark.py b/benchmarks/python/py_benchmark.py
deleted file mode 100644
index 60e377e..0000000
--- a/benchmarks/python/py_benchmark.py
+++ /dev/null
@@ -1,161 +0,0 @@
-from __future__ import print_function
-import sys
-import os
-import timeit
-import math
-import argparse
-import fnmatch
-import json
-
-parser = argparse.ArgumentParser(description="Python protobuf benchmark")
-parser.add_argument("data_files", metavar="dataFile", nargs="+",
- help="testing data files.")
-parser.add_argument("--json", action="store_const", dest="json",
- const="yes", default="no",
- help="Whether to output json results")
-parser.add_argument("--behavior_prefix", dest="behavior_prefix",
- help="The output json format's behavior's name's prefix",
- default="")
-# BEGIN CPP GENERATED MESSAGE
-parser.add_argument("--cpp_generated", action="store_const",
- dest="cpp_generated", const="yes", default="no",
- help="Whether to link generated code library")
-# END CPP GENERATED MESSAGE
-args = parser.parse_args()
-# BEGIN CPP GENERATED MESSAGE
-# CPP generated code must be linked before importing the generated Python code
-# for the descriptor can be found in the pool
-if args.cpp_generated != "no":
- sys.path.append( os.path.dirname( os.path.dirname( os.path.abspath(__file__) ) ) + "/.libs" )
- import libbenchmark_messages
- sys.path.append( os.path.dirname( os.path.dirname( os.path.abspath(__file__) ) ) + "/tmp" )
-# END CPP GENERATED MESSAGE
-
-
-import datasets.google_message1.proto2.benchmark_message1_proto2_pb2 as benchmark_message1_proto2_pb2
-import datasets.google_message1.proto3.benchmark_message1_proto3_pb2 as benchmark_message1_proto3_pb2
-import datasets.google_message2.benchmark_message2_pb2 as benchmark_message2_pb2
-import datasets.google_message3.benchmark_message3_pb2 as benchmark_message3_pb2
-import datasets.google_message4.benchmark_message4_pb2 as benchmark_message4_pb2
-import benchmarks_pb2 as benchmarks_pb2
-
-
-def run_one_test(filename):
- data = open(filename, "rb").read()
- benchmark_dataset = benchmarks_pb2.BenchmarkDataset()
- benchmark_dataset.ParseFromString(data)
- total_bytes = 0
- for payload in benchmark_dataset.payload:
- total_bytes += len(payload)
- benchmark_util = Benchmark(full_iteration=len(benchmark_dataset.payload),
- module="py_benchmark",
- setup_method="init",
- total_bytes=total_bytes)
- result={}
- result["filename"] = filename
- result["message_name"] = benchmark_dataset.message_name
- result["benchmarks"] = {}
- benchmark_util.set_test_method("parse_from_benchmark")
- result["benchmarks"][args.behavior_prefix + "_parse_from_benchmark"] = \
- benchmark_util.run_benchmark(setup_method_args='"%s"' % (filename))
- benchmark_util.set_test_method("serialize_to_benchmark")
- result["benchmarks"][args.behavior_prefix + "_serialize_to_benchmark"] = \
- benchmark_util.run_benchmark(setup_method_args='"%s"' % (filename))
- return result
-
-
-def init(filename):
- global benchmark_dataset, message_class, message_list, counter, total_bytes
- message_list=[]
- counter = 0
- total_bytes = 0
- data = open(filename, "rb").read()
- benchmark_dataset = benchmarks_pb2.BenchmarkDataset()
- benchmark_dataset.ParseFromString(data)
-
- if benchmark_dataset.message_name == "benchmarks.proto3.GoogleMessage1":
- message_class = benchmark_message1_proto3_pb2.GoogleMessage1
- elif benchmark_dataset.message_name == "benchmarks.proto2.GoogleMessage1":
- message_class = benchmark_message1_proto2_pb2.GoogleMessage1
- elif benchmark_dataset.message_name == "benchmarks.proto2.GoogleMessage2":
- message_class = benchmark_message2_pb2.GoogleMessage2
- elif benchmark_dataset.message_name == "benchmarks.google_message3.GoogleMessage3":
- message_class = benchmark_message3_pb2.GoogleMessage3
- elif benchmark_dataset.message_name == "benchmarks.google_message4.GoogleMessage4":
- message_class = benchmark_message4_pb2.GoogleMessage4
- else:
- raise IOError("Message %s not found!" % (benchmark_dataset.message_name))
-
- for one_payload in benchmark_dataset.payload:
- temp = message_class()
- temp.ParseFromString(one_payload)
- message_list.append(temp)
- total_bytes += len(one_payload)
-
-
-def parse_from_benchmark():
- global counter, message_class, benchmark_dataset
- m = message_class().ParseFromString(benchmark_dataset.payload[counter % len(benchmark_dataset.payload)])
- counter = counter + 1
-
-
-def serialize_to_benchmark():
- global counter, message_list, message_class
- s = message_list[counter % len(benchmark_dataset.payload)].SerializeToString()
- counter = counter + 1
-
-
-class Benchmark:
- def __init__(self, module=None, test_method=None,
- setup_method=None, total_bytes=None, full_iteration = 1):
- self.full_iteration = full_iteration
- self.module = module
- self.test_method = test_method
- self.setup_method = setup_method
- self.total_bytes = total_bytes
-
- def set_test_method(self, test_method):
- self.test_method = test_method
-
- def full_setup_code(self, setup_method_args=''):
- setup_code = ""
- setup_code += "from %s import %s\n" % (self.module, self.test_method)
- setup_code += "from %s import %s\n" % (self.module, self.setup_method)
- setup_code += "%s(%s)\n" % (self.setup_method, setup_method_args)
- return setup_code
-
- def dry_run(self, test_method_args='', setup_method_args=''):
- return timeit.timeit(stmt="%s(%s)" % (self.test_method, test_method_args),
- setup=self.full_setup_code(setup_method_args),
- number=self.full_iteration);
-
- def run_benchmark(self, test_method_args='', setup_method_args=''):
- reps = self.full_iteration;
- t = self.dry_run(test_method_args, setup_method_args);
- if t < 3 :
- reps = int(math.ceil(3 / t)) * self.full_iteration
- if reps != self.full_iteration:
- t = timeit.timeit(stmt="%s(%s)" % (self.test_method, test_method_args),
- setup=self.full_setup_code(setup_method_args),
- number=reps);
- return self.total_bytes * 1.0 / 2 ** 20 / (1.0 * t / reps * self.full_iteration)
-
-
-if __name__ == "__main__":
- results = []
- for file in args.data_files:
- results.append(run_one_test(file))
-
- if args.json != "no":
- print(json.dumps(results))
- else:
- for result in results:
- print("Message %s of dataset file %s" % \
- (result["message_name"], result["filename"]))
- print("Average throughput for parse_from_benchmark: %.2f MB/s" % \
- (result["benchmarks"][ \
- args.behavior_prefix + "_parse_from_benchmark"]))
- print("Average throughput for serialize_to_benchmark: %.2f MB/s" % \
- (result["benchmarks"][ \
- args.behavior_prefix + "_serialize_to_benchmark"]))
- print("")
diff --git a/benchmarks/python/python_benchmark_messages.cc b/benchmarks/python/python_benchmark_messages.cc
deleted file mode 100644
index f6ddcf3..0000000
--- a/benchmarks/python/python_benchmark_messages.cc
+++ /dev/null
@@ -1,31 +0,0 @@
-#include <Python.h>
-
-#include "benchmarks.pb.h"
-#include "datasets/google_message1/proto2/benchmark_message1_proto2.pb.h"
-#include "datasets/google_message1/proto3/benchmark_message1_proto3.pb.h"
-#include "datasets/google_message2/benchmark_message2.pb.h"
-#include "datasets/google_message3/benchmark_message3.pb.h"
-#include "datasets/google_message4/benchmark_message4.pb.h"
-
-static struct PyModuleDef _module = {PyModuleDef_HEAD_INIT,
- "libbenchmark_messages",
- "Benchmark messages Python module",
- -1,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL};
-
-extern "C" {
-PyMODINIT_FUNC PyInit_libbenchmark_messages() {
- benchmarks::BenchmarkDataset().descriptor();
- benchmarks::proto3::GoogleMessage1().descriptor();
- benchmarks::proto2::GoogleMessage1().descriptor();
- benchmarks::proto2::GoogleMessage2().descriptor();
- benchmarks::google_message3::GoogleMessage3().descriptor();
- benchmarks::google_message4::GoogleMessage4().descriptor();
-
- return PyModule_Create(&_module);
-}
-}
diff --git a/benchmarks/util/__init__.py b/benchmarks/util/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/benchmarks/util/__init__.py
+++ /dev/null
diff --git a/benchmarks/util/big_query_utils.py b/benchmarks/util/big_query_utils.py
deleted file mode 100755
index aea55bb..0000000
--- a/benchmarks/util/big_query_utils.py
+++ /dev/null
@@ -1,189 +0,0 @@
-#!/usr/bin/env python2.7
-
-from __future__ import print_function
-import argparse
-import json
-import uuid
-import httplib2
-
-from apiclient import discovery
-from apiclient.errors import HttpError
-from oauth2client.client import GoogleCredentials
-
-# 30 days in milliseconds
-_EXPIRATION_MS = 30 * 24 * 60 * 60 * 1000
-NUM_RETRIES = 3
-
-
-def create_big_query():
- """Authenticates with cloud platform and gets a BiqQuery service object
- """
- creds = GoogleCredentials.get_application_default()
- return discovery.build(
- 'bigquery', 'v2', credentials=creds, cache_discovery=False)
-
-
-def create_dataset(biq_query, project_id, dataset_id):
- is_success = True
- body = {
- 'datasetReference': {
- 'projectId': project_id,
- 'datasetId': dataset_id
- }
- }
-
- try:
- dataset_req = biq_query.datasets().insert(
- projectId=project_id, body=body)
- dataset_req.execute(num_retries=NUM_RETRIES)
- except HttpError as http_error:
- if http_error.resp.status == 409:
- print('Warning: The dataset %s already exists' % dataset_id)
- else:
- # Note: For more debugging info, print "http_error.content"
- print('Error in creating dataset: %s. Err: %s' % (dataset_id,
- http_error))
- is_success = False
- return is_success
-
-
-def create_table(big_query, project_id, dataset_id, table_id, table_schema,
- description):
- fields = [{
- 'name': field_name,
- 'type': field_type,
- 'description': field_description
- } for (field_name, field_type, field_description) in table_schema]
- return create_table2(big_query, project_id, dataset_id, table_id, fields,
- description)
-
-
-def create_partitioned_table(big_query,
- project_id,
- dataset_id,
- table_id,
- table_schema,
- description,
- partition_type='DAY',
- expiration_ms=_EXPIRATION_MS):
- """Creates a partitioned table. By default, a date-paritioned table is created with
- each partition lasting 30 days after it was last modified.
- """
- fields = [{
- 'name': field_name,
- 'type': field_type,
- 'description': field_description
- } for (field_name, field_type, field_description) in table_schema]
- return create_table2(big_query, project_id, dataset_id, table_id, fields,
- description, partition_type, expiration_ms)
-
-
-def create_table2(big_query,
- project_id,
- dataset_id,
- table_id,
- fields_schema,
- description,
- partition_type=None,
- expiration_ms=None):
- is_success = True
-
- body = {
- 'description': description,
- 'schema': {
- 'fields': fields_schema
- },
- 'tableReference': {
- 'datasetId': dataset_id,
- 'projectId': project_id,
- 'tableId': table_id
- }
- }
-
- if partition_type and expiration_ms:
- body["timePartitioning"] = {
- "type": partition_type,
- "expirationMs": expiration_ms
- }
-
- try:
- table_req = big_query.tables().insert(
- projectId=project_id, datasetId=dataset_id, body=body)
- res = table_req.execute(num_retries=NUM_RETRIES)
- print('Successfully created %s "%s"' % (res['kind'], res['id']))
- except HttpError as http_error:
- if http_error.resp.status == 409:
- print('Warning: Table %s already exists' % table_id)
- else:
- print('Error in creating table: %s. Err: %s' % (table_id,
- http_error))
- is_success = False
- return is_success
-
-
-def patch_table(big_query, project_id, dataset_id, table_id, fields_schema):
- is_success = True
-
- body = {
- 'schema': {
- 'fields': fields_schema
- },
- 'tableReference': {
- 'datasetId': dataset_id,
- 'projectId': project_id,
- 'tableId': table_id
- }
- }
-
- try:
- table_req = big_query.tables().patch(
- projectId=project_id,
- datasetId=dataset_id,
- tableId=table_id,
- body=body)
- res = table_req.execute(num_retries=NUM_RETRIES)
- print('Successfully patched %s "%s"' % (res['kind'], res['id']))
- except HttpError as http_error:
- print('Error in creating table: %s. Err: %s' % (table_id, http_error))
- is_success = False
- return is_success
-
-
-def insert_rows(big_query, project_id, dataset_id, table_id, rows_list):
- is_success = True
- body = {'rows': rows_list}
- try:
- insert_req = big_query.tabledata().insertAll(
- projectId=project_id,
- datasetId=dataset_id,
- tableId=table_id,
- body=body)
- res = insert_req.execute(num_retries=NUM_RETRIES)
- if res.get('insertErrors', None):
- print('Error inserting rows! Response: %s' % res)
- is_success = False
- except HttpError as http_error:
- print('Error inserting rows to the table %s' % table_id)
- is_success = False
-
- return is_success
-
-
-def sync_query_job(big_query, project_id, query, timeout=5000):
- query_data = {'query': query, 'timeoutMs': timeout}
- query_job = None
- try:
- query_job = big_query.jobs().query(
- projectId=project_id,
- body=query_data).execute(num_retries=NUM_RETRIES)
- except HttpError as http_error:
- print('Query execute job failed with error: %s' % http_error)
- print(http_error.content)
- return query_job
-
-
- # List of (column name, column type, description) tuples
-def make_row(unique_row_id, row_values_dict):
- """row_values_dict is a dictionary of column name and column value.
- """
- return {'insertId': unique_row_id, 'json': row_values_dict}
diff --git a/benchmarks/util/data_proto2_to_proto3_util.h b/benchmarks/util/data_proto2_to_proto3_util.h
deleted file mode 100644
index 5eea850..0000000
--- a/benchmarks/util/data_proto2_to_proto3_util.h
+++ /dev/null
@@ -1,64 +0,0 @@
-#ifndef PROTOBUF_BENCHMARKS_UTIL_DATA_PROTO2_TO_PROTO3_UTIL_H_
-#define PROTOBUF_BENCHMARKS_UTIL_DATA_PROTO2_TO_PROTO3_UTIL_H_
-
-#include "google/protobuf/message.h"
-#include "google/protobuf/descriptor.h"
-
-using google::protobuf::FieldDescriptor;
-using google::protobuf::Message;
-using google::protobuf::Reflection;
-
-namespace google {
-namespace protobuf {
-namespace util {
-
-class DataStripper {
- public:
- void StripMessage(Message *message) {
- std::vector<const FieldDescriptor*> set_fields;
- const Reflection* reflection = message->GetReflection();
- reflection->ListFields(*message, &set_fields);
-
- for (size_t i = 0; i < set_fields.size(); i++) {
- const FieldDescriptor* field = set_fields[i];
- if (ShouldBeClear(field)) {
- reflection->ClearField(message, field);
- continue;
- }
- if (field->type() == FieldDescriptor::TYPE_MESSAGE) {
- if (field->is_repeated()) {
- for (int j = 0; j < reflection->FieldSize(*message, field); j++) {
- StripMessage(reflection->MutableRepeatedMessage(message, field, j));
- }
- } else {
- StripMessage(reflection->MutableMessage(message, field));
- }
- }
- }
-
- reflection->MutableUnknownFields(message)->Clear();
- }
- private:
- virtual bool ShouldBeClear(const FieldDescriptor *field) = 0;
-};
-
-class GogoDataStripper : public DataStripper {
- private:
- virtual bool ShouldBeClear(const FieldDescriptor *field) {
- return field->type() == FieldDescriptor::TYPE_GROUP;
- }
-};
-
-class Proto3DataStripper : public DataStripper {
- private:
- virtual bool ShouldBeClear(const FieldDescriptor *field) {
- return field->type() == FieldDescriptor::TYPE_GROUP ||
- field->is_extension();
- }
-};
-
-} // namespace util
-} // namespace protobuf
-} // namespace google
-
-#endif // PROTOBUF_BENCHMARKS_UTIL_DATA_PROTO2_TO_PROTO3_UTIL_H_
diff --git a/benchmarks/util/gogo_data_scrubber.cc b/benchmarks/util/gogo_data_scrubber.cc
deleted file mode 100644
index 9ef57b0..0000000
--- a/benchmarks/util/gogo_data_scrubber.cc
+++ /dev/null
@@ -1,74 +0,0 @@
-#include "benchmarks.pb.h"
-#include "datasets/google_message1/proto2/benchmark_message1_proto2.pb.h"
-#include "datasets/google_message1/proto3/benchmark_message1_proto3.pb.h"
-#include "datasets/google_message2/benchmark_message2.pb.h"
-#include "datasets/google_message3/benchmark_message3.pb.h"
-#include "datasets/google_message4/benchmark_message4.pb.h"
-#include "data_proto2_to_proto3_util.h"
-
-#include <fstream>
-
-using google::protobuf::util::GogoDataStripper;
-
-std::string ReadFile(const std::string& name) {
- std::ifstream file(name.c_str());
- GOOGLE_CHECK(file.is_open()) << "Couldn't find file '"
- << name
- << "', please make sure you are running this command from the benchmarks"
- << " directory.\n";
- return std::string((std::istreambuf_iterator<char>(file)),
- std::istreambuf_iterator<char>());
-}
-
-int main(int argc, char *argv[]) {
- if (argc % 2 == 0 || argc == 1) {
- std::cerr << "Usage: [input_files] [output_file_names] where " <<
- "input_files are one to one mapping to output_file_names." <<
- std::endl;
- return 1;
- }
-
- for (int i = argc / 2; i > 0; i--) {
- const std::string &input_file = argv[i];
- const std::string &output_file = argv[i + argc / 2];
-
- std::cerr << "Generating " << input_file
- << " to " << output_file << std::endl;
- benchmarks::BenchmarkDataset dataset;
- Message* message;
- std::string dataset_payload = ReadFile(input_file);
- GOOGLE_CHECK(dataset.ParseFromString(dataset_payload))
- << "Can' t parse data file " << input_file;
-
- if (dataset.message_name() == "benchmarks.proto3.GoogleMessage1") {
- message = new benchmarks::proto3::GoogleMessage1;
- } else if (dataset.message_name() == "benchmarks.proto2.GoogleMessage1") {
- message = new benchmarks::proto2::GoogleMessage1;
- } else if (dataset.message_name() == "benchmarks.proto2.GoogleMessage2") {
- message = new benchmarks::proto2::GoogleMessage2;
- } else if (dataset.message_name() ==
- "benchmarks.google_message3.GoogleMessage3") {
- message = new benchmarks::google_message3::GoogleMessage3;
- } else if (dataset.message_name() ==
- "benchmarks.google_message4.GoogleMessage4") {
- message = new benchmarks::google_message4::GoogleMessage4;
- } else {
- std::cerr << "Unknown message type: " << dataset.message_name();
- exit(1);
- }
-
- for (int i = 0; i < dataset.payload_size(); i++) {
- message->ParseFromString(dataset.payload(i));
- GogoDataStripper stripper;
- stripper.StripMessage(message);
- dataset.set_payload(i, message->SerializeAsString());
- }
-
- std::ofstream ofs(output_file);
- ofs << dataset.SerializeAsString();
- ofs.close();
- }
-
-
- return 0;
-}
diff --git a/benchmarks/util/proto3_data_stripper.cc b/benchmarks/util/proto3_data_stripper.cc
deleted file mode 100644
index 3096c4c..0000000
--- a/benchmarks/util/proto3_data_stripper.cc
+++ /dev/null
@@ -1,74 +0,0 @@
-#include "benchmarks.pb.h"
-#include "datasets/google_message1/proto2/benchmark_message1_proto2.pb.h"
-#include "datasets/google_message1/proto3/benchmark_message1_proto3.pb.h"
-#include "datasets/google_message2/benchmark_message2.pb.h"
-#include "datasets/google_message3/benchmark_message3.pb.h"
-#include "datasets/google_message4/benchmark_message4.pb.h"
-#include "data_proto2_to_proto3_util.h"
-
-#include <fstream>
-
-using google::protobuf::util::Proto3DataStripper;
-
-std::string ReadFile(const std::string& name) {
- std::ifstream file(name.c_str());
- GOOGLE_CHECK(file.is_open()) << "Couldn't find file '"
- << name
- << "', please make sure you are running this command from the benchmarks"
- << " directory.\n";
- return std::string((std::istreambuf_iterator<char>(file)),
- std::istreambuf_iterator<char>());
-}
-
-int main(int argc, char *argv[]) {
- if (argc % 2 == 0 || argc == 1) {
- std::cerr << "Usage: [input_files] [output_file_names] where " <<
- "input_files are one to one mapping to output_file_names." <<
- std::endl;
- return 1;
- }
-
- for (int i = argc / 2; i > 0; i--) {
- const std::string &input_file = argv[i];
- const std::string &output_file = argv[i + argc / 2];
-
- std::cerr << "Generating " << input_file
- << " to " << output_file << std::endl;
- benchmarks::BenchmarkDataset dataset;
- Message* message;
- std::string dataset_payload = ReadFile(input_file);
- GOOGLE_CHECK(dataset.ParseFromString(dataset_payload))
- << "Can' t parse data file " << input_file;
-
- if (dataset.message_name() == "benchmarks.proto3.GoogleMessage1") {
- message = new benchmarks::proto3::GoogleMessage1;
- } else if (dataset.message_name() == "benchmarks.proto2.GoogleMessage1") {
- message = new benchmarks::proto2::GoogleMessage1;
- } else if (dataset.message_name() == "benchmarks.proto2.GoogleMessage2") {
- message = new benchmarks::proto2::GoogleMessage2;
- } else if (dataset.message_name() ==
- "benchmarks.google_message3.GoogleMessage3") {
- message = new benchmarks::google_message3::GoogleMessage3;
- } else if (dataset.message_name() ==
- "benchmarks.google_message4.GoogleMessage4") {
- message = new benchmarks::google_message4::GoogleMessage4;
- } else {
- std::cerr << "Unknown message type: " << dataset.message_name();
- exit(1);
- }
-
- for (int i = 0; i < dataset.payload_size(); i++) {
- message->ParseFromString(dataset.payload(i));
- Proto3DataStripper stripper;
- stripper.StripMessage(message);
- dataset.set_payload(i, message->SerializeAsString());
- }
-
- std::ofstream ofs(output_file);
- ofs << dataset.SerializeAsString();
- ofs.close();
- }
-
-
- return 0;
-}
diff --git a/benchmarks/util/protoc-gen-gogoproto.cc b/benchmarks/util/protoc-gen-gogoproto.cc
deleted file mode 100644
index 9c1b3d0..0000000
--- a/benchmarks/util/protoc-gen-gogoproto.cc
+++ /dev/null
@@ -1,103 +0,0 @@
-#include "google/protobuf/compiler/code_generator.h"
-#include "google/protobuf/io/zero_copy_stream.h"
-#include "google/protobuf/io/printer.h"
-#include "google/protobuf/descriptor.h"
-#include "google/protobuf/descriptor.pb.h"
-#include "schema_proto2_to_proto3_util.h"
-
-#include "google/protobuf/compiler/plugin.h"
-
-using google::protobuf::FileDescriptorProto;
-using google::protobuf::FileDescriptor;
-using google::protobuf::DescriptorPool;
-using google::protobuf::io::Printer;
-using google::protobuf::util::SchemaGroupStripper;
-using google::protobuf::util::EnumScrubber;
-
-namespace google {
-namespace protobuf {
-namespace compiler {
-
-namespace {
-
-string StripProto(string filename) {
- if (filename.substr(filename.size() - 11) == ".protodevel") {
- // .protodevel
- return filename.substr(0, filename.size() - 11);
- } else {
- // .proto
- return filename.substr(0, filename.size() - 6);
- }
-}
-
-DescriptorPool new_pool_;
-
-} // namespace
-
-class GoGoProtoGenerator : public CodeGenerator {
- public:
- virtual bool GenerateAll(const std::vector<const FileDescriptor*>& files,
- const string& parameter,
- GeneratorContext* context,
- string* error) const {
- for (int i = 0; i < files.size(); i++) {
- for (auto file : files) {
- bool can_generate =
- (new_pool_.FindFileByName(file->name()) == nullptr);
- for (int j = 0; j < file->dependency_count(); j++) {
- can_generate &= (new_pool_.FindFileByName(
- file->dependency(j)->name()) != nullptr);
- }
- for (int j = 0; j < file->public_dependency_count(); j++) {
- can_generate &= (new_pool_.FindFileByName(
- file->public_dependency(j)->name()) != nullptr);
- }
- for (int j = 0; j < file->weak_dependency_count(); j++) {
- can_generate &= (new_pool_.FindFileByName(
- file->weak_dependency(j)->name()) != nullptr);
- }
- if (can_generate) {
- Generate(file, parameter, context, error);
- break;
- }
- }
- }
-
- return true;
- }
-
- virtual bool Generate(const FileDescriptor* file,
- const string& parameter,
- GeneratorContext* context,
- string* error) const {
- FileDescriptorProto new_file;
- file->CopyTo(&new_file);
- SchemaGroupStripper::StripFile(file, &new_file);
-
- EnumScrubber enum_scrubber;
- enum_scrubber.ScrubFile(&new_file);
-
- string filename = file->name();
- string basename = StripProto(filename);
-
- std::vector<std::pair<string,string>> option_pairs;
- ParseGeneratorParameter(parameter, &option_pairs);
-
- std::unique_ptr<google::protobuf::io::ZeroCopyOutputStream> output(
- context->Open(basename + ".proto"));
- string content = new_pool_.BuildFile(new_file)->DebugString();
- Printer printer(output.get(), '$');
- printer.WriteRaw(content.c_str(), content.size());
-
- return true;
- }
-};
-
-} // namespace compiler
-} // namespace protobuf
-} // namespace google
-
-int main(int argc, char* argv[]) {
- google::protobuf::compiler::GoGoProtoGenerator generator;
- return google::protobuf::compiler::PluginMain(argc, argv, &generator);
-}
diff --git a/benchmarks/util/protoc-gen-proto2_to_proto3.cc b/benchmarks/util/protoc-gen-proto2_to_proto3.cc
deleted file mode 100644
index d0a8902..0000000
--- a/benchmarks/util/protoc-gen-proto2_to_proto3.cc
+++ /dev/null
@@ -1,115 +0,0 @@
-#include "google/protobuf/compiler/code_generator.h"
-#include "google/protobuf/io/zero_copy_stream.h"
-#include "google/protobuf/io/printer.h"
-#include "google/protobuf/descriptor.h"
-#include "google/protobuf/descriptor.pb.h"
-#include "schema_proto2_to_proto3_util.h"
-
-#include "google/protobuf/compiler/plugin.h"
-
-using google::protobuf::FileDescriptorProto;
-using google::protobuf::FileDescriptor;
-using google::protobuf::DescriptorPool;
-using google::protobuf::io::Printer;
-using google::protobuf::util::SchemaGroupStripper;
-using google::protobuf::util::EnumScrubber;
-using google::protobuf::util::ExtensionStripper;
-using google::protobuf::util::FieldScrubber;
-
-namespace google {
-namespace protobuf {
-namespace compiler {
-
-namespace {
-
-string StripProto(string filename) {
- return filename.substr(0, filename.rfind(".proto"));
-}
-
-DescriptorPool* GetPool() {
- static DescriptorPool *pool = new DescriptorPool();
- return pool;
-}
-
-} // namespace
-
-class Proto2ToProto3Generator final : public CodeGenerator {
- public:
- bool GenerateAll(const std::vector<const FileDescriptor*>& files,
- const string& parameter,
- GeneratorContext* context,
- string* error) const {
- for (int i = 0; i < files.size(); i++) {
- for (auto file : files) {
- if (CanGenerate(file)) {
- Generate(file, parameter, context, error);
- break;
- }
- }
- }
-
- return true;
- }
-
- bool Generate(const FileDescriptor* file,
- const string& parameter,
- GeneratorContext* context,
- string* error) const {
- FileDescriptorProto new_file;
- file->CopyTo(&new_file);
- SchemaGroupStripper::StripFile(file, &new_file);
-
- EnumScrubber enum_scrubber;
- enum_scrubber.ScrubFile(&new_file);
- ExtensionStripper::StripFile(&new_file);
- FieldScrubber::ScrubFile(&new_file);
- new_file.set_syntax("proto3");
-
- string filename = file->name();
- string basename = StripProto(filename);
-
- std::vector<std::pair<string,string>> option_pairs;
- ParseGeneratorParameter(parameter, &option_pairs);
-
- std::unique_ptr<google::protobuf::io::ZeroCopyOutputStream> output(
- context->Open(basename + ".proto"));
- string content = GetPool()->BuildFile(new_file)->DebugString();
- Printer printer(output.get(), '$');
- printer.WriteRaw(content.c_str(), content.size());
-
- return true;
- }
- private:
- bool CanGenerate(const FileDescriptor* file) const {
- if (GetPool()->FindFileByName(file->name()) != nullptr) {
- return false;
- }
- for (int j = 0; j < file->dependency_count(); j++) {
- if (GetPool()->FindFileByName(file->dependency(j)->name()) == nullptr) {
- return false;
- }
- }
- for (int j = 0; j < file->public_dependency_count(); j++) {
- if (GetPool()->FindFileByName(
- file->public_dependency(j)->name()) == nullptr) {
- return false;
- }
- }
- for (int j = 0; j < file->weak_dependency_count(); j++) {
- if (GetPool()->FindFileByName(
- file->weak_dependency(j)->name()) == nullptr) {
- return false;
- }
- }
- return true;
- }
-};
-
-} // namespace compiler
-} // namespace protobuf
-} // namespace google
-
-int main(int argc, char* argv[]) {
- google::protobuf::compiler::Proto2ToProto3Generator generator;
- return google::protobuf::compiler::PluginMain(argc, argv, &generator);
-}
diff --git a/benchmarks/util/result_parser.py b/benchmarks/util/result_parser.py
deleted file mode 100644
index d3251a8..0000000
--- a/benchmarks/util/result_parser.py
+++ /dev/null
@@ -1,352 +0,0 @@
-# This import depends on the automake rule protoc_middleman, please make sure
-# protoc_middleman has been built before run this file.
-import argparse
-import json
-import re
-import os.path
-# BEGIN OPENSOURCE
-import sys
-sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)), os.pardir))
-# END OPENSOURCE
-import tmp.benchmarks_pb2 as benchmarks_pb2
-
-__file_size_map = {}
-
-def __get_data_size(filename):
- if filename[0] != '/':
- filename = os.path.dirname(os.path.abspath(__file__)) + "/../" + filename
- if filename in __file_size_map:
- return __file_size_map[filename]
- benchmark_dataset = benchmarks_pb2.BenchmarkDataset()
- benchmark_dataset.ParseFromString(
- open(filename, "rb").read())
- size = 0
- count = 0
- for payload in benchmark_dataset.payload:
- size += len(payload)
- count += 1
- __file_size_map[filename] = (size, 1.0 * size / count)
- return size, 1.0 * size / count
-
-
-def __extract_file_name(file_name):
- name_list = re.split(r"[/\.]", file_name)
- short_file_name = ""
- for name in name_list:
- if name[:14] == "google_message":
- short_file_name = name
- return short_file_name
-
-
-__results = []
-
-
-# CPP results example:
-# [
-# "benchmarks": [
-# {
-# "bytes_per_second": int,
-# "cpu_time_ns": double,
-# "iterations": int,
-# "name: string,
-# "real_time_ns: double,
-# ...
-# },
-# ...
-# ],
-# ...
-# ]
-def __parse_cpp_result(filename):
- if filename == "":
- return
- if filename[0] != '/':
- filename = os.path.dirname(os.path.abspath(__file__)) + '/' + filename
- with open(filename, encoding="utf-8") as f:
- results = json.loads(f.read())
- for benchmark in results["benchmarks"]:
- data_filename = "".join(
- re.split("(_parse_|_serialize)", benchmark["name"])[0])
- behavior = benchmark["name"][len(data_filename) + 1:]
- if data_filename[:2] == "BM":
- data_filename = data_filename[3:]
- __results.append({
- "language": "cpp",
- "dataFilename": data_filename,
- "behavior": behavior,
- "throughput": benchmark["bytes_per_second"] / 2.0 ** 20
- })
-
-
-# Synthetic benchmark results example:
-# [
-# "benchmarks": [
-# {
-# "cpu_time_ns": double,
-# "iterations": int,
-# "name: string,
-# "real_time_ns: double,
-# ...
-# },
-# ...
-# ],
-# ...
-# ]
-def __parse_synthetic_result(filename):
- if filename == "":
- return
- if filename[0] != "/":
- filename = os.path.dirname(os.path.abspath(__file__)) + "/" + filename
- with open(filename, encoding="utf-8") as f:
- results = json.loads(f.read())
- for benchmark in results["benchmarks"]:
- __results.append({
- "language": "cpp",
- "dataFilename": "",
- "behavior": "synthetic",
- "throughput": 10.0**9 / benchmark["cpu_time_ns"]
- })
-
-
-# Python results example:
-# [
-# [
-# {
-# "filename": string,
-# "benchmarks": {
-# behavior: results,
-# ...
-# },
-# },
-# ...
-# ], #pure-python
-# ...
-# ]
-def __parse_python_result(filename):
- if filename == "":
- return
- if filename[0] != '/':
- filename = os.path.dirname(os.path.abspath(__file__)) + '/' + filename
- with open(filename, encoding="utf-8") as f:
- results_list = json.loads(f.read())
- for results in results_list:
- for result in results:
- _, avg_size = __get_data_size(result["filename"])
- for behavior in result["benchmarks"]:
- __results.append({
- "language": "python",
- "dataFilename": __extract_file_name(result["filename"]),
- "behavior": behavior,
- "throughput": result["benchmarks"][behavior]
- })
-
-
-# Java results example:
-# [
-# {
-# "id": string,
-# "instrumentSpec": {...},
-# "measurements": [
-# {
-# "weight": float,
-# "value": {
-# "magnitude": float,
-# "unit": string
-# },
-# ...
-# },
-# ...
-# ],
-# "run": {...},
-# "scenario": {
-# "benchmarkSpec": {
-# "methodName": string,
-# "parameters": {
-# defined parameters in the benchmark: parameters value
-# },
-# ...
-# },
-# ...
-# }
-#
-# },
-# ...
-# ]
-def __parse_java_result(filename):
- if filename == "":
- return
- if filename[0] != '/':
- filename = os.path.dirname(os.path.abspath(__file__)) + '/' + filename
- with open(filename, encoding="utf-8") as f:
- results = json.loads(f.read())
- for result in results:
- total_weight = 0
- total_value = 0
- for measurement in result["measurements"]:
- total_weight += measurement["weight"]
- total_value += measurement["value"]["magnitude"]
- avg_time = total_value * 1.0 / total_weight
- total_size, _ = __get_data_size(
- result["scenario"]["benchmarkSpec"]["parameters"]["dataFile"])
- __results.append({
- "language": "java",
- "throughput": total_size / avg_time * 1e9 / 2 ** 20,
- "behavior": result["scenario"]["benchmarkSpec"]["methodName"],
- "dataFilename": __extract_file_name(
- result["scenario"]["benchmarkSpec"]["parameters"]["dataFile"])
- })
-
-
-# Go benchmark results:
-#
-# goos: linux
-# goarch: amd64
-# Benchmark/.././datasets/google_message2/dataset.google_message2.pb/Unmarshal-12 3000 705784 ns/op
-# Benchmark/.././datasets/google_message2/dataset.google_message2.pb/Marshal-12 2000 634648 ns/op
-# Benchmark/.././datasets/google_message2/dataset.google_message2.pb/Size-12 5000 244174 ns/op
-# Benchmark/.././datasets/google_message2/dataset.google_message2.pb/Clone-12 300 4120954 ns/op
-# Benchmark/.././datasets/google_message2/dataset.google_message2.pb/Merge-12 300 4108632 ns/op
-# PASS
-# ok _/usr/local/google/home/yilunchong/mygit/protobuf/benchmarks 124.173s
-def __parse_go_result(filename):
- if filename == "":
- return
- if filename[0] != '/':
- filename = os.path.dirname(os.path.abspath(__file__)) + '/' + filename
- with open(filename, encoding="utf-8") as f:
- for line in f:
- result_list = re.split(r"[\ \t]+", line)
- if result_list[0][:9] != "Benchmark":
- continue
- first_slash_index = result_list[0].find('/')
- last_slash_index = result_list[0].rfind('/')
- full_filename = result_list[0][first_slash_index+1:last_slash_index]
- total_bytes, _ = __get_data_size(full_filename)
- behavior_with_suffix = result_list[0][last_slash_index+1:]
- last_dash = behavior_with_suffix.rfind("-")
- if last_dash == -1:
- behavior = behavior_with_suffix
- else:
- behavior = behavior_with_suffix[:last_dash]
- __results.append({
- "dataFilename": __extract_file_name(full_filename),
- "throughput": total_bytes / float(result_list[2]) * 1e9 / 2 ** 20,
- "behavior": behavior,
- "language": "go"
- })
-
-
-# Self built json results example:
-#
-# [
-# {
-# "filename": string,
-# "benchmarks": {
-# behavior: results,
-# ...
-# },
-# },
-# ...
-# ]
-def __parse_custom_result(filename, language):
- if filename == "":
- return
- if filename[0] != '/':
- filename = os.path.dirname(os.path.abspath(__file__)) + '/' + filename
- with open(filename, encoding="utf-8") as f:
- results = json.loads(f.read())
- for result in results:
- _, avg_size = __get_data_size(result["filename"])
- for behavior in result["benchmarks"]:
- __results.append({
- "language": language,
- "dataFilename": __extract_file_name(result["filename"]),
- "behavior": behavior,
- "throughput": result["benchmarks"][behavior]
- })
-
-
-def __parse_js_result(filename, language):
- return __parse_custom_result(filename, language)
-
-def __parse_php_result(filename, language):
- return __parse_custom_result(filename, language)
-
-
-def get_result_from_file(cpp_file="",
- java_file="",
- python_file="",
- go_file="",
- synthetic_file="",
- node_file="",
- php_c_file="",
- php_file=""):
- results = {}
- if cpp_file != "":
- __parse_cpp_result(cpp_file)
- if java_file != "":
- __parse_java_result(java_file)
- if python_file != "":
- __parse_python_result(python_file)
- if go_file != "":
- __parse_go_result(go_file)
- if synthetic_file != "":
- __parse_synthetic_result(synthetic_file)
- if node_file != "":
- __parse_js_result(node_file, "node")
- if php_file != "":
- __parse_php_result(php_file, "php")
- if php_c_file != "":
- __parse_php_result(php_c_file, "php")
-
- return __results
-
-
-if __name__ == "__main__":
- parser = argparse.ArgumentParser()
- parser.add_argument(
- "-cpp",
- "--cpp_input_file",
- help="The CPP benchmark result file's name",
- default="")
- parser.add_argument(
- "-java",
- "--java_input_file",
- help="The Java benchmark result file's name",
- default="")
- parser.add_argument(
- "-python",
- "--python_input_file",
- help="The Python benchmark result file's name",
- default="")
- parser.add_argument(
- "-go",
- "--go_input_file",
- help="The golang benchmark result file's name",
- default="")
- parser.add_argument(
- "-node",
- "--node_input_file",
- help="The node.js benchmark result file's name",
- default="")
- parser.add_argument(
- "-php",
- "--php_input_file",
- help="The pure php benchmark result file's name",
- default="")
- parser.add_argument(
- "-php_c",
- "--php_c_input_file",
- help="The php with c ext benchmark result file's name",
- default="")
- args = parser.parse_args()
-
- results = get_result_from_file(
- cpp_file=args.cpp_input_file,
- java_file=args.java_input_file,
- python_file=args.python_input_file,
- go_file=args.go_input_file,
- node_file=args.node_input_file,
- php_file=args.php_input_file,
- php_c_file=args.php_c_input_file,
- )
- print(json.dumps(results, indent=2))
diff --git a/benchmarks/util/result_uploader.py b/benchmarks/util/result_uploader.py
deleted file mode 100644
index 2a35d96..0000000
--- a/benchmarks/util/result_uploader.py
+++ /dev/null
@@ -1,107 +0,0 @@
-from __future__ import print_function
-from __future__ import absolute_import
-import argparse
-import os
-import re
-import copy
-import uuid
-import calendar
-import time
-import datetime
-
-from util import big_query_utils
-from util import result_parser
-
-_PROJECT_ID = 'grpc-testing'
-_DATASET = 'protobuf_benchmark_result'
-_TABLE = 'opensource_result_v2'
-_NOW = "%d%02d%02d" % (datetime.datetime.now().year,
- datetime.datetime.now().month,
- datetime.datetime.now().day)
-
-_INITIAL_TIME = calendar.timegm(time.gmtime())
-
-def get_metadata():
- build_number = os.getenv('BUILD_NUMBER')
- build_url = os.getenv('BUILD_URL')
- job_name = os.getenv('JOB_NAME')
- git_commit = os.getenv('GIT_COMMIT')
- # actual commit is the actual head of PR that is getting tested
- git_actual_commit = os.getenv('ghprbActualCommit')
-
- utc_timestamp = str(calendar.timegm(time.gmtime()))
- metadata = {'created': utc_timestamp}
-
- if build_number:
- metadata['buildNumber'] = build_number
- if build_url:
- metadata['buildUrl'] = build_url
- if job_name:
- metadata['jobName'] = job_name
- if git_commit:
- metadata['gitCommit'] = git_commit
- if git_actual_commit:
- metadata['gitActualCommit'] = git_actual_commit
-
- return metadata
-
-
-def upload_result(result_list, metadata):
- for result in result_list:
- new_result = {}
- new_result["metric"] = "throughput"
- new_result["value"] = result["throughput"]
- new_result["unit"] = "MB/s"
- new_result["test"] = "protobuf_benchmark"
- new_result["product_name"] = "protobuf"
- labels_string = ""
- for key in result:
- labels_string += ",|%s:%s|" % (key, result[key])
- new_result["labels"] = labels_string[1:]
- new_result["timestamp"] = _INITIAL_TIME
- print(labels_string)
-
- bq = big_query_utils.create_big_query()
- row = big_query_utils.make_row(str(uuid.uuid4()), new_result)
- if not big_query_utils.insert_rows(bq, _PROJECT_ID, _DATASET,
- _TABLE + "$" + _NOW,
- [row]):
- print('Error when uploading result', new_result)
-
-
-if __name__ == "__main__":
- parser = argparse.ArgumentParser()
- parser.add_argument("-cpp", "--cpp_input_file",
- help="The CPP benchmark result file's name",
- default="")
- parser.add_argument("-java", "--java_input_file",
- help="The Java benchmark result file's name",
- default="")
- parser.add_argument("-python", "--python_input_file",
- help="The Python benchmark result file's name",
- default="")
- parser.add_argument("-go", "--go_input_file",
- help="The golang benchmark result file's name",
- default="")
- parser.add_argument("-node", "--node_input_file",
- help="The node.js benchmark result file's name",
- default="")
- parser.add_argument("-php", "--php_input_file",
- help="The pure php benchmark result file's name",
- default="")
- parser.add_argument("-php_c", "--php_c_input_file",
- help="The php with c ext benchmark result file's name",
- default="")
- args = parser.parse_args()
-
- metadata = get_metadata()
- print("uploading results...")
- upload_result(result_parser.get_result_from_file(
- cpp_file=args.cpp_input_file,
- java_file=args.java_input_file,
- python_file=args.python_input_file,
- go_file=args.go_input_file,
- node_file=args.node_input_file,
- php_file=args.php_input_file,
- php_c_file=args.php_c_input_file,
- ), metadata)
diff --git a/benchmarks/util/schema_proto2_to_proto3_util.h b/benchmarks/util/schema_proto2_to_proto3_util.h
deleted file mode 100644
index 0079f6f..0000000
--- a/benchmarks/util/schema_proto2_to_proto3_util.h
+++ /dev/null
@@ -1,194 +0,0 @@
-#ifndef PROTOBUF_BENCHMARKS_UTIL_SCHEMA_PROTO2_TO_PROTO3_UTIL_H_
-#define PROTOBUF_BENCHMARKS_UTIL_SCHEMA_PROTO2_TO_PROTO3_UTIL_H_
-
-#include "google/protobuf/message.h"
-#include "google/protobuf/descriptor.h"
-#include "google/protobuf/descriptor.pb.h"
-
-#include <sstream>
-#include <algorithm>
-
-using google::protobuf::Descriptor;
-using google::protobuf::DescriptorProto;
-using google::protobuf::FileDescriptorProto;
-using google::protobuf::FieldDescriptorProto;
-using google::protobuf::Message;
-using google::protobuf::EnumValueDescriptorProto;
-
-namespace google {
-namespace protobuf {
-namespace util {
-
-class SchemaGroupStripper {
-
- public:
- static void StripFile(const FileDescriptor* old_file,
- FileDescriptorProto *file) {
- for (int i = file->mutable_message_type()->size() - 1; i >= 0; i--) {
- if (IsMessageSet(old_file->message_type(i))) {
- file->mutable_message_type()->DeleteSubrange(i, 1);
- continue;
- }
- StripMessage(old_file->message_type(i), file->mutable_message_type(i));
- }
- for (int i = file->mutable_extension()->size() - 1; i >= 0; i--) {
- auto field = old_file->extension(i);
- if (field->type() == FieldDescriptor::TYPE_GROUP ||
- IsMessageSet(field->message_type()) ||
- IsMessageSet(field->containing_type())) {
- file->mutable_extension()->DeleteSubrange(i, 1);
- }
- }
- }
-
- private:
- static bool IsMessageSet(const Descriptor *descriptor) {
- if (descriptor != nullptr
- && descriptor->options().message_set_wire_format()) {
- return true;
- }
- return false;
- }
-
- static void StripMessage(const Descriptor *old_message,
- DescriptorProto *new_message) {
- for (int i = new_message->mutable_field()->size() - 1; i >= 0; i--) {
- if (old_message->field(i)->type() == FieldDescriptor::TYPE_GROUP ||
- IsMessageSet(old_message->field(i)->message_type())) {
- new_message->mutable_field()->DeleteSubrange(i, 1);
- }
- }
- for (int i = new_message->mutable_extension()->size() - 1; i >= 0; i--) {
- auto field_type_name = new_message->mutable_extension(i)->type_name();
- if (old_message->extension(i)->type() == FieldDescriptor::TYPE_GROUP ||
- IsMessageSet(old_message->extension(i)->containing_type()) ||
- IsMessageSet(old_message->extension(i)->message_type())) {
- new_message->mutable_extension()->DeleteSubrange(i, 1);
- }
- }
- for (int i = 0; i < new_message->mutable_nested_type()->size(); i++) {
- StripMessage(old_message->nested_type(i),
- new_message->mutable_nested_type(i));
- }
- }
-
-};
-
-class EnumScrubber {
-
- public:
- EnumScrubber()
- : total_added_(0) {
- }
-
- void ScrubFile(FileDescriptorProto *file) {
- for (int i = 0; i < file->enum_type_size(); i++) {
- ScrubEnum(file->mutable_enum_type(i));
- }
- for (int i = 0; i < file->mutable_message_type()->size(); i++) {
- ScrubMessage(file->mutable_message_type(i));
- }
- }
-
- private:
- void ScrubEnum(EnumDescriptorProto *enum_type) {
- if (enum_type->value(0).number() != 0) {
- bool has_zero = false;
- for (int j = 0; j < enum_type->value().size(); j++) {
- if (enum_type->value(j).number() == 0) {
- EnumValueDescriptorProto temp_enum_value;
- temp_enum_value.CopyFrom(enum_type->value(j));
- enum_type->mutable_value(j)->CopyFrom(enum_type->value(0));
- enum_type->mutable_value(0)->CopyFrom(temp_enum_value);
- has_zero = true;
- break;
- }
- }
- if (!has_zero) {
- enum_type->mutable_value()->Add();
- for (int i = enum_type->mutable_value()->size() - 1; i > 0; i--) {
- enum_type->mutable_value(i)->CopyFrom(
- *enum_type->mutable_value(i - 1));
- }
- enum_type->mutable_value(0)->set_number(0);
- enum_type->mutable_value(0)->set_name("ADDED_ZERO_VALUE_" +
- std::to_string(total_added_++));
- }
- }
-
- }
-
- void ScrubMessage(DescriptorProto *message_type) {
- for (int i = 0; i < message_type->mutable_enum_type()->size(); i++) {
- ScrubEnum(message_type->mutable_enum_type(i));
- }
- for (int i = 0; i < message_type->mutable_nested_type()->size(); i++) {
- ScrubMessage(message_type->mutable_nested_type(i));
- }
- }
-
- int total_added_;
-};
-
-class ExtensionStripper {
- public:
- static void StripFile(FileDescriptorProto *file) {
- for (int i = 0; i < file->mutable_message_type()->size(); i++) {
- StripMessage(file->mutable_message_type(i));
- }
- file->mutable_extension()->Clear();
- }
- private:
- static void StripMessage(DescriptorProto *message_type) {
- message_type->mutable_extension()->Clear();
- message_type->clear_extension_range();
- for (int i = 0; i < message_type->mutable_nested_type()->size(); i++) {
- StripMessage(message_type->mutable_nested_type(i));
- }
- }
-};
-
-
-class FieldScrubber {
- public:
- static void ScrubFile(FileDescriptorProto *file) {
- for (int i = 0; i < file->mutable_message_type()->size(); i++) {
- ScrubMessage(file->mutable_message_type(i));
- }
- for (int i = 0; i < file->mutable_extension()->size(); i++) {
- file->mutable_extension(i)->clear_default_value();
- if (ShouldClearLabel(file->mutable_extension(i))) {
- file->mutable_extension(i)->clear_label();
- }
- }
- }
- private:
- static bool ShouldClearLabel(const FieldDescriptorProto *field) {
- return field->label() == FieldDescriptorProto::LABEL_REQUIRED;
- }
-
- static void ScrubMessage(DescriptorProto *message_type) {
- message_type->mutable_extension()->Clear();
- for (int i = 0; i < message_type->mutable_extension()->size(); i++) {
- message_type->mutable_extension(i)->clear_default_value();
- if (ShouldClearLabel(message_type->mutable_extension(i))) {
- message_type->mutable_extension(i)->clear_label();
- }
- }
- for (int i = 0; i < message_type->mutable_field()->size(); i++) {
- message_type->mutable_field(i)->clear_default_value();
- if (ShouldClearLabel(message_type->mutable_field(i))) {
- message_type->mutable_field(i)->clear_label();
- }
- }
- for (int i = 0; i < message_type->mutable_nested_type()->size(); i++) {
- ScrubMessage(message_type->mutable_nested_type(i));
- }
- }
-};
-
-} // namespace util
-} // namespace protobuf
-} // namespace google
-
-#endif // PROTOBUF_BENCHMARKS_UTIL_SCHEMA_PROTO2_TO_PROTO3_UTIL_H_
diff --git a/build_defs/BUILD.bazel b/build_defs/BUILD.bazel
index a5d831c..4ac09c8 100644
--- a/build_defs/BUILD.bazel
+++ b/build_defs/BUILD.bazel
@@ -17,6 +17,16 @@
value = "msvc-cl",
)
+config_setting(
+ name = "aarch64",
+ values = {"cpu": "linux-aarch_64"},
+)
+
+config_setting(
+ name = "x86_64",
+ values = {"cpu": "linux-x86_64"},
+)
+
# Android NDK builds can specify different crosstool_top flags to choose which
# STL they use for C++. We need these multiple variants to catch all of those
# versions of crosstool_top and reliably detect Android.
diff --git a/build_defs/arch_tests.bzl b/build_defs/arch_tests.bzl
new file mode 100644
index 0000000..61fa00c
--- /dev/null
+++ b/build_defs/arch_tests.bzl
@@ -0,0 +1,56 @@
+"""Generated unittests to verify that a binary is built for the expected architecture."""
+
+load("//build_defs:internal_shell.bzl", "inline_sh_test")
+
+def _arch_test_impl(
+ name,
+ platform,
+ file_platform,
+ bazel_binaries = [],
+ system_binaries = [],
+ **kwargs):
+ """Bazel rule to verify that a Bazel or system binary is built for the aarch64 architecture.
+
+ Args:
+ name: the name of the test.
+ platform: a diagnostic name for this architecture.
+ file_platform: the expected output of `file`.
+ bazel_binaries: a set of binary targets to inspect.
+ system_binaries: a set of paths to system executables to inspect.
+ **kwargs: other keyword arguments that are passed to the test.
+ """
+
+ inline_sh_test(
+ name = name,
+ tools = bazel_binaries,
+ cmd = """
+ for binary in "$(rootpaths %s) %s"; do
+ (file -L $$binary | grep -q "%s") \
+ || (echo "Test binary is not an %s binary: "; file -L $$binary; exit 1)
+ done
+ """ % (
+ " ".join(bazel_binaries),
+ " ".join(system_binaries),
+ file_platform,
+ platform,
+ ),
+ target_compatible_with = select({
+ "//build_defs:" + platform: [],
+ "//conditions:default": ["@platforms//:incompatible"],
+ }),
+ **kwargs
+ )
+
+def aarch64_test(**kwargs):
+ _arch_test_impl(
+ platform = "aarch64",
+ file_platform = "ELF 64-bit LSB executable, ARM aarch64",
+ **kwargs
+ )
+
+def x86_64_test(**kwargs):
+ _arch_test_impl(
+ platform = "x86_64",
+ file_platform = "ELF 64-bit LSB executable, ARM x86_64",
+ **kwargs
+ )
diff --git a/build_defs/cpp_opts.bzl b/build_defs/cpp_opts.bzl
index 1d5594d..912c19b 100644
--- a/build_defs/cpp_opts.bzl
+++ b/build_defs/cpp_opts.bzl
@@ -1,4 +1,4 @@
-# C++ compile/link options for Protobuf.
+"""C++ compile/link options for Protobuf libraries."""
COPTS = select({
"//build_defs:config_msvc": [
@@ -19,6 +19,7 @@
"-DHAVE_ZLIB",
"-Woverloaded-virtual",
"-Wno-sign-compare",
+ "-Werror",
],
})
diff --git a/build_defs/internal_shell.bzl b/build_defs/internal_shell.bzl
new file mode 100644
index 0000000..670c4d5
--- /dev/null
+++ b/build_defs/internal_shell.bzl
@@ -0,0 +1,93 @@
+"""
+Internal tools to migrate shell commands to Bazel as an intermediate step
+to wider Bazelification.
+"""
+
+def inline_sh_binary(
+ name,
+ srcs = [],
+ tools = [],
+ deps = [],
+ cmd = "",
+ testonly = None,
+ **kwargs):
+ """Bazel rule to wrap up an inline bash script in a binary.
+
+ This is most useful as a stop-gap solution for migrating off Autotools.
+ These binaries are likely to be non-hermetic, with implicit system
+ dependencies.
+
+ NOTE: the rule is only an internal workaround. The interface may change and
+ the rule may be removed when everything is properly "Bazelified".
+
+ Args:
+ name: the name of the inline_sh_binary.
+ srcs: the files used directly by the script.
+ tools: the executable tools used directly by the script. Any target used
+ with rootpath/execpath/location must be declared here or in `srcs`.
+ deps: a list of dependency labels that are required to run this binary.
+ cmd: the inline sh command to run.
+ **kwargs: other keyword arguments that are passed to sh_binary.
+ testonly: common rule attribute (see:
+ https://bazel.build/reference/be/common-definitions#common-attributes)
+ """
+
+ native.genrule(
+ name = name + "_genrule",
+ srcs = srcs,
+ exec_tools = tools,
+ outs = [name + ".sh"],
+ cmd = "cat <<'EOF' >$(OUTS)\n#!/bin/bash -exu\n%s\nEOF\n" % cmd,
+ testonly = testonly,
+ visibility = ["//visibility:private"],
+ )
+
+ native.sh_binary(
+ name = name,
+ srcs = [name + "_genrule"],
+ data = srcs + tools + deps,
+ testonly = testonly,
+ **kwargs
+ )
+
+def inline_sh_test(
+ name,
+ srcs = [],
+ tools = [],
+ deps = [],
+ cmd = "",
+ **kwargs):
+ """Bazel rule to wrap up an inline bash script in a test.
+
+ This is most useful as a stop-gap solution for migrating off Autotools.
+ These tests are likely to be non-hermetic, with implicit system dependencies.
+
+ NOTE: the rule is only an internal workaround. The interface may change and
+ the rule may be removed when everything is properly "Bazelified".
+
+ Args:
+ name: the name of the inline_sh_binary.
+ srcs: the files used directly by the script.
+ tools: the executable tools used directly by the script. Any target used
+ with rootpath/execpath/location must be declared here or in `srcs`.
+ deps: a list of dependency labels that are required to run this binary.
+ cmd: the inline sh command to run.
+ **kwargs: other keyword arguments that are passed to sh_binary.
+ https://bazel.build/reference/be/common-definitions#common-attributes)
+ """
+
+ native.genrule(
+ name = name + "_genrule",
+ srcs = srcs,
+ exec_tools = tools,
+ outs = [name + ".sh"],
+ cmd = "cat <<'EOF' >$(OUTS)\n#!/bin/bash -exu\n%s\nEOF\n" % cmd,
+ visibility = ["//visibility:private"],
+ )
+
+ native.sh_test(
+ name = name,
+ srcs = [name + "_genrule"],
+ data = srcs + tools + deps,
+ **kwargs
+ )
diff --git a/build_files_updated_unittest.sh b/build_files_updated_unittest.sh
deleted file mode 100755
index 87541c3..0000000
--- a/build_files_updated_unittest.sh
+++ /dev/null
@@ -1,62 +0,0 @@
-#!/bin/bash
-
-# This script verifies that BUILD files and cmake files are in sync with src/Makefile.am
-
-set -eo pipefail
-
-if [ "$(uname)" != "Linux" ]; then
- echo "build_files_updated_unittest only supported on Linux. Skipping..."
- exit 0
-fi
-
-# Keep in sync with files needed by update_file_lists.sh
-generated_files=(
- "BUILD"
- "cmake/extract_includes.bat.in"
- "cmake/libprotobuf-lite.cmake"
- "cmake/libprotobuf.cmake"
- "cmake/libprotoc.cmake"
- "cmake/tests.cmake"
- "src/Makefile.am"
-)
-
-# If we're running in Bazel, use the Bazel-provided temp-dir.
-if [ -n "${TEST_TMPDIR}" ]; then
- # Env-var TEST_TMPDIR is set, assume that this is Bazel.
- # Bazel may have opinions whether we are allowed to delete TEST_TMPDIR.
- test_root="${TEST_TMPDIR}/build_files_updated_unittest"
- mkdir "${test_root}"
-else
- # Seems like we're not executed by Bazel.
- test_root=$(mktemp -d)
-fi
-
-# From now on, fail if there are any unbound variables.
-set -u
-
-# Remove artifacts after test is finished.
-function cleanup {
- rm -rf "${test_root}"
-}
-trap cleanup EXIT
-
-# Create golden dir and add snapshot of current state.
-golden_dir="${test_root}/golden"
-mkdir -p "${golden_dir}/cmake" "${golden_dir}/src"
-for file in ${generated_files[@]}; do
- cp "${file}" "${golden_dir}/${file}"
-done
-
-# Create test dir, copy current state into it, and execute update script.
-test_dir="${test_root}/test"
-cp -R "${golden_dir}" "${test_dir}"
-
-cp "update_file_lists.sh" "${test_dir}/update_file_lists.sh"
-chmod +x "${test_dir}/update_file_lists.sh"
-cd "${test_root}/test"
-bash "${test_dir}/update_file_lists.sh"
-
-# Test whether there are any differences
-for file in ${generated_files[@]}; do
- diff -du "${golden_dir}/${file}" "${test_dir}/${file}"
-done
diff --git a/cmake/README.md b/cmake/README.md
index ce3e680..396d495 100644
--- a/cmake/README.md
+++ b/cmake/README.md
@@ -1,15 +1,21 @@
-This directory contains *CMake* files that can be used to build protobuf
-with *MSVC* on *Windows*. You can build the project from *Command Prompt*
-and using an *Visual Studio* IDE.
+This directory contains *CMake* files that can be used to build protobuf.
-You need to have [CMake](http://www.cmake.org), [Visual Studio](https://www.visualstudio.com)
-and optionally [Git](http://git-scm.com) installed on your computer before proceeding.
+You need to have [CMake](http://www.cmake.org) and
+[Git](http://git-scm.com) installed on your computer before proceeding. We
+currently support CMake 3.5 and newer on both [Windows](#windows-builds) and
+[Linux](#linux-builds).
-Most of the instructions will be given to the *Сommand Prompt*, but the same
-actions can be performed using appropriate GUI tools.
+Most of the instructions will be given using CMake's command-line interface, but
+the same actions can be performed using appropriate GUI tools.
-Environment Setup
-=================
+# Windows Builds
+
+On Windows, you can build the project from *Command Prompt* and using an
+*Visual Studio* IDE. You will also need to have
+[Visual Studio](https://www.visualstudio.com) installed on your computer before
+proceeding.
+
+## Environment Setup
Open the appropriate *Command Prompt* from the *Start* menu.
@@ -42,8 +48,7 @@
Good. Now you are ready to continue.
-Getting Sources
-===============
+## Getting Sources
You can get the latest stable source packages from the release page:
@@ -76,8 +81,7 @@
Good. Now you are ready for *CMake* configuration.
-CMake Configuration
-===================
+## CMake Configuration
*CMake* supports a lot of different
[generators](http://www.cmake.org/cmake/help/latest/manual/cmake-generators.7.html)
@@ -85,9 +89,6 @@
Of most interest to Windows programmers are the following:
-* [Makefile](http://www.cmake.org/cmake/help/latest/manual/cmake-generators.7.html#makefile-generators).
- This generates NMake Makefiles for Visual Studio. These work, but they are rather slow.
-
* [Visual Studio](http://www.cmake.org/cmake/help/latest/manual/cmake-generators.7.html#visual-studio-generators)
This generates a Visual Studio solution for the project.
@@ -108,16 +109,6 @@
The *Makefile* and *Ninja* generators can build the project in only one configuration, so you need to build
a separate folder for each configuration.
-To start using a *Release* configuration via the *NMmake* generator:
-
- C:\Path\to\build\protobuf>mkdir release & cd release
- C:\Path\to\build\protobuf\release>cmake -G "NMake Makefiles" ^
- -DCMAKE_BUILD_TYPE=Release ^
- -DCMAKE_INSTALL_PREFIX=C:\Path\to\install ^
- C:\Path\to\src\protobuf
-
-It will generate a *NMake* *Makefile* in the current directory.
-
To use *Debug* configuration using *Ninja*:
C:\Path\to\build\protobuf>mkdir debug & cd debug
@@ -137,8 +128,7 @@
It will generate *Visual Studio* solution file *protobuf.sln* in current directory.
-Unit Tests
-----------
+### Unit Tests
Unit tests are being built along with the rest of protobuf. The unit tests require Google Mock (now a part of Google Test).
@@ -178,8 +168,7 @@
-Dprotobuf_BUILD_TESTS=OFF ^
C:\Path\to\src\protobuf
-Compiling
-=========
+## Compiling
The standard way to compile a *CMake* project is `cmake --build <directory>`.
@@ -190,10 +179,6 @@
You can also run directly the build tool you've configured:
- C:\Path\to\build\protobuf\release>nmake
-
-or
-
C:\Path\to\build\protobuf\debug>ninja
And wait for the compilation to finish.
@@ -206,8 +191,7 @@
And wait for the compilation to finish.
-Testing
-=======
+## Testing
To run unit-tests, first you must compile protobuf as described above.
Then run:
@@ -259,8 +243,7 @@
If all tests are passed, safely continue.
-Installing
-==========
+## Installing
To install protobuf to the *install* folder you've specified in the configuration step, you need to build the `install` target:
@@ -268,10 +251,6 @@
Or if you prefer:
- C:\Path\to\build\protobuf\release>nmake install
-
-or
-
C:\Path\to\build\protobuf\debug>ninja install
You can also build project *INSTALL* from Visual Studio solution.
@@ -292,8 +271,7 @@
debug build of libprotobufd.lib with "d" postfix. Similarly, release builds should link against
release libprotobuf.lib library.
-DLLs vs. static linking
-=======================
+## DLLs vs. static linking
Static linking is now the default for the Protocol Buffer libraries. Due to
issues with Win32's use of a separate heap for each DLL, as well as binary
@@ -318,8 +296,7 @@
public interface, and that you statically link protocol buffers into your
library.
-ZLib support
-============
+## ZLib support
If you want to include GzipInputStream and GzipOutputStream
(google/protobuf/io/gzip_stream.h) in libprotobuf, you will need to do a few
@@ -369,8 +346,7 @@
Build and testing protobuf as usual.
-Notes on Compiler Warnings
-==========================
+## Notes on Compiler Warnings
The following warnings have been disabled while building the protobuf libraries
and compiler. You may have to disable some of them in your own project as
@@ -397,3 +373,23 @@
nevertheless. So, we disable it. Unfortunately, this warning will also be
produced when compiling code which merely uses protocol buffers, meaning you
may have to disable it in your code too.
+
+# Linux Builds
+
+Building with CMake works very similarly on Linux. Instead of Visual Studio,
+you will need to have gcc or clang installed to handle the C++ builds. CMake
+will generate Makefiles by default, but can also be configured to use Ninja. To
+build Protobuf, you will need to run (from the source directory):
+
+ cmake .
+ cmake --build . --parallel 10
+
+Protobuf can be tested and installed with CMake:
+
+ ctest --verbose
+ sudo cmake --install .
+
+or directly with the generated Makefiles:
+
+ make VERBOSE=1 test
+ sudo make install
diff --git a/cmake/abseil-cpp.cmake b/cmake/abseil-cpp.cmake
new file mode 100644
index 0000000..c1c4c16
--- /dev/null
+++ b/cmake/abseil-cpp.cmake
@@ -0,0 +1,58 @@
+# Setup our dependency on Abseil.
+
+set(ABSL_PROPAGATE_CXX_STD ON)
+
+if(TARGET absl::strings)
+ # If Abseil is included already, skip including it.
+ # (https://github.com/protocolbuffers/protobuf/issues/10435)
+elseif(protobuf_ABSL_PROVIDER STREQUAL "module")
+ if(NOT ABSL_ROOT_DIR)
+ set(ABSL_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/abseil-cpp)
+ endif()
+ if(EXISTS "${ABSL_ROOT_DIR}/CMakeLists.txt")
+ if(protobuf_INSTALL)
+ # When protobuf_INSTALL is enabled and Abseil will be built as a module,
+ # Abseil will be installed along with protobuf for convenience.
+ set(ABSL_ENABLE_INSTALL ON)
+ endif()
+ add_subdirectory(${ABSL_ROOT_DIR} third_party/abseil-cpp)
+ else()
+ message(WARNING "protobuf_ABSL_PROVIDER is \"module\" but ABSL_ROOT_DIR is wrong")
+ endif()
+ if(protobuf_INSTALL AND NOT _protobuf_INSTALL_SUPPORTED_FROM_MODULE)
+ message(WARNING "protobuf_INSTALL will be forced to FALSE because protobuf_ABSL_PROVIDER is \"module\" and CMake version (${CMAKE_VERSION}) is less than 3.13.")
+ set(protobuf_INSTALL FALSE)
+ endif()
+elseif(protobuf_ABSL_PROVIDER STREQUAL "package")
+ # Use "CONFIG" as there is no built-in cmake module for absl.
+ find_package(absl REQUIRED CONFIG)
+endif()
+set(_protobuf_FIND_ABSL "if(NOT TARGET absl::strings)\n find_package(absl CONFIG)\nendif()")
+
+set(protobuf_ABSL_USED_TARGETS
+ absl::algorithm
+ absl::base
+ absl::bind_front
+ absl::bits
+ absl::cleanup
+ absl::cord
+ absl::core_headers
+ absl::debugging
+ absl::dynamic_annotations
+ absl::flags
+ absl::flat_hash_map
+ absl::flat_hash_set
+ absl::function_ref
+ absl::hash
+ absl::layout
+ absl::memory
+ absl::optional
+ absl::span
+ absl::status
+ absl::statusor
+ absl::strings
+ absl::synchronization
+ absl::time
+ absl::utility
+ absl::variant
+)
diff --git a/cmake/conformance.cmake b/cmake/conformance.cmake
index d6c435a..056250e 100644
--- a/cmake/conformance.cmake
+++ b/cmake/conformance.cmake
@@ -1,6 +1,8 @@
add_custom_command(
- OUTPUT ${protobuf_SOURCE_DIR}/conformance/conformance.pb.cc
+ OUTPUT
+ ${protobuf_SOURCE_DIR}/conformance/conformance.pb.h
+ ${protobuf_SOURCE_DIR}/conformance/conformance.pb.cc
DEPENDS ${protobuf_PROTOC_EXE} ${protobuf_SOURCE_DIR}/conformance/conformance.proto
COMMAND ${protobuf_PROTOC_EXE} ${protobuf_SOURCE_DIR}/conformance/conformance.proto
--proto_path=${protobuf_SOURCE_DIR}/conformance
@@ -8,8 +10,11 @@
)
add_custom_command(
- OUTPUT ${protobuf_SOURCE_DIR}/src/google/protobuf/test_messages_proto3.pb.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/test_messages_proto2.pb.cc
+ OUTPUT
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/test_messages_proto3.pb.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/test_messages_proto3.pb.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/test_messages_proto2.pb.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/test_messages_proto2.pb.cc
DEPENDS ${protobuf_PROTOC_EXE} ${protobuf_SOURCE_DIR}/src/google/protobuf/test_messages_proto3.proto
${protobuf_PROTOC_EXE} ${protobuf_SOURCE_DIR}/src/google/protobuf/test_messages_proto2.proto
COMMAND ${protobuf_PROTOC_EXE} ${protobuf_SOURCE_DIR}/src/google/protobuf/test_messages_proto3.proto
@@ -21,29 +26,51 @@
add_executable(conformance_test_runner
${protobuf_SOURCE_DIR}/conformance/binary_json_conformance_suite.cc
${protobuf_SOURCE_DIR}/conformance/binary_json_conformance_suite.h
+ ${protobuf_SOURCE_DIR}/conformance/conformance.pb.h
${protobuf_SOURCE_DIR}/conformance/conformance.pb.cc
${protobuf_SOURCE_DIR}/conformance/conformance_test.cc
${protobuf_SOURCE_DIR}/conformance/conformance_test_runner.cc
+ ${protobuf_SOURCE_DIR}/conformance/conformance_test_main.cc
+ ${protobuf_SOURCE_DIR}/conformance/text_format_conformance_suite.cc
+ ${protobuf_SOURCE_DIR}/conformance/text_format_conformance_suite.h
${protobuf_SOURCE_DIR}/conformance/third_party/jsoncpp/json.h
${protobuf_SOURCE_DIR}/conformance/third_party/jsoncpp/jsoncpp.cpp
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/test_messages_proto2.pb.h
${protobuf_SOURCE_DIR}/src/google/protobuf/test_messages_proto2.pb.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/test_messages_proto3.pb.h
${protobuf_SOURCE_DIR}/src/google/protobuf/test_messages_proto3.pb.cc
)
add_executable(conformance_cpp
+ ${protobuf_SOURCE_DIR}/conformance/conformance.pb.h
${protobuf_SOURCE_DIR}/conformance/conformance.pb.cc
${protobuf_SOURCE_DIR}/conformance/conformance_cpp.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/test_messages_proto2.pb.h
${protobuf_SOURCE_DIR}/src/google/protobuf/test_messages_proto2.pb.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/test_messages_proto3.pb.h
${protobuf_SOURCE_DIR}/src/google/protobuf/test_messages_proto3.pb.cc
)
target_include_directories(
conformance_test_runner
- PUBLIC ${protobuf_SOURCE_DIR}/conformance)
+ PUBLIC ${protobuf_SOURCE_DIR} ${protobuf_SOURCE_DIR}/conformance)
target_include_directories(
conformance_cpp
- PUBLIC ${protobuf_SOURCE_DIR}/conformance)
+ PUBLIC ${protobuf_SOURCE_DIR})
-target_link_libraries(conformance_test_runner libprotobuf)
-target_link_libraries(conformance_cpp libprotobuf)
+target_include_directories(conformance_test_runner PRIVATE ${ABSL_ROOT_DIR})
+target_include_directories(conformance_cpp PRIVATE ${ABSL_ROOT_DIR})
+
+target_link_libraries(conformance_test_runner ${protobuf_LIB_PROTOBUF})
+target_link_libraries(conformance_test_runner ${protobuf_ABSL_USED_TARGETS})
+target_link_libraries(conformance_cpp ${protobuf_LIB_PROTOBUF})
+target_link_libraries(conformance_cpp ${protobuf_ABSL_USED_TARGETS})
+
+add_test(NAME conformance_cpp_test
+ COMMAND ${CMAKE_CURRENT_BINARY_DIR}/conformance_test_runner
+ --failure_list ${protobuf_SOURCE_DIR}/conformance/failure_list_cpp.txt
+ --text_format_failure_list ${protobuf_SOURCE_DIR}/conformance/text_format_failure_list_cpp.txt
+ --output_dir ${protobuf_TEST_XML_OUTDIR}
+ ${CMAKE_CURRENT_BINARY_DIR}/conformance_cpp
+ DEPENDS conformance_test_runner conformance_cpp)
diff --git a/cmake/examples.cmake b/cmake/examples.cmake
index 3b83d2b..07cfad2 100644
--- a/cmake/examples.cmake
+++ b/cmake/examples.cmake
@@ -30,7 +30,7 @@
# Add examples as an external project.
# sub_directory cannot be used because the find_package(protobuf) call would cause failures with redefined targets.
add_examples_build(examples "-Dprotobuf_DIR:PATH=${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_CMAKEDIR}")
-add_dependencies(examples libprotobuf protoc)
+add_dependencies(examples ${protobuf_LIB_PROTOBUF} ${protobuf_PROTOC_EXE})
option(protobuf_BUILD_EXAMPLES_MULTITEST "Build Examples in multiple configurations. Useful for testing." OFF)
mark_as_advanced(protobuf_BUILD_EXAMPLES_MULTITEST)
@@ -42,7 +42,7 @@
"-Dprotobuf_DIR:PATH=${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_CMAKEDIR}"
"-Dprotobuf_MODULE_COMPATIBLE:BOOL=TRUE"
)
- add_dependencies(examples-legacy libprotobuf protoc)
+ add_dependencies(examples-legacy ${protobuf_LIB_PROTOBUF} ${protobuf_PROTOC_EXE})
#Build using the installed library.
add_examples_build(examples-installed
diff --git a/cmake/extract_includes.bat.in b/cmake/extract_includes.bat.in
deleted file mode 100644
index 1292829..0000000
--- a/cmake/extract_includes.bat.in
+++ /dev/null
@@ -1,144 +0,0 @@
-mkdir include
-mkdir include\google
-mkdir include\google\protobuf
-mkdir include\google\protobuf\compiler
-mkdir include\google\protobuf\compiler\cpp
-mkdir include\google\protobuf\compiler\csharp
-mkdir include\google\protobuf\compiler\java
-mkdir include\google\protobuf\compiler\objectivec
-mkdir include\google\protobuf\compiler\php
-mkdir include\google\protobuf\compiler\python
-mkdir include\google\protobuf\compiler\ruby
-mkdir include\google\protobuf\io
-mkdir include\google\protobuf\stubs
-mkdir include\google\protobuf\util
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\any.h" include\google\protobuf\any.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\any.pb.h" include\google\protobuf\any.pb.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\api.pb.h" include\google\protobuf\api.pb.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\arena.h" include\google\protobuf\arena.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\arena_impl.h" include\google\protobuf\arena_impl.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\arenastring.h" include\google\protobuf\arenastring.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\arenaz_sampler.h" include\google\protobuf\arenaz_sampler.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\code_generator.h" include\google\protobuf\compiler\code_generator.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\command_line_interface.h" include\google\protobuf\compiler\command_line_interface.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\cpp\file.h" include\google\protobuf\compiler\cpp\file.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\cpp\cpp_generator.h" include\google\protobuf\compiler\cpp\cpp_generator.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\cpp\generator.h" include\google\protobuf\compiler\cpp\generator.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\cpp\helpers.h" include\google\protobuf\compiler\cpp\helpers.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\cpp\names.h" include\google\protobuf\compiler\cpp\names.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\csharp\csharp_doc_comment.h" include\google\protobuf\compiler\csharp\csharp_doc_comment.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\csharp\csharp_generator.h" include\google\protobuf\compiler\csharp\csharp_generator.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\csharp\csharp_names.h" include\google\protobuf\compiler\csharp\csharp_names.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\csharp\csharp_options.h" include\google\protobuf\compiler\csharp\csharp_options.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\importer.h" include\google\protobuf\compiler\importer.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\java\generator.h" include\google\protobuf\compiler\java\generator.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\java\java_generator.h" include\google\protobuf\compiler\java\java_generator.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\java\kotlin_generator.h" include\google\protobuf\compiler\java\kotlin_generator.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\java\names.h" include\google\protobuf\compiler\java\names.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\objectivec\objectivec_generator.h" include\google\protobuf\compiler\objectivec\objectivec_generator.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\objectivec\objectivec_helpers.h" include\google\protobuf\compiler\objectivec\objectivec_helpers.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\parser.h" include\google\protobuf\compiler\parser.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\php\php_generator.h" include\google\protobuf\compiler\php\php_generator.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\plugin.h" include\google\protobuf\compiler\plugin.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\plugin.pb.h" include\google\protobuf\compiler\plugin.pb.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\python\generator.h" include\google\protobuf\compiler\python\generator.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\python\pyi_generator.h" include\google\protobuf\compiler\python\pyi_generator.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\python\python_generator.h" include\google\protobuf\compiler\python\python_generator.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\ruby\ruby_generator.h" include\google\protobuf\compiler\ruby\ruby_generator.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\descriptor.h" include\google\protobuf\descriptor.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\descriptor.pb.h" include\google\protobuf\descriptor.pb.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\descriptor_database.h" include\google\protobuf\descriptor_database.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\duration.pb.h" include\google\protobuf\duration.pb.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\dynamic_message.h" include\google\protobuf\dynamic_message.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\empty.pb.h" include\google\protobuf\empty.pb.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\endian.h" include\google\protobuf\endian.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\explicitly_constructed.h" include\google\protobuf\explicitly_constructed.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\extension_set.h" include\google\protobuf\extension_set.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\extension_set_inl.h" include\google\protobuf\extension_set_inl.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\field_access_listener.h" include\google\protobuf\field_access_listener.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\field_mask.pb.h" include\google\protobuf\field_mask.pb.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\generated_enum_reflection.h" include\google\protobuf\generated_enum_reflection.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\generated_enum_util.h" include\google\protobuf\generated_enum_util.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\generated_message_bases.h" include\google\protobuf\generated_message_bases.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\generated_message_reflection.h" include\google\protobuf\generated_message_reflection.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\generated_message_tctable_decl.h" include\google\protobuf\generated_message_tctable_decl.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\generated_message_tctable_impl.h" include\google\protobuf\generated_message_tctable_impl.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\generated_message_util.h" include\google\protobuf\generated_message_util.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\has_bits.h" include\google\protobuf\has_bits.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\implicit_weak_message.h" include\google\protobuf\implicit_weak_message.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\inlined_string_field.h" include\google\protobuf\inlined_string_field.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\io\coded_stream.h" include\google\protobuf\io\coded_stream.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\io\gzip_stream.h" include\google\protobuf\io\gzip_stream.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\io\io_win32.h" include\google\protobuf\io\io_win32.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\io\printer.h" include\google\protobuf\io\printer.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\io\strtod.h" include\google\protobuf\io\strtod.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\io\tokenizer.h" include\google\protobuf\io\tokenizer.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\io\zero_copy_stream.h" include\google\protobuf\io\zero_copy_stream.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\io\zero_copy_stream_impl.h" include\google\protobuf\io\zero_copy_stream_impl.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\io\zero_copy_stream_impl_lite.h" include\google\protobuf\io\zero_copy_stream_impl_lite.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\map.h" include\google\protobuf\map.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\map_entry.h" include\google\protobuf\map_entry.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\map_entry_lite.h" include\google\protobuf\map_entry_lite.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\map_field.h" include\google\protobuf\map_field.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\map_field_inl.h" include\google\protobuf\map_field_inl.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\map_field_lite.h" include\google\protobuf\map_field_lite.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\map_type_handler.h" include\google\protobuf\map_type_handler.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\message.h" include\google\protobuf\message.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\message_lite.h" include\google\protobuf\message_lite.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\metadata.h" include\google\protobuf\metadata.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\metadata_lite.h" include\google\protobuf\metadata_lite.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\parse_context.h" include\google\protobuf\parse_context.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\port.h" include\google\protobuf\port.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\port_def.inc" include\google\protobuf\port_def.inc
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\port_undef.inc" include\google\protobuf\port_undef.inc
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\reflection.h" include\google\protobuf\reflection.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\reflection_ops.h" include\google\protobuf\reflection_ops.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\repeated_field.h" include\google\protobuf\repeated_field.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\repeated_ptr_field.h" include\google\protobuf\repeated_ptr_field.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\service.h" include\google\protobuf\service.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\source_context.pb.h" include\google\protobuf\source_context.pb.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\struct.pb.h" include\google\protobuf\struct.pb.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\bytestream.h" include\google\protobuf\stubs\bytestream.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\callback.h" include\google\protobuf\stubs\callback.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\casts.h" include\google\protobuf\stubs\casts.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\common.h" include\google\protobuf\stubs\common.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\hash.h" include\google\protobuf\stubs\hash.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\logging.h" include\google\protobuf\stubs\logging.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\macros.h" include\google\protobuf\stubs\macros.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\map_util.h" include\google\protobuf\stubs\map_util.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\mutex.h" include\google\protobuf\stubs\mutex.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\once.h" include\google\protobuf\stubs\once.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\platform_macros.h" include\google\protobuf\stubs\platform_macros.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\port.h" include\google\protobuf\stubs\port.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\status.h" include\google\protobuf\stubs\status.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\stl_util.h" include\google\protobuf\stubs\stl_util.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\stringpiece.h" include\google\protobuf\stubs\stringpiece.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\strutil.h" include\google\protobuf\stubs\strutil.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\template_util.h" include\google\protobuf\stubs\template_util.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\text_format.h" include\google\protobuf\text_format.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\timestamp.pb.h" include\google\protobuf\timestamp.pb.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\type.pb.h" include\google\protobuf\type.pb.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\unknown_field_set.h" include\google\protobuf\unknown_field_set.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\util\delimited_message_util.h" include\google\protobuf\util\delimited_message_util.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\util\field_comparator.h" include\google\protobuf\util\field_comparator.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\util\field_mask_util.h" include\google\protobuf\util\field_mask_util.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\util\json_util.h" include\google\protobuf\util\json_util.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\util\message_differencer.h" include\google\protobuf\util\message_differencer.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\util\time_util.h" include\google\protobuf\util\time_util.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\util\type_resolver.h" include\google\protobuf\util\type_resolver.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\util\type_resolver_util.h" include\google\protobuf\util\type_resolver_util.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\wire_format.h" include\google\protobuf\wire_format.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\wire_format_lite.h" include\google\protobuf\wire_format_lite.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\wrappers.pb.h" include\google\protobuf\wrappers.pb.h
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\any.proto" include\google\protobuf\any.proto
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\api.proto" include\google\protobuf\api.proto
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\plugin.proto" include\google\protobuf\compiler\plugin.proto
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\descriptor.proto" include\google\protobuf\descriptor.proto
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\duration.proto" include\google\protobuf\duration.proto
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\empty.proto" include\google\protobuf\empty.proto
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\field_mask.proto" include\google\protobuf\field_mask.proto
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\source_context.proto" include\google\protobuf\source_context.proto
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\struct.proto" include\google\protobuf\struct.proto
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\timestamp.proto" include\google\protobuf\timestamp.proto
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\type.proto" include\google\protobuf\type.proto
-copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\wrappers.proto" include\google\protobuf\wrappers.proto
diff --git a/cmake/install.cmake b/cmake/install.cmake
index 825cb25..26a55be 100644
--- a/cmake/install.cmake
+++ b/cmake/install.cmake
@@ -43,106 +43,65 @@
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/protobuf.pc ${CMAKE_CURRENT_BINARY_DIR}/protobuf-lite.pc DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
-file(STRINGS ${protobuf_SOURCE_DIR}/cmake/extract_includes.bat.in _extract_strings
- REGEX "^copy")
-foreach(_extract_string ${_extract_strings})
- string(REGEX REPLACE "^.* .+ include\\\\(.+)$" "\\1"
- _header ${_extract_string})
- string(REPLACE "\\" "/" _header ${_header})
+include(${protobuf_SOURCE_DIR}/src/file_lists.cmake)
+set(protobuf_HEADERS
+ ${libprotobuf_hdrs}
+ ${libprotoc_hdrs}
+ ${wkt_protos_proto_srcs}
+ ${descriptor_proto_proto_srcs}
+ ${plugin_proto_proto_srcs}
+)
+foreach(_header ${protobuf_HEADERS})
+ string(REPLACE "${protobuf_SOURCE_DIR}/src" "" _header ${_header})
get_filename_component(_extract_from "${protobuf_SOURCE_DIR}/src/${_header}" ABSOLUTE)
get_filename_component(_extract_name ${_header} NAME)
get_filename_component(_extract_to "${CMAKE_INSTALL_INCLUDEDIR}/${_header}" DIRECTORY)
- if(EXISTS "${_extract_from}")
- install(FILES "${_extract_from}"
- DESTINATION "${_extract_to}"
- COMPONENT protobuf-headers
- RENAME "${_extract_name}")
- else()
- message(AUTHOR_WARNING "The file \"${_extract_from}\" is listed in "
- "\"${protobuf_SOURCE_DIR}/cmake/extract_includes.bat.in\" "
- "but there not exists. The file will not be installed.")
- endif()
-endforeach()
-
-# Internal function for parsing auto tools scripts
-function(_protobuf_auto_list FILE_NAME VARIABLE)
- file(STRINGS ${FILE_NAME} _strings)
- set(_list)
- foreach(_string ${_strings})
- set(_found)
- string(REGEX MATCH "^[ \t]*${VARIABLE}[ \t]*=[ \t]*" _found "${_string}")
- if(_found)
- string(LENGTH "${_found}" _length)
- string(SUBSTRING "${_string}" ${_length} -1 _draft_list)
- foreach(_item ${_draft_list})
- string(STRIP "${_item}" _item)
- list(APPEND _list "${_item}")
- endforeach()
- endif()
- endforeach()
- set(${VARIABLE} ${_list} PARENT_SCOPE)
-endfunction()
-
-# Install well-known type proto files
-_protobuf_auto_list("${protobuf_SOURCE_DIR}/src/Makefile.am" nobase_dist_proto_DATA)
-foreach(_file ${nobase_dist_proto_DATA})
- get_filename_component(_file_from "${protobuf_SOURCE_DIR}/src/${_file}" ABSOLUTE)
- get_filename_component(_file_name ${_file} NAME)
- get_filename_component(_dir ${_file} DIRECTORY)
- if(EXISTS "${_file_from}")
- install(FILES "${_file_from}"
- DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${_dir}"
- COMPONENT protobuf-protos
- RENAME "${_file_name}")
- else()
- message(AUTHOR_WARNING "The file \"${_file_from}\" is listed in "
- "\"${protobuf_SOURCE_DIR}/src/Makefile.am\" as nobase_dist_proto_DATA "
- "but there not exists. The file will not be installed.")
- endif()
+ install(FILES "${_extract_from}"
+ DESTINATION "${_extract_to}"
+ COMPONENT protobuf-headers
+ RENAME "${_extract_name}")
endforeach()
# Install configuration
-set(_cmakedir_desc "Directory relative to CMAKE_INSTALL to install the cmake configuration files")
+set(_install_cmakedir_desc "Directory relative to CMAKE_INSTALL to install the cmake configuration files")
+set(_build_cmakedir_desc "Directory relative to CMAKE_CURRENT_BINARY_DIR for cmake configuration files")
set(_exampledir_desc "Directory relative to CMAKE_INSTALL_DATA to install examples")
+set(_protobuf_subdir_desc "Subdirectory in which to install cmake configuration files")
if(NOT MSVC)
- set(CMAKE_INSTALL_CMAKEDIR "${CMAKE_INSTALL_LIBDIR}/cmake/protobuf" CACHE STRING "${_cmakedir_desc}")
+ set(protobuf_CMAKE_SUBDIR "cmake/protobuf" CACHE STRING "${_protobuf_subdir_desc}")
+ set(CMAKE_INSTALL_CMAKEDIR "${CMAKE_INSTALL_LIBDIR}/${protobuf_CMAKE_SUBDIR}" CACHE STRING "${_install_cmakedir_desc}")
set(CMAKE_INSTALL_EXAMPLEDIR "${CMAKE_INSTALL_DATADIR}/protobuf/examples" CACHE STRING "${_exampledir_desc}")
else()
+ set(protobuf_CMAKE_SUBDIR "cmake" CACHE STRING "${_protobuf_subdir_desc}")
set(CMAKE_INSTALL_CMAKEDIR "cmake" CACHE STRING "${_cmakedir_desc}")
set(CMAKE_INSTALL_EXAMPLEDIR "examples" CACHE STRING "${_exampledir_desc}")
endif()
+set(CMAKE_BUILD_CMAKEDIR "${CMAKE_CURRENT_BINARY_DIR}/${protobuf_CMAKE_SUBDIR}" CACHE STRING "${_build_cmakedir_desc}")
+mark_as_advanced(protobuf_CMAKE_SUBDIR)
+mark_as_advanced(CMAKE_BUILD_CMAKEDIR)
mark_as_advanced(CMAKE_INSTALL_CMAKEDIR)
mark_as_advanced(CMAKE_INSTALL_EXAMPLEDIR)
configure_file(${protobuf_SOURCE_DIR}/cmake/protobuf-config.cmake.in
- ${CMAKE_INSTALL_CMAKEDIR}/protobuf-config.cmake @ONLY)
+ ${CMAKE_BUILD_CMAKEDIR}/protobuf-config.cmake @ONLY)
configure_file(${protobuf_SOURCE_DIR}/cmake/protobuf-config-version.cmake.in
- ${CMAKE_INSTALL_CMAKEDIR}/protobuf-config-version.cmake @ONLY)
+ ${CMAKE_BUILD_CMAKEDIR}/protobuf-config-version.cmake @ONLY)
configure_file(${protobuf_SOURCE_DIR}/cmake/protobuf-module.cmake.in
- ${CMAKE_INSTALL_CMAKEDIR}/protobuf-module.cmake @ONLY)
+ ${CMAKE_BUILD_CMAKEDIR}/protobuf-module.cmake @ONLY)
configure_file(${protobuf_SOURCE_DIR}/cmake/protobuf-options.cmake
- ${CMAKE_INSTALL_CMAKEDIR}/protobuf-options.cmake @ONLY)
+ ${CMAKE_BUILD_CMAKEDIR}/protobuf-options.cmake @ONLY)
+configure_file(${protobuf_SOURCE_DIR}/cmake/protobuf-generate.cmake
+ ${CMAKE_BUILD_CMAKEDIR}/protobuf-generate.cmake @ONLY)
# Allows the build directory to be used as a find directory.
-if (protobuf_BUILD_PROTOC_BINARIES)
- export(TARGETS libprotobuf-lite libprotobuf libprotoc protoc
- NAMESPACE protobuf::
- FILE ${CMAKE_INSTALL_CMAKEDIR}/protobuf-targets.cmake
- )
-else (protobuf_BUILD_PROTOC_BINARIES)
- export(TARGETS libprotobuf-lite libprotobuf
- NAMESPACE protobuf::
- FILE ${CMAKE_INSTALL_CMAKEDIR}/protobuf-targets.cmake
- )
-endif (protobuf_BUILD_PROTOC_BINARIES)
-
install(EXPORT protobuf-targets
DESTINATION "${CMAKE_INSTALL_CMAKEDIR}"
NAMESPACE protobuf::
- COMPONENT protobuf-export)
+ COMPONENT protobuf-export
+)
-install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_INSTALL_CMAKEDIR}/
+install(DIRECTORY ${CMAKE_BUILD_CMAKEDIR}/
DESTINATION "${CMAKE_INSTALL_CMAKEDIR}"
COMPONENT protobuf-export
PATTERN protobuf-targets.cmake EXCLUDE
diff --git a/cmake/libprotobuf-lite.cmake b/cmake/libprotobuf-lite.cmake
index 83e9703..0dc8457 100644
--- a/cmake/libprotobuf-lite.cmake
+++ b/cmake/libprotobuf-lite.cmake
@@ -1,93 +1,11 @@
-set(libprotobuf_lite_files
- ${protobuf_SOURCE_DIR}/src/google/protobuf/any_lite.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/arena.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/arenastring.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/arenaz_sampler.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/extension_set.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/generated_enum_util.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/generated_message_tctable_lite.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/generated_message_util.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/implicit_weak_message.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/inlined_string_field.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/io/coded_stream.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/io/io_win32.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/io/strtod.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/io/zero_copy_stream.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/io/zero_copy_stream_impl.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/io/zero_copy_stream_impl_lite.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/map.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/message_lite.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/parse_context.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/repeated_field.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/repeated_ptr_field.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/bytestream.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/common.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/int128.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/status.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/statusor.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/stringpiece.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/stringprintf.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/structurally_valid.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/strutil.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/time.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/wire_format_lite.cc
-)
+# CMake definitions for libprotobuf_lite (the "lite" C++ protobuf runtime).
-set(libprotobuf_lite_includes
- ${protobuf_SOURCE_DIR}/src/google/protobuf/any.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/arena.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/arena_impl.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/arenastring.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/arenaz_sampler.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/endian.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/explicitly_constructed.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/extension_set.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/extension_set_inl.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/generated_enum_util.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/generated_message_tctable_decl.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/generated_message_tctable_impl.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/generated_message_util.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/has_bits.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/implicit_weak_message.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/inlined_string_field.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/io/coded_stream.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/io/io_win32.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/io/strtod.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/io/zero_copy_stream.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/io/zero_copy_stream_impl.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/io/zero_copy_stream_impl_lite.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/map.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/map_entry_lite.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/map_field_lite.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/map_type_handler.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/message_lite.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/metadata_lite.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/parse_context.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/port.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/repeated_field.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/repeated_ptr_field.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/bytestream.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/callback.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/casts.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/common.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/hash.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/logging.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/macros.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/map_util.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/mutex.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/once.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/platform_macros.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/port.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/status.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/stl_util.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/stringpiece.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/strutil.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/template_util.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/wire_format_lite.h
-)
+include(${protobuf_SOURCE_DIR}/src/file_lists.cmake)
add_library(libprotobuf-lite ${protobuf_SHARED_OR_STATIC}
- ${libprotobuf_lite_files} ${libprotobuf_lite_includes} ${protobuf_version_rc_file})
+ ${libprotobuf_lite_srcs}
+ ${libprotobuf_lite_hdrs}
+ ${protobuf_version_rc_file})
if(protobuf_HAVE_LD_VERSION_SCRIPT)
if(${CMAKE_VERSION} VERSION_GREATER 3.13 OR ${CMAKE_VERSION} VERSION_EQUAL 3.13)
target_link_options(libprotobuf-lite PRIVATE -Wl,--version-script=${protobuf_SOURCE_DIR}/src/libprotobuf-lite.map)
@@ -105,6 +23,7 @@
target_link_libraries(libprotobuf-lite PRIVATE log)
endif()
target_include_directories(libprotobuf-lite PUBLIC ${protobuf_SOURCE_DIR}/src)
+target_link_libraries(libprotobuf-lite PUBLIC ${protobuf_ABSL_USED_TARGETS})
if(protobuf_BUILD_SHARED_LIBS)
target_compile_definitions(libprotobuf-lite
PUBLIC PROTOBUF_USE_DLLS
@@ -112,7 +31,6 @@
endif()
set_target_properties(libprotobuf-lite PROPERTIES
VERSION ${protobuf_VERSION}
- SOVERSION 32
OUTPUT_NAME ${LIB_PREFIX}protobuf-lite
DEBUG_POSTFIX "${protobuf_DEBUG_POSTFIX}")
add_library(protobuf::libprotobuf-lite ALIAS libprotobuf-lite)
diff --git a/cmake/libprotobuf.cmake b/cmake/libprotobuf.cmake
index 07e4bcf..19d6030 100644
--- a/cmake/libprotobuf.cmake
+++ b/cmake/libprotobuf.cmake
@@ -1,106 +1,11 @@
-set(libprotobuf_files
- ${protobuf_SOURCE_DIR}/src/google/protobuf/any.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/any.pb.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/api.pb.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/importer.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/parser.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/descriptor.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/descriptor.pb.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/descriptor_database.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/duration.pb.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/dynamic_message.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/empty.pb.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/extension_set_heavy.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/field_mask.pb.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/generated_message_bases.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/generated_message_reflection.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/generated_message_tctable_full.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/io/gzip_stream.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/io/printer.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/io/tokenizer.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/map_field.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/message.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/reflection_ops.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/service.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/source_context.pb.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/struct.pb.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/substitute.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/text_format.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/timestamp.pb.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/type.pb.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/unknown_field_set.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/delimited_message_util.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/field_comparator.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/field_mask_util.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/datapiece.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/default_value_objectwriter.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/error_listener.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/field_mask_utility.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/json_escaping.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/json_objectwriter.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/json_stream_parser.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/object_writer.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/proto_writer.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/protostream_objectsource.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/protostream_objectwriter.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/type_info.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/utility.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/json_util.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/message_differencer.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/time_util.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/type_resolver_util.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/wire_format.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/wrappers.pb.cc
-)
+# CMake definitions for libprotobuf (the "full" C++ protobuf runtime).
-set(libprotobuf_includes
- ${protobuf_SOURCE_DIR}/src/google/protobuf/any.pb.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/api.pb.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/importer.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/parser.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/descriptor.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/descriptor.pb.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/descriptor_database.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/duration.pb.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/dynamic_message.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/empty.pb.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/field_access_listener.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/field_mask.pb.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/generated_enum_reflection.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/generated_message_bases.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/generated_message_reflection.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/io/gzip_stream.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/io/printer.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/io/tokenizer.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/map_entry.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/map_field.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/map_field_inl.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/message.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/metadata.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/reflection.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/reflection_internal.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/reflection_ops.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/service.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/source_context.pb.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/struct.pb.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/text_format.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/timestamp.pb.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/type.pb.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/unknown_field_set.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/delimited_message_util.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/field_comparator.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/field_mask_util.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/json_util.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/message_differencer.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/time_util.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/type_resolver.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/type_resolver_util.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/wire_format.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/wrappers.pb.h
-)
+include(${protobuf_SOURCE_DIR}/src/file_lists.cmake)
add_library(libprotobuf ${protobuf_SHARED_OR_STATIC}
- ${libprotobuf_lite_files} ${libprotobuf_files} ${libprotobuf_includes} ${protobuf_version_rc_file})
+ ${libprotobuf_srcs}
+ ${libprotobuf_hdrs}
+ ${protobuf_version_rc_file})
if(protobuf_HAVE_LD_VERSION_SCRIPT)
if(${CMAKE_VERSION} VERSION_GREATER 3.13 OR ${CMAKE_VERSION} VERSION_EQUAL 3.13)
target_link_options(libprotobuf PRIVATE -Wl,--version-script=${protobuf_SOURCE_DIR}/src/libprotobuf.map)
@@ -121,6 +26,7 @@
target_link_libraries(libprotobuf PRIVATE log)
endif()
target_include_directories(libprotobuf PUBLIC ${protobuf_SOURCE_DIR}/src)
+target_link_libraries(libprotobuf PUBLIC ${protobuf_ABSL_USED_TARGETS})
if(protobuf_BUILD_SHARED_LIBS)
target_compile_definitions(libprotobuf
PUBLIC PROTOBUF_USE_DLLS
@@ -128,7 +34,6 @@
endif()
set_target_properties(libprotobuf PROPERTIES
VERSION ${protobuf_VERSION}
- SOVERSION 32
OUTPUT_NAME ${LIB_PREFIX}protobuf
DEBUG_POSTFIX "${protobuf_DEBUG_POSTFIX}")
add_library(protobuf::libprotobuf ALIAS libprotobuf)
diff --git a/cmake/libprotoc.cmake b/cmake/libprotoc.cmake
index 15a47e5..3be0df3 100644
--- a/cmake/libprotoc.cmake
+++ b/cmake/libprotoc.cmake
@@ -1,117 +1,11 @@
-set(libprotoc_files
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/code_generator.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/command_line_interface.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/enum.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/enum_field.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/extension.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/field.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/file.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/generator.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/helpers.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/map_field.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/message.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/message_field.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/padding_optimizer.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/parse_function_generator.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/primitive_field.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/service.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/string_field.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_doc_comment.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_enum.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_enum_field.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_field_base.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_generator.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_helpers.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_map_field.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_message.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_message_field.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_primitive_field.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_reflection_class.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_repeated_message_field.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_source_generator_base.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_wrapper_field.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/context.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/doc_comment.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/enum.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/enum_field.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/enum_field_lite.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/enum_lite.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/extension.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/extension_lite.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/field.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/file.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/generator.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/generator_factory.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/helpers.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/kotlin_generator.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/map_field.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/map_field_lite.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/message.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/message_builder.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/message_builder_lite.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/message_field.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/message_field_lite.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/message_lite.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/name_resolver.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/primitive_field.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/primitive_field_lite.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/service.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/shared_code_generator.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/string_field.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/string_field_lite.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/objectivec/objectivec_enum.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/objectivec/objectivec_enum_field.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/objectivec/objectivec_extension.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/objectivec/objectivec_field.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/objectivec/objectivec_file.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/objectivec/objectivec_generator.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/objectivec/objectivec_helpers.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/objectivec/objectivec_map_field.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/objectivec/objectivec_message.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/objectivec/objectivec_message_field.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/objectivec/objectivec_oneof.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/objectivec/objectivec_primitive_field.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/php/php_generator.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/plugin.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/plugin.pb.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/python/generator.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/python/helpers.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/python/pyi_generator.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/ruby/ruby_generator.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/subprocess.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/zip_writer.cc
-)
+# CMake definitions for libprotoc (the protobuf compiler library).
-set(libprotoc_headers
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/code_generator.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/command_line_interface.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/cpp_generator.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/file.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/generator.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/helpers.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/names.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_doc_comment.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_generator.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_names.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_options.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/generator.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/java_generator.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/kotlin_generator.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/names.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/objectivec/objectivec_generator.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/objectivec/objectivec_helpers.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/php/php_generator.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/plugin.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/python/generator.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/python/pyi_generator.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/python/python_generator.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/ruby/ruby_generator.h
-)
+include(${protobuf_SOURCE_DIR}/src/file_lists.cmake)
add_library(libprotoc ${protobuf_SHARED_OR_STATIC}
- ${libprotoc_files} ${libprotoc_headers} ${protobuf_version_rc_file})
+ ${libprotoc_srcs}
+ ${libprotoc_hdrs}
+ ${protobuf_version_rc_file})
if(protobuf_HAVE_LD_VERSION_SCRIPT)
if(${CMAKE_VERSION} VERSION_GREATER 3.13 OR ${CMAKE_VERSION} VERSION_EQUAL 3.13)
target_link_options(libprotoc PRIVATE -Wl,--version-script=${protobuf_SOURCE_DIR}/src/libprotoc.map)
@@ -122,6 +16,7 @@
LINK_DEPENDS ${protobuf_SOURCE_DIR}/src/libprotoc.map)
endif()
target_link_libraries(libprotoc PRIVATE libprotobuf)
+target_link_libraries(libprotoc PUBLIC ${protobuf_ABSL_USED_TARGETS})
if(protobuf_BUILD_SHARED_LIBS)
target_compile_definitions(libprotoc
PUBLIC PROTOBUF_USE_DLLS
@@ -130,7 +25,6 @@
set_target_properties(libprotoc PROPERTIES
COMPILE_DEFINITIONS LIBPROTOC_EXPORTS
VERSION ${protobuf_VERSION}
- SOVERSION 32
OUTPUT_NAME ${LIB_PREFIX}protoc
DEBUG_POSTFIX "${protobuf_DEBUG_POSTFIX}")
add_library(protobuf::libprotoc ALIAS libprotoc)
diff --git a/cmake/protobuf-config.cmake.in b/cmake/protobuf-config.cmake.in
index 6166911..1a8d243 100644
--- a/cmake/protobuf-config.cmake.in
+++ b/cmake/protobuf-config.cmake.in
@@ -3,165 +3,13 @@
# Depend packages
@_protobuf_FIND_ZLIB@
+@_protobuf_FIND_ABSL@
# Imported targets
include("${CMAKE_CURRENT_LIST_DIR}/protobuf-targets.cmake")
-function(protobuf_generate)
- include(CMakeParseArguments)
-
- set(_options APPEND_PATH)
- set(_singleargs LANGUAGE OUT_VAR EXPORT_MACRO PROTOC_OUT_DIR PLUGIN PLUGIN_OPTIONS)
- if(COMMAND target_sources)
- list(APPEND _singleargs TARGET)
- endif()
- set(_multiargs PROTOS IMPORT_DIRS GENERATE_EXTENSIONS PROTOC_OPTIONS)
-
- cmake_parse_arguments(protobuf_generate "${_options}" "${_singleargs}" "${_multiargs}" "${ARGN}")
-
- if(NOT protobuf_generate_PROTOS AND NOT protobuf_generate_TARGET)
- message(SEND_ERROR "Error: protobuf_generate called without any targets or source files")
- return()
- endif()
-
- if(NOT protobuf_generate_OUT_VAR AND NOT protobuf_generate_TARGET)
- message(SEND_ERROR "Error: protobuf_generate called without a target or output variable")
- return()
- endif()
-
- if(NOT protobuf_generate_LANGUAGE)
- set(protobuf_generate_LANGUAGE cpp)
- endif()
- string(TOLOWER ${protobuf_generate_LANGUAGE} protobuf_generate_LANGUAGE)
-
- if(NOT protobuf_generate_PROTOC_OUT_DIR)
- set(protobuf_generate_PROTOC_OUT_DIR ${CMAKE_CURRENT_BINARY_DIR})
- endif()
-
- if(protobuf_generate_EXPORT_MACRO AND protobuf_generate_LANGUAGE STREQUAL cpp)
- set(_dll_export_decl "dllexport_decl=${protobuf_generate_EXPORT_MACRO}")
- endif()
-
- foreach(_option ${_dll_export_decl} ${protobuf_generate_PLUGIN_OPTIONS})
- # append comma - not using CMake lists and string replacement as users
- # might have semicolons in options
- if(_plugin_options)
- set( _plugin_options "${_plugin_options},")
- endif()
- set(_plugin_options "${_plugin_options}${_option}")
- endforeach()
-
- if(protobuf_generate_PLUGIN)
- set(_plugin "--plugin=${protobuf_generate_PLUGIN}")
- endif()
-
- if(NOT protobuf_generate_GENERATE_EXTENSIONS)
- if(protobuf_generate_LANGUAGE STREQUAL cpp)
- set(protobuf_generate_GENERATE_EXTENSIONS .pb.h .pb.cc)
- elseif(protobuf_generate_LANGUAGE STREQUAL python)
- set(protobuf_generate_GENERATE_EXTENSIONS _pb2.py)
- else()
- message(SEND_ERROR "Error: protobuf_generate given unknown Language ${LANGUAGE}, please provide a value for GENERATE_EXTENSIONS")
- return()
- endif()
- endif()
-
- if(protobuf_generate_TARGET)
- get_target_property(_source_list ${protobuf_generate_TARGET} SOURCES)
- foreach(_file ${_source_list})
- if(_file MATCHES "proto$")
- list(APPEND protobuf_generate_PROTOS ${_file})
- endif()
- endforeach()
- endif()
-
- if(NOT protobuf_generate_PROTOS)
- message(SEND_ERROR "Error: protobuf_generate could not find any .proto files")
- return()
- endif()
-
- if(protobuf_generate_APPEND_PATH)
- # Create an include path for each file specified
- foreach(_file ${protobuf_generate_PROTOS})
- get_filename_component(_abs_file ${_file} ABSOLUTE)
- get_filename_component(_abs_dir ${_abs_file} DIRECTORY)
- list(FIND _protobuf_include_path ${_abs_dir} _contains_already)
- if(${_contains_already} EQUAL -1)
- list(APPEND _protobuf_include_path -I ${_abs_dir})
- endif()
- endforeach()
- endif()
-
- foreach(DIR ${protobuf_generate_IMPORT_DIRS})
- get_filename_component(ABS_PATH ${DIR} ABSOLUTE)
- list(FIND _protobuf_include_path ${ABS_PATH} _contains_already)
- if(${_contains_already} EQUAL -1)
- list(APPEND _protobuf_include_path -I ${ABS_PATH})
- endif()
- endforeach()
-
- if(NOT _protobuf_include_path)
- set(_protobuf_include_path -I ${CMAKE_CURRENT_SOURCE_DIR})
- endif()
-
- set(_generated_srcs_all)
- foreach(_proto ${protobuf_generate_PROTOS})
- get_filename_component(_abs_file ${_proto} ABSOLUTE)
- get_filename_component(_abs_dir ${_abs_file} DIRECTORY)
-
- get_filename_component(_file_full_name ${_proto} NAME)
- string(FIND "${_file_full_name}" "." _file_last_ext_pos REVERSE)
- string(SUBSTRING "${_file_full_name}" 0 ${_file_last_ext_pos} _basename)
-
- set(_suitable_include_found FALSE)
- foreach(DIR ${_protobuf_include_path})
- if(NOT DIR STREQUAL "-I")
- file(RELATIVE_PATH _rel_dir ${DIR} ${_abs_dir})
- string(FIND "${_rel_dir}" "../" _is_in_parent_folder)
- if (NOT ${_is_in_parent_folder} EQUAL 0)
- set(_suitable_include_found TRUE)
- break()
- endif()
- endif()
- endforeach()
-
- if(NOT _suitable_include_found)
- message(SEND_ERROR "Error: protobuf_generate could not find any correct proto include directory.")
- return()
- endif()
-
- set(_generated_srcs)
- foreach(_ext ${protobuf_generate_GENERATE_EXTENSIONS})
- list(APPEND _generated_srcs "${protobuf_generate_PROTOC_OUT_DIR}/${_rel_dir}/${_basename}${_ext}")
- endforeach()
- list(APPEND _generated_srcs_all ${_generated_srcs})
-
- set(_comment "Running ${protobuf_generate_LANGUAGE} protocol buffer compiler on ${_proto}")
- if(protobuf_generate_PROTOC_OPTIONS)
- set(_comment "${_comment}, protoc-options: ${protobuf_generate_PROTOC_OPTIONS}")
- endif()
- if(_plugin_options)
- set(_comment "${_comment}, plugin-options: ${_plugin_options}")
- endif()
-
- add_custom_command(
- OUTPUT ${_generated_srcs}
- COMMAND protobuf::protoc
- ARGS ${protobuf_generate_PROTOC_OPTIONS} --${protobuf_generate_LANGUAGE}_out ${_plugin_options}:${protobuf_generate_PROTOC_OUT_DIR} ${_plugin} ${_protobuf_include_path} ${_abs_file}
- DEPENDS ${_abs_file} protobuf::protoc
- COMMENT ${_comment}
- VERBATIM )
- endforeach()
-
- set_source_files_properties(${_generated_srcs_all} PROPERTIES GENERATED TRUE)
- if(protobuf_generate_OUT_VAR)
- set(${protobuf_generate_OUT_VAR} ${_generated_srcs_all} PARENT_SCOPE)
- endif()
- if(protobuf_generate_TARGET)
- target_sources(${protobuf_generate_TARGET} PRIVATE ${_generated_srcs_all})
- endif()
-
-endfunction()
+# protobuf-generate function
+include("${CMAKE_CURRENT_LIST_DIR}/protobuf-generate.cmake")
# CMake FindProtobuf module compatible file
if(protobuf_MODULE_COMPATIBLE)
diff --git a/cmake/protobuf-generate.cmake b/cmake/protobuf-generate.cmake
new file mode 100644
index 0000000..10fd616
--- /dev/null
+++ b/cmake/protobuf-generate.cmake
@@ -0,0 +1,155 @@
+function(protobuf_generate)
+ include(CMakeParseArguments)
+
+ set(_options APPEND_PATH)
+ set(_singleargs LANGUAGE OUT_VAR EXPORT_MACRO PROTOC_OUT_DIR PLUGIN PLUGIN_OPTIONS DEPENDENCIES)
+ if(COMMAND target_sources)
+ list(APPEND _singleargs TARGET)
+ endif()
+ set(_multiargs PROTOS IMPORT_DIRS GENERATE_EXTENSIONS PROTOC_OPTIONS)
+
+ cmake_parse_arguments(protobuf_generate "${_options}" "${_singleargs}" "${_multiargs}" "${ARGN}")
+
+ if(NOT protobuf_generate_PROTOS AND NOT protobuf_generate_TARGET)
+ message(SEND_ERROR "Error: protobuf_generate called without any targets or source files")
+ return()
+ endif()
+
+ if(NOT protobuf_generate_OUT_VAR AND NOT protobuf_generate_TARGET)
+ message(SEND_ERROR "Error: protobuf_generate called without a target or output variable")
+ return()
+ endif()
+
+ if(NOT protobuf_generate_LANGUAGE)
+ set(protobuf_generate_LANGUAGE cpp)
+ endif()
+ string(TOLOWER ${protobuf_generate_LANGUAGE} protobuf_generate_LANGUAGE)
+
+ if(NOT protobuf_generate_PROTOC_OUT_DIR)
+ set(protobuf_generate_PROTOC_OUT_DIR ${CMAKE_CURRENT_BINARY_DIR})
+ endif()
+
+ if(protobuf_generate_EXPORT_MACRO AND protobuf_generate_LANGUAGE STREQUAL cpp)
+ set(_dll_export_decl "dllexport_decl=${protobuf_generate_EXPORT_MACRO}")
+ endif()
+
+ foreach(_option ${_dll_export_decl} ${protobuf_generate_PLUGIN_OPTIONS})
+ # append comma - not using CMake lists and string replacement as users
+ # might have semicolons in options
+ if(_plugin_options)
+ set( _plugin_options "${_plugin_options},")
+ endif()
+ set(_plugin_options "${_plugin_options}${_option}")
+ endforeach()
+
+ if(protobuf_generate_PLUGIN)
+ set(_plugin "--plugin=${protobuf_generate_PLUGIN}")
+ endif()
+
+ if(NOT protobuf_generate_GENERATE_EXTENSIONS)
+ if(protobuf_generate_LANGUAGE STREQUAL cpp)
+ set(protobuf_generate_GENERATE_EXTENSIONS .pb.h .pb.cc)
+ elseif(protobuf_generate_LANGUAGE STREQUAL python)
+ set(protobuf_generate_GENERATE_EXTENSIONS _pb2.py)
+ else()
+ message(SEND_ERROR "Error: protobuf_generate given unknown Language ${LANGUAGE}, please provide a value for GENERATE_EXTENSIONS")
+ return()
+ endif()
+ endif()
+
+ if(protobuf_generate_TARGET)
+ get_target_property(_source_list ${protobuf_generate_TARGET} SOURCES)
+ foreach(_file ${_source_list})
+ if(_file MATCHES "proto$")
+ list(APPEND protobuf_generate_PROTOS ${_file})
+ endif()
+ endforeach()
+ endif()
+
+ if(NOT protobuf_generate_PROTOS)
+ message(SEND_ERROR "Error: protobuf_generate could not find any .proto files")
+ return()
+ endif()
+
+ if(protobuf_generate_APPEND_PATH)
+ # Create an include path for each file specified
+ foreach(_file ${protobuf_generate_PROTOS})
+ get_filename_component(_abs_file ${_file} ABSOLUTE)
+ get_filename_component(_abs_dir ${_abs_file} DIRECTORY)
+ list(FIND _protobuf_include_path ${_abs_dir} _contains_already)
+ if(${_contains_already} EQUAL -1)
+ list(APPEND _protobuf_include_path -I ${_abs_dir})
+ endif()
+ endforeach()
+ endif()
+
+ foreach(DIR ${protobuf_generate_IMPORT_DIRS})
+ get_filename_component(ABS_PATH ${DIR} ABSOLUTE)
+ list(FIND _protobuf_include_path ${ABS_PATH} _contains_already)
+ if(${_contains_already} EQUAL -1)
+ list(APPEND _protobuf_include_path -I ${ABS_PATH})
+ endif()
+ endforeach()
+
+ if(NOT _protobuf_include_path)
+ set(_protobuf_include_path -I ${CMAKE_CURRENT_SOURCE_DIR})
+ endif()
+
+ set(_generated_srcs_all)
+ foreach(_proto ${protobuf_generate_PROTOS})
+ get_filename_component(_abs_file ${_proto} ABSOLUTE)
+ get_filename_component(_abs_dir ${_abs_file} DIRECTORY)
+
+ get_filename_component(_file_full_name ${_proto} NAME)
+ string(FIND "${_file_full_name}" "." _file_last_ext_pos REVERSE)
+ string(SUBSTRING "${_file_full_name}" 0 ${_file_last_ext_pos} _basename)
+
+ set(_suitable_include_found FALSE)
+ foreach(DIR ${_protobuf_include_path})
+ if(NOT DIR STREQUAL "-I")
+ file(RELATIVE_PATH _rel_dir ${DIR} ${_abs_dir})
+ string(FIND "${_rel_dir}" "../" _is_in_parent_folder)
+ if (NOT ${_is_in_parent_folder} EQUAL 0)
+ set(_suitable_include_found TRUE)
+ break()
+ endif()
+ endif()
+ endforeach()
+
+ if(NOT _suitable_include_found)
+ message(SEND_ERROR "Error: protobuf_generate could not find any correct proto include directory.")
+ return()
+ endif()
+
+ set(_generated_srcs)
+ foreach(_ext ${protobuf_generate_GENERATE_EXTENSIONS})
+ list(APPEND _generated_srcs "${protobuf_generate_PROTOC_OUT_DIR}/${_rel_dir}/${_basename}${_ext}")
+ endforeach()
+ list(APPEND _generated_srcs_all ${_generated_srcs})
+
+ set(_comment "Running ${protobuf_generate_LANGUAGE} protocol buffer compiler on ${_proto}")
+ if(protobuf_generate_PROTOC_OPTIONS)
+ set(_comment "${_comment}, protoc-options: ${protobuf_generate_PROTOC_OPTIONS}")
+ endif()
+ if(_plugin_options)
+ set(_comment "${_comment}, plugin-options: ${_plugin_options}")
+ endif()
+
+ add_custom_command(
+ OUTPUT ${_generated_srcs}
+ COMMAND protobuf::protoc
+ ARGS ${protobuf_generate_PROTOC_OPTIONS} --${protobuf_generate_LANGUAGE}_out ${_plugin_options}:${protobuf_generate_PROTOC_OUT_DIR} ${_plugin} ${_protobuf_include_path} ${_abs_file}
+ DEPENDS ${_abs_file} protobuf::protoc ${protobuf_generate_DEPENDENCIES}
+ COMMENT ${_comment}
+ VERBATIM )
+ endforeach()
+
+ set_source_files_properties(${_generated_srcs_all} PROPERTIES GENERATED TRUE)
+ if(protobuf_generate_OUT_VAR)
+ set(${protobuf_generate_OUT_VAR} ${_generated_srcs_all} PARENT_SCOPE)
+ endif()
+ if(protobuf_generate_TARGET)
+ target_sources(${protobuf_generate_TARGET} PRIVATE ${_generated_srcs_all})
+ endif()
+
+endfunction()
diff --git a/cmake/protoc.cmake b/cmake/protoc.cmake
index 472b642..385a7a3 100644
--- a/cmake/protoc.cmake
+++ b/cmake/protoc.cmake
@@ -6,6 +6,7 @@
target_link_libraries(protoc
libprotoc
libprotobuf
+ ${protobuf_ABSL_USED_TARGETS}
)
add_executable(protobuf::protoc ALIAS protoc)
diff --git a/cmake/push_auto_update.sh b/cmake/push_auto_update.sh
new file mode 100755
index 0000000..abae4f4
--- /dev/null
+++ b/cmake/push_auto_update.sh
@@ -0,0 +1,41 @@
+#!/bin/bash
+
+# This script updates the CMake file lists (i.e. src/file_lists.cmake), commits
+# the resulting change, and pushes it. This does not do anything useful when
+# run manually, but should be run by our GitHub action instead.
+
+set -ex
+
+# Exit early if the previous commit was made by the bot. This reduces the risk
+# of a bug causing an infinite loop of auto-generated commits.
+if (git log -1 --pretty=format:'%an' | grep -q "Protobuf Team Bot"); then
+ echo "Previous commit was authored by bot"
+ exit 0
+fi
+
+$(dirname -- "$0")/update_file_lists.sh
+
+# Try to determine the most recent pull request number.
+title=$(git log -1 --pretty='%s')
+pr_from_merge=$(echo "$title" | sed -n 's/^Merge pull request #\([0-9]\+\).*/\1/p')
+pr_from_squash=$(echo "$title" | sed -n 's/^.*(#\([0-9]\+\))$/\1/p')
+
+pr=""
+if [ ! -z "$pr_from_merge" ]; then
+ pr="$pr_from_merge"
+elif [ ! -z "$pr_from_squash" ]; then
+ pr="$pr_from_squash"
+fi
+
+if [ ! -z "$pr" ]; then
+ commit_message="Auto-generate CMake file lists after PR #$pr"
+else
+ # If we are unable to determine the pull request number, we fall back on this
+ # default commit message. Typically this should not occur, but could happen
+ # if a pull request was merged via a rebase.
+ commit_message="Auto-generate CMake file lists"
+fi
+
+git add -A
+git diff --staged --quiet || git commit -am "$commit_message"
+git push
diff --git a/cmake/tests.cmake b/cmake/tests.cmake
index 1905673..530a66b 100644
--- a/cmake/tests.cmake
+++ b/cmake/tests.cmake
@@ -1,6 +1,7 @@
option(protobuf_USE_EXTERNAL_GTEST "Use external Google Test (i.e. not the one in third_party/googletest)" OFF)
-option(protobuf_TEST_XML_OUTDIR "Output directory for XML logs from tests." "")
+option(protobuf_REMOVE_INSTALLED_HEADERS
+ "Remove local headers so that installed ones are used instead" OFF)
option(protobuf_ABSOLUTE_TEST_PLUGIN_PATH
"Using absolute test_plugin path in tests" ON)
@@ -39,65 +40,23 @@
add_library(GTest::gmock_main ALIAS gmock_main)
endif()
+include(${protobuf_SOURCE_DIR}/src/file_lists.cmake)
+
set(lite_test_protos
- ${protobuf_SOURCE_DIR}/src/google/protobuf/map_lite_unittest.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_import_lite.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_import_public_lite.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_lite.proto
+ ${protobuf_lite_test_protos_files}
)
set(tests_protos
- ${protobuf_SOURCE_DIR}/src/google/protobuf/any_test.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/test_bad_identifiers.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/test_large_enum_value.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/map_proto2_unittest.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/map_unittest.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_arena.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_custom_options.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_drop_unknown_fields.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_embed_optimize_for.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_empty.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_enormous_descriptor.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_import.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_import_public.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_lazy_dependencies.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_lazy_dependencies_custom_option.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_lazy_dependencies_enum.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_lite_imports_nonlite.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_mset.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_mset_wire_format.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_no_field_presence.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_no_generic_services.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_optimize_for.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_preserve_unknown_enum.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_preserve_unknown_enum2.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_proto3.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_proto3_arena.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_proto3_arena_lite.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_proto3_lite.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_proto3_optional.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_well_known_types.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/testdata/anys.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/testdata/books.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/testdata/default_value.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/testdata/default_value_test.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/testdata/field_mask.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/testdata/maps.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/testdata/oneofs.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/testdata/proto3.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/testdata/struct.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/testdata/timestamp_duration.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/testdata/wrappers.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/json_format.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/json_format_proto3.proto
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/message_differencer_unittest.proto
+ ${protobuf_test_protos_files}
+ ${compiler_test_protos_files}
+ ${util_test_protos_files}
)
macro(compile_proto_file filename)
- string(REPLACE .proto .pb.cc pb_file ${filename})
+ string(REPLACE .proto .pb.h pb_hdr ${filename})
+ string(REPLACE .proto .pb.cc pb_src ${filename})
add_custom_command(
- OUTPUT ${pb_file}
+ OUTPUT ${pb_hdr} ${pb_src}
DEPENDS ${protobuf_PROTOC_EXE} ${filename}
COMMAND ${protobuf_PROTOC_EXE} ${filename}
--proto_path=${protobuf_SOURCE_DIR}/src
@@ -109,119 +68,41 @@
set(lite_test_proto_files)
foreach(proto_file ${lite_test_protos})
compile_proto_file(${proto_file})
- set(lite_test_proto_files ${lite_test_proto_files} ${pb_file})
+ set(lite_test_proto_files ${lite_test_proto_files} ${pb_src} ${pb_hdr})
endforeach(proto_file)
set(tests_proto_files)
foreach(proto_file ${tests_protos})
compile_proto_file(${proto_file})
- set(tests_proto_files ${tests_proto_files} ${pb_file})
+ set(tests_proto_files ${tests_proto_files} ${pb_src} ${pb_hdr})
endforeach(proto_file)
-set(common_lite_test_files
- ${protobuf_SOURCE_DIR}/src/google/protobuf/arena_test_util.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/map_lite_test_util.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/test_util_lite.cc
-)
-
add_library(protobuf-lite-test-common STATIC
- ${common_lite_test_files} ${lite_test_proto_files})
-target_link_libraries(protobuf-lite-test-common libprotobuf-lite GTest::gmock)
+ ${lite_test_util_srcs} ${lite_test_proto_files})
+target_include_directories(protobuf-lite-test-common PRIVATE ${ABSL_ROOT_DIR})
+target_link_libraries(protobuf-lite-test-common
+ ${protobuf_LIB_PROTOBUF_LITE} ${protobuf_ABSL_USED_TARGETS} GTest::gmock)
set(common_test_files
- ${common_lite_test_files}
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/mock_code_generator.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/map_test_util.inc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/reflection_tester.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/test_util.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/testing/file.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/testing/googletest.cc
+ ${test_util_hdrs}
+ ${test_util_srcs}
+ ${common_test_hdrs}
+ ${common_test_srcs}
)
add_library(protobuf-test-common STATIC
${common_test_files} ${tests_proto_files})
-target_link_libraries(protobuf-test-common libprotobuf GTest::gmock)
+target_include_directories(protobuf-test-common PRIVATE ${ABSL_ROOT_DIR})
+target_link_libraries(protobuf-test-common
+ ${protobuf_LIB_PROTOBUF} ${protobuf_ABSL_USED_TARGETS} GTest::gmock)
set(tests_files
- ${protobuf_SOURCE_DIR}/src/google/protobuf/any_test.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/arena_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/arenastring_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/arenaz_sampler_test.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/annotation_test_util.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/annotation_test_util.h
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/command_line_interface_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/bootstrap_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/message_size_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/metadata_test.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/move_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/plugin_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/unittest.inc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_bootstrap_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_generator_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/importer_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/doc_comment_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/plugin_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/objectivec/objectivec_helpers_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/parser_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/python/plugin_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/ruby/ruby_generator_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/descriptor_database_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/descriptor_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/drop_unknown_fields_test.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/dynamic_message_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/extension_set_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/generated_message_reflection_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/generated_message_tctable_lite_test.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/inlined_string_field_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/io/coded_stream_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/io/io_win32_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/io/printer_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/io/tokenizer_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/io/zero_copy_stream_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/map_field_test.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/map_test.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/map_test.inc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/message_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/message_unittest.inc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/no_field_presence_test.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/preserve_unknown_enum_test.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/proto3_arena_lite_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/proto3_arena_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/proto3_lite_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/proto3_lite_unittest.inc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/reflection_ops_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/repeated_field_reflection_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/repeated_field_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/bytestream_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/common_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/int128_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/status_test.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/statusor_test.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/stringpiece_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/stringprintf_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/structurally_valid_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/strutil_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/template_util_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/time_test.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/text_format_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/unknown_field_set_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/delimited_message_util_test.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/field_comparator_test.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/field_mask_util_test.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/default_value_objectwriter_test.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/json_objectwriter_test.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/json_stream_parser_test.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/protostream_objectsource_test.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/protostream_objectwriter_test.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/type_info_test_helper.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/json_util_test.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/message_differencer_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/time_util_test.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/util/type_resolver_util_test.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/well_known_types_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/wire_format_unittest.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/wire_format_unittest.inc
+ ${protobuf_test_files}
+ ${compiler_test_files}
+ ${annotation_test_util_srcs}
+ ${io_test_files}
+ ${util_test_files}
+ ${stubs_test_files}
)
if(protobuf_ABSOLUTE_TEST_PLUGIN_PATH)
@@ -254,41 +135,75 @@
/wd4146 # unary minus operator applied to unsigned type, result still unsigned
)
endif()
-target_link_libraries(tests protobuf-lite-test-common protobuf-test-common libprotoc libprotobuf GTest::gmock_main)
+target_link_libraries(tests protobuf-lite-test-common protobuf-test-common ${protobuf_LIB_PROTOC} ${protobuf_LIB_PROTOBUF} GTest::gmock_main)
set(test_plugin_files
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/mock_code_generator.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/test_plugin.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/testing/file.cc
- ${protobuf_SOURCE_DIR}/src/google/protobuf/testing/file.h
+ ${test_plugin_files}
+ ${common_test_hdrs}
+ ${common_test_srcs}
)
add_executable(test_plugin ${test_plugin_files})
-target_link_libraries(test_plugin libprotoc libprotobuf GTest::gmock)
-
-set(lite_test_files
- ${protobuf_SOURCE_DIR}/src/google/protobuf/lite_unittest.cc
+target_include_directories(test_plugin PRIVATE ${ABSL_ROOT_DIR})
+target_link_libraries(test_plugin
+ ${protobuf_LIB_PROTOC}
+ ${protobuf_LIB_PROTOBUF}
+ ${protobuf_ABSL_USED_TARGETS}
+ GTest::gmock
)
-add_executable(lite-test ${lite_test_files})
-target_link_libraries(lite-test protobuf-lite-test-common libprotobuf-lite GTest::gmock_main)
+
+add_executable(lite-test ${protobuf_lite_test_files})
+target_link_libraries(lite-test protobuf-lite-test-common ${protobuf_LIB_PROTOBUF_LITE} GTest::gmock_main)
add_test(NAME lite-test
COMMAND lite-test ${protobuf_GTEST_ARGS})
-set(lite_arena_test_files
- ${protobuf_SOURCE_DIR}/src/google/protobuf/lite_arena_unittest.cc
-)
-add_executable(lite-arena-test ${lite_arena_test_files})
-target_link_libraries(lite-arena-test protobuf-lite-test-common libprotobuf-lite GTest::gmock_main)
-
-add_test(NAME lite-arena-test
- COMMAND lite-arena-test ${protobuf_GTEST_ARGS})
-
add_custom_target(check
COMMAND tests
- DEPENDS tests test_plugin
+ DEPENDS tests lite-test test_plugin
WORKING_DIRECTORY ${protobuf_SOURCE_DIR})
add_test(NAME check
- COMMAND tests ${protobuf_GTEST_ARGS}
- WORKING_DIRECTORY "${protobuf_SOURCE_DIR}")
+ COMMAND tests ${protobuf_GTEST_ARGS})
+
+# For test purposes, remove headers that should already be installed. This
+# prevents accidental conflicts and also version skew (since local headers take
+# precedence over installed headers).
+add_custom_target(save-installed-headers)
+add_custom_target(remove-installed-headers)
+add_custom_target(restore-installed-headers)
+
+file(GLOB_RECURSE _local_hdrs
+ "${PROJECT_SOURCE_DIR}/src/*.h"
+ "${PROJECT_SOURCE_DIR}/src/*.inc")
+
+# Exclude the bootstrapping that are directly used by tests.
+set(_exclude_hdrs
+ "${protobuf_SOURCE_DIR}/src/google/protobuf/descriptor.pb.h"
+ "${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/plugin.pb.h")
+
+# Exclude test library headers.
+list(APPEND _exclude_hdrs ${test_util_hdrs} ${lite_test_util_hdrs} ${common_test_hdrs}
+ ${compiler_test_utils_hdrs})
+foreach(_hdr ${_exclude_hdrs})
+ list(REMOVE_ITEM _local_hdrs ${_hdr})
+endforeach()
+
+foreach(_hdr ${_local_hdrs})
+ string(REPLACE "${protobuf_SOURCE_DIR}/src" "" _file ${_hdr})
+ set(_tmp_file "${CMAKE_BINARY_DIR}/tmp-install-test/${_file}")
+ add_custom_command(TARGET remove-installed-headers PRE_BUILD
+ COMMAND ${CMAKE_COMMAND} -E remove -f "${_hdr}")
+ add_custom_command(TARGET save-installed-headers PRE_BUILD
+ COMMAND ${CMAKE_COMMAND} -E
+ copy "${_hdr}" "${_tmp_file}" || true)
+ add_custom_command(TARGET restore-installed-headers PRE_BUILD
+ COMMAND ${CMAKE_COMMAND} -E
+ copy "${_tmp_file}" "${_hdr}")
+endforeach()
+
+add_dependencies(remove-installed-headers save-installed-headers)
+if(protobuf_REMOVE_INSTALLED_HEADERS)
+ # Make sure we remove all the headers *before* any codegen occurs.
+ add_dependencies(${protobuf_PROTOC_EXE} remove-installed-headers)
+endif()
diff --git a/cmake/update_file_lists.sh b/cmake/update_file_lists.sh
new file mode 100755
index 0000000..a08bdf3
--- /dev/null
+++ b/cmake/update_file_lists.sh
@@ -0,0 +1,8 @@
+#!/bin/bash -u
+
+# This script generates file lists from Bazel for CMake.
+
+set -e
+
+bazel build //pkg:gen_src_file_lists
+cp -v bazel-bin/pkg/src_file_lists.cmake src/file_lists.cmake
diff --git a/configure.ac b/configure.ac
deleted file mode 100644
index b9e28aa..0000000
--- a/configure.ac
+++ /dev/null
@@ -1,247 +0,0 @@
-## Process this file with autoconf to produce configure.
-## In general, the safest way to proceed is to run ./autogen.sh
-
-AC_PREREQ(2.59)
-
-# Note: If you change the version, you must also update it in:
-# * Protobuf.podspec
-# * csharp/Google.Protobuf.Tools.nuspec
-# * csharp/src/*/AssemblyInfo.cs
-# * csharp/src/Google.Protobuf/Google.Protobuf.nuspec
-# * java/*/pom.xml
-# * python/google/protobuf/__init__.py
-# * protoc-artifacts/pom.xml
-# * src/google/protobuf/stubs/common.h
-# * src/Makefile.am (Update -version-info for LDFLAGS if needed)
-#
-# In the SVN trunk, the version should always be the next anticipated release
-# version with the "-pre" suffix. (We used to use "-SNAPSHOT" but this pushed
-# the size of one file name in the dist tarfile over the 99-char limit.)
-AC_INIT([Protocol Buffers],[3.21.7],[protobuf@googlegroups.com],[protobuf])
-
-AM_MAINTAINER_MODE([enable])
-
-AC_CONFIG_SRCDIR(src/google/protobuf/message.cc)
-# The config file is generated but not used by the source code, since we only
-# need very few of them, e.g. HAVE_PTHREAD and HAVE_ZLIB. Those macros are
-# passed down in CXXFLAGS manually in src/Makefile.am
-AC_CONFIG_HEADERS([config.h])
-AC_CONFIG_MACRO_DIR([m4])
-
-AC_ARG_VAR(DIST_LANG, [language to include in the distribution package (i.e., make dist)])
-case "$DIST_LANG" in
- "") DIST_LANG=all ;;
- all | cpp | csharp | java | python | javanano | objectivec | ruby | php) ;;
- *) AC_MSG_FAILURE([unknown language: $DIST_LANG]) ;;
-esac
-AC_SUBST(DIST_LANG)
-
-# autoconf's default CXXFLAGS are usually "-g -O2". These aren't necessarily
-# the best choice for libprotobuf.
-AS_IF([test "x${ac_cv_env_CFLAGS_set}" = "x"],
- [CFLAGS=""])
-AS_IF([test "x${ac_cv_env_CXXFLAGS_set}" = "x"],
- [CXXFLAGS=""])
-
-AC_CANONICAL_TARGET
-
-AM_INIT_AUTOMAKE([1.9 tar-ustar subdir-objects])
-
-# Silent rules enabled: the output is minimal but informative.
-# In particular, the warnings from the compiler stick out very clearly.
-# To see all logs, use the --disable-silent-rules on configure or via make V=1
-AM_SILENT_RULES([yes])
-
-AC_ARG_WITH([zlib],
- [AS_HELP_STRING([--with-zlib],
- [include classes for streaming compressed data in and out @<:@default=check@:>@])],
- [],[with_zlib=check])
-
-AC_ARG_WITH([zlib-include],
- [AS_HELP_STRING([--with-zlib-include=PATH],
- [zlib include directory])],
- [CPPFLAGS="-I$withval $CPPFLAGS"])
-
-AC_ARG_WITH([zlib-lib],
- [AS_HELP_STRING([--with-zlib-lib=PATH],
- [zlib lib directory])],
- [LDFLAGS="-L$withval $LDFLAGS"])
-
-AC_ARG_WITH([protoc],
- [AS_HELP_STRING([--with-protoc=COMMAND],
- [use the given protoc command instead of building a new one when building tests (useful for cross-compiling)])],
- [],[with_protoc=no])
-
-# Checks for programs.
-AC_PROG_CC
-AC_PROG_CXX
-AC_PROG_CXX_FOR_BUILD
-AC_LANG([C++])
-ACX_USE_SYSTEM_EXTENSIONS
-m4_ifdef([AM_PROG_AR], [AM_PROG_AR])
-AM_CONDITIONAL(GCC, test "$GCC" = yes) # let the Makefile know if we're gcc
-AS_CASE([$target_os], [darwin*], [AC_PROG_OBJC], [AM_CONDITIONAL([am__fastdepOBJC], [false])])
-
-# test_util.cc takes forever to compile with GCC and optimization turned on.
-AC_MSG_CHECKING([C++ compiler flags...])
-AS_IF([test "x${ac_cv_env_CXXFLAGS_set}" = "x"],[
- AS_IF([test "$GCC" = "yes"],[
- PROTOBUF_OPT_FLAG="-O2"
- CXXFLAGS="${CXXFLAGS} -g"
- ])
-
- # Protocol Buffers contains several checks that are intended to be used only
- # for debugging and which might hurt performance. Most users are probably
- # end users who don't want these checks, so add -DNDEBUG by default.
- CXXFLAGS="$CXXFLAGS -std=c++11 -DNDEBUG"
-
- AC_MSG_RESULT([use default: $PROTOBUF_OPT_FLAG $CXXFLAGS])
-],[
- AC_MSG_RESULT([use user-supplied: $CXXFLAGS])
-])
-
-AC_SUBST(PROTOBUF_OPT_FLAG)
-
-ACX_CHECK_SUNCC
-
-# Have to do libtool after SUNCC, other wise it "helpfully" adds Crun Cstd
-# to the link
-AC_PROG_LIBTOOL
-
-# Check whether the linker supports version scripts
-AC_MSG_CHECKING([whether the linker supports version scripts])
-save_LDFLAGS=$LDFLAGS
-LDFLAGS="$LDFLAGS -Wl,--version-script=conftest.map"
-cat > conftest.map <<EOF
-{
- global:
- main;
- local:
- *;
-};
-EOF
-AC_LINK_IFELSE(
- [AC_LANG_SOURCE([int main() { return 0; }])],
- [have_ld_version_script=yes; AC_MSG_RESULT(yes)],
- [have_ld_version_script=no; AC_MSG_RESULT(no)])
-LDFLAGS=$save_LDFLAGS
-AM_CONDITIONAL([HAVE_LD_VERSION_SCRIPT], [test "$have_ld_version_script" = "yes"])
-
-# Checks for header files.
-AC_HEADER_STDC
-AC_CHECK_HEADERS([fcntl.h inttypes.h limits.h stdlib.h unistd.h])
-
-# Checks for library functions.
-AC_FUNC_MEMCMP
-AC_FUNC_STRTOD
-AC_CHECK_FUNCS([ftruncate memset mkdir strchr strerror strtol])
-
-# Check for zlib.
-HAVE_ZLIB=0
-AS_IF([test "$with_zlib" != no], [
- AC_MSG_CHECKING([zlib version])
-
- # First check the zlib header version.
- AC_COMPILE_IFELSE(
- [AC_LANG_PROGRAM([[
- #include <zlib.h>
- #if !defined(ZLIB_VERNUM) || (ZLIB_VERNUM < 0x1204)
- # error zlib version too old
- #endif
- ]], [])], [
- AC_MSG_RESULT([ok (1.2.0.4 or later)])
-
- # Also need to add -lz to the linker flags and make sure this succeeds.
- AC_SEARCH_LIBS([zlibVersion], [z], [
- AC_DEFINE([HAVE_ZLIB], [1], [Enable classes using zlib compression.])
- HAVE_ZLIB=1
- ], [
- AS_IF([test "$with_zlib" != check], [
- AC_MSG_FAILURE([--with-zlib was given, but no working zlib library was found])
- ])
- ])
- ], [
- AS_IF([test "$with_zlib" = check], [
- AC_MSG_RESULT([headers missing or too old (requires 1.2.0.4)])
- ], [
- AC_MSG_FAILURE([--with-zlib was given, but zlib headers were not present or were too old (requires 1.2.0.4)])
- ])
- ])
-])
-AM_CONDITIONAL([HAVE_ZLIB], [test $HAVE_ZLIB = 1])
-
-# Add -std=c++11 if necesssary. It is important for us to do this before the
-# libatomic check below, since that also depends on C++11.
-AX_CXX_COMPILE_STDCXX([11], [noext], [mandatory])
-
-dnl On some platforms, std::atomic needs a helper library
-AC_MSG_CHECKING(whether -latomic is needed)
-AC_LINK_IFELSE([AC_LANG_SOURCE([[
- #include <atomic>
- #include <cstdint>
- std::atomic<std::int64_t> v;
- int main() {
- return v;
- }
-]])], STD_ATOMIC_NEED_LIBATOMIC=no, STD_ATOMIC_NEED_LIBATOMIC=yes)
-AC_MSG_RESULT($STD_ATOMIC_NEED_LIBATOMIC)
-if test "x$STD_ATOMIC_NEED_LIBATOMIC" = xyes; then
- LIBATOMIC_LIBS="-latomic"
-fi
-AC_SUBST([LIBATOMIC_LIBS])
-
-AS_IF([test "$with_protoc" != "no"], [
- PROTOC=$with_protoc
- AS_IF([test "$with_protoc" = "yes"], [
- # No argument given. Use system protoc.
- PROTOC=protoc
- ])
- AS_IF([echo "$PROTOC" | grep -q '^@<:@^/@:>@.*/'], [
- # Does not start with a slash, but contains a slash. So, it's a relative
- # path (as opposed to an absolute path or an executable in $PATH).
- # Since it will actually be executed from the src directory, prefix with
- # the current directory. We also insert $ac_top_build_prefix in case this
- # is a nested package and --with-protoc was actually given on the outer
- # package's configure script.
- PROTOC=`pwd`/${ac_top_build_prefix}$PROTOC
- ])
- AC_SUBST([PROTOC])
-])
-AM_CONDITIONAL([USE_EXTERNAL_PROTOC], [test "$with_protoc" != "no"])
-
-AX_PTHREAD
-AM_CONDITIONAL([HAVE_PTHREAD], [test "x$ax_pthread_ok" = "xyes"])
-# We still keep this for improving pbconfig.h for unsupported platforms.
-AC_CXX_STL_HASH
-
-# Enable ObjC support for conformance directory on OS X.
-OBJC_CONFORMANCE_TEST=0
-case "$target_os" in
- darwin*)
- OBJC_CONFORMANCE_TEST=1
- ;;
-esac
-AM_CONDITIONAL([OBJC_CONFORMANCE_TEST], [test $OBJC_CONFORMANCE_TEST = 1])
-
-AC_MSG_CHECKING(whether -llog is needed)
-ANDROID_TEST=no
-case "$target_os" in
- *android*)
- ANDROID_TEST=yes
- ;;
-esac
-AC_MSG_RESULT($ANDROID_TEST)
-if test "x$ANDROID_TEST" = xyes; then
- LIBLOG_LIBS="-llog"
-fi
-AC_SUBST([LIBLOG_LIBS])
-
-# HACK: Make gmock's configure script pick up our copy of CFLAGS and CXXFLAGS,
-# since the flags added by ACX_CHECK_SUNCC must be used when compiling gmock
-# too.
-export CFLAGS
-export CXXFLAGS
-AC_CONFIG_SUBDIRS([third_party/googletest])
-
-AC_CONFIG_FILES([Makefile src/Makefile benchmarks/Makefile conformance/Makefile protobuf.pc protobuf-lite.pc])
-AC_OUTPUT
diff --git a/conformance/BUILD.bazel b/conformance/BUILD.bazel
index 7de2b8e..5f8917d 100644
--- a/conformance/BUILD.bazel
+++ b/conformance/BUILD.bazel
@@ -1,6 +1,8 @@
# Conformance testing for Protobuf.
-load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library", "cc_proto_library")
+load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library", "cc_proto_library", "objc_library")
+load("//:protobuf.bzl", "internal_csharp_proto_library", "internal_objc_proto_library", "internal_php_proto_library", "internal_py_proto_library", "internal_ruby_proto_library")
+load("//build_defs:internal_shell.bzl", "inline_sh_binary")
load(
"@rules_pkg//:mappings.bzl",
"pkg_attributes",
@@ -10,21 +12,38 @@
)
exports_files([
- "conformance_test_runner.sh",
+ "bazel_conformance_test_runner.sh",
+ "failure_list_cpp.txt",
+ "failure_list_csharp.txt",
"failure_list_java.txt",
"failure_list_java_lite.txt",
+ "failure_list_objc.txt",
+ "failure_list_php.txt",
+ "failure_list_php_c.txt",
+ "failure_list_python.txt",
+ "failure_list_python_cpp.txt",
+ "failure_list_ruby.txt",
+ "failure_list_jruby.txt",
+ "text_format_failure_list_cpp.txt",
+ "text_format_failure_list_csharp.txt",
"text_format_failure_list_java.txt",
"text_format_failure_list_java_lite.txt",
+ "text_format_failure_list_php.txt",
+ "text_format_failure_list_php_c.txt",
+ "text_format_failure_list_python.txt",
+ "text_format_failure_list_python_cpp.txt",
+ "text_format_failure_list_ruby.txt",
+ "text_format_failure_list_jruby.txt",
])
cc_proto_library(
name = "test_messages_proto2_proto_cc",
- deps = ["//:test_messages_proto2_proto"],
+ deps = ["//src/google/protobuf:test_messages_proto2_proto"],
)
cc_proto_library(
name = "test_messages_proto3_proto_cc",
- deps = ["//:test_messages_proto3_proto"],
+ deps = ["//src/google/protobuf:test_messages_proto3_proto"],
)
proto_library(
@@ -34,10 +53,18 @@
)
cc_proto_library(
- name = "conformance_proto_cc",
+ name = "conformance_cc_proto",
deps = [":conformance_proto"],
)
+internal_csharp_proto_library(
+ name = "conformance_csharp_proto",
+ srcs = ["conformance.proto"],
+ visibility = [
+ "//csharp:__subpackages__",
+ ],
+)
+
java_proto_library(
name = "conformance_java_proto",
visibility = [
@@ -54,6 +81,51 @@
deps = [":conformance_proto"],
)
+internal_objc_proto_library(
+ name = "conformance_objc_proto",
+ srcs = ["conformance.proto"],
+ visibility = [
+ "//conformance:__pkg__",
+ "//objc:__pkg__",
+ ],
+)
+
+internal_py_proto_library(
+ name = "conformance_py_proto",
+ srcs = ["conformance.proto"],
+ srcs_version = "PY2AND3",
+ visibility = [
+ "//python:__subpackages__",
+ ],
+)
+
+internal_php_proto_library(
+ name = "conformance_php_proto",
+ srcs = ["conformance.proto"],
+ outs = [
+ "Conformance/ConformanceRequest.php",
+ "Conformance/ConformanceResponse.php",
+ "Conformance/FailureSet.php",
+ "Conformance/JspbEncodingConfig.php",
+ "Conformance/TestCategory.php",
+ "Conformance/WireFormat.php",
+ "GPBMetadata/Conformance.php",
+ ],
+ visibility = [
+ "//conformance:__pkg__",
+ "//php:__pkg__",
+ ],
+)
+
+internal_ruby_proto_library(
+ name = "conformance_ruby_proto",
+ srcs = ["conformance.proto"],
+ visibility = [
+ "//conformance:__pkg__",
+ "//ruby:__pkg__",
+ ],
+)
+
cc_library(
name = "jsoncpp",
srcs = ["third_party/jsoncpp/jsoncpp.cpp"],
@@ -71,7 +143,11 @@
"conformance_test.h",
],
includes = ["."],
- deps = [":conformance_proto_cc"],
+ deps = [
+ ":conformance_cc_proto",
+ "@com_google_absl//absl/strings",
+ "@com_google_absl//absl/strings:str_format",
+ ],
)
cc_library(
@@ -83,6 +159,7 @@
":jsoncpp",
":test_messages_proto2_proto_cc",
":test_messages_proto3_proto_cc",
+ "@com_google_absl//absl/status",
],
)
@@ -105,11 +182,28 @@
":binary_json_conformance_suite",
":conformance_test",
":text_format_conformance_suite",
+ "@com_google_absl//absl/strings:str_format",
+ ],
+)
+
+cc_binary(
+ name = "conformance_cpp",
+ testonly = 1,
+ srcs = ["conformance_cpp.cc"],
+ visibility = ["//src:__subpackages__"],
+ deps = [
+ ":conformance_cc_proto",
+ "//:protobuf",
+ "//:test_messages_proto2_cc_proto",
+ "//:test_messages_proto3_cc_proto",
+ "@com_google_absl//absl/status",
+ "@com_google_absl//absl/status:statusor",
],
)
java_binary(
name = "conformance_java",
+ testonly = 1,
srcs = ["ConformanceJava.java"],
main_class = "ConformanceJava",
visibility = [
@@ -126,6 +220,7 @@
java_binary(
name = "conformance_java_lite",
+ testonly = 1,
srcs = ["ConformanceJavaLite.java"],
main_class = "ConformanceJavaLite",
visibility = [
@@ -140,10 +235,119 @@
],
)
+py_binary(
+ name = "conformance_python",
+ testonly = 1,
+ srcs = ["conformance_python.py"],
+ imports = [
+ "..",
+ "../python",
+ ],
+ srcs_version = "PY2AND3",
+ visibility = ["//python:__subpackages__"],
+ deps = [
+ ":conformance_py_proto",
+ "//:protobuf_python",
+ "//python:test_messages_proto2_py_proto",
+ "//python:test_messages_proto3_py_proto",
+ ],
+)
+
+inline_sh_binary(
+ name = "conformance_php",
+ testonly = 1,
+ srcs = [
+ "autoload.php",
+ "conformance_php.php",
+ ],
+ cmd = """
+ php -d include_path=conformance:src/google/protobuf \\
+ -d auto_prepend_file=$(rootpath autoload.php) \\
+ $(rootpath conformance_php.php)
+ """,
+ visibility = ["//php:__subpackages__"],
+ deps = [
+ ":conformance_php_proto",
+ "//:test_messages_proto3_php_proto",
+ "//php:source_files",
+ ],
+)
+
+inline_sh_binary(
+ name = "conformance_php_c",
+ testonly = 1,
+ srcs = [
+ "conformance_php.php",
+ "//php:extension",
+ ],
+ cmd = """
+ php -dextension=$(rootpath //php:extension) \\
+ -d include_path=conformance:src/google/protobuf \\
+ $(rootpath conformance_php.php)
+ """,
+ visibility = ["//php:__subpackages__"],
+ deps = [
+ ":conformance_php_proto",
+ "//:test_messages_proto3_php_proto",
+ ],
+)
+
+inline_sh_binary(
+ name = "conformance_csharp",
+ testonly = 1,
+ srcs = ["//csharp/src/Google.Protobuf.Conformance:conformance_dll"],
+ cmd = "dotnet $(rootpath //csharp/src/Google.Protobuf.Conformance:conformance_dll)",
+ visibility = ["//csharp:__subpackages__"],
+ deps = [
+ "//csharp/src/Google.Protobuf.Conformance:conformance_runfiles",
+ ],
+)
+
+objc_library(
+ name = "conformance_objc_lib",
+ testonly = 1,
+ non_arc_srcs = ["conformance_objc.m"],
+ # See https://github.com/bazelbuild/bazel/issues/12897.
+ tags = ["manual"],
+ deps = [
+ ":conformance_objc_proto",
+ "//:test_messages_proto2_objc_proto",
+ "//:test_messages_proto3_objc_proto",
+ ],
+)
+
+cc_binary(
+ name = "conformance_objc",
+ testonly = 1,
+ # See https://github.com/bazelbuild/bazel/issues/12897.
+ tags = ["manual"],
+ visibility = ["//objectivec:__subpackages__"],
+ deps = [":conformance_objc_lib"],
+)
+
+inline_sh_binary(
+ name = "conformance_ruby",
+ testonly = 1,
+ srcs = ["conformance_ruby.rb"],
+ cmd = "RUBYLIB=ruby/lib:conformance:src $(rootpath conformance_ruby.rb)",
+ visibility = ["//ruby:__subpackages__"],
+ deps = [
+ ":conformance_ruby_proto",
+ "//:test_messages_proto2_ruby_proto",
+ "//:test_messages_proto3_ruby_proto",
+ "//:well_known_ruby_protos",
+ "//ruby:protobuf",
+ ],
+)
+
+################################################################################
+# Distribution files
+################################################################################
+
filegroup(
name = "all_files",
srcs = glob(["**/*"]),
- visibility = ["//:__pkg__"],
+ visibility = ["//src/google/protobuf/compiler/csharp:__pkg__"],
)
pkg_files(
@@ -152,11 +356,10 @@
["**/*"],
exclude = [
# Handled by dist_scripts:
- "conformance_test_runner.sh",
+ "bazel_conformance_test_runner.sh",
# The following are not in autotools dist:
"autoload.php",
- "conformance_nodejs.js",
"failure_list_jruby.txt",
"update_failure_list.py",
],
diff --git a/conformance/Makefile.am b/conformance/Makefile.am
deleted file mode 100644
index 415412b..0000000
--- a/conformance/Makefile.am
+++ /dev/null
@@ -1,372 +0,0 @@
-## Process this file with automake to produce Makefile.in
-
-conformance_protoc_inputs = \
- conformance.proto \
- $(top_srcdir)/src/google/protobuf/test_messages_proto3.proto
-
-# proto2 input files, should be separated with proto3, as we
-# can't generate proto2 files for php.
-conformance_proto2_protoc_inputs = \
- $(top_srcdir)/src/google/protobuf/test_messages_proto2.proto
-
-well_known_type_protoc_inputs = \
- $(top_srcdir)/src/google/protobuf/any.proto \
- $(top_srcdir)/src/google/protobuf/duration.proto \
- $(top_srcdir)/src/google/protobuf/field_mask.proto \
- $(top_srcdir)/src/google/protobuf/struct.proto \
- $(top_srcdir)/src/google/protobuf/timestamp.proto \
- $(top_srcdir)/src/google/protobuf/wrappers.proto
-
-
-protoc_outputs = \
- conformance.pb.cc \
- conformance.pb.h
-
-other_language_protoc_outputs = \
- conformance_pb2.py \
- Conformance.pbobjc.h \
- Conformance.pbobjc.m \
- conformance_pb.js \
- conformance_pb.rb \
- com/google/protobuf/Any.java \
- com/google/protobuf/AnyOrBuilder.java \
- com/google/protobuf/AnyProto.java \
- com/google/protobuf/BoolValue.java \
- com/google/protobuf/BoolValueOrBuilder.java \
- com/google/protobuf/BytesValue.java \
- com/google/protobuf/BytesValueOrBuilder.java \
- com/google/protobuf/conformance/Conformance.java \
- com/google/protobuf/DoubleValue.java \
- com/google/protobuf/DoubleValueOrBuilder.java \
- com/google/protobuf/Duration.java \
- com/google/protobuf/DurationOrBuilder.java \
- com/google/protobuf/DurationProto.java \
- com/google/protobuf/FieldMask.java \
- com/google/protobuf/FieldMaskOrBuilder.java \
- com/google/protobuf/FieldMaskProto.java \
- com/google/protobuf/FloatValue.java \
- com/google/protobuf/FloatValueOrBuilder.java \
- com/google/protobuf/Int32Value.java \
- com/google/protobuf/Int32ValueOrBuilder.java \
- com/google/protobuf/Int64Value.java \
- com/google/protobuf/Int64ValueOrBuilder.java \
- com/google/protobuf/ListValue.java \
- com/google/protobuf/ListValueOrBuilder.java \
- com/google/protobuf/NullValue.java \
- com/google/protobuf/StringValue.java \
- com/google/protobuf/StringValueOrBuilder.java \
- com/google/protobuf/Struct.java \
- com/google/protobuf/StructOrBuilder.java \
- com/google/protobuf/StructProto.java \
- com/google/protobuf/Timestamp.java \
- com/google/protobuf/TimestampOrBuilder.java \
- com/google/protobuf/TimestampProto.java \
- com/google/protobuf/UInt32Value.java \
- com/google/protobuf/UInt32ValueOrBuilder.java \
- com/google/protobuf/UInt64Value.java \
- com/google/protobuf/UInt64ValueOrBuilder.java \
- com/google/protobuf/Value.java \
- com/google/protobuf/ValueOrBuilder.java \
- com/google/protobuf/WrappersProto.java \
- com/google/protobuf_test_messages/proto3/TestMessagesProto3.java \
- com/google/protobuf_test_messages/proto2/TestMessagesProto2.java \
- google/protobuf/any.pb.cc \
- google/protobuf/any.pb.h \
- google/protobuf/any.rb \
- google/protobuf/any_pb2.py \
- google/protobuf/duration.pb.cc \
- google/protobuf/duration.pb.h \
- google/protobuf/duration.rb \
- google/protobuf/duration_pb2.py \
- google/protobuf/field_mask.pb.cc \
- google/protobuf/field_mask.pb.h \
- google/protobuf/field_mask.rb \
- google/protobuf/field_mask_pb2.py \
- google/protobuf/struct.pb.cc \
- google/protobuf/struct.pb.h \
- google/protobuf/struct.rb \
- google/protobuf/struct_pb2.py \
- google/protobuf/TestMessagesProto2.pbobjc.h \
- google/protobuf/TestMessagesProto2.pbobjc.m \
- google/protobuf/TestMessagesProto3.pbobjc.h \
- google/protobuf/TestMessagesProto3.pbobjc.m \
- google/protobuf/test_messages_proto3.pb.cc \
- google/protobuf/test_messages_proto3.pb.h \
- google/protobuf/test_messages_proto2.pb.cc \
- google/protobuf/test_messages_proto2.pb.h \
- google/protobuf/test_messages_proto3_pb.rb \
- google/protobuf/test_messages_proto3_pb2.py \
- google/protobuf/test_messages_proto2_pb2.py \
- google/protobuf/timestamp.pb.cc \
- google/protobuf/timestamp.pb.h \
- google/protobuf/timestamp.rb \
- google/protobuf/timestamp_pb2.py \
- google/protobuf/wrappers.pb.cc \
- google/protobuf/wrappers.pb.h \
- google/protobuf/wrappers.rb \
- google/protobuf/wrappers_pb2.py \
- Conformance/ConformanceRequest.php \
- Conformance/ConformanceResponse.php \
- Conformance/FailureSet.php \
- Conformance/WireFormat.php \
- GPBMetadata/Conformance.php \
- GPBMetadata/Google/Protobuf/Any.php \
- GPBMetadata/Google/Protobuf/Duration.php \
- GPBMetadata/Google/Protobuf/FieldMask.php \
- GPBMetadata/Google/Protobuf/Struct.php \
- GPBMetadata/Google/Protobuf/TestMessagesProto3.php \
- GPBMetadata/Google/Protobuf/Timestamp.php \
- GPBMetadata/Google/Protobuf/Wrappers.php \
- Google/Protobuf/Any.php \
- Google/Protobuf/BoolValue.php \
- Google/Protobuf/BytesValue.php \
- Google/Protobuf/DoubleValue.php \
- Google/Protobuf/Duration.php \
- Google/Protobuf/FieldMask.php \
- Google/Protobuf/FloatValue.php \
- Google/Protobuf/Int32Value.php \
- Google/Protobuf/Int64Value.php \
- Google/Protobuf/ListValue.php \
- Google/Protobuf/NullValue.php \
- Google/Protobuf/StringValue.php \
- Google/Protobuf/Struct.php \
- Google/Protobuf/Timestamp.php \
- Google/Protobuf/UInt32Value.php \
- Google/Protobuf/UInt64Value.php \
- Google/Protobuf/Value.php \
- Protobuf_test_messages/Proto3/ForeignEnum.php \
- Protobuf_test_messages/Proto3/ForeignMessage.php \
- Protobuf_test_messages/Proto3/TestAllTypes_NestedEnum.php \
- Protobuf_test_messages/Proto3/TestAllTypes_NestedMessage.php \
- Protobuf_test_messages/Proto3/TestAllTypes.php
- # lite/com/google/protobuf/Any.java \
- # lite/com/google/protobuf/AnyOrBuilder.java \
- # lite/com/google/protobuf/AnyProto.java \
- # lite/com/google/protobuf/BoolValue.java \
- # lite/com/google/protobuf/BoolValueOrBuilder.java \
- # lite/com/google/protobuf/BytesValue.java \
- # lite/com/google/protobuf/BytesValueOrBuilder.java \
- # lite/com/google/protobuf/conformance/Conformance.java \
- # lite/com/google/protobuf/DoubleValue.java \
- # lite/com/google/protobuf/DoubleValueOrBuilder.java \
- # lite/com/google/protobuf/Duration.java \
- # lite/com/google/protobuf/DurationOrBuilder.java \
- # lite/com/google/protobuf/DurationProto.java \
- # lite/com/google/protobuf/FieldMask.java \
- # lite/com/google/protobuf/FieldMaskOrBuilder.java \
- # lite/com/google/protobuf/FieldMaskProto.java \
- # lite/com/google/protobuf/FloatValue.java \
- # lite/com/google/protobuf/FloatValueOrBuilder.java \
- # lite/com/google/protobuf/Int32Value.java \
- # lite/com/google/protobuf/Int32ValueOrBuilder.java \
- # lite/com/google/protobuf/Int64Value.java \
- # lite/com/google/protobuf/Int64ValueOrBuilder.java \
- # lite/com/google/protobuf/ListValue.java \
- # lite/com/google/protobuf/ListValueOrBuilder.java \
- # lite/com/google/protobuf/NullValue.java \
- # lite/com/google/protobuf/StringValue.java \
- # lite/com/google/protobuf/StringValueOrBuilder.java \
- # lite/com/google/protobuf/Struct.java \
- # lite/com/google/protobuf/StructOrBuilder.java \
- # lite/com/google/protobuf/StructProto.java \
- # lite/com/google/protobuf/Timestamp.java \
- # lite/com/google/protobuf/TimestampOrBuilder.java \
- # lite/com/google/protobuf/TimestampProto.java \
- # lite/com/google/protobuf/UInt32Value.java \
- # lite/com/google/protobuf/UInt32ValueOrBuilder.java \
- # lite/com/google/protobuf/UInt64Value.java \
- # lite/com/google/protobuf/UInt64ValueOrBuilder.java \
- # lite/com/google/protobuf/Value.java \
- # lite/com/google/protobuf/ValueOrBuilder.java \
- # lite/com/google/protobuf/WrappersProto.java
-
-bin_PROGRAMS = conformance-test-runner conformance-cpp
-
-# All source files excepet C++/Objective-C ones should be explicitly listed
-# here because the autoconf tools don't include files of other languages
-# automatically.
-EXTRA_DIST = \
- ConformanceJava.java \
- ConformanceJavaLite.java \
- README.md \
- conformance.proto \
- conformance_python.py \
- conformance_ruby.rb \
- conformance_php.php \
- failure_list_cpp.txt \
- failure_list_csharp.txt \
- failure_list_java.txt \
- failure_list_js.txt \
- failure_list_objc.txt \
- failure_list_python.txt \
- failure_list_python_cpp.txt \
- failure_list_python-post26.txt \
- failure_list_ruby.txt \
- failure_list_php.txt \
- failure_list_php_c.txt
-
-conformance_test_runner_LDADD = $(top_srcdir)/src/libprotobuf.la
-conformance_test_runner_SOURCES = conformance_test.h conformance_test.cc \
- conformance_test_main.cc \
- binary_json_conformance_suite.h \
- binary_json_conformance_suite.cc \
- text_format_conformance_suite.h \
- text_format_conformance_suite.cc \
- conformance_test_runner.cc \
- third_party/jsoncpp/json.h \
- third_party/jsoncpp/jsoncpp.cpp
-nodist_conformance_test_runner_SOURCES = conformance.pb.cc google/protobuf/test_messages_proto3.pb.cc google/protobuf/test_messages_proto2.pb.cc
-conformance_test_runner_CPPFLAGS = -I$(top_srcdir)/src -I$(srcdir)
-conformance_test_runner_CXXFLAGS = -std=c++11
-# Explicit deps because BUILT_SOURCES are only done before a "make all/check"
-# so a direct "make test_cpp" could fail if parallel enough.
-conformance_test_runner-conformance_test.$(OBJEXT): conformance.pb.h
-conformance_test_runner-conformance_test_runner.$(OBJEXT): conformance.pb.h
-
-conformance_cpp_LDADD = $(top_srcdir)/src/libprotobuf.la
-conformance_cpp_SOURCES = conformance_cpp.cc
-nodist_conformance_cpp_SOURCES = conformance.pb.cc google/protobuf/test_messages_proto3.pb.cc google/protobuf/test_messages_proto2.pb.cc
-conformance_cpp_CPPFLAGS = -I$(top_srcdir)/src
-# Explicit dep because BUILT_SOURCES are only done before a "make all/check"
-# so a direct "make test_cpp" could fail if parallel enough.
-conformance_cpp-conformance_cpp.$(OBJEXT): conformance.pb.h
-
-if OBJC_CONFORMANCE_TEST
-
-bin_PROGRAMS += conformance-objc
-
-conformance_objc_SOURCES = conformance_objc.m ../objectivec/GPBProtocolBuffers.m
-nodist_conformance_objc_SOURCES = Conformance.pbobjc.m google/protobuf/TestMessagesProto2.pbobjc.m google/protobuf/TestMessagesProto3.pbobjc.m
-# On travis, the build fails without the isysroot because whatever system
-# headers are being found don't include generics support for
-# NSArray/NSDictionary, the only guess is their image at one time had an odd
-# setup for Xcode and old frameworks are being found.
-conformance_objc_CPPFLAGS = -I$(top_srcdir)/objectivec -isysroot `xcrun --sdk macosx --show-sdk-path`
-conformance_objc_LDFLAGS = -framework Foundation
-# Explicit dep because BUILT_SOURCES are only done before a "make all/check"
-# so a direct "make test_objc" could fail if parallel enough.
-conformance_objc-conformance_objc.$(OBJEXT): Conformance.pbobjc.h google/protobuf/TestMessagesProto2.pbobjc.h google/protobuf/TestMessagesProto3.pbobjc.h
-
-endif
-
-# JavaScript well-known types are expected to be in a directory called
-# google-protobuf, because they are usually in the google-protobuf npm
-# package. But we want to use the sources from our tree, so we recreate
-# that directory structure here.
-google-protobuf:
- mkdir google-protobuf
-
-if USE_EXTERNAL_PROTOC
-
-# Some implementations include pre-generated versions of well-known types.
-protoc_middleman: $(conformance_protoc_inputs) $(conformance_proto2_protoc_inputs) $(well_known_type_protoc_inputs) google-protobuf
- $(PROTOC) -I$(srcdir) -I$(top_srcdir) --cpp_out=. --java_out=. --ruby_out=. --objc_out=. --python_out=. --php_out=. $(conformance_protoc_inputs)
- $(PROTOC) -I$(srcdir) -I$(top_srcdir) --cpp_out=. --java_out=. --ruby_out=. --objc_out=. --python_out=. $(conformance_proto2_protoc_inputs)
- $(PROTOC) -I$(srcdir) -I$(top_srcdir) --cpp_out=. --java_out=. --ruby_out=. --python_out=. $(well_known_type_protoc_inputs)
- ## $(PROTOC) -I$(srcdir) -I$(top_srcdir) --java_out=lite:lite $(conformance_protoc_inputs) $(well_known_type_protoc_inputs)
- touch protoc_middleman
-
-else
-
-# We have to cd to $(srcdir) before executing protoc because $(protoc_inputs) is
-# relative to srcdir, which may not be the same as the current directory when
-# building out-of-tree.
-protoc_middleman: $(top_srcdir)/src/protoc$(EXEEXT) $(conformance_protoc_inputs) $(conformance_proto2_protoc_inputs) $(well_known_type_protoc_inputs) google-protobuf
- oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --cpp_out=$$oldpwd --java_out=$$oldpwd --ruby_out=$$oldpwd --objc_out=$$oldpwd --python_out=$$oldpwd --php_out=$$oldpwd $(conformance_protoc_inputs) )
- oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --cpp_out=$$oldpwd --java_out=$$oldpwd --ruby_out=$$oldpwd --objc_out=$$oldpwd --python_out=$$oldpwd $(conformance_proto2_protoc_inputs) )
- oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --cpp_out=$$oldpwd --java_out=$$oldpwd --ruby_out=$$oldpwd --python_out=$$oldpwd $(well_known_type_protoc_inputs) )
- ## @mkdir -p lite
- ## oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --java_out=lite:$$oldpwd/lite $(conformance_protoc_inputs) $(well_known_type_protoc_inputs) )
- touch protoc_middleman
-
-endif
-
-$(protoc_outputs): protoc_middleman
-
-$(other_language_protoc_outputs): protoc_middleman
-
-CLEANFILES = $(protoc_outputs) protoc_middleman javac_middleman conformance-java javac_middleman_lite conformance-java-lite conformance-csharp conformance-php conformance-php-c $(other_language_protoc_outputs)
-
-MAINTAINERCLEANFILES = \
- Makefile.in
-
-javac_middleman: ConformanceJava.java protoc_middleman $(other_language_protoc_outputs)
- jar=`ls ../java/util/target/*jar-with-dependencies.jar` && javac -classpath ../java/target/classes:$$jar ConformanceJava.java com/google/protobuf/conformance/Conformance.java com/google/protobuf_test_messages/proto3/TestMessagesProto3.java com/google/protobuf_test_messages/proto2/TestMessagesProto2.java
- @touch javac_middleman
-
-conformance-java: javac_middleman
- @echo "Writing shortcut script conformance-java..."
- @echo '#! /bin/sh' > conformance-java
- @jar=`ls ../java/util/target/*jar-with-dependencies.jar` && echo java -classpath .:../java/target/classes:$$jar ConformanceJava '$$@' >> conformance-java
- @chmod +x conformance-java
-
-javac_middleman_lite: ConformanceJavaLite.java protoc_middleman $(other_language_protoc_outputs)
- javac -classpath ../java/lite/target/classes:lite ConformanceJavaLite.java lite/com/google/protobuf/conformance/Conformance.java
- @touch javac_middleman_lite
-
-conformance-java-lite: javac_middleman_lite
- @echo "Writing shortcut script conformance-java-lite..."
- @echo '#! /bin/sh' > conformance-java-lite
- @echo java -classpath .:../java/lite/target/classes:lite ConformanceJavaLite '$$@' >> conformance-java-lite
- @chmod +x conformance-java-lite
-
-# Currently the conformance code is alongside the rest of the C#
-# source, as it's easier to maintain there. We assume we've already
-# built that, so we just need a script to run it.
-conformance-csharp: $(other_language_protoc_outputs)
- @echo "Writing shortcut script conformance-csharp..."
- @echo '#! /bin/sh' > conformance-csharp
- @echo 'dotnet ../csharp/src/Google.Protobuf.Conformance/bin/Release/netcoreapp3.1/Google.Protobuf.Conformance.dll "$$@"' >> conformance-csharp
- @chmod +x conformance-csharp
-
-conformance-php:
- @echo "Writing shortcut script conformance-php..."
- @echo '#! /bin/sh' > conformance-php
- @echo 'php -d auto_prepend_file=autoload.php ./conformance_php.php' >> conformance-php
- @chmod +x conformance-php
-
-conformance-php-c:
- @echo "Writing shortcut script conformance-php-c..."
- @echo '#! /bin/sh' > conformance-php-c
- @echo 'php -dextension=../php/ext/google/protobuf/modules/protobuf.so ./conformance_php.php' >> conformance-php-c
- @chmod +x conformance-php-c
-
-# Targets for actually running tests.
-test_cpp: protoc_middleman conformance-test-runner conformance-cpp
- ./conformance-test-runner --enforce_recommended --failure_list failure_list_cpp.txt --text_format_failure_list text_format_failure_list_cpp.txt ./conformance-cpp
-
-test_java: protoc_middleman conformance-test-runner conformance-java
- ./conformance-test-runner --enforce_recommended --failure_list failure_list_java.txt --text_format_failure_list text_format_failure_list_java.txt ./conformance-java
-
-test_java_lite: protoc_middleman conformance-test-runner conformance-java-lite
- ./conformance-test-runner --enforce_recommended ./conformance-java-lite
-
-test_csharp: protoc_middleman conformance-test-runner conformance-csharp
- ./conformance-test-runner --enforce_recommended --failure_list failure_list_csharp.txt --text_format_failure_list text_format_failure_list_csharp.txt ./conformance-csharp
-
-test_ruby: protoc_middleman conformance-test-runner $(other_language_protoc_outputs)
- RUBYLIB=../ruby/lib:. ./conformance-test-runner --enforce_recommended --failure_list failure_list_ruby.txt --text_format_failure_list text_format_failure_list_ruby.txt ./conformance_ruby.rb
-
-test_jruby: protoc_middleman conformance-test-runner $(other_language_protoc_outputs)
- RUBYLIB=../ruby/lib:. ./conformance-test-runner --enforce_recommended --failure_list failure_list_jruby.txt --text_format_failure_list text_format_failure_list_jruby.txt ./conformance_ruby.rb
-
-test_php: protoc_middleman conformance-test-runner conformance-php $(other_language_protoc_outputs)
- ./conformance-test-runner --enforce_recommended --failure_list failure_list_php.txt --text_format_failure_list text_format_failure_list_php.txt ./conformance-php
-
-test_php_c: protoc_middleman conformance-test-runner conformance-php-c $(other_language_protoc_outputs)
- ./conformance-test-runner --enforce_recommended --failure_list failure_list_php_c.txt --text_format_failure_list text_format_failure_list_php.txt ./conformance-php-c
-
-# These depend on library paths being properly set up. The easiest way to
-# run them is to just use "tox" from the python dir.
-test_python: protoc_middleman conformance-test-runner
- ./conformance-test-runner --enforce_recommended --failure_list failure_list_python.txt --text_format_failure_list text_format_failure_list_python.txt ./conformance_python.py
-
-test_python_cpp: protoc_middleman conformance-test-runner
- ./conformance-test-runner --enforce_recommended --failure_list failure_list_python_cpp.txt --text_format_failure_list text_format_failure_list_python_cpp.txt ./conformance_python.py
-
-if OBJC_CONFORMANCE_TEST
-
-test_objc: protoc_middleman conformance-test-runner conformance-objc
- ./conformance-test-runner --enforce_recommended --failure_list failure_list_objc.txt ./conformance-objc
-
-endif
diff --git a/conformance/README.md b/conformance/README.md
index 901d287..8569a6a 100644
--- a/conformance/README.md
+++ b/conformance/README.md
@@ -12,44 +12,77 @@
in whatever language you want to test communicate with the tester
program over a pipe.
-Before running any of these tests, make sure you run `make` in the base
-directory to build `protoc`, since all the tests depend on it.
+If you're not using Bazel to run these tests, make sure you build the C++
+tester code beforehand, e.g. from the base directory:
- $ make
+ $ cmake . -Dprotobuf_BUILD_CONFORMANCE=ON && cmake --build .
+
+This will produce a `conformance_test_runner` binary that can be used to run
+conformance tests on any executable. Pass it `--help` for more information.
Running the tests for C++
-------------------------
To run the tests against the C++ implementation, run:
- $ cd conformance && make test_cpp
+ $ bazel test //src:conformance_test
-Running the tests for JavaScript (Node.js)
-------------------------------------------
+Or alternatively with CMake:
-To run the JavaScript tests against Node.js, make sure you have "node"
-on your path and then run:
-
- $ cd conformance && make test_nodejs
-
-Running the tests for Ruby (MRI)
---------------------------------
-
-To run the Ruby tests against MRI, first build the C extension:
-
- $ cd ruby && rake
-
-Then run the tests like so:
-
- $ cd conformance && make test_ruby
+ $ ctest -R conformance_cpp_test
Running the tests for other languages
-------------------------------------
-Most of the languages in the Protobuf source tree are set up to run
-conformance tests. However some of them are more tricky to set up
-properly. See `tests.sh` in the base of the repository to see how
-Kokoro runs the tests.
+All of the languages in the Protobuf source tree are set up to run conformance
+tests using similar patterns. You can either use Bazel to run the
+`conformance_test` target defined in the language's root `BUILD.bazel` file,
+or create an executable for a custom test and pass it to
+`conformance_test_runner`.
+
+Note: CMake can be used to build the conformance test runner, but not any of
+the conformance test executables outside C++. So if you aren't using Bazel
+you'll need to create the executable you pass to `conformance_test_runner` via
+some alternate build system.
+
+While we plan to model all our supported languages more completely in Bazel,
+today some of them are a bit tricky to run. Below is a list of the commands
+(and prerequisites) to run each language's conformance tests.
+
+Java:
+
+ $ bazel test //java/core:conformance_test //java/lite:conformance_test
+
+Python:
+
+ $ bazel test //python:conformance_test
+
+Python C++:
+
+ $ bazel test //python:conformance_test_cpp --define=use_fast_cpp_protos=true
+
+C#:
+
+ $ `which dotnet || echo "You must have dotnet installed!"
+ $ `bazel test //csharp:conformance_test \
+ --action_env=DOTNET_CLI_TELEMETRY_OPTOUT=1 --test_env=DOTNET_CLI_HOME=~ \
+ --action_env=DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1
+
+Objective-c (Mac only):
+
+ $ `bazel test //objectivec:conformance_test --macos_minimum_os=10.9
+
+Ruby:
+
+ $ [[ $(ruby --version) == "ruby"* ]] || echo "Select a C Ruby!"
+ $ bazel test //ruby:conformance_test --define=ruby_platform=c \
+ --action_env=PATH --action_env=GEM_PATH --action_env=GEM_HOME
+
+JRuby:
+
+ $ [[ $(ruby --version) == "jruby"* ]] || echo "Switch to Java Ruby!"
+ $ bazel test //ruby:conformance_test_jruby --define=ruby_platform=java \
+ --action_env=PATH --action_env=GEM_PATH --action_env=GEM_HOME
Testing other Protocol Buffer implementations
---------------------------------------------
diff --git a/conformance/autoload.php b/conformance/autoload.php
index 0f49aec..7f04cc0 100644
--- a/conformance/autoload.php
+++ b/conformance/autoload.php
@@ -7,7 +7,7 @@
function protobuf_autoloader_impl($class, $prefix) {
$length = strlen($prefix);
if ((substr($class, 0, $length) === $prefix)) {
- $path = '../php/src/' . implode('/', array_map('ucwords', explode('\\', $class))) . '.php';
+ $path = 'php/src/' . implode('/', array_map('ucwords', explode('\\', $class))) . '.php';
include_once $path;
}
}
diff --git a/conformance/conformance_test_runner.sh b/conformance/bazel_conformance_test_runner.sh
similarity index 81%
rename from conformance/conformance_test_runner.sh
rename to conformance/bazel_conformance_test_runner.sh
index 3149f82..fcf4a48 100755
--- a/conformance/conformance_test_runner.sh
+++ b/conformance/bazel_conformance_test_runner.sh
@@ -1,4 +1,7 @@
#!/bin/bash
+# This is an internal file that should only be called from Bazel rules. For
+# custom conformance tests outside of Bazel use CMAKE with
+# -Dprotobuf_BUILD_CONFORMANCE=ON to build the test runner.
set -x
echo $@
@@ -44,13 +47,13 @@
conformance_testee=$(rlocation $TESTEE)
args=(--enforce_recommended)
-failure_list=$(rlocation $FAILURE_LIST)
-if [ "$failure_list" != "1" ] ; then
+failure_list=$(rlocation $FAILURE_LIST) || unset
+if [ -n "$failure_list" ] ; then
args+=(--failure_list $failure_list)
fi
-text_format_failure_list=$(rlocation $TEXT_FORMAT_FAILURE_LIST)
-if [ "$text_format_failure_list" != "1" ]; then
+text_format_failure_list=$(rlocation $TEXT_FORMAT_FAILURE_LIST) || unset
+if [ -n "$text_format_failure_list" ]; then
args+=(--text_format_failure_list $text_format_failure_list)
fi
diff --git a/conformance/binary_json_conformance_suite.cc b/conformance/binary_json_conformance_suite.cc
index 9b1548d..689e8e1 100644
--- a/conformance/binary_json_conformance_suite.cc
+++ b/conformance/binary_json_conformance_suite.cc
@@ -30,15 +30,16 @@
#include "binary_json_conformance_suite.h"
-#include <google/protobuf/text_format.h>
-#include <google/protobuf/wire_format_lite.h>
-#include <google/protobuf/util/json_util.h>
-#include <google/protobuf/util/type_resolver_util.h>
+#include "google/protobuf/text_format.h"
+#include "google/protobuf/wire_format_lite.h"
+#include "google/protobuf/util/json_util.h"
+#include "google/protobuf/util/type_resolver_util.h"
+#include "absl/status/status.h"
+#include "absl/strings/str_cat.h"
#include "third_party/jsoncpp/json.h"
#include "conformance_test.h"
-#include <google/protobuf/test_messages_proto2.pb.h>
-#include <google/protobuf/test_messages_proto3.pb.h>
-#include <google/protobuf/stubs/status.h>
+#include "google/protobuf/test_messages_proto2.pb.h"
+#include "google/protobuf/test_messages_proto3.pb.h"
namespace proto2_messages = protobuf_test_messages::proto2;
@@ -354,7 +355,7 @@
const ConformanceResponse& response,
Message* test_message) {
string binary_protobuf;
- util::Status status =
+ absl::Status status =
JsonToBinaryString(type_resolver_.get(), type_url_,
response.json_payload(), &binary_protobuf);
@@ -384,7 +385,7 @@
case ConformanceResponse::kProtobufPayload: {
if (requested_output != conformance::PROTOBUF) {
ReportFailure(test_name, level, request, response,
- StrCat("Test was asked for ",
+ absl::StrCat("Test was asked for ",
WireFormatToString(requested_output),
" output but provided PROTOBUF instead.")
.c_str());
@@ -403,7 +404,7 @@
case ConformanceResponse::kJsonPayload: {
if (requested_output != conformance::JSON) {
ReportFailure(test_name, level, request, response,
- StrCat("Test was asked for ",
+ absl::StrCat("Test was asked for ",
WireFormatToString(requested_output),
" output but provided JSON instead.")
.c_str());
@@ -440,7 +441,7 @@
const ConformanceRequest& request = setting.GetRequest();
ConformanceResponse response;
- string effective_test_name = StrCat(
+ string effective_test_name = absl::StrCat(
setting.ConformanceLevelToString(level),
(is_proto3 ? ".Proto3" : ".Proto2"), ".ProtobufInput.", test_name);
@@ -571,7 +572,7 @@
const ConformanceRequest& request = setting.GetRequest();
ConformanceResponse response;
string effective_test_name =
- StrCat(setting.ConformanceLevelToString(level),
+ absl::StrCat(setting.ConformanceLevelToString(level),
is_proto3 ? ".Proto3.JsonInput." : ".Proto2.JsonInput.",
test_name, ".Validator");
@@ -584,16 +585,16 @@
if (response.result_case() != ConformanceResponse::kJsonPayload) {
ReportFailure(effective_test_name, level, request, response,
- "Expected JSON payload but got type %d.",
- response.result_case());
+ absl::StrCat("Expected JSON payload but got type ",
+ response.result_case()));
return;
}
Json::Reader reader;
Json::Value value;
if (!reader.parse(response.json_payload(), value)) {
ReportFailure(effective_test_name, level, request, response,
- "JSON payload cannot be parsed as valid JSON: %s",
- reader.getFormattedErrorMessages().c_str());
+ absl::StrCat("JSON payload cannot be parsed as valid JSON: ",
+ reader.getFormattedErrorMessages()));
return;
}
if (!validator(value)) {
@@ -615,7 +616,7 @@
prototype, test_name, input_json);
const ConformanceRequest& request = setting.GetRequest();
ConformanceResponse response;
- string effective_test_name = StrCat(
+ string effective_test_name = absl::StrCat(
setting.ConformanceLevelToString(level), ".Proto3.JsonInput.", test_name);
RunTest(effective_test_name, request, &response);
@@ -642,7 +643,7 @@
prototype, test_name, payload_message.SerializeAsString());
const ConformanceRequest& request = setting.GetRequest();
ConformanceResponse response;
- string effective_test_name = StrCat(
+ string effective_test_name = absl::StrCat(
setting.ConformanceLevelToString(level), ".", test_name, ".JsonOutput");
RunTest(effective_test_name, request, &response);
@@ -765,13 +766,14 @@
: cat(tag(field->number(), wire_type), values[i].second);
std::unique_ptr<Message> test_message = NewTestMessage(is_proto3);
test_message->MergeFromString(expected_proto);
- string text = test_message->DebugString();
+ string text;
+ TextFormat::PrintToString(*test_message, &text);
RunValidProtobufTest(
- StrCat("ValidDataScalar", type_name, "[", i, "]"), REQUIRED,
+ absl::StrCat("ValidDataScalar", type_name, "[", i, "]"), REQUIRED,
proto, text, is_proto3);
RunValidBinaryProtobufTest(
- StrCat("ValidDataScalarBinary", type_name, "[", i, "]"),
+ absl::StrCat("ValidDataScalarBinary", type_name, "[", i, "]"),
RECOMMENDED, proto, expected_proto, is_proto3);
}
@@ -787,7 +789,8 @@
cat(tag(field->number(), wire_type), values.back().second);
std::unique_ptr<Message> test_message = NewTestMessage(is_proto3);
test_message->MergeFromString(expected_proto);
- string text = test_message->DebugString();
+ string text;
+ TextFormat::PrintToString(*test_message, &text);
RunValidProtobufTest("RepeatedScalarSelectsLast" + type_name, REQUIRED,
proto, text, is_proto3);
@@ -848,14 +851,15 @@
std::unique_ptr<Message> test_message = NewTestMessage(is_proto3);
test_message->MergeFromString(default_proto_packed_expected);
- string text = test_message->DebugString();
+ string text;
+ TextFormat::PrintToString(*test_message, &text);
// Ensures both packed and unpacked data can be parsed.
RunValidProtobufTest(
- StrCat("ValidDataRepeated", type_name, ".UnpackedInput"),
+ absl::StrCat("ValidDataRepeated", type_name, ".UnpackedInput"),
REQUIRED, default_proto_unpacked, text, is_proto3);
RunValidProtobufTest(
- StrCat("ValidDataRepeated", type_name, ".PackedInput"),
+ absl::StrCat("ValidDataRepeated", type_name, ".PackedInput"),
REQUIRED, default_proto_packed, text, is_proto3);
// proto2 should encode as unpacked by default and proto3 should encode as
@@ -863,27 +867,27 @@
string expected_proto = rep_field->is_packed()
? default_proto_packed_expected
: default_proto_unpacked_expected;
- RunValidBinaryProtobufTest(StrCat("ValidDataRepeated", type_name,
+ RunValidBinaryProtobufTest(absl::StrCat("ValidDataRepeated", type_name,
".UnpackedInput.DefaultOutput"),
RECOMMENDED, default_proto_unpacked,
expected_proto, is_proto3);
- RunValidBinaryProtobufTest(StrCat("ValidDataRepeated", type_name,
+ RunValidBinaryProtobufTest(absl::StrCat("ValidDataRepeated", type_name,
".PackedInput.DefaultOutput"),
RECOMMENDED, default_proto_packed,
expected_proto, is_proto3);
- RunValidBinaryProtobufTest(StrCat("ValidDataRepeated", type_name,
+ RunValidBinaryProtobufTest(absl::StrCat("ValidDataRepeated", type_name,
".UnpackedInput.PackedOutput"),
RECOMMENDED, packed_proto_unpacked,
packed_proto_expected, is_proto3);
- RunValidBinaryProtobufTest(StrCat("ValidDataRepeated", type_name,
+ RunValidBinaryProtobufTest(absl::StrCat("ValidDataRepeated", type_name,
".PackedInput.PackedOutput"),
RECOMMENDED, packed_proto_packed,
packed_proto_expected, is_proto3);
- RunValidBinaryProtobufTest(StrCat("ValidDataRepeated", type_name,
+ RunValidBinaryProtobufTest(absl::StrCat("ValidDataRepeated", type_name,
".UnpackedInput.UnpackedOutput"),
RECOMMENDED, unpacked_proto_unpacked,
unpacked_proto_expected, is_proto3);
- RunValidBinaryProtobufTest(StrCat("ValidDataRepeated", type_name,
+ RunValidBinaryProtobufTest(absl::StrCat("ValidDataRepeated", type_name,
".PackedInput.UnpackedOutput"),
RECOMMENDED, unpacked_proto_packed,
unpacked_proto_expected, is_proto3);
@@ -897,9 +901,10 @@
}
std::unique_ptr<Message> test_message = NewTestMessage(is_proto3);
test_message->MergeFromString(expected_proto);
- string text = test_message->DebugString();
+ string text;
+ TextFormat::PrintToString(*test_message, &text);
- RunValidProtobufTest(StrCat("ValidDataRepeated", type_name),
+ RunValidProtobufTest(absl::StrCat("ValidDataRepeated", type_name),
REQUIRED, proto, text, is_proto3);
}
}
@@ -974,8 +979,9 @@
delim(cat(key1_data, value1_data)));
std::unique_ptr<Message> test_message = NewTestMessage(is_proto3);
test_message->MergeFromString(proto);
- string text = test_message->DebugString();
- RunValidProtobufTest(StrCat("ValidDataMap", key_type_name,
+ string text;
+ TextFormat::PrintToString(*test_message, &text);
+ RunValidProtobufTest(absl::StrCat("ValidDataMap", key_type_name,
value_type_name, ".Default"),
REQUIRED, proto, text, is_proto3);
}
@@ -987,8 +993,9 @@
delim(""));
std::unique_ptr<Message> test_message = NewTestMessage(is_proto3);
test_message->MergeFromString(proto);
- string text = test_message->DebugString();
- RunValidProtobufTest(StrCat("ValidDataMap", key_type_name,
+ string text;
+ TextFormat::PrintToString(*test_message, &text);
+ RunValidProtobufTest(absl::StrCat("ValidDataMap", key_type_name,
value_type_name, ".MissingDefault"),
REQUIRED, proto, text, is_proto3);
}
@@ -1000,8 +1007,9 @@
delim(cat(key2_data, value2_data)));
std::unique_ptr<Message> test_message = NewTestMessage(is_proto3);
test_message->MergeFromString(proto);
- string text = test_message->DebugString();
- RunValidProtobufTest(StrCat("ValidDataMap", key_type_name,
+ string text;
+ TextFormat::PrintToString(*test_message, &text);
+ RunValidProtobufTest(absl::StrCat("ValidDataMap", key_type_name,
value_type_name, ".NonDefault"),
REQUIRED, proto, text, is_proto3);
}
@@ -1013,8 +1021,9 @@
delim(cat(value2_data, key2_data)));
std::unique_ptr<Message> test_message = NewTestMessage(is_proto3);
test_message->MergeFromString(proto);
- string text = test_message->DebugString();
- RunValidProtobufTest(StrCat("ValidDataMap", key_type_name,
+ string text;
+ TextFormat::PrintToString(*test_message, &text);
+ RunValidProtobufTest(absl::StrCat("ValidDataMap", key_type_name,
value_type_name, ".Unordered"),
REQUIRED, proto, text, is_proto3);
}
@@ -1030,8 +1039,9 @@
string proto = cat(proto1, proto2);
std::unique_ptr<Message> test_message = NewTestMessage(is_proto3);
test_message->MergeFromString(proto2);
- string text = test_message->DebugString();
- RunValidProtobufTest(StrCat("ValidDataMap", key_type_name,
+ string text;
+ TextFormat::PrintToString(*test_message, &text);
+ RunValidProtobufTest(absl::StrCat("ValidDataMap", key_type_name,
value_type_name, ".DuplicateKey"),
REQUIRED, proto, text, is_proto3);
}
@@ -1043,9 +1053,10 @@
delim(cat(key1_data, key2_data, value2_data)));
std::unique_ptr<Message> test_message = NewTestMessage(is_proto3);
test_message->MergeFromString(proto);
- string text = test_message->DebugString();
+ string text;
+ TextFormat::PrintToString(*test_message, &text);
RunValidProtobufTest(
- StrCat("ValidDataMap", key_type_name, value_type_name,
+ absl::StrCat("ValidDataMap", key_type_name, value_type_name,
".DuplicateKeyInMapEntry"),
REQUIRED, proto, text, is_proto3);
}
@@ -1057,9 +1068,10 @@
delim(cat(key2_data, value1_data, value2_data)));
std::unique_ptr<Message> test_message = NewTestMessage(is_proto3);
test_message->MergeFromString(proto);
- string text = test_message->DebugString();
+ string text;
+ TextFormat::PrintToString(*test_message, &text);
RunValidProtobufTest(
- StrCat("ValidDataMap", key_type_name, value_type_name,
+ absl::StrCat("ValidDataMap", key_type_name, value_type_name,
".DuplicateValueInMapEntry"),
REQUIRED, proto, text, is_proto3);
}
@@ -1097,7 +1109,8 @@
string proto = cat(proto1, proto2);
std::unique_ptr<Message> test_message = NewTestMessage(is_proto3);
test_message->MergeFromString(proto2);
- string text = test_message->DebugString();
+ string text;
+ TextFormat::PrintToString(*test_message, &text);
RunValidProtobufTest("ValidDataMap.STRING.MESSAGE.MergeValue", REQUIRED,
proto, text, is_proto3);
}
@@ -1122,13 +1135,14 @@
const string proto = default_value;
std::unique_ptr<Message> test_message = NewTestMessage(is_proto3);
test_message->MergeFromString(proto);
- string text = test_message->DebugString();
+ string text;
+ TextFormat::PrintToString(*test_message, &text);
RunValidProtobufTest(
- StrCat("ValidDataOneof", type_name, ".DefaultValue"), REQUIRED,
+ absl::StrCat("ValidDataOneof", type_name, ".DefaultValue"), REQUIRED,
proto, text, is_proto3);
RunValidBinaryProtobufTest(
- StrCat("ValidDataOneofBinary", type_name, ".DefaultValue"),
+ absl::StrCat("ValidDataOneofBinary", type_name, ".DefaultValue"),
RECOMMENDED, proto, proto, is_proto3);
}
@@ -1137,28 +1151,30 @@
const string proto = non_default_value;
std::unique_ptr<Message> test_message = NewTestMessage(is_proto3);
test_message->MergeFromString(proto);
- string text = test_message->DebugString();
+ string text;
+ TextFormat::PrintToString(*test_message, &text);
RunValidProtobufTest(
- StrCat("ValidDataOneof", type_name, ".NonDefaultValue"),
+ absl::StrCat("ValidDataOneof", type_name, ".NonDefaultValue"),
REQUIRED, proto, text, is_proto3);
RunValidBinaryProtobufTest(
- StrCat("ValidDataOneofBinary", type_name, ".NonDefaultValue"),
+ absl::StrCat("ValidDataOneofBinary", type_name, ".NonDefaultValue"),
RECOMMENDED, proto, proto, is_proto3);
}
{
// Tests oneof with multiple values of the same field.
- const string proto = StrCat(default_value, non_default_value);
+ const string proto = absl::StrCat(default_value, non_default_value);
const string expected_proto = non_default_value;
std::unique_ptr<Message> test_message = NewTestMessage(is_proto3);
test_message->MergeFromString(expected_proto);
- string text = test_message->DebugString();
+ string text;
+ TextFormat::PrintToString(*test_message, &text);
- RunValidProtobufTest(StrCat("ValidDataOneof", type_name,
+ RunValidProtobufTest(absl::StrCat("ValidDataOneof", type_name,
".MultipleValuesForSameField"),
REQUIRED, proto, text, is_proto3);
- RunValidBinaryProtobufTest(StrCat("ValidDataOneofBinary", type_name,
+ RunValidBinaryProtobufTest(absl::StrCat("ValidDataOneofBinary", type_name,
".MultipleValuesForSameField"),
RECOMMENDED, proto, expected_proto, is_proto3);
}
@@ -1175,17 +1191,18 @@
cat(tag(other_field->number(), other_wire_type),
GetDefaultValue(other_type));
- const string proto = StrCat(other_value, non_default_value);
+ const string proto = absl::StrCat(other_value, non_default_value);
const string expected_proto = non_default_value;
std::unique_ptr<Message> test_message = NewTestMessage(is_proto3);
test_message->MergeFromString(expected_proto);
- string text = test_message->DebugString();
+ string text;
+ TextFormat::PrintToString(*test_message, &text);
- RunValidProtobufTest(StrCat("ValidDataOneof", type_name,
+ RunValidProtobufTest(absl::StrCat("ValidDataOneof", type_name,
".MultipleValuesForDifferentField"),
REQUIRED, proto, text, is_proto3);
RunValidBinaryProtobufTest(
- StrCat("ValidDataOneofBinary", type_name,
+ absl::StrCat("ValidDataOneofBinary", type_name,
".MultipleValuesForDifferentField"),
RECOMMENDED, proto, expected_proto, is_proto3);
}
@@ -1224,7 +1241,8 @@
std::unique_ptr<Message> test_message = NewTestMessage(is_proto3);
test_message->MergeFromString(expected_proto);
- string text = test_message->DebugString();
+ string text;
+ TextFormat::PrintToString(*test_message, &text);
RunValidProtobufTest("ValidDataOneof.MESSAGE.Merge", REQUIRED, proto, text,
is_proto3);
RunValidBinaryProtobufTest("ValidDataOneofBinary.MESSAGE.Merge",
@@ -2724,6 +2742,12 @@
"DurationNull", REQUIRED,
R"({"optionalDuration": null})",
"");
+ RunValidJsonTest("DurationNegativeSeconds", REQUIRED,
+ R"({"optionalDuration": "-5s"})",
+ "optional_duration: {seconds: -5 nanos: 0}");
+ RunValidJsonTest("DurationNegativeNanos", REQUIRED,
+ R"({"optionalDuration": "-0.5s"})",
+ "optional_duration: {seconds: 0 nanos: -500000000}");
ExpectParseFailureForJson(
"DurationMissingS", REQUIRED,
diff --git a/conformance/conformance.proto b/conformance/conformance.proto
index 7248e98..a9edbab 100644
--- a/conformance/conformance.proto
+++ b/conformance/conformance.proto
@@ -92,10 +92,6 @@
// The payload (whether protobuf of JSON) is always for a
// protobuf_test_messages.proto3.TestAllTypes proto (as defined in
// src/google/protobuf/proto3_test_messages.proto).
- //
- // TODO(haberman): if/when we expand the conformance tests to support proto2,
- // we will want to include a field that lets the payload/response be a
- // protobuf_test_messages.google.protobuf.TestAllTypes message instead.
oneof payload {
bytes protobuf_payload = 1;
string json_payload = 2;
diff --git a/conformance/conformance_cpp.cc b/conformance/conformance_cpp.cc
index 5782789..eef8a40 100644
--- a/conformance/conformance_cpp.cc
+++ b/conformance/conformance_cpp.cc
@@ -32,165 +32,175 @@
#include <stdarg.h>
#include <unistd.h>
-#include <google/protobuf/message.h>
-#include <google/protobuf/text_format.h>
-#include <google/protobuf/util/json_util.h>
-#include <google/protobuf/util/type_resolver_util.h>
-#include <google/protobuf/stubs/status.h>
-#include "conformance.pb.h"
-#include <google/protobuf/test_messages_proto2.pb.h>
-#include <google/protobuf/test_messages_proto3.pb.h>
-#include <google/protobuf/stubs/status.h>
+#include <memory>
+#include <string>
+#include <utility>
-using conformance::ConformanceRequest;
-using conformance::ConformanceResponse;
-using google::protobuf::Descriptor;
-using google::protobuf::DescriptorPool;
-using google::protobuf::Message;
-using google::protobuf::MessageFactory;
-using google::protobuf::TextFormat;
-using google::protobuf::util::BinaryToJsonString;
-using google::protobuf::util::JsonParseOptions;
-using google::protobuf::util::JsonToBinaryString;
-using google::protobuf::util::NewTypeResolverForDescriptorPool;
-using google::protobuf::util::TypeResolver;
-using protobuf_test_messages::proto3::TestAllTypesProto3;
-using protobuf_test_messages::proto2::TestAllTypesProto2;
-using std::string;
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/message.h"
+#include "google/protobuf/text_format.h"
+#include "google/protobuf/util/json_util.h"
+#include "google/protobuf/util/type_resolver_util.h"
+#include "absl/status/status.h"
+#include "absl/status/statusor.h"
+#include "conformance/conformance.pb.h"
+#include "conformance/conformance.pb.h"
+#include "google/protobuf/test_messages_proto2.pb.h"
+#include "google/protobuf/test_messages_proto3.pb.h"
+#include "google/protobuf/test_messages_proto3.pb.h"
+#include "google/protobuf/util/type_resolver.h"
+#include "google/protobuf/stubs/status_macros.h"
-static const char kTypeUrlPrefix[] = "type.googleapis.com";
-
-const char* kFailures[] = {
-};
-
-static string GetTypeUrl(const Descriptor* message) {
- return string(kTypeUrlPrefix) + "/" + message->full_name();
-}
-
-int test_count = 0;
-bool verbose = false;
-TypeResolver* type_resolver;
-string* type_url;
+// Must be included last.
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
+namespace {
+using ::conformance::ConformanceRequest;
+using ::conformance::ConformanceResponse;
+using ::google::protobuf::util::BinaryToJsonString;
+using ::google::protobuf::util::JsonParseOptions;
+using ::google::protobuf::util::JsonToBinaryString;
+using ::google::protobuf::util::NewTypeResolverForDescriptorPool;
+using ::google::protobuf::util::TypeResolver;
+using ::protobuf_test_messages::proto2::TestAllTypesProto2;
+using ::protobuf_test_messages::proto3::TestAllTypesProto3;
-using util::Status;
-
-bool CheckedRead(int fd, void *buf, size_t len) {
- size_t ofs = 0;
+absl::Status ReadFd(int fd, char* buf, size_t len) {
while (len > 0) {
- ssize_t bytes_read = read(fd, (char*)buf + ofs, len);
+ ssize_t bytes_read = read(fd, buf, len);
- if (bytes_read == 0) return false;
+ if (bytes_read == 0) {
+ return absl::DataLossError("unexpected EOF");
+ }
if (bytes_read < 0) {
- GOOGLE_LOG(FATAL) << "Error reading from test runner: " << strerror(errno);
+ return absl::ErrnoToStatus(errno, "error reading from test runner");
}
len -= bytes_read;
- ofs += bytes_read;
+ buf += bytes_read;
}
-
- return true;
+ return absl::OkStatus();
}
-void CheckedWrite(int fd, const void *buf, size_t len) {
- if (write(fd, buf, len) != len) {
- GOOGLE_LOG(FATAL) << "Error writing to test runner: " << strerror(errno);
+absl::Status WriteFd(int fd, const void* buf, size_t len) {
+ if (static_cast<size_t>(write(fd, buf, len)) != len) {
+ return absl::ErrnoToStatus(errno, "error reading to test runner");
}
+ return absl::OkStatus();
}
-void DoTest(const ConformanceRequest& request, ConformanceResponse* response) {
- Message *test_message;
- google::protobuf::LinkMessageReflection<TestAllTypesProto2>();
- google::protobuf::LinkMessageReflection<TestAllTypesProto3>();
- const Descriptor *descriptor = DescriptorPool::generated_pool()->FindMessageTypeByName(
- request.message_type());
- if (!descriptor) {
- GOOGLE_LOG(FATAL) << "No such message type: " << request.message_type();
+class Harness {
+ public:
+ Harness() {
+ google::protobuf::LinkMessageReflection<TestAllTypesProto2>();
+ google::protobuf::LinkMessageReflection<TestAllTypesProto3>();
+
+ resolver_.reset(NewTypeResolverForDescriptorPool(
+ "type.googleapis.com", DescriptorPool::generated_pool()));
+ type_url_ = absl::StrCat("type.googleapis.com/",
+ TestAllTypesProto3::GetDescriptor()->full_name());
}
- test_message = MessageFactory::generated_factory()->GetPrototype(descriptor)->New();
+
+ absl::StatusOr<ConformanceResponse> RunTest(
+ const ConformanceRequest& request);
+
+ // Returns Ok(true) if we're done processing requests.
+ absl::StatusOr<bool> ServeConformanceRequest();
+
+ private:
+ bool verbose_ = false;
+ std::unique_ptr<TypeResolver> resolver_;
+ std::string type_url_;
+};
+
+absl::StatusOr<ConformanceResponse> Harness::RunTest(
+ const ConformanceRequest& request) {
+ const Descriptor* descriptor =
+ DescriptorPool::generated_pool()->FindMessageTypeByName(
+ request.message_type());
+ if (descriptor == nullptr) {
+ return absl::NotFoundError(
+ absl::StrCat("No such message type: ", request.message_type()));
+ }
+
+ std::unique_ptr<Message> test_message(
+ MessageFactory::generated_factory()->GetPrototype(descriptor)->New());
+ ConformanceResponse response;
switch (request.payload_case()) {
case ConformanceRequest::kProtobufPayload: {
if (!test_message->ParseFromString(request.protobuf_payload())) {
- // Getting parse details would involve something like:
- // http://stackoverflow.com/questions/22121922/how-can-i-get-more-details-about-errors-generated-during-protobuf-parsing-c
- response->set_parse_error("Parse error (no more details available).");
- return;
+ response.set_parse_error("parse error (no more details available)");
+ return response;
}
break;
}
case ConformanceRequest::kJsonPayload: {
- string proto_binary;
JsonParseOptions options;
options.ignore_unknown_fields =
(request.test_category() ==
- conformance::JSON_IGNORE_UNKNOWN_PARSING_TEST);
- util::Status status =
- JsonToBinaryString(type_resolver, *type_url, request.json_payload(),
+ conformance::JSON_IGNORE_UNKNOWN_PARSING_TEST);
+
+ std::string proto_binary;
+ absl::Status status =
+ JsonToBinaryString(resolver_.get(), type_url_, request.json_payload(),
&proto_binary, options);
if (!status.ok()) {
- response->set_parse_error(string("Parse error: ") +
- std::string(status.message()));
- return;
+ response.set_parse_error(
+ absl::StrCat("parse error: ", status.message()));
+ return response;
}
if (!test_message->ParseFromString(proto_binary)) {
- response->set_runtime_error(
- "Parsing JSON generates invalid proto output.");
- return;
+ response.set_runtime_error(
+ "parsing JSON generated invalid proto output");
+ return response;
}
+
break;
}
case ConformanceRequest::kTextPayload: {
- if (!TextFormat::ParseFromString(request.text_payload(), test_message)) {
- response->set_parse_error("Parse error");
- return;
+ if (!TextFormat::ParseFromString(request.text_payload(),
+ test_message.get())) {
+ response.set_parse_error("parse error (no more details available)");
+ return response;
}
break;
}
case ConformanceRequest::PAYLOAD_NOT_SET:
- GOOGLE_LOG(FATAL) << "Request didn't have payload.";
- break;
+ return absl::InvalidArgumentError("request didn't have payload");
default:
- GOOGLE_LOG(FATAL) << "unknown payload type: " << request.payload_case();
- break;
- }
-
- conformance::FailureSet failures;
- if (descriptor == failures.GetDescriptor()) {
- for (const char* s : kFailures) failures.add_failure(s);
- test_message = &failures;
+ return absl::InvalidArgumentError(
+ absl::StrCat("unknown payload type", request.payload_case()));
}
switch (request.requested_output_format()) {
case conformance::UNSPECIFIED:
- GOOGLE_LOG(FATAL) << "Unspecified output format";
- break;
+ return absl::InvalidArgumentError("unspecified output format");
case conformance::PROTOBUF: {
- GOOGLE_CHECK(test_message->SerializeToString(
- response->mutable_protobuf_payload()));
+ GOOGLE_CHECK(
+ test_message->SerializeToString(response.mutable_protobuf_payload()));
break;
}
case conformance::JSON: {
- string proto_binary;
+ std::string proto_binary;
GOOGLE_CHECK(test_message->SerializeToString(&proto_binary));
- util::Status status =
- BinaryToJsonString(type_resolver, *type_url, proto_binary,
- response->mutable_json_payload());
+ absl::Status status =
+ BinaryToJsonString(resolver_.get(), type_url_, proto_binary,
+ response.mutable_json_payload());
if (!status.ok()) {
- response->set_serialize_error(
- string("Failed to serialize JSON output: ") +
- std::string(status.message()));
- return;
+ response.set_serialize_error(absl::StrCat(
+ "failed to serialize JSON output: ", status.message()));
}
break;
}
@@ -199,70 +209,66 @@
TextFormat::Printer printer;
printer.SetHideUnknownFields(!request.print_unknown_fields());
GOOGLE_CHECK(printer.PrintToString(*test_message,
- response->mutable_text_payload()));
+ response.mutable_text_payload()));
break;
}
default:
- GOOGLE_LOG(FATAL) << "Unknown output format: "
- << request.requested_output_format();
+ return absl::InvalidArgumentError(absl::StrCat(
+ "unknown output format", request.requested_output_format()));
}
+
+ return response;
}
-bool DoTestIo() {
- string serialized_input;
- string serialized_output;
+absl::StatusOr<bool> Harness::ServeConformanceRequest() {
+ uint32_t in_len;
+ if (!ReadFd(STDIN_FILENO, reinterpret_cast<char*>(&in_len), sizeof(in_len))
+ .ok()) {
+ // EOF means we're done.
+ return true;
+ }
+
+ std::string serialized_input;
+ serialized_input.resize(in_len);
+ RETURN_IF_ERROR(ReadFd(STDIN_FILENO, &serialized_input[0], in_len));
+
ConformanceRequest request;
- ConformanceResponse response;
- uint32_t bytes;
+ GOOGLE_CHECK(request.ParseFromString(serialized_input));
- if (!CheckedRead(STDIN_FILENO, &bytes, sizeof(uint32_t))) {
- // EOF.
- return false;
+ absl::StatusOr<ConformanceResponse> response = RunTest(request);
+ RETURN_IF_ERROR(response.status());
+
+ std::string serialized_output;
+ response->SerializeToString(&serialized_output);
+
+ uint32_t out_len = static_cast<uint32_t>(serialized_output.size());
+ RETURN_IF_ERROR(WriteFd(STDOUT_FILENO, &out_len, sizeof(out_len)));
+ RETURN_IF_ERROR(WriteFd(STDOUT_FILENO, serialized_output.data(), out_len));
+
+ if (verbose_) {
+ GOOGLE_LOG(INFO) << "conformance-cpp: request=" << request.ShortDebugString()
+ << ", response=" << response->ShortDebugString();
}
-
- serialized_input.resize(bytes);
-
- if (!CheckedRead(STDIN_FILENO, (char*)serialized_input.c_str(), bytes)) {
- GOOGLE_LOG(ERROR) << "Unexpected EOF on stdin. " << strerror(errno);
- }
-
- if (!request.ParseFromString(serialized_input)) {
- GOOGLE_LOG(FATAL) << "Parse of ConformanceRequest proto failed.";
- return false;
- }
-
- DoTest(request, &response);
-
- response.SerializeToString(&serialized_output);
-
- bytes = serialized_output.size();
- CheckedWrite(STDOUT_FILENO, &bytes, sizeof(uint32_t));
- CheckedWrite(STDOUT_FILENO, serialized_output.c_str(), bytes);
-
- if (verbose) {
- fprintf(stderr, "conformance-cpp: request=%s, response=%s\n",
- request.ShortDebugString().c_str(),
- response.ShortDebugString().c_str());
- }
-
- test_count++;
-
- return true;
+ return false;
}
-
+} // namespace
} // namespace protobuf
} // namespace google
int main() {
- type_resolver = NewTypeResolverForDescriptorPool(
- kTypeUrlPrefix, DescriptorPool::generated_pool());
- type_url = new string(GetTypeUrl(TestAllTypesProto3::descriptor()));
- while (1) {
- if (!google::protobuf::DoTestIo()) {
- fprintf(stderr, "conformance-cpp: received EOF from test runner "
- "after %d tests, exiting\n", test_count);
- return 0;
+ google::protobuf::Harness harness;
+ int total_runs = 0;
+ while (true) {
+ auto is_done = harness.ServeConformanceRequest();
+ if (!is_done.ok()) {
+ GOOGLE_LOG(FATAL) << is_done.status();
}
+ if (*is_done) {
+ break;
+ }
+ total_runs++;
}
+ GOOGLE_LOG(INFO) << "conformance-cpp: received EOF from test runner after "
+ << total_runs << " tests";
}
diff --git a/conformance/conformance_nodejs.js b/conformance/conformance_nodejs.js
deleted file mode 100755
index 275fac4..0000000
--- a/conformance/conformance_nodejs.js
+++ /dev/null
@@ -1,189 +0,0 @@
-#!/usr/bin/env node
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-var conformance = require('conformance_pb');
-var test_messages_proto3 = require('google/protobuf/test_messages_proto3_pb');
-var test_messages_proto2 = require('google/protobuf/test_messages_proto2_pb');
-var fs = require('fs');
-
-var testCount = 0;
-
-function doTest(request) {
- var testMessage;
- var response = new conformance.ConformanceResponse();
-
- try {
- if (request.getRequestedOutputFormat() == conformance.WireFormat.JSON) {
- response.setSkipped("JSON not supported.");
- return response;
- }
-
- if (request.getRequestedOutputFormat() ==
- conformance.WireFormat.TEXT_FORMAT) {
- response.setSkipped('Text format is not supported as output format.');
- return response;
- }
-
- switch (request.getPayloadCase()) {
- case conformance.ConformanceRequest.PayloadCase.PROTOBUF_PAYLOAD: {
- if (request.getMessageType() == "protobuf_test_messages.proto3.TestAllTypesProto3") {
- try {
- testMessage = test_messages_proto3.TestAllTypesProto3.deserializeBinary(
- request.getProtobufPayload());
- } catch (err) {
- response.setParseError(err.toString());
- return response;
- }
- } else if (request.getMessageType() == "protobuf_test_messages.proto2.TestAllTypesProto2"){
- try {
- testMessage = test_messages_proto2.TestAllTypesProto2.deserializeBinary(
- request.getProtobufPayload());
- } catch (err) {
- response.setParseError(err.toString());
- return response;
- }
- } else {
- throw "Protobuf request doesn\'t have specific payload type";
- }
- } break;
-
- case conformance.ConformanceRequest.PayloadCase.JSON_PAYLOAD:
- response.setSkipped("JSON not supported.");
- return response;
-
- case conformance.ConformanceRequest.PayloadCase.TEXT_PAYLOAD:
- response.setSkipped("Text format not supported.");
- return response;
-
- case conformance.ConformanceRequest.PayloadCase.PAYLOAD_NOT_SET:
- response.setRuntimeError("Request didn't have payload");
- return response;
- }
-
- switch (request.getRequestedOutputFormat()) {
- case conformance.WireFormat.UNSPECIFIED:
- response.setRuntimeError("Unspecified output format");
- return response;
-
- case conformance.WireFormat.PROTOBUF:
- response.setProtobufPayload(testMessage.serializeBinary());
-
- case conformance.WireFormat.JSON:
- response.setSkipped("JSON not supported.");
- return response;
-
- default:
- throw "Request didn't have requested output format";
- }
- } catch (err) {
- response.setRuntimeError(err.toString());
- }
-
- return response;
-}
-
-function onEof(totalRead) {
- if (totalRead == 0) {
- return undefined;
- } else {
- throw "conformance_nodejs: premature EOF on stdin.";
- }
-}
-
-// Utility function to read a buffer of N bytes.
-function readBuffer(bytes) {
- var buf = new Buffer(bytes);
- var totalRead = 0;
- while (totalRead < bytes) {
- var read = 0;
- try {
- read = fs.readSync(process.stdin.fd, buf, totalRead, bytes - totalRead);
- } catch (e) {
- if (e.code == 'EOF') {
- return onEof(totalRead)
- } else if (e.code == 'EAGAIN') {
- } else {
- throw "conformance_nodejs: Error reading from stdin." + e;
- }
- }
-
- totalRead += read;
- }
-
- return buf;
-}
-
-function writeBuffer(buffer) {
- var totalWritten = 0;
- while (totalWritten < buffer.length) {
- totalWritten += fs.writeSync(
- process.stdout.fd, buffer, totalWritten, buffer.length - totalWritten);
- }
-}
-
-// Returns true if the test ran successfully, false on legitimate EOF.
-// If EOF is encountered in an unexpected place, raises IOError.
-function doTestIo() {
- var lengthBuf = readBuffer(4);
- if (!lengthBuf) {
- return false;
- }
-
- var length = lengthBuf.readInt32LE(0);
- var serializedRequest = readBuffer(length);
- if (!serializedRequest) {
- throw "conformance_nodejs: Failed to read request.";
- }
-
- serializedRequest = new Uint8Array(serializedRequest);
- var request =
- conformance.ConformanceRequest.deserializeBinary(serializedRequest);
- var response = doTest(request);
-
- var serializedResponse = response.serializeBinary();
-
- lengthBuf = new Buffer(4);
- lengthBuf.writeInt32LE(serializedResponse.length, 0);
- writeBuffer(lengthBuf);
- writeBuffer(new Buffer(serializedResponse));
-
- testCount += 1
-
- return true;
-}
-
-while (true) {
- if (!doTestIo()) {
- console.error('conformance_nodejs: received EOF from test runner ' +
- "after " + testCount + " tests, exiting")
- break;
- }
-}
diff --git a/conformance/conformance_objc.m b/conformance/conformance_objc.m
index ab751c8..12f06c9 100644
--- a/conformance/conformance_objc.m
+++ b/conformance/conformance_objc.m
@@ -77,7 +77,7 @@
if ([request.messageType isEqual:@"protobuf_test_messages.proto3.TestAllTypesProto3"]) {
msgClass = [Proto3TestAllTypesProto3 class];
} else if ([request.messageType isEqual:@"protobuf_test_messages.proto2.TestAllTypesProto2"]) {
- msgClass = [TestAllTypesProto2 class];
+ msgClass = [Proto2TestAllTypesProto2 class];
} else {
response.runtimeError =
[NSString stringWithFormat:@"Protobuf request had an unknown message_type: %@",
diff --git a/conformance/conformance_php.php b/conformance/conformance_php.php
index 9eef0c5..f250ebf 100644
--- a/conformance/conformance_php.php
+++ b/conformance/conformance_php.php
@@ -14,7 +14,7 @@
require_once("Protobuf_test_messages/Proto3/TestAllTypesProto3/NestedEnum.php");
require_once("GPBMetadata/Conformance.php");
-require_once("GPBMetadata/Google/Protobuf/TestMessagesProto3.php");
+require_once("GPBMetadata/TestMessagesProto3.php");
use \Conformance\TestCategory;
use \Conformance\WireFormat;
@@ -113,7 +113,7 @@
while(true){
if (!doTestIO()) {
fprintf(STDERR,
- "conformance_php: received EOF from test runner " +
+ "conformance_php: received EOF from test runner " .
"after %d tests, exiting\n", $test_count);
exit;
}
diff --git a/conformance/conformance_python.py b/conformance/conformance_python.py
index 37ee36e..cffadc9 100755
--- a/conformance/conformance_python.py
+++ b/conformance/conformance_python.py
@@ -42,7 +42,7 @@
from google.protobuf import test_messages_proto3_pb2
from google.protobuf import test_messages_proto2_pb2
from google.protobuf import text_format
-import conformance_pb2
+from conformance import conformance_pb2
sys.stdout = os.fdopen(sys.stdout.fileno(), 'wb', 0)
sys.stdin = os.fdopen(sys.stdin.fileno(), 'rb', 0)
diff --git a/conformance/conformance_test.cc b/conformance/conformance_test.cc
index 2c856f5..e2a9296 100644
--- a/conformance/conformance_test.cc
+++ b/conformance/conformance_test.cc
@@ -36,13 +36,14 @@
#include <set>
#include <string>
-#include <google/protobuf/stubs/stringprintf.h>
-#include <google/protobuf/message.h>
-#include <google/protobuf/text_format.h>
-#include <google/protobuf/util/field_comparator.h>
-#include <google/protobuf/util/json_util.h>
-#include <google/protobuf/util/message_differencer.h>
-#include "conformance.pb.h"
+#include "google/protobuf/message.h"
+#include "google/protobuf/text_format.h"
+#include "google/protobuf/util/field_comparator.h"
+#include "google/protobuf/util/json_util.h"
+#include "google/protobuf/util/message_differencer.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/str_format.h"
+#include "conformance/conformance.pb.h"
using conformance::ConformanceRequest;
using conformance::ConformanceResponse;
@@ -129,7 +130,7 @@
prototype_message_.GetDescriptor()->file()->syntax() ==
FileDescriptor::SYNTAX_PROTO3 ? "Proto3" : "Proto2";
- return StrCat(ConformanceLevelToString(level_), ".", rname, ".",
+ return absl::StrCat(ConformanceLevelToString(level_), ".", rname, ".",
InputFormatString(input_format_), ".", test_name_, ".",
OutputFormatString(output_format_));
}
@@ -177,10 +178,11 @@
void ConformanceTestSuite::ReportSuccess(const string& test_name) {
if (expected_to_fail_.erase(test_name) != 0) {
- StringAppendF(&output_,
- "ERROR: test %s is in the failure list, but test succeeded. "
- "Remove it from the failure list.\n",
- test_name.c_str());
+ absl::StrAppendFormat(
+ &output_,
+ "ERROR: test %s is in the failure list, but test succeeded. "
+ "Remove it from the failure list.\n",
+ test_name);
unexpected_succeeding_tests_.insert(test_name);
}
successes_++;
@@ -190,33 +192,29 @@
ConformanceLevel level,
const ConformanceRequest& request,
const ConformanceResponse& response,
- const char* fmt, ...) {
+ absl::string_view message) {
if (expected_to_fail_.erase(test_name) == 1) {
expected_failures_++;
if (!verbose_)
return;
} else if (level == RECOMMENDED && !enforce_recommended_) {
- StringAppendF(&output_, "WARNING, test=%s: ", test_name.c_str());
+ absl::StrAppendFormat(&output_, "WARNING, test=%s: ", test_name);
} else {
- StringAppendF(&output_, "ERROR, test=%s: ", test_name.c_str());
+ absl::StrAppendFormat(&output_, "ERROR, test=%s: ", test_name);
unexpected_failing_tests_.insert(test_name);
}
- va_list args;
- va_start(args, fmt);
- StringAppendV(&output_, fmt, args);
- va_end(args);
- StringAppendF(&output_, " request=%s, response=%s\n",
- request.ShortDebugString().c_str(),
- response.ShortDebugString().c_str());
+ absl::StrAppendFormat(&output_, "%s request=%s, response=%s\n", message,
+ request.ShortDebugString(),
+ response.ShortDebugString());
}
void ConformanceTestSuite::ReportSkip(const string& test_name,
const ConformanceRequest& request,
const ConformanceResponse& response) {
if (verbose_) {
- StringAppendF(&output_, "SKIPPED, test=%s request=%s, response=%s\n",
- test_name.c_str(), request.ShortDebugString().c_str(),
- response.ShortDebugString().c_str());
+ absl::StrAppendFormat(
+ &output_, "SKIPPED, test=%s request=%s, response=%s\n", test_name,
+ request.ShortDebugString(), response.ShortDebugString());
}
skipped_.insert(test_name);
}
@@ -290,7 +288,7 @@
GOOGLE_DCHECK_EQ(response.result_case(), ConformanceResponse::kProtobufPayload);
const string& protobuf_payload = response.protobuf_payload();
check = equivalent_wire_format == protobuf_payload;
- differences = StrCat("Expect: ", ToOctString(equivalent_wire_format),
+ differences = absl::StrCat("Expect: ", ToOctString(equivalent_wire_format),
", but got: ", ToOctString(protobuf_payload));
} else {
check = differencer.Compare(*reference_message, *test_message);
@@ -301,9 +299,10 @@
ReportSuccess(test_name);
}
} else {
- ReportFailure(test_name, level, request, response,
- "Output was not equivalent to reference message: %s.",
- differences.c_str());
+ ReportFailure(
+ test_name, level, request, response,
+ absl::StrCat("Output was not equivalent to reference message: ",
+ differences));
}
}
@@ -326,11 +325,9 @@
}
if (verbose_) {
- StringAppendF(&output_,
- "conformance test: name=%s, request=%s, response=%s\n",
- test_name.c_str(),
- request.ShortDebugString().c_str(),
- response->ShortDebugString().c_str());
+ absl::StrAppendFormat(
+ &output_, "conformance test: name=%s, request=%s, response=%s\n",
+ test_name, request.ShortDebugString(), response->ShortDebugString());
}
}
@@ -341,13 +338,12 @@
if (set_to_check.empty()) {
return true;
} else {
- StringAppendF(&output_, "\n");
- StringAppendF(&output_, "%s\n\n", msg.c_str());
- for (std::set<string>::const_iterator iter = set_to_check.begin();
- iter != set_to_check.end(); ++iter) {
- StringAppendF(&output_, " %s\n", iter->c_str());
+ absl::StrAppendFormat(&output_, "\n");
+ absl::StrAppendFormat(&output_, "%s\n\n", msg);
+ for (absl::string_view v : set_to_check) {
+ absl::StrAppendFormat(&output_, " %s\n", v);
}
- StringAppendF(&output_, "\n");
+ absl::StrAppendFormat(&output_, "\n");
if (!write_to_file.empty()) {
std::string full_filename;
@@ -362,13 +358,11 @@
}
std::ofstream os(*filename);
if (os) {
- for (std::set<string>::const_iterator iter = set_to_check.begin();
- iter != set_to_check.end(); ++iter) {
- os << *iter << "\n";
+ for (absl::string_view v : set_to_check) {
+ os << v << "\n";
}
} else {
- StringAppendF(&output_, "Failed to open file: %s\n",
- filename->c_str());
+ absl::StrAppendFormat(&output_, "Failed to open file: %s\n", *filename);
}
}
@@ -452,12 +446,12 @@
"features is not implemented)");
}
- StringAppendF(&output_,
- "CONFORMANCE SUITE %s: %d successes, %zu skipped, "
- "%d expected failures, %zu unexpected failures.\n",
- ok ? "PASSED" : "FAILED", successes_, skipped_.size(),
- expected_failures_, unexpected_failing_tests_.size());
- StringAppendF(&output_, "\n");
+ absl::StrAppendFormat(&output_,
+ "CONFORMANCE SUITE %s: %d successes, %zu skipped, "
+ "%d expected failures, %zu unexpected failures.\n",
+ ok ? "PASSED" : "FAILED", successes_, skipped_.size(),
+ expected_failures_, unexpected_failing_tests_.size());
+ absl::StrAppendFormat(&output_, "\n");
output->assign(output_);
diff --git a/conformance/conformance_test.h b/conformance/conformance_test.h
index 2861598..f03b6d7 100644
--- a/conformance/conformance_test.h
+++ b/conformance/conformance_test.h
@@ -42,10 +42,10 @@
#include <string>
#include <vector>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/wire_format_lite.h>
-#include <google/protobuf/util/type_resolver.h>
-#include "conformance.pb.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/wire_format_lite.h"
+#include "google/protobuf/util/type_resolver.h"
+#include "conformance/conformance.pb.h"
namespace conformance {
class ConformanceRequest;
@@ -124,7 +124,7 @@
// class MyConformanceTestSuite : public ConformanceTestSuite {
// public:
// void RunSuiteImpl() {
-// // INSERT ACTURAL TESTS.
+// // INSERT ACTUAL TESTS.
// }
// };
//
@@ -276,7 +276,7 @@
void ReportFailure(const std::string& test_name, ConformanceLevel level,
const conformance::ConformanceRequest& request,
const conformance::ConformanceResponse& response,
- const char* fmt, ...);
+ absl::string_view message);
void ReportSkip(const std::string& test_name,
const conformance::ConformanceRequest& request,
const conformance::ConformanceResponse& response);
diff --git a/conformance/conformance_test_runner.cc b/conformance/conformance_test_runner.cc
index 2aac35c..7122478 100644
--- a/conformance/conformance_test_runner.cc
+++ b/conformance/conformance_test_runner.cc
@@ -62,8 +62,8 @@
#include <fstream>
#include <vector>
-#include <google/protobuf/stubs/stringprintf.h>
-#include "conformance.pb.h"
+#include "absl/strings/str_format.h"
+#include "conformance/conformance.pb.h"
#include "conformance_test.h"
using conformance::ConformanceResponse;
@@ -73,10 +73,10 @@
#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)
-#define GOOGLE_CHECK_SYSCALL(call) \
- if (call < 0) { \
+#define GOOGLE_CHECK_SYSCALL(call) \
+ if (call < 0) { \
perror(#call " " __FILE__ ":" TOSTRING(__LINE__)); \
- exit(1); \
+ exit(1); \
}
namespace google {
@@ -93,8 +93,7 @@
for (string line; getline(infile, line);) {
// Remove whitespace.
- line.erase(std::remove_if(line.begin(), line.end(), ::isspace),
- line.end());
+ line.erase(std::remove_if(line.begin(), line.end(), ::isspace), line.end());
// Remove comments.
line = line.substr(0, line.find("#"));
@@ -106,8 +105,7 @@
}
void UsageError() {
- fprintf(stderr,
- "Usage: conformance-test-runner [options] <test-program>\n");
+ fprintf(stderr, "Usage: conformance-test-runner [options] <test-program>\n");
fprintf(stderr, "\n");
fprintf(stderr, "Options:\n");
fprintf(stderr,
@@ -122,8 +120,7 @@
" --text_format_failure_list <filename> Use to specify list \n");
fprintf(stderr,
" of tests that are expected to \n");
- fprintf(stderr,
- " fail in the \n");
+ fprintf(stderr, " fail in the \n");
fprintf(stderr,
" text_format_conformance_suite. \n");
fprintf(stderr,
@@ -139,18 +136,16 @@
" this flag if you want to be\n");
fprintf(stderr,
" strictly conforming to protobuf\n");
- fprintf(stderr,
- " spec.\n");
+ fprintf(stderr, " spec.\n");
fprintf(stderr,
" --output_dir <dirname> Directory to write\n"
" output files.\n");
exit(1);
}
-void ForkPipeRunner::RunTest(
- const std::string& test_name,
- const std::string& request,
- std::string* response) {
+void ForkPipeRunner::RunTest(const std::string &test_name,
+ const std::string &request,
+ std::string *response) {
if (child_pid_ < 0) {
SpawnTestProgram();
}
@@ -170,11 +165,11 @@
string error_msg;
if (WIFEXITED(status)) {
- StringAppendF(&error_msg,
- "child exited, status=%d", WEXITSTATUS(status));
+ absl::StrAppendFormat(&error_msg, "child exited, status=%d",
+ WEXITSTATUS(status));
} else if (WIFSIGNALED(status)) {
- StringAppendF(&error_msg,
- "child killed by signal %d", WTERMSIG(status));
+ absl::StrAppendFormat(&error_msg, "child killed by signal %d",
+ WTERMSIG(status));
}
GOOGLE_LOG(INFO) << error_msg;
child_pid_ = -1;
@@ -186,17 +181,17 @@
}
response->resize(len);
- CheckedRead(read_fd_, (void*)response->c_str(), len);
+ CheckedRead(read_fd_, (void *)response->c_str(), len);
}
-int ForkPipeRunner::Run(
- int argc, char *argv[], const std::vector<ConformanceTestSuite*>& suites) {
+int ForkPipeRunner::Run(int argc, char *argv[],
+ const std::vector<ConformanceTestSuite *> &suites) {
if (suites.empty()) {
fprintf(stderr, "No test suites found.\n");
return EXIT_FAILURE;
}
bool all_ok = true;
- for (ConformanceTestSuite* suite : suites) {
+ for (ConformanceTestSuite *suite : suites) {
string program;
std::vector<string> program_args;
string failure_list_filename;
@@ -216,7 +211,7 @@
suite->SetOutputDir(argv[arg]);
} else if (argv[arg][0] == '-') {
bool recognized_flag = false;
- for (ConformanceTestSuite* suite : suites) {
+ for (ConformanceTestSuite *suite : suites) {
if (strcmp(argv[arg], suite->GetFailureListFlagName().c_str()) == 0) {
if (++arg == argc) UsageError();
recognized_flag = true;
@@ -227,7 +222,7 @@
UsageError();
}
} else {
- program += argv[arg];
+ program += argv[arg++];
while (arg < argc) {
program_args.push_back(argv[arg]);
arg++;
@@ -238,8 +233,8 @@
ForkPipeRunner runner(program, program_args);
std::string output;
- all_ok = all_ok &&
- suite->RunSuite(&runner, &output, failure_list_filename, &failure_list);
+ all_ok = all_ok && suite->RunSuite(&runner, &output, failure_list_filename,
+ &failure_list);
fwrite(output.c_str(), 1, output.size(), stderr);
}
@@ -303,8 +298,10 @@
std::vector<const char *> argv;
argv.push_back(executable.get());
+ GOOGLE_LOG(INFO) << argv[0];
for (size_t i = 0; i < executable_args_.size(); ++i) {
argv.push_back(executable_args_[i].c_str());
+ GOOGLE_LOG(INFO) << executable_args_[i];
}
argv.push_back(nullptr);
// Never returns.
@@ -322,7 +319,7 @@
bool ForkPipeRunner::TryRead(int fd, void *buf, size_t len) {
size_t ofs = 0;
while (len > 0) {
- ssize_t bytes_read = read(fd, (char*)buf + ofs, len);
+ ssize_t bytes_read = read(fd, (char *)buf + ofs, len);
if (bytes_read == 0) {
GOOGLE_LOG(ERROR) << current_test_name_ << ": unexpected EOF from test program";
diff --git a/conformance/defs.bzl b/conformance/defs.bzl
index 905953a..8daef86 100644
--- a/conformance/defs.bzl
+++ b/conformance/defs.bzl
@@ -1,6 +1,24 @@
-# PLEASE DO NOT DEPEND ON THE CONTENTS OF THIS FILE, IT IS UNSTABLE.
+"""Starlark definitions for Protobuf conformance tests.
-def conformance_test(name, testee, failure_list = None, text_format_failure_list = None):
+PLEASE DO NOT DEPEND ON THE CONTENTS OF THIS FILE, IT IS UNSTABLE.
+"""
+
+def conformance_test(
+ name,
+ testee,
+ failure_list = None,
+ text_format_failure_list = None,
+ **kwargs):
+ """Conformance test runner.
+
+ Args:
+ name: the name for the test.
+ testee: a conformance test client binary.
+ failure_list: a text file with known failures, one per line.
+ text_format_failure_list: a text file with known failures (one per line)
+ for the text format conformance suite.
+ **kwargs: common arguments to pass to sh_test.
+ """
args = ["--testee %s" % _strip_bazel(testee)]
failure_lists = []
if failure_list:
@@ -12,7 +30,7 @@
native.sh_test(
name = name,
- srcs = ["//conformance:conformance_test_runner.sh"],
+ srcs = ["//conformance:bazel_conformance_test_runner.sh"],
data = [testee] + failure_lists + [
"//conformance:conformance_test_runner",
],
@@ -20,6 +38,8 @@
deps = [
"@bazel_tools//tools/bash/runfiles",
],
+ tags = ["conformance"],
+ **kwargs
)
def _strip_bazel(testee):
diff --git a/conformance/failure_list_cpp.txt b/conformance/failure_list_cpp.txt
index d55fa9f..a68602c 100644
--- a/conformance/failure_list_cpp.txt
+++ b/conformance/failure_list_cpp.txt
@@ -12,8 +12,6 @@
Recommended.FieldMaskTooManyUnderscore.JsonOutput
Recommended.Proto3.JsonInput.BoolFieldDoubleQuotedFalse
Recommended.Proto3.JsonInput.BoolFieldDoubleQuotedTrue
-Recommended.Proto3.JsonInput.BytesFieldBase64Url.JsonOutput
-Recommended.Proto3.JsonInput.BytesFieldBase64Url.ProtobufOutput
Recommended.Proto3.JsonInput.FieldMaskInvalidCharacter
Recommended.Proto3.JsonInput.FieldNameDuplicate
Recommended.Proto3.JsonInput.FieldNameDuplicateDifferentCasing1
diff --git a/conformance/failure_list_js.txt b/conformance/failure_list_js.txt
deleted file mode 100644
index b7d36b6..0000000
--- a/conformance/failure_list_js.txt
+++ /dev/null
@@ -1,162 +0,0 @@
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.ENUM.UnpackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.ENUM.UnpackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.ENUM.UnpackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.FIXED64.PackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.FIXED64.PackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.FIXED64.PackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.FIXED64.UnpackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.FIXED64.UnpackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.FIXED64.UnpackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.INT32.PackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.INT32.PackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.INT32.PackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.INT32.UnpackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.INT32.UnpackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.INT32.UnpackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.INT64.PackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.INT64.PackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.INT64.PackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.INT64.UnpackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.INT64.UnpackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.INT64.UnpackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.SFIXED64.PackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.SFIXED64.PackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.SFIXED64.PackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.SFIXED64.UnpackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.SFIXED64.UnpackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.SFIXED64.UnpackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.SINT64.PackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.SINT64.PackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.SINT64.PackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.SINT64.UnpackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.SINT64.UnpackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.SINT64.UnpackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.UINT32.PackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.UINT32.PackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.UINT32.PackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.UINT32.UnpackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.UINT32.UnpackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.UINT32.UnpackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.UINT64.PackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.UINT64.PackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.UINT64.PackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.UINT64.UnpackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.UINT64.UnpackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.UINT64.UnpackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataScalarBinary.ENUM[4].ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataScalarBinary.ENUM[5].ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataScalarBinary.FIXED64[2].ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataScalarBinary.INT32[7].ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataScalarBinary.INT64[2].ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataScalarBinary.SFIXED64[2].ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataScalarBinary.SINT64[2].ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataScalarBinary.UINT32[8].ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataScalarBinary.UINT64[2].ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.ENUM.UnpackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.ENUM.UnpackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.ENUM.UnpackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.FIXED64.PackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.FIXED64.PackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.FIXED64.PackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.FIXED64.UnpackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.FIXED64.UnpackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.FIXED64.UnpackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.INT32.PackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.INT32.PackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.INT32.PackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.INT32.UnpackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.INT32.UnpackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.INT32.UnpackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.INT64.PackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.INT64.PackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.INT64.PackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.INT64.UnpackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.INT64.UnpackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.INT64.UnpackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.SFIXED64.PackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.SFIXED64.PackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.SFIXED64.PackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.SFIXED64.UnpackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.SFIXED64.UnpackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.SFIXED64.UnpackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.SINT64.PackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.SINT64.PackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.SINT64.PackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.SINT64.UnpackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.SINT64.UnpackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.SINT64.UnpackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.UINT32.PackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.UINT32.PackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.UINT32.PackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.UINT32.UnpackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.UINT32.UnpackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.UINT32.UnpackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.UINT64.PackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.UINT64.PackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.UINT64.PackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.UINT64.UnpackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.UINT64.UnpackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.UINT64.UnpackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataScalarBinary.ENUM[4].ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataScalarBinary.ENUM[5].ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataScalarBinary.FIXED64[2].ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataScalarBinary.INT32[7].ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataScalarBinary.INT64[2].ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataScalarBinary.SFIXED64[2].ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataScalarBinary.SINT64[2].ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataScalarBinary.UINT32[8].ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataScalarBinary.UINT64[2].ProtobufOutput
-Required.Proto2.ProtobufInput.RepeatedScalarSelectsLast.ENUM.ProtobufOutput
-Required.Proto2.ProtobufInput.RepeatedScalarSelectsLast.FIXED64.ProtobufOutput
-Required.Proto2.ProtobufInput.RepeatedScalarSelectsLast.UINT64.ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataRepeated.ENUM.UnpackedInput.ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataRepeated.FIXED64.PackedInput.ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataRepeated.FIXED64.UnpackedInput.ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataRepeated.INT32.PackedInput.ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataRepeated.INT32.UnpackedInput.ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataRepeated.INT64.PackedInput.ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataRepeated.INT64.UnpackedInput.ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataRepeated.SFIXED64.PackedInput.ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataRepeated.SFIXED64.UnpackedInput.ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataRepeated.SINT64.PackedInput.ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataRepeated.SINT64.UnpackedInput.ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataRepeated.UINT32.PackedInput.ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataRepeated.UINT32.UnpackedInput.ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataRepeated.UINT64.PackedInput.ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataRepeated.UINT64.UnpackedInput.ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataScalar.ENUM[4].ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataScalar.ENUM[5].ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataScalar.FIXED64[2].ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataScalar.INT32[7].ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataScalar.INT64[2].ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataScalar.SFIXED64[2].ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataScalar.SINT64[2].ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataScalar.UINT32[8].ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataScalar.UINT64[2].ProtobufOutput
-Required.Proto3.ProtobufInput.RepeatedScalarSelectsLast.ENUM.ProtobufOutput
-Required.Proto3.ProtobufInput.RepeatedScalarSelectsLast.FIXED64.ProtobufOutput
-Required.Proto3.ProtobufInput.RepeatedScalarSelectsLast.UINT64.ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataRepeated.ENUM.UnpackedInput.ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataRepeated.FIXED64.PackedInput.ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataRepeated.FIXED64.UnpackedInput.ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataRepeated.INT32.PackedInput.ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataRepeated.INT32.UnpackedInput.ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataRepeated.INT64.PackedInput.ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataRepeated.INT64.UnpackedInput.ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataRepeated.SFIXED64.PackedInput.ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataRepeated.SFIXED64.UnpackedInput.ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataRepeated.SINT64.PackedInput.ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataRepeated.SINT64.UnpackedInput.ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataRepeated.UINT32.PackedInput.ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataRepeated.UINT32.UnpackedInput.ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataRepeated.UINT64.PackedInput.ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataRepeated.UINT64.UnpackedInput.ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataScalar.ENUM[4].ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataScalar.ENUM[5].ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataScalar.FIXED64[2].ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataScalar.INT32[7].ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataScalar.INT64[2].ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataScalar.SFIXED64[2].ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataScalar.SINT64[2].ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataScalar.UINT32[8].ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataScalar.UINT64[2].ProtobufOutput
diff --git a/conformance/failure_list_php.txt b/conformance/failure_list_php.txt
index 667f80c..3232047 100644
--- a/conformance/failure_list_php.txt
+++ b/conformance/failure_list_php.txt
@@ -8,6 +8,8 @@
Recommended.Proto3.ProtobufInput.ValidDataOneofBinary.MESSAGE.Merge.ProtobufOutput
Required.Proto2.JsonInput.StoresDefaultPrimitive.Validator
Required.Proto3.JsonInput.DoubleFieldTooSmall
+Required.Proto3.JsonInput.DurationNegativeNanos.JsonOutput
+Required.Proto3.JsonInput.DurationNegativeNanos.ProtobufOutput
Required.Proto3.JsonInput.FloatFieldTooLarge
Required.Proto3.JsonInput.FloatFieldTooSmall
Required.Proto3.JsonInput.Int32FieldNotInteger
diff --git a/conformance/failure_list_php_c.txt b/conformance/failure_list_php_c.txt
index 63c7e8a..52ca454 100644
--- a/conformance/failure_list_php_c.txt
+++ b/conformance/failure_list_php_c.txt
@@ -1,2 +1,5 @@
Recommended.Proto2.JsonInput.FieldNameExtension.Validator
Required.Proto2.JsonInput.StoresDefaultPrimitive.Validator
+Required.Proto3.JsonInput.DurationNegativeNanos.JsonOutput
+Required.Proto3.JsonInput.DurationNegativeNanos.ProtobufOutput
+Required.Proto3.JsonInput.DurationNegativeSeconds.JsonOutput
diff --git a/conformance/failure_list_ruby.txt b/conformance/failure_list_ruby.txt
index 4938202..ff230a2 100644
--- a/conformance/failure_list_ruby.txt
+++ b/conformance/failure_list_ruby.txt
@@ -56,3 +56,6 @@
Recommended.Proto3.ProtobufInput.ValidDataRepeated.UINT32.UnpackedInput.UnpackedOutput.ProtobufOutput
Recommended.Proto3.ProtobufInput.ValidDataRepeated.UINT64.PackedInput.UnpackedOutput.ProtobufOutput
Recommended.Proto3.ProtobufInput.ValidDataRepeated.UINT64.UnpackedInput.UnpackedOutput.ProtobufOutput
+Required.Proto3.JsonInput.DurationNegativeNanos.JsonOutput
+Required.Proto3.JsonInput.DurationNegativeNanos.ProtobufOutput
+Required.Proto3.JsonInput.DurationNegativeSeconds.JsonOutput
diff --git a/conformance/text_format_conformance_suite.cc b/conformance/text_format_conformance_suite.cc
index 460bc24..958ed7b 100644
--- a/conformance/text_format_conformance_suite.cc
+++ b/conformance/text_format_conformance_suite.cc
@@ -30,11 +30,11 @@
#include "text_format_conformance_suite.h"
-#include <google/protobuf/any.pb.h>
-#include <google/protobuf/text_format.h>
+#include "google/protobuf/any.pb.h"
+#include "google/protobuf/text_format.h"
#include "conformance_test.h"
-#include <google/protobuf/test_messages_proto2.pb.h>
-#include <google/protobuf/test_messages_proto3.pb.h>
+#include "google/protobuf/test_messages_proto2.pb.h"
+#include "google/protobuf/test_messages_proto3.pb.h"
namespace proto2_messages = protobuf_test_messages::proto2;
@@ -85,10 +85,9 @@
case ConformanceResponse::kProtobufPayload: {
if (requested_output != conformance::PROTOBUF) {
ReportFailure(test_name, level, request, response,
- StrCat("Test was asked for ",
+ absl::StrCat("Test was asked for ",
WireFormatToString(requested_output),
- " output but provided PROTOBUF instead.")
- .c_str());
+ " output but provided PROTOBUF instead."));
return false;
}
@@ -103,11 +102,11 @@
case ConformanceResponse::kTextPayload: {
if (requested_output != conformance::TEXT_FORMAT) {
- ReportFailure(test_name, level, request, response,
- StrCat("Test was asked for ",
- WireFormatToString(requested_output),
- " output but provided TEXT_FORMAT instead.")
- .c_str());
+ ReportFailure(
+ test_name, level, request, response,
+ absl::StrCat("Test was asked for ",
+ WireFormatToString(requested_output),
+ " output but provided TEXT_FORMAT instead."));
return false;
}
@@ -141,7 +140,7 @@
const ConformanceRequest& request = setting.GetRequest();
ConformanceResponse response;
string effective_test_name =
- StrCat(setting.ConformanceLevelToString(level),
+ absl::StrCat(setting.ConformanceLevelToString(level),
".Proto3.TextFormatInput.", test_name);
RunTest(effective_test_name, request, &response);
@@ -263,64 +262,64 @@
const std::string field_name =
field_type == "String" ? "optional_string" : "optional_bytes";
RunValidTextFormatTest(
- StrCat("StringLiteralConcat", field_type), REQUIRED,
- StrCat(field_name, ": 'first' \"second\"\n'third'"));
+ absl::StrCat("StringLiteralConcat", field_type), REQUIRED,
+ absl::StrCat(field_name, ": 'first' \"second\"\n'third'"));
RunValidTextFormatTest(
- StrCat("StringLiteralBasicEscapes", field_type), REQUIRED,
- StrCat(field_name, ": '\\a\\b\\f\\n\\r\\t\\v\\?\\\\\\'\\\"'"));
+ absl::StrCat("StringLiteralBasicEscapes", field_type), REQUIRED,
+ absl::StrCat(field_name, ": '\\a\\b\\f\\n\\r\\t\\v\\?\\\\\\'\\\"'"));
RunValidTextFormatTest(
- StrCat("StringLiteralOctalEscapes", field_type), REQUIRED,
- StrCat(field_name, ": '\\341\\210\\264'"));
- RunValidTextFormatTest(StrCat("StringLiteralHexEscapes", field_type),
+ absl::StrCat("StringLiteralOctalEscapes", field_type), REQUIRED,
+ absl::StrCat(field_name, ": '\\341\\210\\264'"));
+ RunValidTextFormatTest(absl::StrCat("StringLiteralHexEscapes", field_type),
REQUIRED,
- StrCat(field_name, ": '\\xe1\\x88\\xb4'"));
+ absl::StrCat(field_name, ": '\\xe1\\x88\\xb4'"));
RunValidTextFormatTest(
- StrCat("StringLiteralShortUnicodeEscape", field_type),
- RECOMMENDED, StrCat(field_name, ": '\\u1234'"));
+ absl::StrCat("StringLiteralShortUnicodeEscape", field_type),
+ RECOMMENDED, absl::StrCat(field_name, ": '\\u1234'"));
RunValidTextFormatTest(
- StrCat("StringLiteralLongUnicodeEscapes", field_type),
- RECOMMENDED, StrCat(field_name, ": '\\U00001234\\U00010437'"));
+ absl::StrCat("StringLiteralLongUnicodeEscapes", field_type),
+ RECOMMENDED, absl::StrCat(field_name, ": '\\U00001234\\U00010437'"));
// String literals don't include line feeds.
- ExpectParseFailure(StrCat("StringLiteralIncludesLF", field_type),
+ ExpectParseFailure(absl::StrCat("StringLiteralIncludesLF", field_type),
REQUIRED,
- StrCat(field_name, ": 'first line\nsecond line'"));
+ absl::StrCat(field_name, ": 'first line\nsecond line'"));
// Unicode escapes don't include code points that lie beyond the planes
// (> 0x10ffff).
ExpectParseFailure(
- StrCat("StringLiteralLongUnicodeEscapeTooLarge", field_type),
- REQUIRED, StrCat(field_name, ": '\\U00110000'"));
+ absl::StrCat("StringLiteralLongUnicodeEscapeTooLarge", field_type),
+ REQUIRED, absl::StrCat(field_name, ": '\\U00110000'"));
// Unicode escapes don't include surrogates.
ExpectParseFailure(
- StrCat("StringLiteralShortUnicodeEscapeSurrogatePair",
+ absl::StrCat("StringLiteralShortUnicodeEscapeSurrogatePair",
field_type),
- RECOMMENDED, StrCat(field_name, ": '\\ud801\\udc37'"));
+ RECOMMENDED, absl::StrCat(field_name, ": '\\ud801\\udc37'"));
ExpectParseFailure(
- StrCat("StringLiteralShortUnicodeEscapeSurrogateFirstOnly",
+ absl::StrCat("StringLiteralShortUnicodeEscapeSurrogateFirstOnly",
field_type),
- RECOMMENDED, StrCat(field_name, ": '\\ud800'"));
+ RECOMMENDED, absl::StrCat(field_name, ": '\\ud800'"));
ExpectParseFailure(
- StrCat("StringLiteralShortUnicodeEscapeSurrogateSecondOnly",
+ absl::StrCat("StringLiteralShortUnicodeEscapeSurrogateSecondOnly",
field_type),
- RECOMMENDED, StrCat(field_name, ": '\\udc00'"));
+ RECOMMENDED, absl::StrCat(field_name, ": '\\udc00'"));
ExpectParseFailure(
- StrCat("StringLiteralLongUnicodeEscapeSurrogateFirstOnly",
+ absl::StrCat("StringLiteralLongUnicodeEscapeSurrogateFirstOnly",
field_type),
- RECOMMENDED, StrCat(field_name, ": '\\U0000d800'"));
+ RECOMMENDED, absl::StrCat(field_name, ": '\\U0000d800'"));
ExpectParseFailure(
- StrCat("StringLiteralLongUnicodeEscapeSurrogateSecondOnly",
+ absl::StrCat("StringLiteralLongUnicodeEscapeSurrogateSecondOnly",
field_type),
- RECOMMENDED, StrCat(field_name, ": '\\U0000dc00'"));
+ RECOMMENDED, absl::StrCat(field_name, ": '\\U0000dc00'"));
ExpectParseFailure(
- StrCat("StringLiteralLongUnicodeEscapeSurrogatePair", field_type),
- RECOMMENDED, StrCat(field_name, ": '\\U0000d801\\U00000dc37'"));
+ absl::StrCat("StringLiteralLongUnicodeEscapeSurrogatePair", field_type),
+ RECOMMENDED, absl::StrCat(field_name, ": '\\U0000d801\\U00000dc37'"));
ExpectParseFailure(
- StrCat("StringLiteralUnicodeEscapeSurrogatePairLongShort",
+ absl::StrCat("StringLiteralUnicodeEscapeSurrogatePairLongShort",
field_type),
- RECOMMENDED, StrCat(field_name, ": '\\U0000d801\\udc37'"));
+ RECOMMENDED, absl::StrCat(field_name, ": '\\U0000d801\\udc37'"));
ExpectParseFailure(
- StrCat("StringLiteralUnicodeEscapeSurrogatePairShortLong",
+ absl::StrCat("StringLiteralUnicodeEscapeSurrogatePairShortLong",
field_type),
- RECOMMENDED, StrCat(field_name, ": '\\ud801\\U0000dc37'"));
+ RECOMMENDED, absl::StrCat(field_name, ": '\\ud801\\U0000dc37'"));
// The following method depend on the type of field, as strings have extra
// validation.
@@ -330,10 +329,10 @@
: &TextFormatConformanceTestSuite::RunValidTextFormatTest;
// String fields reject invalid UTF-8 byte sequences; bytes fields don't.
- (this->*test_method)(StrCat(field_type, "FieldBadUTF8Octal"),
- REQUIRED, StrCat(field_name, ": '\\300'"));
- (this->*test_method)(StrCat(field_type, "FieldBadUTF8Hex"), REQUIRED,
- StrCat(field_name, ": '\\xc0'"));
+ (this->*test_method)(absl::StrCat(field_type, "FieldBadUTF8Octal"),
+ REQUIRED, absl::StrCat(field_name, ": '\\300'"));
+ (this->*test_method)(absl::StrCat(field_type, "FieldBadUTF8Hex"), REQUIRED,
+ absl::StrCat(field_name, ": '\\xc0'"));
}
// Group fields
diff --git a/csharp/.editorconfig b/csharp/.editorconfig
index 5e2afd0..a2bf78c 100644
--- a/csharp/.editorconfig
+++ b/csharp/.editorconfig
@@ -14,4 +14,7 @@
# New line preferences
end_of_line = lf
insert_final_newline = false
-trim_trailing_whitespace = true
\ No newline at end of file
+trim_trailing_whitespace = true
+
+[*.cs]
+csharp_space_after_cast = true
diff --git a/csharp/.gitignore b/csharp/.gitignore
index d0d7ae0..62c9638 100644
--- a/csharp/.gitignore
+++ b/csharp/.gitignore
@@ -18,6 +18,7 @@
# Untracked files
#
.vs
+.cr
*.user
*.suo
*.nupkg
diff --git a/csharp/BUILD.bazel b/csharp/BUILD.bazel
index 2c15084..9f9e83a 100644
--- a/csharp/BUILD.bazel
+++ b/csharp/BUILD.bazel
@@ -3,14 +3,87 @@
# See also code generation logic under /src/google/protobuf/compiler/csharp.
load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
+load("//:protobuf.bzl", "internal_csharp_proto_library")
+load("//build_defs:internal_shell.bzl", "inline_sh_test")
+load("//conformance:defs.bzl", "conformance_test")
-pkg_files(
- name = "dist_files",
+################################################################################
+# Tests
+################################################################################
+
+conformance_test(
+ name = "conformance_test",
+ failure_list = "//conformance:failure_list_csharp.txt",
+ testee = "//conformance:conformance_csharp",
+ text_format_failure_list = "//conformance:text_format_failure_list_csharp.txt",
+)
+
+################################################################################
+# CSharp Runtime
+################################################################################
+
+filegroup(
+ name = "srcs",
srcs = glob([
"keys/*",
"protos/*",
"src/**/*.cs*", # .cs and .csproj
+ ], exclude = [
+ # Exclude generated files.
+ "src/*/obj/**/*"
]) + [
+ "src/Directory.Build.props",
+ "src/Google.Protobuf.Test/testprotos.pb",
+ "src/Google.Protobuf.sln",
+ ],
+ visibility = [
+ "//csharp:__subpackages__",
+ "//conformance:__subpackages__"
+ ],
+)
+
+filegroup(
+ name = "wkt_cs_srcs",
+ srcs = [
+ "src/Google.Protobuf/Reflection/Descriptor.cs",
+ "src/Google.Protobuf/WellKnownTypes/Any.cs",
+ "src/Google.Protobuf/WellKnownTypes/Api.cs",
+ "src/Google.Protobuf/WellKnownTypes/Duration.cs",
+ "src/Google.Protobuf/WellKnownTypes/Empty.cs",
+ "src/Google.Protobuf/WellKnownTypes/FieldMask.cs",
+ "src/Google.Protobuf/WellKnownTypes/SourceContext.cs",
+ "src/Google.Protobuf/WellKnownTypes/Struct.cs",
+ "src/Google.Protobuf/WellKnownTypes/Timestamp.cs",
+ "src/Google.Protobuf/WellKnownTypes/Type.cs",
+ "src/Google.Protobuf/WellKnownTypes/Wrappers.cs",
+ ],
+ visibility = ["//src/google/protobuf/compiler/csharp:__pkg__"],
+)
+
+inline_sh_test(
+ name = "tests",
+ srcs = [
+ ":srcs",
+ "src/Google.Protobuf.sln",
+ "//csharp/src/Google.Protobuf.Conformance:srcs",
+ ],
+ cmd = """
+ pushd `dirname $(location src/Google.Protobuf.sln)`/..
+ dotnet restore src/Google.Protobuf.sln
+ dotnet build -c Release src/Google.Protobuf.sln
+ dotnet test -c Release -f netcoreapp3.1 src/Google.Protobuf.Test/Google.Protobuf.Test.csproj
+ popd
+ """,
+)
+
+################################################################################
+# Distribution files
+################################################################################
+
+pkg_files(
+ name = "dist_files",
+ srcs = [
+ ":srcs",
".editorconfig",
".gitignore",
"BUILD.bazel",
@@ -20,15 +93,20 @@
"NuGet.Config",
"README.md",
"build_packages.bat",
+ "build_release.sh",
"build_tools.sh",
"buildall.bat",
"buildall.sh",
"generate_protos.sh",
"install_dotnet_sdk.ps1",
- "src/Google.Protobuf.Benchmarks/wrapper_benchmark_messages.proto",
- "src/Google.Protobuf.Test/testprotos.pb",
- "src/Google.Protobuf.sln",
+ "//csharp/src/Google.Protobuf.Conformance:dist_files",
],
strip_prefix = strip_prefix.from_root(""),
visibility = ["//pkg:__pkg__"],
)
+
+sh_binary(
+ name = "release",
+ srcs = ["build_release.sh"],
+ args = ["$(location build_release.sh)"],
+)
diff --git a/csharp/README.md b/csharp/README.md
index 9aab782..02abb7c 100644
--- a/csharp/README.md
+++ b/csharp/README.md
@@ -16,36 +16,32 @@
Supported platforms
===================
-The runtime library is built as a portable class library, supporting:
+The runtime library is built as a class library, supporting targets of:
-- .NET 4.5
-- Windows 8
-- Windows Phone Silverlight 8
-- Windows Phone 8.1
-- .NET Core
+- .NET 4.5+ (`net45`)
+- .NET Standard 1.1 and 2.0 (`netstandard1.1` and `netstandard2.0`)
+- .NET 5+ (`net50`)
You should be able to use Protocol Buffers in Visual Studio 2012 and
all later versions. This includes all code generated by `protoc`,
-which only uses features from C# 3 and earlier.
+which only uses features from C# 3 and earlier. When compiling generated
+code with old compilers (before C# 7.2) you need to define the
+`GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE` symbol in your project
+so that the generated classes don't implement `IBufferMessage`, which uses
+`ref struct` types.
Building
========
-Open the `src/Google.Protobuf.sln` solution in Visual Studio 2017 or
+Open the `src/Google.Protobuf.sln` solution in Visual Studio 2022 or
later.
Although *users* of this project are only expected to have Visual
Studio 2012 or later, *developers* of the library are required to
-have Visual Studio 2017 or later, as the library uses C# 6 features
-in its implementation, as well as the new Visual Studio 2017 csproj
-format. These features have no impact when using the compiled code -
-they're only relevant when building the `Google.Protobuf` assembly.
-
-In order to run and debug the AddressBook example in the IDE, you must
-install the optional component, ".Net Core 1.0 - 1.1 development tools
-for Web" (as it's labelled in current versions of the VS2017
-installer), above and beyond the main .NET Core cross-platform
-development feature.
+have Visual Studio 2022 or later, as the library uses C# 10 features
+in its implementation and runs tests under .NET 6. These features
+have no impact when using the compiled code - they're only relevant
+when building the `Google.Protobuf` assembly.
Testing
=======
@@ -56,20 +52,11 @@
.NET 3.5
========
-We don't officially support .NET 3.5. However, there has been some effort
-to make enabling .NET 3.5 support relatively painless in case you require it.
-There's no guarantee that this will continue in the future, so rely on .NET
-3.5 support at your peril.
-
-To enable .NET 3.5 support, you must edit the `TargetFrameworks` elements of
-[src/Google.Protobuf/Google.Protobuf.csproj](src/Google.Protobuf/Google.Protobuf.csproj)
-(and [src/Google.Protobuf.Test/Google.Protobuf.Test.csproj](src/Google.Protobuf.Test/Google.Protobuf.Test.csproj)
-if you want to run the unit tests):
-
-Open the .csproj file in a text editor and simply add `net35` to the list of
-target frameworks, noting that the `TargetFrameworks` element appears twice in
-the file (once in the first `PropertyGroup` element, and again in the second
-`PropertyGroup` element, i.e., the one with the conditional).
+We don't support .NET 3.5. It *used* to be feasible to build this library
+targeting .NET 3.5, but a number of changes requiring newer runtime/framework
+features have been added over time. While it would no doubt be *possible* to
+rework the current implementation to allow most of the functionality to be built
+in .NET 3.5, this would create an undue maintenance burden.
History of C# protobufs
=======================
@@ -81,9 +68,9 @@
The previous project differs from this project in a number of ways:
-- The old code only supported proto2; the new code only supports
+- The old code only supported proto2; the new code initially only supported
proto3 (so no unknown fields, no required/optional distinction, no
-extensions)
+extensions); since then proto2 support has been added
- The old code was based on immutable message types and builders for
them
- The old code did not support maps or `oneof`
diff --git a/csharp/build_release.sh b/csharp/build_release.sh
new file mode 100755
index 0000000..f9fff22
--- /dev/null
+++ b/csharp/build_release.sh
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+cd $(dirname $(readlink $BASH_SOURCE))
+
+# Disable some unwanted dotnet options
+set DOTNET_SKIP_FIRST_TIME_EXPERIENCE=true
+set DOTNET_CLI_TELEMETRY_OPTOUT=true
+
+# Work around https://github.com/dotnet/core/issues/5881
+dotnet nuget locals all --clear
+
+# Builds Google.Protobuf NuGet packages
+dotnet restore src/Google.Protobuf.sln
+dotnet pack -c Release src/Google.Protobuf.sln -p:ContinuousIntegrationBuild=true
diff --git a/csharp/compatibility_tests/v3.0.0/BUILD.bazel b/csharp/compatibility_tests/v3.0.0/BUILD.bazel
new file mode 100644
index 0000000..1f6c713
--- /dev/null
+++ b/csharp/compatibility_tests/v3.0.0/BUILD.bazel
@@ -0,0 +1,16 @@
+load("//build_defs:internal_shell.bzl", "inline_sh_test")
+
+# Run csharp compatibility test between 3.0.0 and the current version.
+inline_sh_test(
+ name = "tests",
+ srcs = ["test.sh"],
+ tools = ["//:protoc"],
+ deps = glob([
+ "src/**/*.cs*", # .cs and .csproj
+ "protos/**/*.proto",
+ ]) + [
+ "//csharp:srcs",
+ "//:well_known_protos",
+ ],
+ cmd = "$(location test.sh) 3.0.0 $(rootpath //:protoc)"
+)
diff --git a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/Google.Protobuf.Test.csproj b/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/Google.Protobuf.Test.csproj
index 0ecdf37..a2d501a 100644
--- a/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/Google.Protobuf.Test.csproj
+++ b/csharp/compatibility_tests/v3.0.0/src/Google.Protobuf.Test/Google.Protobuf.Test.csproj
@@ -6,6 +6,7 @@
<AssemblyOriginatorKeyFile>../../keys/Google.Protobuf.snk</AssemblyOriginatorKeyFile>
<SignAssembly>true</SignAssembly>
<IsPackable>False</IsPackable>
+ <LangVersion>8.0</LangVersion>
</PropertyGroup>
<ItemGroup>
diff --git a/csharp/compatibility_tests/v3.0.0/test.sh b/csharp/compatibility_tests/v3.0.0/test.sh
index 459c079..6323a6d 100755
--- a/csharp/compatibility_tests/v3.0.0/test.sh
+++ b/csharp/compatibility_tests/v3.0.0/test.sh
@@ -27,6 +27,8 @@
set -ex
+PROTOC=$(realpath ${2:-../../../bazel-bin/protoc})
+
# Change to the script's directory.
cd $(dirname $0)
@@ -45,7 +47,7 @@
echo "Running compatibility tests with $OLD_VERSION"
# Check protoc
-[ -f ../../../src/protoc ] || {
+[ -f $PROTOC ] || {
echo "[ERROR]: Please build protoc first."
exit 1
}
@@ -68,12 +70,12 @@
# Test A.2:
# proto set 1: use new version
# proto set 2 which may import protos in set 1: use old version
-run_test "../../../src/protoc" "./old_protoc"
+run_test "$PROTOC" "./old_protoc"
# Test A.3:
# proto set 1: use old version
# proto set 2 which may import protos in set 1: use new version
-run_test "./old_protoc" "../../../src/protoc"
+run_test "./old_protoc" "$PROTOC"
rm old_protoc
rm keys -r
diff --git a/csharp/generate_protos.sh b/csharp/generate_protos.sh
index b021de2..cfd6082 100755
--- a/csharp/generate_protos.sh
+++ b/csharp/generate_protos.sh
@@ -11,17 +11,19 @@
# Protocol buffer compiler to use. If the PROTOC variable is set,
# use that. Otherwise, probe for expected locations under both
# Windows and Unix.
+PROTOC_LOCATIONS=(
+ "bazel-bin/protoc"
+ "solution/Debug/protoc.exe"
+ "cmake/build/Debug/protoc.exe"
+ "cmake/build/Release/protoc.exe"
+)
if [ -z "$PROTOC" ]; then
- # TODO(jonskeet): Use an array and a for loop instead?
- if [ -x solution/Debug/protoc.exe ]; then
- PROTOC=solution/Debug/protoc.exe
- elif [ -x cmake/build/Debug/protoc.exe ]; then
- PROTOC=cmake/build/Debug/protoc.exe
- elif [ -x cmake/build/Release/protoc.exe ]; then
- PROTOC=cmake/build/Release/protoc.exe
- elif [ -x src/protoc ]; then
- PROTOC=src/protoc
- else
+ for protoc in "${PROTOC_LOCATIONS[@]}"; do
+ if [ -x "$protoc" ]; then
+ PROTOC="$protoc"
+ fi
+ done
+ if [ -z "$PROTOC" ]; then
echo "Unable to find protocol buffer compiler."
exit 1
fi
@@ -40,7 +42,8 @@
src/google/protobuf/struct.proto \
src/google/protobuf/timestamp.proto \
src/google/protobuf/type.proto \
- src/google/protobuf/wrappers.proto
+ src/google/protobuf/wrappers.proto \
+ src/google/protobuf/compiler/plugin.proto
# Test protos
# Note that this deliberately does *not* include old_extensions1.proto
@@ -73,17 +76,3 @@
# AddressBook sample protos
$PROTOC -Iexamples -Isrc --csharp_out=csharp/src/AddressBook \
examples/addressbook.proto
-
-$PROTOC -Iconformance -Isrc --csharp_out=csharp/src/Google.Protobuf.Conformance \
- conformance/conformance.proto
-
-# Benchmark protos
-$PROTOC -Ibenchmarks \
- benchmarks/datasets/google_message1/proto3/*.proto \
- benchmarks/benchmarks.proto \
- --csharp_out=csharp/src/Google.Protobuf.Benchmarks
-
-# C# only benchmark protos
-$PROTOC -Isrc -Icsharp/src/Google.Protobuf.Benchmarks \
- csharp/src/Google.Protobuf.Benchmarks/*.proto \
- --csharp_out=csharp/src/Google.Protobuf.Benchmarks
diff --git a/csharp/protos/unittest_issues.proto b/csharp/protos/unittest_issues.proto
index f46c20e..d5907bb 100644
--- a/csharp/protos/unittest_issues.proto
+++ b/csharp/protos/unittest_issues.proto
@@ -59,10 +59,12 @@
// Decorate fields with [deprecated=true] as [System.Obsolete]
message DeprecatedChild {
+ option deprecated = true;
}
enum DeprecatedEnum {
- DEPRECATED_ZERO = 0;
+ option deprecated = true;
+ DEPRECATED_ZERO = 0 [deprecated = true];
one = 1;
}
@@ -169,4 +171,20 @@
string x = 1;
string y = 2;
}
-}
\ No newline at end of file
+}
+
+// Issue 8810
+message DisambiguateCommonMembers {
+ int32 disambiguate_common_members = 1;
+ int32 types = 2;
+ int32 descriptor = 3;
+ int32 equals = 4;
+ int32 to_string = 5;
+ int32 get_hash_code = 6;
+ int32 write_to = 7;
+ int32 clone = 8;
+ int32 calculate_size = 9;
+ int32 merge_from = 10;
+ int32 on_construction = 11;
+ int32 parser = 12;
+}
diff --git a/csharp/src/AddressBook/AddPerson.cs b/csharp/src/AddressBook/AddPerson.cs
index 889d1d0..eb0ecb3 100644
--- a/csharp/src/AddressBook/AddPerson.cs
+++ b/csharp/src/AddressBook/AddPerson.cs
@@ -107,10 +107,8 @@
if (File.Exists(args[0]))
{
- using (Stream file = File.OpenRead(args[0]))
- {
- addressBook = AddressBook.Parser.ParseFrom(file);
- }
+ using Stream file = File.OpenRead(args[0]);
+ addressBook = AddressBook.Parser.ParseFrom(file);
}
else
{
diff --git a/csharp/src/Directory.Build.props b/csharp/src/Directory.Build.props
new file mode 100644
index 0000000..dd69462
--- /dev/null
+++ b/csharp/src/Directory.Build.props
@@ -0,0 +1,7 @@
+<Project>
+
+ <PropertyGroup>
+ <LangVersion>10.0</LangVersion>
+ </PropertyGroup>
+
+</Project>
diff --git a/csharp/src/Google.Protobuf.Benchmarks/BenchmarkDatasetConfig.cs b/csharp/src/Google.Protobuf.Benchmarks/BenchmarkDatasetConfig.cs
deleted file mode 100644
index c075419..0000000
--- a/csharp/src/Google.Protobuf.Benchmarks/BenchmarkDatasetConfig.cs
+++ /dev/null
@@ -1,89 +0,0 @@
-#region Copyright notice and license
-// Protocol Buffers - Google's data interchange format
-// Copyright 2019 Google Inc. All rights reserved.
-// https://github.com/protocolbuffers/protobuf
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#endregion
-
-using Benchmarks;
-using Google.Protobuf.Reflection;
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Reflection;
-
-namespace Google.Protobuf.Benchmarks
-{
- /// <summary>
- /// The configuration for a single serialization test, loaded from a dataset.
- /// </summary>
- public class BenchmarkDatasetConfig
- {
- private static readonly Dictionary<string, MessageParser> parsersByMessageName =
- typeof(GoogleMessageBenchmark).Assembly.GetTypes()
- .Where(t => typeof(IMessage).IsAssignableFrom(t))
- .ToDictionary(
- t => ((MessageDescriptor) t.GetProperty("Descriptor", BindingFlags.Static | BindingFlags.Public).GetValue(null)).FullName,
- t => ((MessageParser) t.GetProperty("Parser", BindingFlags.Static | BindingFlags.Public).GetValue(null)));
-
- public MessageParser Parser { get; }
- public List<byte[]> Payloads { get; }
- public string Name { get; }
-
- public BenchmarkDatasetConfig(string resource, string shortName = null)
- {
- var data = LoadData(resource);
- var dataset = BenchmarkDataset.Parser.ParseFrom(data);
-
- if (!parsersByMessageName.TryGetValue(dataset.MessageName, out var parser))
- {
- throw new ArgumentException($"No parser for message {dataset.MessageName} in this assembly");
- }
- Parser = parser;
- Payloads = new List<byte[]>(dataset.Payload.Select(p => p.ToByteArray()));
- Name = shortName ?? dataset.Name;
- }
-
- private static byte[] LoadData(string resource)
- {
- using (var stream = typeof(GoogleMessageBenchmark).Assembly.GetManifestResourceStream($"Google.Protobuf.Benchmarks.{resource}"))
- {
- if (stream == null)
- {
- throw new ArgumentException($"Unable to load embedded resource {resource}");
- }
- var copy = new MemoryStream();
- stream.CopyTo(copy);
- return copy.ToArray();
- }
- }
-
- public override string ToString() => Name;
- }
-}
diff --git a/csharp/src/Google.Protobuf.Benchmarks/BenchmarkMessage1Proto3.cs b/csharp/src/Google.Protobuf.Benchmarks/BenchmarkMessage1Proto3.cs
deleted file mode 100644
index fe21d0c..0000000
--- a/csharp/src/Google.Protobuf.Benchmarks/BenchmarkMessage1Proto3.cs
+++ /dev/null
@@ -1,2632 +0,0 @@
-// <auto-generated>
-// Generated by the protocol buffer compiler. DO NOT EDIT!
-// source: datasets/google_message1/proto3/benchmark_message1_proto3.proto
-// </auto-generated>
-#pragma warning disable 1591, 0612, 3021, 8981
-#region Designer generated code
-
-using pb = global::Google.Protobuf;
-using pbc = global::Google.Protobuf.Collections;
-using pbr = global::Google.Protobuf.Reflection;
-using scg = global::System.Collections.Generic;
-namespace Benchmarks.Proto3 {
-
- /// <summary>Holder for reflection information generated from datasets/google_message1/proto3/benchmark_message1_proto3.proto</summary>
- public static partial class BenchmarkMessage1Proto3Reflection {
-
- #region Descriptor
- /// <summary>File descriptor for datasets/google_message1/proto3/benchmark_message1_proto3.proto</summary>
- public static pbr::FileDescriptor Descriptor {
- get { return descriptor; }
- }
- private static pbr::FileDescriptor descriptor;
-
- static BenchmarkMessage1Proto3Reflection() {
- byte[] descriptorData = global::System.Convert.FromBase64String(
- string.Concat(
- "Cj9kYXRhc2V0cy9nb29nbGVfbWVzc2FnZTEvcHJvdG8zL2JlbmNobWFya19t",
- "ZXNzYWdlMV9wcm90bzMucHJvdG8SEWJlbmNobWFya3MucHJvdG8zIoMGCg5H",
- "b29nbGVNZXNzYWdlMRIOCgZmaWVsZDEYASABKAkSDgoGZmllbGQ5GAkgASgJ",
- "Eg8KB2ZpZWxkMTgYEiABKAkSDwoHZmllbGQ4MBhQIAEoCBIPCgdmaWVsZDgx",
- "GFEgASgIEg4KBmZpZWxkMhgCIAEoBRIOCgZmaWVsZDMYAyABKAUSEQoIZmll",
- "bGQyODAYmAIgASgFEg4KBmZpZWxkNhgGIAEoBRIPCgdmaWVsZDIyGBYgASgD",
- "Eg4KBmZpZWxkNBgEIAEoCRIOCgZmaWVsZDUYBSADKAYSDwoHZmllbGQ1ORg7",
- "IAEoCBIOCgZmaWVsZDcYByABKAkSDwoHZmllbGQxNhgQIAEoBRIRCghmaWVs",
- "ZDEzMBiCASABKAUSDwoHZmllbGQxMhgMIAEoCBIPCgdmaWVsZDE3GBEgASgI",
- "Eg8KB2ZpZWxkMTMYDSABKAgSDwoHZmllbGQxNBgOIAEoCBIQCghmaWVsZDEw",
- "NBhoIAEoBRIQCghmaWVsZDEwMBhkIAEoBRIQCghmaWVsZDEwMRhlIAEoBRIQ",
- "CghmaWVsZDEwMhhmIAEoCRIQCghmaWVsZDEwMxhnIAEoCRIPCgdmaWVsZDI5",
- "GB0gASgFEg8KB2ZpZWxkMzAYHiABKAgSDwoHZmllbGQ2MBg8IAEoBRIRCghm",
- "aWVsZDI3MRiPAiABKAUSEQoIZmllbGQyNzIYkAIgASgFEhEKCGZpZWxkMTUw",
- "GJYBIAEoBRIPCgdmaWVsZDIzGBcgASgFEg8KB2ZpZWxkMjQYGCABKAgSDwoH",
- "ZmllbGQyNRgZIAEoBRI8CgdmaWVsZDE1GA8gASgLMisuYmVuY2htYXJrcy5w",
- "cm90bzMuR29vZ2xlTWVzc2FnZTFTdWJNZXNzYWdlEg8KB2ZpZWxkNzgYTiAB",
- "KAgSDwoHZmllbGQ2NxhDIAEoBRIPCgdmaWVsZDY4GEQgASgFEhEKCGZpZWxk",
- "MTI4GIABIAEoBRIRCghmaWVsZDEyORiBASABKAkSEQoIZmllbGQxMzEYgwEg",
- "ASgFIvcCChhHb29nbGVNZXNzYWdlMVN1Yk1lc3NhZ2USDgoGZmllbGQxGAEg",
- "ASgFEg4KBmZpZWxkMhgCIAEoBRIOCgZmaWVsZDMYAyABKAUSDwoHZmllbGQx",
- "NRgPIAEoCRIPCgdmaWVsZDEyGAwgASgIEg8KB2ZpZWxkMTMYDSABKAMSDwoH",
- "ZmllbGQxNBgOIAEoAxIPCgdmaWVsZDE2GBAgASgFEg8KB2ZpZWxkMTkYEyAB",
- "KAUSDwoHZmllbGQyMBgUIAEoCBIPCgdmaWVsZDI4GBwgASgIEg8KB2ZpZWxk",
- "MjEYFSABKAYSDwoHZmllbGQyMhgWIAEoBRIPCgdmaWVsZDIzGBcgASgIEhEK",
- "CGZpZWxkMjA2GM4BIAEoCBIRCghmaWVsZDIwMxjLASABKAcSEQoIZmllbGQy",
- "MDQYzAEgASgFEhEKCGZpZWxkMjA1GM0BIAEoCRIRCghmaWVsZDIwNxjPASAB",
- "KAQSEQoIZmllbGQzMDAYrAIgASgEQiUKHmNvbS5nb29nbGUucHJvdG9idWYu",
- "YmVuY2htYXJrc0gB+AEBYgZwcm90bzM="));
- descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
- new pbr::FileDescriptor[] { },
- new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] {
- new pbr::GeneratedClrTypeInfo(typeof(global::Benchmarks.Proto3.GoogleMessage1), global::Benchmarks.Proto3.GoogleMessage1.Parser, new[]{ "Field1", "Field9", "Field18", "Field80", "Field81", "Field2", "Field3", "Field280", "Field6", "Field22", "Field4", "Field5", "Field59", "Field7", "Field16", "Field130", "Field12", "Field17", "Field13", "Field14", "Field104", "Field100", "Field101", "Field102", "Field103", "Field29", "Field30", "Field60", "Field271", "Field272", "Field150", "Field23", "Field24", "Field25", "Field15", "Field78", "Field67", "Field68", "Field128", "Field129", "Field131" }, null, null, null, null),
- new pbr::GeneratedClrTypeInfo(typeof(global::Benchmarks.Proto3.GoogleMessage1SubMessage), global::Benchmarks.Proto3.GoogleMessage1SubMessage.Parser, new[]{ "Field1", "Field2", "Field3", "Field15", "Field12", "Field13", "Field14", "Field16", "Field19", "Field20", "Field28", "Field21", "Field22", "Field23", "Field206", "Field203", "Field204", "Field205", "Field207", "Field300" }, null, null, null, null)
- }));
- }
- #endregion
-
- }
- #region Messages
- public sealed partial class GoogleMessage1 : pb::IMessage<GoogleMessage1>
- #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
- , pb::IBufferMessage
- #endif
- {
- private static readonly pb::MessageParser<GoogleMessage1> _parser = new pb::MessageParser<GoogleMessage1>(() => new GoogleMessage1());
- private pb::UnknownFieldSet _unknownFields;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public static pb::MessageParser<GoogleMessage1> Parser { get { return _parser; } }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public static pbr::MessageDescriptor Descriptor {
- get { return global::Benchmarks.Proto3.BenchmarkMessage1Proto3Reflection.Descriptor.MessageTypes[0]; }
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- pbr::MessageDescriptor pb::IMessage.Descriptor {
- get { return Descriptor; }
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public GoogleMessage1() {
- OnConstruction();
- }
-
- partial void OnConstruction();
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public GoogleMessage1(GoogleMessage1 other) : this() {
- field1_ = other.field1_;
- field9_ = other.field9_;
- field18_ = other.field18_;
- field80_ = other.field80_;
- field81_ = other.field81_;
- field2_ = other.field2_;
- field3_ = other.field3_;
- field280_ = other.field280_;
- field6_ = other.field6_;
- field22_ = other.field22_;
- field4_ = other.field4_;
- field5_ = other.field5_.Clone();
- field59_ = other.field59_;
- field7_ = other.field7_;
- field16_ = other.field16_;
- field130_ = other.field130_;
- field12_ = other.field12_;
- field17_ = other.field17_;
- field13_ = other.field13_;
- field14_ = other.field14_;
- field104_ = other.field104_;
- field100_ = other.field100_;
- field101_ = other.field101_;
- field102_ = other.field102_;
- field103_ = other.field103_;
- field29_ = other.field29_;
- field30_ = other.field30_;
- field60_ = other.field60_;
- field271_ = other.field271_;
- field272_ = other.field272_;
- field150_ = other.field150_;
- field23_ = other.field23_;
- field24_ = other.field24_;
- field25_ = other.field25_;
- field15_ = other.field15_ != null ? other.field15_.Clone() : null;
- field78_ = other.field78_;
- field67_ = other.field67_;
- field68_ = other.field68_;
- field128_ = other.field128_;
- field129_ = other.field129_;
- field131_ = other.field131_;
- _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public GoogleMessage1 Clone() {
- return new GoogleMessage1(this);
- }
-
- /// <summary>Field number for the "field1" field.</summary>
- public const int Field1FieldNumber = 1;
- private string field1_ = "";
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public string Field1 {
- get { return field1_; }
- set {
- field1_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
- }
- }
-
- /// <summary>Field number for the "field9" field.</summary>
- public const int Field9FieldNumber = 9;
- private string field9_ = "";
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public string Field9 {
- get { return field9_; }
- set {
- field9_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
- }
- }
-
- /// <summary>Field number for the "field18" field.</summary>
- public const int Field18FieldNumber = 18;
- private string field18_ = "";
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public string Field18 {
- get { return field18_; }
- set {
- field18_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
- }
- }
-
- /// <summary>Field number for the "field80" field.</summary>
- public const int Field80FieldNumber = 80;
- private bool field80_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public bool Field80 {
- get { return field80_; }
- set {
- field80_ = value;
- }
- }
-
- /// <summary>Field number for the "field81" field.</summary>
- public const int Field81FieldNumber = 81;
- private bool field81_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public bool Field81 {
- get { return field81_; }
- set {
- field81_ = value;
- }
- }
-
- /// <summary>Field number for the "field2" field.</summary>
- public const int Field2FieldNumber = 2;
- private int field2_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public int Field2 {
- get { return field2_; }
- set {
- field2_ = value;
- }
- }
-
- /// <summary>Field number for the "field3" field.</summary>
- public const int Field3FieldNumber = 3;
- private int field3_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public int Field3 {
- get { return field3_; }
- set {
- field3_ = value;
- }
- }
-
- /// <summary>Field number for the "field280" field.</summary>
- public const int Field280FieldNumber = 280;
- private int field280_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public int Field280 {
- get { return field280_; }
- set {
- field280_ = value;
- }
- }
-
- /// <summary>Field number for the "field6" field.</summary>
- public const int Field6FieldNumber = 6;
- private int field6_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public int Field6 {
- get { return field6_; }
- set {
- field6_ = value;
- }
- }
-
- /// <summary>Field number for the "field22" field.</summary>
- public const int Field22FieldNumber = 22;
- private long field22_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long Field22 {
- get { return field22_; }
- set {
- field22_ = value;
- }
- }
-
- /// <summary>Field number for the "field4" field.</summary>
- public const int Field4FieldNumber = 4;
- private string field4_ = "";
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public string Field4 {
- get { return field4_; }
- set {
- field4_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
- }
- }
-
- /// <summary>Field number for the "field5" field.</summary>
- public const int Field5FieldNumber = 5;
- private static readonly pb::FieldCodec<ulong> _repeated_field5_codec
- = pb::FieldCodec.ForFixed64(42);
- private readonly pbc::RepeatedField<ulong> field5_ = new pbc::RepeatedField<ulong>();
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public pbc::RepeatedField<ulong> Field5 {
- get { return field5_; }
- }
-
- /// <summary>Field number for the "field59" field.</summary>
- public const int Field59FieldNumber = 59;
- private bool field59_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public bool Field59 {
- get { return field59_; }
- set {
- field59_ = value;
- }
- }
-
- /// <summary>Field number for the "field7" field.</summary>
- public const int Field7FieldNumber = 7;
- private string field7_ = "";
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public string Field7 {
- get { return field7_; }
- set {
- field7_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
- }
- }
-
- /// <summary>Field number for the "field16" field.</summary>
- public const int Field16FieldNumber = 16;
- private int field16_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public int Field16 {
- get { return field16_; }
- set {
- field16_ = value;
- }
- }
-
- /// <summary>Field number for the "field130" field.</summary>
- public const int Field130FieldNumber = 130;
- private int field130_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public int Field130 {
- get { return field130_; }
- set {
- field130_ = value;
- }
- }
-
- /// <summary>Field number for the "field12" field.</summary>
- public const int Field12FieldNumber = 12;
- private bool field12_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public bool Field12 {
- get { return field12_; }
- set {
- field12_ = value;
- }
- }
-
- /// <summary>Field number for the "field17" field.</summary>
- public const int Field17FieldNumber = 17;
- private bool field17_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public bool Field17 {
- get { return field17_; }
- set {
- field17_ = value;
- }
- }
-
- /// <summary>Field number for the "field13" field.</summary>
- public const int Field13FieldNumber = 13;
- private bool field13_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public bool Field13 {
- get { return field13_; }
- set {
- field13_ = value;
- }
- }
-
- /// <summary>Field number for the "field14" field.</summary>
- public const int Field14FieldNumber = 14;
- private bool field14_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public bool Field14 {
- get { return field14_; }
- set {
- field14_ = value;
- }
- }
-
- /// <summary>Field number for the "field104" field.</summary>
- public const int Field104FieldNumber = 104;
- private int field104_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public int Field104 {
- get { return field104_; }
- set {
- field104_ = value;
- }
- }
-
- /// <summary>Field number for the "field100" field.</summary>
- public const int Field100FieldNumber = 100;
- private int field100_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public int Field100 {
- get { return field100_; }
- set {
- field100_ = value;
- }
- }
-
- /// <summary>Field number for the "field101" field.</summary>
- public const int Field101FieldNumber = 101;
- private int field101_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public int Field101 {
- get { return field101_; }
- set {
- field101_ = value;
- }
- }
-
- /// <summary>Field number for the "field102" field.</summary>
- public const int Field102FieldNumber = 102;
- private string field102_ = "";
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public string Field102 {
- get { return field102_; }
- set {
- field102_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
- }
- }
-
- /// <summary>Field number for the "field103" field.</summary>
- public const int Field103FieldNumber = 103;
- private string field103_ = "";
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public string Field103 {
- get { return field103_; }
- set {
- field103_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
- }
- }
-
- /// <summary>Field number for the "field29" field.</summary>
- public const int Field29FieldNumber = 29;
- private int field29_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public int Field29 {
- get { return field29_; }
- set {
- field29_ = value;
- }
- }
-
- /// <summary>Field number for the "field30" field.</summary>
- public const int Field30FieldNumber = 30;
- private bool field30_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public bool Field30 {
- get { return field30_; }
- set {
- field30_ = value;
- }
- }
-
- /// <summary>Field number for the "field60" field.</summary>
- public const int Field60FieldNumber = 60;
- private int field60_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public int Field60 {
- get { return field60_; }
- set {
- field60_ = value;
- }
- }
-
- /// <summary>Field number for the "field271" field.</summary>
- public const int Field271FieldNumber = 271;
- private int field271_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public int Field271 {
- get { return field271_; }
- set {
- field271_ = value;
- }
- }
-
- /// <summary>Field number for the "field272" field.</summary>
- public const int Field272FieldNumber = 272;
- private int field272_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public int Field272 {
- get { return field272_; }
- set {
- field272_ = value;
- }
- }
-
- /// <summary>Field number for the "field150" field.</summary>
- public const int Field150FieldNumber = 150;
- private int field150_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public int Field150 {
- get { return field150_; }
- set {
- field150_ = value;
- }
- }
-
- /// <summary>Field number for the "field23" field.</summary>
- public const int Field23FieldNumber = 23;
- private int field23_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public int Field23 {
- get { return field23_; }
- set {
- field23_ = value;
- }
- }
-
- /// <summary>Field number for the "field24" field.</summary>
- public const int Field24FieldNumber = 24;
- private bool field24_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public bool Field24 {
- get { return field24_; }
- set {
- field24_ = value;
- }
- }
-
- /// <summary>Field number for the "field25" field.</summary>
- public const int Field25FieldNumber = 25;
- private int field25_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public int Field25 {
- get { return field25_; }
- set {
- field25_ = value;
- }
- }
-
- /// <summary>Field number for the "field15" field.</summary>
- public const int Field15FieldNumber = 15;
- private global::Benchmarks.Proto3.GoogleMessage1SubMessage field15_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public global::Benchmarks.Proto3.GoogleMessage1SubMessage Field15 {
- get { return field15_; }
- set {
- field15_ = value;
- }
- }
-
- /// <summary>Field number for the "field78" field.</summary>
- public const int Field78FieldNumber = 78;
- private bool field78_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public bool Field78 {
- get { return field78_; }
- set {
- field78_ = value;
- }
- }
-
- /// <summary>Field number for the "field67" field.</summary>
- public const int Field67FieldNumber = 67;
- private int field67_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public int Field67 {
- get { return field67_; }
- set {
- field67_ = value;
- }
- }
-
- /// <summary>Field number for the "field68" field.</summary>
- public const int Field68FieldNumber = 68;
- private int field68_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public int Field68 {
- get { return field68_; }
- set {
- field68_ = value;
- }
- }
-
- /// <summary>Field number for the "field128" field.</summary>
- public const int Field128FieldNumber = 128;
- private int field128_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public int Field128 {
- get { return field128_; }
- set {
- field128_ = value;
- }
- }
-
- /// <summary>Field number for the "field129" field.</summary>
- public const int Field129FieldNumber = 129;
- private string field129_ = "";
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public string Field129 {
- get { return field129_; }
- set {
- field129_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
- }
- }
-
- /// <summary>Field number for the "field131" field.</summary>
- public const int Field131FieldNumber = 131;
- private int field131_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public int Field131 {
- get { return field131_; }
- set {
- field131_ = value;
- }
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public override bool Equals(object other) {
- return Equals(other as GoogleMessage1);
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public bool Equals(GoogleMessage1 other) {
- if (ReferenceEquals(other, null)) {
- return false;
- }
- if (ReferenceEquals(other, this)) {
- return true;
- }
- if (Field1 != other.Field1) return false;
- if (Field9 != other.Field9) return false;
- if (Field18 != other.Field18) return false;
- if (Field80 != other.Field80) return false;
- if (Field81 != other.Field81) return false;
- if (Field2 != other.Field2) return false;
- if (Field3 != other.Field3) return false;
- if (Field280 != other.Field280) return false;
- if (Field6 != other.Field6) return false;
- if (Field22 != other.Field22) return false;
- if (Field4 != other.Field4) return false;
- if(!field5_.Equals(other.field5_)) return false;
- if (Field59 != other.Field59) return false;
- if (Field7 != other.Field7) return false;
- if (Field16 != other.Field16) return false;
- if (Field130 != other.Field130) return false;
- if (Field12 != other.Field12) return false;
- if (Field17 != other.Field17) return false;
- if (Field13 != other.Field13) return false;
- if (Field14 != other.Field14) return false;
- if (Field104 != other.Field104) return false;
- if (Field100 != other.Field100) return false;
- if (Field101 != other.Field101) return false;
- if (Field102 != other.Field102) return false;
- if (Field103 != other.Field103) return false;
- if (Field29 != other.Field29) return false;
- if (Field30 != other.Field30) return false;
- if (Field60 != other.Field60) return false;
- if (Field271 != other.Field271) return false;
- if (Field272 != other.Field272) return false;
- if (Field150 != other.Field150) return false;
- if (Field23 != other.Field23) return false;
- if (Field24 != other.Field24) return false;
- if (Field25 != other.Field25) return false;
- if (!object.Equals(Field15, other.Field15)) return false;
- if (Field78 != other.Field78) return false;
- if (Field67 != other.Field67) return false;
- if (Field68 != other.Field68) return false;
- if (Field128 != other.Field128) return false;
- if (Field129 != other.Field129) return false;
- if (Field131 != other.Field131) return false;
- return Equals(_unknownFields, other._unknownFields);
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public override int GetHashCode() {
- int hash = 1;
- if (Field1.Length != 0) hash ^= Field1.GetHashCode();
- if (Field9.Length != 0) hash ^= Field9.GetHashCode();
- if (Field18.Length != 0) hash ^= Field18.GetHashCode();
- if (Field80 != false) hash ^= Field80.GetHashCode();
- if (Field81 != false) hash ^= Field81.GetHashCode();
- if (Field2 != 0) hash ^= Field2.GetHashCode();
- if (Field3 != 0) hash ^= Field3.GetHashCode();
- if (Field280 != 0) hash ^= Field280.GetHashCode();
- if (Field6 != 0) hash ^= Field6.GetHashCode();
- if (Field22 != 0L) hash ^= Field22.GetHashCode();
- if (Field4.Length != 0) hash ^= Field4.GetHashCode();
- hash ^= field5_.GetHashCode();
- if (Field59 != false) hash ^= Field59.GetHashCode();
- if (Field7.Length != 0) hash ^= Field7.GetHashCode();
- if (Field16 != 0) hash ^= Field16.GetHashCode();
- if (Field130 != 0) hash ^= Field130.GetHashCode();
- if (Field12 != false) hash ^= Field12.GetHashCode();
- if (Field17 != false) hash ^= Field17.GetHashCode();
- if (Field13 != false) hash ^= Field13.GetHashCode();
- if (Field14 != false) hash ^= Field14.GetHashCode();
- if (Field104 != 0) hash ^= Field104.GetHashCode();
- if (Field100 != 0) hash ^= Field100.GetHashCode();
- if (Field101 != 0) hash ^= Field101.GetHashCode();
- if (Field102.Length != 0) hash ^= Field102.GetHashCode();
- if (Field103.Length != 0) hash ^= Field103.GetHashCode();
- if (Field29 != 0) hash ^= Field29.GetHashCode();
- if (Field30 != false) hash ^= Field30.GetHashCode();
- if (Field60 != 0) hash ^= Field60.GetHashCode();
- if (Field271 != 0) hash ^= Field271.GetHashCode();
- if (Field272 != 0) hash ^= Field272.GetHashCode();
- if (Field150 != 0) hash ^= Field150.GetHashCode();
- if (Field23 != 0) hash ^= Field23.GetHashCode();
- if (Field24 != false) hash ^= Field24.GetHashCode();
- if (Field25 != 0) hash ^= Field25.GetHashCode();
- if (field15_ != null) hash ^= Field15.GetHashCode();
- if (Field78 != false) hash ^= Field78.GetHashCode();
- if (Field67 != 0) hash ^= Field67.GetHashCode();
- if (Field68 != 0) hash ^= Field68.GetHashCode();
- if (Field128 != 0) hash ^= Field128.GetHashCode();
- if (Field129.Length != 0) hash ^= Field129.GetHashCode();
- if (Field131 != 0) hash ^= Field131.GetHashCode();
- if (_unknownFields != null) {
- hash ^= _unknownFields.GetHashCode();
- }
- return hash;
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public override string ToString() {
- return pb::JsonFormatter.ToDiagnosticString(this);
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public void WriteTo(pb::CodedOutputStream output) {
- #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
- output.WriteRawMessage(this);
- #else
- if (Field1.Length != 0) {
- output.WriteRawTag(10);
- output.WriteString(Field1);
- }
- if (Field2 != 0) {
- output.WriteRawTag(16);
- output.WriteInt32(Field2);
- }
- if (Field3 != 0) {
- output.WriteRawTag(24);
- output.WriteInt32(Field3);
- }
- if (Field4.Length != 0) {
- output.WriteRawTag(34);
- output.WriteString(Field4);
- }
- field5_.WriteTo(output, _repeated_field5_codec);
- if (Field6 != 0) {
- output.WriteRawTag(48);
- output.WriteInt32(Field6);
- }
- if (Field7.Length != 0) {
- output.WriteRawTag(58);
- output.WriteString(Field7);
- }
- if (Field9.Length != 0) {
- output.WriteRawTag(74);
- output.WriteString(Field9);
- }
- if (Field12 != false) {
- output.WriteRawTag(96);
- output.WriteBool(Field12);
- }
- if (Field13 != false) {
- output.WriteRawTag(104);
- output.WriteBool(Field13);
- }
- if (Field14 != false) {
- output.WriteRawTag(112);
- output.WriteBool(Field14);
- }
- if (field15_ != null) {
- output.WriteRawTag(122);
- output.WriteMessage(Field15);
- }
- if (Field16 != 0) {
- output.WriteRawTag(128, 1);
- output.WriteInt32(Field16);
- }
- if (Field17 != false) {
- output.WriteRawTag(136, 1);
- output.WriteBool(Field17);
- }
- if (Field18.Length != 0) {
- output.WriteRawTag(146, 1);
- output.WriteString(Field18);
- }
- if (Field22 != 0L) {
- output.WriteRawTag(176, 1);
- output.WriteInt64(Field22);
- }
- if (Field23 != 0) {
- output.WriteRawTag(184, 1);
- output.WriteInt32(Field23);
- }
- if (Field24 != false) {
- output.WriteRawTag(192, 1);
- output.WriteBool(Field24);
- }
- if (Field25 != 0) {
- output.WriteRawTag(200, 1);
- output.WriteInt32(Field25);
- }
- if (Field29 != 0) {
- output.WriteRawTag(232, 1);
- output.WriteInt32(Field29);
- }
- if (Field30 != false) {
- output.WriteRawTag(240, 1);
- output.WriteBool(Field30);
- }
- if (Field59 != false) {
- output.WriteRawTag(216, 3);
- output.WriteBool(Field59);
- }
- if (Field60 != 0) {
- output.WriteRawTag(224, 3);
- output.WriteInt32(Field60);
- }
- if (Field67 != 0) {
- output.WriteRawTag(152, 4);
- output.WriteInt32(Field67);
- }
- if (Field68 != 0) {
- output.WriteRawTag(160, 4);
- output.WriteInt32(Field68);
- }
- if (Field78 != false) {
- output.WriteRawTag(240, 4);
- output.WriteBool(Field78);
- }
- if (Field80 != false) {
- output.WriteRawTag(128, 5);
- output.WriteBool(Field80);
- }
- if (Field81 != false) {
- output.WriteRawTag(136, 5);
- output.WriteBool(Field81);
- }
- if (Field100 != 0) {
- output.WriteRawTag(160, 6);
- output.WriteInt32(Field100);
- }
- if (Field101 != 0) {
- output.WriteRawTag(168, 6);
- output.WriteInt32(Field101);
- }
- if (Field102.Length != 0) {
- output.WriteRawTag(178, 6);
- output.WriteString(Field102);
- }
- if (Field103.Length != 0) {
- output.WriteRawTag(186, 6);
- output.WriteString(Field103);
- }
- if (Field104 != 0) {
- output.WriteRawTag(192, 6);
- output.WriteInt32(Field104);
- }
- if (Field128 != 0) {
- output.WriteRawTag(128, 8);
- output.WriteInt32(Field128);
- }
- if (Field129.Length != 0) {
- output.WriteRawTag(138, 8);
- output.WriteString(Field129);
- }
- if (Field130 != 0) {
- output.WriteRawTag(144, 8);
- output.WriteInt32(Field130);
- }
- if (Field131 != 0) {
- output.WriteRawTag(152, 8);
- output.WriteInt32(Field131);
- }
- if (Field150 != 0) {
- output.WriteRawTag(176, 9);
- output.WriteInt32(Field150);
- }
- if (Field271 != 0) {
- output.WriteRawTag(248, 16);
- output.WriteInt32(Field271);
- }
- if (Field272 != 0) {
- output.WriteRawTag(128, 17);
- output.WriteInt32(Field272);
- }
- if (Field280 != 0) {
- output.WriteRawTag(192, 17);
- output.WriteInt32(Field280);
- }
- if (_unknownFields != null) {
- _unknownFields.WriteTo(output);
- }
- #endif
- }
-
- #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
- if (Field1.Length != 0) {
- output.WriteRawTag(10);
- output.WriteString(Field1);
- }
- if (Field2 != 0) {
- output.WriteRawTag(16);
- output.WriteInt32(Field2);
- }
- if (Field3 != 0) {
- output.WriteRawTag(24);
- output.WriteInt32(Field3);
- }
- if (Field4.Length != 0) {
- output.WriteRawTag(34);
- output.WriteString(Field4);
- }
- field5_.WriteTo(ref output, _repeated_field5_codec);
- if (Field6 != 0) {
- output.WriteRawTag(48);
- output.WriteInt32(Field6);
- }
- if (Field7.Length != 0) {
- output.WriteRawTag(58);
- output.WriteString(Field7);
- }
- if (Field9.Length != 0) {
- output.WriteRawTag(74);
- output.WriteString(Field9);
- }
- if (Field12 != false) {
- output.WriteRawTag(96);
- output.WriteBool(Field12);
- }
- if (Field13 != false) {
- output.WriteRawTag(104);
- output.WriteBool(Field13);
- }
- if (Field14 != false) {
- output.WriteRawTag(112);
- output.WriteBool(Field14);
- }
- if (field15_ != null) {
- output.WriteRawTag(122);
- output.WriteMessage(Field15);
- }
- if (Field16 != 0) {
- output.WriteRawTag(128, 1);
- output.WriteInt32(Field16);
- }
- if (Field17 != false) {
- output.WriteRawTag(136, 1);
- output.WriteBool(Field17);
- }
- if (Field18.Length != 0) {
- output.WriteRawTag(146, 1);
- output.WriteString(Field18);
- }
- if (Field22 != 0L) {
- output.WriteRawTag(176, 1);
- output.WriteInt64(Field22);
- }
- if (Field23 != 0) {
- output.WriteRawTag(184, 1);
- output.WriteInt32(Field23);
- }
- if (Field24 != false) {
- output.WriteRawTag(192, 1);
- output.WriteBool(Field24);
- }
- if (Field25 != 0) {
- output.WriteRawTag(200, 1);
- output.WriteInt32(Field25);
- }
- if (Field29 != 0) {
- output.WriteRawTag(232, 1);
- output.WriteInt32(Field29);
- }
- if (Field30 != false) {
- output.WriteRawTag(240, 1);
- output.WriteBool(Field30);
- }
- if (Field59 != false) {
- output.WriteRawTag(216, 3);
- output.WriteBool(Field59);
- }
- if (Field60 != 0) {
- output.WriteRawTag(224, 3);
- output.WriteInt32(Field60);
- }
- if (Field67 != 0) {
- output.WriteRawTag(152, 4);
- output.WriteInt32(Field67);
- }
- if (Field68 != 0) {
- output.WriteRawTag(160, 4);
- output.WriteInt32(Field68);
- }
- if (Field78 != false) {
- output.WriteRawTag(240, 4);
- output.WriteBool(Field78);
- }
- if (Field80 != false) {
- output.WriteRawTag(128, 5);
- output.WriteBool(Field80);
- }
- if (Field81 != false) {
- output.WriteRawTag(136, 5);
- output.WriteBool(Field81);
- }
- if (Field100 != 0) {
- output.WriteRawTag(160, 6);
- output.WriteInt32(Field100);
- }
- if (Field101 != 0) {
- output.WriteRawTag(168, 6);
- output.WriteInt32(Field101);
- }
- if (Field102.Length != 0) {
- output.WriteRawTag(178, 6);
- output.WriteString(Field102);
- }
- if (Field103.Length != 0) {
- output.WriteRawTag(186, 6);
- output.WriteString(Field103);
- }
- if (Field104 != 0) {
- output.WriteRawTag(192, 6);
- output.WriteInt32(Field104);
- }
- if (Field128 != 0) {
- output.WriteRawTag(128, 8);
- output.WriteInt32(Field128);
- }
- if (Field129.Length != 0) {
- output.WriteRawTag(138, 8);
- output.WriteString(Field129);
- }
- if (Field130 != 0) {
- output.WriteRawTag(144, 8);
- output.WriteInt32(Field130);
- }
- if (Field131 != 0) {
- output.WriteRawTag(152, 8);
- output.WriteInt32(Field131);
- }
- if (Field150 != 0) {
- output.WriteRawTag(176, 9);
- output.WriteInt32(Field150);
- }
- if (Field271 != 0) {
- output.WriteRawTag(248, 16);
- output.WriteInt32(Field271);
- }
- if (Field272 != 0) {
- output.WriteRawTag(128, 17);
- output.WriteInt32(Field272);
- }
- if (Field280 != 0) {
- output.WriteRawTag(192, 17);
- output.WriteInt32(Field280);
- }
- if (_unknownFields != null) {
- _unknownFields.WriteTo(ref output);
- }
- }
- #endif
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public int CalculateSize() {
- int size = 0;
- if (Field1.Length != 0) {
- size += 1 + pb::CodedOutputStream.ComputeStringSize(Field1);
- }
- if (Field9.Length != 0) {
- size += 1 + pb::CodedOutputStream.ComputeStringSize(Field9);
- }
- if (Field18.Length != 0) {
- size += 2 + pb::CodedOutputStream.ComputeStringSize(Field18);
- }
- if (Field80 != false) {
- size += 2 + 1;
- }
- if (Field81 != false) {
- size += 2 + 1;
- }
- if (Field2 != 0) {
- size += 1 + pb::CodedOutputStream.ComputeInt32Size(Field2);
- }
- if (Field3 != 0) {
- size += 1 + pb::CodedOutputStream.ComputeInt32Size(Field3);
- }
- if (Field280 != 0) {
- size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field280);
- }
- if (Field6 != 0) {
- size += 1 + pb::CodedOutputStream.ComputeInt32Size(Field6);
- }
- if (Field22 != 0L) {
- size += 2 + pb::CodedOutputStream.ComputeInt64Size(Field22);
- }
- if (Field4.Length != 0) {
- size += 1 + pb::CodedOutputStream.ComputeStringSize(Field4);
- }
- size += field5_.CalculateSize(_repeated_field5_codec);
- if (Field59 != false) {
- size += 2 + 1;
- }
- if (Field7.Length != 0) {
- size += 1 + pb::CodedOutputStream.ComputeStringSize(Field7);
- }
- if (Field16 != 0) {
- size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field16);
- }
- if (Field130 != 0) {
- size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field130);
- }
- if (Field12 != false) {
- size += 1 + 1;
- }
- if (Field17 != false) {
- size += 2 + 1;
- }
- if (Field13 != false) {
- size += 1 + 1;
- }
- if (Field14 != false) {
- size += 1 + 1;
- }
- if (Field104 != 0) {
- size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field104);
- }
- if (Field100 != 0) {
- size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field100);
- }
- if (Field101 != 0) {
- size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field101);
- }
- if (Field102.Length != 0) {
- size += 2 + pb::CodedOutputStream.ComputeStringSize(Field102);
- }
- if (Field103.Length != 0) {
- size += 2 + pb::CodedOutputStream.ComputeStringSize(Field103);
- }
- if (Field29 != 0) {
- size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field29);
- }
- if (Field30 != false) {
- size += 2 + 1;
- }
- if (Field60 != 0) {
- size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field60);
- }
- if (Field271 != 0) {
- size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field271);
- }
- if (Field272 != 0) {
- size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field272);
- }
- if (Field150 != 0) {
- size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field150);
- }
- if (Field23 != 0) {
- size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field23);
- }
- if (Field24 != false) {
- size += 2 + 1;
- }
- if (Field25 != 0) {
- size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field25);
- }
- if (field15_ != null) {
- size += 1 + pb::CodedOutputStream.ComputeMessageSize(Field15);
- }
- if (Field78 != false) {
- size += 2 + 1;
- }
- if (Field67 != 0) {
- size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field67);
- }
- if (Field68 != 0) {
- size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field68);
- }
- if (Field128 != 0) {
- size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field128);
- }
- if (Field129.Length != 0) {
- size += 2 + pb::CodedOutputStream.ComputeStringSize(Field129);
- }
- if (Field131 != 0) {
- size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field131);
- }
- if (_unknownFields != null) {
- size += _unknownFields.CalculateSize();
- }
- return size;
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public void MergeFrom(GoogleMessage1 other) {
- if (other == null) {
- return;
- }
- if (other.Field1.Length != 0) {
- Field1 = other.Field1;
- }
- if (other.Field9.Length != 0) {
- Field9 = other.Field9;
- }
- if (other.Field18.Length != 0) {
- Field18 = other.Field18;
- }
- if (other.Field80 != false) {
- Field80 = other.Field80;
- }
- if (other.Field81 != false) {
- Field81 = other.Field81;
- }
- if (other.Field2 != 0) {
- Field2 = other.Field2;
- }
- if (other.Field3 != 0) {
- Field3 = other.Field3;
- }
- if (other.Field280 != 0) {
- Field280 = other.Field280;
- }
- if (other.Field6 != 0) {
- Field6 = other.Field6;
- }
- if (other.Field22 != 0L) {
- Field22 = other.Field22;
- }
- if (other.Field4.Length != 0) {
- Field4 = other.Field4;
- }
- field5_.Add(other.field5_);
- if (other.Field59 != false) {
- Field59 = other.Field59;
- }
- if (other.Field7.Length != 0) {
- Field7 = other.Field7;
- }
- if (other.Field16 != 0) {
- Field16 = other.Field16;
- }
- if (other.Field130 != 0) {
- Field130 = other.Field130;
- }
- if (other.Field12 != false) {
- Field12 = other.Field12;
- }
- if (other.Field17 != false) {
- Field17 = other.Field17;
- }
- if (other.Field13 != false) {
- Field13 = other.Field13;
- }
- if (other.Field14 != false) {
- Field14 = other.Field14;
- }
- if (other.Field104 != 0) {
- Field104 = other.Field104;
- }
- if (other.Field100 != 0) {
- Field100 = other.Field100;
- }
- if (other.Field101 != 0) {
- Field101 = other.Field101;
- }
- if (other.Field102.Length != 0) {
- Field102 = other.Field102;
- }
- if (other.Field103.Length != 0) {
- Field103 = other.Field103;
- }
- if (other.Field29 != 0) {
- Field29 = other.Field29;
- }
- if (other.Field30 != false) {
- Field30 = other.Field30;
- }
- if (other.Field60 != 0) {
- Field60 = other.Field60;
- }
- if (other.Field271 != 0) {
- Field271 = other.Field271;
- }
- if (other.Field272 != 0) {
- Field272 = other.Field272;
- }
- if (other.Field150 != 0) {
- Field150 = other.Field150;
- }
- if (other.Field23 != 0) {
- Field23 = other.Field23;
- }
- if (other.Field24 != false) {
- Field24 = other.Field24;
- }
- if (other.Field25 != 0) {
- Field25 = other.Field25;
- }
- if (other.field15_ != null) {
- if (field15_ == null) {
- Field15 = new global::Benchmarks.Proto3.GoogleMessage1SubMessage();
- }
- Field15.MergeFrom(other.Field15);
- }
- if (other.Field78 != false) {
- Field78 = other.Field78;
- }
- if (other.Field67 != 0) {
- Field67 = other.Field67;
- }
- if (other.Field68 != 0) {
- Field68 = other.Field68;
- }
- if (other.Field128 != 0) {
- Field128 = other.Field128;
- }
- if (other.Field129.Length != 0) {
- Field129 = other.Field129;
- }
- if (other.Field131 != 0) {
- Field131 = other.Field131;
- }
- _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public void MergeFrom(pb::CodedInputStream input) {
- #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
- input.ReadRawMessage(this);
- #else
- uint tag;
- while ((tag = input.ReadTag()) != 0) {
- switch(tag) {
- default:
- _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
- break;
- case 10: {
- Field1 = input.ReadString();
- break;
- }
- case 16: {
- Field2 = input.ReadInt32();
- break;
- }
- case 24: {
- Field3 = input.ReadInt32();
- break;
- }
- case 34: {
- Field4 = input.ReadString();
- break;
- }
- case 42:
- case 41: {
- field5_.AddEntriesFrom(input, _repeated_field5_codec);
- break;
- }
- case 48: {
- Field6 = input.ReadInt32();
- break;
- }
- case 58: {
- Field7 = input.ReadString();
- break;
- }
- case 74: {
- Field9 = input.ReadString();
- break;
- }
- case 96: {
- Field12 = input.ReadBool();
- break;
- }
- case 104: {
- Field13 = input.ReadBool();
- break;
- }
- case 112: {
- Field14 = input.ReadBool();
- break;
- }
- case 122: {
- if (field15_ == null) {
- Field15 = new global::Benchmarks.Proto3.GoogleMessage1SubMessage();
- }
- input.ReadMessage(Field15);
- break;
- }
- case 128: {
- Field16 = input.ReadInt32();
- break;
- }
- case 136: {
- Field17 = input.ReadBool();
- break;
- }
- case 146: {
- Field18 = input.ReadString();
- break;
- }
- case 176: {
- Field22 = input.ReadInt64();
- break;
- }
- case 184: {
- Field23 = input.ReadInt32();
- break;
- }
- case 192: {
- Field24 = input.ReadBool();
- break;
- }
- case 200: {
- Field25 = input.ReadInt32();
- break;
- }
- case 232: {
- Field29 = input.ReadInt32();
- break;
- }
- case 240: {
- Field30 = input.ReadBool();
- break;
- }
- case 472: {
- Field59 = input.ReadBool();
- break;
- }
- case 480: {
- Field60 = input.ReadInt32();
- break;
- }
- case 536: {
- Field67 = input.ReadInt32();
- break;
- }
- case 544: {
- Field68 = input.ReadInt32();
- break;
- }
- case 624: {
- Field78 = input.ReadBool();
- break;
- }
- case 640: {
- Field80 = input.ReadBool();
- break;
- }
- case 648: {
- Field81 = input.ReadBool();
- break;
- }
- case 800: {
- Field100 = input.ReadInt32();
- break;
- }
- case 808: {
- Field101 = input.ReadInt32();
- break;
- }
- case 818: {
- Field102 = input.ReadString();
- break;
- }
- case 826: {
- Field103 = input.ReadString();
- break;
- }
- case 832: {
- Field104 = input.ReadInt32();
- break;
- }
- case 1024: {
- Field128 = input.ReadInt32();
- break;
- }
- case 1034: {
- Field129 = input.ReadString();
- break;
- }
- case 1040: {
- Field130 = input.ReadInt32();
- break;
- }
- case 1048: {
- Field131 = input.ReadInt32();
- break;
- }
- case 1200: {
- Field150 = input.ReadInt32();
- break;
- }
- case 2168: {
- Field271 = input.ReadInt32();
- break;
- }
- case 2176: {
- Field272 = input.ReadInt32();
- break;
- }
- case 2240: {
- Field280 = input.ReadInt32();
- break;
- }
- }
- }
- #endif
- }
-
- #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
- uint tag;
- while ((tag = input.ReadTag()) != 0) {
- switch(tag) {
- default:
- _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
- break;
- case 10: {
- Field1 = input.ReadString();
- break;
- }
- case 16: {
- Field2 = input.ReadInt32();
- break;
- }
- case 24: {
- Field3 = input.ReadInt32();
- break;
- }
- case 34: {
- Field4 = input.ReadString();
- break;
- }
- case 42:
- case 41: {
- field5_.AddEntriesFrom(ref input, _repeated_field5_codec);
- break;
- }
- case 48: {
- Field6 = input.ReadInt32();
- break;
- }
- case 58: {
- Field7 = input.ReadString();
- break;
- }
- case 74: {
- Field9 = input.ReadString();
- break;
- }
- case 96: {
- Field12 = input.ReadBool();
- break;
- }
- case 104: {
- Field13 = input.ReadBool();
- break;
- }
- case 112: {
- Field14 = input.ReadBool();
- break;
- }
- case 122: {
- if (field15_ == null) {
- Field15 = new global::Benchmarks.Proto3.GoogleMessage1SubMessage();
- }
- input.ReadMessage(Field15);
- break;
- }
- case 128: {
- Field16 = input.ReadInt32();
- break;
- }
- case 136: {
- Field17 = input.ReadBool();
- break;
- }
- case 146: {
- Field18 = input.ReadString();
- break;
- }
- case 176: {
- Field22 = input.ReadInt64();
- break;
- }
- case 184: {
- Field23 = input.ReadInt32();
- break;
- }
- case 192: {
- Field24 = input.ReadBool();
- break;
- }
- case 200: {
- Field25 = input.ReadInt32();
- break;
- }
- case 232: {
- Field29 = input.ReadInt32();
- break;
- }
- case 240: {
- Field30 = input.ReadBool();
- break;
- }
- case 472: {
- Field59 = input.ReadBool();
- break;
- }
- case 480: {
- Field60 = input.ReadInt32();
- break;
- }
- case 536: {
- Field67 = input.ReadInt32();
- break;
- }
- case 544: {
- Field68 = input.ReadInt32();
- break;
- }
- case 624: {
- Field78 = input.ReadBool();
- break;
- }
- case 640: {
- Field80 = input.ReadBool();
- break;
- }
- case 648: {
- Field81 = input.ReadBool();
- break;
- }
- case 800: {
- Field100 = input.ReadInt32();
- break;
- }
- case 808: {
- Field101 = input.ReadInt32();
- break;
- }
- case 818: {
- Field102 = input.ReadString();
- break;
- }
- case 826: {
- Field103 = input.ReadString();
- break;
- }
- case 832: {
- Field104 = input.ReadInt32();
- break;
- }
- case 1024: {
- Field128 = input.ReadInt32();
- break;
- }
- case 1034: {
- Field129 = input.ReadString();
- break;
- }
- case 1040: {
- Field130 = input.ReadInt32();
- break;
- }
- case 1048: {
- Field131 = input.ReadInt32();
- break;
- }
- case 1200: {
- Field150 = input.ReadInt32();
- break;
- }
- case 2168: {
- Field271 = input.ReadInt32();
- break;
- }
- case 2176: {
- Field272 = input.ReadInt32();
- break;
- }
- case 2240: {
- Field280 = input.ReadInt32();
- break;
- }
- }
- }
- }
- #endif
-
- }
-
- public sealed partial class GoogleMessage1SubMessage : pb::IMessage<GoogleMessage1SubMessage>
- #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
- , pb::IBufferMessage
- #endif
- {
- private static readonly pb::MessageParser<GoogleMessage1SubMessage> _parser = new pb::MessageParser<GoogleMessage1SubMessage>(() => new GoogleMessage1SubMessage());
- private pb::UnknownFieldSet _unknownFields;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public static pb::MessageParser<GoogleMessage1SubMessage> Parser { get { return _parser; } }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public static pbr::MessageDescriptor Descriptor {
- get { return global::Benchmarks.Proto3.BenchmarkMessage1Proto3Reflection.Descriptor.MessageTypes[1]; }
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- pbr::MessageDescriptor pb::IMessage.Descriptor {
- get { return Descriptor; }
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public GoogleMessage1SubMessage() {
- OnConstruction();
- }
-
- partial void OnConstruction();
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public GoogleMessage1SubMessage(GoogleMessage1SubMessage other) : this() {
- field1_ = other.field1_;
- field2_ = other.field2_;
- field3_ = other.field3_;
- field15_ = other.field15_;
- field12_ = other.field12_;
- field13_ = other.field13_;
- field14_ = other.field14_;
- field16_ = other.field16_;
- field19_ = other.field19_;
- field20_ = other.field20_;
- field28_ = other.field28_;
- field21_ = other.field21_;
- field22_ = other.field22_;
- field23_ = other.field23_;
- field206_ = other.field206_;
- field203_ = other.field203_;
- field204_ = other.field204_;
- field205_ = other.field205_;
- field207_ = other.field207_;
- field300_ = other.field300_;
- _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public GoogleMessage1SubMessage Clone() {
- return new GoogleMessage1SubMessage(this);
- }
-
- /// <summary>Field number for the "field1" field.</summary>
- public const int Field1FieldNumber = 1;
- private int field1_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public int Field1 {
- get { return field1_; }
- set {
- field1_ = value;
- }
- }
-
- /// <summary>Field number for the "field2" field.</summary>
- public const int Field2FieldNumber = 2;
- private int field2_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public int Field2 {
- get { return field2_; }
- set {
- field2_ = value;
- }
- }
-
- /// <summary>Field number for the "field3" field.</summary>
- public const int Field3FieldNumber = 3;
- private int field3_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public int Field3 {
- get { return field3_; }
- set {
- field3_ = value;
- }
- }
-
- /// <summary>Field number for the "field15" field.</summary>
- public const int Field15FieldNumber = 15;
- private string field15_ = "";
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public string Field15 {
- get { return field15_; }
- set {
- field15_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
- }
- }
-
- /// <summary>Field number for the "field12" field.</summary>
- public const int Field12FieldNumber = 12;
- private bool field12_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public bool Field12 {
- get { return field12_; }
- set {
- field12_ = value;
- }
- }
-
- /// <summary>Field number for the "field13" field.</summary>
- public const int Field13FieldNumber = 13;
- private long field13_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long Field13 {
- get { return field13_; }
- set {
- field13_ = value;
- }
- }
-
- /// <summary>Field number for the "field14" field.</summary>
- public const int Field14FieldNumber = 14;
- private long field14_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long Field14 {
- get { return field14_; }
- set {
- field14_ = value;
- }
- }
-
- /// <summary>Field number for the "field16" field.</summary>
- public const int Field16FieldNumber = 16;
- private int field16_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public int Field16 {
- get { return field16_; }
- set {
- field16_ = value;
- }
- }
-
- /// <summary>Field number for the "field19" field.</summary>
- public const int Field19FieldNumber = 19;
- private int field19_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public int Field19 {
- get { return field19_; }
- set {
- field19_ = value;
- }
- }
-
- /// <summary>Field number for the "field20" field.</summary>
- public const int Field20FieldNumber = 20;
- private bool field20_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public bool Field20 {
- get { return field20_; }
- set {
- field20_ = value;
- }
- }
-
- /// <summary>Field number for the "field28" field.</summary>
- public const int Field28FieldNumber = 28;
- private bool field28_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public bool Field28 {
- get { return field28_; }
- set {
- field28_ = value;
- }
- }
-
- /// <summary>Field number for the "field21" field.</summary>
- public const int Field21FieldNumber = 21;
- private ulong field21_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public ulong Field21 {
- get { return field21_; }
- set {
- field21_ = value;
- }
- }
-
- /// <summary>Field number for the "field22" field.</summary>
- public const int Field22FieldNumber = 22;
- private int field22_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public int Field22 {
- get { return field22_; }
- set {
- field22_ = value;
- }
- }
-
- /// <summary>Field number for the "field23" field.</summary>
- public const int Field23FieldNumber = 23;
- private bool field23_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public bool Field23 {
- get { return field23_; }
- set {
- field23_ = value;
- }
- }
-
- /// <summary>Field number for the "field206" field.</summary>
- public const int Field206FieldNumber = 206;
- private bool field206_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public bool Field206 {
- get { return field206_; }
- set {
- field206_ = value;
- }
- }
-
- /// <summary>Field number for the "field203" field.</summary>
- public const int Field203FieldNumber = 203;
- private uint field203_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public uint Field203 {
- get { return field203_; }
- set {
- field203_ = value;
- }
- }
-
- /// <summary>Field number for the "field204" field.</summary>
- public const int Field204FieldNumber = 204;
- private int field204_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public int Field204 {
- get { return field204_; }
- set {
- field204_ = value;
- }
- }
-
- /// <summary>Field number for the "field205" field.</summary>
- public const int Field205FieldNumber = 205;
- private string field205_ = "";
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public string Field205 {
- get { return field205_; }
- set {
- field205_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
- }
- }
-
- /// <summary>Field number for the "field207" field.</summary>
- public const int Field207FieldNumber = 207;
- private ulong field207_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public ulong Field207 {
- get { return field207_; }
- set {
- field207_ = value;
- }
- }
-
- /// <summary>Field number for the "field300" field.</summary>
- public const int Field300FieldNumber = 300;
- private ulong field300_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public ulong Field300 {
- get { return field300_; }
- set {
- field300_ = value;
- }
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public override bool Equals(object other) {
- return Equals(other as GoogleMessage1SubMessage);
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public bool Equals(GoogleMessage1SubMessage other) {
- if (ReferenceEquals(other, null)) {
- return false;
- }
- if (ReferenceEquals(other, this)) {
- return true;
- }
- if (Field1 != other.Field1) return false;
- if (Field2 != other.Field2) return false;
- if (Field3 != other.Field3) return false;
- if (Field15 != other.Field15) return false;
- if (Field12 != other.Field12) return false;
- if (Field13 != other.Field13) return false;
- if (Field14 != other.Field14) return false;
- if (Field16 != other.Field16) return false;
- if (Field19 != other.Field19) return false;
- if (Field20 != other.Field20) return false;
- if (Field28 != other.Field28) return false;
- if (Field21 != other.Field21) return false;
- if (Field22 != other.Field22) return false;
- if (Field23 != other.Field23) return false;
- if (Field206 != other.Field206) return false;
- if (Field203 != other.Field203) return false;
- if (Field204 != other.Field204) return false;
- if (Field205 != other.Field205) return false;
- if (Field207 != other.Field207) return false;
- if (Field300 != other.Field300) return false;
- return Equals(_unknownFields, other._unknownFields);
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public override int GetHashCode() {
- int hash = 1;
- if (Field1 != 0) hash ^= Field1.GetHashCode();
- if (Field2 != 0) hash ^= Field2.GetHashCode();
- if (Field3 != 0) hash ^= Field3.GetHashCode();
- if (Field15.Length != 0) hash ^= Field15.GetHashCode();
- if (Field12 != false) hash ^= Field12.GetHashCode();
- if (Field13 != 0L) hash ^= Field13.GetHashCode();
- if (Field14 != 0L) hash ^= Field14.GetHashCode();
- if (Field16 != 0) hash ^= Field16.GetHashCode();
- if (Field19 != 0) hash ^= Field19.GetHashCode();
- if (Field20 != false) hash ^= Field20.GetHashCode();
- if (Field28 != false) hash ^= Field28.GetHashCode();
- if (Field21 != 0UL) hash ^= Field21.GetHashCode();
- if (Field22 != 0) hash ^= Field22.GetHashCode();
- if (Field23 != false) hash ^= Field23.GetHashCode();
- if (Field206 != false) hash ^= Field206.GetHashCode();
- if (Field203 != 0) hash ^= Field203.GetHashCode();
- if (Field204 != 0) hash ^= Field204.GetHashCode();
- if (Field205.Length != 0) hash ^= Field205.GetHashCode();
- if (Field207 != 0UL) hash ^= Field207.GetHashCode();
- if (Field300 != 0UL) hash ^= Field300.GetHashCode();
- if (_unknownFields != null) {
- hash ^= _unknownFields.GetHashCode();
- }
- return hash;
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public override string ToString() {
- return pb::JsonFormatter.ToDiagnosticString(this);
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public void WriteTo(pb::CodedOutputStream output) {
- #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
- output.WriteRawMessage(this);
- #else
- if (Field1 != 0) {
- output.WriteRawTag(8);
- output.WriteInt32(Field1);
- }
- if (Field2 != 0) {
- output.WriteRawTag(16);
- output.WriteInt32(Field2);
- }
- if (Field3 != 0) {
- output.WriteRawTag(24);
- output.WriteInt32(Field3);
- }
- if (Field12 != false) {
- output.WriteRawTag(96);
- output.WriteBool(Field12);
- }
- if (Field13 != 0L) {
- output.WriteRawTag(104);
- output.WriteInt64(Field13);
- }
- if (Field14 != 0L) {
- output.WriteRawTag(112);
- output.WriteInt64(Field14);
- }
- if (Field15.Length != 0) {
- output.WriteRawTag(122);
- output.WriteString(Field15);
- }
- if (Field16 != 0) {
- output.WriteRawTag(128, 1);
- output.WriteInt32(Field16);
- }
- if (Field19 != 0) {
- output.WriteRawTag(152, 1);
- output.WriteInt32(Field19);
- }
- if (Field20 != false) {
- output.WriteRawTag(160, 1);
- output.WriteBool(Field20);
- }
- if (Field21 != 0UL) {
- output.WriteRawTag(169, 1);
- output.WriteFixed64(Field21);
- }
- if (Field22 != 0) {
- output.WriteRawTag(176, 1);
- output.WriteInt32(Field22);
- }
- if (Field23 != false) {
- output.WriteRawTag(184, 1);
- output.WriteBool(Field23);
- }
- if (Field28 != false) {
- output.WriteRawTag(224, 1);
- output.WriteBool(Field28);
- }
- if (Field203 != 0) {
- output.WriteRawTag(221, 12);
- output.WriteFixed32(Field203);
- }
- if (Field204 != 0) {
- output.WriteRawTag(224, 12);
- output.WriteInt32(Field204);
- }
- if (Field205.Length != 0) {
- output.WriteRawTag(234, 12);
- output.WriteString(Field205);
- }
- if (Field206 != false) {
- output.WriteRawTag(240, 12);
- output.WriteBool(Field206);
- }
- if (Field207 != 0UL) {
- output.WriteRawTag(248, 12);
- output.WriteUInt64(Field207);
- }
- if (Field300 != 0UL) {
- output.WriteRawTag(224, 18);
- output.WriteUInt64(Field300);
- }
- if (_unknownFields != null) {
- _unknownFields.WriteTo(output);
- }
- #endif
- }
-
- #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
- if (Field1 != 0) {
- output.WriteRawTag(8);
- output.WriteInt32(Field1);
- }
- if (Field2 != 0) {
- output.WriteRawTag(16);
- output.WriteInt32(Field2);
- }
- if (Field3 != 0) {
- output.WriteRawTag(24);
- output.WriteInt32(Field3);
- }
- if (Field12 != false) {
- output.WriteRawTag(96);
- output.WriteBool(Field12);
- }
- if (Field13 != 0L) {
- output.WriteRawTag(104);
- output.WriteInt64(Field13);
- }
- if (Field14 != 0L) {
- output.WriteRawTag(112);
- output.WriteInt64(Field14);
- }
- if (Field15.Length != 0) {
- output.WriteRawTag(122);
- output.WriteString(Field15);
- }
- if (Field16 != 0) {
- output.WriteRawTag(128, 1);
- output.WriteInt32(Field16);
- }
- if (Field19 != 0) {
- output.WriteRawTag(152, 1);
- output.WriteInt32(Field19);
- }
- if (Field20 != false) {
- output.WriteRawTag(160, 1);
- output.WriteBool(Field20);
- }
- if (Field21 != 0UL) {
- output.WriteRawTag(169, 1);
- output.WriteFixed64(Field21);
- }
- if (Field22 != 0) {
- output.WriteRawTag(176, 1);
- output.WriteInt32(Field22);
- }
- if (Field23 != false) {
- output.WriteRawTag(184, 1);
- output.WriteBool(Field23);
- }
- if (Field28 != false) {
- output.WriteRawTag(224, 1);
- output.WriteBool(Field28);
- }
- if (Field203 != 0) {
- output.WriteRawTag(221, 12);
- output.WriteFixed32(Field203);
- }
- if (Field204 != 0) {
- output.WriteRawTag(224, 12);
- output.WriteInt32(Field204);
- }
- if (Field205.Length != 0) {
- output.WriteRawTag(234, 12);
- output.WriteString(Field205);
- }
- if (Field206 != false) {
- output.WriteRawTag(240, 12);
- output.WriteBool(Field206);
- }
- if (Field207 != 0UL) {
- output.WriteRawTag(248, 12);
- output.WriteUInt64(Field207);
- }
- if (Field300 != 0UL) {
- output.WriteRawTag(224, 18);
- output.WriteUInt64(Field300);
- }
- if (_unknownFields != null) {
- _unknownFields.WriteTo(ref output);
- }
- }
- #endif
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public int CalculateSize() {
- int size = 0;
- if (Field1 != 0) {
- size += 1 + pb::CodedOutputStream.ComputeInt32Size(Field1);
- }
- if (Field2 != 0) {
- size += 1 + pb::CodedOutputStream.ComputeInt32Size(Field2);
- }
- if (Field3 != 0) {
- size += 1 + pb::CodedOutputStream.ComputeInt32Size(Field3);
- }
- if (Field15.Length != 0) {
- size += 1 + pb::CodedOutputStream.ComputeStringSize(Field15);
- }
- if (Field12 != false) {
- size += 1 + 1;
- }
- if (Field13 != 0L) {
- size += 1 + pb::CodedOutputStream.ComputeInt64Size(Field13);
- }
- if (Field14 != 0L) {
- size += 1 + pb::CodedOutputStream.ComputeInt64Size(Field14);
- }
- if (Field16 != 0) {
- size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field16);
- }
- if (Field19 != 0) {
- size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field19);
- }
- if (Field20 != false) {
- size += 2 + 1;
- }
- if (Field28 != false) {
- size += 2 + 1;
- }
- if (Field21 != 0UL) {
- size += 2 + 8;
- }
- if (Field22 != 0) {
- size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field22);
- }
- if (Field23 != false) {
- size += 2 + 1;
- }
- if (Field206 != false) {
- size += 2 + 1;
- }
- if (Field203 != 0) {
- size += 2 + 4;
- }
- if (Field204 != 0) {
- size += 2 + pb::CodedOutputStream.ComputeInt32Size(Field204);
- }
- if (Field205.Length != 0) {
- size += 2 + pb::CodedOutputStream.ComputeStringSize(Field205);
- }
- if (Field207 != 0UL) {
- size += 2 + pb::CodedOutputStream.ComputeUInt64Size(Field207);
- }
- if (Field300 != 0UL) {
- size += 2 + pb::CodedOutputStream.ComputeUInt64Size(Field300);
- }
- if (_unknownFields != null) {
- size += _unknownFields.CalculateSize();
- }
- return size;
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public void MergeFrom(GoogleMessage1SubMessage other) {
- if (other == null) {
- return;
- }
- if (other.Field1 != 0) {
- Field1 = other.Field1;
- }
- if (other.Field2 != 0) {
- Field2 = other.Field2;
- }
- if (other.Field3 != 0) {
- Field3 = other.Field3;
- }
- if (other.Field15.Length != 0) {
- Field15 = other.Field15;
- }
- if (other.Field12 != false) {
- Field12 = other.Field12;
- }
- if (other.Field13 != 0L) {
- Field13 = other.Field13;
- }
- if (other.Field14 != 0L) {
- Field14 = other.Field14;
- }
- if (other.Field16 != 0) {
- Field16 = other.Field16;
- }
- if (other.Field19 != 0) {
- Field19 = other.Field19;
- }
- if (other.Field20 != false) {
- Field20 = other.Field20;
- }
- if (other.Field28 != false) {
- Field28 = other.Field28;
- }
- if (other.Field21 != 0UL) {
- Field21 = other.Field21;
- }
- if (other.Field22 != 0) {
- Field22 = other.Field22;
- }
- if (other.Field23 != false) {
- Field23 = other.Field23;
- }
- if (other.Field206 != false) {
- Field206 = other.Field206;
- }
- if (other.Field203 != 0) {
- Field203 = other.Field203;
- }
- if (other.Field204 != 0) {
- Field204 = other.Field204;
- }
- if (other.Field205.Length != 0) {
- Field205 = other.Field205;
- }
- if (other.Field207 != 0UL) {
- Field207 = other.Field207;
- }
- if (other.Field300 != 0UL) {
- Field300 = other.Field300;
- }
- _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public void MergeFrom(pb::CodedInputStream input) {
- #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
- input.ReadRawMessage(this);
- #else
- uint tag;
- while ((tag = input.ReadTag()) != 0) {
- switch(tag) {
- default:
- _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
- break;
- case 8: {
- Field1 = input.ReadInt32();
- break;
- }
- case 16: {
- Field2 = input.ReadInt32();
- break;
- }
- case 24: {
- Field3 = input.ReadInt32();
- break;
- }
- case 96: {
- Field12 = input.ReadBool();
- break;
- }
- case 104: {
- Field13 = input.ReadInt64();
- break;
- }
- case 112: {
- Field14 = input.ReadInt64();
- break;
- }
- case 122: {
- Field15 = input.ReadString();
- break;
- }
- case 128: {
- Field16 = input.ReadInt32();
- break;
- }
- case 152: {
- Field19 = input.ReadInt32();
- break;
- }
- case 160: {
- Field20 = input.ReadBool();
- break;
- }
- case 169: {
- Field21 = input.ReadFixed64();
- break;
- }
- case 176: {
- Field22 = input.ReadInt32();
- break;
- }
- case 184: {
- Field23 = input.ReadBool();
- break;
- }
- case 224: {
- Field28 = input.ReadBool();
- break;
- }
- case 1629: {
- Field203 = input.ReadFixed32();
- break;
- }
- case 1632: {
- Field204 = input.ReadInt32();
- break;
- }
- case 1642: {
- Field205 = input.ReadString();
- break;
- }
- case 1648: {
- Field206 = input.ReadBool();
- break;
- }
- case 1656: {
- Field207 = input.ReadUInt64();
- break;
- }
- case 2400: {
- Field300 = input.ReadUInt64();
- break;
- }
- }
- }
- #endif
- }
-
- #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
- uint tag;
- while ((tag = input.ReadTag()) != 0) {
- switch(tag) {
- default:
- _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
- break;
- case 8: {
- Field1 = input.ReadInt32();
- break;
- }
- case 16: {
- Field2 = input.ReadInt32();
- break;
- }
- case 24: {
- Field3 = input.ReadInt32();
- break;
- }
- case 96: {
- Field12 = input.ReadBool();
- break;
- }
- case 104: {
- Field13 = input.ReadInt64();
- break;
- }
- case 112: {
- Field14 = input.ReadInt64();
- break;
- }
- case 122: {
- Field15 = input.ReadString();
- break;
- }
- case 128: {
- Field16 = input.ReadInt32();
- break;
- }
- case 152: {
- Field19 = input.ReadInt32();
- break;
- }
- case 160: {
- Field20 = input.ReadBool();
- break;
- }
- case 169: {
- Field21 = input.ReadFixed64();
- break;
- }
- case 176: {
- Field22 = input.ReadInt32();
- break;
- }
- case 184: {
- Field23 = input.ReadBool();
- break;
- }
- case 224: {
- Field28 = input.ReadBool();
- break;
- }
- case 1629: {
- Field203 = input.ReadFixed32();
- break;
- }
- case 1632: {
- Field204 = input.ReadInt32();
- break;
- }
- case 1642: {
- Field205 = input.ReadString();
- break;
- }
- case 1648: {
- Field206 = input.ReadBool();
- break;
- }
- case 1656: {
- Field207 = input.ReadUInt64();
- break;
- }
- case 2400: {
- Field300 = input.ReadUInt64();
- break;
- }
- }
- }
- }
- #endif
-
- }
-
- #endregion
-
-}
-
-#endregion Designer generated code
diff --git a/csharp/src/Google.Protobuf.Benchmarks/Benchmarks.cs b/csharp/src/Google.Protobuf.Benchmarks/Benchmarks.cs
deleted file mode 100644
index a05802d..0000000
--- a/csharp/src/Google.Protobuf.Benchmarks/Benchmarks.cs
+++ /dev/null
@@ -1,325 +0,0 @@
-// <auto-generated>
-// Generated by the protocol buffer compiler. DO NOT EDIT!
-// source: benchmarks.proto
-// </auto-generated>
-#pragma warning disable 1591, 0612, 3021, 8981
-#region Designer generated code
-
-using pb = global::Google.Protobuf;
-using pbc = global::Google.Protobuf.Collections;
-using pbr = global::Google.Protobuf.Reflection;
-using scg = global::System.Collections.Generic;
-namespace Benchmarks {
-
- /// <summary>Holder for reflection information generated from benchmarks.proto</summary>
- public static partial class BenchmarksReflection {
-
- #region Descriptor
- /// <summary>File descriptor for benchmarks.proto</summary>
- public static pbr::FileDescriptor Descriptor {
- get { return descriptor; }
- }
- private static pbr::FileDescriptor descriptor;
-
- static BenchmarksReflection() {
- byte[] descriptorData = global::System.Convert.FromBase64String(
- string.Concat(
- "ChBiZW5jaG1hcmtzLnByb3RvEgpiZW5jaG1hcmtzIkcKEEJlbmNobWFya0Rh",
- "dGFzZXQSDAoEbmFtZRgBIAEoCRIUCgxtZXNzYWdlX25hbWUYAiABKAkSDwoH",
- "cGF5bG9hZBgDIAMoDEIgCh5jb20uZ29vZ2xlLnByb3RvYnVmLmJlbmNobWFy",
- "a3NiBnByb3RvMw=="));
- descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
- new pbr::FileDescriptor[] { },
- new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] {
- new pbr::GeneratedClrTypeInfo(typeof(global::Benchmarks.BenchmarkDataset), global::Benchmarks.BenchmarkDataset.Parser, new[]{ "Name", "MessageName", "Payload" }, null, null, null, null)
- }));
- }
- #endregion
-
- }
- #region Messages
- public sealed partial class BenchmarkDataset : pb::IMessage<BenchmarkDataset>
- #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
- , pb::IBufferMessage
- #endif
- {
- private static readonly pb::MessageParser<BenchmarkDataset> _parser = new pb::MessageParser<BenchmarkDataset>(() => new BenchmarkDataset());
- private pb::UnknownFieldSet _unknownFields;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public static pb::MessageParser<BenchmarkDataset> Parser { get { return _parser; } }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public static pbr::MessageDescriptor Descriptor {
- get { return global::Benchmarks.BenchmarksReflection.Descriptor.MessageTypes[0]; }
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- pbr::MessageDescriptor pb::IMessage.Descriptor {
- get { return Descriptor; }
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public BenchmarkDataset() {
- OnConstruction();
- }
-
- partial void OnConstruction();
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public BenchmarkDataset(BenchmarkDataset other) : this() {
- name_ = other.name_;
- messageName_ = other.messageName_;
- payload_ = other.payload_.Clone();
- _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public BenchmarkDataset Clone() {
- return new BenchmarkDataset(this);
- }
-
- /// <summary>Field number for the "name" field.</summary>
- public const int NameFieldNumber = 1;
- private string name_ = "";
- /// <summary>
- /// Name of the benchmark dataset. This should be unique across all datasets.
- /// Should only contain word characters: [a-zA-Z0-9_]
- /// </summary>
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public string Name {
- get { return name_; }
- set {
- name_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
- }
- }
-
- /// <summary>Field number for the "message_name" field.</summary>
- public const int MessageNameFieldNumber = 2;
- private string messageName_ = "";
- /// <summary>
- /// Fully-qualified name of the protobuf message for this dataset.
- /// It will be one of the messages defined benchmark_messages_proto2.proto
- /// or benchmark_messages_proto3.proto.
- ///
- /// Implementations that do not support reflection can implement this with
- /// an explicit "if/else" chain that lists every known message defined
- /// in those files.
- /// </summary>
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public string MessageName {
- get { return messageName_; }
- set {
- messageName_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
- }
- }
-
- /// <summary>Field number for the "payload" field.</summary>
- public const int PayloadFieldNumber = 3;
- private static readonly pb::FieldCodec<pb::ByteString> _repeated_payload_codec
- = pb::FieldCodec.ForBytes(26);
- private readonly pbc::RepeatedField<pb::ByteString> payload_ = new pbc::RepeatedField<pb::ByteString>();
- /// <summary>
- /// The payload(s) for this dataset. They should be parsed or serialized
- /// in sequence, in a loop, ie.
- ///
- /// while (!benchmarkDone) { // Benchmark runner decides when to exit.
- /// for (i = 0; i < benchmark.payload.length; i++) {
- /// parse(benchmark.payload[i])
- /// }
- /// }
- ///
- /// This is intended to let datasets include a variety of data to provide
- /// potentially more realistic results than just parsing the same message
- /// over and over. A single message parsed repeatedly could yield unusually
- /// good branch prediction performance.
- /// </summary>
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public pbc::RepeatedField<pb::ByteString> Payload {
- get { return payload_; }
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public override bool Equals(object other) {
- return Equals(other as BenchmarkDataset);
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public bool Equals(BenchmarkDataset other) {
- if (ReferenceEquals(other, null)) {
- return false;
- }
- if (ReferenceEquals(other, this)) {
- return true;
- }
- if (Name != other.Name) return false;
- if (MessageName != other.MessageName) return false;
- if(!payload_.Equals(other.payload_)) return false;
- return Equals(_unknownFields, other._unknownFields);
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public override int GetHashCode() {
- int hash = 1;
- if (Name.Length != 0) hash ^= Name.GetHashCode();
- if (MessageName.Length != 0) hash ^= MessageName.GetHashCode();
- hash ^= payload_.GetHashCode();
- if (_unknownFields != null) {
- hash ^= _unknownFields.GetHashCode();
- }
- return hash;
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public override string ToString() {
- return pb::JsonFormatter.ToDiagnosticString(this);
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public void WriteTo(pb::CodedOutputStream output) {
- #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
- output.WriteRawMessage(this);
- #else
- if (Name.Length != 0) {
- output.WriteRawTag(10);
- output.WriteString(Name);
- }
- if (MessageName.Length != 0) {
- output.WriteRawTag(18);
- output.WriteString(MessageName);
- }
- payload_.WriteTo(output, _repeated_payload_codec);
- if (_unknownFields != null) {
- _unknownFields.WriteTo(output);
- }
- #endif
- }
-
- #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
- if (Name.Length != 0) {
- output.WriteRawTag(10);
- output.WriteString(Name);
- }
- if (MessageName.Length != 0) {
- output.WriteRawTag(18);
- output.WriteString(MessageName);
- }
- payload_.WriteTo(ref output, _repeated_payload_codec);
- if (_unknownFields != null) {
- _unknownFields.WriteTo(ref output);
- }
- }
- #endif
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public int CalculateSize() {
- int size = 0;
- if (Name.Length != 0) {
- size += 1 + pb::CodedOutputStream.ComputeStringSize(Name);
- }
- if (MessageName.Length != 0) {
- size += 1 + pb::CodedOutputStream.ComputeStringSize(MessageName);
- }
- size += payload_.CalculateSize(_repeated_payload_codec);
- if (_unknownFields != null) {
- size += _unknownFields.CalculateSize();
- }
- return size;
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public void MergeFrom(BenchmarkDataset other) {
- if (other == null) {
- return;
- }
- if (other.Name.Length != 0) {
- Name = other.Name;
- }
- if (other.MessageName.Length != 0) {
- MessageName = other.MessageName;
- }
- payload_.Add(other.payload_);
- _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public void MergeFrom(pb::CodedInputStream input) {
- #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
- input.ReadRawMessage(this);
- #else
- uint tag;
- while ((tag = input.ReadTag()) != 0) {
- switch(tag) {
- default:
- _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
- break;
- case 10: {
- Name = input.ReadString();
- break;
- }
- case 18: {
- MessageName = input.ReadString();
- break;
- }
- case 26: {
- payload_.AddEntriesFrom(input, _repeated_payload_codec);
- break;
- }
- }
- }
- #endif
- }
-
- #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
- uint tag;
- while ((tag = input.ReadTag()) != 0) {
- switch(tag) {
- default:
- _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
- break;
- case 10: {
- Name = input.ReadString();
- break;
- }
- case 18: {
- MessageName = input.ReadString();
- break;
- }
- case 26: {
- payload_.AddEntriesFrom(ref input, _repeated_payload_codec);
- break;
- }
- }
- }
- }
- #endif
-
- }
-
- #endregion
-
-}
-
-#endregion Designer generated code
diff --git a/csharp/src/Google.Protobuf.Benchmarks/ByteStringBenchmark.cs b/csharp/src/Google.Protobuf.Benchmarks/ByteStringBenchmark.cs
deleted file mode 100644
index a755850..0000000
--- a/csharp/src/Google.Protobuf.Benchmarks/ByteStringBenchmark.cs
+++ /dev/null
@@ -1,72 +0,0 @@
-#region Copyright notice and license
-// Protocol Buffers - Google's data interchange format
-// Copyright 2019 Google Inc. All rights reserved.
-// https://github.com/protocolbuffers/protobuf
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#endregion
-
-using BenchmarkDotNet.Attributes;
-
-namespace Google.Protobuf.Benchmarks
-{
- /// <summary>
- /// Benchmarks using ByteString.
- /// </summary>
- [MemoryDiagnoser]
- public class ByteStringBenchmark
- {
- private const int Zero = 0;
- private const int Kilobyte = 1024;
- private const int _128Kilobytes = 1024 * 128;
- private const int Megabyte = 1024 * 1024;
- private const int _10Megabytes = 1024 * 1024 * 10;
-
- byte[] byteBuffer;
-
- [GlobalSetup]
- public void GlobalSetup()
- {
- byteBuffer = new byte[PayloadSize];
- }
-
- [Params(Zero, Kilobyte, _128Kilobytes, Megabyte, _10Megabytes)]
- public int PayloadSize { get; set; }
-
- [Benchmark]
- public ByteString CopyFrom()
- {
- return ByteString.CopyFrom(byteBuffer);
- }
-
- [Benchmark]
- public ByteString UnsafeWrap()
- {
- return UnsafeByteOperations.UnsafeWrap(byteBuffer);
- }
- }
-}
diff --git a/csharp/src/Google.Protobuf.Benchmarks/Google.Protobuf.Benchmarks.csproj b/csharp/src/Google.Protobuf.Benchmarks/Google.Protobuf.Benchmarks.csproj
deleted file mode 100644
index fee5f65..0000000
--- a/csharp/src/Google.Protobuf.Benchmarks/Google.Protobuf.Benchmarks.csproj
+++ /dev/null
@@ -1,26 +0,0 @@
-<Project Sdk="Microsoft.NET.Sdk">
-
- <PropertyGroup>
- <OutputType>Exe</OutputType>
- <TargetFramework>net6.0</TargetFramework>
- <AssemblyOriginatorKeyFile>../../keys/Google.Protobuf.snk</AssemblyOriginatorKeyFile>
- <SignAssembly>true</SignAssembly>
- <IsPackable>False</IsPackable>
- <DebugType>pdbonly</DebugType>
- <DebugSymbols>true</DebugSymbols>
- </PropertyGroup>
-
- <ItemGroup>
- <Compile Include="..\Google.Protobuf.Test\ReadOnlySequenceFactory.cs" Link="ReadOnlySequenceFactory.cs" />
- </ItemGroup>
-
- <ItemGroup>
- <PackageReference Include="BenchmarkDotNet" Version="0.13.1" />
- <ProjectReference Include="..\Google.Protobuf\Google.Protobuf.csproj" />
- </ItemGroup>
-
- <ItemGroup>
- <EmbeddedResource Include="..\..\..\benchmarks\datasets\google_message1\proto3\dataset.google_message1_proto3.pb" />
- </ItemGroup>
-
-</Project>
diff --git a/csharp/src/Google.Protobuf.Benchmarks/GoogleMessageBenchmark.cs b/csharp/src/Google.Protobuf.Benchmarks/GoogleMessageBenchmark.cs
deleted file mode 100644
index 40fb3ba..0000000
--- a/csharp/src/Google.Protobuf.Benchmarks/GoogleMessageBenchmark.cs
+++ /dev/null
@@ -1,124 +0,0 @@
-#region Copyright notice and license
-// Protocol Buffers - Google's data interchange format
-// Copyright 2019 Google Inc. All rights reserved.
-// https://github.com/protocolbuffers/protobuf
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#endregion
-
-using BenchmarkDotNet.Attributes;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-
-namespace Google.Protobuf.Benchmarks
-{
- /// <summary>
- /// Benchmark for serializing and deserializing of standard datasets that are also
- /// measured by benchmarks in other languages.
- /// Over time we may wish to test the various different approaches to serialization and deserialization separately.
- /// See https://github.com/protocolbuffers/protobuf/blob/main/benchmarks/README.md
- /// See https://github.com/protocolbuffers/protobuf/blob/main/docs/performance.md
- /// </summary>
- [MemoryDiagnoser]
- public class GoogleMessageBenchmark
- {
- /// <summary>
- /// All the datasets to be tested. Add more datasets to the array as they're available.
- /// (When C# supports proto2, this will increase significantly.)
- /// </summary>
- public static BenchmarkDatasetConfig[] DatasetConfigurations => new[]
- {
- // short name is specified to make results table more readable
- new BenchmarkDatasetConfig("dataset.google_message1_proto3.pb", "goog_msg1_proto3")
- };
-
- [ParamsSource(nameof(DatasetConfigurations))]
- public BenchmarkDatasetConfig Dataset { get; set; }
-
- private MessageParser parser;
- /// <summary>
- /// Each data set can contain multiple messages in a single file.
- /// Each "write" operation should write each message in turn, and each "parse"
- /// operation should parse each message in turn.
- /// </summary>
- private List<SubTest> subTests;
-
- [GlobalSetup]
- public void GlobalSetup()
- {
- parser = Dataset.Parser;
- subTests = Dataset.Payloads.Select(p => new SubTest(p, parser.ParseFrom(p))).ToList();
- }
-
- [Benchmark]
- public void WriteToStream() => subTests.ForEach(item => item.WriteToStream());
-
- [Benchmark]
- public void ToByteArray() => subTests.ForEach(item => item.ToByteArray());
-
- [Benchmark]
- public void ParseFromByteArray() => subTests.ForEach(item => item.ParseFromByteArray(parser));
-
- [Benchmark]
- public void ParseFromStream() => subTests.ForEach(item => item.ParseFromStream(parser));
-
- private class SubTest
- {
- private readonly Stream destinationStream;
- private readonly Stream sourceStream;
- private readonly byte[] data;
- private readonly IMessage message;
-
- public SubTest(byte[] data, IMessage message)
- {
- destinationStream = new MemoryStream(data.Length);
- sourceStream = new MemoryStream(data);
- this.data = data;
- this.message = message;
- }
-
- public void Reset() => destinationStream.Position = 0;
-
- public void WriteToStream()
- {
- destinationStream.Position = 0;
- message.WriteTo(destinationStream);
- }
-
- public void ToByteArray() => message.ToByteArray();
-
- public void ParseFromByteArray(MessageParser parser) => parser.ParseFrom(data);
-
- public void ParseFromStream(MessageParser parser)
- {
- sourceStream.Position = 0;
- parser.ParseFrom(sourceStream);
- }
- }
- }
-}
diff --git a/csharp/src/Google.Protobuf.Benchmarks/ParseMessagesBenchmark.cs b/csharp/src/Google.Protobuf.Benchmarks/ParseMessagesBenchmark.cs
deleted file mode 100644
index 8e6710b..0000000
--- a/csharp/src/Google.Protobuf.Benchmarks/ParseMessagesBenchmark.cs
+++ /dev/null
@@ -1,258 +0,0 @@
-#region Copyright notice and license
-// Protocol Buffers - Google's data interchange format
-// Copyright 2019 Google Inc. All rights reserved.
-// https://github.com/protocolbuffers/protobuf
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#endregion
-
-using BenchmarkDotNet.Attributes;
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Buffers;
-using Google.Protobuf.WellKnownTypes;
-using Benchmarks.Proto3;
-
-namespace Google.Protobuf.Benchmarks
-{
- /// <summary>
- /// Benchmark that tests parsing performance for various messages.
- /// </summary>
- [MemoryDiagnoser]
- public class ParseMessagesBenchmark
- {
- const int MaxMessages = 100;
-
- SubTest manyWrapperFieldsTest = new SubTest(CreateManyWrapperFieldsMessage(), ManyWrapperFieldsMessage.Parser, () => new ManyWrapperFieldsMessage(), MaxMessages);
- SubTest manyPrimitiveFieldsTest = new SubTest(CreateManyPrimitiveFieldsMessage(), ManyPrimitiveFieldsMessage.Parser, () => new ManyPrimitiveFieldsMessage(), MaxMessages);
- SubTest repeatedFieldTest = new SubTest(CreateRepeatedFieldMessage(), GoogleMessage1.Parser, () => new GoogleMessage1(), MaxMessages);
- SubTest emptyMessageTest = new SubTest(new Empty(), Empty.Parser, () => new Empty(), MaxMessages);
-
- public IEnumerable<int> MessageCountValues => new[] { 10, 100 };
-
- [GlobalSetup]
- public void GlobalSetup()
- {
- }
-
- [Benchmark]
- public IMessage ManyWrapperFieldsMessage_ParseFromByteArray()
- {
- return manyWrapperFieldsTest.ParseFromByteArray();
- }
-
- [Benchmark]
- public IMessage ManyWrapperFieldsMessage_ParseFromReadOnlySequence()
- {
- return manyWrapperFieldsTest.ParseFromReadOnlySequence();
- }
-
- [Benchmark]
- public IMessage ManyPrimitiveFieldsMessage_ParseFromByteArray()
- {
- return manyPrimitiveFieldsTest.ParseFromByteArray();
- }
-
- [Benchmark]
- public IMessage ManyPrimitiveFieldsMessage_ParseFromReadOnlySequence()
- {
- return manyPrimitiveFieldsTest.ParseFromReadOnlySequence();
- }
-
- [Benchmark]
- public IMessage RepeatedFieldMessage_ParseFromByteArray()
- {
- return repeatedFieldTest.ParseFromByteArray();
- }
-
- [Benchmark]
- public IMessage RepeatedFieldMessage_ParseFromReadOnlySequence()
- {
- return repeatedFieldTest.ParseFromReadOnlySequence();
- }
-
- [Benchmark]
- public IMessage EmptyMessage_ParseFromByteArray()
- {
- return emptyMessageTest.ParseFromByteArray();
- }
-
- [Benchmark]
- public IMessage EmptyMessage_ParseFromReadOnlySequence()
- {
- return emptyMessageTest.ParseFromReadOnlySequence();
- }
-
- [Benchmark]
- [ArgumentsSource(nameof(MessageCountValues))]
- public void ManyWrapperFieldsMessage_ParseDelimitedMessagesFromByteArray(int messageCount)
- {
- manyWrapperFieldsTest.ParseDelimitedMessagesFromByteArray(messageCount);
- }
-
- [Benchmark]
- [ArgumentsSource(nameof(MessageCountValues))]
- public void ManyWrapperFieldsMessage_ParseDelimitedMessagesFromReadOnlySequence(int messageCount)
- {
- manyWrapperFieldsTest.ParseDelimitedMessagesFromReadOnlySequence(messageCount);
- }
-
- [Benchmark]
- [ArgumentsSource(nameof(MessageCountValues))]
- public void ManyPrimitiveFieldsMessage_ParseDelimitedMessagesFromByteArray(int messageCount)
- {
- manyPrimitiveFieldsTest.ParseDelimitedMessagesFromByteArray(messageCount);
- }
-
- [Benchmark]
- [ArgumentsSource(nameof(MessageCountValues))]
- public void ManyPrimitiveFieldsMessage_ParseDelimitedMessagesFromReadOnlySequence(int messageCount)
- {
- manyPrimitiveFieldsTest.ParseDelimitedMessagesFromReadOnlySequence(messageCount);
- }
-
- [Benchmark]
- [ArgumentsSource(nameof(MessageCountValues))]
- public void RepeatedFieldMessage_ParseDelimitedMessagesFromByteArray(int messageCount)
- {
- repeatedFieldTest.ParseDelimitedMessagesFromByteArray(messageCount);
- }
-
- [Benchmark]
- [ArgumentsSource(nameof(MessageCountValues))]
- public void RepeatedFieldMessage_ParseDelimitedMessagesFromReadOnlySequence(int messageCount)
- {
- repeatedFieldTest.ParseDelimitedMessagesFromReadOnlySequence(messageCount);
- }
-
- public static ManyWrapperFieldsMessage CreateManyWrapperFieldsMessage()
- {
- // Example data match data of an internal benchmarks
- return new ManyWrapperFieldsMessage()
- {
- Int64Field19 = 123,
- Int64Field37 = 1000032,
- Int64Field26 = 3453524500,
- DoubleField79 = 1.2,
- DoubleField25 = 234,
- DoubleField9 = 123.3,
- DoubleField28 = 23,
- DoubleField7 = 234,
- DoubleField50 = 2.45
- };
- }
-
- public static ManyPrimitiveFieldsMessage CreateManyPrimitiveFieldsMessage()
- {
- // Example data match data of an internal benchmarks
- return new ManyPrimitiveFieldsMessage()
- {
- Int64Field19 = 123,
- Int64Field37 = 1000032,
- Int64Field26 = 3453524500,
- DoubleField79 = 1.2,
- DoubleField25 = 234,
- DoubleField9 = 123.3,
- DoubleField28 = 23,
- DoubleField7 = 234,
- DoubleField50 = 2.45
- };
- }
-
- public static GoogleMessage1 CreateRepeatedFieldMessage()
- {
- // Message with a repeated fixed length item collection
- var message = new GoogleMessage1();
- for (ulong i = 0; i < 1000; i++)
- {
- message.Field5.Add(i);
- }
- return message;
- }
-
- private class SubTest
- {
- private readonly IMessage message;
- private readonly MessageParser parser;
- private readonly Func<IMessage> factory;
- private readonly byte[] data;
- private readonly byte[] multipleMessagesData;
-
- private ReadOnlySequence<byte> dataSequence;
- private ReadOnlySequence<byte> multipleMessagesDataSequence;
-
- public SubTest(IMessage message, MessageParser parser, Func<IMessage> factory, int maxMessageCount)
- {
- this.message = message;
- this.parser = parser;
- this.factory = factory;
- this.data = message.ToByteArray();
- this.multipleMessagesData = CreateBufferWithMultipleMessages(message, maxMessageCount);
- this.dataSequence = new ReadOnlySequence<byte>(this.data);
- this.multipleMessagesDataSequence = new ReadOnlySequence<byte>(this.multipleMessagesData);
- }
-
- public IMessage ParseFromByteArray() => parser.ParseFrom(data);
-
- public IMessage ParseFromReadOnlySequence() => parser.ParseFrom(dataSequence);
-
- public void ParseDelimitedMessagesFromByteArray(int messageCount)
- {
- var input = new CodedInputStream(multipleMessagesData);
- for (int i = 0; i < messageCount; i++)
- {
- var msg = factory();
- input.ReadMessage(msg);
- }
- }
-
- public void ParseDelimitedMessagesFromReadOnlySequence(int messageCount)
- {
- ParseContext.Initialize(multipleMessagesDataSequence, out ParseContext ctx);
- for (int i = 0; i < messageCount; i++)
- {
- var msg = factory();
- ctx.ReadMessage(msg);
- }
- }
-
- private static byte[] CreateBufferWithMultipleMessages(IMessage msg, int msgCount)
- {
- var ms = new MemoryStream();
- var cos = new CodedOutputStream(ms);
- for (int i = 0; i < msgCount; i++)
- {
- cos.WriteMessage(msg);
- }
- cos.Flush();
- return ms.ToArray();
- }
- }
- }
-}
diff --git a/csharp/src/Google.Protobuf.Benchmarks/ParseRawPrimitivesBenchmark.cs b/csharp/src/Google.Protobuf.Benchmarks/ParseRawPrimitivesBenchmark.cs
deleted file mode 100644
index 6df1c87..0000000
--- a/csharp/src/Google.Protobuf.Benchmarks/ParseRawPrimitivesBenchmark.cs
+++ /dev/null
@@ -1,536 +0,0 @@
-#region Copyright notice and license
-// Protocol Buffers - Google's data interchange format
-// Copyright 2019 Google Inc. All rights reserved.
-// https://github.com/protocolbuffers/protobuf
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#endregion
-
-using BenchmarkDotNet.Attributes;
-using System;
-using System.Buffers.Binary;
-using System.Collections.Generic;
-using System.IO;
-using System.Buffers;
-
-namespace Google.Protobuf.Benchmarks
-{
- /// <summary>
- /// Benchmarks throughput when parsing raw primitives.
- /// </summary>
- [MemoryDiagnoser]
- public class ParseRawPrimitivesBenchmark
- {
- // key is the encodedSize of varint values
- Dictionary<int, byte[]> varintInputBuffers;
-
- byte[] doubleInputBuffer;
- byte[] floatInputBuffer;
- byte[] fixedIntInputBuffer;
-
- // key is the encodedSize of string values
- Dictionary<int, byte[]> stringInputBuffers;
- Dictionary<int, ReadOnlySequence<byte>> stringInputBuffersSegmented;
-
- Random random = new Random(417384220); // random but deterministic seed
-
- public IEnumerable<int> StringEncodedSizes => new[] { 1, 4, 10, 105, 10080 };
- public IEnumerable<int> StringSegmentedEncodedSizes => new[] { 105, 10080 };
-
- [GlobalSetup]
- public void GlobalSetup()
- {
- // add some extra values that we won't read just to make sure we are far enough from the end of the buffer
- // which allows the parser fastpath to always kick in.
- const int paddingValueCount = 100;
-
- varintInputBuffers = new Dictionary<int, byte[]>();
- for (int encodedSize = 1; encodedSize <= 10; encodedSize++)
- {
- byte[] buffer = CreateBufferWithRandomVarints(random, BytesToParse / encodedSize, encodedSize, paddingValueCount);
- varintInputBuffers.Add(encodedSize, buffer);
- }
-
- doubleInputBuffer = CreateBufferWithRandomDoubles(random, BytesToParse / sizeof(double), paddingValueCount);
- floatInputBuffer = CreateBufferWithRandomFloats(random, BytesToParse / sizeof(float), paddingValueCount);
- fixedIntInputBuffer = CreateBufferWithRandomData(random, BytesToParse / sizeof(long), sizeof(long), paddingValueCount);
-
- stringInputBuffers = new Dictionary<int, byte[]>();
- foreach (var encodedSize in StringEncodedSizes)
- {
- byte[] buffer = CreateBufferWithStrings(BytesToParse / encodedSize, encodedSize, encodedSize < 10 ? 10 : 1 );
- stringInputBuffers.Add(encodedSize, buffer);
- }
-
- stringInputBuffersSegmented = new Dictionary<int, ReadOnlySequence<byte>>();
- foreach (var encodedSize in StringSegmentedEncodedSizes)
- {
- byte[] buffer = CreateBufferWithStrings(BytesToParse / encodedSize, encodedSize, encodedSize < 10 ? 10 : 1);
- stringInputBuffersSegmented.Add(encodedSize, ReadOnlySequenceFactory.CreateWithContent(buffer, segmentSize: 128, addEmptySegmentDelimiters: false));
- }
- }
-
- // Total number of bytes that each benchmark will parse.
- // Measuring the time taken to parse buffer of given size makes it easier to compare parsing speed for different
- // types and makes it easy to calculate the througput (in MB/s)
- // 10800 bytes is chosen because it is divisible by all possible encoded sizes for all primitive types {1..10}
- [Params(10080)]
- public int BytesToParse { get; set; }
-
- [Benchmark]
- [Arguments(1)]
- [Arguments(2)]
- [Arguments(3)]
- [Arguments(4)]
- [Arguments(5)]
- public int ParseRawVarint32_CodedInputStream(int encodedSize)
- {
- CodedInputStream cis = new CodedInputStream(varintInputBuffers[encodedSize]);
- int sum = 0;
- for (int i = 0; i < BytesToParse / encodedSize; i++)
- {
- sum += cis.ReadInt32();
- }
- return sum;
- }
-
- [Benchmark]
- [Arguments(1)]
- [Arguments(2)]
- [Arguments(3)]
- [Arguments(4)]
- [Arguments(5)]
- public int ParseRawVarint32_ParseContext(int encodedSize)
- {
- InitializeParseContext(varintInputBuffers[encodedSize], out ParseContext ctx);
- int sum = 0;
- for (int i = 0; i < BytesToParse / encodedSize; i++)
- {
- sum += ctx.ReadInt32();
- }
- return sum;
- }
-
- [Benchmark]
- [Arguments(1)]
- [Arguments(2)]
- [Arguments(3)]
- [Arguments(4)]
- [Arguments(5)]
- [Arguments(6)]
- [Arguments(7)]
- [Arguments(8)]
- [Arguments(9)]
- [Arguments(10)]
- public long ParseRawVarint64_CodedInputStream(int encodedSize)
- {
- CodedInputStream cis = new CodedInputStream(varintInputBuffers[encodedSize]);
- long sum = 0;
- for (int i = 0; i < BytesToParse / encodedSize; i++)
- {
- sum += cis.ReadInt64();
- }
- return sum;
- }
-
- [Benchmark]
- [Arguments(1)]
- [Arguments(2)]
- [Arguments(3)]
- [Arguments(4)]
- [Arguments(5)]
- [Arguments(6)]
- [Arguments(7)]
- [Arguments(8)]
- [Arguments(9)]
- [Arguments(10)]
- public long ParseRawVarint64_ParseContext(int encodedSize)
- {
- InitializeParseContext(varintInputBuffers[encodedSize], out ParseContext ctx);
- long sum = 0;
- for (int i = 0; i < BytesToParse / encodedSize; i++)
- {
- sum += ctx.ReadInt64();
- }
- return sum;
- }
-
- [Benchmark]
- public uint ParseFixed32_CodedInputStream()
- {
- const int encodedSize = sizeof(uint);
- CodedInputStream cis = new CodedInputStream(fixedIntInputBuffer);
- uint sum = 0;
- for (uint i = 0; i < BytesToParse / encodedSize; i++)
- {
- sum += cis.ReadFixed32();
- }
- return sum;
- }
-
- [Benchmark]
- public uint ParseFixed32_ParseContext()
- {
- const int encodedSize = sizeof(uint);
- InitializeParseContext(fixedIntInputBuffer, out ParseContext ctx);
- uint sum = 0;
- for (uint i = 0; i < BytesToParse / encodedSize; i++)
- {
- sum += ctx.ReadFixed32();
- }
- return sum;
- }
-
- [Benchmark]
- public ulong ParseFixed64_CodedInputStream()
- {
- const int encodedSize = sizeof(ulong);
- CodedInputStream cis = new CodedInputStream(fixedIntInputBuffer);
- ulong sum = 0;
- for (int i = 0; i < BytesToParse / encodedSize; i++)
- {
- sum += cis.ReadFixed64();
- }
- return sum;
- }
-
- [Benchmark]
- public ulong ParseFixed64_ParseContext()
- {
- const int encodedSize = sizeof(ulong);
- InitializeParseContext(fixedIntInputBuffer, out ParseContext ctx);
- ulong sum = 0;
- for (int i = 0; i < BytesToParse / encodedSize; i++)
- {
- sum += ctx.ReadFixed64();
- }
- return sum;
- }
-
- [Benchmark]
- public float ParseRawFloat_CodedInputStream()
- {
- const int encodedSize = sizeof(float);
- CodedInputStream cis = new CodedInputStream(floatInputBuffer);
- float sum = 0;
- for (int i = 0; i < BytesToParse / encodedSize; i++)
- {
- sum += cis.ReadFloat();
- }
- return sum;
- }
-
- [Benchmark]
- public float ParseRawFloat_ParseContext()
- {
- const int encodedSize = sizeof(float);
- InitializeParseContext(floatInputBuffer, out ParseContext ctx);
- float sum = 0;
- for (int i = 0; i < BytesToParse / encodedSize; i++)
- {
- sum += ctx.ReadFloat();
- }
- return sum;
- }
-
- [Benchmark]
- public double ParseRawDouble_CodedInputStream()
- {
- const int encodedSize = sizeof(double);
- CodedInputStream cis = new CodedInputStream(doubleInputBuffer);
- double sum = 0;
- for (int i = 0; i < BytesToParse / encodedSize; i++)
- {
- sum += cis.ReadDouble();
- }
- return sum;
- }
-
- [Benchmark]
- public double ParseRawDouble_ParseContext()
- {
- const int encodedSize = sizeof(double);
- InitializeParseContext(doubleInputBuffer, out ParseContext ctx);
- double sum = 0;
- for (int i = 0; i < BytesToParse / encodedSize; i++)
- {
- sum += ctx.ReadDouble();
- }
- return sum;
- }
-
- [Benchmark]
- [ArgumentsSource(nameof(StringEncodedSizes))]
- public int ParseString_CodedInputStream(int encodedSize)
- {
- CodedInputStream cis = new CodedInputStream(stringInputBuffers[encodedSize]);
- int sum = 0;
- for (int i = 0; i < BytesToParse / encodedSize; i++)
- {
- sum += cis.ReadString().Length;
- }
- return sum;
- }
-
- [Benchmark]
- [ArgumentsSource(nameof(StringEncodedSizes))]
- public int ParseString_ParseContext(int encodedSize)
- {
- InitializeParseContext(stringInputBuffers[encodedSize], out ParseContext ctx);
- int sum = 0;
- for (int i = 0; i < BytesToParse / encodedSize; i++)
- {
- sum += ctx.ReadString().Length;
- }
- return sum;
- }
-
- [Benchmark]
- [ArgumentsSource(nameof(StringSegmentedEncodedSizes))]
- public int ParseString_ParseContext_MultipleSegments(int encodedSize)
- {
- InitializeParseContext(stringInputBuffersSegmented[encodedSize], out ParseContext ctx);
- int sum = 0;
- for (int i = 0; i < BytesToParse / encodedSize; i++)
- {
- sum += ctx.ReadString().Length;
- }
- return sum;
- }
-
- [Benchmark]
- [ArgumentsSource(nameof(StringEncodedSizes))]
- public int ParseBytes_CodedInputStream(int encodedSize)
- {
- CodedInputStream cis = new CodedInputStream(stringInputBuffers[encodedSize]);
- int sum = 0;
- for (int i = 0; i < BytesToParse / encodedSize; i++)
- {
- sum += cis.ReadBytes().Length;
- }
- return sum;
- }
-
- [Benchmark]
- [ArgumentsSource(nameof(StringEncodedSizes))]
- public int ParseBytes_ParseContext(int encodedSize)
- {
- InitializeParseContext(stringInputBuffers[encodedSize], out ParseContext ctx);
- int sum = 0;
- for (int i = 0; i < BytesToParse / encodedSize; i++)
- {
- sum += ctx.ReadBytes().Length;
- }
- return sum;
- }
-
- [Benchmark]
- [ArgumentsSource(nameof(StringSegmentedEncodedSizes))]
- public int ParseBytes_ParseContext_MultipleSegments(int encodedSize)
- {
- InitializeParseContext(stringInputBuffersSegmented[encodedSize], out ParseContext ctx);
- int sum = 0;
- for (int i = 0; i < BytesToParse / encodedSize; i++)
- {
- sum += ctx.ReadBytes().Length;
- }
- return sum;
- }
-
- private static void InitializeParseContext(byte[] buffer, out ParseContext ctx)
- {
- ParseContext.Initialize(new ReadOnlySequence<byte>(buffer), out ctx);
- }
-
- private static void InitializeParseContext(ReadOnlySequence<byte> buffer, out ParseContext ctx)
- {
- ParseContext.Initialize(buffer, out ctx);
- }
-
- private static byte[] CreateBufferWithRandomVarints(Random random, int valueCount, int encodedSize, int paddingValueCount)
- {
- MemoryStream ms = new MemoryStream();
- CodedOutputStream cos = new CodedOutputStream(ms);
- for (int i = 0; i < valueCount + paddingValueCount; i++)
- {
- cos.WriteUInt64(RandomUnsignedVarint(random, encodedSize, false));
- }
- cos.Flush();
- var buffer = ms.ToArray();
-
- if (buffer.Length != encodedSize * (valueCount + paddingValueCount))
- {
- throw new InvalidOperationException($"Unexpected output buffer length {buffer.Length}");
- }
- return buffer;
- }
-
- private static byte[] CreateBufferWithRandomFloats(Random random, int valueCount, int paddingValueCount)
- {
- MemoryStream ms = new MemoryStream();
- CodedOutputStream cos = new CodedOutputStream(ms);
- for (int i = 0; i < valueCount + paddingValueCount; i++)
- {
- cos.WriteFloat((float)random.NextDouble());
- }
- cos.Flush();
- var buffer = ms.ToArray();
- return buffer;
- }
-
- private static byte[] CreateBufferWithRandomDoubles(Random random, int valueCount, int paddingValueCount)
- {
- MemoryStream ms = new MemoryStream();
- CodedOutputStream cos = new CodedOutputStream(ms);
- for (int i = 0; i < valueCount + paddingValueCount; i++)
- {
- cos.WriteDouble(random.NextDouble());
- }
- cos.Flush();
- var buffer = ms.ToArray();
- return buffer;
- }
-
- private static byte[] CreateBufferWithRandomData(Random random, int valueCount, int encodedSize, int paddingValueCount)
- {
- int bufferSize = (valueCount + paddingValueCount) * encodedSize;
- byte[] buffer = new byte[bufferSize];
- random.NextBytes(buffer);
- return buffer;
- }
-
- /// <summary>
- /// Generate a random value that will take exactly "encodedSize" bytes when varint-encoded.
- /// </summary>
- public static ulong RandomUnsignedVarint(Random random, int encodedSize, bool fitsIn32Bits)
- {
- Span<byte> randomBytesBuffer = stackalloc byte[8];
-
- if (encodedSize < 1 || encodedSize > 10 || (fitsIn32Bits && encodedSize > 5))
- {
- throw new ArgumentException("Illegal encodedSize value requested", nameof(encodedSize));
- }
- const int bitsPerByte = 7;
-
- ulong result = 0;
- while (true)
- {
- random.NextBytes(randomBytesBuffer);
- ulong randomValue = BinaryPrimitives.ReadUInt64LittleEndian(randomBytesBuffer);
-
- // only use the number of random bits we need
- ulong bitmask = encodedSize < 10 ? ((1UL << (encodedSize * bitsPerByte)) - 1) : ulong.MaxValue;
- result = randomValue & bitmask;
-
- if (fitsIn32Bits)
- {
- // make sure the resulting value is representable by a uint.
- result &= uint.MaxValue;
- }
-
- if (encodedSize == 10)
- {
- // for 10-byte values the highest bit always needs to be set (7*9=63)
- result |= ulong.MaxValue;
- break;
- }
-
- // some random values won't require the full "encodedSize" bytes, check that at least
- // one of the top 7 bits is set. Retrying is fine since it only happens rarely
- if (encodedSize == 1 || (result & (0x7FUL << ((encodedSize - 1) * bitsPerByte))) != 0)
- {
- break;
- }
- }
- return result;
- }
-
- private static byte[] CreateBufferWithStrings(int valueCount, int encodedSize, int paddingValueCount)
- {
- var str = CreateStringWithEncodedSize(encodedSize);
-
- MemoryStream ms = new MemoryStream();
- CodedOutputStream cos = new CodedOutputStream(ms);
- for (int i = 0; i < valueCount + paddingValueCount; i++)
- {
- cos.WriteString(str);
- }
- cos.Flush();
- var buffer = ms.ToArray();
-
- if (buffer.Length != encodedSize * (valueCount + paddingValueCount))
- {
- throw new InvalidOperationException($"Unexpected output buffer length {buffer.Length}");
- }
- return buffer;
- }
-
- public static string CreateStringWithEncodedSize(int encodedSize)
- {
- var str = new string('a', encodedSize);
- while (CodedOutputStream.ComputeStringSize(str) > encodedSize)
- {
- str = str.Substring(1);
- }
-
- if (CodedOutputStream.ComputeStringSize(str) != encodedSize)
- {
- throw new InvalidOperationException($"Generated string with wrong encodedSize");
- }
- return str;
- }
-
- public static string CreateNonAsciiStringWithEncodedSize(int encodedSize)
- {
- if (encodedSize < 3)
- {
- throw new ArgumentException("Illegal encoded size for a string with non-ascii chars.");
- }
- var twoByteChar = '\u00DC'; // U-umlaut, UTF8 encoding has 2 bytes
- var str = new string(twoByteChar, encodedSize / 2);
- while (CodedOutputStream.ComputeStringSize(str) > encodedSize)
- {
- str = str.Substring(1);
- }
-
- // add padding of ascii characters to reach the desired encoded size.
- while (CodedOutputStream.ComputeStringSize(str) < encodedSize)
- {
- str += 'a';
- }
-
- // Note that for a few specific encodedSize values, it might be impossible to generate
- // the string with the desired encodedSize using the algorithm above. For testing purposes, checking that
- // the encoded size we got is actually correct is good enough.
- if (CodedOutputStream.ComputeStringSize(str) != encodedSize)
- {
- throw new InvalidOperationException($"Generated string with wrong encodedSize");
- }
- return str;
- }
- }
-}
diff --git a/csharp/src/Google.Protobuf.Benchmarks/Program.cs b/csharp/src/Google.Protobuf.Benchmarks/Program.cs
deleted file mode 100644
index 037752f..0000000
--- a/csharp/src/Google.Protobuf.Benchmarks/Program.cs
+++ /dev/null
@@ -1,49 +0,0 @@
-#region Copyright notice and license
-// Protocol Buffers - Google's data interchange format
-// Copyright 2019 Google Inc. All rights reserved.
-// https://github.com/protocolbuffers/protobuf
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#endregion
-
-using BenchmarkDotNet.Running;
-
-namespace Google.Protobuf.Benchmarks
-{
- class Program
- {
- // typical usage: dotnet run -c Release -f netcoreapp3.1
- // (this can profile both .net core and .net framework; for some reason
- // if you start from "-f net461", it goes horribly wrong)
- public static void Main(string[] args)
- {
- BenchmarkSwitcher.FromAssembly(typeof(Program).Assembly).Run(args);
- }
- }
-
-
-}
diff --git a/csharp/src/Google.Protobuf.Benchmarks/WrapperBenchmarkMessages.cs b/csharp/src/Google.Protobuf.Benchmarks/WrapperBenchmarkMessages.cs
deleted file mode 100644
index e2eb2e8..0000000
--- a/csharp/src/Google.Protobuf.Benchmarks/WrapperBenchmarkMessages.cs
+++ /dev/null
@@ -1,9604 +0,0 @@
-// <auto-generated>
-// Generated by the protocol buffer compiler. DO NOT EDIT!
-// source: wrapper_benchmark_messages.proto
-// </auto-generated>
-#pragma warning disable 1591, 0612, 3021, 8981
-#region Designer generated code
-
-using pb = global::Google.Protobuf;
-using pbc = global::Google.Protobuf.Collections;
-using pbr = global::Google.Protobuf.Reflection;
-using scg = global::System.Collections.Generic;
-namespace Google.Protobuf.Benchmarks {
-
- /// <summary>Holder for reflection information generated from wrapper_benchmark_messages.proto</summary>
- public static partial class WrapperBenchmarkMessagesReflection {
-
- #region Descriptor
- /// <summary>File descriptor for wrapper_benchmark_messages.proto</summary>
- public static pbr::FileDescriptor Descriptor {
- get { return descriptor; }
- }
- private static pbr::FileDescriptor descriptor;
-
- static WrapperBenchmarkMessagesReflection() {
- byte[] descriptorData = global::System.Convert.FromBase64String(
- string.Concat(
- "CiB3cmFwcGVyX2JlbmNobWFya19tZXNzYWdlcy5wcm90bxIaZ29vZ2xlLnBy",
- "b3RvYnVmLmJlbmNobWFya3MaHmdvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5w",
- "cm90byLeLgoYTWFueVdyYXBwZXJGaWVsZHNNZXNzYWdlEjUKD2RvdWJsZV9m",
- "aWVsZF85NRhfIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5Eb3VibGVWYWx1ZRI0",
- "Cg5kb3VibGVfZmllbGRfMRgBIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5Eb3Vi",
- "bGVWYWx1ZRI1Cg9kb3VibGVfZmllbGRfNzkYTyABKAsyHC5nb29nbGUucHJv",
- "dG9idWYuRG91YmxlVmFsdWUSMgoNaW50NjRfZmllbGRfMhgCIAEoCzIbLmdv",
- "b2dsZS5wcm90b2J1Zi5JbnQ2NFZhbHVlEjUKD2RvdWJsZV9maWVsZF85Nhhg",
- "IAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5Eb3VibGVWYWx1ZRIyCg1pbnQ2NF9m",
- "aWVsZF8zGAMgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkludDY0VmFsdWUSMgoN",
- "aW50NjRfZmllbGRfNBgEIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQ2NFZh",
- "bHVlEjUKD2RvdWJsZV9maWVsZF85NxhhIAEoCzIcLmdvb2dsZS5wcm90b2J1",
- "Zi5Eb3VibGVWYWx1ZRI1Cg9kb3VibGVfZmllbGRfNjUYQSABKAsyHC5nb29n",
- "bGUucHJvdG9idWYuRG91YmxlVmFsdWUSNQoPZG91YmxlX2ZpZWxkXzY2GEIg",
- "ASgLMhwuZ29vZ2xlLnByb3RvYnVmLkRvdWJsZVZhbHVlEjQKDmRvdWJsZV9m",
- "aWVsZF83GAcgASgLMhwuZ29vZ2xlLnByb3RvYnVmLkRvdWJsZVZhbHVlEjUK",
- "D2RvdWJsZV9maWVsZF82Mhg+IAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5Eb3Vi",
- "bGVWYWx1ZRI2ChBkb3VibGVfZmllbGRfMTE4GHYgASgLMhwuZ29vZ2xlLnBy",
- "b3RvYnVmLkRvdWJsZVZhbHVlEjYKEGRvdWJsZV9maWVsZF8xMTkYdyABKAsy",
- "HC5nb29nbGUucHJvdG9idWYuRG91YmxlVmFsdWUSNQoPZG91YmxlX2ZpZWxk",
- "XzY3GEMgASgLMhwuZ29vZ2xlLnByb3RvYnVmLkRvdWJsZVZhbHVlEjYKEGRv",
- "dWJsZV9maWVsZF8xMjAYeCABKAsyHC5nb29nbGUucHJvdG9idWYuRG91Ymxl",
- "VmFsdWUSNgoQZG91YmxlX2ZpZWxkXzEyMRh5IAEoCzIcLmdvb2dsZS5wcm90",
- "b2J1Zi5Eb3VibGVWYWx1ZRI2ChBkb3VibGVfZmllbGRfMTIyGHogASgLMhwu",
- "Z29vZ2xlLnByb3RvYnVmLkRvdWJsZVZhbHVlEjYKEGRvdWJsZV9maWVsZF8x",
- "MjMYeyABKAsyHC5nb29nbGUucHJvdG9idWYuRG91YmxlVmFsdWUSNgoQZG91",
- "YmxlX2ZpZWxkXzEyNBh8IAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5Eb3VibGVW",
- "YWx1ZRI0Cg5kb3VibGVfZmllbGRfOBgIIAEoCzIcLmdvb2dsZS5wcm90b2J1",
- "Zi5Eb3VibGVWYWx1ZRI0Cg5kb3VibGVfZmllbGRfORgJIAEoCzIcLmdvb2ds",
- "ZS5wcm90b2J1Zi5Eb3VibGVWYWx1ZRI1Cg9kb3VibGVfZmllbGRfOTgYYiAB",
- "KAsyHC5nb29nbGUucHJvdG9idWYuRG91YmxlVmFsdWUSNQoPZG91YmxlX2Zp",
- "ZWxkXzEwGAogASgLMhwuZ29vZ2xlLnByb3RvYnVmLkRvdWJsZVZhbHVlEjUK",
- "D2RvdWJsZV9maWVsZF8xMRgLIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5Eb3Vi",
- "bGVWYWx1ZRI1Cg9kb3VibGVfZmllbGRfOTkYYyABKAsyHC5nb29nbGUucHJv",
- "dG9idWYuRG91YmxlVmFsdWUSNQoPZG91YmxlX2ZpZWxkXzg0GFQgASgLMhwu",
- "Z29vZ2xlLnByb3RvYnVmLkRvdWJsZVZhbHVlEjUKD2RvdWJsZV9maWVsZF8x",
- "NBgOIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5Eb3VibGVWYWx1ZRI1Cg9kb3Vi",
- "bGVfZmllbGRfNzcYTSABKAsyHC5nb29nbGUucHJvdG9idWYuRG91YmxlVmFs",
- "dWUSNQoPZG91YmxlX2ZpZWxkXzE1GA8gASgLMhwuZ29vZ2xlLnByb3RvYnVm",
- "LkRvdWJsZVZhbHVlEjMKDmludDY0X2ZpZWxkXzE5GBMgASgLMhsuZ29vZ2xl",
- "LnByb3RvYnVmLkludDY0VmFsdWUSNAoPaW50NjRfZmllbGRfMTE1GHMgASgL",
- "MhsuZ29vZ2xlLnByb3RvYnVmLkludDY0VmFsdWUSNgoQZG91YmxlX2ZpZWxk",
- "XzExNhh0IAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5Eb3VibGVWYWx1ZRI0Cg9p",
- "bnQ2NF9maWVsZF8xMTcYdSABKAsyGy5nb29nbGUucHJvdG9idWYuSW50NjRW",
- "YWx1ZRI1Cg9kb3VibGVfZmllbGRfMjAYFCABKAsyHC5nb29nbGUucHJvdG9i",
- "dWYuRG91YmxlVmFsdWUSNQoPZG91YmxlX2ZpZWxkXzIxGBUgASgLMhwuZ29v",
- "Z2xlLnByb3RvYnVmLkRvdWJsZVZhbHVlEjUKD3N0cmluZ19maWVsZF83MxhJ",
- "IAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRI1Cg9zdHJpbmdf",
- "ZmllbGRfNzQYSiABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUS",
- "NQoPZG91YmxlX2ZpZWxkXzIyGBYgASgLMhwuZ29vZ2xlLnByb3RvYnVmLkRv",
- "dWJsZVZhbHVlEjUKD2RvdWJsZV9maWVsZF82ORhFIAEoCzIcLmdvb2dsZS5w",
- "cm90b2J1Zi5Eb3VibGVWYWx1ZRI1Cg9kb3VibGVfZmllbGRfNzAYRiABKAsy",
- "HC5nb29nbGUucHJvdG9idWYuRG91YmxlVmFsdWUSNQoPZG91YmxlX2ZpZWxk",
- "XzcxGEcgASgLMhwuZ29vZ2xlLnByb3RvYnVmLkRvdWJsZVZhbHVlEjUKD2Rv",
- "dWJsZV9maWVsZF83MhhIIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5Eb3VibGVW",
- "YWx1ZRI1Cg9kb3VibGVfZmllbGRfMjUYGSABKAsyHC5nb29nbGUucHJvdG9i",
- "dWYuRG91YmxlVmFsdWUSMwoOaW50NjRfZmllbGRfMjYYGiABKAsyGy5nb29n",
- "bGUucHJvdG9idWYuSW50NjRWYWx1ZRI1Cg9kb3VibGVfZmllbGRfNjgYRCAB",
- "KAsyHC5nb29nbGUucHJvdG9idWYuRG91YmxlVmFsdWUSNQoPZG91YmxlX2Zp",
- "ZWxkXzI4GBwgASgLMhwuZ29vZ2xlLnByb3RvYnVmLkRvdWJsZVZhbHVlEjYK",
- "EGRvdWJsZV9maWVsZF8xMDYYaiABKAsyHC5nb29nbGUucHJvdG9idWYuRG91",
- "YmxlVmFsdWUSNQoPZG91YmxlX2ZpZWxkXzI5GB0gASgLMhwuZ29vZ2xlLnBy",
- "b3RvYnVmLkRvdWJsZVZhbHVlEjUKD2RvdWJsZV9maWVsZF8zMBgeIAEoCzIc",
- "Lmdvb2dsZS5wcm90b2J1Zi5Eb3VibGVWYWx1ZRI2ChBkb3VibGVfZmllbGRf",
- "MTAxGGUgASgLMhwuZ29vZ2xlLnByb3RvYnVmLkRvdWJsZVZhbHVlEjYKEGRv",
- "dWJsZV9maWVsZF8xMDIYZiABKAsyHC5nb29nbGUucHJvdG9idWYuRG91Ymxl",
- "VmFsdWUSNgoQZG91YmxlX2ZpZWxkXzEwMxhnIAEoCzIcLmdvb2dsZS5wcm90",
- "b2J1Zi5Eb3VibGVWYWx1ZRI2ChBkb3VibGVfZmllbGRfMTA0GGggASgLMhwu",
- "Z29vZ2xlLnByb3RvYnVmLkRvdWJsZVZhbHVlEjYKEGRvdWJsZV9maWVsZF8x",
- "MDUYaSABKAsyHC5nb29nbGUucHJvdG9idWYuRG91YmxlVmFsdWUSNQoPZG91",
- "YmxlX2ZpZWxkXzMxGB8gASgLMhwuZ29vZ2xlLnByb3RvYnVmLkRvdWJsZVZh",
- "bHVlEjMKDmludDY0X2ZpZWxkXzMyGCAgASgLMhsuZ29vZ2xlLnByb3RvYnVm",
- "LkludDY0VmFsdWUSNQoPZG91YmxlX2ZpZWxkXzc1GEsgASgLMhwuZ29vZ2xl",
- "LnByb3RvYnVmLkRvdWJsZVZhbHVlEjcKEGRvdWJsZV9maWVsZF8xMjkYgQEg",
- "ASgLMhwuZ29vZ2xlLnByb3RvYnVmLkRvdWJsZVZhbHVlEhUKDWVudW1fZmll",
- "bGRfODAYUCABKAUSFQoNZW51bV9maWVsZF84MRhRIAEoBRIzCg5pbnQ2NF9m",
- "aWVsZF84MhhSIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQ2NFZhbHVlEhUK",
- "DWVudW1fZmllbGRfODMYUyABKAUSMwoOaW50NjRfZmllbGRfODUYVSABKAsy",
- "Gy5nb29nbGUucHJvdG9idWYuSW50NjRWYWx1ZRIzCg5pbnQ2NF9maWVsZF84",
- "NhhWIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQ2NFZhbHVlEjMKDmludDY0",
- "X2ZpZWxkXzg3GFcgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkludDY0VmFsdWUS",
- "NAoPaW50NjRfZmllbGRfMTI1GH0gASgLMhsuZ29vZ2xlLnByb3RvYnVmLklu",
- "dDY0VmFsdWUSMwoOaW50NjRfZmllbGRfMzcYJSABKAsyGy5nb29nbGUucHJv",
- "dG9idWYuSW50NjRWYWx1ZRI1Cg9kb3VibGVfZmllbGRfMzgYJiABKAsyHC5n",
- "b29nbGUucHJvdG9idWYuRG91YmxlVmFsdWUSMQoMaW50ZXJhY3Rpb25zGCcg",
- "ASgLMhsuZ29vZ2xlLnByb3RvYnVmLkludDY0VmFsdWUSHgoWcmVwZWF0ZWRf",
- "aW50X2ZpZWxkXzEwMBhkIAMoBRI1Cg9kb3VibGVfZmllbGRfNDAYKCABKAsy",
- "HC5nb29nbGUucHJvdG9idWYuRG91YmxlVmFsdWUSMwoOaW50NjRfZmllbGRf",
- "NDEYKSABKAsyGy5nb29nbGUucHJvdG9idWYuSW50NjRWYWx1ZRI0Cg9pbnQ2",
- "NF9maWVsZF8xMjYYfiABKAsyGy5nb29nbGUucHJvdG9idWYuSW50NjRWYWx1",
- "ZRI0Cg9pbnQ2NF9maWVsZF8xMjcYfyABKAsyGy5nb29nbGUucHJvdG9idWYu",
- "SW50NjRWYWx1ZRI3ChBkb3VibGVfZmllbGRfMTI4GIABIAEoCzIcLmdvb2ds",
- "ZS5wcm90b2J1Zi5Eb3VibGVWYWx1ZRI2ChBkb3VibGVfZmllbGRfMTA5GG0g",
- "ASgLMhwuZ29vZ2xlLnByb3RvYnVmLkRvdWJsZVZhbHVlEjQKD2ludDY0X2Zp",
- "ZWxkXzExMBhuIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQ2NFZhbHVlEjYK",
- "EGRvdWJsZV9maWVsZF8xMTEYbyABKAsyHC5nb29nbGUucHJvdG9idWYuRG91",
- "YmxlVmFsdWUSNAoPaW50NjRfZmllbGRfMTEyGHAgASgLMhsuZ29vZ2xlLnBy",
- "b3RvYnVmLkludDY0VmFsdWUSNgoQZG91YmxlX2ZpZWxkXzExMxhxIAEoCzIc",
- "Lmdvb2dsZS5wcm90b2J1Zi5Eb3VibGVWYWx1ZRI0Cg9pbnQ2NF9maWVsZF8x",
- "MTQYciABKAsyGy5nb29nbGUucHJvdG9idWYuSW50NjRWYWx1ZRI1Cg9kb3Vi",
- "bGVfZmllbGRfNDIYKiABKAsyHC5nb29nbGUucHJvdG9idWYuRG91YmxlVmFs",
- "dWUSMwoOaW50NjRfZmllbGRfNDMYKyABKAsyGy5nb29nbGUucHJvdG9idWYu",
- "SW50NjRWYWx1ZRIzCg5pbnQ2NF9maWVsZF80NBgsIAEoCzIbLmdvb2dsZS5w",
- "cm90b2J1Zi5JbnQ2NFZhbHVlEjUKD2RvdWJsZV9maWVsZF80NRgtIAEoCzIc",
- "Lmdvb2dsZS5wcm90b2J1Zi5Eb3VibGVWYWx1ZRI1Cg9kb3VibGVfZmllbGRf",
- "NDYYLiABKAsyHC5nb29nbGUucHJvdG9idWYuRG91YmxlVmFsdWUSNQoPZG91",
- "YmxlX2ZpZWxkXzc4GE4gASgLMhwuZ29vZ2xlLnByb3RvYnVmLkRvdWJsZVZh",
- "bHVlEjUKD2RvdWJsZV9maWVsZF84OBhYIAEoCzIcLmdvb2dsZS5wcm90b2J1",
- "Zi5Eb3VibGVWYWx1ZRI1Cg9kb3VibGVfZmllbGRfNDcYLyABKAsyHC5nb29n",
- "bGUucHJvdG9idWYuRG91YmxlVmFsdWUSNQoPZG91YmxlX2ZpZWxkXzg5GFkg",
- "ASgLMhwuZ29vZ2xlLnByb3RvYnVmLkRvdWJsZVZhbHVlEjUKD2RvdWJsZV9m",
- "aWVsZF80OBgwIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5Eb3VibGVWYWx1ZRI1",
- "Cg9kb3VibGVfZmllbGRfNDkYMSABKAsyHC5nb29nbGUucHJvdG9idWYuRG91",
- "YmxlVmFsdWUSNQoPZG91YmxlX2ZpZWxkXzUwGDIgASgLMhwuZ29vZ2xlLnBy",
- "b3RvYnVmLkRvdWJsZVZhbHVlEjUKD2RvdWJsZV9maWVsZF85MBhaIAEoCzIc",
- "Lmdvb2dsZS5wcm90b2J1Zi5Eb3VibGVWYWx1ZRI1Cg9kb3VibGVfZmllbGRf",
- "NTEYMyABKAsyHC5nb29nbGUucHJvdG9idWYuRG91YmxlVmFsdWUSNQoPZG91",
- "YmxlX2ZpZWxkXzkxGFsgASgLMhwuZ29vZ2xlLnByb3RvYnVmLkRvdWJsZVZh",
- "bHVlEjUKD2RvdWJsZV9maWVsZF85MhhcIAEoCzIcLmdvb2dsZS5wcm90b2J1",
- "Zi5Eb3VibGVWYWx1ZRI0Cg9pbnQ2NF9maWVsZF8xMDcYayABKAsyGy5nb29n",
- "bGUucHJvdG9idWYuSW50NjRWYWx1ZRI1Cg9kb3VibGVfZmllbGRfOTMYXSAB",
- "KAsyHC5nb29nbGUucHJvdG9idWYuRG91YmxlVmFsdWUSNgoQZG91YmxlX2Zp",
- "ZWxkXzEwOBhsIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5Eb3VibGVWYWx1ZRI1",
- "Cg9kb3VibGVfZmllbGRfNTIYNCABKAsyHC5nb29nbGUucHJvdG9idWYuRG91",
- "YmxlVmFsdWUSNQoPZG91YmxlX2ZpZWxkXzUzGDUgASgLMhwuZ29vZ2xlLnBy",
- "b3RvYnVmLkRvdWJsZVZhbHVlEjUKD2RvdWJsZV9maWVsZF85NBheIAEoCzIc",
- "Lmdvb2dsZS5wcm90b2J1Zi5Eb3VibGVWYWx1ZRI1Cg9kb3VibGVfZmllbGRf",
- "NTQYNiABKAsyHC5nb29nbGUucHJvdG9idWYuRG91YmxlVmFsdWUSNQoPZG91",
- "YmxlX2ZpZWxkXzU1GDcgASgLMhwuZ29vZ2xlLnByb3RvYnVmLkRvdWJsZVZh",
- "bHVlEjUKD2RvdWJsZV9maWVsZF81Nhg4IAEoCzIcLmdvb2dsZS5wcm90b2J1",
- "Zi5Eb3VibGVWYWx1ZRI1Cg9kb3VibGVfZmllbGRfNTcYOSABKAsyHC5nb29n",
- "bGUucHJvdG9idWYuRG91YmxlVmFsdWUSNQoPZG91YmxlX2ZpZWxkXzU4GDog",
- "ASgLMhwuZ29vZ2xlLnByb3RvYnVmLkRvdWJsZVZhbHVlEjMKDmludDY0X2Zp",
- "ZWxkXzU5GDsgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkludDY0VmFsdWUSMwoO",
- "aW50NjRfZmllbGRfNjAYPCABKAsyGy5nb29nbGUucHJvdG9idWYuSW50NjRW",
- "YWx1ZSLwFQoaTWFueVByaW1pdGl2ZUZpZWxkc01lc3NhZ2USFwoPZG91Ymxl",
- "X2ZpZWxkXzk1GF8gASgBEhYKDmRvdWJsZV9maWVsZF8xGAEgASgBEhcKD2Rv",
- "dWJsZV9maWVsZF83ORhPIAEoARIVCg1pbnQ2NF9maWVsZF8yGAIgASgDEhcK",
- "D2RvdWJsZV9maWVsZF85NhhgIAEoARIVCg1pbnQ2NF9maWVsZF8zGAMgASgD",
- "EhUKDWludDY0X2ZpZWxkXzQYBCABKAMSFwoPZG91YmxlX2ZpZWxkXzk3GGEg",
- "ASgBEhcKD2RvdWJsZV9maWVsZF82NRhBIAEoARIXCg9kb3VibGVfZmllbGRf",
- "NjYYQiABKAESFgoOZG91YmxlX2ZpZWxkXzcYByABKAESFwoPZG91YmxlX2Zp",
- "ZWxkXzYyGD4gASgBEhgKEGRvdWJsZV9maWVsZF8xMTgYdiABKAESGAoQZG91",
- "YmxlX2ZpZWxkXzExORh3IAEoARIXCg9kb3VibGVfZmllbGRfNjcYQyABKAES",
- "GAoQZG91YmxlX2ZpZWxkXzEyMBh4IAEoARIYChBkb3VibGVfZmllbGRfMTIx",
- "GHkgASgBEhgKEGRvdWJsZV9maWVsZF8xMjIYeiABKAESGAoQZG91YmxlX2Zp",
- "ZWxkXzEyMxh7IAEoARIYChBkb3VibGVfZmllbGRfMTI0GHwgASgBEhYKDmRv",
- "dWJsZV9maWVsZF84GAggASgBEhYKDmRvdWJsZV9maWVsZF85GAkgASgBEhcK",
- "D2RvdWJsZV9maWVsZF85OBhiIAEoARIXCg9kb3VibGVfZmllbGRfMTAYCiAB",
- "KAESFwoPZG91YmxlX2ZpZWxkXzExGAsgASgBEhcKD2RvdWJsZV9maWVsZF85",
- "ORhjIAEoARIXCg9kb3VibGVfZmllbGRfODQYVCABKAESFwoPZG91YmxlX2Zp",
- "ZWxkXzE0GA4gASgBEhcKD2RvdWJsZV9maWVsZF83NxhNIAEoARIXCg9kb3Vi",
- "bGVfZmllbGRfMTUYDyABKAESFgoOaW50NjRfZmllbGRfMTkYEyABKAMSFwoP",
- "aW50NjRfZmllbGRfMTE1GHMgASgDEhgKEGRvdWJsZV9maWVsZF8xMTYYdCAB",
- "KAESFwoPaW50NjRfZmllbGRfMTE3GHUgASgDEhcKD2RvdWJsZV9maWVsZF8y",
- "MBgUIAEoARIXCg9kb3VibGVfZmllbGRfMjEYFSABKAESFwoPc3RyaW5nX2Zp",
- "ZWxkXzczGEkgASgJEhcKD3N0cmluZ19maWVsZF83NBhKIAEoCRIXCg9kb3Vi",
- "bGVfZmllbGRfMjIYFiABKAESFwoPZG91YmxlX2ZpZWxkXzY5GEUgASgBEhcK",
- "D2RvdWJsZV9maWVsZF83MBhGIAEoARIXCg9kb3VibGVfZmllbGRfNzEYRyAB",
- "KAESFwoPZG91YmxlX2ZpZWxkXzcyGEggASgBEhcKD2RvdWJsZV9maWVsZF8y",
- "NRgZIAEoARIWCg5pbnQ2NF9maWVsZF8yNhgaIAEoAxIXCg9kb3VibGVfZmll",
- "bGRfNjgYRCABKAESFwoPZG91YmxlX2ZpZWxkXzI4GBwgASgBEhgKEGRvdWJs",
- "ZV9maWVsZF8xMDYYaiABKAESFwoPZG91YmxlX2ZpZWxkXzI5GB0gASgBEhcK",
- "D2RvdWJsZV9maWVsZF8zMBgeIAEoARIYChBkb3VibGVfZmllbGRfMTAxGGUg",
- "ASgBEhgKEGRvdWJsZV9maWVsZF8xMDIYZiABKAESGAoQZG91YmxlX2ZpZWxk",
- "XzEwMxhnIAEoARIYChBkb3VibGVfZmllbGRfMTA0GGggASgBEhgKEGRvdWJs",
- "ZV9maWVsZF8xMDUYaSABKAESFwoPZG91YmxlX2ZpZWxkXzMxGB8gASgBEhYK",
- "DmludDY0X2ZpZWxkXzMyGCAgASgDEhcKD2RvdWJsZV9maWVsZF83NRhLIAEo",
- "ARIZChBkb3VibGVfZmllbGRfMTI5GIEBIAEoARIVCg1lbnVtX2ZpZWxkXzgw",
- "GFAgASgFEhUKDWVudW1fZmllbGRfODEYUSABKAUSFgoOaW50NjRfZmllbGRf",
- "ODIYUiABKAMSFQoNZW51bV9maWVsZF84MxhTIAEoBRIWCg5pbnQ2NF9maWVs",
- "ZF84NRhVIAEoAxIWCg5pbnQ2NF9maWVsZF84NhhWIAEoAxIWCg5pbnQ2NF9m",
- "aWVsZF84NxhXIAEoAxIXCg9pbnQ2NF9maWVsZF8xMjUYfSABKAMSFgoOaW50",
- "NjRfZmllbGRfMzcYJSABKAMSFwoPZG91YmxlX2ZpZWxkXzM4GCYgASgBEhQK",
- "DGludGVyYWN0aW9ucxgnIAEoAxIeChZyZXBlYXRlZF9pbnRfZmllbGRfMTAw",
- "GGQgAygFEhcKD2RvdWJsZV9maWVsZF80MBgoIAEoARIWCg5pbnQ2NF9maWVs",
- "ZF80MRgpIAEoAxIXCg9pbnQ2NF9maWVsZF8xMjYYfiABKAMSFwoPaW50NjRf",
- "ZmllbGRfMTI3GH8gASgDEhkKEGRvdWJsZV9maWVsZF8xMjgYgAEgASgBEhgK",
- "EGRvdWJsZV9maWVsZF8xMDkYbSABKAESFwoPaW50NjRfZmllbGRfMTEwGG4g",
- "ASgDEhgKEGRvdWJsZV9maWVsZF8xMTEYbyABKAESFwoPaW50NjRfZmllbGRf",
- "MTEyGHAgASgDEhgKEGRvdWJsZV9maWVsZF8xMTMYcSABKAESFwoPaW50NjRf",
- "ZmllbGRfMTE0GHIgASgDEhcKD2RvdWJsZV9maWVsZF80MhgqIAEoARIWCg5p",
- "bnQ2NF9maWVsZF80MxgrIAEoAxIWCg5pbnQ2NF9maWVsZF80NBgsIAEoAxIX",
- "Cg9kb3VibGVfZmllbGRfNDUYLSABKAESFwoPZG91YmxlX2ZpZWxkXzQ2GC4g",
- "ASgBEhcKD2RvdWJsZV9maWVsZF83OBhOIAEoARIXCg9kb3VibGVfZmllbGRf",
- "ODgYWCABKAESFwoPZG91YmxlX2ZpZWxkXzQ3GC8gASgBEhcKD2RvdWJsZV9m",
- "aWVsZF84ORhZIAEoARIXCg9kb3VibGVfZmllbGRfNDgYMCABKAESFwoPZG91",
- "YmxlX2ZpZWxkXzQ5GDEgASgBEhcKD2RvdWJsZV9maWVsZF81MBgyIAEoARIX",
- "Cg9kb3VibGVfZmllbGRfOTAYWiABKAESFwoPZG91YmxlX2ZpZWxkXzUxGDMg",
- "ASgBEhcKD2RvdWJsZV9maWVsZF85MRhbIAEoARIXCg9kb3VibGVfZmllbGRf",
- "OTIYXCABKAESFwoPaW50NjRfZmllbGRfMTA3GGsgASgDEhcKD2RvdWJsZV9m",
- "aWVsZF85MxhdIAEoARIYChBkb3VibGVfZmllbGRfMTA4GGwgASgBEhcKD2Rv",
- "dWJsZV9maWVsZF81Mhg0IAEoARIXCg9kb3VibGVfZmllbGRfNTMYNSABKAES",
- "FwoPZG91YmxlX2ZpZWxkXzk0GF4gASgBEhcKD2RvdWJsZV9maWVsZF81NBg2",
- "IAEoARIXCg9kb3VibGVfZmllbGRfNTUYNyABKAESFwoPZG91YmxlX2ZpZWxk",
- "XzU2GDggASgBEhcKD2RvdWJsZV9maWVsZF81Nxg5IAEoARIXCg9kb3VibGVf",
- "ZmllbGRfNTgYOiABKAESFgoOaW50NjRfZmllbGRfNTkYOyABKAMSFgoOaW50",
- "NjRfZmllbGRfNjAYPCABKANiBnByb3RvMw=="));
- descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
- new pbr::FileDescriptor[] { global::Google.Protobuf.WellKnownTypes.WrappersReflection.Descriptor, },
- new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] {
- new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Benchmarks.ManyWrapperFieldsMessage), global::Google.Protobuf.Benchmarks.ManyWrapperFieldsMessage.Parser, new[]{ "DoubleField95", "DoubleField1", "DoubleField79", "Int64Field2", "DoubleField96", "Int64Field3", "Int64Field4", "DoubleField97", "DoubleField65", "DoubleField66", "DoubleField7", "DoubleField62", "DoubleField118", "DoubleField119", "DoubleField67", "DoubleField120", "DoubleField121", "DoubleField122", "DoubleField123", "DoubleField124", "DoubleField8", "DoubleField9", "DoubleField98", "DoubleField10", "DoubleField11", "DoubleField99", "DoubleField84", "DoubleField14", "DoubleField77", "DoubleField15", "Int64Field19", "Int64Field115", "DoubleField116", "Int64Field117", "DoubleField20", "DoubleField21", "StringField73", "StringField74", "DoubleField22", "DoubleField69", "DoubleField70", "DoubleField71", "DoubleField72", "DoubleField25", "Int64Field26", "DoubleField68", "DoubleField28", "DoubleField106", "DoubleField29", "DoubleField30", "DoubleField101", "DoubleField102", "DoubleField103", "DoubleField104", "DoubleField105", "DoubleField31", "Int64Field32", "DoubleField75", "DoubleField129", "EnumField80", "EnumField81", "Int64Field82", "EnumField83", "Int64Field85", "Int64Field86", "Int64Field87", "Int64Field125", "Int64Field37", "DoubleField38", "Interactions", "RepeatedIntField100", "DoubleField40", "Int64Field41", "Int64Field126", "Int64Field127", "DoubleField128", "DoubleField109", "Int64Field110", "DoubleField111", "Int64Field112", "DoubleField113", "Int64Field114", "DoubleField42", "Int64Field43", "Int64Field44", "DoubleField45", "DoubleField46", "DoubleField78", "DoubleField88", "DoubleField47", "DoubleField89", "DoubleField48", "DoubleField49", "DoubleField50", "DoubleField90", "DoubleField51", "DoubleField91", "DoubleField92", "Int64Field107", "DoubleField93", "DoubleField108", "DoubleField52", "DoubleField53", "DoubleField94", "DoubleField54", "DoubleField55", "DoubleField56", "DoubleField57", "DoubleField58", "Int64Field59", "Int64Field60" }, null, null, null, null),
- new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Benchmarks.ManyPrimitiveFieldsMessage), global::Google.Protobuf.Benchmarks.ManyPrimitiveFieldsMessage.Parser, new[]{ "DoubleField95", "DoubleField1", "DoubleField79", "Int64Field2", "DoubleField96", "Int64Field3", "Int64Field4", "DoubleField97", "DoubleField65", "DoubleField66", "DoubleField7", "DoubleField62", "DoubleField118", "DoubleField119", "DoubleField67", "DoubleField120", "DoubleField121", "DoubleField122", "DoubleField123", "DoubleField124", "DoubleField8", "DoubleField9", "DoubleField98", "DoubleField10", "DoubleField11", "DoubleField99", "DoubleField84", "DoubleField14", "DoubleField77", "DoubleField15", "Int64Field19", "Int64Field115", "DoubleField116", "Int64Field117", "DoubleField20", "DoubleField21", "StringField73", "StringField74", "DoubleField22", "DoubleField69", "DoubleField70", "DoubleField71", "DoubleField72", "DoubleField25", "Int64Field26", "DoubleField68", "DoubleField28", "DoubleField106", "DoubleField29", "DoubleField30", "DoubleField101", "DoubleField102", "DoubleField103", "DoubleField104", "DoubleField105", "DoubleField31", "Int64Field32", "DoubleField75", "DoubleField129", "EnumField80", "EnumField81", "Int64Field82", "EnumField83", "Int64Field85", "Int64Field86", "Int64Field87", "Int64Field125", "Int64Field37", "DoubleField38", "Interactions", "RepeatedIntField100", "DoubleField40", "Int64Field41", "Int64Field126", "Int64Field127", "DoubleField128", "DoubleField109", "Int64Field110", "DoubleField111", "Int64Field112", "DoubleField113", "Int64Field114", "DoubleField42", "Int64Field43", "Int64Field44", "DoubleField45", "DoubleField46", "DoubleField78", "DoubleField88", "DoubleField47", "DoubleField89", "DoubleField48", "DoubleField49", "DoubleField50", "DoubleField90", "DoubleField51", "DoubleField91", "DoubleField92", "Int64Field107", "DoubleField93", "DoubleField108", "DoubleField52", "DoubleField53", "DoubleField94", "DoubleField54", "DoubleField55", "DoubleField56", "DoubleField57", "DoubleField58", "Int64Field59", "Int64Field60" }, null, null, null, null)
- }));
- }
- #endregion
-
- }
- #region Messages
- /// <summary>
- /// a message that has a large number of wrapper fields
- /// obfuscated version of an internal message
- /// </summary>
- public sealed partial class ManyWrapperFieldsMessage : pb::IMessage<ManyWrapperFieldsMessage>
- #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
- , pb::IBufferMessage
- #endif
- {
- private static readonly pb::MessageParser<ManyWrapperFieldsMessage> _parser = new pb::MessageParser<ManyWrapperFieldsMessage>(() => new ManyWrapperFieldsMessage());
- private pb::UnknownFieldSet _unknownFields;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public static pb::MessageParser<ManyWrapperFieldsMessage> Parser { get { return _parser; } }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public static pbr::MessageDescriptor Descriptor {
- get { return global::Google.Protobuf.Benchmarks.WrapperBenchmarkMessagesReflection.Descriptor.MessageTypes[0]; }
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- pbr::MessageDescriptor pb::IMessage.Descriptor {
- get { return Descriptor; }
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public ManyWrapperFieldsMessage() {
- OnConstruction();
- }
-
- partial void OnConstruction();
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public ManyWrapperFieldsMessage(ManyWrapperFieldsMessage other) : this() {
- DoubleField95 = other.DoubleField95;
- DoubleField1 = other.DoubleField1;
- DoubleField79 = other.DoubleField79;
- Int64Field2 = other.Int64Field2;
- DoubleField96 = other.DoubleField96;
- Int64Field3 = other.Int64Field3;
- Int64Field4 = other.Int64Field4;
- DoubleField97 = other.DoubleField97;
- DoubleField65 = other.DoubleField65;
- DoubleField66 = other.DoubleField66;
- DoubleField7 = other.DoubleField7;
- DoubleField62 = other.DoubleField62;
- DoubleField118 = other.DoubleField118;
- DoubleField119 = other.DoubleField119;
- DoubleField67 = other.DoubleField67;
- DoubleField120 = other.DoubleField120;
- DoubleField121 = other.DoubleField121;
- DoubleField122 = other.DoubleField122;
- DoubleField123 = other.DoubleField123;
- DoubleField124 = other.DoubleField124;
- DoubleField8 = other.DoubleField8;
- DoubleField9 = other.DoubleField9;
- DoubleField98 = other.DoubleField98;
- DoubleField10 = other.DoubleField10;
- DoubleField11 = other.DoubleField11;
- DoubleField99 = other.DoubleField99;
- DoubleField84 = other.DoubleField84;
- DoubleField14 = other.DoubleField14;
- DoubleField77 = other.DoubleField77;
- DoubleField15 = other.DoubleField15;
- Int64Field19 = other.Int64Field19;
- Int64Field115 = other.Int64Field115;
- DoubleField116 = other.DoubleField116;
- Int64Field117 = other.Int64Field117;
- DoubleField20 = other.DoubleField20;
- DoubleField21 = other.DoubleField21;
- StringField73 = other.StringField73;
- StringField74 = other.StringField74;
- DoubleField22 = other.DoubleField22;
- DoubleField69 = other.DoubleField69;
- DoubleField70 = other.DoubleField70;
- DoubleField71 = other.DoubleField71;
- DoubleField72 = other.DoubleField72;
- DoubleField25 = other.DoubleField25;
- Int64Field26 = other.Int64Field26;
- DoubleField68 = other.DoubleField68;
- DoubleField28 = other.DoubleField28;
- DoubleField106 = other.DoubleField106;
- DoubleField29 = other.DoubleField29;
- DoubleField30 = other.DoubleField30;
- DoubleField101 = other.DoubleField101;
- DoubleField102 = other.DoubleField102;
- DoubleField103 = other.DoubleField103;
- DoubleField104 = other.DoubleField104;
- DoubleField105 = other.DoubleField105;
- DoubleField31 = other.DoubleField31;
- Int64Field32 = other.Int64Field32;
- DoubleField75 = other.DoubleField75;
- DoubleField129 = other.DoubleField129;
- enumField80_ = other.enumField80_;
- enumField81_ = other.enumField81_;
- Int64Field82 = other.Int64Field82;
- enumField83_ = other.enumField83_;
- Int64Field85 = other.Int64Field85;
- Int64Field86 = other.Int64Field86;
- Int64Field87 = other.Int64Field87;
- Int64Field125 = other.Int64Field125;
- Int64Field37 = other.Int64Field37;
- DoubleField38 = other.DoubleField38;
- Interactions = other.Interactions;
- repeatedIntField100_ = other.repeatedIntField100_.Clone();
- DoubleField40 = other.DoubleField40;
- Int64Field41 = other.Int64Field41;
- Int64Field126 = other.Int64Field126;
- Int64Field127 = other.Int64Field127;
- DoubleField128 = other.DoubleField128;
- DoubleField109 = other.DoubleField109;
- Int64Field110 = other.Int64Field110;
- DoubleField111 = other.DoubleField111;
- Int64Field112 = other.Int64Field112;
- DoubleField113 = other.DoubleField113;
- Int64Field114 = other.Int64Field114;
- DoubleField42 = other.DoubleField42;
- Int64Field43 = other.Int64Field43;
- Int64Field44 = other.Int64Field44;
- DoubleField45 = other.DoubleField45;
- DoubleField46 = other.DoubleField46;
- DoubleField78 = other.DoubleField78;
- DoubleField88 = other.DoubleField88;
- DoubleField47 = other.DoubleField47;
- DoubleField89 = other.DoubleField89;
- DoubleField48 = other.DoubleField48;
- DoubleField49 = other.DoubleField49;
- DoubleField50 = other.DoubleField50;
- DoubleField90 = other.DoubleField90;
- DoubleField51 = other.DoubleField51;
- DoubleField91 = other.DoubleField91;
- DoubleField92 = other.DoubleField92;
- Int64Field107 = other.Int64Field107;
- DoubleField93 = other.DoubleField93;
- DoubleField108 = other.DoubleField108;
- DoubleField52 = other.DoubleField52;
- DoubleField53 = other.DoubleField53;
- DoubleField94 = other.DoubleField94;
- DoubleField54 = other.DoubleField54;
- DoubleField55 = other.DoubleField55;
- DoubleField56 = other.DoubleField56;
- DoubleField57 = other.DoubleField57;
- DoubleField58 = other.DoubleField58;
- Int64Field59 = other.Int64Field59;
- Int64Field60 = other.Int64Field60;
- _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public ManyWrapperFieldsMessage Clone() {
- return new ManyWrapperFieldsMessage(this);
- }
-
- /// <summary>Field number for the "double_field_95" field.</summary>
- public const int DoubleField95FieldNumber = 95;
- private static readonly pb::FieldCodec<double?> _single_doubleField95_codec = pb::FieldCodec.ForStructWrapper<double>(762);
- private double? doubleField95_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField95 {
- get { return doubleField95_; }
- set {
- doubleField95_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_1" field.</summary>
- public const int DoubleField1FieldNumber = 1;
- private static readonly pb::FieldCodec<double?> _single_doubleField1_codec = pb::FieldCodec.ForStructWrapper<double>(10);
- private double? doubleField1_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField1 {
- get { return doubleField1_; }
- set {
- doubleField1_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_79" field.</summary>
- public const int DoubleField79FieldNumber = 79;
- private static readonly pb::FieldCodec<double?> _single_doubleField79_codec = pb::FieldCodec.ForStructWrapper<double>(634);
- private double? doubleField79_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField79 {
- get { return doubleField79_; }
- set {
- doubleField79_ = value;
- }
- }
-
-
- /// <summary>Field number for the "int64_field_2" field.</summary>
- public const int Int64Field2FieldNumber = 2;
- private static readonly pb::FieldCodec<long?> _single_int64Field2_codec = pb::FieldCodec.ForStructWrapper<long>(18);
- private long? int64Field2_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long? Int64Field2 {
- get { return int64Field2_; }
- set {
- int64Field2_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_96" field.</summary>
- public const int DoubleField96FieldNumber = 96;
- private static readonly pb::FieldCodec<double?> _single_doubleField96_codec = pb::FieldCodec.ForStructWrapper<double>(770);
- private double? doubleField96_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField96 {
- get { return doubleField96_; }
- set {
- doubleField96_ = value;
- }
- }
-
-
- /// <summary>Field number for the "int64_field_3" field.</summary>
- public const int Int64Field3FieldNumber = 3;
- private static readonly pb::FieldCodec<long?> _single_int64Field3_codec = pb::FieldCodec.ForStructWrapper<long>(26);
- private long? int64Field3_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long? Int64Field3 {
- get { return int64Field3_; }
- set {
- int64Field3_ = value;
- }
- }
-
-
- /// <summary>Field number for the "int64_field_4" field.</summary>
- public const int Int64Field4FieldNumber = 4;
- private static readonly pb::FieldCodec<long?> _single_int64Field4_codec = pb::FieldCodec.ForStructWrapper<long>(34);
- private long? int64Field4_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long? Int64Field4 {
- get { return int64Field4_; }
- set {
- int64Field4_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_97" field.</summary>
- public const int DoubleField97FieldNumber = 97;
- private static readonly pb::FieldCodec<double?> _single_doubleField97_codec = pb::FieldCodec.ForStructWrapper<double>(778);
- private double? doubleField97_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField97 {
- get { return doubleField97_; }
- set {
- doubleField97_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_65" field.</summary>
- public const int DoubleField65FieldNumber = 65;
- private static readonly pb::FieldCodec<double?> _single_doubleField65_codec = pb::FieldCodec.ForStructWrapper<double>(522);
- private double? doubleField65_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField65 {
- get { return doubleField65_; }
- set {
- doubleField65_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_66" field.</summary>
- public const int DoubleField66FieldNumber = 66;
- private static readonly pb::FieldCodec<double?> _single_doubleField66_codec = pb::FieldCodec.ForStructWrapper<double>(530);
- private double? doubleField66_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField66 {
- get { return doubleField66_; }
- set {
- doubleField66_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_7" field.</summary>
- public const int DoubleField7FieldNumber = 7;
- private static readonly pb::FieldCodec<double?> _single_doubleField7_codec = pb::FieldCodec.ForStructWrapper<double>(58);
- private double? doubleField7_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField7 {
- get { return doubleField7_; }
- set {
- doubleField7_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_62" field.</summary>
- public const int DoubleField62FieldNumber = 62;
- private static readonly pb::FieldCodec<double?> _single_doubleField62_codec = pb::FieldCodec.ForStructWrapper<double>(498);
- private double? doubleField62_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField62 {
- get { return doubleField62_; }
- set {
- doubleField62_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_118" field.</summary>
- public const int DoubleField118FieldNumber = 118;
- private static readonly pb::FieldCodec<double?> _single_doubleField118_codec = pb::FieldCodec.ForStructWrapper<double>(946);
- private double? doubleField118_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField118 {
- get { return doubleField118_; }
- set {
- doubleField118_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_119" field.</summary>
- public const int DoubleField119FieldNumber = 119;
- private static readonly pb::FieldCodec<double?> _single_doubleField119_codec = pb::FieldCodec.ForStructWrapper<double>(954);
- private double? doubleField119_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField119 {
- get { return doubleField119_; }
- set {
- doubleField119_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_67" field.</summary>
- public const int DoubleField67FieldNumber = 67;
- private static readonly pb::FieldCodec<double?> _single_doubleField67_codec = pb::FieldCodec.ForStructWrapper<double>(538);
- private double? doubleField67_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField67 {
- get { return doubleField67_; }
- set {
- doubleField67_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_120" field.</summary>
- public const int DoubleField120FieldNumber = 120;
- private static readonly pb::FieldCodec<double?> _single_doubleField120_codec = pb::FieldCodec.ForStructWrapper<double>(962);
- private double? doubleField120_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField120 {
- get { return doubleField120_; }
- set {
- doubleField120_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_121" field.</summary>
- public const int DoubleField121FieldNumber = 121;
- private static readonly pb::FieldCodec<double?> _single_doubleField121_codec = pb::FieldCodec.ForStructWrapper<double>(970);
- private double? doubleField121_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField121 {
- get { return doubleField121_; }
- set {
- doubleField121_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_122" field.</summary>
- public const int DoubleField122FieldNumber = 122;
- private static readonly pb::FieldCodec<double?> _single_doubleField122_codec = pb::FieldCodec.ForStructWrapper<double>(978);
- private double? doubleField122_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField122 {
- get { return doubleField122_; }
- set {
- doubleField122_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_123" field.</summary>
- public const int DoubleField123FieldNumber = 123;
- private static readonly pb::FieldCodec<double?> _single_doubleField123_codec = pb::FieldCodec.ForStructWrapper<double>(986);
- private double? doubleField123_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField123 {
- get { return doubleField123_; }
- set {
- doubleField123_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_124" field.</summary>
- public const int DoubleField124FieldNumber = 124;
- private static readonly pb::FieldCodec<double?> _single_doubleField124_codec = pb::FieldCodec.ForStructWrapper<double>(994);
- private double? doubleField124_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField124 {
- get { return doubleField124_; }
- set {
- doubleField124_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_8" field.</summary>
- public const int DoubleField8FieldNumber = 8;
- private static readonly pb::FieldCodec<double?> _single_doubleField8_codec = pb::FieldCodec.ForStructWrapper<double>(66);
- private double? doubleField8_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField8 {
- get { return doubleField8_; }
- set {
- doubleField8_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_9" field.</summary>
- public const int DoubleField9FieldNumber = 9;
- private static readonly pb::FieldCodec<double?> _single_doubleField9_codec = pb::FieldCodec.ForStructWrapper<double>(74);
- private double? doubleField9_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField9 {
- get { return doubleField9_; }
- set {
- doubleField9_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_98" field.</summary>
- public const int DoubleField98FieldNumber = 98;
- private static readonly pb::FieldCodec<double?> _single_doubleField98_codec = pb::FieldCodec.ForStructWrapper<double>(786);
- private double? doubleField98_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField98 {
- get { return doubleField98_; }
- set {
- doubleField98_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_10" field.</summary>
- public const int DoubleField10FieldNumber = 10;
- private static readonly pb::FieldCodec<double?> _single_doubleField10_codec = pb::FieldCodec.ForStructWrapper<double>(82);
- private double? doubleField10_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField10 {
- get { return doubleField10_; }
- set {
- doubleField10_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_11" field.</summary>
- public const int DoubleField11FieldNumber = 11;
- private static readonly pb::FieldCodec<double?> _single_doubleField11_codec = pb::FieldCodec.ForStructWrapper<double>(90);
- private double? doubleField11_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField11 {
- get { return doubleField11_; }
- set {
- doubleField11_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_99" field.</summary>
- public const int DoubleField99FieldNumber = 99;
- private static readonly pb::FieldCodec<double?> _single_doubleField99_codec = pb::FieldCodec.ForStructWrapper<double>(794);
- private double? doubleField99_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField99 {
- get { return doubleField99_; }
- set {
- doubleField99_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_84" field.</summary>
- public const int DoubleField84FieldNumber = 84;
- private static readonly pb::FieldCodec<double?> _single_doubleField84_codec = pb::FieldCodec.ForStructWrapper<double>(674);
- private double? doubleField84_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField84 {
- get { return doubleField84_; }
- set {
- doubleField84_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_14" field.</summary>
- public const int DoubleField14FieldNumber = 14;
- private static readonly pb::FieldCodec<double?> _single_doubleField14_codec = pb::FieldCodec.ForStructWrapper<double>(114);
- private double? doubleField14_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField14 {
- get { return doubleField14_; }
- set {
- doubleField14_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_77" field.</summary>
- public const int DoubleField77FieldNumber = 77;
- private static readonly pb::FieldCodec<double?> _single_doubleField77_codec = pb::FieldCodec.ForStructWrapper<double>(618);
- private double? doubleField77_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField77 {
- get { return doubleField77_; }
- set {
- doubleField77_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_15" field.</summary>
- public const int DoubleField15FieldNumber = 15;
- private static readonly pb::FieldCodec<double?> _single_doubleField15_codec = pb::FieldCodec.ForStructWrapper<double>(122);
- private double? doubleField15_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField15 {
- get { return doubleField15_; }
- set {
- doubleField15_ = value;
- }
- }
-
-
- /// <summary>Field number for the "int64_field_19" field.</summary>
- public const int Int64Field19FieldNumber = 19;
- private static readonly pb::FieldCodec<long?> _single_int64Field19_codec = pb::FieldCodec.ForStructWrapper<long>(154);
- private long? int64Field19_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long? Int64Field19 {
- get { return int64Field19_; }
- set {
- int64Field19_ = value;
- }
- }
-
-
- /// <summary>Field number for the "int64_field_115" field.</summary>
- public const int Int64Field115FieldNumber = 115;
- private static readonly pb::FieldCodec<long?> _single_int64Field115_codec = pb::FieldCodec.ForStructWrapper<long>(922);
- private long? int64Field115_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long? Int64Field115 {
- get { return int64Field115_; }
- set {
- int64Field115_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_116" field.</summary>
- public const int DoubleField116FieldNumber = 116;
- private static readonly pb::FieldCodec<double?> _single_doubleField116_codec = pb::FieldCodec.ForStructWrapper<double>(930);
- private double? doubleField116_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField116 {
- get { return doubleField116_; }
- set {
- doubleField116_ = value;
- }
- }
-
-
- /// <summary>Field number for the "int64_field_117" field.</summary>
- public const int Int64Field117FieldNumber = 117;
- private static readonly pb::FieldCodec<long?> _single_int64Field117_codec = pb::FieldCodec.ForStructWrapper<long>(938);
- private long? int64Field117_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long? Int64Field117 {
- get { return int64Field117_; }
- set {
- int64Field117_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_20" field.</summary>
- public const int DoubleField20FieldNumber = 20;
- private static readonly pb::FieldCodec<double?> _single_doubleField20_codec = pb::FieldCodec.ForStructWrapper<double>(162);
- private double? doubleField20_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField20 {
- get { return doubleField20_; }
- set {
- doubleField20_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_21" field.</summary>
- public const int DoubleField21FieldNumber = 21;
- private static readonly pb::FieldCodec<double?> _single_doubleField21_codec = pb::FieldCodec.ForStructWrapper<double>(170);
- private double? doubleField21_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField21 {
- get { return doubleField21_; }
- set {
- doubleField21_ = value;
- }
- }
-
-
- /// <summary>Field number for the "string_field_73" field.</summary>
- public const int StringField73FieldNumber = 73;
- private static readonly pb::FieldCodec<string> _single_stringField73_codec = pb::FieldCodec.ForClassWrapper<string>(586);
- private string stringField73_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public string StringField73 {
- get { return stringField73_; }
- set {
- stringField73_ = value;
- }
- }
-
-
- /// <summary>Field number for the "string_field_74" field.</summary>
- public const int StringField74FieldNumber = 74;
- private static readonly pb::FieldCodec<string> _single_stringField74_codec = pb::FieldCodec.ForClassWrapper<string>(594);
- private string stringField74_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public string StringField74 {
- get { return stringField74_; }
- set {
- stringField74_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_22" field.</summary>
- public const int DoubleField22FieldNumber = 22;
- private static readonly pb::FieldCodec<double?> _single_doubleField22_codec = pb::FieldCodec.ForStructWrapper<double>(178);
- private double? doubleField22_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField22 {
- get { return doubleField22_; }
- set {
- doubleField22_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_69" field.</summary>
- public const int DoubleField69FieldNumber = 69;
- private static readonly pb::FieldCodec<double?> _single_doubleField69_codec = pb::FieldCodec.ForStructWrapper<double>(554);
- private double? doubleField69_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField69 {
- get { return doubleField69_; }
- set {
- doubleField69_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_70" field.</summary>
- public const int DoubleField70FieldNumber = 70;
- private static readonly pb::FieldCodec<double?> _single_doubleField70_codec = pb::FieldCodec.ForStructWrapper<double>(562);
- private double? doubleField70_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField70 {
- get { return doubleField70_; }
- set {
- doubleField70_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_71" field.</summary>
- public const int DoubleField71FieldNumber = 71;
- private static readonly pb::FieldCodec<double?> _single_doubleField71_codec = pb::FieldCodec.ForStructWrapper<double>(570);
- private double? doubleField71_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField71 {
- get { return doubleField71_; }
- set {
- doubleField71_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_72" field.</summary>
- public const int DoubleField72FieldNumber = 72;
- private static readonly pb::FieldCodec<double?> _single_doubleField72_codec = pb::FieldCodec.ForStructWrapper<double>(578);
- private double? doubleField72_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField72 {
- get { return doubleField72_; }
- set {
- doubleField72_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_25" field.</summary>
- public const int DoubleField25FieldNumber = 25;
- private static readonly pb::FieldCodec<double?> _single_doubleField25_codec = pb::FieldCodec.ForStructWrapper<double>(202);
- private double? doubleField25_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField25 {
- get { return doubleField25_; }
- set {
- doubleField25_ = value;
- }
- }
-
-
- /// <summary>Field number for the "int64_field_26" field.</summary>
- public const int Int64Field26FieldNumber = 26;
- private static readonly pb::FieldCodec<long?> _single_int64Field26_codec = pb::FieldCodec.ForStructWrapper<long>(210);
- private long? int64Field26_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long? Int64Field26 {
- get { return int64Field26_; }
- set {
- int64Field26_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_68" field.</summary>
- public const int DoubleField68FieldNumber = 68;
- private static readonly pb::FieldCodec<double?> _single_doubleField68_codec = pb::FieldCodec.ForStructWrapper<double>(546);
- private double? doubleField68_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField68 {
- get { return doubleField68_; }
- set {
- doubleField68_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_28" field.</summary>
- public const int DoubleField28FieldNumber = 28;
- private static readonly pb::FieldCodec<double?> _single_doubleField28_codec = pb::FieldCodec.ForStructWrapper<double>(226);
- private double? doubleField28_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField28 {
- get { return doubleField28_; }
- set {
- doubleField28_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_106" field.</summary>
- public const int DoubleField106FieldNumber = 106;
- private static readonly pb::FieldCodec<double?> _single_doubleField106_codec = pb::FieldCodec.ForStructWrapper<double>(850);
- private double? doubleField106_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField106 {
- get { return doubleField106_; }
- set {
- doubleField106_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_29" field.</summary>
- public const int DoubleField29FieldNumber = 29;
- private static readonly pb::FieldCodec<double?> _single_doubleField29_codec = pb::FieldCodec.ForStructWrapper<double>(234);
- private double? doubleField29_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField29 {
- get { return doubleField29_; }
- set {
- doubleField29_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_30" field.</summary>
- public const int DoubleField30FieldNumber = 30;
- private static readonly pb::FieldCodec<double?> _single_doubleField30_codec = pb::FieldCodec.ForStructWrapper<double>(242);
- private double? doubleField30_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField30 {
- get { return doubleField30_; }
- set {
- doubleField30_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_101" field.</summary>
- public const int DoubleField101FieldNumber = 101;
- private static readonly pb::FieldCodec<double?> _single_doubleField101_codec = pb::FieldCodec.ForStructWrapper<double>(810);
- private double? doubleField101_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField101 {
- get { return doubleField101_; }
- set {
- doubleField101_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_102" field.</summary>
- public const int DoubleField102FieldNumber = 102;
- private static readonly pb::FieldCodec<double?> _single_doubleField102_codec = pb::FieldCodec.ForStructWrapper<double>(818);
- private double? doubleField102_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField102 {
- get { return doubleField102_; }
- set {
- doubleField102_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_103" field.</summary>
- public const int DoubleField103FieldNumber = 103;
- private static readonly pb::FieldCodec<double?> _single_doubleField103_codec = pb::FieldCodec.ForStructWrapper<double>(826);
- private double? doubleField103_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField103 {
- get { return doubleField103_; }
- set {
- doubleField103_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_104" field.</summary>
- public const int DoubleField104FieldNumber = 104;
- private static readonly pb::FieldCodec<double?> _single_doubleField104_codec = pb::FieldCodec.ForStructWrapper<double>(834);
- private double? doubleField104_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField104 {
- get { return doubleField104_; }
- set {
- doubleField104_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_105" field.</summary>
- public const int DoubleField105FieldNumber = 105;
- private static readonly pb::FieldCodec<double?> _single_doubleField105_codec = pb::FieldCodec.ForStructWrapper<double>(842);
- private double? doubleField105_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField105 {
- get { return doubleField105_; }
- set {
- doubleField105_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_31" field.</summary>
- public const int DoubleField31FieldNumber = 31;
- private static readonly pb::FieldCodec<double?> _single_doubleField31_codec = pb::FieldCodec.ForStructWrapper<double>(250);
- private double? doubleField31_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField31 {
- get { return doubleField31_; }
- set {
- doubleField31_ = value;
- }
- }
-
-
- /// <summary>Field number for the "int64_field_32" field.</summary>
- public const int Int64Field32FieldNumber = 32;
- private static readonly pb::FieldCodec<long?> _single_int64Field32_codec = pb::FieldCodec.ForStructWrapper<long>(258);
- private long? int64Field32_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long? Int64Field32 {
- get { return int64Field32_; }
- set {
- int64Field32_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_75" field.</summary>
- public const int DoubleField75FieldNumber = 75;
- private static readonly pb::FieldCodec<double?> _single_doubleField75_codec = pb::FieldCodec.ForStructWrapper<double>(602);
- private double? doubleField75_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField75 {
- get { return doubleField75_; }
- set {
- doubleField75_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_129" field.</summary>
- public const int DoubleField129FieldNumber = 129;
- private static readonly pb::FieldCodec<double?> _single_doubleField129_codec = pb::FieldCodec.ForStructWrapper<double>(1034);
- private double? doubleField129_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField129 {
- get { return doubleField129_; }
- set {
- doubleField129_ = value;
- }
- }
-
-
- /// <summary>Field number for the "enum_field_80" field.</summary>
- public const int EnumField80FieldNumber = 80;
- private int enumField80_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public int EnumField80 {
- get { return enumField80_; }
- set {
- enumField80_ = value;
- }
- }
-
- /// <summary>Field number for the "enum_field_81" field.</summary>
- public const int EnumField81FieldNumber = 81;
- private int enumField81_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public int EnumField81 {
- get { return enumField81_; }
- set {
- enumField81_ = value;
- }
- }
-
- /// <summary>Field number for the "int64_field_82" field.</summary>
- public const int Int64Field82FieldNumber = 82;
- private static readonly pb::FieldCodec<long?> _single_int64Field82_codec = pb::FieldCodec.ForStructWrapper<long>(658);
- private long? int64Field82_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long? Int64Field82 {
- get { return int64Field82_; }
- set {
- int64Field82_ = value;
- }
- }
-
-
- /// <summary>Field number for the "enum_field_83" field.</summary>
- public const int EnumField83FieldNumber = 83;
- private int enumField83_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public int EnumField83 {
- get { return enumField83_; }
- set {
- enumField83_ = value;
- }
- }
-
- /// <summary>Field number for the "int64_field_85" field.</summary>
- public const int Int64Field85FieldNumber = 85;
- private static readonly pb::FieldCodec<long?> _single_int64Field85_codec = pb::FieldCodec.ForStructWrapper<long>(682);
- private long? int64Field85_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long? Int64Field85 {
- get { return int64Field85_; }
- set {
- int64Field85_ = value;
- }
- }
-
-
- /// <summary>Field number for the "int64_field_86" field.</summary>
- public const int Int64Field86FieldNumber = 86;
- private static readonly pb::FieldCodec<long?> _single_int64Field86_codec = pb::FieldCodec.ForStructWrapper<long>(690);
- private long? int64Field86_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long? Int64Field86 {
- get { return int64Field86_; }
- set {
- int64Field86_ = value;
- }
- }
-
-
- /// <summary>Field number for the "int64_field_87" field.</summary>
- public const int Int64Field87FieldNumber = 87;
- private static readonly pb::FieldCodec<long?> _single_int64Field87_codec = pb::FieldCodec.ForStructWrapper<long>(698);
- private long? int64Field87_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long? Int64Field87 {
- get { return int64Field87_; }
- set {
- int64Field87_ = value;
- }
- }
-
-
- /// <summary>Field number for the "int64_field_125" field.</summary>
- public const int Int64Field125FieldNumber = 125;
- private static readonly pb::FieldCodec<long?> _single_int64Field125_codec = pb::FieldCodec.ForStructWrapper<long>(1002);
- private long? int64Field125_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long? Int64Field125 {
- get { return int64Field125_; }
- set {
- int64Field125_ = value;
- }
- }
-
-
- /// <summary>Field number for the "int64_field_37" field.</summary>
- public const int Int64Field37FieldNumber = 37;
- private static readonly pb::FieldCodec<long?> _single_int64Field37_codec = pb::FieldCodec.ForStructWrapper<long>(298);
- private long? int64Field37_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long? Int64Field37 {
- get { return int64Field37_; }
- set {
- int64Field37_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_38" field.</summary>
- public const int DoubleField38FieldNumber = 38;
- private static readonly pb::FieldCodec<double?> _single_doubleField38_codec = pb::FieldCodec.ForStructWrapper<double>(306);
- private double? doubleField38_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField38 {
- get { return doubleField38_; }
- set {
- doubleField38_ = value;
- }
- }
-
-
- /// <summary>Field number for the "interactions" field.</summary>
- public const int InteractionsFieldNumber = 39;
- private static readonly pb::FieldCodec<long?> _single_interactions_codec = pb::FieldCodec.ForStructWrapper<long>(314);
- private long? interactions_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long? Interactions {
- get { return interactions_; }
- set {
- interactions_ = value;
- }
- }
-
-
- /// <summary>Field number for the "repeated_int_field_100" field.</summary>
- public const int RepeatedIntField100FieldNumber = 100;
- private static readonly pb::FieldCodec<int> _repeated_repeatedIntField100_codec
- = pb::FieldCodec.ForInt32(802);
- private readonly pbc::RepeatedField<int> repeatedIntField100_ = new pbc::RepeatedField<int>();
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public pbc::RepeatedField<int> RepeatedIntField100 {
- get { return repeatedIntField100_; }
- }
-
- /// <summary>Field number for the "double_field_40" field.</summary>
- public const int DoubleField40FieldNumber = 40;
- private static readonly pb::FieldCodec<double?> _single_doubleField40_codec = pb::FieldCodec.ForStructWrapper<double>(322);
- private double? doubleField40_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField40 {
- get { return doubleField40_; }
- set {
- doubleField40_ = value;
- }
- }
-
-
- /// <summary>Field number for the "int64_field_41" field.</summary>
- public const int Int64Field41FieldNumber = 41;
- private static readonly pb::FieldCodec<long?> _single_int64Field41_codec = pb::FieldCodec.ForStructWrapper<long>(330);
- private long? int64Field41_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long? Int64Field41 {
- get { return int64Field41_; }
- set {
- int64Field41_ = value;
- }
- }
-
-
- /// <summary>Field number for the "int64_field_126" field.</summary>
- public const int Int64Field126FieldNumber = 126;
- private static readonly pb::FieldCodec<long?> _single_int64Field126_codec = pb::FieldCodec.ForStructWrapper<long>(1010);
- private long? int64Field126_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long? Int64Field126 {
- get { return int64Field126_; }
- set {
- int64Field126_ = value;
- }
- }
-
-
- /// <summary>Field number for the "int64_field_127" field.</summary>
- public const int Int64Field127FieldNumber = 127;
- private static readonly pb::FieldCodec<long?> _single_int64Field127_codec = pb::FieldCodec.ForStructWrapper<long>(1018);
- private long? int64Field127_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long? Int64Field127 {
- get { return int64Field127_; }
- set {
- int64Field127_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_128" field.</summary>
- public const int DoubleField128FieldNumber = 128;
- private static readonly pb::FieldCodec<double?> _single_doubleField128_codec = pb::FieldCodec.ForStructWrapper<double>(1026);
- private double? doubleField128_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField128 {
- get { return doubleField128_; }
- set {
- doubleField128_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_109" field.</summary>
- public const int DoubleField109FieldNumber = 109;
- private static readonly pb::FieldCodec<double?> _single_doubleField109_codec = pb::FieldCodec.ForStructWrapper<double>(874);
- private double? doubleField109_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField109 {
- get { return doubleField109_; }
- set {
- doubleField109_ = value;
- }
- }
-
-
- /// <summary>Field number for the "int64_field_110" field.</summary>
- public const int Int64Field110FieldNumber = 110;
- private static readonly pb::FieldCodec<long?> _single_int64Field110_codec = pb::FieldCodec.ForStructWrapper<long>(882);
- private long? int64Field110_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long? Int64Field110 {
- get { return int64Field110_; }
- set {
- int64Field110_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_111" field.</summary>
- public const int DoubleField111FieldNumber = 111;
- private static readonly pb::FieldCodec<double?> _single_doubleField111_codec = pb::FieldCodec.ForStructWrapper<double>(890);
- private double? doubleField111_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField111 {
- get { return doubleField111_; }
- set {
- doubleField111_ = value;
- }
- }
-
-
- /// <summary>Field number for the "int64_field_112" field.</summary>
- public const int Int64Field112FieldNumber = 112;
- private static readonly pb::FieldCodec<long?> _single_int64Field112_codec = pb::FieldCodec.ForStructWrapper<long>(898);
- private long? int64Field112_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long? Int64Field112 {
- get { return int64Field112_; }
- set {
- int64Field112_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_113" field.</summary>
- public const int DoubleField113FieldNumber = 113;
- private static readonly pb::FieldCodec<double?> _single_doubleField113_codec = pb::FieldCodec.ForStructWrapper<double>(906);
- private double? doubleField113_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField113 {
- get { return doubleField113_; }
- set {
- doubleField113_ = value;
- }
- }
-
-
- /// <summary>Field number for the "int64_field_114" field.</summary>
- public const int Int64Field114FieldNumber = 114;
- private static readonly pb::FieldCodec<long?> _single_int64Field114_codec = pb::FieldCodec.ForStructWrapper<long>(914);
- private long? int64Field114_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long? Int64Field114 {
- get { return int64Field114_; }
- set {
- int64Field114_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_42" field.</summary>
- public const int DoubleField42FieldNumber = 42;
- private static readonly pb::FieldCodec<double?> _single_doubleField42_codec = pb::FieldCodec.ForStructWrapper<double>(338);
- private double? doubleField42_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField42 {
- get { return doubleField42_; }
- set {
- doubleField42_ = value;
- }
- }
-
-
- /// <summary>Field number for the "int64_field_43" field.</summary>
- public const int Int64Field43FieldNumber = 43;
- private static readonly pb::FieldCodec<long?> _single_int64Field43_codec = pb::FieldCodec.ForStructWrapper<long>(346);
- private long? int64Field43_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long? Int64Field43 {
- get { return int64Field43_; }
- set {
- int64Field43_ = value;
- }
- }
-
-
- /// <summary>Field number for the "int64_field_44" field.</summary>
- public const int Int64Field44FieldNumber = 44;
- private static readonly pb::FieldCodec<long?> _single_int64Field44_codec = pb::FieldCodec.ForStructWrapper<long>(354);
- private long? int64Field44_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long? Int64Field44 {
- get { return int64Field44_; }
- set {
- int64Field44_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_45" field.</summary>
- public const int DoubleField45FieldNumber = 45;
- private static readonly pb::FieldCodec<double?> _single_doubleField45_codec = pb::FieldCodec.ForStructWrapper<double>(362);
- private double? doubleField45_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField45 {
- get { return doubleField45_; }
- set {
- doubleField45_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_46" field.</summary>
- public const int DoubleField46FieldNumber = 46;
- private static readonly pb::FieldCodec<double?> _single_doubleField46_codec = pb::FieldCodec.ForStructWrapper<double>(370);
- private double? doubleField46_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField46 {
- get { return doubleField46_; }
- set {
- doubleField46_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_78" field.</summary>
- public const int DoubleField78FieldNumber = 78;
- private static readonly pb::FieldCodec<double?> _single_doubleField78_codec = pb::FieldCodec.ForStructWrapper<double>(626);
- private double? doubleField78_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField78 {
- get { return doubleField78_; }
- set {
- doubleField78_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_88" field.</summary>
- public const int DoubleField88FieldNumber = 88;
- private static readonly pb::FieldCodec<double?> _single_doubleField88_codec = pb::FieldCodec.ForStructWrapper<double>(706);
- private double? doubleField88_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField88 {
- get { return doubleField88_; }
- set {
- doubleField88_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_47" field.</summary>
- public const int DoubleField47FieldNumber = 47;
- private static readonly pb::FieldCodec<double?> _single_doubleField47_codec = pb::FieldCodec.ForStructWrapper<double>(378);
- private double? doubleField47_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField47 {
- get { return doubleField47_; }
- set {
- doubleField47_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_89" field.</summary>
- public const int DoubleField89FieldNumber = 89;
- private static readonly pb::FieldCodec<double?> _single_doubleField89_codec = pb::FieldCodec.ForStructWrapper<double>(714);
- private double? doubleField89_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField89 {
- get { return doubleField89_; }
- set {
- doubleField89_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_48" field.</summary>
- public const int DoubleField48FieldNumber = 48;
- private static readonly pb::FieldCodec<double?> _single_doubleField48_codec = pb::FieldCodec.ForStructWrapper<double>(386);
- private double? doubleField48_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField48 {
- get { return doubleField48_; }
- set {
- doubleField48_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_49" field.</summary>
- public const int DoubleField49FieldNumber = 49;
- private static readonly pb::FieldCodec<double?> _single_doubleField49_codec = pb::FieldCodec.ForStructWrapper<double>(394);
- private double? doubleField49_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField49 {
- get { return doubleField49_; }
- set {
- doubleField49_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_50" field.</summary>
- public const int DoubleField50FieldNumber = 50;
- private static readonly pb::FieldCodec<double?> _single_doubleField50_codec = pb::FieldCodec.ForStructWrapper<double>(402);
- private double? doubleField50_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField50 {
- get { return doubleField50_; }
- set {
- doubleField50_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_90" field.</summary>
- public const int DoubleField90FieldNumber = 90;
- private static readonly pb::FieldCodec<double?> _single_doubleField90_codec = pb::FieldCodec.ForStructWrapper<double>(722);
- private double? doubleField90_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField90 {
- get { return doubleField90_; }
- set {
- doubleField90_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_51" field.</summary>
- public const int DoubleField51FieldNumber = 51;
- private static readonly pb::FieldCodec<double?> _single_doubleField51_codec = pb::FieldCodec.ForStructWrapper<double>(410);
- private double? doubleField51_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField51 {
- get { return doubleField51_; }
- set {
- doubleField51_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_91" field.</summary>
- public const int DoubleField91FieldNumber = 91;
- private static readonly pb::FieldCodec<double?> _single_doubleField91_codec = pb::FieldCodec.ForStructWrapper<double>(730);
- private double? doubleField91_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField91 {
- get { return doubleField91_; }
- set {
- doubleField91_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_92" field.</summary>
- public const int DoubleField92FieldNumber = 92;
- private static readonly pb::FieldCodec<double?> _single_doubleField92_codec = pb::FieldCodec.ForStructWrapper<double>(738);
- private double? doubleField92_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField92 {
- get { return doubleField92_; }
- set {
- doubleField92_ = value;
- }
- }
-
-
- /// <summary>Field number for the "int64_field_107" field.</summary>
- public const int Int64Field107FieldNumber = 107;
- private static readonly pb::FieldCodec<long?> _single_int64Field107_codec = pb::FieldCodec.ForStructWrapper<long>(858);
- private long? int64Field107_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long? Int64Field107 {
- get { return int64Field107_; }
- set {
- int64Field107_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_93" field.</summary>
- public const int DoubleField93FieldNumber = 93;
- private static readonly pb::FieldCodec<double?> _single_doubleField93_codec = pb::FieldCodec.ForStructWrapper<double>(746);
- private double? doubleField93_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField93 {
- get { return doubleField93_; }
- set {
- doubleField93_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_108" field.</summary>
- public const int DoubleField108FieldNumber = 108;
- private static readonly pb::FieldCodec<double?> _single_doubleField108_codec = pb::FieldCodec.ForStructWrapper<double>(866);
- private double? doubleField108_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField108 {
- get { return doubleField108_; }
- set {
- doubleField108_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_52" field.</summary>
- public const int DoubleField52FieldNumber = 52;
- private static readonly pb::FieldCodec<double?> _single_doubleField52_codec = pb::FieldCodec.ForStructWrapper<double>(418);
- private double? doubleField52_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField52 {
- get { return doubleField52_; }
- set {
- doubleField52_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_53" field.</summary>
- public const int DoubleField53FieldNumber = 53;
- private static readonly pb::FieldCodec<double?> _single_doubleField53_codec = pb::FieldCodec.ForStructWrapper<double>(426);
- private double? doubleField53_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField53 {
- get { return doubleField53_; }
- set {
- doubleField53_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_94" field.</summary>
- public const int DoubleField94FieldNumber = 94;
- private static readonly pb::FieldCodec<double?> _single_doubleField94_codec = pb::FieldCodec.ForStructWrapper<double>(754);
- private double? doubleField94_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField94 {
- get { return doubleField94_; }
- set {
- doubleField94_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_54" field.</summary>
- public const int DoubleField54FieldNumber = 54;
- private static readonly pb::FieldCodec<double?> _single_doubleField54_codec = pb::FieldCodec.ForStructWrapper<double>(434);
- private double? doubleField54_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField54 {
- get { return doubleField54_; }
- set {
- doubleField54_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_55" field.</summary>
- public const int DoubleField55FieldNumber = 55;
- private static readonly pb::FieldCodec<double?> _single_doubleField55_codec = pb::FieldCodec.ForStructWrapper<double>(442);
- private double? doubleField55_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField55 {
- get { return doubleField55_; }
- set {
- doubleField55_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_56" field.</summary>
- public const int DoubleField56FieldNumber = 56;
- private static readonly pb::FieldCodec<double?> _single_doubleField56_codec = pb::FieldCodec.ForStructWrapper<double>(450);
- private double? doubleField56_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField56 {
- get { return doubleField56_; }
- set {
- doubleField56_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_57" field.</summary>
- public const int DoubleField57FieldNumber = 57;
- private static readonly pb::FieldCodec<double?> _single_doubleField57_codec = pb::FieldCodec.ForStructWrapper<double>(458);
- private double? doubleField57_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField57 {
- get { return doubleField57_; }
- set {
- doubleField57_ = value;
- }
- }
-
-
- /// <summary>Field number for the "double_field_58" field.</summary>
- public const int DoubleField58FieldNumber = 58;
- private static readonly pb::FieldCodec<double?> _single_doubleField58_codec = pb::FieldCodec.ForStructWrapper<double>(466);
- private double? doubleField58_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double? DoubleField58 {
- get { return doubleField58_; }
- set {
- doubleField58_ = value;
- }
- }
-
-
- /// <summary>Field number for the "int64_field_59" field.</summary>
- public const int Int64Field59FieldNumber = 59;
- private static readonly pb::FieldCodec<long?> _single_int64Field59_codec = pb::FieldCodec.ForStructWrapper<long>(474);
- private long? int64Field59_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long? Int64Field59 {
- get { return int64Field59_; }
- set {
- int64Field59_ = value;
- }
- }
-
-
- /// <summary>Field number for the "int64_field_60" field.</summary>
- public const int Int64Field60FieldNumber = 60;
- private static readonly pb::FieldCodec<long?> _single_int64Field60_codec = pb::FieldCodec.ForStructWrapper<long>(482);
- private long? int64Field60_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long? Int64Field60 {
- get { return int64Field60_; }
- set {
- int64Field60_ = value;
- }
- }
-
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public override bool Equals(object other) {
- return Equals(other as ManyWrapperFieldsMessage);
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public bool Equals(ManyWrapperFieldsMessage other) {
- if (ReferenceEquals(other, null)) {
- return false;
- }
- if (ReferenceEquals(other, this)) {
- return true;
- }
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField95, other.DoubleField95)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField1, other.DoubleField1)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField79, other.DoubleField79)) return false;
- if (Int64Field2 != other.Int64Field2) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField96, other.DoubleField96)) return false;
- if (Int64Field3 != other.Int64Field3) return false;
- if (Int64Field4 != other.Int64Field4) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField97, other.DoubleField97)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField65, other.DoubleField65)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField66, other.DoubleField66)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField7, other.DoubleField7)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField62, other.DoubleField62)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField118, other.DoubleField118)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField119, other.DoubleField119)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField67, other.DoubleField67)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField120, other.DoubleField120)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField121, other.DoubleField121)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField122, other.DoubleField122)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField123, other.DoubleField123)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField124, other.DoubleField124)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField8, other.DoubleField8)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField9, other.DoubleField9)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField98, other.DoubleField98)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField10, other.DoubleField10)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField11, other.DoubleField11)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField99, other.DoubleField99)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField84, other.DoubleField84)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField14, other.DoubleField14)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField77, other.DoubleField77)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField15, other.DoubleField15)) return false;
- if (Int64Field19 != other.Int64Field19) return false;
- if (Int64Field115 != other.Int64Field115) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField116, other.DoubleField116)) return false;
- if (Int64Field117 != other.Int64Field117) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField20, other.DoubleField20)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField21, other.DoubleField21)) return false;
- if (StringField73 != other.StringField73) return false;
- if (StringField74 != other.StringField74) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField22, other.DoubleField22)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField69, other.DoubleField69)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField70, other.DoubleField70)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField71, other.DoubleField71)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField72, other.DoubleField72)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField25, other.DoubleField25)) return false;
- if (Int64Field26 != other.Int64Field26) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField68, other.DoubleField68)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField28, other.DoubleField28)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField106, other.DoubleField106)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField29, other.DoubleField29)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField30, other.DoubleField30)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField101, other.DoubleField101)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField102, other.DoubleField102)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField103, other.DoubleField103)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField104, other.DoubleField104)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField105, other.DoubleField105)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField31, other.DoubleField31)) return false;
- if (Int64Field32 != other.Int64Field32) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField75, other.DoubleField75)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField129, other.DoubleField129)) return false;
- if (EnumField80 != other.EnumField80) return false;
- if (EnumField81 != other.EnumField81) return false;
- if (Int64Field82 != other.Int64Field82) return false;
- if (EnumField83 != other.EnumField83) return false;
- if (Int64Field85 != other.Int64Field85) return false;
- if (Int64Field86 != other.Int64Field86) return false;
- if (Int64Field87 != other.Int64Field87) return false;
- if (Int64Field125 != other.Int64Field125) return false;
- if (Int64Field37 != other.Int64Field37) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField38, other.DoubleField38)) return false;
- if (Interactions != other.Interactions) return false;
- if(!repeatedIntField100_.Equals(other.repeatedIntField100_)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField40, other.DoubleField40)) return false;
- if (Int64Field41 != other.Int64Field41) return false;
- if (Int64Field126 != other.Int64Field126) return false;
- if (Int64Field127 != other.Int64Field127) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField128, other.DoubleField128)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField109, other.DoubleField109)) return false;
- if (Int64Field110 != other.Int64Field110) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField111, other.DoubleField111)) return false;
- if (Int64Field112 != other.Int64Field112) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField113, other.DoubleField113)) return false;
- if (Int64Field114 != other.Int64Field114) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField42, other.DoubleField42)) return false;
- if (Int64Field43 != other.Int64Field43) return false;
- if (Int64Field44 != other.Int64Field44) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField45, other.DoubleField45)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField46, other.DoubleField46)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField78, other.DoubleField78)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField88, other.DoubleField88)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField47, other.DoubleField47)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField89, other.DoubleField89)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField48, other.DoubleField48)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField49, other.DoubleField49)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField50, other.DoubleField50)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField90, other.DoubleField90)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField51, other.DoubleField51)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField91, other.DoubleField91)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField92, other.DoubleField92)) return false;
- if (Int64Field107 != other.Int64Field107) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField93, other.DoubleField93)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField108, other.DoubleField108)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField52, other.DoubleField52)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField53, other.DoubleField53)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField94, other.DoubleField94)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField54, other.DoubleField54)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField55, other.DoubleField55)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField56, other.DoubleField56)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField57, other.DoubleField57)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals(DoubleField58, other.DoubleField58)) return false;
- if (Int64Field59 != other.Int64Field59) return false;
- if (Int64Field60 != other.Int64Field60) return false;
- return Equals(_unknownFields, other._unknownFields);
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public override int GetHashCode() {
- int hash = 1;
- if (doubleField95_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField95);
- if (doubleField1_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField1);
- if (doubleField79_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField79);
- if (int64Field2_ != null) hash ^= Int64Field2.GetHashCode();
- if (doubleField96_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField96);
- if (int64Field3_ != null) hash ^= Int64Field3.GetHashCode();
- if (int64Field4_ != null) hash ^= Int64Field4.GetHashCode();
- if (doubleField97_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField97);
- if (doubleField65_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField65);
- if (doubleField66_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField66);
- if (doubleField7_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField7);
- if (doubleField62_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField62);
- if (doubleField118_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField118);
- if (doubleField119_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField119);
- if (doubleField67_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField67);
- if (doubleField120_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField120);
- if (doubleField121_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField121);
- if (doubleField122_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField122);
- if (doubleField123_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField123);
- if (doubleField124_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField124);
- if (doubleField8_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField8);
- if (doubleField9_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField9);
- if (doubleField98_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField98);
- if (doubleField10_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField10);
- if (doubleField11_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField11);
- if (doubleField99_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField99);
- if (doubleField84_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField84);
- if (doubleField14_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField14);
- if (doubleField77_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField77);
- if (doubleField15_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField15);
- if (int64Field19_ != null) hash ^= Int64Field19.GetHashCode();
- if (int64Field115_ != null) hash ^= Int64Field115.GetHashCode();
- if (doubleField116_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField116);
- if (int64Field117_ != null) hash ^= Int64Field117.GetHashCode();
- if (doubleField20_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField20);
- if (doubleField21_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField21);
- if (stringField73_ != null) hash ^= StringField73.GetHashCode();
- if (stringField74_ != null) hash ^= StringField74.GetHashCode();
- if (doubleField22_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField22);
- if (doubleField69_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField69);
- if (doubleField70_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField70);
- if (doubleField71_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField71);
- if (doubleField72_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField72);
- if (doubleField25_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField25);
- if (int64Field26_ != null) hash ^= Int64Field26.GetHashCode();
- if (doubleField68_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField68);
- if (doubleField28_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField28);
- if (doubleField106_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField106);
- if (doubleField29_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField29);
- if (doubleField30_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField30);
- if (doubleField101_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField101);
- if (doubleField102_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField102);
- if (doubleField103_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField103);
- if (doubleField104_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField104);
- if (doubleField105_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField105);
- if (doubleField31_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField31);
- if (int64Field32_ != null) hash ^= Int64Field32.GetHashCode();
- if (doubleField75_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField75);
- if (doubleField129_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField129);
- if (EnumField80 != 0) hash ^= EnumField80.GetHashCode();
- if (EnumField81 != 0) hash ^= EnumField81.GetHashCode();
- if (int64Field82_ != null) hash ^= Int64Field82.GetHashCode();
- if (EnumField83 != 0) hash ^= EnumField83.GetHashCode();
- if (int64Field85_ != null) hash ^= Int64Field85.GetHashCode();
- if (int64Field86_ != null) hash ^= Int64Field86.GetHashCode();
- if (int64Field87_ != null) hash ^= Int64Field87.GetHashCode();
- if (int64Field125_ != null) hash ^= Int64Field125.GetHashCode();
- if (int64Field37_ != null) hash ^= Int64Field37.GetHashCode();
- if (doubleField38_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField38);
- if (interactions_ != null) hash ^= Interactions.GetHashCode();
- hash ^= repeatedIntField100_.GetHashCode();
- if (doubleField40_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField40);
- if (int64Field41_ != null) hash ^= Int64Field41.GetHashCode();
- if (int64Field126_ != null) hash ^= Int64Field126.GetHashCode();
- if (int64Field127_ != null) hash ^= Int64Field127.GetHashCode();
- if (doubleField128_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField128);
- if (doubleField109_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField109);
- if (int64Field110_ != null) hash ^= Int64Field110.GetHashCode();
- if (doubleField111_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField111);
- if (int64Field112_ != null) hash ^= Int64Field112.GetHashCode();
- if (doubleField113_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField113);
- if (int64Field114_ != null) hash ^= Int64Field114.GetHashCode();
- if (doubleField42_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField42);
- if (int64Field43_ != null) hash ^= Int64Field43.GetHashCode();
- if (int64Field44_ != null) hash ^= Int64Field44.GetHashCode();
- if (doubleField45_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField45);
- if (doubleField46_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField46);
- if (doubleField78_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField78);
- if (doubleField88_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField88);
- if (doubleField47_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField47);
- if (doubleField89_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField89);
- if (doubleField48_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField48);
- if (doubleField49_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField49);
- if (doubleField50_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField50);
- if (doubleField90_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField90);
- if (doubleField51_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField51);
- if (doubleField91_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField91);
- if (doubleField92_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField92);
- if (int64Field107_ != null) hash ^= Int64Field107.GetHashCode();
- if (doubleField93_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField93);
- if (doubleField108_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField108);
- if (doubleField52_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField52);
- if (doubleField53_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField53);
- if (doubleField94_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField94);
- if (doubleField54_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField54);
- if (doubleField55_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField55);
- if (doubleField56_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField56);
- if (doubleField57_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField57);
- if (doubleField58_ != null) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode(DoubleField58);
- if (int64Field59_ != null) hash ^= Int64Field59.GetHashCode();
- if (int64Field60_ != null) hash ^= Int64Field60.GetHashCode();
- if (_unknownFields != null) {
- hash ^= _unknownFields.GetHashCode();
- }
- return hash;
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public override string ToString() {
- return pb::JsonFormatter.ToDiagnosticString(this);
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public void WriteTo(pb::CodedOutputStream output) {
- #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
- output.WriteRawMessage(this);
- #else
- if (doubleField1_ != null) {
- _single_doubleField1_codec.WriteTagAndValue(output, DoubleField1);
- }
- if (int64Field2_ != null) {
- _single_int64Field2_codec.WriteTagAndValue(output, Int64Field2);
- }
- if (int64Field3_ != null) {
- _single_int64Field3_codec.WriteTagAndValue(output, Int64Field3);
- }
- if (int64Field4_ != null) {
- _single_int64Field4_codec.WriteTagAndValue(output, Int64Field4);
- }
- if (doubleField7_ != null) {
- _single_doubleField7_codec.WriteTagAndValue(output, DoubleField7);
- }
- if (doubleField8_ != null) {
- _single_doubleField8_codec.WriteTagAndValue(output, DoubleField8);
- }
- if (doubleField9_ != null) {
- _single_doubleField9_codec.WriteTagAndValue(output, DoubleField9);
- }
- if (doubleField10_ != null) {
- _single_doubleField10_codec.WriteTagAndValue(output, DoubleField10);
- }
- if (doubleField11_ != null) {
- _single_doubleField11_codec.WriteTagAndValue(output, DoubleField11);
- }
- if (doubleField14_ != null) {
- _single_doubleField14_codec.WriteTagAndValue(output, DoubleField14);
- }
- if (doubleField15_ != null) {
- _single_doubleField15_codec.WriteTagAndValue(output, DoubleField15);
- }
- if (int64Field19_ != null) {
- _single_int64Field19_codec.WriteTagAndValue(output, Int64Field19);
- }
- if (doubleField20_ != null) {
- _single_doubleField20_codec.WriteTagAndValue(output, DoubleField20);
- }
- if (doubleField21_ != null) {
- _single_doubleField21_codec.WriteTagAndValue(output, DoubleField21);
- }
- if (doubleField22_ != null) {
- _single_doubleField22_codec.WriteTagAndValue(output, DoubleField22);
- }
- if (doubleField25_ != null) {
- _single_doubleField25_codec.WriteTagAndValue(output, DoubleField25);
- }
- if (int64Field26_ != null) {
- _single_int64Field26_codec.WriteTagAndValue(output, Int64Field26);
- }
- if (doubleField28_ != null) {
- _single_doubleField28_codec.WriteTagAndValue(output, DoubleField28);
- }
- if (doubleField29_ != null) {
- _single_doubleField29_codec.WriteTagAndValue(output, DoubleField29);
- }
- if (doubleField30_ != null) {
- _single_doubleField30_codec.WriteTagAndValue(output, DoubleField30);
- }
- if (doubleField31_ != null) {
- _single_doubleField31_codec.WriteTagAndValue(output, DoubleField31);
- }
- if (int64Field32_ != null) {
- _single_int64Field32_codec.WriteTagAndValue(output, Int64Field32);
- }
- if (int64Field37_ != null) {
- _single_int64Field37_codec.WriteTagAndValue(output, Int64Field37);
- }
- if (doubleField38_ != null) {
- _single_doubleField38_codec.WriteTagAndValue(output, DoubleField38);
- }
- if (interactions_ != null) {
- _single_interactions_codec.WriteTagAndValue(output, Interactions);
- }
- if (doubleField40_ != null) {
- _single_doubleField40_codec.WriteTagAndValue(output, DoubleField40);
- }
- if (int64Field41_ != null) {
- _single_int64Field41_codec.WriteTagAndValue(output, Int64Field41);
- }
- if (doubleField42_ != null) {
- _single_doubleField42_codec.WriteTagAndValue(output, DoubleField42);
- }
- if (int64Field43_ != null) {
- _single_int64Field43_codec.WriteTagAndValue(output, Int64Field43);
- }
- if (int64Field44_ != null) {
- _single_int64Field44_codec.WriteTagAndValue(output, Int64Field44);
- }
- if (doubleField45_ != null) {
- _single_doubleField45_codec.WriteTagAndValue(output, DoubleField45);
- }
- if (doubleField46_ != null) {
- _single_doubleField46_codec.WriteTagAndValue(output, DoubleField46);
- }
- if (doubleField47_ != null) {
- _single_doubleField47_codec.WriteTagAndValue(output, DoubleField47);
- }
- if (doubleField48_ != null) {
- _single_doubleField48_codec.WriteTagAndValue(output, DoubleField48);
- }
- if (doubleField49_ != null) {
- _single_doubleField49_codec.WriteTagAndValue(output, DoubleField49);
- }
- if (doubleField50_ != null) {
- _single_doubleField50_codec.WriteTagAndValue(output, DoubleField50);
- }
- if (doubleField51_ != null) {
- _single_doubleField51_codec.WriteTagAndValue(output, DoubleField51);
- }
- if (doubleField52_ != null) {
- _single_doubleField52_codec.WriteTagAndValue(output, DoubleField52);
- }
- if (doubleField53_ != null) {
- _single_doubleField53_codec.WriteTagAndValue(output, DoubleField53);
- }
- if (doubleField54_ != null) {
- _single_doubleField54_codec.WriteTagAndValue(output, DoubleField54);
- }
- if (doubleField55_ != null) {
- _single_doubleField55_codec.WriteTagAndValue(output, DoubleField55);
- }
- if (doubleField56_ != null) {
- _single_doubleField56_codec.WriteTagAndValue(output, DoubleField56);
- }
- if (doubleField57_ != null) {
- _single_doubleField57_codec.WriteTagAndValue(output, DoubleField57);
- }
- if (doubleField58_ != null) {
- _single_doubleField58_codec.WriteTagAndValue(output, DoubleField58);
- }
- if (int64Field59_ != null) {
- _single_int64Field59_codec.WriteTagAndValue(output, Int64Field59);
- }
- if (int64Field60_ != null) {
- _single_int64Field60_codec.WriteTagAndValue(output, Int64Field60);
- }
- if (doubleField62_ != null) {
- _single_doubleField62_codec.WriteTagAndValue(output, DoubleField62);
- }
- if (doubleField65_ != null) {
- _single_doubleField65_codec.WriteTagAndValue(output, DoubleField65);
- }
- if (doubleField66_ != null) {
- _single_doubleField66_codec.WriteTagAndValue(output, DoubleField66);
- }
- if (doubleField67_ != null) {
- _single_doubleField67_codec.WriteTagAndValue(output, DoubleField67);
- }
- if (doubleField68_ != null) {
- _single_doubleField68_codec.WriteTagAndValue(output, DoubleField68);
- }
- if (doubleField69_ != null) {
- _single_doubleField69_codec.WriteTagAndValue(output, DoubleField69);
- }
- if (doubleField70_ != null) {
- _single_doubleField70_codec.WriteTagAndValue(output, DoubleField70);
- }
- if (doubleField71_ != null) {
- _single_doubleField71_codec.WriteTagAndValue(output, DoubleField71);
- }
- if (doubleField72_ != null) {
- _single_doubleField72_codec.WriteTagAndValue(output, DoubleField72);
- }
- if (stringField73_ != null) {
- _single_stringField73_codec.WriteTagAndValue(output, StringField73);
- }
- if (stringField74_ != null) {
- _single_stringField74_codec.WriteTagAndValue(output, StringField74);
- }
- if (doubleField75_ != null) {
- _single_doubleField75_codec.WriteTagAndValue(output, DoubleField75);
- }
- if (doubleField77_ != null) {
- _single_doubleField77_codec.WriteTagAndValue(output, DoubleField77);
- }
- if (doubleField78_ != null) {
- _single_doubleField78_codec.WriteTagAndValue(output, DoubleField78);
- }
- if (doubleField79_ != null) {
- _single_doubleField79_codec.WriteTagAndValue(output, DoubleField79);
- }
- if (EnumField80 != 0) {
- output.WriteRawTag(128, 5);
- output.WriteInt32(EnumField80);
- }
- if (EnumField81 != 0) {
- output.WriteRawTag(136, 5);
- output.WriteInt32(EnumField81);
- }
- if (int64Field82_ != null) {
- _single_int64Field82_codec.WriteTagAndValue(output, Int64Field82);
- }
- if (EnumField83 != 0) {
- output.WriteRawTag(152, 5);
- output.WriteInt32(EnumField83);
- }
- if (doubleField84_ != null) {
- _single_doubleField84_codec.WriteTagAndValue(output, DoubleField84);
- }
- if (int64Field85_ != null) {
- _single_int64Field85_codec.WriteTagAndValue(output, Int64Field85);
- }
- if (int64Field86_ != null) {
- _single_int64Field86_codec.WriteTagAndValue(output, Int64Field86);
- }
- if (int64Field87_ != null) {
- _single_int64Field87_codec.WriteTagAndValue(output, Int64Field87);
- }
- if (doubleField88_ != null) {
- _single_doubleField88_codec.WriteTagAndValue(output, DoubleField88);
- }
- if (doubleField89_ != null) {
- _single_doubleField89_codec.WriteTagAndValue(output, DoubleField89);
- }
- if (doubleField90_ != null) {
- _single_doubleField90_codec.WriteTagAndValue(output, DoubleField90);
- }
- if (doubleField91_ != null) {
- _single_doubleField91_codec.WriteTagAndValue(output, DoubleField91);
- }
- if (doubleField92_ != null) {
- _single_doubleField92_codec.WriteTagAndValue(output, DoubleField92);
- }
- if (doubleField93_ != null) {
- _single_doubleField93_codec.WriteTagAndValue(output, DoubleField93);
- }
- if (doubleField94_ != null) {
- _single_doubleField94_codec.WriteTagAndValue(output, DoubleField94);
- }
- if (doubleField95_ != null) {
- _single_doubleField95_codec.WriteTagAndValue(output, DoubleField95);
- }
- if (doubleField96_ != null) {
- _single_doubleField96_codec.WriteTagAndValue(output, DoubleField96);
- }
- if (doubleField97_ != null) {
- _single_doubleField97_codec.WriteTagAndValue(output, DoubleField97);
- }
- if (doubleField98_ != null) {
- _single_doubleField98_codec.WriteTagAndValue(output, DoubleField98);
- }
- if (doubleField99_ != null) {
- _single_doubleField99_codec.WriteTagAndValue(output, DoubleField99);
- }
- repeatedIntField100_.WriteTo(output, _repeated_repeatedIntField100_codec);
- if (doubleField101_ != null) {
- _single_doubleField101_codec.WriteTagAndValue(output, DoubleField101);
- }
- if (doubleField102_ != null) {
- _single_doubleField102_codec.WriteTagAndValue(output, DoubleField102);
- }
- if (doubleField103_ != null) {
- _single_doubleField103_codec.WriteTagAndValue(output, DoubleField103);
- }
- if (doubleField104_ != null) {
- _single_doubleField104_codec.WriteTagAndValue(output, DoubleField104);
- }
- if (doubleField105_ != null) {
- _single_doubleField105_codec.WriteTagAndValue(output, DoubleField105);
- }
- if (doubleField106_ != null) {
- _single_doubleField106_codec.WriteTagAndValue(output, DoubleField106);
- }
- if (int64Field107_ != null) {
- _single_int64Field107_codec.WriteTagAndValue(output, Int64Field107);
- }
- if (doubleField108_ != null) {
- _single_doubleField108_codec.WriteTagAndValue(output, DoubleField108);
- }
- if (doubleField109_ != null) {
- _single_doubleField109_codec.WriteTagAndValue(output, DoubleField109);
- }
- if (int64Field110_ != null) {
- _single_int64Field110_codec.WriteTagAndValue(output, Int64Field110);
- }
- if (doubleField111_ != null) {
- _single_doubleField111_codec.WriteTagAndValue(output, DoubleField111);
- }
- if (int64Field112_ != null) {
- _single_int64Field112_codec.WriteTagAndValue(output, Int64Field112);
- }
- if (doubleField113_ != null) {
- _single_doubleField113_codec.WriteTagAndValue(output, DoubleField113);
- }
- if (int64Field114_ != null) {
- _single_int64Field114_codec.WriteTagAndValue(output, Int64Field114);
- }
- if (int64Field115_ != null) {
- _single_int64Field115_codec.WriteTagAndValue(output, Int64Field115);
- }
- if (doubleField116_ != null) {
- _single_doubleField116_codec.WriteTagAndValue(output, DoubleField116);
- }
- if (int64Field117_ != null) {
- _single_int64Field117_codec.WriteTagAndValue(output, Int64Field117);
- }
- if (doubleField118_ != null) {
- _single_doubleField118_codec.WriteTagAndValue(output, DoubleField118);
- }
- if (doubleField119_ != null) {
- _single_doubleField119_codec.WriteTagAndValue(output, DoubleField119);
- }
- if (doubleField120_ != null) {
- _single_doubleField120_codec.WriteTagAndValue(output, DoubleField120);
- }
- if (doubleField121_ != null) {
- _single_doubleField121_codec.WriteTagAndValue(output, DoubleField121);
- }
- if (doubleField122_ != null) {
- _single_doubleField122_codec.WriteTagAndValue(output, DoubleField122);
- }
- if (doubleField123_ != null) {
- _single_doubleField123_codec.WriteTagAndValue(output, DoubleField123);
- }
- if (doubleField124_ != null) {
- _single_doubleField124_codec.WriteTagAndValue(output, DoubleField124);
- }
- if (int64Field125_ != null) {
- _single_int64Field125_codec.WriteTagAndValue(output, Int64Field125);
- }
- if (int64Field126_ != null) {
- _single_int64Field126_codec.WriteTagAndValue(output, Int64Field126);
- }
- if (int64Field127_ != null) {
- _single_int64Field127_codec.WriteTagAndValue(output, Int64Field127);
- }
- if (doubleField128_ != null) {
- _single_doubleField128_codec.WriteTagAndValue(output, DoubleField128);
- }
- if (doubleField129_ != null) {
- _single_doubleField129_codec.WriteTagAndValue(output, DoubleField129);
- }
- if (_unknownFields != null) {
- _unknownFields.WriteTo(output);
- }
- #endif
- }
-
- #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
- if (doubleField1_ != null) {
- _single_doubleField1_codec.WriteTagAndValue(ref output, DoubleField1);
- }
- if (int64Field2_ != null) {
- _single_int64Field2_codec.WriteTagAndValue(ref output, Int64Field2);
- }
- if (int64Field3_ != null) {
- _single_int64Field3_codec.WriteTagAndValue(ref output, Int64Field3);
- }
- if (int64Field4_ != null) {
- _single_int64Field4_codec.WriteTagAndValue(ref output, Int64Field4);
- }
- if (doubleField7_ != null) {
- _single_doubleField7_codec.WriteTagAndValue(ref output, DoubleField7);
- }
- if (doubleField8_ != null) {
- _single_doubleField8_codec.WriteTagAndValue(ref output, DoubleField8);
- }
- if (doubleField9_ != null) {
- _single_doubleField9_codec.WriteTagAndValue(ref output, DoubleField9);
- }
- if (doubleField10_ != null) {
- _single_doubleField10_codec.WriteTagAndValue(ref output, DoubleField10);
- }
- if (doubleField11_ != null) {
- _single_doubleField11_codec.WriteTagAndValue(ref output, DoubleField11);
- }
- if (doubleField14_ != null) {
- _single_doubleField14_codec.WriteTagAndValue(ref output, DoubleField14);
- }
- if (doubleField15_ != null) {
- _single_doubleField15_codec.WriteTagAndValue(ref output, DoubleField15);
- }
- if (int64Field19_ != null) {
- _single_int64Field19_codec.WriteTagAndValue(ref output, Int64Field19);
- }
- if (doubleField20_ != null) {
- _single_doubleField20_codec.WriteTagAndValue(ref output, DoubleField20);
- }
- if (doubleField21_ != null) {
- _single_doubleField21_codec.WriteTagAndValue(ref output, DoubleField21);
- }
- if (doubleField22_ != null) {
- _single_doubleField22_codec.WriteTagAndValue(ref output, DoubleField22);
- }
- if (doubleField25_ != null) {
- _single_doubleField25_codec.WriteTagAndValue(ref output, DoubleField25);
- }
- if (int64Field26_ != null) {
- _single_int64Field26_codec.WriteTagAndValue(ref output, Int64Field26);
- }
- if (doubleField28_ != null) {
- _single_doubleField28_codec.WriteTagAndValue(ref output, DoubleField28);
- }
- if (doubleField29_ != null) {
- _single_doubleField29_codec.WriteTagAndValue(ref output, DoubleField29);
- }
- if (doubleField30_ != null) {
- _single_doubleField30_codec.WriteTagAndValue(ref output, DoubleField30);
- }
- if (doubleField31_ != null) {
- _single_doubleField31_codec.WriteTagAndValue(ref output, DoubleField31);
- }
- if (int64Field32_ != null) {
- _single_int64Field32_codec.WriteTagAndValue(ref output, Int64Field32);
- }
- if (int64Field37_ != null) {
- _single_int64Field37_codec.WriteTagAndValue(ref output, Int64Field37);
- }
- if (doubleField38_ != null) {
- _single_doubleField38_codec.WriteTagAndValue(ref output, DoubleField38);
- }
- if (interactions_ != null) {
- _single_interactions_codec.WriteTagAndValue(ref output, Interactions);
- }
- if (doubleField40_ != null) {
- _single_doubleField40_codec.WriteTagAndValue(ref output, DoubleField40);
- }
- if (int64Field41_ != null) {
- _single_int64Field41_codec.WriteTagAndValue(ref output, Int64Field41);
- }
- if (doubleField42_ != null) {
- _single_doubleField42_codec.WriteTagAndValue(ref output, DoubleField42);
- }
- if (int64Field43_ != null) {
- _single_int64Field43_codec.WriteTagAndValue(ref output, Int64Field43);
- }
- if (int64Field44_ != null) {
- _single_int64Field44_codec.WriteTagAndValue(ref output, Int64Field44);
- }
- if (doubleField45_ != null) {
- _single_doubleField45_codec.WriteTagAndValue(ref output, DoubleField45);
- }
- if (doubleField46_ != null) {
- _single_doubleField46_codec.WriteTagAndValue(ref output, DoubleField46);
- }
- if (doubleField47_ != null) {
- _single_doubleField47_codec.WriteTagAndValue(ref output, DoubleField47);
- }
- if (doubleField48_ != null) {
- _single_doubleField48_codec.WriteTagAndValue(ref output, DoubleField48);
- }
- if (doubleField49_ != null) {
- _single_doubleField49_codec.WriteTagAndValue(ref output, DoubleField49);
- }
- if (doubleField50_ != null) {
- _single_doubleField50_codec.WriteTagAndValue(ref output, DoubleField50);
- }
- if (doubleField51_ != null) {
- _single_doubleField51_codec.WriteTagAndValue(ref output, DoubleField51);
- }
- if (doubleField52_ != null) {
- _single_doubleField52_codec.WriteTagAndValue(ref output, DoubleField52);
- }
- if (doubleField53_ != null) {
- _single_doubleField53_codec.WriteTagAndValue(ref output, DoubleField53);
- }
- if (doubleField54_ != null) {
- _single_doubleField54_codec.WriteTagAndValue(ref output, DoubleField54);
- }
- if (doubleField55_ != null) {
- _single_doubleField55_codec.WriteTagAndValue(ref output, DoubleField55);
- }
- if (doubleField56_ != null) {
- _single_doubleField56_codec.WriteTagAndValue(ref output, DoubleField56);
- }
- if (doubleField57_ != null) {
- _single_doubleField57_codec.WriteTagAndValue(ref output, DoubleField57);
- }
- if (doubleField58_ != null) {
- _single_doubleField58_codec.WriteTagAndValue(ref output, DoubleField58);
- }
- if (int64Field59_ != null) {
- _single_int64Field59_codec.WriteTagAndValue(ref output, Int64Field59);
- }
- if (int64Field60_ != null) {
- _single_int64Field60_codec.WriteTagAndValue(ref output, Int64Field60);
- }
- if (doubleField62_ != null) {
- _single_doubleField62_codec.WriteTagAndValue(ref output, DoubleField62);
- }
- if (doubleField65_ != null) {
- _single_doubleField65_codec.WriteTagAndValue(ref output, DoubleField65);
- }
- if (doubleField66_ != null) {
- _single_doubleField66_codec.WriteTagAndValue(ref output, DoubleField66);
- }
- if (doubleField67_ != null) {
- _single_doubleField67_codec.WriteTagAndValue(ref output, DoubleField67);
- }
- if (doubleField68_ != null) {
- _single_doubleField68_codec.WriteTagAndValue(ref output, DoubleField68);
- }
- if (doubleField69_ != null) {
- _single_doubleField69_codec.WriteTagAndValue(ref output, DoubleField69);
- }
- if (doubleField70_ != null) {
- _single_doubleField70_codec.WriteTagAndValue(ref output, DoubleField70);
- }
- if (doubleField71_ != null) {
- _single_doubleField71_codec.WriteTagAndValue(ref output, DoubleField71);
- }
- if (doubleField72_ != null) {
- _single_doubleField72_codec.WriteTagAndValue(ref output, DoubleField72);
- }
- if (stringField73_ != null) {
- _single_stringField73_codec.WriteTagAndValue(ref output, StringField73);
- }
- if (stringField74_ != null) {
- _single_stringField74_codec.WriteTagAndValue(ref output, StringField74);
- }
- if (doubleField75_ != null) {
- _single_doubleField75_codec.WriteTagAndValue(ref output, DoubleField75);
- }
- if (doubleField77_ != null) {
- _single_doubleField77_codec.WriteTagAndValue(ref output, DoubleField77);
- }
- if (doubleField78_ != null) {
- _single_doubleField78_codec.WriteTagAndValue(ref output, DoubleField78);
- }
- if (doubleField79_ != null) {
- _single_doubleField79_codec.WriteTagAndValue(ref output, DoubleField79);
- }
- if (EnumField80 != 0) {
- output.WriteRawTag(128, 5);
- output.WriteInt32(EnumField80);
- }
- if (EnumField81 != 0) {
- output.WriteRawTag(136, 5);
- output.WriteInt32(EnumField81);
- }
- if (int64Field82_ != null) {
- _single_int64Field82_codec.WriteTagAndValue(ref output, Int64Field82);
- }
- if (EnumField83 != 0) {
- output.WriteRawTag(152, 5);
- output.WriteInt32(EnumField83);
- }
- if (doubleField84_ != null) {
- _single_doubleField84_codec.WriteTagAndValue(ref output, DoubleField84);
- }
- if (int64Field85_ != null) {
- _single_int64Field85_codec.WriteTagAndValue(ref output, Int64Field85);
- }
- if (int64Field86_ != null) {
- _single_int64Field86_codec.WriteTagAndValue(ref output, Int64Field86);
- }
- if (int64Field87_ != null) {
- _single_int64Field87_codec.WriteTagAndValue(ref output, Int64Field87);
- }
- if (doubleField88_ != null) {
- _single_doubleField88_codec.WriteTagAndValue(ref output, DoubleField88);
- }
- if (doubleField89_ != null) {
- _single_doubleField89_codec.WriteTagAndValue(ref output, DoubleField89);
- }
- if (doubleField90_ != null) {
- _single_doubleField90_codec.WriteTagAndValue(ref output, DoubleField90);
- }
- if (doubleField91_ != null) {
- _single_doubleField91_codec.WriteTagAndValue(ref output, DoubleField91);
- }
- if (doubleField92_ != null) {
- _single_doubleField92_codec.WriteTagAndValue(ref output, DoubleField92);
- }
- if (doubleField93_ != null) {
- _single_doubleField93_codec.WriteTagAndValue(ref output, DoubleField93);
- }
- if (doubleField94_ != null) {
- _single_doubleField94_codec.WriteTagAndValue(ref output, DoubleField94);
- }
- if (doubleField95_ != null) {
- _single_doubleField95_codec.WriteTagAndValue(ref output, DoubleField95);
- }
- if (doubleField96_ != null) {
- _single_doubleField96_codec.WriteTagAndValue(ref output, DoubleField96);
- }
- if (doubleField97_ != null) {
- _single_doubleField97_codec.WriteTagAndValue(ref output, DoubleField97);
- }
- if (doubleField98_ != null) {
- _single_doubleField98_codec.WriteTagAndValue(ref output, DoubleField98);
- }
- if (doubleField99_ != null) {
- _single_doubleField99_codec.WriteTagAndValue(ref output, DoubleField99);
- }
- repeatedIntField100_.WriteTo(ref output, _repeated_repeatedIntField100_codec);
- if (doubleField101_ != null) {
- _single_doubleField101_codec.WriteTagAndValue(ref output, DoubleField101);
- }
- if (doubleField102_ != null) {
- _single_doubleField102_codec.WriteTagAndValue(ref output, DoubleField102);
- }
- if (doubleField103_ != null) {
- _single_doubleField103_codec.WriteTagAndValue(ref output, DoubleField103);
- }
- if (doubleField104_ != null) {
- _single_doubleField104_codec.WriteTagAndValue(ref output, DoubleField104);
- }
- if (doubleField105_ != null) {
- _single_doubleField105_codec.WriteTagAndValue(ref output, DoubleField105);
- }
- if (doubleField106_ != null) {
- _single_doubleField106_codec.WriteTagAndValue(ref output, DoubleField106);
- }
- if (int64Field107_ != null) {
- _single_int64Field107_codec.WriteTagAndValue(ref output, Int64Field107);
- }
- if (doubleField108_ != null) {
- _single_doubleField108_codec.WriteTagAndValue(ref output, DoubleField108);
- }
- if (doubleField109_ != null) {
- _single_doubleField109_codec.WriteTagAndValue(ref output, DoubleField109);
- }
- if (int64Field110_ != null) {
- _single_int64Field110_codec.WriteTagAndValue(ref output, Int64Field110);
- }
- if (doubleField111_ != null) {
- _single_doubleField111_codec.WriteTagAndValue(ref output, DoubleField111);
- }
- if (int64Field112_ != null) {
- _single_int64Field112_codec.WriteTagAndValue(ref output, Int64Field112);
- }
- if (doubleField113_ != null) {
- _single_doubleField113_codec.WriteTagAndValue(ref output, DoubleField113);
- }
- if (int64Field114_ != null) {
- _single_int64Field114_codec.WriteTagAndValue(ref output, Int64Field114);
- }
- if (int64Field115_ != null) {
- _single_int64Field115_codec.WriteTagAndValue(ref output, Int64Field115);
- }
- if (doubleField116_ != null) {
- _single_doubleField116_codec.WriteTagAndValue(ref output, DoubleField116);
- }
- if (int64Field117_ != null) {
- _single_int64Field117_codec.WriteTagAndValue(ref output, Int64Field117);
- }
- if (doubleField118_ != null) {
- _single_doubleField118_codec.WriteTagAndValue(ref output, DoubleField118);
- }
- if (doubleField119_ != null) {
- _single_doubleField119_codec.WriteTagAndValue(ref output, DoubleField119);
- }
- if (doubleField120_ != null) {
- _single_doubleField120_codec.WriteTagAndValue(ref output, DoubleField120);
- }
- if (doubleField121_ != null) {
- _single_doubleField121_codec.WriteTagAndValue(ref output, DoubleField121);
- }
- if (doubleField122_ != null) {
- _single_doubleField122_codec.WriteTagAndValue(ref output, DoubleField122);
- }
- if (doubleField123_ != null) {
- _single_doubleField123_codec.WriteTagAndValue(ref output, DoubleField123);
- }
- if (doubleField124_ != null) {
- _single_doubleField124_codec.WriteTagAndValue(ref output, DoubleField124);
- }
- if (int64Field125_ != null) {
- _single_int64Field125_codec.WriteTagAndValue(ref output, Int64Field125);
- }
- if (int64Field126_ != null) {
- _single_int64Field126_codec.WriteTagAndValue(ref output, Int64Field126);
- }
- if (int64Field127_ != null) {
- _single_int64Field127_codec.WriteTagAndValue(ref output, Int64Field127);
- }
- if (doubleField128_ != null) {
- _single_doubleField128_codec.WriteTagAndValue(ref output, DoubleField128);
- }
- if (doubleField129_ != null) {
- _single_doubleField129_codec.WriteTagAndValue(ref output, DoubleField129);
- }
- if (_unknownFields != null) {
- _unknownFields.WriteTo(ref output);
- }
- }
- #endif
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public int CalculateSize() {
- int size = 0;
- if (doubleField95_ != null) {
- size += _single_doubleField95_codec.CalculateSizeWithTag(DoubleField95);
- }
- if (doubleField1_ != null) {
- size += _single_doubleField1_codec.CalculateSizeWithTag(DoubleField1);
- }
- if (doubleField79_ != null) {
- size += _single_doubleField79_codec.CalculateSizeWithTag(DoubleField79);
- }
- if (int64Field2_ != null) {
- size += _single_int64Field2_codec.CalculateSizeWithTag(Int64Field2);
- }
- if (doubleField96_ != null) {
- size += _single_doubleField96_codec.CalculateSizeWithTag(DoubleField96);
- }
- if (int64Field3_ != null) {
- size += _single_int64Field3_codec.CalculateSizeWithTag(Int64Field3);
- }
- if (int64Field4_ != null) {
- size += _single_int64Field4_codec.CalculateSizeWithTag(Int64Field4);
- }
- if (doubleField97_ != null) {
- size += _single_doubleField97_codec.CalculateSizeWithTag(DoubleField97);
- }
- if (doubleField65_ != null) {
- size += _single_doubleField65_codec.CalculateSizeWithTag(DoubleField65);
- }
- if (doubleField66_ != null) {
- size += _single_doubleField66_codec.CalculateSizeWithTag(DoubleField66);
- }
- if (doubleField7_ != null) {
- size += _single_doubleField7_codec.CalculateSizeWithTag(DoubleField7);
- }
- if (doubleField62_ != null) {
- size += _single_doubleField62_codec.CalculateSizeWithTag(DoubleField62);
- }
- if (doubleField118_ != null) {
- size += _single_doubleField118_codec.CalculateSizeWithTag(DoubleField118);
- }
- if (doubleField119_ != null) {
- size += _single_doubleField119_codec.CalculateSizeWithTag(DoubleField119);
- }
- if (doubleField67_ != null) {
- size += _single_doubleField67_codec.CalculateSizeWithTag(DoubleField67);
- }
- if (doubleField120_ != null) {
- size += _single_doubleField120_codec.CalculateSizeWithTag(DoubleField120);
- }
- if (doubleField121_ != null) {
- size += _single_doubleField121_codec.CalculateSizeWithTag(DoubleField121);
- }
- if (doubleField122_ != null) {
- size += _single_doubleField122_codec.CalculateSizeWithTag(DoubleField122);
- }
- if (doubleField123_ != null) {
- size += _single_doubleField123_codec.CalculateSizeWithTag(DoubleField123);
- }
- if (doubleField124_ != null) {
- size += _single_doubleField124_codec.CalculateSizeWithTag(DoubleField124);
- }
- if (doubleField8_ != null) {
- size += _single_doubleField8_codec.CalculateSizeWithTag(DoubleField8);
- }
- if (doubleField9_ != null) {
- size += _single_doubleField9_codec.CalculateSizeWithTag(DoubleField9);
- }
- if (doubleField98_ != null) {
- size += _single_doubleField98_codec.CalculateSizeWithTag(DoubleField98);
- }
- if (doubleField10_ != null) {
- size += _single_doubleField10_codec.CalculateSizeWithTag(DoubleField10);
- }
- if (doubleField11_ != null) {
- size += _single_doubleField11_codec.CalculateSizeWithTag(DoubleField11);
- }
- if (doubleField99_ != null) {
- size += _single_doubleField99_codec.CalculateSizeWithTag(DoubleField99);
- }
- if (doubleField84_ != null) {
- size += _single_doubleField84_codec.CalculateSizeWithTag(DoubleField84);
- }
- if (doubleField14_ != null) {
- size += _single_doubleField14_codec.CalculateSizeWithTag(DoubleField14);
- }
- if (doubleField77_ != null) {
- size += _single_doubleField77_codec.CalculateSizeWithTag(DoubleField77);
- }
- if (doubleField15_ != null) {
- size += _single_doubleField15_codec.CalculateSizeWithTag(DoubleField15);
- }
- if (int64Field19_ != null) {
- size += _single_int64Field19_codec.CalculateSizeWithTag(Int64Field19);
- }
- if (int64Field115_ != null) {
- size += _single_int64Field115_codec.CalculateSizeWithTag(Int64Field115);
- }
- if (doubleField116_ != null) {
- size += _single_doubleField116_codec.CalculateSizeWithTag(DoubleField116);
- }
- if (int64Field117_ != null) {
- size += _single_int64Field117_codec.CalculateSizeWithTag(Int64Field117);
- }
- if (doubleField20_ != null) {
- size += _single_doubleField20_codec.CalculateSizeWithTag(DoubleField20);
- }
- if (doubleField21_ != null) {
- size += _single_doubleField21_codec.CalculateSizeWithTag(DoubleField21);
- }
- if (stringField73_ != null) {
- size += _single_stringField73_codec.CalculateSizeWithTag(StringField73);
- }
- if (stringField74_ != null) {
- size += _single_stringField74_codec.CalculateSizeWithTag(StringField74);
- }
- if (doubleField22_ != null) {
- size += _single_doubleField22_codec.CalculateSizeWithTag(DoubleField22);
- }
- if (doubleField69_ != null) {
- size += _single_doubleField69_codec.CalculateSizeWithTag(DoubleField69);
- }
- if (doubleField70_ != null) {
- size += _single_doubleField70_codec.CalculateSizeWithTag(DoubleField70);
- }
- if (doubleField71_ != null) {
- size += _single_doubleField71_codec.CalculateSizeWithTag(DoubleField71);
- }
- if (doubleField72_ != null) {
- size += _single_doubleField72_codec.CalculateSizeWithTag(DoubleField72);
- }
- if (doubleField25_ != null) {
- size += _single_doubleField25_codec.CalculateSizeWithTag(DoubleField25);
- }
- if (int64Field26_ != null) {
- size += _single_int64Field26_codec.CalculateSizeWithTag(Int64Field26);
- }
- if (doubleField68_ != null) {
- size += _single_doubleField68_codec.CalculateSizeWithTag(DoubleField68);
- }
- if (doubleField28_ != null) {
- size += _single_doubleField28_codec.CalculateSizeWithTag(DoubleField28);
- }
- if (doubleField106_ != null) {
- size += _single_doubleField106_codec.CalculateSizeWithTag(DoubleField106);
- }
- if (doubleField29_ != null) {
- size += _single_doubleField29_codec.CalculateSizeWithTag(DoubleField29);
- }
- if (doubleField30_ != null) {
- size += _single_doubleField30_codec.CalculateSizeWithTag(DoubleField30);
- }
- if (doubleField101_ != null) {
- size += _single_doubleField101_codec.CalculateSizeWithTag(DoubleField101);
- }
- if (doubleField102_ != null) {
- size += _single_doubleField102_codec.CalculateSizeWithTag(DoubleField102);
- }
- if (doubleField103_ != null) {
- size += _single_doubleField103_codec.CalculateSizeWithTag(DoubleField103);
- }
- if (doubleField104_ != null) {
- size += _single_doubleField104_codec.CalculateSizeWithTag(DoubleField104);
- }
- if (doubleField105_ != null) {
- size += _single_doubleField105_codec.CalculateSizeWithTag(DoubleField105);
- }
- if (doubleField31_ != null) {
- size += _single_doubleField31_codec.CalculateSizeWithTag(DoubleField31);
- }
- if (int64Field32_ != null) {
- size += _single_int64Field32_codec.CalculateSizeWithTag(Int64Field32);
- }
- if (doubleField75_ != null) {
- size += _single_doubleField75_codec.CalculateSizeWithTag(DoubleField75);
- }
- if (doubleField129_ != null) {
- size += _single_doubleField129_codec.CalculateSizeWithTag(DoubleField129);
- }
- if (EnumField80 != 0) {
- size += 2 + pb::CodedOutputStream.ComputeInt32Size(EnumField80);
- }
- if (EnumField81 != 0) {
- size += 2 + pb::CodedOutputStream.ComputeInt32Size(EnumField81);
- }
- if (int64Field82_ != null) {
- size += _single_int64Field82_codec.CalculateSizeWithTag(Int64Field82);
- }
- if (EnumField83 != 0) {
- size += 2 + pb::CodedOutputStream.ComputeInt32Size(EnumField83);
- }
- if (int64Field85_ != null) {
- size += _single_int64Field85_codec.CalculateSizeWithTag(Int64Field85);
- }
- if (int64Field86_ != null) {
- size += _single_int64Field86_codec.CalculateSizeWithTag(Int64Field86);
- }
- if (int64Field87_ != null) {
- size += _single_int64Field87_codec.CalculateSizeWithTag(Int64Field87);
- }
- if (int64Field125_ != null) {
- size += _single_int64Field125_codec.CalculateSizeWithTag(Int64Field125);
- }
- if (int64Field37_ != null) {
- size += _single_int64Field37_codec.CalculateSizeWithTag(Int64Field37);
- }
- if (doubleField38_ != null) {
- size += _single_doubleField38_codec.CalculateSizeWithTag(DoubleField38);
- }
- if (interactions_ != null) {
- size += _single_interactions_codec.CalculateSizeWithTag(Interactions);
- }
- size += repeatedIntField100_.CalculateSize(_repeated_repeatedIntField100_codec);
- if (doubleField40_ != null) {
- size += _single_doubleField40_codec.CalculateSizeWithTag(DoubleField40);
- }
- if (int64Field41_ != null) {
- size += _single_int64Field41_codec.CalculateSizeWithTag(Int64Field41);
- }
- if (int64Field126_ != null) {
- size += _single_int64Field126_codec.CalculateSizeWithTag(Int64Field126);
- }
- if (int64Field127_ != null) {
- size += _single_int64Field127_codec.CalculateSizeWithTag(Int64Field127);
- }
- if (doubleField128_ != null) {
- size += _single_doubleField128_codec.CalculateSizeWithTag(DoubleField128);
- }
- if (doubleField109_ != null) {
- size += _single_doubleField109_codec.CalculateSizeWithTag(DoubleField109);
- }
- if (int64Field110_ != null) {
- size += _single_int64Field110_codec.CalculateSizeWithTag(Int64Field110);
- }
- if (doubleField111_ != null) {
- size += _single_doubleField111_codec.CalculateSizeWithTag(DoubleField111);
- }
- if (int64Field112_ != null) {
- size += _single_int64Field112_codec.CalculateSizeWithTag(Int64Field112);
- }
- if (doubleField113_ != null) {
- size += _single_doubleField113_codec.CalculateSizeWithTag(DoubleField113);
- }
- if (int64Field114_ != null) {
- size += _single_int64Field114_codec.CalculateSizeWithTag(Int64Field114);
- }
- if (doubleField42_ != null) {
- size += _single_doubleField42_codec.CalculateSizeWithTag(DoubleField42);
- }
- if (int64Field43_ != null) {
- size += _single_int64Field43_codec.CalculateSizeWithTag(Int64Field43);
- }
- if (int64Field44_ != null) {
- size += _single_int64Field44_codec.CalculateSizeWithTag(Int64Field44);
- }
- if (doubleField45_ != null) {
- size += _single_doubleField45_codec.CalculateSizeWithTag(DoubleField45);
- }
- if (doubleField46_ != null) {
- size += _single_doubleField46_codec.CalculateSizeWithTag(DoubleField46);
- }
- if (doubleField78_ != null) {
- size += _single_doubleField78_codec.CalculateSizeWithTag(DoubleField78);
- }
- if (doubleField88_ != null) {
- size += _single_doubleField88_codec.CalculateSizeWithTag(DoubleField88);
- }
- if (doubleField47_ != null) {
- size += _single_doubleField47_codec.CalculateSizeWithTag(DoubleField47);
- }
- if (doubleField89_ != null) {
- size += _single_doubleField89_codec.CalculateSizeWithTag(DoubleField89);
- }
- if (doubleField48_ != null) {
- size += _single_doubleField48_codec.CalculateSizeWithTag(DoubleField48);
- }
- if (doubleField49_ != null) {
- size += _single_doubleField49_codec.CalculateSizeWithTag(DoubleField49);
- }
- if (doubleField50_ != null) {
- size += _single_doubleField50_codec.CalculateSizeWithTag(DoubleField50);
- }
- if (doubleField90_ != null) {
- size += _single_doubleField90_codec.CalculateSizeWithTag(DoubleField90);
- }
- if (doubleField51_ != null) {
- size += _single_doubleField51_codec.CalculateSizeWithTag(DoubleField51);
- }
- if (doubleField91_ != null) {
- size += _single_doubleField91_codec.CalculateSizeWithTag(DoubleField91);
- }
- if (doubleField92_ != null) {
- size += _single_doubleField92_codec.CalculateSizeWithTag(DoubleField92);
- }
- if (int64Field107_ != null) {
- size += _single_int64Field107_codec.CalculateSizeWithTag(Int64Field107);
- }
- if (doubleField93_ != null) {
- size += _single_doubleField93_codec.CalculateSizeWithTag(DoubleField93);
- }
- if (doubleField108_ != null) {
- size += _single_doubleField108_codec.CalculateSizeWithTag(DoubleField108);
- }
- if (doubleField52_ != null) {
- size += _single_doubleField52_codec.CalculateSizeWithTag(DoubleField52);
- }
- if (doubleField53_ != null) {
- size += _single_doubleField53_codec.CalculateSizeWithTag(DoubleField53);
- }
- if (doubleField94_ != null) {
- size += _single_doubleField94_codec.CalculateSizeWithTag(DoubleField94);
- }
- if (doubleField54_ != null) {
- size += _single_doubleField54_codec.CalculateSizeWithTag(DoubleField54);
- }
- if (doubleField55_ != null) {
- size += _single_doubleField55_codec.CalculateSizeWithTag(DoubleField55);
- }
- if (doubleField56_ != null) {
- size += _single_doubleField56_codec.CalculateSizeWithTag(DoubleField56);
- }
- if (doubleField57_ != null) {
- size += _single_doubleField57_codec.CalculateSizeWithTag(DoubleField57);
- }
- if (doubleField58_ != null) {
- size += _single_doubleField58_codec.CalculateSizeWithTag(DoubleField58);
- }
- if (int64Field59_ != null) {
- size += _single_int64Field59_codec.CalculateSizeWithTag(Int64Field59);
- }
- if (int64Field60_ != null) {
- size += _single_int64Field60_codec.CalculateSizeWithTag(Int64Field60);
- }
- if (_unknownFields != null) {
- size += _unknownFields.CalculateSize();
- }
- return size;
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public void MergeFrom(ManyWrapperFieldsMessage other) {
- if (other == null) {
- return;
- }
- if (other.doubleField95_ != null) {
- if (doubleField95_ == null || other.DoubleField95 != 0D) {
- DoubleField95 = other.DoubleField95;
- }
- }
- if (other.doubleField1_ != null) {
- if (doubleField1_ == null || other.DoubleField1 != 0D) {
- DoubleField1 = other.DoubleField1;
- }
- }
- if (other.doubleField79_ != null) {
- if (doubleField79_ == null || other.DoubleField79 != 0D) {
- DoubleField79 = other.DoubleField79;
- }
- }
- if (other.int64Field2_ != null) {
- if (int64Field2_ == null || other.Int64Field2 != 0L) {
- Int64Field2 = other.Int64Field2;
- }
- }
- if (other.doubleField96_ != null) {
- if (doubleField96_ == null || other.DoubleField96 != 0D) {
- DoubleField96 = other.DoubleField96;
- }
- }
- if (other.int64Field3_ != null) {
- if (int64Field3_ == null || other.Int64Field3 != 0L) {
- Int64Field3 = other.Int64Field3;
- }
- }
- if (other.int64Field4_ != null) {
- if (int64Field4_ == null || other.Int64Field4 != 0L) {
- Int64Field4 = other.Int64Field4;
- }
- }
- if (other.doubleField97_ != null) {
- if (doubleField97_ == null || other.DoubleField97 != 0D) {
- DoubleField97 = other.DoubleField97;
- }
- }
- if (other.doubleField65_ != null) {
- if (doubleField65_ == null || other.DoubleField65 != 0D) {
- DoubleField65 = other.DoubleField65;
- }
- }
- if (other.doubleField66_ != null) {
- if (doubleField66_ == null || other.DoubleField66 != 0D) {
- DoubleField66 = other.DoubleField66;
- }
- }
- if (other.doubleField7_ != null) {
- if (doubleField7_ == null || other.DoubleField7 != 0D) {
- DoubleField7 = other.DoubleField7;
- }
- }
- if (other.doubleField62_ != null) {
- if (doubleField62_ == null || other.DoubleField62 != 0D) {
- DoubleField62 = other.DoubleField62;
- }
- }
- if (other.doubleField118_ != null) {
- if (doubleField118_ == null || other.DoubleField118 != 0D) {
- DoubleField118 = other.DoubleField118;
- }
- }
- if (other.doubleField119_ != null) {
- if (doubleField119_ == null || other.DoubleField119 != 0D) {
- DoubleField119 = other.DoubleField119;
- }
- }
- if (other.doubleField67_ != null) {
- if (doubleField67_ == null || other.DoubleField67 != 0D) {
- DoubleField67 = other.DoubleField67;
- }
- }
- if (other.doubleField120_ != null) {
- if (doubleField120_ == null || other.DoubleField120 != 0D) {
- DoubleField120 = other.DoubleField120;
- }
- }
- if (other.doubleField121_ != null) {
- if (doubleField121_ == null || other.DoubleField121 != 0D) {
- DoubleField121 = other.DoubleField121;
- }
- }
- if (other.doubleField122_ != null) {
- if (doubleField122_ == null || other.DoubleField122 != 0D) {
- DoubleField122 = other.DoubleField122;
- }
- }
- if (other.doubleField123_ != null) {
- if (doubleField123_ == null || other.DoubleField123 != 0D) {
- DoubleField123 = other.DoubleField123;
- }
- }
- if (other.doubleField124_ != null) {
- if (doubleField124_ == null || other.DoubleField124 != 0D) {
- DoubleField124 = other.DoubleField124;
- }
- }
- if (other.doubleField8_ != null) {
- if (doubleField8_ == null || other.DoubleField8 != 0D) {
- DoubleField8 = other.DoubleField8;
- }
- }
- if (other.doubleField9_ != null) {
- if (doubleField9_ == null || other.DoubleField9 != 0D) {
- DoubleField9 = other.DoubleField9;
- }
- }
- if (other.doubleField98_ != null) {
- if (doubleField98_ == null || other.DoubleField98 != 0D) {
- DoubleField98 = other.DoubleField98;
- }
- }
- if (other.doubleField10_ != null) {
- if (doubleField10_ == null || other.DoubleField10 != 0D) {
- DoubleField10 = other.DoubleField10;
- }
- }
- if (other.doubleField11_ != null) {
- if (doubleField11_ == null || other.DoubleField11 != 0D) {
- DoubleField11 = other.DoubleField11;
- }
- }
- if (other.doubleField99_ != null) {
- if (doubleField99_ == null || other.DoubleField99 != 0D) {
- DoubleField99 = other.DoubleField99;
- }
- }
- if (other.doubleField84_ != null) {
- if (doubleField84_ == null || other.DoubleField84 != 0D) {
- DoubleField84 = other.DoubleField84;
- }
- }
- if (other.doubleField14_ != null) {
- if (doubleField14_ == null || other.DoubleField14 != 0D) {
- DoubleField14 = other.DoubleField14;
- }
- }
- if (other.doubleField77_ != null) {
- if (doubleField77_ == null || other.DoubleField77 != 0D) {
- DoubleField77 = other.DoubleField77;
- }
- }
- if (other.doubleField15_ != null) {
- if (doubleField15_ == null || other.DoubleField15 != 0D) {
- DoubleField15 = other.DoubleField15;
- }
- }
- if (other.int64Field19_ != null) {
- if (int64Field19_ == null || other.Int64Field19 != 0L) {
- Int64Field19 = other.Int64Field19;
- }
- }
- if (other.int64Field115_ != null) {
- if (int64Field115_ == null || other.Int64Field115 != 0L) {
- Int64Field115 = other.Int64Field115;
- }
- }
- if (other.doubleField116_ != null) {
- if (doubleField116_ == null || other.DoubleField116 != 0D) {
- DoubleField116 = other.DoubleField116;
- }
- }
- if (other.int64Field117_ != null) {
- if (int64Field117_ == null || other.Int64Field117 != 0L) {
- Int64Field117 = other.Int64Field117;
- }
- }
- if (other.doubleField20_ != null) {
- if (doubleField20_ == null || other.DoubleField20 != 0D) {
- DoubleField20 = other.DoubleField20;
- }
- }
- if (other.doubleField21_ != null) {
- if (doubleField21_ == null || other.DoubleField21 != 0D) {
- DoubleField21 = other.DoubleField21;
- }
- }
- if (other.stringField73_ != null) {
- if (stringField73_ == null || other.StringField73 != "") {
- StringField73 = other.StringField73;
- }
- }
- if (other.stringField74_ != null) {
- if (stringField74_ == null || other.StringField74 != "") {
- StringField74 = other.StringField74;
- }
- }
- if (other.doubleField22_ != null) {
- if (doubleField22_ == null || other.DoubleField22 != 0D) {
- DoubleField22 = other.DoubleField22;
- }
- }
- if (other.doubleField69_ != null) {
- if (doubleField69_ == null || other.DoubleField69 != 0D) {
- DoubleField69 = other.DoubleField69;
- }
- }
- if (other.doubleField70_ != null) {
- if (doubleField70_ == null || other.DoubleField70 != 0D) {
- DoubleField70 = other.DoubleField70;
- }
- }
- if (other.doubleField71_ != null) {
- if (doubleField71_ == null || other.DoubleField71 != 0D) {
- DoubleField71 = other.DoubleField71;
- }
- }
- if (other.doubleField72_ != null) {
- if (doubleField72_ == null || other.DoubleField72 != 0D) {
- DoubleField72 = other.DoubleField72;
- }
- }
- if (other.doubleField25_ != null) {
- if (doubleField25_ == null || other.DoubleField25 != 0D) {
- DoubleField25 = other.DoubleField25;
- }
- }
- if (other.int64Field26_ != null) {
- if (int64Field26_ == null || other.Int64Field26 != 0L) {
- Int64Field26 = other.Int64Field26;
- }
- }
- if (other.doubleField68_ != null) {
- if (doubleField68_ == null || other.DoubleField68 != 0D) {
- DoubleField68 = other.DoubleField68;
- }
- }
- if (other.doubleField28_ != null) {
- if (doubleField28_ == null || other.DoubleField28 != 0D) {
- DoubleField28 = other.DoubleField28;
- }
- }
- if (other.doubleField106_ != null) {
- if (doubleField106_ == null || other.DoubleField106 != 0D) {
- DoubleField106 = other.DoubleField106;
- }
- }
- if (other.doubleField29_ != null) {
- if (doubleField29_ == null || other.DoubleField29 != 0D) {
- DoubleField29 = other.DoubleField29;
- }
- }
- if (other.doubleField30_ != null) {
- if (doubleField30_ == null || other.DoubleField30 != 0D) {
- DoubleField30 = other.DoubleField30;
- }
- }
- if (other.doubleField101_ != null) {
- if (doubleField101_ == null || other.DoubleField101 != 0D) {
- DoubleField101 = other.DoubleField101;
- }
- }
- if (other.doubleField102_ != null) {
- if (doubleField102_ == null || other.DoubleField102 != 0D) {
- DoubleField102 = other.DoubleField102;
- }
- }
- if (other.doubleField103_ != null) {
- if (doubleField103_ == null || other.DoubleField103 != 0D) {
- DoubleField103 = other.DoubleField103;
- }
- }
- if (other.doubleField104_ != null) {
- if (doubleField104_ == null || other.DoubleField104 != 0D) {
- DoubleField104 = other.DoubleField104;
- }
- }
- if (other.doubleField105_ != null) {
- if (doubleField105_ == null || other.DoubleField105 != 0D) {
- DoubleField105 = other.DoubleField105;
- }
- }
- if (other.doubleField31_ != null) {
- if (doubleField31_ == null || other.DoubleField31 != 0D) {
- DoubleField31 = other.DoubleField31;
- }
- }
- if (other.int64Field32_ != null) {
- if (int64Field32_ == null || other.Int64Field32 != 0L) {
- Int64Field32 = other.Int64Field32;
- }
- }
- if (other.doubleField75_ != null) {
- if (doubleField75_ == null || other.DoubleField75 != 0D) {
- DoubleField75 = other.DoubleField75;
- }
- }
- if (other.doubleField129_ != null) {
- if (doubleField129_ == null || other.DoubleField129 != 0D) {
- DoubleField129 = other.DoubleField129;
- }
- }
- if (other.EnumField80 != 0) {
- EnumField80 = other.EnumField80;
- }
- if (other.EnumField81 != 0) {
- EnumField81 = other.EnumField81;
- }
- if (other.int64Field82_ != null) {
- if (int64Field82_ == null || other.Int64Field82 != 0L) {
- Int64Field82 = other.Int64Field82;
- }
- }
- if (other.EnumField83 != 0) {
- EnumField83 = other.EnumField83;
- }
- if (other.int64Field85_ != null) {
- if (int64Field85_ == null || other.Int64Field85 != 0L) {
- Int64Field85 = other.Int64Field85;
- }
- }
- if (other.int64Field86_ != null) {
- if (int64Field86_ == null || other.Int64Field86 != 0L) {
- Int64Field86 = other.Int64Field86;
- }
- }
- if (other.int64Field87_ != null) {
- if (int64Field87_ == null || other.Int64Field87 != 0L) {
- Int64Field87 = other.Int64Field87;
- }
- }
- if (other.int64Field125_ != null) {
- if (int64Field125_ == null || other.Int64Field125 != 0L) {
- Int64Field125 = other.Int64Field125;
- }
- }
- if (other.int64Field37_ != null) {
- if (int64Field37_ == null || other.Int64Field37 != 0L) {
- Int64Field37 = other.Int64Field37;
- }
- }
- if (other.doubleField38_ != null) {
- if (doubleField38_ == null || other.DoubleField38 != 0D) {
- DoubleField38 = other.DoubleField38;
- }
- }
- if (other.interactions_ != null) {
- if (interactions_ == null || other.Interactions != 0L) {
- Interactions = other.Interactions;
- }
- }
- repeatedIntField100_.Add(other.repeatedIntField100_);
- if (other.doubleField40_ != null) {
- if (doubleField40_ == null || other.DoubleField40 != 0D) {
- DoubleField40 = other.DoubleField40;
- }
- }
- if (other.int64Field41_ != null) {
- if (int64Field41_ == null || other.Int64Field41 != 0L) {
- Int64Field41 = other.Int64Field41;
- }
- }
- if (other.int64Field126_ != null) {
- if (int64Field126_ == null || other.Int64Field126 != 0L) {
- Int64Field126 = other.Int64Field126;
- }
- }
- if (other.int64Field127_ != null) {
- if (int64Field127_ == null || other.Int64Field127 != 0L) {
- Int64Field127 = other.Int64Field127;
- }
- }
- if (other.doubleField128_ != null) {
- if (doubleField128_ == null || other.DoubleField128 != 0D) {
- DoubleField128 = other.DoubleField128;
- }
- }
- if (other.doubleField109_ != null) {
- if (doubleField109_ == null || other.DoubleField109 != 0D) {
- DoubleField109 = other.DoubleField109;
- }
- }
- if (other.int64Field110_ != null) {
- if (int64Field110_ == null || other.Int64Field110 != 0L) {
- Int64Field110 = other.Int64Field110;
- }
- }
- if (other.doubleField111_ != null) {
- if (doubleField111_ == null || other.DoubleField111 != 0D) {
- DoubleField111 = other.DoubleField111;
- }
- }
- if (other.int64Field112_ != null) {
- if (int64Field112_ == null || other.Int64Field112 != 0L) {
- Int64Field112 = other.Int64Field112;
- }
- }
- if (other.doubleField113_ != null) {
- if (doubleField113_ == null || other.DoubleField113 != 0D) {
- DoubleField113 = other.DoubleField113;
- }
- }
- if (other.int64Field114_ != null) {
- if (int64Field114_ == null || other.Int64Field114 != 0L) {
- Int64Field114 = other.Int64Field114;
- }
- }
- if (other.doubleField42_ != null) {
- if (doubleField42_ == null || other.DoubleField42 != 0D) {
- DoubleField42 = other.DoubleField42;
- }
- }
- if (other.int64Field43_ != null) {
- if (int64Field43_ == null || other.Int64Field43 != 0L) {
- Int64Field43 = other.Int64Field43;
- }
- }
- if (other.int64Field44_ != null) {
- if (int64Field44_ == null || other.Int64Field44 != 0L) {
- Int64Field44 = other.Int64Field44;
- }
- }
- if (other.doubleField45_ != null) {
- if (doubleField45_ == null || other.DoubleField45 != 0D) {
- DoubleField45 = other.DoubleField45;
- }
- }
- if (other.doubleField46_ != null) {
- if (doubleField46_ == null || other.DoubleField46 != 0D) {
- DoubleField46 = other.DoubleField46;
- }
- }
- if (other.doubleField78_ != null) {
- if (doubleField78_ == null || other.DoubleField78 != 0D) {
- DoubleField78 = other.DoubleField78;
- }
- }
- if (other.doubleField88_ != null) {
- if (doubleField88_ == null || other.DoubleField88 != 0D) {
- DoubleField88 = other.DoubleField88;
- }
- }
- if (other.doubleField47_ != null) {
- if (doubleField47_ == null || other.DoubleField47 != 0D) {
- DoubleField47 = other.DoubleField47;
- }
- }
- if (other.doubleField89_ != null) {
- if (doubleField89_ == null || other.DoubleField89 != 0D) {
- DoubleField89 = other.DoubleField89;
- }
- }
- if (other.doubleField48_ != null) {
- if (doubleField48_ == null || other.DoubleField48 != 0D) {
- DoubleField48 = other.DoubleField48;
- }
- }
- if (other.doubleField49_ != null) {
- if (doubleField49_ == null || other.DoubleField49 != 0D) {
- DoubleField49 = other.DoubleField49;
- }
- }
- if (other.doubleField50_ != null) {
- if (doubleField50_ == null || other.DoubleField50 != 0D) {
- DoubleField50 = other.DoubleField50;
- }
- }
- if (other.doubleField90_ != null) {
- if (doubleField90_ == null || other.DoubleField90 != 0D) {
- DoubleField90 = other.DoubleField90;
- }
- }
- if (other.doubleField51_ != null) {
- if (doubleField51_ == null || other.DoubleField51 != 0D) {
- DoubleField51 = other.DoubleField51;
- }
- }
- if (other.doubleField91_ != null) {
- if (doubleField91_ == null || other.DoubleField91 != 0D) {
- DoubleField91 = other.DoubleField91;
- }
- }
- if (other.doubleField92_ != null) {
- if (doubleField92_ == null || other.DoubleField92 != 0D) {
- DoubleField92 = other.DoubleField92;
- }
- }
- if (other.int64Field107_ != null) {
- if (int64Field107_ == null || other.Int64Field107 != 0L) {
- Int64Field107 = other.Int64Field107;
- }
- }
- if (other.doubleField93_ != null) {
- if (doubleField93_ == null || other.DoubleField93 != 0D) {
- DoubleField93 = other.DoubleField93;
- }
- }
- if (other.doubleField108_ != null) {
- if (doubleField108_ == null || other.DoubleField108 != 0D) {
- DoubleField108 = other.DoubleField108;
- }
- }
- if (other.doubleField52_ != null) {
- if (doubleField52_ == null || other.DoubleField52 != 0D) {
- DoubleField52 = other.DoubleField52;
- }
- }
- if (other.doubleField53_ != null) {
- if (doubleField53_ == null || other.DoubleField53 != 0D) {
- DoubleField53 = other.DoubleField53;
- }
- }
- if (other.doubleField94_ != null) {
- if (doubleField94_ == null || other.DoubleField94 != 0D) {
- DoubleField94 = other.DoubleField94;
- }
- }
- if (other.doubleField54_ != null) {
- if (doubleField54_ == null || other.DoubleField54 != 0D) {
- DoubleField54 = other.DoubleField54;
- }
- }
- if (other.doubleField55_ != null) {
- if (doubleField55_ == null || other.DoubleField55 != 0D) {
- DoubleField55 = other.DoubleField55;
- }
- }
- if (other.doubleField56_ != null) {
- if (doubleField56_ == null || other.DoubleField56 != 0D) {
- DoubleField56 = other.DoubleField56;
- }
- }
- if (other.doubleField57_ != null) {
- if (doubleField57_ == null || other.DoubleField57 != 0D) {
- DoubleField57 = other.DoubleField57;
- }
- }
- if (other.doubleField58_ != null) {
- if (doubleField58_ == null || other.DoubleField58 != 0D) {
- DoubleField58 = other.DoubleField58;
- }
- }
- if (other.int64Field59_ != null) {
- if (int64Field59_ == null || other.Int64Field59 != 0L) {
- Int64Field59 = other.Int64Field59;
- }
- }
- if (other.int64Field60_ != null) {
- if (int64Field60_ == null || other.Int64Field60 != 0L) {
- Int64Field60 = other.Int64Field60;
- }
- }
- _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public void MergeFrom(pb::CodedInputStream input) {
- #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
- input.ReadRawMessage(this);
- #else
- uint tag;
- while ((tag = input.ReadTag()) != 0) {
- switch(tag) {
- default:
- _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
- break;
- case 10: {
- double? value = _single_doubleField1_codec.Read(input);
- if (doubleField1_ == null || value != 0D) {
- DoubleField1 = value;
- }
- break;
- }
- case 18: {
- long? value = _single_int64Field2_codec.Read(input);
- if (int64Field2_ == null || value != 0L) {
- Int64Field2 = value;
- }
- break;
- }
- case 26: {
- long? value = _single_int64Field3_codec.Read(input);
- if (int64Field3_ == null || value != 0L) {
- Int64Field3 = value;
- }
- break;
- }
- case 34: {
- long? value = _single_int64Field4_codec.Read(input);
- if (int64Field4_ == null || value != 0L) {
- Int64Field4 = value;
- }
- break;
- }
- case 58: {
- double? value = _single_doubleField7_codec.Read(input);
- if (doubleField7_ == null || value != 0D) {
- DoubleField7 = value;
- }
- break;
- }
- case 66: {
- double? value = _single_doubleField8_codec.Read(input);
- if (doubleField8_ == null || value != 0D) {
- DoubleField8 = value;
- }
- break;
- }
- case 74: {
- double? value = _single_doubleField9_codec.Read(input);
- if (doubleField9_ == null || value != 0D) {
- DoubleField9 = value;
- }
- break;
- }
- case 82: {
- double? value = _single_doubleField10_codec.Read(input);
- if (doubleField10_ == null || value != 0D) {
- DoubleField10 = value;
- }
- break;
- }
- case 90: {
- double? value = _single_doubleField11_codec.Read(input);
- if (doubleField11_ == null || value != 0D) {
- DoubleField11 = value;
- }
- break;
- }
- case 114: {
- double? value = _single_doubleField14_codec.Read(input);
- if (doubleField14_ == null || value != 0D) {
- DoubleField14 = value;
- }
- break;
- }
- case 122: {
- double? value = _single_doubleField15_codec.Read(input);
- if (doubleField15_ == null || value != 0D) {
- DoubleField15 = value;
- }
- break;
- }
- case 154: {
- long? value = _single_int64Field19_codec.Read(input);
- if (int64Field19_ == null || value != 0L) {
- Int64Field19 = value;
- }
- break;
- }
- case 162: {
- double? value = _single_doubleField20_codec.Read(input);
- if (doubleField20_ == null || value != 0D) {
- DoubleField20 = value;
- }
- break;
- }
- case 170: {
- double? value = _single_doubleField21_codec.Read(input);
- if (doubleField21_ == null || value != 0D) {
- DoubleField21 = value;
- }
- break;
- }
- case 178: {
- double? value = _single_doubleField22_codec.Read(input);
- if (doubleField22_ == null || value != 0D) {
- DoubleField22 = value;
- }
- break;
- }
- case 202: {
- double? value = _single_doubleField25_codec.Read(input);
- if (doubleField25_ == null || value != 0D) {
- DoubleField25 = value;
- }
- break;
- }
- case 210: {
- long? value = _single_int64Field26_codec.Read(input);
- if (int64Field26_ == null || value != 0L) {
- Int64Field26 = value;
- }
- break;
- }
- case 226: {
- double? value = _single_doubleField28_codec.Read(input);
- if (doubleField28_ == null || value != 0D) {
- DoubleField28 = value;
- }
- break;
- }
- case 234: {
- double? value = _single_doubleField29_codec.Read(input);
- if (doubleField29_ == null || value != 0D) {
- DoubleField29 = value;
- }
- break;
- }
- case 242: {
- double? value = _single_doubleField30_codec.Read(input);
- if (doubleField30_ == null || value != 0D) {
- DoubleField30 = value;
- }
- break;
- }
- case 250: {
- double? value = _single_doubleField31_codec.Read(input);
- if (doubleField31_ == null || value != 0D) {
- DoubleField31 = value;
- }
- break;
- }
- case 258: {
- long? value = _single_int64Field32_codec.Read(input);
- if (int64Field32_ == null || value != 0L) {
- Int64Field32 = value;
- }
- break;
- }
- case 298: {
- long? value = _single_int64Field37_codec.Read(input);
- if (int64Field37_ == null || value != 0L) {
- Int64Field37 = value;
- }
- break;
- }
- case 306: {
- double? value = _single_doubleField38_codec.Read(input);
- if (doubleField38_ == null || value != 0D) {
- DoubleField38 = value;
- }
- break;
- }
- case 314: {
- long? value = _single_interactions_codec.Read(input);
- if (interactions_ == null || value != 0L) {
- Interactions = value;
- }
- break;
- }
- case 322: {
- double? value = _single_doubleField40_codec.Read(input);
- if (doubleField40_ == null || value != 0D) {
- DoubleField40 = value;
- }
- break;
- }
- case 330: {
- long? value = _single_int64Field41_codec.Read(input);
- if (int64Field41_ == null || value != 0L) {
- Int64Field41 = value;
- }
- break;
- }
- case 338: {
- double? value = _single_doubleField42_codec.Read(input);
- if (doubleField42_ == null || value != 0D) {
- DoubleField42 = value;
- }
- break;
- }
- case 346: {
- long? value = _single_int64Field43_codec.Read(input);
- if (int64Field43_ == null || value != 0L) {
- Int64Field43 = value;
- }
- break;
- }
- case 354: {
- long? value = _single_int64Field44_codec.Read(input);
- if (int64Field44_ == null || value != 0L) {
- Int64Field44 = value;
- }
- break;
- }
- case 362: {
- double? value = _single_doubleField45_codec.Read(input);
- if (doubleField45_ == null || value != 0D) {
- DoubleField45 = value;
- }
- break;
- }
- case 370: {
- double? value = _single_doubleField46_codec.Read(input);
- if (doubleField46_ == null || value != 0D) {
- DoubleField46 = value;
- }
- break;
- }
- case 378: {
- double? value = _single_doubleField47_codec.Read(input);
- if (doubleField47_ == null || value != 0D) {
- DoubleField47 = value;
- }
- break;
- }
- case 386: {
- double? value = _single_doubleField48_codec.Read(input);
- if (doubleField48_ == null || value != 0D) {
- DoubleField48 = value;
- }
- break;
- }
- case 394: {
- double? value = _single_doubleField49_codec.Read(input);
- if (doubleField49_ == null || value != 0D) {
- DoubleField49 = value;
- }
- break;
- }
- case 402: {
- double? value = _single_doubleField50_codec.Read(input);
- if (doubleField50_ == null || value != 0D) {
- DoubleField50 = value;
- }
- break;
- }
- case 410: {
- double? value = _single_doubleField51_codec.Read(input);
- if (doubleField51_ == null || value != 0D) {
- DoubleField51 = value;
- }
- break;
- }
- case 418: {
- double? value = _single_doubleField52_codec.Read(input);
- if (doubleField52_ == null || value != 0D) {
- DoubleField52 = value;
- }
- break;
- }
- case 426: {
- double? value = _single_doubleField53_codec.Read(input);
- if (doubleField53_ == null || value != 0D) {
- DoubleField53 = value;
- }
- break;
- }
- case 434: {
- double? value = _single_doubleField54_codec.Read(input);
- if (doubleField54_ == null || value != 0D) {
- DoubleField54 = value;
- }
- break;
- }
- case 442: {
- double? value = _single_doubleField55_codec.Read(input);
- if (doubleField55_ == null || value != 0D) {
- DoubleField55 = value;
- }
- break;
- }
- case 450: {
- double? value = _single_doubleField56_codec.Read(input);
- if (doubleField56_ == null || value != 0D) {
- DoubleField56 = value;
- }
- break;
- }
- case 458: {
- double? value = _single_doubleField57_codec.Read(input);
- if (doubleField57_ == null || value != 0D) {
- DoubleField57 = value;
- }
- break;
- }
- case 466: {
- double? value = _single_doubleField58_codec.Read(input);
- if (doubleField58_ == null || value != 0D) {
- DoubleField58 = value;
- }
- break;
- }
- case 474: {
- long? value = _single_int64Field59_codec.Read(input);
- if (int64Field59_ == null || value != 0L) {
- Int64Field59 = value;
- }
- break;
- }
- case 482: {
- long? value = _single_int64Field60_codec.Read(input);
- if (int64Field60_ == null || value != 0L) {
- Int64Field60 = value;
- }
- break;
- }
- case 498: {
- double? value = _single_doubleField62_codec.Read(input);
- if (doubleField62_ == null || value != 0D) {
- DoubleField62 = value;
- }
- break;
- }
- case 522: {
- double? value = _single_doubleField65_codec.Read(input);
- if (doubleField65_ == null || value != 0D) {
- DoubleField65 = value;
- }
- break;
- }
- case 530: {
- double? value = _single_doubleField66_codec.Read(input);
- if (doubleField66_ == null || value != 0D) {
- DoubleField66 = value;
- }
- break;
- }
- case 538: {
- double? value = _single_doubleField67_codec.Read(input);
- if (doubleField67_ == null || value != 0D) {
- DoubleField67 = value;
- }
- break;
- }
- case 546: {
- double? value = _single_doubleField68_codec.Read(input);
- if (doubleField68_ == null || value != 0D) {
- DoubleField68 = value;
- }
- break;
- }
- case 554: {
- double? value = _single_doubleField69_codec.Read(input);
- if (doubleField69_ == null || value != 0D) {
- DoubleField69 = value;
- }
- break;
- }
- case 562: {
- double? value = _single_doubleField70_codec.Read(input);
- if (doubleField70_ == null || value != 0D) {
- DoubleField70 = value;
- }
- break;
- }
- case 570: {
- double? value = _single_doubleField71_codec.Read(input);
- if (doubleField71_ == null || value != 0D) {
- DoubleField71 = value;
- }
- break;
- }
- case 578: {
- double? value = _single_doubleField72_codec.Read(input);
- if (doubleField72_ == null || value != 0D) {
- DoubleField72 = value;
- }
- break;
- }
- case 586: {
- string value = _single_stringField73_codec.Read(input);
- if (stringField73_ == null || value != "") {
- StringField73 = value;
- }
- break;
- }
- case 594: {
- string value = _single_stringField74_codec.Read(input);
- if (stringField74_ == null || value != "") {
- StringField74 = value;
- }
- break;
- }
- case 602: {
- double? value = _single_doubleField75_codec.Read(input);
- if (doubleField75_ == null || value != 0D) {
- DoubleField75 = value;
- }
- break;
- }
- case 618: {
- double? value = _single_doubleField77_codec.Read(input);
- if (doubleField77_ == null || value != 0D) {
- DoubleField77 = value;
- }
- break;
- }
- case 626: {
- double? value = _single_doubleField78_codec.Read(input);
- if (doubleField78_ == null || value != 0D) {
- DoubleField78 = value;
- }
- break;
- }
- case 634: {
- double? value = _single_doubleField79_codec.Read(input);
- if (doubleField79_ == null || value != 0D) {
- DoubleField79 = value;
- }
- break;
- }
- case 640: {
- EnumField80 = input.ReadInt32();
- break;
- }
- case 648: {
- EnumField81 = input.ReadInt32();
- break;
- }
- case 658: {
- long? value = _single_int64Field82_codec.Read(input);
- if (int64Field82_ == null || value != 0L) {
- Int64Field82 = value;
- }
- break;
- }
- case 664: {
- EnumField83 = input.ReadInt32();
- break;
- }
- case 674: {
- double? value = _single_doubleField84_codec.Read(input);
- if (doubleField84_ == null || value != 0D) {
- DoubleField84 = value;
- }
- break;
- }
- case 682: {
- long? value = _single_int64Field85_codec.Read(input);
- if (int64Field85_ == null || value != 0L) {
- Int64Field85 = value;
- }
- break;
- }
- case 690: {
- long? value = _single_int64Field86_codec.Read(input);
- if (int64Field86_ == null || value != 0L) {
- Int64Field86 = value;
- }
- break;
- }
- case 698: {
- long? value = _single_int64Field87_codec.Read(input);
- if (int64Field87_ == null || value != 0L) {
- Int64Field87 = value;
- }
- break;
- }
- case 706: {
- double? value = _single_doubleField88_codec.Read(input);
- if (doubleField88_ == null || value != 0D) {
- DoubleField88 = value;
- }
- break;
- }
- case 714: {
- double? value = _single_doubleField89_codec.Read(input);
- if (doubleField89_ == null || value != 0D) {
- DoubleField89 = value;
- }
- break;
- }
- case 722: {
- double? value = _single_doubleField90_codec.Read(input);
- if (doubleField90_ == null || value != 0D) {
- DoubleField90 = value;
- }
- break;
- }
- case 730: {
- double? value = _single_doubleField91_codec.Read(input);
- if (doubleField91_ == null || value != 0D) {
- DoubleField91 = value;
- }
- break;
- }
- case 738: {
- double? value = _single_doubleField92_codec.Read(input);
- if (doubleField92_ == null || value != 0D) {
- DoubleField92 = value;
- }
- break;
- }
- case 746: {
- double? value = _single_doubleField93_codec.Read(input);
- if (doubleField93_ == null || value != 0D) {
- DoubleField93 = value;
- }
- break;
- }
- case 754: {
- double? value = _single_doubleField94_codec.Read(input);
- if (doubleField94_ == null || value != 0D) {
- DoubleField94 = value;
- }
- break;
- }
- case 762: {
- double? value = _single_doubleField95_codec.Read(input);
- if (doubleField95_ == null || value != 0D) {
- DoubleField95 = value;
- }
- break;
- }
- case 770: {
- double? value = _single_doubleField96_codec.Read(input);
- if (doubleField96_ == null || value != 0D) {
- DoubleField96 = value;
- }
- break;
- }
- case 778: {
- double? value = _single_doubleField97_codec.Read(input);
- if (doubleField97_ == null || value != 0D) {
- DoubleField97 = value;
- }
- break;
- }
- case 786: {
- double? value = _single_doubleField98_codec.Read(input);
- if (doubleField98_ == null || value != 0D) {
- DoubleField98 = value;
- }
- break;
- }
- case 794: {
- double? value = _single_doubleField99_codec.Read(input);
- if (doubleField99_ == null || value != 0D) {
- DoubleField99 = value;
- }
- break;
- }
- case 802:
- case 800: {
- repeatedIntField100_.AddEntriesFrom(input, _repeated_repeatedIntField100_codec);
- break;
- }
- case 810: {
- double? value = _single_doubleField101_codec.Read(input);
- if (doubleField101_ == null || value != 0D) {
- DoubleField101 = value;
- }
- break;
- }
- case 818: {
- double? value = _single_doubleField102_codec.Read(input);
- if (doubleField102_ == null || value != 0D) {
- DoubleField102 = value;
- }
- break;
- }
- case 826: {
- double? value = _single_doubleField103_codec.Read(input);
- if (doubleField103_ == null || value != 0D) {
- DoubleField103 = value;
- }
- break;
- }
- case 834: {
- double? value = _single_doubleField104_codec.Read(input);
- if (doubleField104_ == null || value != 0D) {
- DoubleField104 = value;
- }
- break;
- }
- case 842: {
- double? value = _single_doubleField105_codec.Read(input);
- if (doubleField105_ == null || value != 0D) {
- DoubleField105 = value;
- }
- break;
- }
- case 850: {
- double? value = _single_doubleField106_codec.Read(input);
- if (doubleField106_ == null || value != 0D) {
- DoubleField106 = value;
- }
- break;
- }
- case 858: {
- long? value = _single_int64Field107_codec.Read(input);
- if (int64Field107_ == null || value != 0L) {
- Int64Field107 = value;
- }
- break;
- }
- case 866: {
- double? value = _single_doubleField108_codec.Read(input);
- if (doubleField108_ == null || value != 0D) {
- DoubleField108 = value;
- }
- break;
- }
- case 874: {
- double? value = _single_doubleField109_codec.Read(input);
- if (doubleField109_ == null || value != 0D) {
- DoubleField109 = value;
- }
- break;
- }
- case 882: {
- long? value = _single_int64Field110_codec.Read(input);
- if (int64Field110_ == null || value != 0L) {
- Int64Field110 = value;
- }
- break;
- }
- case 890: {
- double? value = _single_doubleField111_codec.Read(input);
- if (doubleField111_ == null || value != 0D) {
- DoubleField111 = value;
- }
- break;
- }
- case 898: {
- long? value = _single_int64Field112_codec.Read(input);
- if (int64Field112_ == null || value != 0L) {
- Int64Field112 = value;
- }
- break;
- }
- case 906: {
- double? value = _single_doubleField113_codec.Read(input);
- if (doubleField113_ == null || value != 0D) {
- DoubleField113 = value;
- }
- break;
- }
- case 914: {
- long? value = _single_int64Field114_codec.Read(input);
- if (int64Field114_ == null || value != 0L) {
- Int64Field114 = value;
- }
- break;
- }
- case 922: {
- long? value = _single_int64Field115_codec.Read(input);
- if (int64Field115_ == null || value != 0L) {
- Int64Field115 = value;
- }
- break;
- }
- case 930: {
- double? value = _single_doubleField116_codec.Read(input);
- if (doubleField116_ == null || value != 0D) {
- DoubleField116 = value;
- }
- break;
- }
- case 938: {
- long? value = _single_int64Field117_codec.Read(input);
- if (int64Field117_ == null || value != 0L) {
- Int64Field117 = value;
- }
- break;
- }
- case 946: {
- double? value = _single_doubleField118_codec.Read(input);
- if (doubleField118_ == null || value != 0D) {
- DoubleField118 = value;
- }
- break;
- }
- case 954: {
- double? value = _single_doubleField119_codec.Read(input);
- if (doubleField119_ == null || value != 0D) {
- DoubleField119 = value;
- }
- break;
- }
- case 962: {
- double? value = _single_doubleField120_codec.Read(input);
- if (doubleField120_ == null || value != 0D) {
- DoubleField120 = value;
- }
- break;
- }
- case 970: {
- double? value = _single_doubleField121_codec.Read(input);
- if (doubleField121_ == null || value != 0D) {
- DoubleField121 = value;
- }
- break;
- }
- case 978: {
- double? value = _single_doubleField122_codec.Read(input);
- if (doubleField122_ == null || value != 0D) {
- DoubleField122 = value;
- }
- break;
- }
- case 986: {
- double? value = _single_doubleField123_codec.Read(input);
- if (doubleField123_ == null || value != 0D) {
- DoubleField123 = value;
- }
- break;
- }
- case 994: {
- double? value = _single_doubleField124_codec.Read(input);
- if (doubleField124_ == null || value != 0D) {
- DoubleField124 = value;
- }
- break;
- }
- case 1002: {
- long? value = _single_int64Field125_codec.Read(input);
- if (int64Field125_ == null || value != 0L) {
- Int64Field125 = value;
- }
- break;
- }
- case 1010: {
- long? value = _single_int64Field126_codec.Read(input);
- if (int64Field126_ == null || value != 0L) {
- Int64Field126 = value;
- }
- break;
- }
- case 1018: {
- long? value = _single_int64Field127_codec.Read(input);
- if (int64Field127_ == null || value != 0L) {
- Int64Field127 = value;
- }
- break;
- }
- case 1026: {
- double? value = _single_doubleField128_codec.Read(input);
- if (doubleField128_ == null || value != 0D) {
- DoubleField128 = value;
- }
- break;
- }
- case 1034: {
- double? value = _single_doubleField129_codec.Read(input);
- if (doubleField129_ == null || value != 0D) {
- DoubleField129 = value;
- }
- break;
- }
- }
- }
- #endif
- }
-
- #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
- uint tag;
- while ((tag = input.ReadTag()) != 0) {
- switch(tag) {
- default:
- _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
- break;
- case 10: {
- double? value = _single_doubleField1_codec.Read(ref input);
- if (doubleField1_ == null || value != 0D) {
- DoubleField1 = value;
- }
- break;
- }
- case 18: {
- long? value = _single_int64Field2_codec.Read(ref input);
- if (int64Field2_ == null || value != 0L) {
- Int64Field2 = value;
- }
- break;
- }
- case 26: {
- long? value = _single_int64Field3_codec.Read(ref input);
- if (int64Field3_ == null || value != 0L) {
- Int64Field3 = value;
- }
- break;
- }
- case 34: {
- long? value = _single_int64Field4_codec.Read(ref input);
- if (int64Field4_ == null || value != 0L) {
- Int64Field4 = value;
- }
- break;
- }
- case 58: {
- double? value = _single_doubleField7_codec.Read(ref input);
- if (doubleField7_ == null || value != 0D) {
- DoubleField7 = value;
- }
- break;
- }
- case 66: {
- double? value = _single_doubleField8_codec.Read(ref input);
- if (doubleField8_ == null || value != 0D) {
- DoubleField8 = value;
- }
- break;
- }
- case 74: {
- double? value = _single_doubleField9_codec.Read(ref input);
- if (doubleField9_ == null || value != 0D) {
- DoubleField9 = value;
- }
- break;
- }
- case 82: {
- double? value = _single_doubleField10_codec.Read(ref input);
- if (doubleField10_ == null || value != 0D) {
- DoubleField10 = value;
- }
- break;
- }
- case 90: {
- double? value = _single_doubleField11_codec.Read(ref input);
- if (doubleField11_ == null || value != 0D) {
- DoubleField11 = value;
- }
- break;
- }
- case 114: {
- double? value = _single_doubleField14_codec.Read(ref input);
- if (doubleField14_ == null || value != 0D) {
- DoubleField14 = value;
- }
- break;
- }
- case 122: {
- double? value = _single_doubleField15_codec.Read(ref input);
- if (doubleField15_ == null || value != 0D) {
- DoubleField15 = value;
- }
- break;
- }
- case 154: {
- long? value = _single_int64Field19_codec.Read(ref input);
- if (int64Field19_ == null || value != 0L) {
- Int64Field19 = value;
- }
- break;
- }
- case 162: {
- double? value = _single_doubleField20_codec.Read(ref input);
- if (doubleField20_ == null || value != 0D) {
- DoubleField20 = value;
- }
- break;
- }
- case 170: {
- double? value = _single_doubleField21_codec.Read(ref input);
- if (doubleField21_ == null || value != 0D) {
- DoubleField21 = value;
- }
- break;
- }
- case 178: {
- double? value = _single_doubleField22_codec.Read(ref input);
- if (doubleField22_ == null || value != 0D) {
- DoubleField22 = value;
- }
- break;
- }
- case 202: {
- double? value = _single_doubleField25_codec.Read(ref input);
- if (doubleField25_ == null || value != 0D) {
- DoubleField25 = value;
- }
- break;
- }
- case 210: {
- long? value = _single_int64Field26_codec.Read(ref input);
- if (int64Field26_ == null || value != 0L) {
- Int64Field26 = value;
- }
- break;
- }
- case 226: {
- double? value = _single_doubleField28_codec.Read(ref input);
- if (doubleField28_ == null || value != 0D) {
- DoubleField28 = value;
- }
- break;
- }
- case 234: {
- double? value = _single_doubleField29_codec.Read(ref input);
- if (doubleField29_ == null || value != 0D) {
- DoubleField29 = value;
- }
- break;
- }
- case 242: {
- double? value = _single_doubleField30_codec.Read(ref input);
- if (doubleField30_ == null || value != 0D) {
- DoubleField30 = value;
- }
- break;
- }
- case 250: {
- double? value = _single_doubleField31_codec.Read(ref input);
- if (doubleField31_ == null || value != 0D) {
- DoubleField31 = value;
- }
- break;
- }
- case 258: {
- long? value = _single_int64Field32_codec.Read(ref input);
- if (int64Field32_ == null || value != 0L) {
- Int64Field32 = value;
- }
- break;
- }
- case 298: {
- long? value = _single_int64Field37_codec.Read(ref input);
- if (int64Field37_ == null || value != 0L) {
- Int64Field37 = value;
- }
- break;
- }
- case 306: {
- double? value = _single_doubleField38_codec.Read(ref input);
- if (doubleField38_ == null || value != 0D) {
- DoubleField38 = value;
- }
- break;
- }
- case 314: {
- long? value = _single_interactions_codec.Read(ref input);
- if (interactions_ == null || value != 0L) {
- Interactions = value;
- }
- break;
- }
- case 322: {
- double? value = _single_doubleField40_codec.Read(ref input);
- if (doubleField40_ == null || value != 0D) {
- DoubleField40 = value;
- }
- break;
- }
- case 330: {
- long? value = _single_int64Field41_codec.Read(ref input);
- if (int64Field41_ == null || value != 0L) {
- Int64Field41 = value;
- }
- break;
- }
- case 338: {
- double? value = _single_doubleField42_codec.Read(ref input);
- if (doubleField42_ == null || value != 0D) {
- DoubleField42 = value;
- }
- break;
- }
- case 346: {
- long? value = _single_int64Field43_codec.Read(ref input);
- if (int64Field43_ == null || value != 0L) {
- Int64Field43 = value;
- }
- break;
- }
- case 354: {
- long? value = _single_int64Field44_codec.Read(ref input);
- if (int64Field44_ == null || value != 0L) {
- Int64Field44 = value;
- }
- break;
- }
- case 362: {
- double? value = _single_doubleField45_codec.Read(ref input);
- if (doubleField45_ == null || value != 0D) {
- DoubleField45 = value;
- }
- break;
- }
- case 370: {
- double? value = _single_doubleField46_codec.Read(ref input);
- if (doubleField46_ == null || value != 0D) {
- DoubleField46 = value;
- }
- break;
- }
- case 378: {
- double? value = _single_doubleField47_codec.Read(ref input);
- if (doubleField47_ == null || value != 0D) {
- DoubleField47 = value;
- }
- break;
- }
- case 386: {
- double? value = _single_doubleField48_codec.Read(ref input);
- if (doubleField48_ == null || value != 0D) {
- DoubleField48 = value;
- }
- break;
- }
- case 394: {
- double? value = _single_doubleField49_codec.Read(ref input);
- if (doubleField49_ == null || value != 0D) {
- DoubleField49 = value;
- }
- break;
- }
- case 402: {
- double? value = _single_doubleField50_codec.Read(ref input);
- if (doubleField50_ == null || value != 0D) {
- DoubleField50 = value;
- }
- break;
- }
- case 410: {
- double? value = _single_doubleField51_codec.Read(ref input);
- if (doubleField51_ == null || value != 0D) {
- DoubleField51 = value;
- }
- break;
- }
- case 418: {
- double? value = _single_doubleField52_codec.Read(ref input);
- if (doubleField52_ == null || value != 0D) {
- DoubleField52 = value;
- }
- break;
- }
- case 426: {
- double? value = _single_doubleField53_codec.Read(ref input);
- if (doubleField53_ == null || value != 0D) {
- DoubleField53 = value;
- }
- break;
- }
- case 434: {
- double? value = _single_doubleField54_codec.Read(ref input);
- if (doubleField54_ == null || value != 0D) {
- DoubleField54 = value;
- }
- break;
- }
- case 442: {
- double? value = _single_doubleField55_codec.Read(ref input);
- if (doubleField55_ == null || value != 0D) {
- DoubleField55 = value;
- }
- break;
- }
- case 450: {
- double? value = _single_doubleField56_codec.Read(ref input);
- if (doubleField56_ == null || value != 0D) {
- DoubleField56 = value;
- }
- break;
- }
- case 458: {
- double? value = _single_doubleField57_codec.Read(ref input);
- if (doubleField57_ == null || value != 0D) {
- DoubleField57 = value;
- }
- break;
- }
- case 466: {
- double? value = _single_doubleField58_codec.Read(ref input);
- if (doubleField58_ == null || value != 0D) {
- DoubleField58 = value;
- }
- break;
- }
- case 474: {
- long? value = _single_int64Field59_codec.Read(ref input);
- if (int64Field59_ == null || value != 0L) {
- Int64Field59 = value;
- }
- break;
- }
- case 482: {
- long? value = _single_int64Field60_codec.Read(ref input);
- if (int64Field60_ == null || value != 0L) {
- Int64Field60 = value;
- }
- break;
- }
- case 498: {
- double? value = _single_doubleField62_codec.Read(ref input);
- if (doubleField62_ == null || value != 0D) {
- DoubleField62 = value;
- }
- break;
- }
- case 522: {
- double? value = _single_doubleField65_codec.Read(ref input);
- if (doubleField65_ == null || value != 0D) {
- DoubleField65 = value;
- }
- break;
- }
- case 530: {
- double? value = _single_doubleField66_codec.Read(ref input);
- if (doubleField66_ == null || value != 0D) {
- DoubleField66 = value;
- }
- break;
- }
- case 538: {
- double? value = _single_doubleField67_codec.Read(ref input);
- if (doubleField67_ == null || value != 0D) {
- DoubleField67 = value;
- }
- break;
- }
- case 546: {
- double? value = _single_doubleField68_codec.Read(ref input);
- if (doubleField68_ == null || value != 0D) {
- DoubleField68 = value;
- }
- break;
- }
- case 554: {
- double? value = _single_doubleField69_codec.Read(ref input);
- if (doubleField69_ == null || value != 0D) {
- DoubleField69 = value;
- }
- break;
- }
- case 562: {
- double? value = _single_doubleField70_codec.Read(ref input);
- if (doubleField70_ == null || value != 0D) {
- DoubleField70 = value;
- }
- break;
- }
- case 570: {
- double? value = _single_doubleField71_codec.Read(ref input);
- if (doubleField71_ == null || value != 0D) {
- DoubleField71 = value;
- }
- break;
- }
- case 578: {
- double? value = _single_doubleField72_codec.Read(ref input);
- if (doubleField72_ == null || value != 0D) {
- DoubleField72 = value;
- }
- break;
- }
- case 586: {
- string value = _single_stringField73_codec.Read(ref input);
- if (stringField73_ == null || value != "") {
- StringField73 = value;
- }
- break;
- }
- case 594: {
- string value = _single_stringField74_codec.Read(ref input);
- if (stringField74_ == null || value != "") {
- StringField74 = value;
- }
- break;
- }
- case 602: {
- double? value = _single_doubleField75_codec.Read(ref input);
- if (doubleField75_ == null || value != 0D) {
- DoubleField75 = value;
- }
- break;
- }
- case 618: {
- double? value = _single_doubleField77_codec.Read(ref input);
- if (doubleField77_ == null || value != 0D) {
- DoubleField77 = value;
- }
- break;
- }
- case 626: {
- double? value = _single_doubleField78_codec.Read(ref input);
- if (doubleField78_ == null || value != 0D) {
- DoubleField78 = value;
- }
- break;
- }
- case 634: {
- double? value = _single_doubleField79_codec.Read(ref input);
- if (doubleField79_ == null || value != 0D) {
- DoubleField79 = value;
- }
- break;
- }
- case 640: {
- EnumField80 = input.ReadInt32();
- break;
- }
- case 648: {
- EnumField81 = input.ReadInt32();
- break;
- }
- case 658: {
- long? value = _single_int64Field82_codec.Read(ref input);
- if (int64Field82_ == null || value != 0L) {
- Int64Field82 = value;
- }
- break;
- }
- case 664: {
- EnumField83 = input.ReadInt32();
- break;
- }
- case 674: {
- double? value = _single_doubleField84_codec.Read(ref input);
- if (doubleField84_ == null || value != 0D) {
- DoubleField84 = value;
- }
- break;
- }
- case 682: {
- long? value = _single_int64Field85_codec.Read(ref input);
- if (int64Field85_ == null || value != 0L) {
- Int64Field85 = value;
- }
- break;
- }
- case 690: {
- long? value = _single_int64Field86_codec.Read(ref input);
- if (int64Field86_ == null || value != 0L) {
- Int64Field86 = value;
- }
- break;
- }
- case 698: {
- long? value = _single_int64Field87_codec.Read(ref input);
- if (int64Field87_ == null || value != 0L) {
- Int64Field87 = value;
- }
- break;
- }
- case 706: {
- double? value = _single_doubleField88_codec.Read(ref input);
- if (doubleField88_ == null || value != 0D) {
- DoubleField88 = value;
- }
- break;
- }
- case 714: {
- double? value = _single_doubleField89_codec.Read(ref input);
- if (doubleField89_ == null || value != 0D) {
- DoubleField89 = value;
- }
- break;
- }
- case 722: {
- double? value = _single_doubleField90_codec.Read(ref input);
- if (doubleField90_ == null || value != 0D) {
- DoubleField90 = value;
- }
- break;
- }
- case 730: {
- double? value = _single_doubleField91_codec.Read(ref input);
- if (doubleField91_ == null || value != 0D) {
- DoubleField91 = value;
- }
- break;
- }
- case 738: {
- double? value = _single_doubleField92_codec.Read(ref input);
- if (doubleField92_ == null || value != 0D) {
- DoubleField92 = value;
- }
- break;
- }
- case 746: {
- double? value = _single_doubleField93_codec.Read(ref input);
- if (doubleField93_ == null || value != 0D) {
- DoubleField93 = value;
- }
- break;
- }
- case 754: {
- double? value = _single_doubleField94_codec.Read(ref input);
- if (doubleField94_ == null || value != 0D) {
- DoubleField94 = value;
- }
- break;
- }
- case 762: {
- double? value = _single_doubleField95_codec.Read(ref input);
- if (doubleField95_ == null || value != 0D) {
- DoubleField95 = value;
- }
- break;
- }
- case 770: {
- double? value = _single_doubleField96_codec.Read(ref input);
- if (doubleField96_ == null || value != 0D) {
- DoubleField96 = value;
- }
- break;
- }
- case 778: {
- double? value = _single_doubleField97_codec.Read(ref input);
- if (doubleField97_ == null || value != 0D) {
- DoubleField97 = value;
- }
- break;
- }
- case 786: {
- double? value = _single_doubleField98_codec.Read(ref input);
- if (doubleField98_ == null || value != 0D) {
- DoubleField98 = value;
- }
- break;
- }
- case 794: {
- double? value = _single_doubleField99_codec.Read(ref input);
- if (doubleField99_ == null || value != 0D) {
- DoubleField99 = value;
- }
- break;
- }
- case 802:
- case 800: {
- repeatedIntField100_.AddEntriesFrom(ref input, _repeated_repeatedIntField100_codec);
- break;
- }
- case 810: {
- double? value = _single_doubleField101_codec.Read(ref input);
- if (doubleField101_ == null || value != 0D) {
- DoubleField101 = value;
- }
- break;
- }
- case 818: {
- double? value = _single_doubleField102_codec.Read(ref input);
- if (doubleField102_ == null || value != 0D) {
- DoubleField102 = value;
- }
- break;
- }
- case 826: {
- double? value = _single_doubleField103_codec.Read(ref input);
- if (doubleField103_ == null || value != 0D) {
- DoubleField103 = value;
- }
- break;
- }
- case 834: {
- double? value = _single_doubleField104_codec.Read(ref input);
- if (doubleField104_ == null || value != 0D) {
- DoubleField104 = value;
- }
- break;
- }
- case 842: {
- double? value = _single_doubleField105_codec.Read(ref input);
- if (doubleField105_ == null || value != 0D) {
- DoubleField105 = value;
- }
- break;
- }
- case 850: {
- double? value = _single_doubleField106_codec.Read(ref input);
- if (doubleField106_ == null || value != 0D) {
- DoubleField106 = value;
- }
- break;
- }
- case 858: {
- long? value = _single_int64Field107_codec.Read(ref input);
- if (int64Field107_ == null || value != 0L) {
- Int64Field107 = value;
- }
- break;
- }
- case 866: {
- double? value = _single_doubleField108_codec.Read(ref input);
- if (doubleField108_ == null || value != 0D) {
- DoubleField108 = value;
- }
- break;
- }
- case 874: {
- double? value = _single_doubleField109_codec.Read(ref input);
- if (doubleField109_ == null || value != 0D) {
- DoubleField109 = value;
- }
- break;
- }
- case 882: {
- long? value = _single_int64Field110_codec.Read(ref input);
- if (int64Field110_ == null || value != 0L) {
- Int64Field110 = value;
- }
- break;
- }
- case 890: {
- double? value = _single_doubleField111_codec.Read(ref input);
- if (doubleField111_ == null || value != 0D) {
- DoubleField111 = value;
- }
- break;
- }
- case 898: {
- long? value = _single_int64Field112_codec.Read(ref input);
- if (int64Field112_ == null || value != 0L) {
- Int64Field112 = value;
- }
- break;
- }
- case 906: {
- double? value = _single_doubleField113_codec.Read(ref input);
- if (doubleField113_ == null || value != 0D) {
- DoubleField113 = value;
- }
- break;
- }
- case 914: {
- long? value = _single_int64Field114_codec.Read(ref input);
- if (int64Field114_ == null || value != 0L) {
- Int64Field114 = value;
- }
- break;
- }
- case 922: {
- long? value = _single_int64Field115_codec.Read(ref input);
- if (int64Field115_ == null || value != 0L) {
- Int64Field115 = value;
- }
- break;
- }
- case 930: {
- double? value = _single_doubleField116_codec.Read(ref input);
- if (doubleField116_ == null || value != 0D) {
- DoubleField116 = value;
- }
- break;
- }
- case 938: {
- long? value = _single_int64Field117_codec.Read(ref input);
- if (int64Field117_ == null || value != 0L) {
- Int64Field117 = value;
- }
- break;
- }
- case 946: {
- double? value = _single_doubleField118_codec.Read(ref input);
- if (doubleField118_ == null || value != 0D) {
- DoubleField118 = value;
- }
- break;
- }
- case 954: {
- double? value = _single_doubleField119_codec.Read(ref input);
- if (doubleField119_ == null || value != 0D) {
- DoubleField119 = value;
- }
- break;
- }
- case 962: {
- double? value = _single_doubleField120_codec.Read(ref input);
- if (doubleField120_ == null || value != 0D) {
- DoubleField120 = value;
- }
- break;
- }
- case 970: {
- double? value = _single_doubleField121_codec.Read(ref input);
- if (doubleField121_ == null || value != 0D) {
- DoubleField121 = value;
- }
- break;
- }
- case 978: {
- double? value = _single_doubleField122_codec.Read(ref input);
- if (doubleField122_ == null || value != 0D) {
- DoubleField122 = value;
- }
- break;
- }
- case 986: {
- double? value = _single_doubleField123_codec.Read(ref input);
- if (doubleField123_ == null || value != 0D) {
- DoubleField123 = value;
- }
- break;
- }
- case 994: {
- double? value = _single_doubleField124_codec.Read(ref input);
- if (doubleField124_ == null || value != 0D) {
- DoubleField124 = value;
- }
- break;
- }
- case 1002: {
- long? value = _single_int64Field125_codec.Read(ref input);
- if (int64Field125_ == null || value != 0L) {
- Int64Field125 = value;
- }
- break;
- }
- case 1010: {
- long? value = _single_int64Field126_codec.Read(ref input);
- if (int64Field126_ == null || value != 0L) {
- Int64Field126 = value;
- }
- break;
- }
- case 1018: {
- long? value = _single_int64Field127_codec.Read(ref input);
- if (int64Field127_ == null || value != 0L) {
- Int64Field127 = value;
- }
- break;
- }
- case 1026: {
- double? value = _single_doubleField128_codec.Read(ref input);
- if (doubleField128_ == null || value != 0D) {
- DoubleField128 = value;
- }
- break;
- }
- case 1034: {
- double? value = _single_doubleField129_codec.Read(ref input);
- if (doubleField129_ == null || value != 0D) {
- DoubleField129 = value;
- }
- break;
- }
- }
- }
- }
- #endif
-
- }
-
- /// <summary>
- /// same as ManyWrapperFieldsMessages, but with primitive fields
- /// for comparison.
- /// </summary>
- public sealed partial class ManyPrimitiveFieldsMessage : pb::IMessage<ManyPrimitiveFieldsMessage>
- #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
- , pb::IBufferMessage
- #endif
- {
- private static readonly pb::MessageParser<ManyPrimitiveFieldsMessage> _parser = new pb::MessageParser<ManyPrimitiveFieldsMessage>(() => new ManyPrimitiveFieldsMessage());
- private pb::UnknownFieldSet _unknownFields;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public static pb::MessageParser<ManyPrimitiveFieldsMessage> Parser { get { return _parser; } }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public static pbr::MessageDescriptor Descriptor {
- get { return global::Google.Protobuf.Benchmarks.WrapperBenchmarkMessagesReflection.Descriptor.MessageTypes[1]; }
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- pbr::MessageDescriptor pb::IMessage.Descriptor {
- get { return Descriptor; }
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public ManyPrimitiveFieldsMessage() {
- OnConstruction();
- }
-
- partial void OnConstruction();
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public ManyPrimitiveFieldsMessage(ManyPrimitiveFieldsMessage other) : this() {
- doubleField95_ = other.doubleField95_;
- doubleField1_ = other.doubleField1_;
- doubleField79_ = other.doubleField79_;
- int64Field2_ = other.int64Field2_;
- doubleField96_ = other.doubleField96_;
- int64Field3_ = other.int64Field3_;
- int64Field4_ = other.int64Field4_;
- doubleField97_ = other.doubleField97_;
- doubleField65_ = other.doubleField65_;
- doubleField66_ = other.doubleField66_;
- doubleField7_ = other.doubleField7_;
- doubleField62_ = other.doubleField62_;
- doubleField118_ = other.doubleField118_;
- doubleField119_ = other.doubleField119_;
- doubleField67_ = other.doubleField67_;
- doubleField120_ = other.doubleField120_;
- doubleField121_ = other.doubleField121_;
- doubleField122_ = other.doubleField122_;
- doubleField123_ = other.doubleField123_;
- doubleField124_ = other.doubleField124_;
- doubleField8_ = other.doubleField8_;
- doubleField9_ = other.doubleField9_;
- doubleField98_ = other.doubleField98_;
- doubleField10_ = other.doubleField10_;
- doubleField11_ = other.doubleField11_;
- doubleField99_ = other.doubleField99_;
- doubleField84_ = other.doubleField84_;
- doubleField14_ = other.doubleField14_;
- doubleField77_ = other.doubleField77_;
- doubleField15_ = other.doubleField15_;
- int64Field19_ = other.int64Field19_;
- int64Field115_ = other.int64Field115_;
- doubleField116_ = other.doubleField116_;
- int64Field117_ = other.int64Field117_;
- doubleField20_ = other.doubleField20_;
- doubleField21_ = other.doubleField21_;
- stringField73_ = other.stringField73_;
- stringField74_ = other.stringField74_;
- doubleField22_ = other.doubleField22_;
- doubleField69_ = other.doubleField69_;
- doubleField70_ = other.doubleField70_;
- doubleField71_ = other.doubleField71_;
- doubleField72_ = other.doubleField72_;
- doubleField25_ = other.doubleField25_;
- int64Field26_ = other.int64Field26_;
- doubleField68_ = other.doubleField68_;
- doubleField28_ = other.doubleField28_;
- doubleField106_ = other.doubleField106_;
- doubleField29_ = other.doubleField29_;
- doubleField30_ = other.doubleField30_;
- doubleField101_ = other.doubleField101_;
- doubleField102_ = other.doubleField102_;
- doubleField103_ = other.doubleField103_;
- doubleField104_ = other.doubleField104_;
- doubleField105_ = other.doubleField105_;
- doubleField31_ = other.doubleField31_;
- int64Field32_ = other.int64Field32_;
- doubleField75_ = other.doubleField75_;
- doubleField129_ = other.doubleField129_;
- enumField80_ = other.enumField80_;
- enumField81_ = other.enumField81_;
- int64Field82_ = other.int64Field82_;
- enumField83_ = other.enumField83_;
- int64Field85_ = other.int64Field85_;
- int64Field86_ = other.int64Field86_;
- int64Field87_ = other.int64Field87_;
- int64Field125_ = other.int64Field125_;
- int64Field37_ = other.int64Field37_;
- doubleField38_ = other.doubleField38_;
- interactions_ = other.interactions_;
- repeatedIntField100_ = other.repeatedIntField100_.Clone();
- doubleField40_ = other.doubleField40_;
- int64Field41_ = other.int64Field41_;
- int64Field126_ = other.int64Field126_;
- int64Field127_ = other.int64Field127_;
- doubleField128_ = other.doubleField128_;
- doubleField109_ = other.doubleField109_;
- int64Field110_ = other.int64Field110_;
- doubleField111_ = other.doubleField111_;
- int64Field112_ = other.int64Field112_;
- doubleField113_ = other.doubleField113_;
- int64Field114_ = other.int64Field114_;
- doubleField42_ = other.doubleField42_;
- int64Field43_ = other.int64Field43_;
- int64Field44_ = other.int64Field44_;
- doubleField45_ = other.doubleField45_;
- doubleField46_ = other.doubleField46_;
- doubleField78_ = other.doubleField78_;
- doubleField88_ = other.doubleField88_;
- doubleField47_ = other.doubleField47_;
- doubleField89_ = other.doubleField89_;
- doubleField48_ = other.doubleField48_;
- doubleField49_ = other.doubleField49_;
- doubleField50_ = other.doubleField50_;
- doubleField90_ = other.doubleField90_;
- doubleField51_ = other.doubleField51_;
- doubleField91_ = other.doubleField91_;
- doubleField92_ = other.doubleField92_;
- int64Field107_ = other.int64Field107_;
- doubleField93_ = other.doubleField93_;
- doubleField108_ = other.doubleField108_;
- doubleField52_ = other.doubleField52_;
- doubleField53_ = other.doubleField53_;
- doubleField94_ = other.doubleField94_;
- doubleField54_ = other.doubleField54_;
- doubleField55_ = other.doubleField55_;
- doubleField56_ = other.doubleField56_;
- doubleField57_ = other.doubleField57_;
- doubleField58_ = other.doubleField58_;
- int64Field59_ = other.int64Field59_;
- int64Field60_ = other.int64Field60_;
- _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public ManyPrimitiveFieldsMessage Clone() {
- return new ManyPrimitiveFieldsMessage(this);
- }
-
- /// <summary>Field number for the "double_field_95" field.</summary>
- public const int DoubleField95FieldNumber = 95;
- private double doubleField95_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField95 {
- get { return doubleField95_; }
- set {
- doubleField95_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_1" field.</summary>
- public const int DoubleField1FieldNumber = 1;
- private double doubleField1_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField1 {
- get { return doubleField1_; }
- set {
- doubleField1_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_79" field.</summary>
- public const int DoubleField79FieldNumber = 79;
- private double doubleField79_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField79 {
- get { return doubleField79_; }
- set {
- doubleField79_ = value;
- }
- }
-
- /// <summary>Field number for the "int64_field_2" field.</summary>
- public const int Int64Field2FieldNumber = 2;
- private long int64Field2_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long Int64Field2 {
- get { return int64Field2_; }
- set {
- int64Field2_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_96" field.</summary>
- public const int DoubleField96FieldNumber = 96;
- private double doubleField96_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField96 {
- get { return doubleField96_; }
- set {
- doubleField96_ = value;
- }
- }
-
- /// <summary>Field number for the "int64_field_3" field.</summary>
- public const int Int64Field3FieldNumber = 3;
- private long int64Field3_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long Int64Field3 {
- get { return int64Field3_; }
- set {
- int64Field3_ = value;
- }
- }
-
- /// <summary>Field number for the "int64_field_4" field.</summary>
- public const int Int64Field4FieldNumber = 4;
- private long int64Field4_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long Int64Field4 {
- get { return int64Field4_; }
- set {
- int64Field4_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_97" field.</summary>
- public const int DoubleField97FieldNumber = 97;
- private double doubleField97_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField97 {
- get { return doubleField97_; }
- set {
- doubleField97_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_65" field.</summary>
- public const int DoubleField65FieldNumber = 65;
- private double doubleField65_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField65 {
- get { return doubleField65_; }
- set {
- doubleField65_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_66" field.</summary>
- public const int DoubleField66FieldNumber = 66;
- private double doubleField66_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField66 {
- get { return doubleField66_; }
- set {
- doubleField66_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_7" field.</summary>
- public const int DoubleField7FieldNumber = 7;
- private double doubleField7_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField7 {
- get { return doubleField7_; }
- set {
- doubleField7_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_62" field.</summary>
- public const int DoubleField62FieldNumber = 62;
- private double doubleField62_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField62 {
- get { return doubleField62_; }
- set {
- doubleField62_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_118" field.</summary>
- public const int DoubleField118FieldNumber = 118;
- private double doubleField118_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField118 {
- get { return doubleField118_; }
- set {
- doubleField118_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_119" field.</summary>
- public const int DoubleField119FieldNumber = 119;
- private double doubleField119_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField119 {
- get { return doubleField119_; }
- set {
- doubleField119_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_67" field.</summary>
- public const int DoubleField67FieldNumber = 67;
- private double doubleField67_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField67 {
- get { return doubleField67_; }
- set {
- doubleField67_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_120" field.</summary>
- public const int DoubleField120FieldNumber = 120;
- private double doubleField120_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField120 {
- get { return doubleField120_; }
- set {
- doubleField120_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_121" field.</summary>
- public const int DoubleField121FieldNumber = 121;
- private double doubleField121_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField121 {
- get { return doubleField121_; }
- set {
- doubleField121_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_122" field.</summary>
- public const int DoubleField122FieldNumber = 122;
- private double doubleField122_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField122 {
- get { return doubleField122_; }
- set {
- doubleField122_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_123" field.</summary>
- public const int DoubleField123FieldNumber = 123;
- private double doubleField123_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField123 {
- get { return doubleField123_; }
- set {
- doubleField123_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_124" field.</summary>
- public const int DoubleField124FieldNumber = 124;
- private double doubleField124_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField124 {
- get { return doubleField124_; }
- set {
- doubleField124_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_8" field.</summary>
- public const int DoubleField8FieldNumber = 8;
- private double doubleField8_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField8 {
- get { return doubleField8_; }
- set {
- doubleField8_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_9" field.</summary>
- public const int DoubleField9FieldNumber = 9;
- private double doubleField9_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField9 {
- get { return doubleField9_; }
- set {
- doubleField9_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_98" field.</summary>
- public const int DoubleField98FieldNumber = 98;
- private double doubleField98_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField98 {
- get { return doubleField98_; }
- set {
- doubleField98_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_10" field.</summary>
- public const int DoubleField10FieldNumber = 10;
- private double doubleField10_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField10 {
- get { return doubleField10_; }
- set {
- doubleField10_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_11" field.</summary>
- public const int DoubleField11FieldNumber = 11;
- private double doubleField11_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField11 {
- get { return doubleField11_; }
- set {
- doubleField11_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_99" field.</summary>
- public const int DoubleField99FieldNumber = 99;
- private double doubleField99_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField99 {
- get { return doubleField99_; }
- set {
- doubleField99_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_84" field.</summary>
- public const int DoubleField84FieldNumber = 84;
- private double doubleField84_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField84 {
- get { return doubleField84_; }
- set {
- doubleField84_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_14" field.</summary>
- public const int DoubleField14FieldNumber = 14;
- private double doubleField14_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField14 {
- get { return doubleField14_; }
- set {
- doubleField14_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_77" field.</summary>
- public const int DoubleField77FieldNumber = 77;
- private double doubleField77_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField77 {
- get { return doubleField77_; }
- set {
- doubleField77_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_15" field.</summary>
- public const int DoubleField15FieldNumber = 15;
- private double doubleField15_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField15 {
- get { return doubleField15_; }
- set {
- doubleField15_ = value;
- }
- }
-
- /// <summary>Field number for the "int64_field_19" field.</summary>
- public const int Int64Field19FieldNumber = 19;
- private long int64Field19_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long Int64Field19 {
- get { return int64Field19_; }
- set {
- int64Field19_ = value;
- }
- }
-
- /// <summary>Field number for the "int64_field_115" field.</summary>
- public const int Int64Field115FieldNumber = 115;
- private long int64Field115_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long Int64Field115 {
- get { return int64Field115_; }
- set {
- int64Field115_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_116" field.</summary>
- public const int DoubleField116FieldNumber = 116;
- private double doubleField116_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField116 {
- get { return doubleField116_; }
- set {
- doubleField116_ = value;
- }
- }
-
- /// <summary>Field number for the "int64_field_117" field.</summary>
- public const int Int64Field117FieldNumber = 117;
- private long int64Field117_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long Int64Field117 {
- get { return int64Field117_; }
- set {
- int64Field117_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_20" field.</summary>
- public const int DoubleField20FieldNumber = 20;
- private double doubleField20_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField20 {
- get { return doubleField20_; }
- set {
- doubleField20_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_21" field.</summary>
- public const int DoubleField21FieldNumber = 21;
- private double doubleField21_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField21 {
- get { return doubleField21_; }
- set {
- doubleField21_ = value;
- }
- }
-
- /// <summary>Field number for the "string_field_73" field.</summary>
- public const int StringField73FieldNumber = 73;
- private string stringField73_ = "";
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public string StringField73 {
- get { return stringField73_; }
- set {
- stringField73_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
- }
- }
-
- /// <summary>Field number for the "string_field_74" field.</summary>
- public const int StringField74FieldNumber = 74;
- private string stringField74_ = "";
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public string StringField74 {
- get { return stringField74_; }
- set {
- stringField74_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
- }
- }
-
- /// <summary>Field number for the "double_field_22" field.</summary>
- public const int DoubleField22FieldNumber = 22;
- private double doubleField22_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField22 {
- get { return doubleField22_; }
- set {
- doubleField22_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_69" field.</summary>
- public const int DoubleField69FieldNumber = 69;
- private double doubleField69_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField69 {
- get { return doubleField69_; }
- set {
- doubleField69_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_70" field.</summary>
- public const int DoubleField70FieldNumber = 70;
- private double doubleField70_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField70 {
- get { return doubleField70_; }
- set {
- doubleField70_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_71" field.</summary>
- public const int DoubleField71FieldNumber = 71;
- private double doubleField71_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField71 {
- get { return doubleField71_; }
- set {
- doubleField71_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_72" field.</summary>
- public const int DoubleField72FieldNumber = 72;
- private double doubleField72_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField72 {
- get { return doubleField72_; }
- set {
- doubleField72_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_25" field.</summary>
- public const int DoubleField25FieldNumber = 25;
- private double doubleField25_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField25 {
- get { return doubleField25_; }
- set {
- doubleField25_ = value;
- }
- }
-
- /// <summary>Field number for the "int64_field_26" field.</summary>
- public const int Int64Field26FieldNumber = 26;
- private long int64Field26_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long Int64Field26 {
- get { return int64Field26_; }
- set {
- int64Field26_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_68" field.</summary>
- public const int DoubleField68FieldNumber = 68;
- private double doubleField68_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField68 {
- get { return doubleField68_; }
- set {
- doubleField68_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_28" field.</summary>
- public const int DoubleField28FieldNumber = 28;
- private double doubleField28_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField28 {
- get { return doubleField28_; }
- set {
- doubleField28_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_106" field.</summary>
- public const int DoubleField106FieldNumber = 106;
- private double doubleField106_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField106 {
- get { return doubleField106_; }
- set {
- doubleField106_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_29" field.</summary>
- public const int DoubleField29FieldNumber = 29;
- private double doubleField29_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField29 {
- get { return doubleField29_; }
- set {
- doubleField29_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_30" field.</summary>
- public const int DoubleField30FieldNumber = 30;
- private double doubleField30_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField30 {
- get { return doubleField30_; }
- set {
- doubleField30_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_101" field.</summary>
- public const int DoubleField101FieldNumber = 101;
- private double doubleField101_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField101 {
- get { return doubleField101_; }
- set {
- doubleField101_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_102" field.</summary>
- public const int DoubleField102FieldNumber = 102;
- private double doubleField102_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField102 {
- get { return doubleField102_; }
- set {
- doubleField102_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_103" field.</summary>
- public const int DoubleField103FieldNumber = 103;
- private double doubleField103_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField103 {
- get { return doubleField103_; }
- set {
- doubleField103_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_104" field.</summary>
- public const int DoubleField104FieldNumber = 104;
- private double doubleField104_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField104 {
- get { return doubleField104_; }
- set {
- doubleField104_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_105" field.</summary>
- public const int DoubleField105FieldNumber = 105;
- private double doubleField105_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField105 {
- get { return doubleField105_; }
- set {
- doubleField105_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_31" field.</summary>
- public const int DoubleField31FieldNumber = 31;
- private double doubleField31_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField31 {
- get { return doubleField31_; }
- set {
- doubleField31_ = value;
- }
- }
-
- /// <summary>Field number for the "int64_field_32" field.</summary>
- public const int Int64Field32FieldNumber = 32;
- private long int64Field32_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long Int64Field32 {
- get { return int64Field32_; }
- set {
- int64Field32_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_75" field.</summary>
- public const int DoubleField75FieldNumber = 75;
- private double doubleField75_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField75 {
- get { return doubleField75_; }
- set {
- doubleField75_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_129" field.</summary>
- public const int DoubleField129FieldNumber = 129;
- private double doubleField129_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField129 {
- get { return doubleField129_; }
- set {
- doubleField129_ = value;
- }
- }
-
- /// <summary>Field number for the "enum_field_80" field.</summary>
- public const int EnumField80FieldNumber = 80;
- private int enumField80_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public int EnumField80 {
- get { return enumField80_; }
- set {
- enumField80_ = value;
- }
- }
-
- /// <summary>Field number for the "enum_field_81" field.</summary>
- public const int EnumField81FieldNumber = 81;
- private int enumField81_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public int EnumField81 {
- get { return enumField81_; }
- set {
- enumField81_ = value;
- }
- }
-
- /// <summary>Field number for the "int64_field_82" field.</summary>
- public const int Int64Field82FieldNumber = 82;
- private long int64Field82_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long Int64Field82 {
- get { return int64Field82_; }
- set {
- int64Field82_ = value;
- }
- }
-
- /// <summary>Field number for the "enum_field_83" field.</summary>
- public const int EnumField83FieldNumber = 83;
- private int enumField83_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public int EnumField83 {
- get { return enumField83_; }
- set {
- enumField83_ = value;
- }
- }
-
- /// <summary>Field number for the "int64_field_85" field.</summary>
- public const int Int64Field85FieldNumber = 85;
- private long int64Field85_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long Int64Field85 {
- get { return int64Field85_; }
- set {
- int64Field85_ = value;
- }
- }
-
- /// <summary>Field number for the "int64_field_86" field.</summary>
- public const int Int64Field86FieldNumber = 86;
- private long int64Field86_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long Int64Field86 {
- get { return int64Field86_; }
- set {
- int64Field86_ = value;
- }
- }
-
- /// <summary>Field number for the "int64_field_87" field.</summary>
- public const int Int64Field87FieldNumber = 87;
- private long int64Field87_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long Int64Field87 {
- get { return int64Field87_; }
- set {
- int64Field87_ = value;
- }
- }
-
- /// <summary>Field number for the "int64_field_125" field.</summary>
- public const int Int64Field125FieldNumber = 125;
- private long int64Field125_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long Int64Field125 {
- get { return int64Field125_; }
- set {
- int64Field125_ = value;
- }
- }
-
- /// <summary>Field number for the "int64_field_37" field.</summary>
- public const int Int64Field37FieldNumber = 37;
- private long int64Field37_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long Int64Field37 {
- get { return int64Field37_; }
- set {
- int64Field37_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_38" field.</summary>
- public const int DoubleField38FieldNumber = 38;
- private double doubleField38_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField38 {
- get { return doubleField38_; }
- set {
- doubleField38_ = value;
- }
- }
-
- /// <summary>Field number for the "interactions" field.</summary>
- public const int InteractionsFieldNumber = 39;
- private long interactions_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long Interactions {
- get { return interactions_; }
- set {
- interactions_ = value;
- }
- }
-
- /// <summary>Field number for the "repeated_int_field_100" field.</summary>
- public const int RepeatedIntField100FieldNumber = 100;
- private static readonly pb::FieldCodec<int> _repeated_repeatedIntField100_codec
- = pb::FieldCodec.ForInt32(802);
- private readonly pbc::RepeatedField<int> repeatedIntField100_ = new pbc::RepeatedField<int>();
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public pbc::RepeatedField<int> RepeatedIntField100 {
- get { return repeatedIntField100_; }
- }
-
- /// <summary>Field number for the "double_field_40" field.</summary>
- public const int DoubleField40FieldNumber = 40;
- private double doubleField40_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField40 {
- get { return doubleField40_; }
- set {
- doubleField40_ = value;
- }
- }
-
- /// <summary>Field number for the "int64_field_41" field.</summary>
- public const int Int64Field41FieldNumber = 41;
- private long int64Field41_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long Int64Field41 {
- get { return int64Field41_; }
- set {
- int64Field41_ = value;
- }
- }
-
- /// <summary>Field number for the "int64_field_126" field.</summary>
- public const int Int64Field126FieldNumber = 126;
- private long int64Field126_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long Int64Field126 {
- get { return int64Field126_; }
- set {
- int64Field126_ = value;
- }
- }
-
- /// <summary>Field number for the "int64_field_127" field.</summary>
- public const int Int64Field127FieldNumber = 127;
- private long int64Field127_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long Int64Field127 {
- get { return int64Field127_; }
- set {
- int64Field127_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_128" field.</summary>
- public const int DoubleField128FieldNumber = 128;
- private double doubleField128_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField128 {
- get { return doubleField128_; }
- set {
- doubleField128_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_109" field.</summary>
- public const int DoubleField109FieldNumber = 109;
- private double doubleField109_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField109 {
- get { return doubleField109_; }
- set {
- doubleField109_ = value;
- }
- }
-
- /// <summary>Field number for the "int64_field_110" field.</summary>
- public const int Int64Field110FieldNumber = 110;
- private long int64Field110_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long Int64Field110 {
- get { return int64Field110_; }
- set {
- int64Field110_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_111" field.</summary>
- public const int DoubleField111FieldNumber = 111;
- private double doubleField111_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField111 {
- get { return doubleField111_; }
- set {
- doubleField111_ = value;
- }
- }
-
- /// <summary>Field number for the "int64_field_112" field.</summary>
- public const int Int64Field112FieldNumber = 112;
- private long int64Field112_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long Int64Field112 {
- get { return int64Field112_; }
- set {
- int64Field112_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_113" field.</summary>
- public const int DoubleField113FieldNumber = 113;
- private double doubleField113_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField113 {
- get { return doubleField113_; }
- set {
- doubleField113_ = value;
- }
- }
-
- /// <summary>Field number for the "int64_field_114" field.</summary>
- public const int Int64Field114FieldNumber = 114;
- private long int64Field114_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long Int64Field114 {
- get { return int64Field114_; }
- set {
- int64Field114_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_42" field.</summary>
- public const int DoubleField42FieldNumber = 42;
- private double doubleField42_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField42 {
- get { return doubleField42_; }
- set {
- doubleField42_ = value;
- }
- }
-
- /// <summary>Field number for the "int64_field_43" field.</summary>
- public const int Int64Field43FieldNumber = 43;
- private long int64Field43_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long Int64Field43 {
- get { return int64Field43_; }
- set {
- int64Field43_ = value;
- }
- }
-
- /// <summary>Field number for the "int64_field_44" field.</summary>
- public const int Int64Field44FieldNumber = 44;
- private long int64Field44_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long Int64Field44 {
- get { return int64Field44_; }
- set {
- int64Field44_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_45" field.</summary>
- public const int DoubleField45FieldNumber = 45;
- private double doubleField45_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField45 {
- get { return doubleField45_; }
- set {
- doubleField45_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_46" field.</summary>
- public const int DoubleField46FieldNumber = 46;
- private double doubleField46_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField46 {
- get { return doubleField46_; }
- set {
- doubleField46_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_78" field.</summary>
- public const int DoubleField78FieldNumber = 78;
- private double doubleField78_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField78 {
- get { return doubleField78_; }
- set {
- doubleField78_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_88" field.</summary>
- public const int DoubleField88FieldNumber = 88;
- private double doubleField88_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField88 {
- get { return doubleField88_; }
- set {
- doubleField88_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_47" field.</summary>
- public const int DoubleField47FieldNumber = 47;
- private double doubleField47_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField47 {
- get { return doubleField47_; }
- set {
- doubleField47_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_89" field.</summary>
- public const int DoubleField89FieldNumber = 89;
- private double doubleField89_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField89 {
- get { return doubleField89_; }
- set {
- doubleField89_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_48" field.</summary>
- public const int DoubleField48FieldNumber = 48;
- private double doubleField48_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField48 {
- get { return doubleField48_; }
- set {
- doubleField48_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_49" field.</summary>
- public const int DoubleField49FieldNumber = 49;
- private double doubleField49_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField49 {
- get { return doubleField49_; }
- set {
- doubleField49_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_50" field.</summary>
- public const int DoubleField50FieldNumber = 50;
- private double doubleField50_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField50 {
- get { return doubleField50_; }
- set {
- doubleField50_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_90" field.</summary>
- public const int DoubleField90FieldNumber = 90;
- private double doubleField90_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField90 {
- get { return doubleField90_; }
- set {
- doubleField90_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_51" field.</summary>
- public const int DoubleField51FieldNumber = 51;
- private double doubleField51_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField51 {
- get { return doubleField51_; }
- set {
- doubleField51_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_91" field.</summary>
- public const int DoubleField91FieldNumber = 91;
- private double doubleField91_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField91 {
- get { return doubleField91_; }
- set {
- doubleField91_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_92" field.</summary>
- public const int DoubleField92FieldNumber = 92;
- private double doubleField92_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField92 {
- get { return doubleField92_; }
- set {
- doubleField92_ = value;
- }
- }
-
- /// <summary>Field number for the "int64_field_107" field.</summary>
- public const int Int64Field107FieldNumber = 107;
- private long int64Field107_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long Int64Field107 {
- get { return int64Field107_; }
- set {
- int64Field107_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_93" field.</summary>
- public const int DoubleField93FieldNumber = 93;
- private double doubleField93_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField93 {
- get { return doubleField93_; }
- set {
- doubleField93_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_108" field.</summary>
- public const int DoubleField108FieldNumber = 108;
- private double doubleField108_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField108 {
- get { return doubleField108_; }
- set {
- doubleField108_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_52" field.</summary>
- public const int DoubleField52FieldNumber = 52;
- private double doubleField52_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField52 {
- get { return doubleField52_; }
- set {
- doubleField52_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_53" field.</summary>
- public const int DoubleField53FieldNumber = 53;
- private double doubleField53_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField53 {
- get { return doubleField53_; }
- set {
- doubleField53_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_94" field.</summary>
- public const int DoubleField94FieldNumber = 94;
- private double doubleField94_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField94 {
- get { return doubleField94_; }
- set {
- doubleField94_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_54" field.</summary>
- public const int DoubleField54FieldNumber = 54;
- private double doubleField54_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField54 {
- get { return doubleField54_; }
- set {
- doubleField54_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_55" field.</summary>
- public const int DoubleField55FieldNumber = 55;
- private double doubleField55_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField55 {
- get { return doubleField55_; }
- set {
- doubleField55_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_56" field.</summary>
- public const int DoubleField56FieldNumber = 56;
- private double doubleField56_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField56 {
- get { return doubleField56_; }
- set {
- doubleField56_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_57" field.</summary>
- public const int DoubleField57FieldNumber = 57;
- private double doubleField57_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField57 {
- get { return doubleField57_; }
- set {
- doubleField57_ = value;
- }
- }
-
- /// <summary>Field number for the "double_field_58" field.</summary>
- public const int DoubleField58FieldNumber = 58;
- private double doubleField58_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public double DoubleField58 {
- get { return doubleField58_; }
- set {
- doubleField58_ = value;
- }
- }
-
- /// <summary>Field number for the "int64_field_59" field.</summary>
- public const int Int64Field59FieldNumber = 59;
- private long int64Field59_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long Int64Field59 {
- get { return int64Field59_; }
- set {
- int64Field59_ = value;
- }
- }
-
- /// <summary>Field number for the "int64_field_60" field.</summary>
- public const int Int64Field60FieldNumber = 60;
- private long int64Field60_;
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public long Int64Field60 {
- get { return int64Field60_; }
- set {
- int64Field60_ = value;
- }
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public override bool Equals(object other) {
- return Equals(other as ManyPrimitiveFieldsMessage);
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public bool Equals(ManyPrimitiveFieldsMessage other) {
- if (ReferenceEquals(other, null)) {
- return false;
- }
- if (ReferenceEquals(other, this)) {
- return true;
- }
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField95, other.DoubleField95)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField1, other.DoubleField1)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField79, other.DoubleField79)) return false;
- if (Int64Field2 != other.Int64Field2) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField96, other.DoubleField96)) return false;
- if (Int64Field3 != other.Int64Field3) return false;
- if (Int64Field4 != other.Int64Field4) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField97, other.DoubleField97)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField65, other.DoubleField65)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField66, other.DoubleField66)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField7, other.DoubleField7)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField62, other.DoubleField62)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField118, other.DoubleField118)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField119, other.DoubleField119)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField67, other.DoubleField67)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField120, other.DoubleField120)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField121, other.DoubleField121)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField122, other.DoubleField122)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField123, other.DoubleField123)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField124, other.DoubleField124)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField8, other.DoubleField8)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField9, other.DoubleField9)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField98, other.DoubleField98)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField10, other.DoubleField10)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField11, other.DoubleField11)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField99, other.DoubleField99)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField84, other.DoubleField84)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField14, other.DoubleField14)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField77, other.DoubleField77)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField15, other.DoubleField15)) return false;
- if (Int64Field19 != other.Int64Field19) return false;
- if (Int64Field115 != other.Int64Field115) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField116, other.DoubleField116)) return false;
- if (Int64Field117 != other.Int64Field117) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField20, other.DoubleField20)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField21, other.DoubleField21)) return false;
- if (StringField73 != other.StringField73) return false;
- if (StringField74 != other.StringField74) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField22, other.DoubleField22)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField69, other.DoubleField69)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField70, other.DoubleField70)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField71, other.DoubleField71)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField72, other.DoubleField72)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField25, other.DoubleField25)) return false;
- if (Int64Field26 != other.Int64Field26) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField68, other.DoubleField68)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField28, other.DoubleField28)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField106, other.DoubleField106)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField29, other.DoubleField29)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField30, other.DoubleField30)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField101, other.DoubleField101)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField102, other.DoubleField102)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField103, other.DoubleField103)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField104, other.DoubleField104)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField105, other.DoubleField105)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField31, other.DoubleField31)) return false;
- if (Int64Field32 != other.Int64Field32) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField75, other.DoubleField75)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField129, other.DoubleField129)) return false;
- if (EnumField80 != other.EnumField80) return false;
- if (EnumField81 != other.EnumField81) return false;
- if (Int64Field82 != other.Int64Field82) return false;
- if (EnumField83 != other.EnumField83) return false;
- if (Int64Field85 != other.Int64Field85) return false;
- if (Int64Field86 != other.Int64Field86) return false;
- if (Int64Field87 != other.Int64Field87) return false;
- if (Int64Field125 != other.Int64Field125) return false;
- if (Int64Field37 != other.Int64Field37) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField38, other.DoubleField38)) return false;
- if (Interactions != other.Interactions) return false;
- if(!repeatedIntField100_.Equals(other.repeatedIntField100_)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField40, other.DoubleField40)) return false;
- if (Int64Field41 != other.Int64Field41) return false;
- if (Int64Field126 != other.Int64Field126) return false;
- if (Int64Field127 != other.Int64Field127) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField128, other.DoubleField128)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField109, other.DoubleField109)) return false;
- if (Int64Field110 != other.Int64Field110) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField111, other.DoubleField111)) return false;
- if (Int64Field112 != other.Int64Field112) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField113, other.DoubleField113)) return false;
- if (Int64Field114 != other.Int64Field114) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField42, other.DoubleField42)) return false;
- if (Int64Field43 != other.Int64Field43) return false;
- if (Int64Field44 != other.Int64Field44) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField45, other.DoubleField45)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField46, other.DoubleField46)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField78, other.DoubleField78)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField88, other.DoubleField88)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField47, other.DoubleField47)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField89, other.DoubleField89)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField48, other.DoubleField48)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField49, other.DoubleField49)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField50, other.DoubleField50)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField90, other.DoubleField90)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField51, other.DoubleField51)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField91, other.DoubleField91)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField92, other.DoubleField92)) return false;
- if (Int64Field107 != other.Int64Field107) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField93, other.DoubleField93)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField108, other.DoubleField108)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField52, other.DoubleField52)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField53, other.DoubleField53)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField94, other.DoubleField94)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField54, other.DoubleField54)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField55, other.DoubleField55)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField56, other.DoubleField56)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField57, other.DoubleField57)) return false;
- if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(DoubleField58, other.DoubleField58)) return false;
- if (Int64Field59 != other.Int64Field59) return false;
- if (Int64Field60 != other.Int64Field60) return false;
- return Equals(_unknownFields, other._unknownFields);
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public override int GetHashCode() {
- int hash = 1;
- if (DoubleField95 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField95);
- if (DoubleField1 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField1);
- if (DoubleField79 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField79);
- if (Int64Field2 != 0L) hash ^= Int64Field2.GetHashCode();
- if (DoubleField96 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField96);
- if (Int64Field3 != 0L) hash ^= Int64Field3.GetHashCode();
- if (Int64Field4 != 0L) hash ^= Int64Field4.GetHashCode();
- if (DoubleField97 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField97);
- if (DoubleField65 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField65);
- if (DoubleField66 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField66);
- if (DoubleField7 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField7);
- if (DoubleField62 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField62);
- if (DoubleField118 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField118);
- if (DoubleField119 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField119);
- if (DoubleField67 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField67);
- if (DoubleField120 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField120);
- if (DoubleField121 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField121);
- if (DoubleField122 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField122);
- if (DoubleField123 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField123);
- if (DoubleField124 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField124);
- if (DoubleField8 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField8);
- if (DoubleField9 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField9);
- if (DoubleField98 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField98);
- if (DoubleField10 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField10);
- if (DoubleField11 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField11);
- if (DoubleField99 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField99);
- if (DoubleField84 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField84);
- if (DoubleField14 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField14);
- if (DoubleField77 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField77);
- if (DoubleField15 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField15);
- if (Int64Field19 != 0L) hash ^= Int64Field19.GetHashCode();
- if (Int64Field115 != 0L) hash ^= Int64Field115.GetHashCode();
- if (DoubleField116 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField116);
- if (Int64Field117 != 0L) hash ^= Int64Field117.GetHashCode();
- if (DoubleField20 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField20);
- if (DoubleField21 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField21);
- if (StringField73.Length != 0) hash ^= StringField73.GetHashCode();
- if (StringField74.Length != 0) hash ^= StringField74.GetHashCode();
- if (DoubleField22 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField22);
- if (DoubleField69 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField69);
- if (DoubleField70 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField70);
- if (DoubleField71 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField71);
- if (DoubleField72 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField72);
- if (DoubleField25 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField25);
- if (Int64Field26 != 0L) hash ^= Int64Field26.GetHashCode();
- if (DoubleField68 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField68);
- if (DoubleField28 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField28);
- if (DoubleField106 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField106);
- if (DoubleField29 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField29);
- if (DoubleField30 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField30);
- if (DoubleField101 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField101);
- if (DoubleField102 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField102);
- if (DoubleField103 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField103);
- if (DoubleField104 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField104);
- if (DoubleField105 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField105);
- if (DoubleField31 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField31);
- if (Int64Field32 != 0L) hash ^= Int64Field32.GetHashCode();
- if (DoubleField75 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField75);
- if (DoubleField129 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField129);
- if (EnumField80 != 0) hash ^= EnumField80.GetHashCode();
- if (EnumField81 != 0) hash ^= EnumField81.GetHashCode();
- if (Int64Field82 != 0L) hash ^= Int64Field82.GetHashCode();
- if (EnumField83 != 0) hash ^= EnumField83.GetHashCode();
- if (Int64Field85 != 0L) hash ^= Int64Field85.GetHashCode();
- if (Int64Field86 != 0L) hash ^= Int64Field86.GetHashCode();
- if (Int64Field87 != 0L) hash ^= Int64Field87.GetHashCode();
- if (Int64Field125 != 0L) hash ^= Int64Field125.GetHashCode();
- if (Int64Field37 != 0L) hash ^= Int64Field37.GetHashCode();
- if (DoubleField38 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField38);
- if (Interactions != 0L) hash ^= Interactions.GetHashCode();
- hash ^= repeatedIntField100_.GetHashCode();
- if (DoubleField40 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField40);
- if (Int64Field41 != 0L) hash ^= Int64Field41.GetHashCode();
- if (Int64Field126 != 0L) hash ^= Int64Field126.GetHashCode();
- if (Int64Field127 != 0L) hash ^= Int64Field127.GetHashCode();
- if (DoubleField128 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField128);
- if (DoubleField109 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField109);
- if (Int64Field110 != 0L) hash ^= Int64Field110.GetHashCode();
- if (DoubleField111 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField111);
- if (Int64Field112 != 0L) hash ^= Int64Field112.GetHashCode();
- if (DoubleField113 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField113);
- if (Int64Field114 != 0L) hash ^= Int64Field114.GetHashCode();
- if (DoubleField42 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField42);
- if (Int64Field43 != 0L) hash ^= Int64Field43.GetHashCode();
- if (Int64Field44 != 0L) hash ^= Int64Field44.GetHashCode();
- if (DoubleField45 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField45);
- if (DoubleField46 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField46);
- if (DoubleField78 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField78);
- if (DoubleField88 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField88);
- if (DoubleField47 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField47);
- if (DoubleField89 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField89);
- if (DoubleField48 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField48);
- if (DoubleField49 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField49);
- if (DoubleField50 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField50);
- if (DoubleField90 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField90);
- if (DoubleField51 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField51);
- if (DoubleField91 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField91);
- if (DoubleField92 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField92);
- if (Int64Field107 != 0L) hash ^= Int64Field107.GetHashCode();
- if (DoubleField93 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField93);
- if (DoubleField108 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField108);
- if (DoubleField52 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField52);
- if (DoubleField53 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField53);
- if (DoubleField94 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField94);
- if (DoubleField54 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField54);
- if (DoubleField55 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField55);
- if (DoubleField56 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField56);
- if (DoubleField57 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField57);
- if (DoubleField58 != 0D) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(DoubleField58);
- if (Int64Field59 != 0L) hash ^= Int64Field59.GetHashCode();
- if (Int64Field60 != 0L) hash ^= Int64Field60.GetHashCode();
- if (_unknownFields != null) {
- hash ^= _unknownFields.GetHashCode();
- }
- return hash;
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public override string ToString() {
- return pb::JsonFormatter.ToDiagnosticString(this);
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public void WriteTo(pb::CodedOutputStream output) {
- #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
- output.WriteRawMessage(this);
- #else
- if (DoubleField1 != 0D) {
- output.WriteRawTag(9);
- output.WriteDouble(DoubleField1);
- }
- if (Int64Field2 != 0L) {
- output.WriteRawTag(16);
- output.WriteInt64(Int64Field2);
- }
- if (Int64Field3 != 0L) {
- output.WriteRawTag(24);
- output.WriteInt64(Int64Field3);
- }
- if (Int64Field4 != 0L) {
- output.WriteRawTag(32);
- output.WriteInt64(Int64Field4);
- }
- if (DoubleField7 != 0D) {
- output.WriteRawTag(57);
- output.WriteDouble(DoubleField7);
- }
- if (DoubleField8 != 0D) {
- output.WriteRawTag(65);
- output.WriteDouble(DoubleField8);
- }
- if (DoubleField9 != 0D) {
- output.WriteRawTag(73);
- output.WriteDouble(DoubleField9);
- }
- if (DoubleField10 != 0D) {
- output.WriteRawTag(81);
- output.WriteDouble(DoubleField10);
- }
- if (DoubleField11 != 0D) {
- output.WriteRawTag(89);
- output.WriteDouble(DoubleField11);
- }
- if (DoubleField14 != 0D) {
- output.WriteRawTag(113);
- output.WriteDouble(DoubleField14);
- }
- if (DoubleField15 != 0D) {
- output.WriteRawTag(121);
- output.WriteDouble(DoubleField15);
- }
- if (Int64Field19 != 0L) {
- output.WriteRawTag(152, 1);
- output.WriteInt64(Int64Field19);
- }
- if (DoubleField20 != 0D) {
- output.WriteRawTag(161, 1);
- output.WriteDouble(DoubleField20);
- }
- if (DoubleField21 != 0D) {
- output.WriteRawTag(169, 1);
- output.WriteDouble(DoubleField21);
- }
- if (DoubleField22 != 0D) {
- output.WriteRawTag(177, 1);
- output.WriteDouble(DoubleField22);
- }
- if (DoubleField25 != 0D) {
- output.WriteRawTag(201, 1);
- output.WriteDouble(DoubleField25);
- }
- if (Int64Field26 != 0L) {
- output.WriteRawTag(208, 1);
- output.WriteInt64(Int64Field26);
- }
- if (DoubleField28 != 0D) {
- output.WriteRawTag(225, 1);
- output.WriteDouble(DoubleField28);
- }
- if (DoubleField29 != 0D) {
- output.WriteRawTag(233, 1);
- output.WriteDouble(DoubleField29);
- }
- if (DoubleField30 != 0D) {
- output.WriteRawTag(241, 1);
- output.WriteDouble(DoubleField30);
- }
- if (DoubleField31 != 0D) {
- output.WriteRawTag(249, 1);
- output.WriteDouble(DoubleField31);
- }
- if (Int64Field32 != 0L) {
- output.WriteRawTag(128, 2);
- output.WriteInt64(Int64Field32);
- }
- if (Int64Field37 != 0L) {
- output.WriteRawTag(168, 2);
- output.WriteInt64(Int64Field37);
- }
- if (DoubleField38 != 0D) {
- output.WriteRawTag(177, 2);
- output.WriteDouble(DoubleField38);
- }
- if (Interactions != 0L) {
- output.WriteRawTag(184, 2);
- output.WriteInt64(Interactions);
- }
- if (DoubleField40 != 0D) {
- output.WriteRawTag(193, 2);
- output.WriteDouble(DoubleField40);
- }
- if (Int64Field41 != 0L) {
- output.WriteRawTag(200, 2);
- output.WriteInt64(Int64Field41);
- }
- if (DoubleField42 != 0D) {
- output.WriteRawTag(209, 2);
- output.WriteDouble(DoubleField42);
- }
- if (Int64Field43 != 0L) {
- output.WriteRawTag(216, 2);
- output.WriteInt64(Int64Field43);
- }
- if (Int64Field44 != 0L) {
- output.WriteRawTag(224, 2);
- output.WriteInt64(Int64Field44);
- }
- if (DoubleField45 != 0D) {
- output.WriteRawTag(233, 2);
- output.WriteDouble(DoubleField45);
- }
- if (DoubleField46 != 0D) {
- output.WriteRawTag(241, 2);
- output.WriteDouble(DoubleField46);
- }
- if (DoubleField47 != 0D) {
- output.WriteRawTag(249, 2);
- output.WriteDouble(DoubleField47);
- }
- if (DoubleField48 != 0D) {
- output.WriteRawTag(129, 3);
- output.WriteDouble(DoubleField48);
- }
- if (DoubleField49 != 0D) {
- output.WriteRawTag(137, 3);
- output.WriteDouble(DoubleField49);
- }
- if (DoubleField50 != 0D) {
- output.WriteRawTag(145, 3);
- output.WriteDouble(DoubleField50);
- }
- if (DoubleField51 != 0D) {
- output.WriteRawTag(153, 3);
- output.WriteDouble(DoubleField51);
- }
- if (DoubleField52 != 0D) {
- output.WriteRawTag(161, 3);
- output.WriteDouble(DoubleField52);
- }
- if (DoubleField53 != 0D) {
- output.WriteRawTag(169, 3);
- output.WriteDouble(DoubleField53);
- }
- if (DoubleField54 != 0D) {
- output.WriteRawTag(177, 3);
- output.WriteDouble(DoubleField54);
- }
- if (DoubleField55 != 0D) {
- output.WriteRawTag(185, 3);
- output.WriteDouble(DoubleField55);
- }
- if (DoubleField56 != 0D) {
- output.WriteRawTag(193, 3);
- output.WriteDouble(DoubleField56);
- }
- if (DoubleField57 != 0D) {
- output.WriteRawTag(201, 3);
- output.WriteDouble(DoubleField57);
- }
- if (DoubleField58 != 0D) {
- output.WriteRawTag(209, 3);
- output.WriteDouble(DoubleField58);
- }
- if (Int64Field59 != 0L) {
- output.WriteRawTag(216, 3);
- output.WriteInt64(Int64Field59);
- }
- if (Int64Field60 != 0L) {
- output.WriteRawTag(224, 3);
- output.WriteInt64(Int64Field60);
- }
- if (DoubleField62 != 0D) {
- output.WriteRawTag(241, 3);
- output.WriteDouble(DoubleField62);
- }
- if (DoubleField65 != 0D) {
- output.WriteRawTag(137, 4);
- output.WriteDouble(DoubleField65);
- }
- if (DoubleField66 != 0D) {
- output.WriteRawTag(145, 4);
- output.WriteDouble(DoubleField66);
- }
- if (DoubleField67 != 0D) {
- output.WriteRawTag(153, 4);
- output.WriteDouble(DoubleField67);
- }
- if (DoubleField68 != 0D) {
- output.WriteRawTag(161, 4);
- output.WriteDouble(DoubleField68);
- }
- if (DoubleField69 != 0D) {
- output.WriteRawTag(169, 4);
- output.WriteDouble(DoubleField69);
- }
- if (DoubleField70 != 0D) {
- output.WriteRawTag(177, 4);
- output.WriteDouble(DoubleField70);
- }
- if (DoubleField71 != 0D) {
- output.WriteRawTag(185, 4);
- output.WriteDouble(DoubleField71);
- }
- if (DoubleField72 != 0D) {
- output.WriteRawTag(193, 4);
- output.WriteDouble(DoubleField72);
- }
- if (StringField73.Length != 0) {
- output.WriteRawTag(202, 4);
- output.WriteString(StringField73);
- }
- if (StringField74.Length != 0) {
- output.WriteRawTag(210, 4);
- output.WriteString(StringField74);
- }
- if (DoubleField75 != 0D) {
- output.WriteRawTag(217, 4);
- output.WriteDouble(DoubleField75);
- }
- if (DoubleField77 != 0D) {
- output.WriteRawTag(233, 4);
- output.WriteDouble(DoubleField77);
- }
- if (DoubleField78 != 0D) {
- output.WriteRawTag(241, 4);
- output.WriteDouble(DoubleField78);
- }
- if (DoubleField79 != 0D) {
- output.WriteRawTag(249, 4);
- output.WriteDouble(DoubleField79);
- }
- if (EnumField80 != 0) {
- output.WriteRawTag(128, 5);
- output.WriteInt32(EnumField80);
- }
- if (EnumField81 != 0) {
- output.WriteRawTag(136, 5);
- output.WriteInt32(EnumField81);
- }
- if (Int64Field82 != 0L) {
- output.WriteRawTag(144, 5);
- output.WriteInt64(Int64Field82);
- }
- if (EnumField83 != 0) {
- output.WriteRawTag(152, 5);
- output.WriteInt32(EnumField83);
- }
- if (DoubleField84 != 0D) {
- output.WriteRawTag(161, 5);
- output.WriteDouble(DoubleField84);
- }
- if (Int64Field85 != 0L) {
- output.WriteRawTag(168, 5);
- output.WriteInt64(Int64Field85);
- }
- if (Int64Field86 != 0L) {
- output.WriteRawTag(176, 5);
- output.WriteInt64(Int64Field86);
- }
- if (Int64Field87 != 0L) {
- output.WriteRawTag(184, 5);
- output.WriteInt64(Int64Field87);
- }
- if (DoubleField88 != 0D) {
- output.WriteRawTag(193, 5);
- output.WriteDouble(DoubleField88);
- }
- if (DoubleField89 != 0D) {
- output.WriteRawTag(201, 5);
- output.WriteDouble(DoubleField89);
- }
- if (DoubleField90 != 0D) {
- output.WriteRawTag(209, 5);
- output.WriteDouble(DoubleField90);
- }
- if (DoubleField91 != 0D) {
- output.WriteRawTag(217, 5);
- output.WriteDouble(DoubleField91);
- }
- if (DoubleField92 != 0D) {
- output.WriteRawTag(225, 5);
- output.WriteDouble(DoubleField92);
- }
- if (DoubleField93 != 0D) {
- output.WriteRawTag(233, 5);
- output.WriteDouble(DoubleField93);
- }
- if (DoubleField94 != 0D) {
- output.WriteRawTag(241, 5);
- output.WriteDouble(DoubleField94);
- }
- if (DoubleField95 != 0D) {
- output.WriteRawTag(249, 5);
- output.WriteDouble(DoubleField95);
- }
- if (DoubleField96 != 0D) {
- output.WriteRawTag(129, 6);
- output.WriteDouble(DoubleField96);
- }
- if (DoubleField97 != 0D) {
- output.WriteRawTag(137, 6);
- output.WriteDouble(DoubleField97);
- }
- if (DoubleField98 != 0D) {
- output.WriteRawTag(145, 6);
- output.WriteDouble(DoubleField98);
- }
- if (DoubleField99 != 0D) {
- output.WriteRawTag(153, 6);
- output.WriteDouble(DoubleField99);
- }
- repeatedIntField100_.WriteTo(output, _repeated_repeatedIntField100_codec);
- if (DoubleField101 != 0D) {
- output.WriteRawTag(169, 6);
- output.WriteDouble(DoubleField101);
- }
- if (DoubleField102 != 0D) {
- output.WriteRawTag(177, 6);
- output.WriteDouble(DoubleField102);
- }
- if (DoubleField103 != 0D) {
- output.WriteRawTag(185, 6);
- output.WriteDouble(DoubleField103);
- }
- if (DoubleField104 != 0D) {
- output.WriteRawTag(193, 6);
- output.WriteDouble(DoubleField104);
- }
- if (DoubleField105 != 0D) {
- output.WriteRawTag(201, 6);
- output.WriteDouble(DoubleField105);
- }
- if (DoubleField106 != 0D) {
- output.WriteRawTag(209, 6);
- output.WriteDouble(DoubleField106);
- }
- if (Int64Field107 != 0L) {
- output.WriteRawTag(216, 6);
- output.WriteInt64(Int64Field107);
- }
- if (DoubleField108 != 0D) {
- output.WriteRawTag(225, 6);
- output.WriteDouble(DoubleField108);
- }
- if (DoubleField109 != 0D) {
- output.WriteRawTag(233, 6);
- output.WriteDouble(DoubleField109);
- }
- if (Int64Field110 != 0L) {
- output.WriteRawTag(240, 6);
- output.WriteInt64(Int64Field110);
- }
- if (DoubleField111 != 0D) {
- output.WriteRawTag(249, 6);
- output.WriteDouble(DoubleField111);
- }
- if (Int64Field112 != 0L) {
- output.WriteRawTag(128, 7);
- output.WriteInt64(Int64Field112);
- }
- if (DoubleField113 != 0D) {
- output.WriteRawTag(137, 7);
- output.WriteDouble(DoubleField113);
- }
- if (Int64Field114 != 0L) {
- output.WriteRawTag(144, 7);
- output.WriteInt64(Int64Field114);
- }
- if (Int64Field115 != 0L) {
- output.WriteRawTag(152, 7);
- output.WriteInt64(Int64Field115);
- }
- if (DoubleField116 != 0D) {
- output.WriteRawTag(161, 7);
- output.WriteDouble(DoubleField116);
- }
- if (Int64Field117 != 0L) {
- output.WriteRawTag(168, 7);
- output.WriteInt64(Int64Field117);
- }
- if (DoubleField118 != 0D) {
- output.WriteRawTag(177, 7);
- output.WriteDouble(DoubleField118);
- }
- if (DoubleField119 != 0D) {
- output.WriteRawTag(185, 7);
- output.WriteDouble(DoubleField119);
- }
- if (DoubleField120 != 0D) {
- output.WriteRawTag(193, 7);
- output.WriteDouble(DoubleField120);
- }
- if (DoubleField121 != 0D) {
- output.WriteRawTag(201, 7);
- output.WriteDouble(DoubleField121);
- }
- if (DoubleField122 != 0D) {
- output.WriteRawTag(209, 7);
- output.WriteDouble(DoubleField122);
- }
- if (DoubleField123 != 0D) {
- output.WriteRawTag(217, 7);
- output.WriteDouble(DoubleField123);
- }
- if (DoubleField124 != 0D) {
- output.WriteRawTag(225, 7);
- output.WriteDouble(DoubleField124);
- }
- if (Int64Field125 != 0L) {
- output.WriteRawTag(232, 7);
- output.WriteInt64(Int64Field125);
- }
- if (Int64Field126 != 0L) {
- output.WriteRawTag(240, 7);
- output.WriteInt64(Int64Field126);
- }
- if (Int64Field127 != 0L) {
- output.WriteRawTag(248, 7);
- output.WriteInt64(Int64Field127);
- }
- if (DoubleField128 != 0D) {
- output.WriteRawTag(129, 8);
- output.WriteDouble(DoubleField128);
- }
- if (DoubleField129 != 0D) {
- output.WriteRawTag(137, 8);
- output.WriteDouble(DoubleField129);
- }
- if (_unknownFields != null) {
- _unknownFields.WriteTo(output);
- }
- #endif
- }
-
- #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
- if (DoubleField1 != 0D) {
- output.WriteRawTag(9);
- output.WriteDouble(DoubleField1);
- }
- if (Int64Field2 != 0L) {
- output.WriteRawTag(16);
- output.WriteInt64(Int64Field2);
- }
- if (Int64Field3 != 0L) {
- output.WriteRawTag(24);
- output.WriteInt64(Int64Field3);
- }
- if (Int64Field4 != 0L) {
- output.WriteRawTag(32);
- output.WriteInt64(Int64Field4);
- }
- if (DoubleField7 != 0D) {
- output.WriteRawTag(57);
- output.WriteDouble(DoubleField7);
- }
- if (DoubleField8 != 0D) {
- output.WriteRawTag(65);
- output.WriteDouble(DoubleField8);
- }
- if (DoubleField9 != 0D) {
- output.WriteRawTag(73);
- output.WriteDouble(DoubleField9);
- }
- if (DoubleField10 != 0D) {
- output.WriteRawTag(81);
- output.WriteDouble(DoubleField10);
- }
- if (DoubleField11 != 0D) {
- output.WriteRawTag(89);
- output.WriteDouble(DoubleField11);
- }
- if (DoubleField14 != 0D) {
- output.WriteRawTag(113);
- output.WriteDouble(DoubleField14);
- }
- if (DoubleField15 != 0D) {
- output.WriteRawTag(121);
- output.WriteDouble(DoubleField15);
- }
- if (Int64Field19 != 0L) {
- output.WriteRawTag(152, 1);
- output.WriteInt64(Int64Field19);
- }
- if (DoubleField20 != 0D) {
- output.WriteRawTag(161, 1);
- output.WriteDouble(DoubleField20);
- }
- if (DoubleField21 != 0D) {
- output.WriteRawTag(169, 1);
- output.WriteDouble(DoubleField21);
- }
- if (DoubleField22 != 0D) {
- output.WriteRawTag(177, 1);
- output.WriteDouble(DoubleField22);
- }
- if (DoubleField25 != 0D) {
- output.WriteRawTag(201, 1);
- output.WriteDouble(DoubleField25);
- }
- if (Int64Field26 != 0L) {
- output.WriteRawTag(208, 1);
- output.WriteInt64(Int64Field26);
- }
- if (DoubleField28 != 0D) {
- output.WriteRawTag(225, 1);
- output.WriteDouble(DoubleField28);
- }
- if (DoubleField29 != 0D) {
- output.WriteRawTag(233, 1);
- output.WriteDouble(DoubleField29);
- }
- if (DoubleField30 != 0D) {
- output.WriteRawTag(241, 1);
- output.WriteDouble(DoubleField30);
- }
- if (DoubleField31 != 0D) {
- output.WriteRawTag(249, 1);
- output.WriteDouble(DoubleField31);
- }
- if (Int64Field32 != 0L) {
- output.WriteRawTag(128, 2);
- output.WriteInt64(Int64Field32);
- }
- if (Int64Field37 != 0L) {
- output.WriteRawTag(168, 2);
- output.WriteInt64(Int64Field37);
- }
- if (DoubleField38 != 0D) {
- output.WriteRawTag(177, 2);
- output.WriteDouble(DoubleField38);
- }
- if (Interactions != 0L) {
- output.WriteRawTag(184, 2);
- output.WriteInt64(Interactions);
- }
- if (DoubleField40 != 0D) {
- output.WriteRawTag(193, 2);
- output.WriteDouble(DoubleField40);
- }
- if (Int64Field41 != 0L) {
- output.WriteRawTag(200, 2);
- output.WriteInt64(Int64Field41);
- }
- if (DoubleField42 != 0D) {
- output.WriteRawTag(209, 2);
- output.WriteDouble(DoubleField42);
- }
- if (Int64Field43 != 0L) {
- output.WriteRawTag(216, 2);
- output.WriteInt64(Int64Field43);
- }
- if (Int64Field44 != 0L) {
- output.WriteRawTag(224, 2);
- output.WriteInt64(Int64Field44);
- }
- if (DoubleField45 != 0D) {
- output.WriteRawTag(233, 2);
- output.WriteDouble(DoubleField45);
- }
- if (DoubleField46 != 0D) {
- output.WriteRawTag(241, 2);
- output.WriteDouble(DoubleField46);
- }
- if (DoubleField47 != 0D) {
- output.WriteRawTag(249, 2);
- output.WriteDouble(DoubleField47);
- }
- if (DoubleField48 != 0D) {
- output.WriteRawTag(129, 3);
- output.WriteDouble(DoubleField48);
- }
- if (DoubleField49 != 0D) {
- output.WriteRawTag(137, 3);
- output.WriteDouble(DoubleField49);
- }
- if (DoubleField50 != 0D) {
- output.WriteRawTag(145, 3);
- output.WriteDouble(DoubleField50);
- }
- if (DoubleField51 != 0D) {
- output.WriteRawTag(153, 3);
- output.WriteDouble(DoubleField51);
- }
- if (DoubleField52 != 0D) {
- output.WriteRawTag(161, 3);
- output.WriteDouble(DoubleField52);
- }
- if (DoubleField53 != 0D) {
- output.WriteRawTag(169, 3);
- output.WriteDouble(DoubleField53);
- }
- if (DoubleField54 != 0D) {
- output.WriteRawTag(177, 3);
- output.WriteDouble(DoubleField54);
- }
- if (DoubleField55 != 0D) {
- output.WriteRawTag(185, 3);
- output.WriteDouble(DoubleField55);
- }
- if (DoubleField56 != 0D) {
- output.WriteRawTag(193, 3);
- output.WriteDouble(DoubleField56);
- }
- if (DoubleField57 != 0D) {
- output.WriteRawTag(201, 3);
- output.WriteDouble(DoubleField57);
- }
- if (DoubleField58 != 0D) {
- output.WriteRawTag(209, 3);
- output.WriteDouble(DoubleField58);
- }
- if (Int64Field59 != 0L) {
- output.WriteRawTag(216, 3);
- output.WriteInt64(Int64Field59);
- }
- if (Int64Field60 != 0L) {
- output.WriteRawTag(224, 3);
- output.WriteInt64(Int64Field60);
- }
- if (DoubleField62 != 0D) {
- output.WriteRawTag(241, 3);
- output.WriteDouble(DoubleField62);
- }
- if (DoubleField65 != 0D) {
- output.WriteRawTag(137, 4);
- output.WriteDouble(DoubleField65);
- }
- if (DoubleField66 != 0D) {
- output.WriteRawTag(145, 4);
- output.WriteDouble(DoubleField66);
- }
- if (DoubleField67 != 0D) {
- output.WriteRawTag(153, 4);
- output.WriteDouble(DoubleField67);
- }
- if (DoubleField68 != 0D) {
- output.WriteRawTag(161, 4);
- output.WriteDouble(DoubleField68);
- }
- if (DoubleField69 != 0D) {
- output.WriteRawTag(169, 4);
- output.WriteDouble(DoubleField69);
- }
- if (DoubleField70 != 0D) {
- output.WriteRawTag(177, 4);
- output.WriteDouble(DoubleField70);
- }
- if (DoubleField71 != 0D) {
- output.WriteRawTag(185, 4);
- output.WriteDouble(DoubleField71);
- }
- if (DoubleField72 != 0D) {
- output.WriteRawTag(193, 4);
- output.WriteDouble(DoubleField72);
- }
- if (StringField73.Length != 0) {
- output.WriteRawTag(202, 4);
- output.WriteString(StringField73);
- }
- if (StringField74.Length != 0) {
- output.WriteRawTag(210, 4);
- output.WriteString(StringField74);
- }
- if (DoubleField75 != 0D) {
- output.WriteRawTag(217, 4);
- output.WriteDouble(DoubleField75);
- }
- if (DoubleField77 != 0D) {
- output.WriteRawTag(233, 4);
- output.WriteDouble(DoubleField77);
- }
- if (DoubleField78 != 0D) {
- output.WriteRawTag(241, 4);
- output.WriteDouble(DoubleField78);
- }
- if (DoubleField79 != 0D) {
- output.WriteRawTag(249, 4);
- output.WriteDouble(DoubleField79);
- }
- if (EnumField80 != 0) {
- output.WriteRawTag(128, 5);
- output.WriteInt32(EnumField80);
- }
- if (EnumField81 != 0) {
- output.WriteRawTag(136, 5);
- output.WriteInt32(EnumField81);
- }
- if (Int64Field82 != 0L) {
- output.WriteRawTag(144, 5);
- output.WriteInt64(Int64Field82);
- }
- if (EnumField83 != 0) {
- output.WriteRawTag(152, 5);
- output.WriteInt32(EnumField83);
- }
- if (DoubleField84 != 0D) {
- output.WriteRawTag(161, 5);
- output.WriteDouble(DoubleField84);
- }
- if (Int64Field85 != 0L) {
- output.WriteRawTag(168, 5);
- output.WriteInt64(Int64Field85);
- }
- if (Int64Field86 != 0L) {
- output.WriteRawTag(176, 5);
- output.WriteInt64(Int64Field86);
- }
- if (Int64Field87 != 0L) {
- output.WriteRawTag(184, 5);
- output.WriteInt64(Int64Field87);
- }
- if (DoubleField88 != 0D) {
- output.WriteRawTag(193, 5);
- output.WriteDouble(DoubleField88);
- }
- if (DoubleField89 != 0D) {
- output.WriteRawTag(201, 5);
- output.WriteDouble(DoubleField89);
- }
- if (DoubleField90 != 0D) {
- output.WriteRawTag(209, 5);
- output.WriteDouble(DoubleField90);
- }
- if (DoubleField91 != 0D) {
- output.WriteRawTag(217, 5);
- output.WriteDouble(DoubleField91);
- }
- if (DoubleField92 != 0D) {
- output.WriteRawTag(225, 5);
- output.WriteDouble(DoubleField92);
- }
- if (DoubleField93 != 0D) {
- output.WriteRawTag(233, 5);
- output.WriteDouble(DoubleField93);
- }
- if (DoubleField94 != 0D) {
- output.WriteRawTag(241, 5);
- output.WriteDouble(DoubleField94);
- }
- if (DoubleField95 != 0D) {
- output.WriteRawTag(249, 5);
- output.WriteDouble(DoubleField95);
- }
- if (DoubleField96 != 0D) {
- output.WriteRawTag(129, 6);
- output.WriteDouble(DoubleField96);
- }
- if (DoubleField97 != 0D) {
- output.WriteRawTag(137, 6);
- output.WriteDouble(DoubleField97);
- }
- if (DoubleField98 != 0D) {
- output.WriteRawTag(145, 6);
- output.WriteDouble(DoubleField98);
- }
- if (DoubleField99 != 0D) {
- output.WriteRawTag(153, 6);
- output.WriteDouble(DoubleField99);
- }
- repeatedIntField100_.WriteTo(ref output, _repeated_repeatedIntField100_codec);
- if (DoubleField101 != 0D) {
- output.WriteRawTag(169, 6);
- output.WriteDouble(DoubleField101);
- }
- if (DoubleField102 != 0D) {
- output.WriteRawTag(177, 6);
- output.WriteDouble(DoubleField102);
- }
- if (DoubleField103 != 0D) {
- output.WriteRawTag(185, 6);
- output.WriteDouble(DoubleField103);
- }
- if (DoubleField104 != 0D) {
- output.WriteRawTag(193, 6);
- output.WriteDouble(DoubleField104);
- }
- if (DoubleField105 != 0D) {
- output.WriteRawTag(201, 6);
- output.WriteDouble(DoubleField105);
- }
- if (DoubleField106 != 0D) {
- output.WriteRawTag(209, 6);
- output.WriteDouble(DoubleField106);
- }
- if (Int64Field107 != 0L) {
- output.WriteRawTag(216, 6);
- output.WriteInt64(Int64Field107);
- }
- if (DoubleField108 != 0D) {
- output.WriteRawTag(225, 6);
- output.WriteDouble(DoubleField108);
- }
- if (DoubleField109 != 0D) {
- output.WriteRawTag(233, 6);
- output.WriteDouble(DoubleField109);
- }
- if (Int64Field110 != 0L) {
- output.WriteRawTag(240, 6);
- output.WriteInt64(Int64Field110);
- }
- if (DoubleField111 != 0D) {
- output.WriteRawTag(249, 6);
- output.WriteDouble(DoubleField111);
- }
- if (Int64Field112 != 0L) {
- output.WriteRawTag(128, 7);
- output.WriteInt64(Int64Field112);
- }
- if (DoubleField113 != 0D) {
- output.WriteRawTag(137, 7);
- output.WriteDouble(DoubleField113);
- }
- if (Int64Field114 != 0L) {
- output.WriteRawTag(144, 7);
- output.WriteInt64(Int64Field114);
- }
- if (Int64Field115 != 0L) {
- output.WriteRawTag(152, 7);
- output.WriteInt64(Int64Field115);
- }
- if (DoubleField116 != 0D) {
- output.WriteRawTag(161, 7);
- output.WriteDouble(DoubleField116);
- }
- if (Int64Field117 != 0L) {
- output.WriteRawTag(168, 7);
- output.WriteInt64(Int64Field117);
- }
- if (DoubleField118 != 0D) {
- output.WriteRawTag(177, 7);
- output.WriteDouble(DoubleField118);
- }
- if (DoubleField119 != 0D) {
- output.WriteRawTag(185, 7);
- output.WriteDouble(DoubleField119);
- }
- if (DoubleField120 != 0D) {
- output.WriteRawTag(193, 7);
- output.WriteDouble(DoubleField120);
- }
- if (DoubleField121 != 0D) {
- output.WriteRawTag(201, 7);
- output.WriteDouble(DoubleField121);
- }
- if (DoubleField122 != 0D) {
- output.WriteRawTag(209, 7);
- output.WriteDouble(DoubleField122);
- }
- if (DoubleField123 != 0D) {
- output.WriteRawTag(217, 7);
- output.WriteDouble(DoubleField123);
- }
- if (DoubleField124 != 0D) {
- output.WriteRawTag(225, 7);
- output.WriteDouble(DoubleField124);
- }
- if (Int64Field125 != 0L) {
- output.WriteRawTag(232, 7);
- output.WriteInt64(Int64Field125);
- }
- if (Int64Field126 != 0L) {
- output.WriteRawTag(240, 7);
- output.WriteInt64(Int64Field126);
- }
- if (Int64Field127 != 0L) {
- output.WriteRawTag(248, 7);
- output.WriteInt64(Int64Field127);
- }
- if (DoubleField128 != 0D) {
- output.WriteRawTag(129, 8);
- output.WriteDouble(DoubleField128);
- }
- if (DoubleField129 != 0D) {
- output.WriteRawTag(137, 8);
- output.WriteDouble(DoubleField129);
- }
- if (_unknownFields != null) {
- _unknownFields.WriteTo(ref output);
- }
- }
- #endif
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public int CalculateSize() {
- int size = 0;
- if (DoubleField95 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField1 != 0D) {
- size += 1 + 8;
- }
- if (DoubleField79 != 0D) {
- size += 2 + 8;
- }
- if (Int64Field2 != 0L) {
- size += 1 + pb::CodedOutputStream.ComputeInt64Size(Int64Field2);
- }
- if (DoubleField96 != 0D) {
- size += 2 + 8;
- }
- if (Int64Field3 != 0L) {
- size += 1 + pb::CodedOutputStream.ComputeInt64Size(Int64Field3);
- }
- if (Int64Field4 != 0L) {
- size += 1 + pb::CodedOutputStream.ComputeInt64Size(Int64Field4);
- }
- if (DoubleField97 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField65 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField66 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField7 != 0D) {
- size += 1 + 8;
- }
- if (DoubleField62 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField118 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField119 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField67 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField120 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField121 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField122 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField123 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField124 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField8 != 0D) {
- size += 1 + 8;
- }
- if (DoubleField9 != 0D) {
- size += 1 + 8;
- }
- if (DoubleField98 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField10 != 0D) {
- size += 1 + 8;
- }
- if (DoubleField11 != 0D) {
- size += 1 + 8;
- }
- if (DoubleField99 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField84 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField14 != 0D) {
- size += 1 + 8;
- }
- if (DoubleField77 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField15 != 0D) {
- size += 1 + 8;
- }
- if (Int64Field19 != 0L) {
- size += 2 + pb::CodedOutputStream.ComputeInt64Size(Int64Field19);
- }
- if (Int64Field115 != 0L) {
- size += 2 + pb::CodedOutputStream.ComputeInt64Size(Int64Field115);
- }
- if (DoubleField116 != 0D) {
- size += 2 + 8;
- }
- if (Int64Field117 != 0L) {
- size += 2 + pb::CodedOutputStream.ComputeInt64Size(Int64Field117);
- }
- if (DoubleField20 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField21 != 0D) {
- size += 2 + 8;
- }
- if (StringField73.Length != 0) {
- size += 2 + pb::CodedOutputStream.ComputeStringSize(StringField73);
- }
- if (StringField74.Length != 0) {
- size += 2 + pb::CodedOutputStream.ComputeStringSize(StringField74);
- }
- if (DoubleField22 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField69 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField70 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField71 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField72 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField25 != 0D) {
- size += 2 + 8;
- }
- if (Int64Field26 != 0L) {
- size += 2 + pb::CodedOutputStream.ComputeInt64Size(Int64Field26);
- }
- if (DoubleField68 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField28 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField106 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField29 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField30 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField101 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField102 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField103 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField104 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField105 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField31 != 0D) {
- size += 2 + 8;
- }
- if (Int64Field32 != 0L) {
- size += 2 + pb::CodedOutputStream.ComputeInt64Size(Int64Field32);
- }
- if (DoubleField75 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField129 != 0D) {
- size += 2 + 8;
- }
- if (EnumField80 != 0) {
- size += 2 + pb::CodedOutputStream.ComputeInt32Size(EnumField80);
- }
- if (EnumField81 != 0) {
- size += 2 + pb::CodedOutputStream.ComputeInt32Size(EnumField81);
- }
- if (Int64Field82 != 0L) {
- size += 2 + pb::CodedOutputStream.ComputeInt64Size(Int64Field82);
- }
- if (EnumField83 != 0) {
- size += 2 + pb::CodedOutputStream.ComputeInt32Size(EnumField83);
- }
- if (Int64Field85 != 0L) {
- size += 2 + pb::CodedOutputStream.ComputeInt64Size(Int64Field85);
- }
- if (Int64Field86 != 0L) {
- size += 2 + pb::CodedOutputStream.ComputeInt64Size(Int64Field86);
- }
- if (Int64Field87 != 0L) {
- size += 2 + pb::CodedOutputStream.ComputeInt64Size(Int64Field87);
- }
- if (Int64Field125 != 0L) {
- size += 2 + pb::CodedOutputStream.ComputeInt64Size(Int64Field125);
- }
- if (Int64Field37 != 0L) {
- size += 2 + pb::CodedOutputStream.ComputeInt64Size(Int64Field37);
- }
- if (DoubleField38 != 0D) {
- size += 2 + 8;
- }
- if (Interactions != 0L) {
- size += 2 + pb::CodedOutputStream.ComputeInt64Size(Interactions);
- }
- size += repeatedIntField100_.CalculateSize(_repeated_repeatedIntField100_codec);
- if (DoubleField40 != 0D) {
- size += 2 + 8;
- }
- if (Int64Field41 != 0L) {
- size += 2 + pb::CodedOutputStream.ComputeInt64Size(Int64Field41);
- }
- if (Int64Field126 != 0L) {
- size += 2 + pb::CodedOutputStream.ComputeInt64Size(Int64Field126);
- }
- if (Int64Field127 != 0L) {
- size += 2 + pb::CodedOutputStream.ComputeInt64Size(Int64Field127);
- }
- if (DoubleField128 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField109 != 0D) {
- size += 2 + 8;
- }
- if (Int64Field110 != 0L) {
- size += 2 + pb::CodedOutputStream.ComputeInt64Size(Int64Field110);
- }
- if (DoubleField111 != 0D) {
- size += 2 + 8;
- }
- if (Int64Field112 != 0L) {
- size += 2 + pb::CodedOutputStream.ComputeInt64Size(Int64Field112);
- }
- if (DoubleField113 != 0D) {
- size += 2 + 8;
- }
- if (Int64Field114 != 0L) {
- size += 2 + pb::CodedOutputStream.ComputeInt64Size(Int64Field114);
- }
- if (DoubleField42 != 0D) {
- size += 2 + 8;
- }
- if (Int64Field43 != 0L) {
- size += 2 + pb::CodedOutputStream.ComputeInt64Size(Int64Field43);
- }
- if (Int64Field44 != 0L) {
- size += 2 + pb::CodedOutputStream.ComputeInt64Size(Int64Field44);
- }
- if (DoubleField45 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField46 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField78 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField88 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField47 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField89 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField48 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField49 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField50 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField90 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField51 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField91 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField92 != 0D) {
- size += 2 + 8;
- }
- if (Int64Field107 != 0L) {
- size += 2 + pb::CodedOutputStream.ComputeInt64Size(Int64Field107);
- }
- if (DoubleField93 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField108 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField52 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField53 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField94 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField54 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField55 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField56 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField57 != 0D) {
- size += 2 + 8;
- }
- if (DoubleField58 != 0D) {
- size += 2 + 8;
- }
- if (Int64Field59 != 0L) {
- size += 2 + pb::CodedOutputStream.ComputeInt64Size(Int64Field59);
- }
- if (Int64Field60 != 0L) {
- size += 2 + pb::CodedOutputStream.ComputeInt64Size(Int64Field60);
- }
- if (_unknownFields != null) {
- size += _unknownFields.CalculateSize();
- }
- return size;
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public void MergeFrom(ManyPrimitiveFieldsMessage other) {
- if (other == null) {
- return;
- }
- if (other.DoubleField95 != 0D) {
- DoubleField95 = other.DoubleField95;
- }
- if (other.DoubleField1 != 0D) {
- DoubleField1 = other.DoubleField1;
- }
- if (other.DoubleField79 != 0D) {
- DoubleField79 = other.DoubleField79;
- }
- if (other.Int64Field2 != 0L) {
- Int64Field2 = other.Int64Field2;
- }
- if (other.DoubleField96 != 0D) {
- DoubleField96 = other.DoubleField96;
- }
- if (other.Int64Field3 != 0L) {
- Int64Field3 = other.Int64Field3;
- }
- if (other.Int64Field4 != 0L) {
- Int64Field4 = other.Int64Field4;
- }
- if (other.DoubleField97 != 0D) {
- DoubleField97 = other.DoubleField97;
- }
- if (other.DoubleField65 != 0D) {
- DoubleField65 = other.DoubleField65;
- }
- if (other.DoubleField66 != 0D) {
- DoubleField66 = other.DoubleField66;
- }
- if (other.DoubleField7 != 0D) {
- DoubleField7 = other.DoubleField7;
- }
- if (other.DoubleField62 != 0D) {
- DoubleField62 = other.DoubleField62;
- }
- if (other.DoubleField118 != 0D) {
- DoubleField118 = other.DoubleField118;
- }
- if (other.DoubleField119 != 0D) {
- DoubleField119 = other.DoubleField119;
- }
- if (other.DoubleField67 != 0D) {
- DoubleField67 = other.DoubleField67;
- }
- if (other.DoubleField120 != 0D) {
- DoubleField120 = other.DoubleField120;
- }
- if (other.DoubleField121 != 0D) {
- DoubleField121 = other.DoubleField121;
- }
- if (other.DoubleField122 != 0D) {
- DoubleField122 = other.DoubleField122;
- }
- if (other.DoubleField123 != 0D) {
- DoubleField123 = other.DoubleField123;
- }
- if (other.DoubleField124 != 0D) {
- DoubleField124 = other.DoubleField124;
- }
- if (other.DoubleField8 != 0D) {
- DoubleField8 = other.DoubleField8;
- }
- if (other.DoubleField9 != 0D) {
- DoubleField9 = other.DoubleField9;
- }
- if (other.DoubleField98 != 0D) {
- DoubleField98 = other.DoubleField98;
- }
- if (other.DoubleField10 != 0D) {
- DoubleField10 = other.DoubleField10;
- }
- if (other.DoubleField11 != 0D) {
- DoubleField11 = other.DoubleField11;
- }
- if (other.DoubleField99 != 0D) {
- DoubleField99 = other.DoubleField99;
- }
- if (other.DoubleField84 != 0D) {
- DoubleField84 = other.DoubleField84;
- }
- if (other.DoubleField14 != 0D) {
- DoubleField14 = other.DoubleField14;
- }
- if (other.DoubleField77 != 0D) {
- DoubleField77 = other.DoubleField77;
- }
- if (other.DoubleField15 != 0D) {
- DoubleField15 = other.DoubleField15;
- }
- if (other.Int64Field19 != 0L) {
- Int64Field19 = other.Int64Field19;
- }
- if (other.Int64Field115 != 0L) {
- Int64Field115 = other.Int64Field115;
- }
- if (other.DoubleField116 != 0D) {
- DoubleField116 = other.DoubleField116;
- }
- if (other.Int64Field117 != 0L) {
- Int64Field117 = other.Int64Field117;
- }
- if (other.DoubleField20 != 0D) {
- DoubleField20 = other.DoubleField20;
- }
- if (other.DoubleField21 != 0D) {
- DoubleField21 = other.DoubleField21;
- }
- if (other.StringField73.Length != 0) {
- StringField73 = other.StringField73;
- }
- if (other.StringField74.Length != 0) {
- StringField74 = other.StringField74;
- }
- if (other.DoubleField22 != 0D) {
- DoubleField22 = other.DoubleField22;
- }
- if (other.DoubleField69 != 0D) {
- DoubleField69 = other.DoubleField69;
- }
- if (other.DoubleField70 != 0D) {
- DoubleField70 = other.DoubleField70;
- }
- if (other.DoubleField71 != 0D) {
- DoubleField71 = other.DoubleField71;
- }
- if (other.DoubleField72 != 0D) {
- DoubleField72 = other.DoubleField72;
- }
- if (other.DoubleField25 != 0D) {
- DoubleField25 = other.DoubleField25;
- }
- if (other.Int64Field26 != 0L) {
- Int64Field26 = other.Int64Field26;
- }
- if (other.DoubleField68 != 0D) {
- DoubleField68 = other.DoubleField68;
- }
- if (other.DoubleField28 != 0D) {
- DoubleField28 = other.DoubleField28;
- }
- if (other.DoubleField106 != 0D) {
- DoubleField106 = other.DoubleField106;
- }
- if (other.DoubleField29 != 0D) {
- DoubleField29 = other.DoubleField29;
- }
- if (other.DoubleField30 != 0D) {
- DoubleField30 = other.DoubleField30;
- }
- if (other.DoubleField101 != 0D) {
- DoubleField101 = other.DoubleField101;
- }
- if (other.DoubleField102 != 0D) {
- DoubleField102 = other.DoubleField102;
- }
- if (other.DoubleField103 != 0D) {
- DoubleField103 = other.DoubleField103;
- }
- if (other.DoubleField104 != 0D) {
- DoubleField104 = other.DoubleField104;
- }
- if (other.DoubleField105 != 0D) {
- DoubleField105 = other.DoubleField105;
- }
- if (other.DoubleField31 != 0D) {
- DoubleField31 = other.DoubleField31;
- }
- if (other.Int64Field32 != 0L) {
- Int64Field32 = other.Int64Field32;
- }
- if (other.DoubleField75 != 0D) {
- DoubleField75 = other.DoubleField75;
- }
- if (other.DoubleField129 != 0D) {
- DoubleField129 = other.DoubleField129;
- }
- if (other.EnumField80 != 0) {
- EnumField80 = other.EnumField80;
- }
- if (other.EnumField81 != 0) {
- EnumField81 = other.EnumField81;
- }
- if (other.Int64Field82 != 0L) {
- Int64Field82 = other.Int64Field82;
- }
- if (other.EnumField83 != 0) {
- EnumField83 = other.EnumField83;
- }
- if (other.Int64Field85 != 0L) {
- Int64Field85 = other.Int64Field85;
- }
- if (other.Int64Field86 != 0L) {
- Int64Field86 = other.Int64Field86;
- }
- if (other.Int64Field87 != 0L) {
- Int64Field87 = other.Int64Field87;
- }
- if (other.Int64Field125 != 0L) {
- Int64Field125 = other.Int64Field125;
- }
- if (other.Int64Field37 != 0L) {
- Int64Field37 = other.Int64Field37;
- }
- if (other.DoubleField38 != 0D) {
- DoubleField38 = other.DoubleField38;
- }
- if (other.Interactions != 0L) {
- Interactions = other.Interactions;
- }
- repeatedIntField100_.Add(other.repeatedIntField100_);
- if (other.DoubleField40 != 0D) {
- DoubleField40 = other.DoubleField40;
- }
- if (other.Int64Field41 != 0L) {
- Int64Field41 = other.Int64Field41;
- }
- if (other.Int64Field126 != 0L) {
- Int64Field126 = other.Int64Field126;
- }
- if (other.Int64Field127 != 0L) {
- Int64Field127 = other.Int64Field127;
- }
- if (other.DoubleField128 != 0D) {
- DoubleField128 = other.DoubleField128;
- }
- if (other.DoubleField109 != 0D) {
- DoubleField109 = other.DoubleField109;
- }
- if (other.Int64Field110 != 0L) {
- Int64Field110 = other.Int64Field110;
- }
- if (other.DoubleField111 != 0D) {
- DoubleField111 = other.DoubleField111;
- }
- if (other.Int64Field112 != 0L) {
- Int64Field112 = other.Int64Field112;
- }
- if (other.DoubleField113 != 0D) {
- DoubleField113 = other.DoubleField113;
- }
- if (other.Int64Field114 != 0L) {
- Int64Field114 = other.Int64Field114;
- }
- if (other.DoubleField42 != 0D) {
- DoubleField42 = other.DoubleField42;
- }
- if (other.Int64Field43 != 0L) {
- Int64Field43 = other.Int64Field43;
- }
- if (other.Int64Field44 != 0L) {
- Int64Field44 = other.Int64Field44;
- }
- if (other.DoubleField45 != 0D) {
- DoubleField45 = other.DoubleField45;
- }
- if (other.DoubleField46 != 0D) {
- DoubleField46 = other.DoubleField46;
- }
- if (other.DoubleField78 != 0D) {
- DoubleField78 = other.DoubleField78;
- }
- if (other.DoubleField88 != 0D) {
- DoubleField88 = other.DoubleField88;
- }
- if (other.DoubleField47 != 0D) {
- DoubleField47 = other.DoubleField47;
- }
- if (other.DoubleField89 != 0D) {
- DoubleField89 = other.DoubleField89;
- }
- if (other.DoubleField48 != 0D) {
- DoubleField48 = other.DoubleField48;
- }
- if (other.DoubleField49 != 0D) {
- DoubleField49 = other.DoubleField49;
- }
- if (other.DoubleField50 != 0D) {
- DoubleField50 = other.DoubleField50;
- }
- if (other.DoubleField90 != 0D) {
- DoubleField90 = other.DoubleField90;
- }
- if (other.DoubleField51 != 0D) {
- DoubleField51 = other.DoubleField51;
- }
- if (other.DoubleField91 != 0D) {
- DoubleField91 = other.DoubleField91;
- }
- if (other.DoubleField92 != 0D) {
- DoubleField92 = other.DoubleField92;
- }
- if (other.Int64Field107 != 0L) {
- Int64Field107 = other.Int64Field107;
- }
- if (other.DoubleField93 != 0D) {
- DoubleField93 = other.DoubleField93;
- }
- if (other.DoubleField108 != 0D) {
- DoubleField108 = other.DoubleField108;
- }
- if (other.DoubleField52 != 0D) {
- DoubleField52 = other.DoubleField52;
- }
- if (other.DoubleField53 != 0D) {
- DoubleField53 = other.DoubleField53;
- }
- if (other.DoubleField94 != 0D) {
- DoubleField94 = other.DoubleField94;
- }
- if (other.DoubleField54 != 0D) {
- DoubleField54 = other.DoubleField54;
- }
- if (other.DoubleField55 != 0D) {
- DoubleField55 = other.DoubleField55;
- }
- if (other.DoubleField56 != 0D) {
- DoubleField56 = other.DoubleField56;
- }
- if (other.DoubleField57 != 0D) {
- DoubleField57 = other.DoubleField57;
- }
- if (other.DoubleField58 != 0D) {
- DoubleField58 = other.DoubleField58;
- }
- if (other.Int64Field59 != 0L) {
- Int64Field59 = other.Int64Field59;
- }
- if (other.Int64Field60 != 0L) {
- Int64Field60 = other.Int64Field60;
- }
- _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
- }
-
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- public void MergeFrom(pb::CodedInputStream input) {
- #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
- input.ReadRawMessage(this);
- #else
- uint tag;
- while ((tag = input.ReadTag()) != 0) {
- switch(tag) {
- default:
- _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
- break;
- case 9: {
- DoubleField1 = input.ReadDouble();
- break;
- }
- case 16: {
- Int64Field2 = input.ReadInt64();
- break;
- }
- case 24: {
- Int64Field3 = input.ReadInt64();
- break;
- }
- case 32: {
- Int64Field4 = input.ReadInt64();
- break;
- }
- case 57: {
- DoubleField7 = input.ReadDouble();
- break;
- }
- case 65: {
- DoubleField8 = input.ReadDouble();
- break;
- }
- case 73: {
- DoubleField9 = input.ReadDouble();
- break;
- }
- case 81: {
- DoubleField10 = input.ReadDouble();
- break;
- }
- case 89: {
- DoubleField11 = input.ReadDouble();
- break;
- }
- case 113: {
- DoubleField14 = input.ReadDouble();
- break;
- }
- case 121: {
- DoubleField15 = input.ReadDouble();
- break;
- }
- case 152: {
- Int64Field19 = input.ReadInt64();
- break;
- }
- case 161: {
- DoubleField20 = input.ReadDouble();
- break;
- }
- case 169: {
- DoubleField21 = input.ReadDouble();
- break;
- }
- case 177: {
- DoubleField22 = input.ReadDouble();
- break;
- }
- case 201: {
- DoubleField25 = input.ReadDouble();
- break;
- }
- case 208: {
- Int64Field26 = input.ReadInt64();
- break;
- }
- case 225: {
- DoubleField28 = input.ReadDouble();
- break;
- }
- case 233: {
- DoubleField29 = input.ReadDouble();
- break;
- }
- case 241: {
- DoubleField30 = input.ReadDouble();
- break;
- }
- case 249: {
- DoubleField31 = input.ReadDouble();
- break;
- }
- case 256: {
- Int64Field32 = input.ReadInt64();
- break;
- }
- case 296: {
- Int64Field37 = input.ReadInt64();
- break;
- }
- case 305: {
- DoubleField38 = input.ReadDouble();
- break;
- }
- case 312: {
- Interactions = input.ReadInt64();
- break;
- }
- case 321: {
- DoubleField40 = input.ReadDouble();
- break;
- }
- case 328: {
- Int64Field41 = input.ReadInt64();
- break;
- }
- case 337: {
- DoubleField42 = input.ReadDouble();
- break;
- }
- case 344: {
- Int64Field43 = input.ReadInt64();
- break;
- }
- case 352: {
- Int64Field44 = input.ReadInt64();
- break;
- }
- case 361: {
- DoubleField45 = input.ReadDouble();
- break;
- }
- case 369: {
- DoubleField46 = input.ReadDouble();
- break;
- }
- case 377: {
- DoubleField47 = input.ReadDouble();
- break;
- }
- case 385: {
- DoubleField48 = input.ReadDouble();
- break;
- }
- case 393: {
- DoubleField49 = input.ReadDouble();
- break;
- }
- case 401: {
- DoubleField50 = input.ReadDouble();
- break;
- }
- case 409: {
- DoubleField51 = input.ReadDouble();
- break;
- }
- case 417: {
- DoubleField52 = input.ReadDouble();
- break;
- }
- case 425: {
- DoubleField53 = input.ReadDouble();
- break;
- }
- case 433: {
- DoubleField54 = input.ReadDouble();
- break;
- }
- case 441: {
- DoubleField55 = input.ReadDouble();
- break;
- }
- case 449: {
- DoubleField56 = input.ReadDouble();
- break;
- }
- case 457: {
- DoubleField57 = input.ReadDouble();
- break;
- }
- case 465: {
- DoubleField58 = input.ReadDouble();
- break;
- }
- case 472: {
- Int64Field59 = input.ReadInt64();
- break;
- }
- case 480: {
- Int64Field60 = input.ReadInt64();
- break;
- }
- case 497: {
- DoubleField62 = input.ReadDouble();
- break;
- }
- case 521: {
- DoubleField65 = input.ReadDouble();
- break;
- }
- case 529: {
- DoubleField66 = input.ReadDouble();
- break;
- }
- case 537: {
- DoubleField67 = input.ReadDouble();
- break;
- }
- case 545: {
- DoubleField68 = input.ReadDouble();
- break;
- }
- case 553: {
- DoubleField69 = input.ReadDouble();
- break;
- }
- case 561: {
- DoubleField70 = input.ReadDouble();
- break;
- }
- case 569: {
- DoubleField71 = input.ReadDouble();
- break;
- }
- case 577: {
- DoubleField72 = input.ReadDouble();
- break;
- }
- case 586: {
- StringField73 = input.ReadString();
- break;
- }
- case 594: {
- StringField74 = input.ReadString();
- break;
- }
- case 601: {
- DoubleField75 = input.ReadDouble();
- break;
- }
- case 617: {
- DoubleField77 = input.ReadDouble();
- break;
- }
- case 625: {
- DoubleField78 = input.ReadDouble();
- break;
- }
- case 633: {
- DoubleField79 = input.ReadDouble();
- break;
- }
- case 640: {
- EnumField80 = input.ReadInt32();
- break;
- }
- case 648: {
- EnumField81 = input.ReadInt32();
- break;
- }
- case 656: {
- Int64Field82 = input.ReadInt64();
- break;
- }
- case 664: {
- EnumField83 = input.ReadInt32();
- break;
- }
- case 673: {
- DoubleField84 = input.ReadDouble();
- break;
- }
- case 680: {
- Int64Field85 = input.ReadInt64();
- break;
- }
- case 688: {
- Int64Field86 = input.ReadInt64();
- break;
- }
- case 696: {
- Int64Field87 = input.ReadInt64();
- break;
- }
- case 705: {
- DoubleField88 = input.ReadDouble();
- break;
- }
- case 713: {
- DoubleField89 = input.ReadDouble();
- break;
- }
- case 721: {
- DoubleField90 = input.ReadDouble();
- break;
- }
- case 729: {
- DoubleField91 = input.ReadDouble();
- break;
- }
- case 737: {
- DoubleField92 = input.ReadDouble();
- break;
- }
- case 745: {
- DoubleField93 = input.ReadDouble();
- break;
- }
- case 753: {
- DoubleField94 = input.ReadDouble();
- break;
- }
- case 761: {
- DoubleField95 = input.ReadDouble();
- break;
- }
- case 769: {
- DoubleField96 = input.ReadDouble();
- break;
- }
- case 777: {
- DoubleField97 = input.ReadDouble();
- break;
- }
- case 785: {
- DoubleField98 = input.ReadDouble();
- break;
- }
- case 793: {
- DoubleField99 = input.ReadDouble();
- break;
- }
- case 802:
- case 800: {
- repeatedIntField100_.AddEntriesFrom(input, _repeated_repeatedIntField100_codec);
- break;
- }
- case 809: {
- DoubleField101 = input.ReadDouble();
- break;
- }
- case 817: {
- DoubleField102 = input.ReadDouble();
- break;
- }
- case 825: {
- DoubleField103 = input.ReadDouble();
- break;
- }
- case 833: {
- DoubleField104 = input.ReadDouble();
- break;
- }
- case 841: {
- DoubleField105 = input.ReadDouble();
- break;
- }
- case 849: {
- DoubleField106 = input.ReadDouble();
- break;
- }
- case 856: {
- Int64Field107 = input.ReadInt64();
- break;
- }
- case 865: {
- DoubleField108 = input.ReadDouble();
- break;
- }
- case 873: {
- DoubleField109 = input.ReadDouble();
- break;
- }
- case 880: {
- Int64Field110 = input.ReadInt64();
- break;
- }
- case 889: {
- DoubleField111 = input.ReadDouble();
- break;
- }
- case 896: {
- Int64Field112 = input.ReadInt64();
- break;
- }
- case 905: {
- DoubleField113 = input.ReadDouble();
- break;
- }
- case 912: {
- Int64Field114 = input.ReadInt64();
- break;
- }
- case 920: {
- Int64Field115 = input.ReadInt64();
- break;
- }
- case 929: {
- DoubleField116 = input.ReadDouble();
- break;
- }
- case 936: {
- Int64Field117 = input.ReadInt64();
- break;
- }
- case 945: {
- DoubleField118 = input.ReadDouble();
- break;
- }
- case 953: {
- DoubleField119 = input.ReadDouble();
- break;
- }
- case 961: {
- DoubleField120 = input.ReadDouble();
- break;
- }
- case 969: {
- DoubleField121 = input.ReadDouble();
- break;
- }
- case 977: {
- DoubleField122 = input.ReadDouble();
- break;
- }
- case 985: {
- DoubleField123 = input.ReadDouble();
- break;
- }
- case 993: {
- DoubleField124 = input.ReadDouble();
- break;
- }
- case 1000: {
- Int64Field125 = input.ReadInt64();
- break;
- }
- case 1008: {
- Int64Field126 = input.ReadInt64();
- break;
- }
- case 1016: {
- Int64Field127 = input.ReadInt64();
- break;
- }
- case 1025: {
- DoubleField128 = input.ReadDouble();
- break;
- }
- case 1033: {
- DoubleField129 = input.ReadDouble();
- break;
- }
- }
- }
- #endif
- }
-
- #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
- [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
- void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
- uint tag;
- while ((tag = input.ReadTag()) != 0) {
- switch(tag) {
- default:
- _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
- break;
- case 9: {
- DoubleField1 = input.ReadDouble();
- break;
- }
- case 16: {
- Int64Field2 = input.ReadInt64();
- break;
- }
- case 24: {
- Int64Field3 = input.ReadInt64();
- break;
- }
- case 32: {
- Int64Field4 = input.ReadInt64();
- break;
- }
- case 57: {
- DoubleField7 = input.ReadDouble();
- break;
- }
- case 65: {
- DoubleField8 = input.ReadDouble();
- break;
- }
- case 73: {
- DoubleField9 = input.ReadDouble();
- break;
- }
- case 81: {
- DoubleField10 = input.ReadDouble();
- break;
- }
- case 89: {
- DoubleField11 = input.ReadDouble();
- break;
- }
- case 113: {
- DoubleField14 = input.ReadDouble();
- break;
- }
- case 121: {
- DoubleField15 = input.ReadDouble();
- break;
- }
- case 152: {
- Int64Field19 = input.ReadInt64();
- break;
- }
- case 161: {
- DoubleField20 = input.ReadDouble();
- break;
- }
- case 169: {
- DoubleField21 = input.ReadDouble();
- break;
- }
- case 177: {
- DoubleField22 = input.ReadDouble();
- break;
- }
- case 201: {
- DoubleField25 = input.ReadDouble();
- break;
- }
- case 208: {
- Int64Field26 = input.ReadInt64();
- break;
- }
- case 225: {
- DoubleField28 = input.ReadDouble();
- break;
- }
- case 233: {
- DoubleField29 = input.ReadDouble();
- break;
- }
- case 241: {
- DoubleField30 = input.ReadDouble();
- break;
- }
- case 249: {
- DoubleField31 = input.ReadDouble();
- break;
- }
- case 256: {
- Int64Field32 = input.ReadInt64();
- break;
- }
- case 296: {
- Int64Field37 = input.ReadInt64();
- break;
- }
- case 305: {
- DoubleField38 = input.ReadDouble();
- break;
- }
- case 312: {
- Interactions = input.ReadInt64();
- break;
- }
- case 321: {
- DoubleField40 = input.ReadDouble();
- break;
- }
- case 328: {
- Int64Field41 = input.ReadInt64();
- break;
- }
- case 337: {
- DoubleField42 = input.ReadDouble();
- break;
- }
- case 344: {
- Int64Field43 = input.ReadInt64();
- break;
- }
- case 352: {
- Int64Field44 = input.ReadInt64();
- break;
- }
- case 361: {
- DoubleField45 = input.ReadDouble();
- break;
- }
- case 369: {
- DoubleField46 = input.ReadDouble();
- break;
- }
- case 377: {
- DoubleField47 = input.ReadDouble();
- break;
- }
- case 385: {
- DoubleField48 = input.ReadDouble();
- break;
- }
- case 393: {
- DoubleField49 = input.ReadDouble();
- break;
- }
- case 401: {
- DoubleField50 = input.ReadDouble();
- break;
- }
- case 409: {
- DoubleField51 = input.ReadDouble();
- break;
- }
- case 417: {
- DoubleField52 = input.ReadDouble();
- break;
- }
- case 425: {
- DoubleField53 = input.ReadDouble();
- break;
- }
- case 433: {
- DoubleField54 = input.ReadDouble();
- break;
- }
- case 441: {
- DoubleField55 = input.ReadDouble();
- break;
- }
- case 449: {
- DoubleField56 = input.ReadDouble();
- break;
- }
- case 457: {
- DoubleField57 = input.ReadDouble();
- break;
- }
- case 465: {
- DoubleField58 = input.ReadDouble();
- break;
- }
- case 472: {
- Int64Field59 = input.ReadInt64();
- break;
- }
- case 480: {
- Int64Field60 = input.ReadInt64();
- break;
- }
- case 497: {
- DoubleField62 = input.ReadDouble();
- break;
- }
- case 521: {
- DoubleField65 = input.ReadDouble();
- break;
- }
- case 529: {
- DoubleField66 = input.ReadDouble();
- break;
- }
- case 537: {
- DoubleField67 = input.ReadDouble();
- break;
- }
- case 545: {
- DoubleField68 = input.ReadDouble();
- break;
- }
- case 553: {
- DoubleField69 = input.ReadDouble();
- break;
- }
- case 561: {
- DoubleField70 = input.ReadDouble();
- break;
- }
- case 569: {
- DoubleField71 = input.ReadDouble();
- break;
- }
- case 577: {
- DoubleField72 = input.ReadDouble();
- break;
- }
- case 586: {
- StringField73 = input.ReadString();
- break;
- }
- case 594: {
- StringField74 = input.ReadString();
- break;
- }
- case 601: {
- DoubleField75 = input.ReadDouble();
- break;
- }
- case 617: {
- DoubleField77 = input.ReadDouble();
- break;
- }
- case 625: {
- DoubleField78 = input.ReadDouble();
- break;
- }
- case 633: {
- DoubleField79 = input.ReadDouble();
- break;
- }
- case 640: {
- EnumField80 = input.ReadInt32();
- break;
- }
- case 648: {
- EnumField81 = input.ReadInt32();
- break;
- }
- case 656: {
- Int64Field82 = input.ReadInt64();
- break;
- }
- case 664: {
- EnumField83 = input.ReadInt32();
- break;
- }
- case 673: {
- DoubleField84 = input.ReadDouble();
- break;
- }
- case 680: {
- Int64Field85 = input.ReadInt64();
- break;
- }
- case 688: {
- Int64Field86 = input.ReadInt64();
- break;
- }
- case 696: {
- Int64Field87 = input.ReadInt64();
- break;
- }
- case 705: {
- DoubleField88 = input.ReadDouble();
- break;
- }
- case 713: {
- DoubleField89 = input.ReadDouble();
- break;
- }
- case 721: {
- DoubleField90 = input.ReadDouble();
- break;
- }
- case 729: {
- DoubleField91 = input.ReadDouble();
- break;
- }
- case 737: {
- DoubleField92 = input.ReadDouble();
- break;
- }
- case 745: {
- DoubleField93 = input.ReadDouble();
- break;
- }
- case 753: {
- DoubleField94 = input.ReadDouble();
- break;
- }
- case 761: {
- DoubleField95 = input.ReadDouble();
- break;
- }
- case 769: {
- DoubleField96 = input.ReadDouble();
- break;
- }
- case 777: {
- DoubleField97 = input.ReadDouble();
- break;
- }
- case 785: {
- DoubleField98 = input.ReadDouble();
- break;
- }
- case 793: {
- DoubleField99 = input.ReadDouble();
- break;
- }
- case 802:
- case 800: {
- repeatedIntField100_.AddEntriesFrom(ref input, _repeated_repeatedIntField100_codec);
- break;
- }
- case 809: {
- DoubleField101 = input.ReadDouble();
- break;
- }
- case 817: {
- DoubleField102 = input.ReadDouble();
- break;
- }
- case 825: {
- DoubleField103 = input.ReadDouble();
- break;
- }
- case 833: {
- DoubleField104 = input.ReadDouble();
- break;
- }
- case 841: {
- DoubleField105 = input.ReadDouble();
- break;
- }
- case 849: {
- DoubleField106 = input.ReadDouble();
- break;
- }
- case 856: {
- Int64Field107 = input.ReadInt64();
- break;
- }
- case 865: {
- DoubleField108 = input.ReadDouble();
- break;
- }
- case 873: {
- DoubleField109 = input.ReadDouble();
- break;
- }
- case 880: {
- Int64Field110 = input.ReadInt64();
- break;
- }
- case 889: {
- DoubleField111 = input.ReadDouble();
- break;
- }
- case 896: {
- Int64Field112 = input.ReadInt64();
- break;
- }
- case 905: {
- DoubleField113 = input.ReadDouble();
- break;
- }
- case 912: {
- Int64Field114 = input.ReadInt64();
- break;
- }
- case 920: {
- Int64Field115 = input.ReadInt64();
- break;
- }
- case 929: {
- DoubleField116 = input.ReadDouble();
- break;
- }
- case 936: {
- Int64Field117 = input.ReadInt64();
- break;
- }
- case 945: {
- DoubleField118 = input.ReadDouble();
- break;
- }
- case 953: {
- DoubleField119 = input.ReadDouble();
- break;
- }
- case 961: {
- DoubleField120 = input.ReadDouble();
- break;
- }
- case 969: {
- DoubleField121 = input.ReadDouble();
- break;
- }
- case 977: {
- DoubleField122 = input.ReadDouble();
- break;
- }
- case 985: {
- DoubleField123 = input.ReadDouble();
- break;
- }
- case 993: {
- DoubleField124 = input.ReadDouble();
- break;
- }
- case 1000: {
- Int64Field125 = input.ReadInt64();
- break;
- }
- case 1008: {
- Int64Field126 = input.ReadInt64();
- break;
- }
- case 1016: {
- Int64Field127 = input.ReadInt64();
- break;
- }
- case 1025: {
- DoubleField128 = input.ReadDouble();
- break;
- }
- case 1033: {
- DoubleField129 = input.ReadDouble();
- break;
- }
- }
- }
- }
- #endif
-
- }
-
- #endregion
-
-}
-
-#endregion Designer generated code
diff --git a/csharp/src/Google.Protobuf.Benchmarks/WriteMessagesBenchmark.cs b/csharp/src/Google.Protobuf.Benchmarks/WriteMessagesBenchmark.cs
deleted file mode 100644
index 5a3bba7..0000000
--- a/csharp/src/Google.Protobuf.Benchmarks/WriteMessagesBenchmark.cs
+++ /dev/null
@@ -1,198 +0,0 @@
-#region Copyright notice and license
-// Protocol Buffers - Google's data interchange format
-// Copyright 2019 Google Inc. All rights reserved.
-// https://github.com/protocolbuffers/protobuf
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#endregion
-
-using BenchmarkDotNet.Attributes;
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Buffers;
-using Google.Protobuf.WellKnownTypes;
-
-namespace Google.Protobuf.Benchmarks
-{
- /// <summary>
- /// Benchmark that tests writing performance for various messages.
- /// </summary>
- [MemoryDiagnoser]
- public class WriteMessagesBenchmark
- {
- const int MaxMessages = 100;
-
- SubTest manyWrapperFieldsTest = new SubTest(ParseMessagesBenchmark.CreateManyWrapperFieldsMessage(), MaxMessages);
- SubTest manyPrimitiveFieldsTest = new SubTest(ParseMessagesBenchmark.CreateManyPrimitiveFieldsMessage(), MaxMessages);
- SubTest emptyMessageTest = new SubTest(new Empty(), MaxMessages);
-
- public IEnumerable<int> MessageCountValues => new[] { 10, 100 };
-
- [GlobalSetup]
- public void GlobalSetup()
- {
- }
-
- [Benchmark]
- public byte[] ManyWrapperFieldsMessage_ToByteArray()
- {
- return manyWrapperFieldsTest.ToByteArray();
- }
-
- [Benchmark]
- public byte[] ManyWrapperFieldsMessage_WriteToCodedOutputStream()
- {
- return manyWrapperFieldsTest.WriteToCodedOutputStream_PreAllocatedBuffer();
- }
-
- [Benchmark]
- public byte[] ManyWrapperFieldsMessage_WriteToSpan()
- {
- return manyWrapperFieldsTest.WriteToSpan_PreAllocatedBuffer();
- }
-
-
- [Benchmark]
- public byte[] ManyPrimitiveFieldsMessage_ToByteArray()
- {
- return manyPrimitiveFieldsTest.ToByteArray();
- }
-
- [Benchmark]
- public byte[] ManyPrimitiveFieldsMessage_WriteToCodedOutputStream()
- {
- return manyPrimitiveFieldsTest.WriteToCodedOutputStream_PreAllocatedBuffer();
- }
-
- [Benchmark]
- public byte[] ManyPrimitiveFieldsMessage_WriteToSpan()
- {
- return manyPrimitiveFieldsTest.WriteToSpan_PreAllocatedBuffer();
- }
-
- [Benchmark]
- public byte[] EmptyMessage_ToByteArray()
- {
- return emptyMessageTest.ToByteArray();
- }
-
- [Benchmark]
- public byte[] EmptyMessage_WriteToCodedOutputStream()
- {
- return emptyMessageTest.WriteToCodedOutputStream_PreAllocatedBuffer();
- }
-
- [Benchmark]
- public byte[] EmptyMessage_WriteToSpan()
- {
- return emptyMessageTest.WriteToSpan_PreAllocatedBuffer();
- }
-
- [Benchmark]
- [ArgumentsSource(nameof(MessageCountValues))]
- public void ManyWrapperFieldsMessage_WriteDelimitedMessagesToCodedOutputStream(int messageCount)
- {
- manyWrapperFieldsTest.WriteDelimitedMessagesToCodedOutputStream_PreAllocatedBuffer(messageCount);
- }
-
- [Benchmark]
- [ArgumentsSource(nameof(MessageCountValues))]
- public void ManyWrapperFieldsMessage_WriteDelimitedMessagesToSpan(int messageCount)
- {
- manyWrapperFieldsTest.WriteDelimitedMessagesToSpan_PreAllocatedBuffer(messageCount);
- }
-
- [Benchmark]
- [ArgumentsSource(nameof(MessageCountValues))]
- public void ManyPrimitiveFieldsMessage_WriteDelimitedMessagesToCodedOutputStream(int messageCount)
- {
- manyPrimitiveFieldsTest.WriteDelimitedMessagesToCodedOutputStream_PreAllocatedBuffer(messageCount);
- }
-
- [Benchmark]
- [ArgumentsSource(nameof(MessageCountValues))]
- public void ManyPrimitiveFieldsMessage_WriteDelimitedMessagesToSpan(int messageCount)
- {
- manyPrimitiveFieldsTest.WriteDelimitedMessagesToSpan_PreAllocatedBuffer(messageCount);
- }
-
- private class SubTest
- {
- private readonly IMessage message;
- private readonly byte[] outputBuffer;
- private readonly byte[] multipleMessagesOutputBuffer;
-
- public SubTest(IMessage message, int maxMessageCount)
- {
- this.message = message;
-
- int messageSize = message.CalculateSize();
- this.outputBuffer = new byte[messageSize];
- this.multipleMessagesOutputBuffer = new byte[maxMessageCount * (messageSize + CodedOutputStream.ComputeLengthSize(messageSize))];
- }
-
- public byte[] ToByteArray() => message.ToByteArray();
-
- public byte[] WriteToCodedOutputStream_PreAllocatedBuffer()
- {
- var cos = new CodedOutputStream(outputBuffer); // use pre-existing output buffer
- message.WriteTo(cos);
- return outputBuffer;
- }
-
- public byte[] WriteToSpan_PreAllocatedBuffer()
- {
- var span = new Span<byte>(outputBuffer); // use pre-existing output buffer
- message.WriteTo(span);
- return outputBuffer;
- }
-
- public byte[] WriteDelimitedMessagesToCodedOutputStream_PreAllocatedBuffer(int messageCount)
- {
- var cos = new CodedOutputStream(multipleMessagesOutputBuffer); // use pre-existing output buffer
- for (int i = 0; i < messageCount; i++)
- {
- cos.WriteMessage(message);
- }
- return multipleMessagesOutputBuffer;
- }
-
- public byte[] WriteDelimitedMessagesToSpan_PreAllocatedBuffer(int messageCount)
- {
- var span = new Span<byte>(multipleMessagesOutputBuffer); // use pre-existing output buffer
- WriteContext.Initialize(ref span, out WriteContext ctx);
- for (int i = 0; i < messageCount; i++)
- {
- ctx.WriteMessage(message);
- }
- return multipleMessagesOutputBuffer;
- }
- }
- }
-}
diff --git a/csharp/src/Google.Protobuf.Benchmarks/WriteRawPrimitivesBenchmark.cs b/csharp/src/Google.Protobuf.Benchmarks/WriteRawPrimitivesBenchmark.cs
deleted file mode 100644
index 66b6b4a..0000000
--- a/csharp/src/Google.Protobuf.Benchmarks/WriteRawPrimitivesBenchmark.cs
+++ /dev/null
@@ -1,519 +0,0 @@
-#region Copyright notice and license
-// Protocol Buffers - Google's data interchange format
-// Copyright 2019 Google Inc. All rights reserved.
-// https://github.com/protocolbuffers/protobuf
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#endregion
-
-using BenchmarkDotNet.Attributes;
-using System;
-using System.Buffers.Binary;
-using System.Collections.Generic;
-using System.IO;
-using System.Buffers;
-using System.Text;
-
-namespace Google.Protobuf.Benchmarks
-{
- /// <summary>
- /// Benchmarks throughput when writing raw primitives.
- /// </summary>
- [MemoryDiagnoser]
- public class WriteRawPrimitivesBenchmark
- {
- // key is the encodedSize of varint values
- Dictionary<int, uint[]> varint32Values;
- Dictionary<int, ulong[]> varint64Values;
-
- double[] doubleValues;
- float[] floatValues;
-
- // key is the encodedSize of string values
- Dictionary<int, string[]> stringValues;
-
- // key is the encodedSize of string values
- Dictionary<int, string[]> nonAsciiStringValues;
-
- // key is the encodedSize of string values
- Dictionary<int, ByteString[]> byteStringValues;
-
- // the buffer to which all the data will be written
- byte[] outputBuffer;
-
- Random random = new Random(417384220); // random but deterministic seed
-
- public IEnumerable<int> StringEncodedSizes => new[] { 1, 4, 10, 105, 10080 };
-
- public IEnumerable<int> NonAsciiStringEncodedSizes => new[] { 4, 10, 105, 10080 };
-
- [GlobalSetup]
- public void GlobalSetup()
- {
- outputBuffer = new byte[BytesToWrite];
-
- varint32Values = new Dictionary<int, uint[]>();
- varint64Values = new Dictionary<int, ulong[]>();
- for (int encodedSize = 1; encodedSize <= 10; encodedSize++)
- {
- if (encodedSize <= 5)
- {
- varint32Values.Add(encodedSize, CreateRandomVarints32(random, BytesToWrite / encodedSize, encodedSize));
- }
- varint64Values.Add(encodedSize, CreateRandomVarints64(random, BytesToWrite / encodedSize, encodedSize));
- }
-
- doubleValues = CreateRandomDoubles(random, BytesToWrite / sizeof(double));
- floatValues = CreateRandomFloats(random, BytesToWrite / sizeof(float));
-
- stringValues = new Dictionary<int, string[]>();
-
- byteStringValues = new Dictionary<int, ByteString[]>();
- foreach(var encodedSize in StringEncodedSizes)
- {
- stringValues.Add(encodedSize, CreateStrings(BytesToWrite / encodedSize, encodedSize));
- byteStringValues.Add(encodedSize, CreateByteStrings(BytesToWrite / encodedSize, encodedSize));
- }
-
- nonAsciiStringValues = new Dictionary<int, string[]>();
- foreach(var encodedSize in NonAsciiStringEncodedSizes)
- {
- nonAsciiStringValues.Add(encodedSize, CreateNonAsciiStrings(BytesToWrite / encodedSize, encodedSize));
- }
- }
-
- // Total number of bytes that each benchmark will write.
- // Measuring the time taken to write buffer of given size makes it easier to compare parsing speed for different
- // types and makes it easy to calculate the througput (in MB/s)
- // 10800 bytes is chosen because it is divisible by all possible encoded sizes for all primitive types {1..10}
- [Params(10080)]
- public int BytesToWrite { get; set; }
-
- [Benchmark]
- [Arguments(1)]
- [Arguments(2)]
- [Arguments(3)]
- [Arguments(4)]
- [Arguments(5)]
- public void WriteRawVarint32_CodedOutputStream(int encodedSize)
- {
- var values = varint32Values[encodedSize];
- var cos = new CodedOutputStream(outputBuffer);
- for (int i = 0; i < values.Length; i++)
- {
- cos.WriteRawVarint32(values[i]);
- }
- cos.Flush();
- cos.CheckNoSpaceLeft();
- }
-
- [Benchmark]
- [Arguments(1)]
- [Arguments(2)]
- [Arguments(3)]
- [Arguments(4)]
- [Arguments(5)]
- public void WriteRawVarint32_WriteContext(int encodedSize)
- {
- var values = varint32Values[encodedSize];
- var span = new Span<byte>(outputBuffer);
- WriteContext.Initialize(ref span, out WriteContext ctx);
- for (int i = 0; i < values.Length; i++)
- {
- ctx.WriteUInt32(values[i]);
- }
- ctx.Flush();
- ctx.CheckNoSpaceLeft();
- }
-
- [Benchmark]
- [Arguments(1)]
- [Arguments(2)]
- [Arguments(3)]
- [Arguments(4)]
- [Arguments(5)]
- [Arguments(6)]
- [Arguments(7)]
- [Arguments(8)]
- [Arguments(9)]
- [Arguments(10)]
- public void WriteRawVarint64_CodedOutputStream(int encodedSize)
- {
- var values = varint64Values[encodedSize];
- var cos = new CodedOutputStream(outputBuffer);
- for (int i = 0; i < values.Length; i++)
- {
- cos.WriteRawVarint64(values[i]);
- }
- cos.Flush();
- cos.CheckNoSpaceLeft();
- }
-
- [Benchmark]
- [Arguments(1)]
- [Arguments(2)]
- [Arguments(3)]
- [Arguments(4)]
- [Arguments(5)]
- [Arguments(6)]
- [Arguments(7)]
- [Arguments(8)]
- [Arguments(9)]
- [Arguments(10)]
- public void WriteRawVarint64_WriteContext(int encodedSize)
- {
- var values = varint64Values[encodedSize];
- var span = new Span<byte>(outputBuffer);
- WriteContext.Initialize(ref span, out WriteContext ctx);
- for (int i = 0; i < values.Length; i++)
- {
- ctx.WriteUInt64(values[i]);
- }
- ctx.Flush();
- ctx.CheckNoSpaceLeft();
- }
-
- [Benchmark]
- public void WriteFixed32_CodedOutputStream()
- {
- const int encodedSize = sizeof(uint);
- var cos = new CodedOutputStream(outputBuffer);
- for (int i = 0; i < BytesToWrite / encodedSize; i++)
- {
- cos.WriteFixed32(12345);
- }
- cos.Flush();
- cos.CheckNoSpaceLeft();
- }
-
- [Benchmark]
- public void WriteFixed32_WriteContext()
- {
- const int encodedSize = sizeof(uint);
- var span = new Span<byte>(outputBuffer);
- WriteContext.Initialize(ref span, out WriteContext ctx);
- for (uint i = 0; i < BytesToWrite / encodedSize; i++)
- {
- ctx.WriteFixed32(12345);
- }
- ctx.Flush();
- ctx.CheckNoSpaceLeft();
- }
-
- [Benchmark]
- public void WriteFixed64_CodedOutputStream()
- {
- const int encodedSize = sizeof(ulong);
- var cos = new CodedOutputStream(outputBuffer);
- for(int i = 0; i < BytesToWrite / encodedSize; i++)
- {
- cos.WriteFixed64(123456789);
- }
- cos.Flush();
- cos.CheckNoSpaceLeft();
- }
-
- [Benchmark]
- public void WriteFixed64_WriteContext()
- {
- const int encodedSize = sizeof(ulong);
- var span = new Span<byte>(outputBuffer);
- WriteContext.Initialize(ref span, out WriteContext ctx);
- for (uint i = 0; i < BytesToWrite / encodedSize; i++)
- {
- ctx.WriteFixed64(123456789);
- }
- ctx.Flush();
- ctx.CheckNoSpaceLeft();
- }
-
- [Benchmark]
- public void WriteRawTag_OneByte_WriteContext()
- {
- const int encodedSize = 1;
- var span = new Span<byte>(outputBuffer);
- WriteContext.Initialize(ref span, out WriteContext ctx);
- for (uint i = 0; i < BytesToWrite / encodedSize; i++)
- {
- ctx.WriteRawTag(16);
- }
- ctx.Flush();
- ctx.CheckNoSpaceLeft();
- }
-
- [Benchmark]
- public void WriteRawTag_TwoBytes_WriteContext()
- {
- const int encodedSize = 2;
- var span = new Span<byte>(outputBuffer);
- WriteContext.Initialize(ref span, out WriteContext ctx);
- for (uint i = 0; i < BytesToWrite / encodedSize; i++)
- {
- ctx.WriteRawTag(137, 6);
- }
- ctx.Flush();
- ctx.CheckNoSpaceLeft();
- }
-
- [Benchmark]
- public void WriteRawTag_ThreeBytes_WriteContext()
- {
- const int encodedSize = 3;
- var span = new Span<byte>(outputBuffer);
- WriteContext.Initialize(ref span, out WriteContext ctx);
- for (uint i = 0; i < BytesToWrite / encodedSize; i++)
- {
- ctx.WriteRawTag(160, 131, 1);
- }
- ctx.Flush();
- ctx.CheckNoSpaceLeft();
- }
-
- [Benchmark]
- public void Baseline_WriteContext()
- {
- var span = new Span<byte>(outputBuffer);
- WriteContext.Initialize(ref span, out WriteContext ctx);
- ctx.state.position = outputBuffer.Length;
- ctx.Flush();
- ctx.CheckNoSpaceLeft();
- }
-
- [Benchmark]
- public void WriteRawFloat_CodedOutputStream()
- {
- var cos = new CodedOutputStream(outputBuffer);
- foreach (var value in floatValues)
- {
- cos.WriteFloat(value);
- }
- cos.Flush();
- cos.CheckNoSpaceLeft();
- }
-
- [Benchmark]
- public void WriteRawFloat_WriteContext()
- {
- var span = new Span<byte>(outputBuffer);
- WriteContext.Initialize(ref span, out WriteContext ctx);
- foreach (var value in floatValues)
- {
- ctx.WriteFloat(value);
- }
- ctx.Flush();
- ctx.CheckNoSpaceLeft();
- }
-
- [Benchmark]
- public void WriteRawDouble_CodedOutputStream()
- {
- var cos = new CodedOutputStream(outputBuffer);
- foreach (var value in doubleValues)
- {
- cos.WriteDouble(value);
- }
- cos.Flush();
- cos.CheckNoSpaceLeft();
- }
-
- [Benchmark]
- public void WriteRawDouble_WriteContext()
- {
- var span = new Span<byte>(outputBuffer);
- WriteContext.Initialize(ref span, out WriteContext ctx);
- foreach (var value in doubleValues)
- {
- ctx.WriteDouble(value);
- }
- ctx.Flush();
- ctx.CheckNoSpaceLeft();
- }
-
- [Benchmark]
- [ArgumentsSource(nameof(StringEncodedSizes))]
- public void WriteString_CodedOutputStream(int encodedSize)
- {
- var values = stringValues[encodedSize];
- var cos = new CodedOutputStream(outputBuffer);
- foreach (var value in values)
- {
- cos.WriteString(value);
- }
- cos.Flush();
- cos.CheckNoSpaceLeft();
- }
-
- [Benchmark]
- [ArgumentsSource(nameof(StringEncodedSizes))]
- public void WriteString_WriteContext(int encodedSize)
- {
- var values = stringValues[encodedSize];
- var span = new Span<byte>(outputBuffer);
- WriteContext.Initialize(ref span, out WriteContext ctx);
- foreach (var value in values)
- {
- ctx.WriteString(value);
- }
- ctx.Flush();
- ctx.CheckNoSpaceLeft();
- }
-
- [Benchmark]
- [ArgumentsSource(nameof(NonAsciiStringEncodedSizes))]
- public void WriteNonAsciiString_CodedOutputStream(int encodedSize)
- {
- var values = nonAsciiStringValues[encodedSize];
- var cos = new CodedOutputStream(outputBuffer);
- foreach (var value in values)
- {
- cos.WriteString(value);
- }
- cos.Flush();
- cos.CheckNoSpaceLeft();
- }
-
- [Benchmark]
- [ArgumentsSource(nameof(NonAsciiStringEncodedSizes))]
- public void WriteNonAsciiString_WriteContext(int encodedSize)
- {
- var values = nonAsciiStringValues[encodedSize];
- var span = new Span<byte>(outputBuffer);
- WriteContext.Initialize(ref span, out WriteContext ctx);
- foreach (var value in values)
- {
- ctx.WriteString(value);
- }
- ctx.Flush();
- ctx.CheckNoSpaceLeft();
- }
-
- [Benchmark]
- [ArgumentsSource(nameof(StringEncodedSizes))]
- public void WriteBytes_CodedOutputStream(int encodedSize)
- {
- var values = byteStringValues[encodedSize];
- var cos = new CodedOutputStream(outputBuffer);
- foreach (var value in values)
- {
- cos.WriteBytes(value);
- }
- cos.Flush();
- cos.CheckNoSpaceLeft();
- }
-
- [Benchmark]
- [ArgumentsSource(nameof(StringEncodedSizes))]
- public void WriteBytes_WriteContext(int encodedSize)
- {
- var values = byteStringValues[encodedSize];
- var span = new Span<byte>(outputBuffer);
- WriteContext.Initialize(ref span, out WriteContext ctx);
- foreach (var value in values)
- {
- ctx.WriteBytes(value);
- }
- ctx.Flush();
- ctx.CheckNoSpaceLeft();
- }
-
- private static uint[] CreateRandomVarints32(Random random, int valueCount, int encodedSize)
- {
- var result = new uint[valueCount];
- for (int i = 0; i < valueCount; i++)
- {
- result[i] = (uint) ParseRawPrimitivesBenchmark.RandomUnsignedVarint(random, encodedSize, true);
- }
- return result;
- }
-
- private static ulong[] CreateRandomVarints64(Random random, int valueCount, int encodedSize)
- {
- var result = new ulong[valueCount];
- for (int i = 0; i < valueCount; i++)
- {
- result[i] = ParseRawPrimitivesBenchmark.RandomUnsignedVarint(random, encodedSize, false);
- }
- return result;
- }
-
- private static float[] CreateRandomFloats(Random random, int valueCount)
- {
- var result = new float[valueCount];
- for (int i = 0; i < valueCount; i++)
- {
- result[i] = (float)random.NextDouble();
- }
- return result;
- }
-
- private static double[] CreateRandomDoubles(Random random, int valueCount)
- {
- var result = new double[valueCount];
- for (int i = 0; i < valueCount; i++)
- {
- result[i] = random.NextDouble();
- }
- return result;
- }
-
- private static string[] CreateStrings(int valueCount, int encodedSize)
- {
- var str = ParseRawPrimitivesBenchmark.CreateStringWithEncodedSize(encodedSize);
-
- var result = new string[valueCount];
- for (int i = 0; i < valueCount; i++)
- {
- result[i] = str;
- }
- return result;
- }
-
- private static string[] CreateNonAsciiStrings(int valueCount, int encodedSize)
- {
- var str = ParseRawPrimitivesBenchmark.CreateNonAsciiStringWithEncodedSize(encodedSize);
-
- var result = new string[valueCount];
- for (int i = 0; i < valueCount; i++)
- {
- result[i] = str;
- }
- return result;
- }
-
- private static ByteString[] CreateByteStrings(int valueCount, int encodedSize)
- {
- var str = ParseRawPrimitivesBenchmark.CreateStringWithEncodedSize(encodedSize);
-
- var result = new ByteString[valueCount];
- for (int i = 0; i < valueCount; i++)
- {
- result[i] = ByteString.CopyFrom(Encoding.UTF8.GetBytes(str));
- }
- return result;
- }
- }
-}
diff --git a/csharp/src/Google.Protobuf.Benchmarks/wrapper_benchmark_messages.proto b/csharp/src/Google.Protobuf.Benchmarks/wrapper_benchmark_messages.proto
deleted file mode 100644
index 6802c25..0000000
--- a/csharp/src/Google.Protobuf.Benchmarks/wrapper_benchmark_messages.proto
+++ /dev/null
@@ -1,237 +0,0 @@
-syntax = "proto3";
-
-package google.protobuf.benchmarks;
-
-import "google/protobuf/wrappers.proto";
-
-// a message that has a large number of wrapper fields
-// obfuscated version of an internal message
-message ManyWrapperFieldsMessage {
- google.protobuf.DoubleValue double_field_95 = 95;
- google.protobuf.DoubleValue double_field_1 = 1;
- google.protobuf.DoubleValue double_field_79 = 79;
- google.protobuf.Int64Value int64_field_2 = 2;
- google.protobuf.DoubleValue double_field_96 = 96;
- google.protobuf.Int64Value int64_field_3 = 3;
- google.protobuf.Int64Value int64_field_4 = 4;
- google.protobuf.DoubleValue double_field_97 = 97;
- google.protobuf.DoubleValue double_field_65 = 65;
- google.protobuf.DoubleValue double_field_66 = 66;
- google.protobuf.DoubleValue double_field_7 = 7;
- google.protobuf.DoubleValue double_field_62 = 62;
- google.protobuf.DoubleValue double_field_118 = 118;
- google.protobuf.DoubleValue double_field_119 = 119;
- google.protobuf.DoubleValue double_field_67 = 67;
- google.protobuf.DoubleValue double_field_120 = 120;
- google.protobuf.DoubleValue double_field_121 = 121;
- google.protobuf.DoubleValue double_field_122 = 122;
- google.protobuf.DoubleValue double_field_123 = 123;
- google.protobuf.DoubleValue double_field_124 = 124;
- google.protobuf.DoubleValue double_field_8 = 8;
- google.protobuf.DoubleValue double_field_9 = 9;
- google.protobuf.DoubleValue double_field_98 = 98;
- google.protobuf.DoubleValue double_field_10 = 10;
- google.protobuf.DoubleValue double_field_11 = 11;
- google.protobuf.DoubleValue double_field_99 = 99;
- google.protobuf.DoubleValue double_field_84 = 84;
- google.protobuf.DoubleValue double_field_14 = 14;
- google.protobuf.DoubleValue double_field_77 = 77;
- google.protobuf.DoubleValue double_field_15 = 15;
- google.protobuf.Int64Value int64_field_19 = 19;
- google.protobuf.Int64Value int64_field_115 = 115;
- google.protobuf.DoubleValue double_field_116 = 116;
- google.protobuf.Int64Value int64_field_117 = 117;
- google.protobuf.DoubleValue double_field_20 = 20;
- google.protobuf.DoubleValue double_field_21 = 21;
- google.protobuf.StringValue string_field_73 = 73;
- google.protobuf.StringValue string_field_74 = 74;
- google.protobuf.DoubleValue double_field_22 = 22;
- google.protobuf.DoubleValue double_field_69 = 69;
- google.protobuf.DoubleValue double_field_70 = 70;
- google.protobuf.DoubleValue double_field_71 = 71;
- google.protobuf.DoubleValue double_field_72 = 72;
- google.protobuf.DoubleValue double_field_25 = 25;
- google.protobuf.Int64Value int64_field_26 = 26;
- google.protobuf.DoubleValue double_field_68 = 68;
- google.protobuf.DoubleValue double_field_28 = 28;
- google.protobuf.DoubleValue double_field_106 = 106;
- google.protobuf.DoubleValue double_field_29 = 29;
- google.protobuf.DoubleValue double_field_30 = 30;
- google.protobuf.DoubleValue double_field_101 = 101;
- google.protobuf.DoubleValue double_field_102 = 102;
- google.protobuf.DoubleValue double_field_103 = 103;
- google.protobuf.DoubleValue double_field_104 = 104;
- google.protobuf.DoubleValue double_field_105 = 105;
- google.protobuf.DoubleValue double_field_31 = 31;
- google.protobuf.Int64Value int64_field_32 = 32;
- google.protobuf.DoubleValue double_field_75 = 75;
- google.protobuf.DoubleValue double_field_129 = 129;
- int32 enum_field_80 = 80;
- int32 enum_field_81 = 81;
- google.protobuf.Int64Value int64_field_82 = 82;
- int32 enum_field_83 = 83;
- google.protobuf.Int64Value int64_field_85 = 85;
- google.protobuf.Int64Value int64_field_86 = 86;
- google.protobuf.Int64Value int64_field_87 = 87;
- google.protobuf.Int64Value int64_field_125 = 125;
- google.protobuf.Int64Value int64_field_37 = 37;
- google.protobuf.DoubleValue double_field_38 = 38;
- google.protobuf.Int64Value interactions = 39;
- repeated int32 repeated_int_field_100 = 100;
- google.protobuf.DoubleValue double_field_40 = 40;
- google.protobuf.Int64Value int64_field_41 = 41;
- google.protobuf.Int64Value int64_field_126 = 126;
- google.protobuf.Int64Value int64_field_127 = 127;
- google.protobuf.DoubleValue double_field_128 = 128;
- google.protobuf.DoubleValue double_field_109 = 109;
- google.protobuf.Int64Value int64_field_110 = 110;
- google.protobuf.DoubleValue double_field_111 = 111;
- google.protobuf.Int64Value int64_field_112 = 112;
- google.protobuf.DoubleValue double_field_113 = 113;
- google.protobuf.Int64Value int64_field_114 = 114;
- google.protobuf.DoubleValue double_field_42 = 42;
- google.protobuf.Int64Value int64_field_43 = 43;
- google.protobuf.Int64Value int64_field_44 = 44;
- google.protobuf.DoubleValue double_field_45 = 45;
- google.protobuf.DoubleValue double_field_46 = 46;
- google.protobuf.DoubleValue double_field_78 = 78;
- google.protobuf.DoubleValue double_field_88 = 88;
- google.protobuf.DoubleValue double_field_47 = 47;
- google.protobuf.DoubleValue double_field_89 = 89;
- google.protobuf.DoubleValue double_field_48 = 48;
- google.protobuf.DoubleValue double_field_49 = 49;
- google.protobuf.DoubleValue double_field_50 = 50;
- google.protobuf.DoubleValue double_field_90 = 90;
- google.protobuf.DoubleValue double_field_51 = 51;
- google.protobuf.DoubleValue double_field_91 = 91;
- google.protobuf.DoubleValue double_field_92 = 92;
- google.protobuf.Int64Value int64_field_107 = 107;
- google.protobuf.DoubleValue double_field_93 = 93;
- google.protobuf.DoubleValue double_field_108 = 108;
- google.protobuf.DoubleValue double_field_52 = 52;
- google.protobuf.DoubleValue double_field_53 = 53;
- google.protobuf.DoubleValue double_field_94 = 94;
- google.protobuf.DoubleValue double_field_54 = 54;
- google.protobuf.DoubleValue double_field_55 = 55;
- google.protobuf.DoubleValue double_field_56 = 56;
- google.protobuf.DoubleValue double_field_57 = 57;
- google.protobuf.DoubleValue double_field_58 = 58;
- google.protobuf.Int64Value int64_field_59 = 59;
- google.protobuf.Int64Value int64_field_60 = 60;
-}
-
-// same as ManyWrapperFieldsMessages, but with primitive fields
-// for comparison.
-message ManyPrimitiveFieldsMessage {
- double double_field_95 = 95;
- double double_field_1 = 1;
- double double_field_79 = 79;
- int64 int64_field_2 = 2;
- double double_field_96 = 96;
- int64 int64_field_3 = 3;
- int64 int64_field_4 = 4;
- double double_field_97 = 97;
- double double_field_65 = 65;
- double double_field_66 = 66;
- double double_field_7 = 7;
- double double_field_62 = 62;
- double double_field_118 = 118;
- double double_field_119 = 119;
- double double_field_67 = 67;
- double double_field_120 = 120;
- double double_field_121 = 121;
- double double_field_122 = 122;
- double double_field_123 = 123;
- double double_field_124 = 124;
- double double_field_8 = 8;
- double double_field_9 = 9;
- double double_field_98 = 98;
- double double_field_10 = 10;
- double double_field_11 = 11;
- double double_field_99 = 99;
- double double_field_84 = 84;
- double double_field_14 = 14;
- double double_field_77 = 77;
- double double_field_15 = 15;
- int64 int64_field_19 = 19;
- int64 int64_field_115 = 115;
- double double_field_116 = 116;
- int64 int64_field_117 = 117;
- double double_field_20 = 20;
- double double_field_21 = 21;
- string string_field_73 = 73;
- string string_field_74 = 74;
- double double_field_22 = 22;
- double double_field_69 = 69;
- double double_field_70 = 70;
- double double_field_71 = 71;
- double double_field_72 = 72;
- double double_field_25 = 25;
- int64 int64_field_26 = 26;
- double double_field_68 = 68;
- double double_field_28 = 28;
- double double_field_106 = 106;
- double double_field_29 = 29;
- double double_field_30 = 30;
- double double_field_101 = 101;
- double double_field_102 = 102;
- double double_field_103 = 103;
- double double_field_104 = 104;
- double double_field_105 = 105;
- double double_field_31 = 31;
- int64 int64_field_32 = 32;
- double double_field_75 = 75;
- double double_field_129 = 129;
- int32 enum_field_80 = 80;
- int32 enum_field_81 = 81;
- int64 int64_field_82 = 82;
- int32 enum_field_83 = 83;
- int64 int64_field_85 = 85;
- int64 int64_field_86 = 86;
- int64 int64_field_87 = 87;
- int64 int64_field_125 = 125;
- int64 int64_field_37 = 37;
- double double_field_38 = 38;
- int64 interactions = 39;
- repeated int32 repeated_int_field_100 = 100;
- double double_field_40 = 40;
- int64 int64_field_41 = 41;
- int64 int64_field_126 = 126;
- int64 int64_field_127 = 127;
- double double_field_128 = 128;
- double double_field_109 = 109;
- int64 int64_field_110 = 110;
- double double_field_111 = 111;
- int64 int64_field_112 = 112;
- double double_field_113 = 113;
- int64 int64_field_114 = 114;
- double double_field_42 = 42;
- int64 int64_field_43 = 43;
- int64 int64_field_44 = 44;
- double double_field_45 = 45;
- double double_field_46 = 46;
- double double_field_78 = 78;
- double double_field_88 = 88;
- double double_field_47 = 47;
- double double_field_89 = 89;
- double double_field_48 = 48;
- double double_field_49 = 49;
- double double_field_50 = 50;
- double double_field_90 = 90;
- double double_field_51 = 51;
- double double_field_91 = 91;
- double double_field_92 = 92;
- int64 int64_field_107 = 107;
- double double_field_93 = 93;
- double double_field_108 = 108;
- double double_field_52 = 52;
- double double_field_53 = 53;
- double double_field_94 = 94;
- double double_field_54 = 54;
- double double_field_55 = 55;
- double double_field_56 = 56;
- double double_field_57 = 57;
- double double_field_58 = 58;
- int64 int64_field_59 = 59;
- int64 int64_field_60 = 60;
-}
\ No newline at end of file
diff --git a/csharp/src/Google.Protobuf.Conformance/BUILD.bazel b/csharp/src/Google.Protobuf.Conformance/BUILD.bazel
new file mode 100644
index 0000000..12ad0f7
--- /dev/null
+++ b/csharp/src/Google.Protobuf.Conformance/BUILD.bazel
@@ -0,0 +1,97 @@
+load("//build_defs:internal_shell.bzl", "inline_sh_binary")
+load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
+
+inline_sh_binary(
+ name = "build_conformance_test",
+ srcs = ["Google.Protobuf.Conformance.csproj"],
+ cmd = "dotnet build -c Release $(SRCS)",
+ visibility = ["//visibility:private"],
+)
+
+CONFORMANCE_DEPS = [
+ "Google.Protobuf.dll",
+ "Google.Protobuf.Conformance.deps.json",
+ "Google.Protobuf.Conformance.pdb",
+ "Google.Protobuf.Conformance.runtimeconfig.json",
+ "Google.Protobuf.Test.dll",
+ "Google.Protobuf.Test.TestProtos.dll",
+ "Microsoft.TestPlatform.CommunicationUtilities.dll",
+ "Microsoft.TestPlatform.CoreUtilities.dll",
+ "Microsoft.TestPlatform.CrossPlatEngine.dll",
+ "Microsoft.TestPlatform.PlatformAbstractions.dll",
+ "Microsoft.TestPlatform.Utilities.dll",
+ "Microsoft.VisualStudio.CodeCoverage.Shim.dll",
+ "Microsoft.VisualStudio.TestPlatform.Common.dll",
+ "Microsoft.VisualStudio.TestPlatform.ObjectModel.dll",
+ "NUnit3.TestAdapter.dll",
+ "Newtonsoft.Json.dll",
+ "NuGet.Frameworks.dll",
+ "nunit.engine.api.dll",
+ "nunit.engine.core.dll",
+ "nunit.engine.dll",
+ "nunit.framework.dll",
+ "testcentric.engine.metadata.dll",
+ "testhost.dll",
+]
+
+filegroup(
+ name = "srcs",
+ srcs = [
+ "Conformance.cs",
+ "Program.cs",
+ "Google.Protobuf.Conformance.csproj",
+ ],
+ visibility = [
+ "//csharp:__subpackages__",
+ ],
+)
+
+genrule(
+ name = "package_conformance_test",
+ srcs = [
+ "Program.cs",
+ "Google.Protobuf.Conformance.csproj",
+ "//conformance:conformance_csharp_proto",
+ "//csharp:srcs",
+ ],
+ visibility = ["//visibility:private"],
+ tools = [":build_conformance_test"],
+ outs = CONFORMANCE_DEPS + ["Google.Protobuf.Conformance.dll"],
+ cmd = """
+ SRCDIR=$$(dirname $(location :Program.cs))
+ cp $(location //conformance:conformance_csharp_proto) $$SRCDIR
+ DOTNET_CLI_HOME=/tmp ./$(location :build_conformance_test)
+ cp -r $$SRCDIR/bin/Release/netcoreapp3.1/* $(RULEDIR)
+ """,
+)
+
+filegroup(
+ name = "conformance_dll",
+ srcs = ["Google.Protobuf.Conformance.dll"],
+ data = [":package_conformance_test"],
+ visibility = ["//conformance:__subpackages__"],
+)
+
+filegroup(
+ name = "conformance_runfiles",
+ srcs = CONFORMANCE_DEPS,
+ data = [":package_conformance_test"],
+ visibility = ["//conformance:__subpackages__"],
+)
+
+################################################################################
+# Distribution files
+################################################################################
+
+pkg_files(
+ name = "dist_files",
+ srcs = [
+ "BUILD.bazel",
+ "Google.Protobuf.Conformance.csproj",
+ "Conformance.cs",
+ "Program.cs",
+ ],
+ strip_prefix = strip_prefix.from_root(""),
+ visibility = ["//csharp:__pkg__"],
+)
+
diff --git a/csharp/src/Google.Protobuf.Conformance/Program.cs b/csharp/src/Google.Protobuf.Conformance/Program.cs
index d721ecf..1c2e9ae 100644
--- a/csharp/src/Google.Protobuf.Conformance/Program.cs
+++ b/csharp/src/Google.Protobuf.Conformance/Program.cs
@@ -43,7 +43,7 @@
/// </summary>
class Program
{
- private static void Main(string[] args)
+ private static void Main()
{
// This way we get the binary streams instead of readers/writers.
var input = new BinaryReader(Console.OpenStandardInput());
@@ -100,32 +100,22 @@
return new ConformanceResponse { Skipped = "CSharp doesn't support skipping unknown fields in json parsing." };
}
var parser = new JsonParser(new JsonParser.Settings(20, typeRegistry));
- switch (request.MessageType)
+ message = request.MessageType switch
{
- case "protobuf_test_messages.proto3.TestAllTypesProto3":
- message = parser.Parse<ProtobufTestMessages.Proto3.TestAllTypesProto3>(request.JsonPayload);
- break;
- case "protobuf_test_messages.proto2.TestAllTypesProto2":
- message = parser.Parse<ProtobufTestMessages.Proto2.TestAllTypesProto2>(request.JsonPayload);
- break;
- default:
- throw new Exception($" Protobuf request doesn't have specific payload type ({request.MessageType})");
- }
+ "protobuf_test_messages.proto3.TestAllTypesProto3" => parser.Parse<ProtobufTestMessages.Proto3.TestAllTypesProto3>(request.JsonPayload),
+ "protobuf_test_messages.proto2.TestAllTypesProto2" => parser.Parse<ProtobufTestMessages.Proto2.TestAllTypesProto2>(request.JsonPayload),
+ _ => throw new Exception($" Protobuf request doesn't have specific payload type ({request.MessageType})"),
+ };
break;
case ConformanceRequest.PayloadOneofCase.ProtobufPayload:
- switch (request.MessageType)
+ message = request.MessageType switch
{
- case "protobuf_test_messages.proto3.TestAllTypesProto3":
- message = ProtobufTestMessages.Proto3.TestAllTypesProto3.Parser.ParseFrom(request.ProtobufPayload);
- break;
- case "protobuf_test_messages.proto2.TestAllTypesProto2":
- message = ProtobufTestMessages.Proto2.TestAllTypesProto2.Parser
- .WithExtensionRegistry(proto2ExtensionRegistry)
- .ParseFrom(request.ProtobufPayload);
- break;
- default:
- throw new Exception($" Protobuf request doesn't have specific payload type ({request.MessageType})");
- }
+ "protobuf_test_messages.proto3.TestAllTypesProto3" => ProtobufTestMessages.Proto3.TestAllTypesProto3.Parser.ParseFrom(request.ProtobufPayload),
+ "protobuf_test_messages.proto2.TestAllTypesProto2" => ProtobufTestMessages.Proto2.TestAllTypesProto2.Parser
+ .WithExtensionRegistry(proto2ExtensionRegistry)
+ .ParseFrom(request.ProtobufPayload),
+ _ => throw new Exception($" Protobuf request doesn't have specific payload type ({request.MessageType})"),
+ };
break;
case ConformanceRequest.PayloadOneofCase.TextPayload:
return new ConformanceResponse { Skipped = "CSharp doesn't support text format" };
diff --git a/csharp/src/Google.Protobuf.Test.TestProtos/Google.Protobuf.Test.TestProtos.csproj b/csharp/src/Google.Protobuf.Test.TestProtos/Google.Protobuf.Test.TestProtos.csproj
index 8d9d64b..3d0ba71 100644
--- a/csharp/src/Google.Protobuf.Test.TestProtos/Google.Protobuf.Test.TestProtos.csproj
+++ b/csharp/src/Google.Protobuf.Test.TestProtos/Google.Protobuf.Test.TestProtos.csproj
@@ -7,7 +7,7 @@
-->
<PropertyGroup>
<TargetFrameworks>net462;netstandard1.1;netstandard2.0</TargetFrameworks>
- <LangVersion>3.0</LangVersion>
+ <LangVersion>10.0</LangVersion>
<AssemblyOriginatorKeyFile>../../keys/Google.Protobuf.snk</AssemblyOriginatorKeyFile>
<SignAssembly>true</SignAssembly>
<IsPackable>False</IsPackable>
diff --git a/csharp/src/Google.Protobuf.Test.TestProtos/MapUnittestProto3.cs b/csharp/src/Google.Protobuf.Test.TestProtos/MapUnittestProto3.cs
index 57e59a9..d3284a4 100644
--- a/csharp/src/Google.Protobuf.Test.TestProtos/MapUnittestProto3.cs
+++ b/csharp/src/Google.Protobuf.Test.TestProtos/MapUnittestProto3.cs
@@ -580,23 +580,23 @@
if (other == null) {
return;
}
- mapInt32Int32_.Add(other.mapInt32Int32_);
- mapInt64Int64_.Add(other.mapInt64Int64_);
- mapUint32Uint32_.Add(other.mapUint32Uint32_);
- mapUint64Uint64_.Add(other.mapUint64Uint64_);
- mapSint32Sint32_.Add(other.mapSint32Sint32_);
- mapSint64Sint64_.Add(other.mapSint64Sint64_);
- mapFixed32Fixed32_.Add(other.mapFixed32Fixed32_);
- mapFixed64Fixed64_.Add(other.mapFixed64Fixed64_);
- mapSfixed32Sfixed32_.Add(other.mapSfixed32Sfixed32_);
- mapSfixed64Sfixed64_.Add(other.mapSfixed64Sfixed64_);
- mapInt32Float_.Add(other.mapInt32Float_);
- mapInt32Double_.Add(other.mapInt32Double_);
- mapBoolBool_.Add(other.mapBoolBool_);
- mapStringString_.Add(other.mapStringString_);
- mapInt32Bytes_.Add(other.mapInt32Bytes_);
- mapInt32Enum_.Add(other.mapInt32Enum_);
- mapInt32ForeignMessage_.Add(other.mapInt32ForeignMessage_);
+ mapInt32Int32_.MergeFrom(other.mapInt32Int32_);
+ mapInt64Int64_.MergeFrom(other.mapInt64Int64_);
+ mapUint32Uint32_.MergeFrom(other.mapUint32Uint32_);
+ mapUint64Uint64_.MergeFrom(other.mapUint64Uint64_);
+ mapSint32Sint32_.MergeFrom(other.mapSint32Sint32_);
+ mapSint64Sint64_.MergeFrom(other.mapSint64Sint64_);
+ mapFixed32Fixed32_.MergeFrom(other.mapFixed32Fixed32_);
+ mapFixed64Fixed64_.MergeFrom(other.mapFixed64Fixed64_);
+ mapSfixed32Sfixed32_.MergeFrom(other.mapSfixed32Sfixed32_);
+ mapSfixed64Sfixed64_.MergeFrom(other.mapSfixed64Sfixed64_);
+ mapInt32Float_.MergeFrom(other.mapInt32Float_);
+ mapInt32Double_.MergeFrom(other.mapInt32Double_);
+ mapBoolBool_.MergeFrom(other.mapBoolBool_);
+ mapStringString_.MergeFrom(other.mapStringString_);
+ mapInt32Bytes_.MergeFrom(other.mapInt32Bytes_);
+ mapInt32Enum_.MergeFrom(other.mapInt32Enum_);
+ mapInt32ForeignMessage_.MergeFrom(other.mapInt32ForeignMessage_);
_unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
}
@@ -1100,7 +1100,7 @@
if (other == null) {
return;
}
- mapInt32Message_.Add(other.mapInt32Message_);
+ mapInt32Message_.MergeFrom(other.mapInt32Message_);
_unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
}
@@ -1298,8 +1298,8 @@
if (other == null) {
return;
}
- map1_.Add(other.map1_);
- map2_.Add(other.map2_);
+ map1_.MergeFrom(other.map1_);
+ map2_.MergeFrom(other.map2_);
_unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
}
@@ -1723,21 +1723,21 @@
if (other == null) {
return;
}
- mapInt32Int32_.Add(other.mapInt32Int32_);
- mapInt64Int64_.Add(other.mapInt64Int64_);
- mapUint32Uint32_.Add(other.mapUint32Uint32_);
- mapUint64Uint64_.Add(other.mapUint64Uint64_);
- mapSint32Sint32_.Add(other.mapSint32Sint32_);
- mapSint64Sint64_.Add(other.mapSint64Sint64_);
- mapFixed32Fixed32_.Add(other.mapFixed32Fixed32_);
- mapFixed64Fixed64_.Add(other.mapFixed64Fixed64_);
- mapSfixed32Sfixed32_.Add(other.mapSfixed32Sfixed32_);
- mapSfixed64Sfixed64_.Add(other.mapSfixed64Sfixed64_);
- mapInt32Float_.Add(other.mapInt32Float_);
- mapInt32Double_.Add(other.mapInt32Double_);
- mapBoolBool_.Add(other.mapBoolBool_);
- mapInt32Enum_.Add(other.mapInt32Enum_);
- mapInt32ForeignMessage_.Add(other.mapInt32ForeignMessage_);
+ mapInt32Int32_.MergeFrom(other.mapInt32Int32_);
+ mapInt64Int64_.MergeFrom(other.mapInt64Int64_);
+ mapUint32Uint32_.MergeFrom(other.mapUint32Uint32_);
+ mapUint64Uint64_.MergeFrom(other.mapUint64Uint64_);
+ mapSint32Sint32_.MergeFrom(other.mapSint32Sint32_);
+ mapSint64Sint64_.MergeFrom(other.mapSint64Sint64_);
+ mapFixed32Fixed32_.MergeFrom(other.mapFixed32Fixed32_);
+ mapFixed64Fixed64_.MergeFrom(other.mapFixed64Fixed64_);
+ mapSfixed32Sfixed32_.MergeFrom(other.mapSfixed32Sfixed32_);
+ mapSfixed64Sfixed64_.MergeFrom(other.mapSfixed64Sfixed64_);
+ mapInt32Float_.MergeFrom(other.mapInt32Float_);
+ mapInt32Double_.MergeFrom(other.mapInt32Double_);
+ mapBoolBool_.MergeFrom(other.mapBoolBool_);
+ mapInt32Enum_.MergeFrom(other.mapInt32Enum_);
+ mapInt32ForeignMessage_.MergeFrom(other.mapInt32ForeignMessage_);
_unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
}
@@ -2031,7 +2031,7 @@
if (other == null) {
return;
}
- type_.Add(other.type_);
+ type_.MergeFrom(other.type_);
_unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
}
@@ -2224,7 +2224,7 @@
if (other == null) {
return;
}
- entry_.Add(other.entry_);
+ entry_.MergeFrom(other.entry_);
_unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
}
diff --git a/csharp/src/Google.Protobuf.Test.TestProtos/TestMessagesProto2.cs b/csharp/src/Google.Protobuf.Test.TestProtos/TestMessagesProto2.cs
index 35f2b8a..d573455 100644
--- a/csharp/src/Google.Protobuf.Test.TestProtos/TestMessagesProto2.cs
+++ b/csharp/src/Google.Protobuf.Test.TestProtos/TestMessagesProto2.cs
@@ -213,12 +213,13 @@
"dGlvbmFsX2Jvb2wY7gcgASgIEhcKDnJlcGVhdGVkX2ludDMyGPMHIAMoBRoa",
"Cg1PcHRpb25hbEdyb3VwEgkKAWEYASABKAUiFgoUTnVsbEh5cG90aGVzaXNQ",
"cm90bzIiLwoORW51bU9ubHlQcm90bzIiHQoEQm9vbBIKCgZrRmFsc2UQABIJ",
- "CgVrVHJ1ZRABIh8KD09uZVN0cmluZ1Byb3RvMhIMCgRkYXRhGAEgASgJKkYK",
- "EUZvcmVpZ25FbnVtUHJvdG8yEg8KC0ZPUkVJR05fRk9PEAASDwoLRk9SRUlH",
- "Tl9CQVIQARIPCgtGT1JFSUdOX0JBWhACOkoKD2V4dGVuc2lvbl9pbnQzMhIx",
- "LnByb3RvYnVmX3Rlc3RfbWVzc2FnZXMucHJvdG8yLlRlc3RBbGxUeXBlc1By",
- "b3RvMhh4IAEoBUIvCihjb20uZ29vZ2xlLnByb3RvYnVmX3Rlc3RfbWVzc2Fn",
- "ZXMucHJvdG8ySAH4AQE="));
+ "CgVrVHJ1ZRABIh8KD09uZVN0cmluZ1Byb3RvMhIMCgRkYXRhGAEgASgJIkYK",
+ "EVByb3RvV2l0aEtleXdvcmRzEg4KBmlubGluZRgBIAEoBRIPCgdjb25jZXB0",
+ "GAIgASgJEhAKCHJlcXVpcmVzGAMgAygJKkYKEUZvcmVpZ25FbnVtUHJvdG8y",
+ "Eg8KC0ZPUkVJR05fRk9PEAASDwoLRk9SRUlHTl9CQVIQARIPCgtGT1JFSUdO",
+ "X0JBWhACOkoKD2V4dGVuc2lvbl9pbnQzMhIxLnByb3RvYnVmX3Rlc3RfbWVz",
+ "c2FnZXMucHJvdG8yLlRlc3RBbGxUeXBlc1Byb3RvMhh4IAEoBUIvCihjb20u",
+ "Z29vZ2xlLnByb3RvYnVmX3Rlc3RfbWVzc2FnZXMucHJvdG8ySAH4AQE="));
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
new pbr::FileDescriptor[] { },
new pbr::GeneratedClrTypeInfo(new[] {typeof(global::ProtobufTestMessages.Proto2.ForeignEnumProto2), }, new pb::Extension[] { TestMessagesProto2Extensions.ExtensionInt32 }, new pbr::GeneratedClrTypeInfo[] {
@@ -231,7 +232,8 @@
new pbr::GeneratedClrTypeInfo(typeof(global::ProtobufTestMessages.Proto2.UnknownToTestAllTypes), global::ProtobufTestMessages.Proto2.UnknownToTestAllTypes.Parser, new[]{ "OptionalInt32", "OptionalString", "NestedMessage", "OptionalGroup", "OptionalBool", "RepeatedInt32" }, null, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::ProtobufTestMessages.Proto2.UnknownToTestAllTypes.Types.OptionalGroup), global::ProtobufTestMessages.Proto2.UnknownToTestAllTypes.Types.OptionalGroup.Parser, new[]{ "A" }, null, null, null, null)}),
new pbr::GeneratedClrTypeInfo(typeof(global::ProtobufTestMessages.Proto2.NullHypothesisProto2), global::ProtobufTestMessages.Proto2.NullHypothesisProto2.Parser, null, null, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::ProtobufTestMessages.Proto2.EnumOnlyProto2), global::ProtobufTestMessages.Proto2.EnumOnlyProto2.Parser, null, null, new[]{ typeof(global::ProtobufTestMessages.Proto2.EnumOnlyProto2.Types.Bool) }, null, null),
- new pbr::GeneratedClrTypeInfo(typeof(global::ProtobufTestMessages.Proto2.OneStringProto2), global::ProtobufTestMessages.Proto2.OneStringProto2.Parser, new[]{ "Data" }, null, null, null, null)
+ new pbr::GeneratedClrTypeInfo(typeof(global::ProtobufTestMessages.Proto2.OneStringProto2), global::ProtobufTestMessages.Proto2.OneStringProto2.Parser, new[]{ "Data" }, null, null, null, null),
+ new pbr::GeneratedClrTypeInfo(typeof(global::ProtobufTestMessages.Proto2.ProtoWithKeywords), global::ProtobufTestMessages.Proto2.ProtoWithKeywords.Parser, new[]{ "Inline", "Concept", "Requires" }, null, null, null, null)
}));
}
#endregion
@@ -4342,25 +4344,25 @@
unpackedDouble_.Add(other.unpackedDouble_);
unpackedBool_.Add(other.unpackedBool_);
unpackedNestedEnum_.Add(other.unpackedNestedEnum_);
- mapInt32Int32_.Add(other.mapInt32Int32_);
- mapInt64Int64_.Add(other.mapInt64Int64_);
- mapUint32Uint32_.Add(other.mapUint32Uint32_);
- mapUint64Uint64_.Add(other.mapUint64Uint64_);
- mapSint32Sint32_.Add(other.mapSint32Sint32_);
- mapSint64Sint64_.Add(other.mapSint64Sint64_);
- mapFixed32Fixed32_.Add(other.mapFixed32Fixed32_);
- mapFixed64Fixed64_.Add(other.mapFixed64Fixed64_);
- mapSfixed32Sfixed32_.Add(other.mapSfixed32Sfixed32_);
- mapSfixed64Sfixed64_.Add(other.mapSfixed64Sfixed64_);
- mapInt32Float_.Add(other.mapInt32Float_);
- mapInt32Double_.Add(other.mapInt32Double_);
- mapBoolBool_.Add(other.mapBoolBool_);
- mapStringString_.Add(other.mapStringString_);
- mapStringBytes_.Add(other.mapStringBytes_);
- mapStringNestedMessage_.Add(other.mapStringNestedMessage_);
- mapStringForeignMessage_.Add(other.mapStringForeignMessage_);
- mapStringNestedEnum_.Add(other.mapStringNestedEnum_);
- mapStringForeignEnum_.Add(other.mapStringForeignEnum_);
+ mapInt32Int32_.MergeFrom(other.mapInt32Int32_);
+ mapInt64Int64_.MergeFrom(other.mapInt64Int64_);
+ mapUint32Uint32_.MergeFrom(other.mapUint32Uint32_);
+ mapUint64Uint64_.MergeFrom(other.mapUint64Uint64_);
+ mapSint32Sint32_.MergeFrom(other.mapSint32Sint32_);
+ mapSint64Sint64_.MergeFrom(other.mapSint64Sint64_);
+ mapFixed32Fixed32_.MergeFrom(other.mapFixed32Fixed32_);
+ mapFixed64Fixed64_.MergeFrom(other.mapFixed64Fixed64_);
+ mapSfixed32Sfixed32_.MergeFrom(other.mapSfixed32Sfixed32_);
+ mapSfixed64Sfixed64_.MergeFrom(other.mapSfixed64Sfixed64_);
+ mapInt32Float_.MergeFrom(other.mapInt32Float_);
+ mapInt32Double_.MergeFrom(other.mapInt32Double_);
+ mapBoolBool_.MergeFrom(other.mapBoolBool_);
+ mapStringString_.MergeFrom(other.mapStringString_);
+ mapStringBytes_.MergeFrom(other.mapStringBytes_);
+ mapStringNestedMessage_.MergeFrom(other.mapStringNestedMessage_);
+ mapStringForeignMessage_.MergeFrom(other.mapStringForeignMessage_);
+ mapStringNestedEnum_.MergeFrom(other.mapStringNestedEnum_);
+ mapStringForeignEnum_.MergeFrom(other.mapStringForeignEnum_);
if (other.HasData) {
if (!HasData) {
Data = new global::ProtobufTestMessages.Proto2.TestAllTypesProto2.Types.Data();
@@ -8300,6 +8302,289 @@
}
+ public sealed partial class ProtoWithKeywords : pb::IMessage<ProtoWithKeywords>
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ , pb::IBufferMessage
+ #endif
+ {
+ private static readonly pb::MessageParser<ProtoWithKeywords> _parser = new pb::MessageParser<ProtoWithKeywords>(() => new ProtoWithKeywords());
+ private pb::UnknownFieldSet _unknownFields;
+ private int _hasBits0;
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public static pb::MessageParser<ProtoWithKeywords> Parser { get { return _parser; } }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public static pbr::MessageDescriptor Descriptor {
+ get { return global::ProtobufTestMessages.Proto2.TestMessagesProto2Reflection.Descriptor.MessageTypes[6]; }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ pbr::MessageDescriptor pb::IMessage.Descriptor {
+ get { return Descriptor; }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public ProtoWithKeywords() {
+ OnConstruction();
+ }
+
+ partial void OnConstruction();
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public ProtoWithKeywords(ProtoWithKeywords other) : this() {
+ _hasBits0 = other._hasBits0;
+ inline_ = other.inline_;
+ concept_ = other.concept_;
+ requires_ = other.requires_.Clone();
+ _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public ProtoWithKeywords Clone() {
+ return new ProtoWithKeywords(this);
+ }
+
+ /// <summary>Field number for the "inline" field.</summary>
+ public const int InlineFieldNumber = 1;
+ private readonly static int InlineDefaultValue = 0;
+
+ private int inline_;
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public int Inline {
+ get { if ((_hasBits0 & 1) != 0) { return inline_; } else { return InlineDefaultValue; } }
+ set {
+ _hasBits0 |= 1;
+ inline_ = value;
+ }
+ }
+ /// <summary>Gets whether the "inline" field is set</summary>
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public bool HasInline {
+ get { return (_hasBits0 & 1) != 0; }
+ }
+ /// <summary>Clears the value of the "inline" field</summary>
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public void ClearInline() {
+ _hasBits0 &= ~1;
+ }
+
+ /// <summary>Field number for the "concept" field.</summary>
+ public const int ConceptFieldNumber = 2;
+ private readonly static string ConceptDefaultValue = "";
+
+ private string concept_;
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public string Concept {
+ get { return concept_ ?? ConceptDefaultValue; }
+ set {
+ concept_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+ }
+ }
+ /// <summary>Gets whether the "concept" field is set</summary>
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public bool HasConcept {
+ get { return concept_ != null; }
+ }
+ /// <summary>Clears the value of the "concept" field</summary>
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public void ClearConcept() {
+ concept_ = null;
+ }
+
+ /// <summary>Field number for the "requires" field.</summary>
+ public const int RequiresFieldNumber = 3;
+ private static readonly pb::FieldCodec<string> _repeated_requires_codec
+ = pb::FieldCodec.ForString(26);
+ private readonly pbc::RepeatedField<string> requires_ = new pbc::RepeatedField<string>();
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public pbc::RepeatedField<string> Requires {
+ get { return requires_; }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public override bool Equals(object other) {
+ return Equals(other as ProtoWithKeywords);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public bool Equals(ProtoWithKeywords other) {
+ if (ReferenceEquals(other, null)) {
+ return false;
+ }
+ if (ReferenceEquals(other, this)) {
+ return true;
+ }
+ if (Inline != other.Inline) return false;
+ if (Concept != other.Concept) return false;
+ if(!requires_.Equals(other.requires_)) return false;
+ return Equals(_unknownFields, other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public override int GetHashCode() {
+ int hash = 1;
+ if (HasInline) hash ^= Inline.GetHashCode();
+ if (HasConcept) hash ^= Concept.GetHashCode();
+ hash ^= requires_.GetHashCode();
+ if (_unknownFields != null) {
+ hash ^= _unknownFields.GetHashCode();
+ }
+ return hash;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public override string ToString() {
+ return pb::JsonFormatter.ToDiagnosticString(this);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public void WriteTo(pb::CodedOutputStream output) {
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ output.WriteRawMessage(this);
+ #else
+ if (HasInline) {
+ output.WriteRawTag(8);
+ output.WriteInt32(Inline);
+ }
+ if (HasConcept) {
+ output.WriteRawTag(18);
+ output.WriteString(Concept);
+ }
+ requires_.WriteTo(output, _repeated_requires_codec);
+ if (_unknownFields != null) {
+ _unknownFields.WriteTo(output);
+ }
+ #endif
+ }
+
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
+ if (HasInline) {
+ output.WriteRawTag(8);
+ output.WriteInt32(Inline);
+ }
+ if (HasConcept) {
+ output.WriteRawTag(18);
+ output.WriteString(Concept);
+ }
+ requires_.WriteTo(ref output, _repeated_requires_codec);
+ if (_unknownFields != null) {
+ _unknownFields.WriteTo(ref output);
+ }
+ }
+ #endif
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public int CalculateSize() {
+ int size = 0;
+ if (HasInline) {
+ size += 1 + pb::CodedOutputStream.ComputeInt32Size(Inline);
+ }
+ if (HasConcept) {
+ size += 1 + pb::CodedOutputStream.ComputeStringSize(Concept);
+ }
+ size += requires_.CalculateSize(_repeated_requires_codec);
+ if (_unknownFields != null) {
+ size += _unknownFields.CalculateSize();
+ }
+ return size;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public void MergeFrom(ProtoWithKeywords other) {
+ if (other == null) {
+ return;
+ }
+ if (other.HasInline) {
+ Inline = other.Inline;
+ }
+ if (other.HasConcept) {
+ Concept = other.Concept;
+ }
+ requires_.Add(other.requires_);
+ _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public void MergeFrom(pb::CodedInputStream input) {
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ input.ReadRawMessage(this);
+ #else
+ uint tag;
+ while ((tag = input.ReadTag()) != 0) {
+ switch(tag) {
+ default:
+ _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+ break;
+ case 8: {
+ Inline = input.ReadInt32();
+ break;
+ }
+ case 18: {
+ Concept = input.ReadString();
+ break;
+ }
+ case 26: {
+ requires_.AddEntriesFrom(input, _repeated_requires_codec);
+ break;
+ }
+ }
+ }
+ #endif
+ }
+
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
+ uint tag;
+ while ((tag = input.ReadTag()) != 0) {
+ switch(tag) {
+ default:
+ _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
+ break;
+ case 8: {
+ Inline = input.ReadInt32();
+ break;
+ }
+ case 18: {
+ Concept = input.ReadString();
+ break;
+ }
+ case 26: {
+ requires_.AddEntriesFrom(ref input, _repeated_requires_codec);
+ break;
+ }
+ }
+ }
+ }
+ #endif
+
+ }
+
#endregion
}
diff --git a/csharp/src/Google.Protobuf.Test.TestProtos/TestMessagesProto3.cs b/csharp/src/Google.Protobuf.Test.TestProtos/TestMessagesProto3.cs
index 520216f..74e2a57 100644
--- a/csharp/src/Google.Protobuf.Test.TestProtos/TestMessagesProto3.cs
+++ b/csharp/src/Google.Protobuf.Test.TestProtos/TestMessagesProto3.cs
@@ -3753,25 +3753,25 @@
unpackedDouble_.Add(other.unpackedDouble_);
unpackedBool_.Add(other.unpackedBool_);
unpackedNestedEnum_.Add(other.unpackedNestedEnum_);
- mapInt32Int32_.Add(other.mapInt32Int32_);
- mapInt64Int64_.Add(other.mapInt64Int64_);
- mapUint32Uint32_.Add(other.mapUint32Uint32_);
- mapUint64Uint64_.Add(other.mapUint64Uint64_);
- mapSint32Sint32_.Add(other.mapSint32Sint32_);
- mapSint64Sint64_.Add(other.mapSint64Sint64_);
- mapFixed32Fixed32_.Add(other.mapFixed32Fixed32_);
- mapFixed64Fixed64_.Add(other.mapFixed64Fixed64_);
- mapSfixed32Sfixed32_.Add(other.mapSfixed32Sfixed32_);
- mapSfixed64Sfixed64_.Add(other.mapSfixed64Sfixed64_);
- mapInt32Float_.Add(other.mapInt32Float_);
- mapInt32Double_.Add(other.mapInt32Double_);
- mapBoolBool_.Add(other.mapBoolBool_);
- mapStringString_.Add(other.mapStringString_);
- mapStringBytes_.Add(other.mapStringBytes_);
- mapStringNestedMessage_.Add(other.mapStringNestedMessage_);
- mapStringForeignMessage_.Add(other.mapStringForeignMessage_);
- mapStringNestedEnum_.Add(other.mapStringNestedEnum_);
- mapStringForeignEnum_.Add(other.mapStringForeignEnum_);
+ mapInt32Int32_.MergeFrom(other.mapInt32Int32_);
+ mapInt64Int64_.MergeFrom(other.mapInt64Int64_);
+ mapUint32Uint32_.MergeFrom(other.mapUint32Uint32_);
+ mapUint64Uint64_.MergeFrom(other.mapUint64Uint64_);
+ mapSint32Sint32_.MergeFrom(other.mapSint32Sint32_);
+ mapSint64Sint64_.MergeFrom(other.mapSint64Sint64_);
+ mapFixed32Fixed32_.MergeFrom(other.mapFixed32Fixed32_);
+ mapFixed64Fixed64_.MergeFrom(other.mapFixed64Fixed64_);
+ mapSfixed32Sfixed32_.MergeFrom(other.mapSfixed32Sfixed32_);
+ mapSfixed64Sfixed64_.MergeFrom(other.mapSfixed64Sfixed64_);
+ mapInt32Float_.MergeFrom(other.mapInt32Float_);
+ mapInt32Double_.MergeFrom(other.mapInt32Double_);
+ mapBoolBool_.MergeFrom(other.mapBoolBool_);
+ mapStringString_.MergeFrom(other.mapStringString_);
+ mapStringBytes_.MergeFrom(other.mapStringBytes_);
+ mapStringNestedMessage_.MergeFrom(other.mapStringNestedMessage_);
+ mapStringForeignMessage_.MergeFrom(other.mapStringForeignMessage_);
+ mapStringNestedEnum_.MergeFrom(other.mapStringNestedEnum_);
+ mapStringForeignEnum_.MergeFrom(other.mapStringForeignEnum_);
if (other.optionalBoolWrapper_ != null) {
if (optionalBoolWrapper_ == null || other.OptionalBoolWrapper != false) {
OptionalBoolWrapper = other.OptionalBoolWrapper;
diff --git a/csharp/src/Google.Protobuf.Test.TestProtos/Unittest.cs b/csharp/src/Google.Protobuf.Test.TestProtos/Unittest.cs
index c1f43ce..7f1aca1 100644
--- a/csharp/src/Google.Protobuf.Test.TestProtos/Unittest.cs
+++ b/csharp/src/Google.Protobuf.Test.TestProtos/Unittest.cs
@@ -24112,7 +24112,7 @@
if (other == null) {
return;
}
- foo_.Add(other.foo_);
+ foo_.MergeFrom(other.foo_);
_unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
}
@@ -30708,7 +30708,7 @@
}
OptionalGroup.MergeFrom(other.OptionalGroup);
}
- stringStringMap_.Add(other.stringStringMap_);
+ stringStringMap_.MergeFrom(other.stringStringMap_);
switch (other.OneofFieldCase) {
case OneofFieldOneofCase.OneofUint32:
OneofUint32 = other.OneofUint32;
diff --git a/csharp/src/Google.Protobuf.Test.TestProtos/UnittestIssues.cs b/csharp/src/Google.Protobuf.Test.TestProtos/UnittestIssues.cs
index 3fe2dd6..3278517 100644
--- a/csharp/src/Google.Protobuf.Test.TestProtos/UnittestIssues.cs
+++ b/csharp/src/Google.Protobuf.Test.TestProtos/UnittestIssues.cs
@@ -30,37 +30,44 @@
"EiwKBXZhbHVlGAEgASgOMh0udW5pdHRlc3RfaXNzdWVzLk5lZ2F0aXZlRW51",
"bRIxCgZ2YWx1ZXMYAiADKA4yHS51bml0dGVzdF9pc3N1ZXMuTmVnYXRpdmVF",
"bnVtQgIQABI4Cg1wYWNrZWRfdmFsdWVzGAMgAygOMh0udW5pdHRlc3RfaXNz",
- "dWVzLk5lZ2F0aXZlRW51bUICEAEiEQoPRGVwcmVjYXRlZENoaWxkIrkCChdE",
- "ZXByZWNhdGVkRmllbGRzTWVzc2FnZRIaCg5QcmltaXRpdmVWYWx1ZRgBIAEo",
- "BUICGAESGgoOUHJpbWl0aXZlQXJyYXkYAiADKAVCAhgBEjoKDE1lc3NhZ2VW",
- "YWx1ZRgDIAEoCzIgLnVuaXR0ZXN0X2lzc3Vlcy5EZXByZWNhdGVkQ2hpbGRC",
- "AhgBEjoKDE1lc3NhZ2VBcnJheRgEIAMoCzIgLnVuaXR0ZXN0X2lzc3Vlcy5E",
- "ZXByZWNhdGVkQ2hpbGRCAhgBEjYKCUVudW1WYWx1ZRgFIAEoDjIfLnVuaXR0",
- "ZXN0X2lzc3Vlcy5EZXByZWNhdGVkRW51bUICGAESNgoJRW51bUFycmF5GAYg",
- "AygOMh8udW5pdHRlc3RfaXNzdWVzLkRlcHJlY2F0ZWRFbnVtQgIYASIZCglJ",
- "dGVtRmllbGQSDAoEaXRlbRgBIAEoBSJECg1SZXNlcnZlZE5hbWVzEg0KBXR5",
- "cGVzGAEgASgFEhIKCmRlc2NyaXB0b3IYAiABKAUaEAoOU29tZU5lc3RlZFR5",
- "cGUioAEKFVRlc3RKc29uRmllbGRPcmRlcmluZxITCgtwbGFpbl9pbnQzMhgE",
- "IAEoBRITCglvMV9zdHJpbmcYAiABKAlIABISCghvMV9pbnQzMhgFIAEoBUgA",
- "EhQKDHBsYWluX3N0cmluZxgBIAEoCRISCghvMl9pbnQzMhgGIAEoBUgBEhMK",
- "CW8yX3N0cmluZxgDIAEoCUgBQgQKAm8xQgQKAm8yIksKDFRlc3RKc29uTmFt",
- "ZRIMCgRuYW1lGAEgASgJEhkKC2Rlc2NyaXB0aW9uGAIgASgJUgRkZXNjEhIK",
- "BGd1aWQYAyABKAlSBGV4aWQifwoMT25lb2ZNZXJnaW5nEg4KBHRleHQYASAB",
- "KAlIABI2CgZuZXN0ZWQYAiABKAsyJC51bml0dGVzdF9pc3N1ZXMuT25lb2ZN",
- "ZXJnaW5nLk5lc3RlZEgAGh4KBk5lc3RlZBIJCgF4GAEgASgFEgkKAXkYAiAB",
- "KAVCBwoFdmFsdWUiawoWTnVsbFZhbHVlT3V0c2lkZVN0cnVjdBIWCgxzdHJp",
- "bmdfdmFsdWUYASABKAlIABIwCgpudWxsX3ZhbHVlGAIgASgOMhouZ29vZ2xl",
- "LnByb3RvYnVmLk51bGxWYWx1ZUgAQgcKBXZhbHVlIkUKE051bGxWYWx1ZU5v",
- "dEluT25lb2YSLgoKbnVsbF92YWx1ZRgCIAEoDjIaLmdvb2dsZS5wcm90b2J1",
- "Zi5OdWxsVmFsdWUiYAoXTWl4ZWRSZWd1bGFyQW5kT3B0aW9uYWwSFQoNcmVn",
- "dWxhcl9maWVsZBgBIAEoCRIbCg5vcHRpb25hbF9maWVsZBgCIAEoCUgAiAEB",
- "QhEKD19vcHRpb25hbF9maWVsZCI5ChJPbmVvZldpdGhOb25lRmllbGQSCwoB",
- "eBgBIAEoCUgAEg4KBG5vbmUYAiABKAlIAEIGCgR0ZXN0IjUKEU9uZW9mV2l0",
- "aE5vbmVOYW1lEgsKAXgYASABKAlIABILCgF5GAIgASgJSABCBgoEbm9uZSpV",
- "CgxOZWdhdGl2ZUVudW0SFgoSTkVHQVRJVkVfRU5VTV9aRVJPEAASFgoJRml2",
- "ZUJlbG93EPv//////////wESFQoITWludXNPbmUQ////////////ASouCg5E",
- "ZXByZWNhdGVkRW51bRITCg9ERVBSRUNBVEVEX1pFUk8QABIHCgNvbmUQAUId",
- "qgIaVW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3NiBnByb3RvMw=="));
+ "dWVzLk5lZ2F0aXZlRW51bUICEAEiFQoPRGVwcmVjYXRlZENoaWxkOgIYASK5",
+ "AgoXRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2USGgoOUHJpbWl0aXZlVmFsdWUY",
+ "ASABKAVCAhgBEhoKDlByaW1pdGl2ZUFycmF5GAIgAygFQgIYARI6CgxNZXNz",
+ "YWdlVmFsdWUYAyABKAsyIC51bml0dGVzdF9pc3N1ZXMuRGVwcmVjYXRlZENo",
+ "aWxkQgIYARI6CgxNZXNzYWdlQXJyYXkYBCADKAsyIC51bml0dGVzdF9pc3N1",
+ "ZXMuRGVwcmVjYXRlZENoaWxkQgIYARI2CglFbnVtVmFsdWUYBSABKA4yHy51",
+ "bml0dGVzdF9pc3N1ZXMuRGVwcmVjYXRlZEVudW1CAhgBEjYKCUVudW1BcnJh",
+ "eRgGIAMoDjIfLnVuaXR0ZXN0X2lzc3Vlcy5EZXByZWNhdGVkRW51bUICGAEi",
+ "GQoJSXRlbUZpZWxkEgwKBGl0ZW0YASABKAUiRAoNUmVzZXJ2ZWROYW1lcxIN",
+ "CgV0eXBlcxgBIAEoBRISCgpkZXNjcmlwdG9yGAIgASgFGhAKDlNvbWVOZXN0",
+ "ZWRUeXBlIqABChVUZXN0SnNvbkZpZWxkT3JkZXJpbmcSEwoLcGxhaW5faW50",
+ "MzIYBCABKAUSEwoJbzFfc3RyaW5nGAIgASgJSAASEgoIbzFfaW50MzIYBSAB",
+ "KAVIABIUCgxwbGFpbl9zdHJpbmcYASABKAkSEgoIbzJfaW50MzIYBiABKAVI",
+ "ARITCglvMl9zdHJpbmcYAyABKAlIAUIECgJvMUIECgJvMiJLCgxUZXN0SnNv",
+ "bk5hbWUSDAoEbmFtZRgBIAEoCRIZCgtkZXNjcmlwdGlvbhgCIAEoCVIEZGVz",
+ "YxISCgRndWlkGAMgASgJUgRleGlkIn8KDE9uZW9mTWVyZ2luZxIOCgR0ZXh0",
+ "GAEgASgJSAASNgoGbmVzdGVkGAIgASgLMiQudW5pdHRlc3RfaXNzdWVzLk9u",
+ "ZW9mTWVyZ2luZy5OZXN0ZWRIABoeCgZOZXN0ZWQSCQoBeBgBIAEoBRIJCgF5",
+ "GAIgASgFQgcKBXZhbHVlImsKFk51bGxWYWx1ZU91dHNpZGVTdHJ1Y3QSFgoM",
+ "c3RyaW5nX3ZhbHVlGAEgASgJSAASMAoKbnVsbF92YWx1ZRgCIAEoDjIaLmdv",
+ "b2dsZS5wcm90b2J1Zi5OdWxsVmFsdWVIAEIHCgV2YWx1ZSJFChNOdWxsVmFs",
+ "dWVOb3RJbk9uZW9mEi4KCm51bGxfdmFsdWUYAiABKA4yGi5nb29nbGUucHJv",
+ "dG9idWYuTnVsbFZhbHVlImAKF01peGVkUmVndWxhckFuZE9wdGlvbmFsEhUK",
+ "DXJlZ3VsYXJfZmllbGQYASABKAkSGwoOb3B0aW9uYWxfZmllbGQYAiABKAlI",
+ "AIgBAUIRCg9fb3B0aW9uYWxfZmllbGQiOQoST25lb2ZXaXRoTm9uZUZpZWxk",
+ "EgsKAXgYASABKAlIABIOCgRub25lGAIgASgJSABCBgoEdGVzdCI1ChFPbmVv",
+ "ZldpdGhOb25lTmFtZRILCgF4GAEgASgJSAASCwoBeRgCIAEoCUgAQgYKBG5v",
+ "bmUikwIKGURpc2FtYmlndWF0ZUNvbW1vbk1lbWJlcnMSIwobZGlzYW1iaWd1",
+ "YXRlX2NvbW1vbl9tZW1iZXJzGAEgASgFEg0KBXR5cGVzGAIgASgFEhIKCmRl",
+ "c2NyaXB0b3IYAyABKAUSDgoGZXF1YWxzGAQgASgFEhEKCXRvX3N0cmluZxgF",
+ "IAEoBRIVCg1nZXRfaGFzaF9jb2RlGAYgASgFEhAKCHdyaXRlX3RvGAcgASgF",
+ "Eg0KBWNsb25lGAggASgFEhYKDmNhbGN1bGF0ZV9zaXplGAkgASgFEhIKCm1l",
+ "cmdlX2Zyb20YCiABKAUSFwoPb25fY29uc3RydWN0aW9uGAsgASgFEg4KBnBh",
+ "cnNlchgMIAEoBSpVCgxOZWdhdGl2ZUVudW0SFgoSTkVHQVRJVkVfRU5VTV9a",
+ "RVJPEAASFgoJRml2ZUJlbG93EPv//////////wESFQoITWludXNPbmUQ////",
+ "////////ASo2Cg5EZXByZWNhdGVkRW51bRIXCg9ERVBSRUNBVEVEX1pFUk8Q",
+ "ABoCCAESBwoDb25lEAEaAhgBQh2qAhpVbml0VGVzdC5Jc3N1ZXMuVGVzdFBy",
+ "b3Rvc2IGcHJvdG8z"));
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
new pbr::FileDescriptor[] { global::Google.Protobuf.WellKnownTypes.StructReflection.Descriptor, },
new pbr::GeneratedClrTypeInfo(new[] {typeof(global::UnitTest.Issues.TestProtos.NegativeEnum), typeof(global::UnitTest.Issues.TestProtos.DeprecatedEnum), }, null, new pbr::GeneratedClrTypeInfo[] {
@@ -77,7 +84,8 @@
new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.NullValueNotInOneof), global::UnitTest.Issues.TestProtos.NullValueNotInOneof.Parser, new[]{ "NullValue" }, null, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.MixedRegularAndOptional), global::UnitTest.Issues.TestProtos.MixedRegularAndOptional.Parser, new[]{ "RegularField", "OptionalField" }, new[]{ "OptionalField" }, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.OneofWithNoneField), global::UnitTest.Issues.TestProtos.OneofWithNoneField.Parser, new[]{ "X", "None" }, new[]{ "Test" }, null, null, null),
- new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.OneofWithNoneName), global::UnitTest.Issues.TestProtos.OneofWithNoneName.Parser, new[]{ "X", "Y" }, new[]{ "None" }, null, null, null)
+ new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.OneofWithNoneName), global::UnitTest.Issues.TestProtos.OneofWithNoneName.Parser, new[]{ "X", "Y" }, new[]{ "None" }, null, null, null),
+ new pbr::GeneratedClrTypeInfo(typeof(global::UnitTest.Issues.TestProtos.DisambiguateCommonMembers), global::UnitTest.Issues.TestProtos.DisambiguateCommonMembers.Parser, new[]{ "DisambiguateCommonMembers_", "Types_", "Descriptor_", "Equals_", "ToString_", "GetHashCode_", "WriteTo_", "Clone_", "CalculateSize_", "MergeFrom_", "OnConstruction_", "Parser_" }, null, null, null, null)
}));
}
#endregion
@@ -90,7 +98,9 @@
[pbr::OriginalName("MinusOne")] MinusOne = -1,
}
+ [global::System.ObsoleteAttribute]
public enum DeprecatedEnum {
+ [global::System.ObsoleteAttribute]
[pbr::OriginalName("DEPRECATED_ZERO")] DeprecatedZero = 0,
[pbr::OriginalName("one")] One = 1,
}
@@ -819,6 +829,7 @@
}
+ [global::System.ObsoleteAttribute]
public sealed partial class DeprecatedChild : pb::IMessage<DeprecatedChild>
#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
, pb::IBufferMessage
@@ -4347,6 +4358,605 @@
}
+ /// <summary>
+ /// Issue 8810
+ /// </summary>
+ public sealed partial class DisambiguateCommonMembers : pb::IMessage<DisambiguateCommonMembers>
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ , pb::IBufferMessage
+ #endif
+ {
+ private static readonly pb::MessageParser<DisambiguateCommonMembers> _parser = new pb::MessageParser<DisambiguateCommonMembers>(() => new DisambiguateCommonMembers());
+ private pb::UnknownFieldSet _unknownFields;
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public static pb::MessageParser<DisambiguateCommonMembers> Parser { get { return _parser; } }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public static pbr::MessageDescriptor Descriptor {
+ get { return global::UnitTest.Issues.TestProtos.UnittestIssuesReflection.Descriptor.MessageTypes[14]; }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ pbr::MessageDescriptor pb::IMessage.Descriptor {
+ get { return Descriptor; }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public DisambiguateCommonMembers() {
+ OnConstruction();
+ }
+
+ partial void OnConstruction();
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public DisambiguateCommonMembers(DisambiguateCommonMembers other) : this() {
+ disambiguateCommonMembers_ = other.disambiguateCommonMembers_;
+ types_ = other.types_;
+ descriptor_ = other.descriptor_;
+ equals_ = other.equals_;
+ toString_ = other.toString_;
+ getHashCode_ = other.getHashCode_;
+ writeTo_ = other.writeTo_;
+ clone_ = other.clone_;
+ calculateSize_ = other.calculateSize_;
+ mergeFrom_ = other.mergeFrom_;
+ onConstruction_ = other.onConstruction_;
+ parser_ = other.parser_;
+ _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public DisambiguateCommonMembers Clone() {
+ return new DisambiguateCommonMembers(this);
+ }
+
+ /// <summary>Field number for the "disambiguate_common_members" field.</summary>
+ public const int DisambiguateCommonMembers_FieldNumber = 1;
+ private int disambiguateCommonMembers_;
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public int DisambiguateCommonMembers_ {
+ get { return disambiguateCommonMembers_; }
+ set {
+ disambiguateCommonMembers_ = value;
+ }
+ }
+
+ /// <summary>Field number for the "types" field.</summary>
+ public const int Types_FieldNumber = 2;
+ private int types_;
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public int Types_ {
+ get { return types_; }
+ set {
+ types_ = value;
+ }
+ }
+
+ /// <summary>Field number for the "descriptor" field.</summary>
+ public const int Descriptor_FieldNumber = 3;
+ private int descriptor_;
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public int Descriptor_ {
+ get { return descriptor_; }
+ set {
+ descriptor_ = value;
+ }
+ }
+
+ /// <summary>Field number for the "equals" field.</summary>
+ public const int Equals_FieldNumber = 4;
+ private int equals_;
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public int Equals_ {
+ get { return equals_; }
+ set {
+ equals_ = value;
+ }
+ }
+
+ /// <summary>Field number for the "to_string" field.</summary>
+ public const int ToString_FieldNumber = 5;
+ private int toString_;
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public int ToString_ {
+ get { return toString_; }
+ set {
+ toString_ = value;
+ }
+ }
+
+ /// <summary>Field number for the "get_hash_code" field.</summary>
+ public const int GetHashCode_FieldNumber = 6;
+ private int getHashCode_;
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public int GetHashCode_ {
+ get { return getHashCode_; }
+ set {
+ getHashCode_ = value;
+ }
+ }
+
+ /// <summary>Field number for the "write_to" field.</summary>
+ public const int WriteTo_FieldNumber = 7;
+ private int writeTo_;
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public int WriteTo_ {
+ get { return writeTo_; }
+ set {
+ writeTo_ = value;
+ }
+ }
+
+ /// <summary>Field number for the "clone" field.</summary>
+ public const int Clone_FieldNumber = 8;
+ private int clone_;
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public int Clone_ {
+ get { return clone_; }
+ set {
+ clone_ = value;
+ }
+ }
+
+ /// <summary>Field number for the "calculate_size" field.</summary>
+ public const int CalculateSize_FieldNumber = 9;
+ private int calculateSize_;
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public int CalculateSize_ {
+ get { return calculateSize_; }
+ set {
+ calculateSize_ = value;
+ }
+ }
+
+ /// <summary>Field number for the "merge_from" field.</summary>
+ public const int MergeFrom_FieldNumber = 10;
+ private int mergeFrom_;
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public int MergeFrom_ {
+ get { return mergeFrom_; }
+ set {
+ mergeFrom_ = value;
+ }
+ }
+
+ /// <summary>Field number for the "on_construction" field.</summary>
+ public const int OnConstruction_FieldNumber = 11;
+ private int onConstruction_;
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public int OnConstruction_ {
+ get { return onConstruction_; }
+ set {
+ onConstruction_ = value;
+ }
+ }
+
+ /// <summary>Field number for the "parser" field.</summary>
+ public const int Parser_FieldNumber = 12;
+ private int parser_;
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public int Parser_ {
+ get { return parser_; }
+ set {
+ parser_ = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public override bool Equals(object other) {
+ return Equals(other as DisambiguateCommonMembers);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public bool Equals(DisambiguateCommonMembers other) {
+ if (ReferenceEquals(other, null)) {
+ return false;
+ }
+ if (ReferenceEquals(other, this)) {
+ return true;
+ }
+ if (DisambiguateCommonMembers_ != other.DisambiguateCommonMembers_) return false;
+ if (Types_ != other.Types_) return false;
+ if (Descriptor_ != other.Descriptor_) return false;
+ if (Equals_ != other.Equals_) return false;
+ if (ToString_ != other.ToString_) return false;
+ if (GetHashCode_ != other.GetHashCode_) return false;
+ if (WriteTo_ != other.WriteTo_) return false;
+ if (Clone_ != other.Clone_) return false;
+ if (CalculateSize_ != other.CalculateSize_) return false;
+ if (MergeFrom_ != other.MergeFrom_) return false;
+ if (OnConstruction_ != other.OnConstruction_) return false;
+ if (Parser_ != other.Parser_) return false;
+ return Equals(_unknownFields, other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public override int GetHashCode() {
+ int hash = 1;
+ if (DisambiguateCommonMembers_ != 0) hash ^= DisambiguateCommonMembers_.GetHashCode();
+ if (Types_ != 0) hash ^= Types_.GetHashCode();
+ if (Descriptor_ != 0) hash ^= Descriptor_.GetHashCode();
+ if (Equals_ != 0) hash ^= Equals_.GetHashCode();
+ if (ToString_ != 0) hash ^= ToString_.GetHashCode();
+ if (GetHashCode_ != 0) hash ^= GetHashCode_.GetHashCode();
+ if (WriteTo_ != 0) hash ^= WriteTo_.GetHashCode();
+ if (Clone_ != 0) hash ^= Clone_.GetHashCode();
+ if (CalculateSize_ != 0) hash ^= CalculateSize_.GetHashCode();
+ if (MergeFrom_ != 0) hash ^= MergeFrom_.GetHashCode();
+ if (OnConstruction_ != 0) hash ^= OnConstruction_.GetHashCode();
+ if (Parser_ != 0) hash ^= Parser_.GetHashCode();
+ if (_unknownFields != null) {
+ hash ^= _unknownFields.GetHashCode();
+ }
+ return hash;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public override string ToString() {
+ return pb::JsonFormatter.ToDiagnosticString(this);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public void WriteTo(pb::CodedOutputStream output) {
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ output.WriteRawMessage(this);
+ #else
+ if (DisambiguateCommonMembers_ != 0) {
+ output.WriteRawTag(8);
+ output.WriteInt32(DisambiguateCommonMembers_);
+ }
+ if (Types_ != 0) {
+ output.WriteRawTag(16);
+ output.WriteInt32(Types_);
+ }
+ if (Descriptor_ != 0) {
+ output.WriteRawTag(24);
+ output.WriteInt32(Descriptor_);
+ }
+ if (Equals_ != 0) {
+ output.WriteRawTag(32);
+ output.WriteInt32(Equals_);
+ }
+ if (ToString_ != 0) {
+ output.WriteRawTag(40);
+ output.WriteInt32(ToString_);
+ }
+ if (GetHashCode_ != 0) {
+ output.WriteRawTag(48);
+ output.WriteInt32(GetHashCode_);
+ }
+ if (WriteTo_ != 0) {
+ output.WriteRawTag(56);
+ output.WriteInt32(WriteTo_);
+ }
+ if (Clone_ != 0) {
+ output.WriteRawTag(64);
+ output.WriteInt32(Clone_);
+ }
+ if (CalculateSize_ != 0) {
+ output.WriteRawTag(72);
+ output.WriteInt32(CalculateSize_);
+ }
+ if (MergeFrom_ != 0) {
+ output.WriteRawTag(80);
+ output.WriteInt32(MergeFrom_);
+ }
+ if (OnConstruction_ != 0) {
+ output.WriteRawTag(88);
+ output.WriteInt32(OnConstruction_);
+ }
+ if (Parser_ != 0) {
+ output.WriteRawTag(96);
+ output.WriteInt32(Parser_);
+ }
+ if (_unknownFields != null) {
+ _unknownFields.WriteTo(output);
+ }
+ #endif
+ }
+
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
+ if (DisambiguateCommonMembers_ != 0) {
+ output.WriteRawTag(8);
+ output.WriteInt32(DisambiguateCommonMembers_);
+ }
+ if (Types_ != 0) {
+ output.WriteRawTag(16);
+ output.WriteInt32(Types_);
+ }
+ if (Descriptor_ != 0) {
+ output.WriteRawTag(24);
+ output.WriteInt32(Descriptor_);
+ }
+ if (Equals_ != 0) {
+ output.WriteRawTag(32);
+ output.WriteInt32(Equals_);
+ }
+ if (ToString_ != 0) {
+ output.WriteRawTag(40);
+ output.WriteInt32(ToString_);
+ }
+ if (GetHashCode_ != 0) {
+ output.WriteRawTag(48);
+ output.WriteInt32(GetHashCode_);
+ }
+ if (WriteTo_ != 0) {
+ output.WriteRawTag(56);
+ output.WriteInt32(WriteTo_);
+ }
+ if (Clone_ != 0) {
+ output.WriteRawTag(64);
+ output.WriteInt32(Clone_);
+ }
+ if (CalculateSize_ != 0) {
+ output.WriteRawTag(72);
+ output.WriteInt32(CalculateSize_);
+ }
+ if (MergeFrom_ != 0) {
+ output.WriteRawTag(80);
+ output.WriteInt32(MergeFrom_);
+ }
+ if (OnConstruction_ != 0) {
+ output.WriteRawTag(88);
+ output.WriteInt32(OnConstruction_);
+ }
+ if (Parser_ != 0) {
+ output.WriteRawTag(96);
+ output.WriteInt32(Parser_);
+ }
+ if (_unknownFields != null) {
+ _unknownFields.WriteTo(ref output);
+ }
+ }
+ #endif
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public int CalculateSize() {
+ int size = 0;
+ if (DisambiguateCommonMembers_ != 0) {
+ size += 1 + pb::CodedOutputStream.ComputeInt32Size(DisambiguateCommonMembers_);
+ }
+ if (Types_ != 0) {
+ size += 1 + pb::CodedOutputStream.ComputeInt32Size(Types_);
+ }
+ if (Descriptor_ != 0) {
+ size += 1 + pb::CodedOutputStream.ComputeInt32Size(Descriptor_);
+ }
+ if (Equals_ != 0) {
+ size += 1 + pb::CodedOutputStream.ComputeInt32Size(Equals_);
+ }
+ if (ToString_ != 0) {
+ size += 1 + pb::CodedOutputStream.ComputeInt32Size(ToString_);
+ }
+ if (GetHashCode_ != 0) {
+ size += 1 + pb::CodedOutputStream.ComputeInt32Size(GetHashCode_);
+ }
+ if (WriteTo_ != 0) {
+ size += 1 + pb::CodedOutputStream.ComputeInt32Size(WriteTo_);
+ }
+ if (Clone_ != 0) {
+ size += 1 + pb::CodedOutputStream.ComputeInt32Size(Clone_);
+ }
+ if (CalculateSize_ != 0) {
+ size += 1 + pb::CodedOutputStream.ComputeInt32Size(CalculateSize_);
+ }
+ if (MergeFrom_ != 0) {
+ size += 1 + pb::CodedOutputStream.ComputeInt32Size(MergeFrom_);
+ }
+ if (OnConstruction_ != 0) {
+ size += 1 + pb::CodedOutputStream.ComputeInt32Size(OnConstruction_);
+ }
+ if (Parser_ != 0) {
+ size += 1 + pb::CodedOutputStream.ComputeInt32Size(Parser_);
+ }
+ if (_unknownFields != null) {
+ size += _unknownFields.CalculateSize();
+ }
+ return size;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public void MergeFrom(DisambiguateCommonMembers other) {
+ if (other == null) {
+ return;
+ }
+ if (other.DisambiguateCommonMembers_ != 0) {
+ DisambiguateCommonMembers_ = other.DisambiguateCommonMembers_;
+ }
+ if (other.Types_ != 0) {
+ Types_ = other.Types_;
+ }
+ if (other.Descriptor_ != 0) {
+ Descriptor_ = other.Descriptor_;
+ }
+ if (other.Equals_ != 0) {
+ Equals_ = other.Equals_;
+ }
+ if (other.ToString_ != 0) {
+ ToString_ = other.ToString_;
+ }
+ if (other.GetHashCode_ != 0) {
+ GetHashCode_ = other.GetHashCode_;
+ }
+ if (other.WriteTo_ != 0) {
+ WriteTo_ = other.WriteTo_;
+ }
+ if (other.Clone_ != 0) {
+ Clone_ = other.Clone_;
+ }
+ if (other.CalculateSize_ != 0) {
+ CalculateSize_ = other.CalculateSize_;
+ }
+ if (other.MergeFrom_ != 0) {
+ MergeFrom_ = other.MergeFrom_;
+ }
+ if (other.OnConstruction_ != 0) {
+ OnConstruction_ = other.OnConstruction_;
+ }
+ if (other.Parser_ != 0) {
+ Parser_ = other.Parser_;
+ }
+ _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public void MergeFrom(pb::CodedInputStream input) {
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ input.ReadRawMessage(this);
+ #else
+ uint tag;
+ while ((tag = input.ReadTag()) != 0) {
+ switch(tag) {
+ default:
+ _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+ break;
+ case 8: {
+ DisambiguateCommonMembers_ = input.ReadInt32();
+ break;
+ }
+ case 16: {
+ Types_ = input.ReadInt32();
+ break;
+ }
+ case 24: {
+ Descriptor_ = input.ReadInt32();
+ break;
+ }
+ case 32: {
+ Equals_ = input.ReadInt32();
+ break;
+ }
+ case 40: {
+ ToString_ = input.ReadInt32();
+ break;
+ }
+ case 48: {
+ GetHashCode_ = input.ReadInt32();
+ break;
+ }
+ case 56: {
+ WriteTo_ = input.ReadInt32();
+ break;
+ }
+ case 64: {
+ Clone_ = input.ReadInt32();
+ break;
+ }
+ case 72: {
+ CalculateSize_ = input.ReadInt32();
+ break;
+ }
+ case 80: {
+ MergeFrom_ = input.ReadInt32();
+ break;
+ }
+ case 88: {
+ OnConstruction_ = input.ReadInt32();
+ break;
+ }
+ case 96: {
+ Parser_ = input.ReadInt32();
+ break;
+ }
+ }
+ }
+ #endif
+ }
+
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
+ uint tag;
+ while ((tag = input.ReadTag()) != 0) {
+ switch(tag) {
+ default:
+ _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
+ break;
+ case 8: {
+ DisambiguateCommonMembers_ = input.ReadInt32();
+ break;
+ }
+ case 16: {
+ Types_ = input.ReadInt32();
+ break;
+ }
+ case 24: {
+ Descriptor_ = input.ReadInt32();
+ break;
+ }
+ case 32: {
+ Equals_ = input.ReadInt32();
+ break;
+ }
+ case 40: {
+ ToString_ = input.ReadInt32();
+ break;
+ }
+ case 48: {
+ GetHashCode_ = input.ReadInt32();
+ break;
+ }
+ case 56: {
+ WriteTo_ = input.ReadInt32();
+ break;
+ }
+ case 64: {
+ Clone_ = input.ReadInt32();
+ break;
+ }
+ case 72: {
+ CalculateSize_ = input.ReadInt32();
+ break;
+ }
+ case 80: {
+ MergeFrom_ = input.ReadInt32();
+ break;
+ }
+ case 88: {
+ OnConstruction_ = input.ReadInt32();
+ break;
+ }
+ case 96: {
+ Parser_ = input.ReadInt32();
+ break;
+ }
+ }
+ }
+ }
+ #endif
+
+ }
+
#endregion
}
diff --git a/csharp/src/Google.Protobuf.Test.TestProtos/UnittestWellKnownTypes.cs b/csharp/src/Google.Protobuf.Test.TestProtos/UnittestWellKnownTypes.cs
index 3ec8d35..50b9046 100644
--- a/csharp/src/Google.Protobuf.Test.TestProtos/UnittestWellKnownTypes.cs
+++ b/csharp/src/Google.Protobuf.Test.TestProtos/UnittestWellKnownTypes.cs
@@ -3258,24 +3258,24 @@
if (other == null) {
return;
}
- anyField_.Add(other.anyField_);
- apiField_.Add(other.apiField_);
- durationField_.Add(other.durationField_);
- emptyField_.Add(other.emptyField_);
- fieldMaskField_.Add(other.fieldMaskField_);
- sourceContextField_.Add(other.sourceContextField_);
- structField_.Add(other.structField_);
- timestampField_.Add(other.timestampField_);
- typeField_.Add(other.typeField_);
- doubleField_.Add(other.doubleField_);
- floatField_.Add(other.floatField_);
- int64Field_.Add(other.int64Field_);
- uint64Field_.Add(other.uint64Field_);
- int32Field_.Add(other.int32Field_);
- uint32Field_.Add(other.uint32Field_);
- boolField_.Add(other.boolField_);
- stringField_.Add(other.stringField_);
- bytesField_.Add(other.bytesField_);
+ anyField_.MergeFrom(other.anyField_);
+ apiField_.MergeFrom(other.apiField_);
+ durationField_.MergeFrom(other.durationField_);
+ emptyField_.MergeFrom(other.emptyField_);
+ fieldMaskField_.MergeFrom(other.fieldMaskField_);
+ sourceContextField_.MergeFrom(other.sourceContextField_);
+ structField_.MergeFrom(other.structField_);
+ timestampField_.MergeFrom(other.timestampField_);
+ typeField_.MergeFrom(other.typeField_);
+ doubleField_.MergeFrom(other.doubleField_);
+ floatField_.MergeFrom(other.floatField_);
+ int64Field_.MergeFrom(other.int64Field_);
+ uint64Field_.MergeFrom(other.uint64Field_);
+ int32Field_.MergeFrom(other.int32Field_);
+ uint32Field_.MergeFrom(other.uint32Field_);
+ boolField_.MergeFrom(other.boolField_);
+ stringField_.MergeFrom(other.stringField_);
+ bytesField_.MergeFrom(other.bytesField_);
_unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
}
diff --git a/csharp/src/Google.Protobuf.Test/ByteStringTest.cs b/csharp/src/Google.Protobuf.Test/ByteStringTest.cs
index 4876e09..b757287 100644
--- a/csharp/src/Google.Protobuf.Test/ByteStringTest.cs
+++ b/csharp/src/Google.Protobuf.Test/ByteStringTest.cs
@@ -41,9 +41,7 @@
using System.Runtime.InteropServices;
using System.Threading;
using System.Runtime.CompilerServices;
-#if !NET35
using System.Threading.Tasks;
-#endif
namespace Google.Protobuf
{
@@ -72,7 +70,7 @@
Assert.IsFalse(b1 != b1);
Assert.IsFalse(b1 != b2);
Assert.IsTrue(ByteString.Empty == ByteString.Empty);
-#pragma warning disable 1718
+#pragma warning restore 1718
Assert.IsTrue(b1 != b3);
Assert.IsTrue(b1 != b4);
Assert.IsTrue(b1 != null);
@@ -278,12 +276,9 @@
Span<byte> s = stackalloc byte[data.Length];
data.CopyTo(s);
- using (UnmanagedMemoryManager<byte> manager = new UnmanagedMemoryManager<byte>(s))
- {
- ByteString bs = ByteString.AttachBytes(manager.Memory);
-
- Assert.AreEqual("Hello world", bs.ToString(Encoding.UTF8));
- }
+ using var manager = new UnmanagedMemoryManager<byte>(s);
+ ByteString bs = ByteString.AttachBytes(manager.Memory);
+ Assert.AreEqual("Hello world", bs.ToString(Encoding.UTF8));
}
[Test]
@@ -317,12 +312,9 @@
Span<byte> s = stackalloc byte[data.Length];
data.CopyTo(s);
- using (UnmanagedMemoryManager<byte> manager = new UnmanagedMemoryManager<byte>(s))
- {
- ByteString bs = ByteString.AttachBytes(manager.Memory);
-
- Assert.AreEqual("SGVsbG8gd29ybGQ=", bs.ToBase64());
- }
+ using var manager = new UnmanagedMemoryManager<byte>(s);
+ ByteString bs = ByteString.AttachBytes(manager.Memory);
+ Assert.AreEqual("SGVsbG8gd29ybGQ=", bs.ToBase64());
}
[Test]
@@ -349,7 +341,6 @@
Assert.AreEqual(expected, actual, $"{expected.ToBase64()} != {actual.ToBase64()}");
}
-#if !NET35
[Test]
public async Task FromStreamAsync_Seekable()
{
@@ -373,7 +364,6 @@
ByteString expected = ByteString.CopyFrom(2, 3, 4);
Assert.AreEqual(expected, actual, $"{expected.ToBase64()} != {actual.ToBase64()}");
}
-#endif
[Test]
public void GetHashCode_Regression()
diff --git a/csharp/src/Google.Protobuf.Test/CodedInputStreamTest.cs b/csharp/src/Google.Protobuf.Test/CodedInputStreamTest.cs
index b84a1b7..a48f3b1 100644
--- a/csharp/src/Google.Protobuf.Test/CodedInputStreamTest.cs
+++ b/csharp/src/Google.Protobuf.Test/CodedInputStreamTest.cs
@@ -563,8 +563,8 @@
int groupFieldNumber = Proto2.TestAllTypes.OptionalGroupFieldNumber;
// write Proto2.TestAllTypes with "optional_group" set, but use wrong EndGroup closing tag
- MemoryStream ms = new MemoryStream();
- CodedOutputStream output = new CodedOutputStream(ms);
+ var ms = new MemoryStream();
+ var output = new CodedOutputStream(ms);
output.WriteTag(WireFormat.MakeTag(groupFieldNumber, WireFormat.WireType.StartGroup));
output.WriteGroup(new Proto2.TestAllTypes.Types.OptionalGroup { A = 12345 });
// end group with different field number
@@ -578,8 +578,8 @@
[Test]
public void ReadGroup_UnknownFields_WrongEndGroupTag()
{
- MemoryStream ms = new MemoryStream();
- CodedOutputStream output = new CodedOutputStream(ms);
+ var ms = new MemoryStream();
+ var output = new CodedOutputStream(ms);
output.WriteTag(WireFormat.MakeTag(14, WireFormat.WireType.StartGroup));
// end group with different field number
output.WriteTag(WireFormat.MakeTag(15, WireFormat.WireType.EndGroup));
@@ -654,7 +654,7 @@
output.Flush();
ms.Position = 0;
- CodedInputStream input = new CodedInputStream(ms);
+ var input = new CodedInputStream(ms);
Assert.AreEqual(tag, input.ReadTag());
Assert.Throws<InvalidProtocolBufferException>(() => input.ReadBytes());
@@ -694,26 +694,24 @@
[Test]
public void TestSlowPathAvoidance()
{
- using (var ms = new MemoryStream())
- {
- CodedOutputStream output = new CodedOutputStream(ms);
- output.WriteTag(1, WireFormat.WireType.LengthDelimited);
- output.WriteBytes(ByteString.CopyFrom(new byte[100]));
- output.WriteTag(2, WireFormat.WireType.LengthDelimited);
- output.WriteBytes(ByteString.CopyFrom(new byte[100]));
- output.Flush();
+ using var ms = new MemoryStream();
+ var output = new CodedOutputStream(ms);
+ output.WriteTag(1, WireFormat.WireType.LengthDelimited);
+ output.WriteBytes(ByteString.CopyFrom(new byte[100]));
+ output.WriteTag(2, WireFormat.WireType.LengthDelimited);
+ output.WriteBytes(ByteString.CopyFrom(new byte[100]));
+ output.Flush();
- ms.Position = 0;
- CodedInputStream input = new CodedInputStream(ms, new byte[ms.Length / 2], 0, 0, false);
+ ms.Position = 0;
+ CodedInputStream input = new CodedInputStream(ms, new byte[ms.Length / 2], 0, 0, false);
- uint tag = input.ReadTag();
- Assert.AreEqual(1, WireFormat.GetTagFieldNumber(tag));
- Assert.AreEqual(100, input.ReadBytes().Length);
+ uint tag = input.ReadTag();
+ Assert.AreEqual(1, WireFormat.GetTagFieldNumber(tag));
+ Assert.AreEqual(100, input.ReadBytes().Length);
- tag = input.ReadTag();
- Assert.AreEqual(2, WireFormat.GetTagFieldNumber(tag));
- Assert.AreEqual(100, input.ReadBytes().Length);
- }
+ tag = input.ReadTag();
+ Assert.AreEqual(2, WireFormat.GetTagFieldNumber(tag));
+ Assert.AreEqual(100, input.ReadBytes().Length);
}
[Test]
@@ -927,13 +925,11 @@
{
byte[] serializedMessage = GenerateBigSerializedMessage();
// How many of these big messages do we need to take us near our 2GB limit?
- int count = Int32.MaxValue / serializedMessage.Length;
+ int count = int.MaxValue / serializedMessage.Length;
// Now make a MemoryStream that will fake a near-2GB stream of messages by returning
// our big serialized message 'count' times.
- using (RepeatingMemoryStream stream = new RepeatingMemoryStream(serializedMessage, count))
- {
- Assert.DoesNotThrow(()=>TestAllTypes.Parser.ParseFrom(stream));
- }
+ using var stream = new RepeatingMemoryStream(serializedMessage, count);
+ Assert.DoesNotThrow(() => TestAllTypes.Parser.ParseFrom(stream));
}
[Test]
@@ -941,17 +937,15 @@
{
byte[] serializedMessage = GenerateBigSerializedMessage();
// How many of these big messages do we need to take us near our 2GB limit?
- int count = Int32.MaxValue / serializedMessage.Length;
+ int count = int.MaxValue / serializedMessage.Length;
// Now add one to take us over the 2GB limit
count++;
// Now make a MemoryStream that will fake a near-2GB stream of messages by returning
// our big serialized message 'count' times.
- using (RepeatingMemoryStream stream = new RepeatingMemoryStream(serializedMessage, count))
- {
- Assert.Throws<InvalidProtocolBufferException>(() => TestAllTypes.Parser.ParseFrom(stream),
- "Protocol message was too large. May be malicious. " +
- "Use CodedInputStream.SetSizeLimit() to increase the size limit.");
- }
+ using var stream = new RepeatingMemoryStream(serializedMessage, count);
+ Assert.Throws<InvalidProtocolBufferException>(() => TestAllTypes.Parser.ParseFrom(stream),
+ "Protocol message was too large. May be malicious. " +
+ "Use CodedInputStream.SetSizeLimit() to increase the size limit.");
}
/// <returns>A serialized big message</returns>
diff --git a/csharp/src/Google.Protobuf.Test/CodedOutputStreamTest.cs b/csharp/src/Google.Protobuf.Test/CodedOutputStreamTest.cs
index 13f83a2..31090c4 100644
--- a/csharp/src/Google.Protobuf.Test/CodedOutputStreamTest.cs
+++ b/csharp/src/Google.Protobuf.Test/CodedOutputStreamTest.cs
@@ -94,14 +94,12 @@
if ((value >> 32) == 0)
{
MemoryStream rawOutput = new MemoryStream();
- CodedOutputStream output =
- new CodedOutputStream(rawOutput, bufferSize);
+ CodedOutputStream output = new CodedOutputStream(rawOutput, bufferSize);
output.WriteRawVarint32((uint) value);
output.Flush();
Assert.AreEqual(data, rawOutput.ToArray());
- var bufferWriter = new TestArrayBufferWriter<byte>();
- bufferWriter.MaxGrowBy = bufferSize;
+ var bufferWriter = new TestArrayBufferWriter<byte> { MaxGrowBy = bufferSize };
WriteContext.Initialize(bufferWriter, out WriteContext ctx);
ctx.WriteUInt32((uint) value);
ctx.Flush();
@@ -115,8 +113,7 @@
output.Flush();
Assert.AreEqual(data, rawOutput.ToArray());
- var bufferWriter = new TestArrayBufferWriter<byte>();
- bufferWriter.MaxGrowBy = bufferSize;
+ var bufferWriter = new TestArrayBufferWriter<byte> { MaxGrowBy = bufferSize };
WriteContext.Initialize(bufferWriter, out WriteContext ctx);
ctx.WriteUInt64(value);
ctx.Flush();
@@ -190,8 +187,7 @@
output.Flush();
Assert.AreEqual(data, rawOutput.ToArray());
- var bufferWriter = new TestArrayBufferWriter<byte>();
- bufferWriter.MaxGrowBy = bufferSize;
+ var bufferWriter = new TestArrayBufferWriter<byte> { MaxGrowBy = bufferSize };
WriteContext.Initialize(bufferWriter, out WriteContext ctx);
ctx.WriteFixed32(value);
ctx.Flush();
@@ -228,8 +224,7 @@
output.Flush();
Assert.AreEqual(data, rawOutput.ToArray());
- var bufferWriter = new TestArrayBufferWriter<byte>();
- bufferWriter.MaxGrowBy = blockSize;
+ var bufferWriter = new TestArrayBufferWriter<byte> { MaxGrowBy = blockSize };
WriteContext.Initialize(bufferWriter, out WriteContext ctx);
ctx.WriteFixed64(value);
ctx.Flush();
@@ -270,8 +265,7 @@
output.Flush();
Assert.AreEqual(rawBytes, rawOutput.ToArray());
- var bufferWriter = new TestArrayBufferWriter<byte>();
- bufferWriter.MaxGrowBy = blockSize;
+ var bufferWriter = new TestArrayBufferWriter<byte> { MaxGrowBy = blockSize };
message.WriteTo(bufferWriter);
Assert.AreEqual(rawBytes, bufferWriter.WrittenSpan.ToArray());
}
@@ -383,7 +377,9 @@
{
byte[] content = new byte[110];
for (int i = 0; i < content.Length; i++)
+ {
content[i] = (byte)i;
+ }
byte[] child = new byte[120];
{
diff --git a/csharp/src/Google.Protobuf.Test/Collections/MapFieldTest.cs b/csharp/src/Google.Protobuf.Test/Collections/MapFieldTest.cs
index 1f7b8a3..401b70a 100644
--- a/csharp/src/Google.Protobuf.Test/Collections/MapFieldTest.cs
+++ b/csharp/src/Google.Protobuf.Test/Collections/MapFieldTest.cs
@@ -91,10 +91,12 @@
[Test]
public void AddPreservesInsertionOrder()
{
- var map = new MapField<string, string>();
- map.Add("a", "v1");
- map.Add("b", "v2");
- map.Add("c", "v3");
+ var map = new MapField<string, string>
+ {
+ { "a", "v1" },
+ { "b", "v2" },
+ { "c", "v3" }
+ };
map.Remove("b");
map.Add("d", "v4");
CollectionAssert.AreEqual(new[] { "a", "c", "d" }, map.Keys);
@@ -104,13 +106,17 @@
[Test]
public void EqualityIsOrderInsensitive()
{
- var map1 = new MapField<string, string>();
- map1.Add("a", "v1");
- map1.Add("b", "v2");
+ var map1 = new MapField<string, string>
+ {
+ { "a", "v1" },
+ { "b", "v2" }
+ };
- var map2 = new MapField<string, string>();
- map2.Add("b", "v2");
- map2.Add("a", "v1");
+ var map2 = new MapField<string, string>
+ {
+ { "b", "v2" },
+ { "a", "v1" }
+ };
EqualityTester.AssertEquality(map1, map2);
}
@@ -118,13 +124,17 @@
[Test]
public void EqualityIsKeySensitive()
{
- var map1 = new MapField<string, string>();
- map1.Add("first key", "v1");
- map1.Add("second key", "v2");
+ var map1 = new MapField<string, string>
+ {
+ { "first key", "v1" },
+ { "second key", "v2" }
+ };
- var map2 = new MapField<string, string>();
- map2.Add("third key", "v1");
- map2.Add("fourth key", "v2");
+ var map2 = new MapField<string, string>
+ {
+ { "third key", "v1" },
+ { "fourth key", "v2" }
+ };
EqualityTester.AssertInequality(map1, map2);
}
@@ -143,13 +153,17 @@
{
// Note: Without some care, it's a little easier than one might
// hope to see hash collisions, but only in some environments...
- var map1 = new MapField<string, string>();
- map1.Add("a", "first value");
- map1.Add("b", "second value");
+ var map1 = new MapField<string, string>
+ {
+ { "a", "first value" },
+ { "b", "second value" }
+ };
- var map2 = new MapField<string, string>();
- map2.Add("a", "third value");
- map2.Add("b", "fourth value");
+ var map2 = new MapField<string, string>
+ {
+ { "a", "third value" },
+ { "b", "fourth value" }
+ };
EqualityTester.AssertInequality(map1, map2);
}
@@ -183,8 +197,7 @@
[Test]
public void Add_KeyAlreadyExists()
{
- var map = new MapField<string, string>();
- map.Add("foo", "bar");
+ var map = new MapField<string, string> { { "foo", "bar" } };
Assert.Throws<ArgumentException>(() => map.Add("foo", "baz"));
}
@@ -211,8 +224,7 @@
[Test]
public void Remove_Key()
{
- var map = new MapField<string, string>();
- map.Add("foo", "bar");
+ var map = new MapField<string, string> { { "foo", "bar" } };
Assert.AreEqual(1, map.Count);
Assert.IsFalse(map.Remove("missing"));
Assert.AreEqual(1, map.Count);
@@ -224,8 +236,7 @@
[Test]
public void Remove_Pair()
{
- var map = new MapField<string, string>();
- map.Add("foo", "bar");
+ var map = new MapField<string, string> { { "foo", "bar" } };
ICollection<KeyValuePair<string, string>> collection = map;
Assert.AreEqual(1, map.Count);
Assert.IsFalse(collection.Remove(NewKeyValuePair("wrong key", "bar")));
@@ -240,8 +251,7 @@
[Test]
public void CopyTo_Pair()
{
- var map = new MapField<string, string>();
- map.Add("foo", "bar");
+ var map = new MapField<string, string> { { "foo", "bar" } };
ICollection<KeyValuePair<string, string>> collection = map;
KeyValuePair<string, string>[] array = new KeyValuePair<string, string>[3];
collection.CopyTo(array, 1);
@@ -270,8 +280,7 @@
[Test]
public void Indexer_Set()
{
- var map = new MapField<string, string>();
- map["x"] = "y";
+ var map = new MapField<string, string> { ["x"] = "y" };
Assert.AreEqual("y", map["x"]);
map["x"] = "z"; // This won't throw, unlike Add.
Assert.AreEqual("z", map["x"]);
@@ -357,12 +366,10 @@
IDictionary dictionary = map;
var array = new DictionaryEntry[3];
dictionary.CopyTo(array, 1);
- CollectionAssert.AreEqual(new[] { default(DictionaryEntry), new DictionaryEntry("x", "y"), default(DictionaryEntry) },
- array);
+ CollectionAssert.AreEqual(new[] { default, new DictionaryEntry("x", "y"), default }, array);
var objectArray = new object[3];
dictionary.CopyTo(objectArray, 1);
- CollectionAssert.AreEqual(new object[] { null, new DictionaryEntry("x", "y"), null },
- objectArray);
+ CollectionAssert.AreEqual(new object[] { null, new DictionaryEntry("x", "y"), null }, objectArray);
}
[Test]
@@ -580,8 +587,7 @@
};
Assert.AreEqual("x", map[SampleNaNs.Regular]);
Assert.AreEqual("y", map[SampleNaNs.SignallingFlipped]);
- string ignored;
- Assert.False(map.TryGetValue(SampleNaNs.PayloadFlipped, out ignored));
+ Assert.False(map.TryGetValue(SampleNaNs.PayloadFlipped, out _));
}
[Test]
@@ -635,7 +641,6 @@
Assert.IsTrue(input.IsAtEnd);
}
-#if !NET35
[Test]
public void IDictionaryKeys_Equals_IReadOnlyDictionaryKeys()
{
@@ -649,7 +654,6 @@
var map = new MapField<string, string> { { "foo", "bar" }, { "x", "y" } };
CollectionAssert.AreEquivalent(((IDictionary<string, string>)map).Values, ((IReadOnlyDictionary<string, string>)map).Values);
}
-#endif
private static KeyValuePair<TKey, TValue> NewKeyValuePair<TKey, TValue>(TKey key, TValue value)
{
diff --git a/csharp/src/Google.Protobuf.Test/Collections/RepeatedFieldTest.cs b/csharp/src/Google.Protobuf.Test/Collections/RepeatedFieldTest.cs
index ff8f5cc..5a8977d 100644
--- a/csharp/src/Google.Protobuf.Test/Collections/RepeatedFieldTest.cs
+++ b/csharp/src/Google.Protobuf.Test/Collections/RepeatedFieldTest.cs
@@ -33,7 +33,6 @@
using System;
using System.Collections;
using System.Collections.Generic;
-using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
using System.Text;
@@ -59,8 +58,7 @@
[Test]
public void Add_SingleItem()
{
- var list = new RepeatedField<string>();
- list.Add("foo");
+ var list = new RepeatedField<string> { "foo" };
Assert.AreEqual(1, list.Count);
Assert.AreEqual("foo", list[0]);
}
@@ -68,8 +66,7 @@
[Test]
public void Add_Sequence()
{
- var list = new RepeatedField<string>();
- list.Add(new[] { "foo", "bar" });
+ var list = new RepeatedField<string> { new[] { "foo", "bar" } };
Assert.AreEqual(2, list.Count);
Assert.AreEqual("foo", list[0]);
Assert.AreEqual("bar", list[1]);
@@ -293,15 +290,13 @@
public void Enumerator()
{
var list = new RepeatedField<string> { "first", "second" };
- using (var enumerator = list.GetEnumerator())
- {
- Assert.IsTrue(enumerator.MoveNext());
- Assert.AreEqual("first", enumerator.Current);
- Assert.IsTrue(enumerator.MoveNext());
- Assert.AreEqual("second", enumerator.Current);
- Assert.IsFalse(enumerator.MoveNext());
- Assert.IsFalse(enumerator.MoveNext());
- }
+ using var enumerator = list.GetEnumerator();
+ Assert.IsTrue(enumerator.MoveNext());
+ Assert.AreEqual("first", enumerator.Current);
+ Assert.IsTrue(enumerator.MoveNext());
+ Assert.AreEqual("second", enumerator.Current);
+ Assert.IsFalse(enumerator.MoveNext());
+ Assert.IsFalse(enumerator.MoveNext());
}
[Test]
@@ -893,5 +888,17 @@
Assert.DoesNotThrow(() => list.Capacity = 0, "Can set Capacity to 0");
Assert.AreEqual(0, list.Capacity);
}
+
+ [Test]
+ public void Clear_CapacityUnaffected()
+ {
+ var list = new RepeatedField<int> { 1 };
+ Assert.AreEqual(1, list.Count);
+ Assert.AreEqual(8, list.Capacity);
+
+ list.Clear();
+ Assert.AreEqual(0, list.Count);
+ Assert.AreEqual(8, list.Capacity);
+ }
}
}
diff --git a/csharp/src/Google.Protobuf.Test/Compatibility/StreamExtensionsTest.cs b/csharp/src/Google.Protobuf.Test/Compatibility/StreamExtensionsTest.cs
deleted file mode 100644
index 48c0725..0000000
--- a/csharp/src/Google.Protobuf.Test/Compatibility/StreamExtensionsTest.cs
+++ /dev/null
@@ -1,67 +0,0 @@
-#region Copyright notice and license
-// Protocol Buffers - Google's data interchange format
-// Copyright 2015 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#endregion
-
-#if NET35
-using System;
-using System.IO;
-using NUnit.Framework;
-using Google.Protobuf.Compatibility;
-
-namespace Google.Protobuf.Test.Compatibility
-{
- public class StreamExtensionsTest
- {
- [Test]
- public void CopyToNullArgument()
- {
- var memoryStream = new MemoryStream();
- Assert.Throws<ArgumentNullException>(() => memoryStream.CopyTo(null));
- }
-
- [Test]
- public void CopyToTest()
- {
- byte[] bytesToStream = new byte[] { 0x31, 0x08, 0xFF, 0x00 };
- Stream source = new MemoryStream(bytesToStream);
- Stream destination = new MemoryStream((int)source.Length);
- source.CopyTo(destination);
- destination.Seek(0, SeekOrigin.Begin);
-
- Assert.AreEqual(0x31, destination.ReadByte());
- Assert.AreEqual(0x08, destination.ReadByte());
- Assert.AreEqual(0xFF, destination.ReadByte());
- Assert.AreEqual(0x00, destination.ReadByte());
- Assert.AreEqual(-1, destination.ReadByte());
- }
- }
-}
-#endif
diff --git a/csharp/src/Google.Protobuf.Test/Compatibility/TypeExtensionsTest.cs b/csharp/src/Google.Protobuf.Test/Compatibility/TypeExtensionsTest.cs
index 5d86c20..040a2f1 100644
--- a/csharp/src/Google.Protobuf.Test/Compatibility/TypeExtensionsTest.cs
+++ b/csharp/src/Google.Protobuf.Test/Compatibility/TypeExtensionsTest.cs
@@ -29,12 +29,12 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#endregion
+
using NUnit.Framework;
using System;
using System.Collections.Generic;
using System.Reflection;
-#if !NET35
namespace Google.Protobuf.Compatibility
{
public class TypeExtensionsTest
@@ -114,4 +114,3 @@
}
}
}
-#endif
diff --git a/csharp/src/Google.Protobuf.Test/DeprecatedMemberTest.cs b/csharp/src/Google.Protobuf.Test/DeprecatedMemberTest.cs
index fd041e0..6d31441 100644
--- a/csharp/src/Google.Protobuf.Test/DeprecatedMemberTest.cs
+++ b/csharp/src/Google.Protobuf.Test/DeprecatedMemberTest.cs
@@ -34,7 +34,9 @@
using System.Reflection;
using Google.Protobuf.TestProtos;
using NUnit.Framework;
+using UnitTest.Issues.TestProtos;
+#pragma warning disable CS0612 // Type or member is obsolete
namespace Google.Protobuf
{
public class DeprecatedMemberTest
@@ -46,10 +48,20 @@
}
[Test]
- public void TestDepreatedPrimitiveValue()
- {
- AssertIsDeprecated(typeof(TestDeprecatedFields).GetProperty("DeprecatedInt32"));
- }
+ public void TestDepreatedPrimitiveValue() =>
+ AssertIsDeprecated(typeof(TestDeprecatedFields).GetProperty(nameof(TestDeprecatedFields.DeprecatedInt32)));
+ [Test]
+ public void TestDeprecatedMessage() =>
+ AssertIsDeprecated(typeof(DeprecatedChild));
+
+ [Test]
+ public void TestDeprecatedEnum() =>
+ AssertIsDeprecated(typeof(DeprecatedEnum));
+
+ [Test]
+ public void TestDeprecatedEnumValue() =>
+ AssertIsDeprecated(typeof(DeprecatedEnum).GetField(nameof(DeprecatedEnum.DeprecatedZero)));
}
}
+#pragma warning restore CS0612 // Type or member is obsolete
diff --git a/csharp/src/Google.Protobuf.Test/ExtensionSetTest.cs b/csharp/src/Google.Protobuf.Test/ExtensionSetTest.cs
index b2c24dd..23237d4 100644
--- a/csharp/src/Google.Protobuf.Test/ExtensionSetTest.cs
+++ b/csharp/src/Google.Protobuf.Test/ExtensionSetTest.cs
@@ -1,3 +1,35 @@
+#region Copyright notice and license
+// Protocol Buffers - Google's data interchange format
+// Copyright 2015 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#endregion
+
using System;
using System.Collections;
using Google.Protobuf.TestProtos.Proto2;
@@ -72,7 +104,7 @@
message.SetExtension(OptionalStringExtension, "abcd");
var input = new CodedInputStream(message.ToByteArray());
- input.ExtensionRegistry = new ExtensionRegistry() { OptionalStringExtension };
+ input.ExtensionRegistry = new ExtensionRegistry { OptionalStringExtension };
input.ReadTag(); // TryMergeFieldFrom expects that a tag was just read and will inspect the LastTag value
ExtensionSet<TestAllExtensions> extensionSet = null;
diff --git a/csharp/src/Google.Protobuf.Test/FieldCodecTest.cs b/csharp/src/Google.Protobuf.Test/FieldCodecTest.cs
index 7f36692..4f2a562 100644
--- a/csharp/src/Google.Protobuf.Test/FieldCodecTest.cs
+++ b/csharp/src/Google.Protobuf.Test/FieldCodecTest.cs
@@ -169,7 +169,6 @@
// WriteTagAndValue ignores default values
var stream = new MemoryStream();
CodedOutputStream codedOutput;
-#if !NET35
codedOutput = new CodedOutputStream(stream);
codec.WriteTagAndValue(codedOutput, codec.DefaultValue);
codedOutput.Flush();
@@ -179,7 +178,6 @@
{
Assert.AreEqual(default(T), codec.DefaultValue);
}
-#endif
// The plain ValueWriter/ValueReader delegates don't.
if (codec.DefaultValue != null) // This part isn't appropriate for message types.
diff --git a/csharp/src/Google.Protobuf.Test/FieldMaskTreeTest.cs b/csharp/src/Google.Protobuf.Test/FieldMaskTreeTest.cs
index f71744a..4c206e6 100644
--- a/csharp/src/Google.Protobuf.Test/FieldMaskTreeTest.cs
+++ b/csharp/src/Google.Protobuf.Test/FieldMaskTreeTest.cs
@@ -30,7 +30,6 @@
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#endregion
-using System.Collections.Generic;
using Google.Protobuf.Collections;
using Google.Protobuf.TestProtos;
using NUnit.Framework;
@@ -432,5 +431,89 @@
Assert.IsNotNull(destination.Payload);
}
+ [Test]
+ public void MergeWrapperFieldsWithNonNullFieldsInSource()
+ {
+ // Instantiate a destination with wrapper-based field types.
+ var destination = new TestWellKnownTypes()
+ {
+ StringField = "Hello",
+ Int32Field = 12,
+ Int64Field = 24,
+ BoolField = true,
+ };
+
+ // Set up a targeted update.
+ var source = new TestWellKnownTypes()
+ {
+ StringField = "Hi",
+ Int64Field = 240
+ };
+
+ Merge(new FieldMaskTree().AddFieldPath("string_field").AddFieldPath("int64_field"),
+ source,
+ destination,
+ new FieldMask.MergeOptions(),
+ false);
+
+ // Make sure the targeted fields changed.
+ Assert.AreEqual("Hi", destination.StringField);
+ Assert.AreEqual(240, destination.Int64Field);
+
+ // Prove that non-targeted fields stay intact...
+ Assert.AreEqual(12, destination.Int32Field);
+ Assert.IsTrue(destination.BoolField);
+
+ // ...including default values which were not explicitly set in the destination object.
+ Assert.IsNull(destination.FloatField);
+ }
+
+ [Test]
+ [TestCase(false, "Hello", 24)]
+ [TestCase(true, null, null)]
+ public void MergeWrapperFieldsWithNullFieldsInSource(
+ bool replaceMessageFields,
+ string expectedStringValue,
+ long? expectedInt64Value)
+ {
+ // Instantiate a destination with wrapper-based field types.
+ var destination = new TestWellKnownTypes()
+ {
+ StringField = "Hello",
+ Int32Field = 12,
+ Int64Field = 24,
+ BoolField = true,
+ };
+
+ // Set up a targeted update with null valued fields.
+ var source = new TestWellKnownTypes()
+ {
+ StringField = null,
+ Int64Field = null
+ };
+
+ Merge(new FieldMaskTree().AddFieldPath("string_field").AddFieldPath("int64_field"),
+ source,
+ destination,
+ new FieldMask.MergeOptions()
+ {
+ ReplaceMessageFields = replaceMessageFields
+ },
+ false);
+
+ // Make sure the targeted fields changed according to our expectations, depending on the value of ReplaceMessageFields.
+ // When ReplaceMessageFields is false, the null values are not applied to the destination, because, although wrapped types
+ // are semantically primitives, FieldMaskTree.Merge still treats them as message types in order to maintain consistency with other Protobuf
+ // libraries such as Java and C++.
+ Assert.AreEqual(expectedStringValue, destination.StringField);
+ Assert.AreEqual(expectedInt64Value, destination.Int64Field);
+
+ // Prove that non-targeted fields stay intact...
+ Assert.AreEqual(12, destination.Int32Field);
+ Assert.IsTrue(destination.BoolField);
+
+ // ...including default values which were not explicitly set in the destination object.
+ Assert.IsNull(destination.FloatField);
+ }
}
}
diff --git a/csharp/src/Google.Protobuf.Test/GeneratedMessageTest.Proto2.cs b/csharp/src/Google.Protobuf.Test/GeneratedMessageTest.Proto2.cs
index fa5f927..9d03656 100644
--- a/csharp/src/Google.Protobuf.Test/GeneratedMessageTest.Proto2.cs
+++ b/csharp/src/Google.Protobuf.Test/GeneratedMessageTest.Proto2.cs
@@ -1,3 +1,35 @@
+#region Copyright notice and license
+// Protocol Buffers - Google's data interchange format
+// Copyright 2015 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#endregion
+
using Google.Protobuf.TestProtos.Proto2;
using Proto2 = Google.Protobuf.TestProtos.Proto2;
using NUnit.Framework;
@@ -387,11 +419,9 @@
var message = new TestAllExtensions();
message.SetExtension(UnittestExtensions.OptionalBoolExtension, true);
byte[] bytes = message.ToByteArray();
- using (CodedInputStream input = new CodedInputStream(bytes))
- {
- var parsed = TestAllExtensions.Parser.WithExtensionRegistry(new ExtensionRegistry() { UnittestExtensions.OptionalBoolExtension }).ParseFrom(input);
- Assert.AreEqual(message, parsed);
- }
+ using CodedInputStream input = new CodedInputStream(bytes);
+ var parsed = TestAllExtensions.Parser.WithExtensionRegistry(new ExtensionRegistry() { UnittestExtensions.OptionalBoolExtension }).ParseFrom(input);
+ Assert.AreEqual(message, parsed);
}
}
}
diff --git a/csharp/src/Google.Protobuf.Test/GeneratedMessageTest.cs b/csharp/src/Google.Protobuf.Test/GeneratedMessageTest.cs
index 41a0b91..17c5249 100644
--- a/csharp/src/Google.Protobuf.Test/GeneratedMessageTest.cs
+++ b/csharp/src/Google.Protobuf.Test/GeneratedMessageTest.cs
@@ -33,12 +33,10 @@
using System;
using System.IO;
using Google.Protobuf.TestProtos;
-using Proto2 = Google.Protobuf.TestProtos.Proto2;
using NUnit.Framework;
-using System.Collections;
-using System.Collections.Generic;
using System.Linq;
using Google.Protobuf.WellKnownTypes;
+using Google.Protobuf.Collections;
namespace Google.Protobuf
{
@@ -658,9 +656,11 @@
[Test]
public void OneofSerialization_NonDefaultValue()
{
- var message = new TestAllTypes();
- message.OneofString = "this would take a bit of space";
- message.OneofUint32 = 10;
+ var message = new TestAllTypes
+ {
+ OneofString = "this would take a bit of space",
+ OneofUint32 = 10
+ };
var bytes = message.ToByteArray();
Assert.AreEqual(3, bytes.Length); // 2 bytes for the tag + 1 for the value - no string!
@@ -675,9 +675,11 @@
[Test]
public void OneofSerialization_DefaultValue()
{
- var message = new TestAllTypes();
- message.OneofString = "this would take a bit of space";
- message.OneofUint32 = 0; // This is the default value for UInt32; normally wouldn't be serialized
+ var message = new TestAllTypes
+ {
+ OneofString = "this would take a bit of space",
+ OneofUint32 = 0 // This is the default value for UInt32; normally wouldn't be serialized
+ };
var bytes = message.ToByteArray();
Assert.AreEqual(3, bytes.Length); // 2 bytes for the tag + 1 for the value - it's still serialized
@@ -746,7 +748,6 @@
[Test]
public void ExtraEndGroupThrows()
{
- var message = SampleMessages.CreateFullTestAllTypes();
var stream = new MemoryStream();
var output = new CodedOutputStream(stream);
@@ -795,5 +796,44 @@
EqualityTester.AssertInequality(message1, message2);
EqualityTester.AssertEquality(message1, message3);
}
+
+ [Test]
+ [TestCase(false)]
+ [TestCase(true)]
+ public void MapFieldMerging(bool direct)
+ {
+ var message1 = new TestMap
+ {
+ MapStringString =
+ {
+ { "x1", "y1" },
+ { "common", "message1" }
+ }
+ };
+ var message2 = new TestMap
+ {
+ MapStringString =
+ {
+ { "x2", "y2" },
+ { "common", "message2" }
+ }
+ };
+ if (direct)
+ {
+ message1.MergeFrom(message2);
+ }
+ else
+ {
+ message1.MergeFrom(message2.ToByteArray());
+ }
+
+ var expected = new MapField<string, string>
+ {
+ { "x1", "y1" },
+ { "x2", "y2" },
+ { "common", "message2" }
+ };
+ Assert.AreEqual(expected, message1.MapStringString);
+ }
}
}
\ No newline at end of file
diff --git a/csharp/src/Google.Protobuf.Test/JsonFormatterSettingsTest.cs b/csharp/src/Google.Protobuf.Test/JsonFormatterSettingsTest.cs
new file mode 100644
index 0000000..f7ea97c
--- /dev/null
+++ b/csharp/src/Google.Protobuf.Test/JsonFormatterSettingsTest.cs
@@ -0,0 +1,111 @@
+#region Copyright notice and license
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#endregion
+
+using Google.Protobuf.Reflection;
+using NUnit.Framework;
+
+// For WrapInQuotes
+
+namespace Google.Protobuf
+{
+ public class JsonFormatterSettingsTest
+ {
+ [Test]
+ public void WithIndentation()
+ {
+ var settings = JsonFormatter.Settings.Default.WithIndentation("\t");
+ Assert.AreEqual("\t", settings.Indentation);
+ }
+
+ [Test]
+ public void WithTypeRegistry()
+ {
+ var typeRegistry = TypeRegistry.Empty;
+ var settings = JsonFormatter.Settings.Default.WithTypeRegistry(typeRegistry);
+ Assert.AreEqual(typeRegistry, settings.TypeRegistry);
+ }
+
+ [Test]
+ public void WithFormatDefaultValues()
+ {
+ var settingsWith = JsonFormatter.Settings.Default.WithFormatDefaultValues(true);
+ Assert.AreEqual(true, settingsWith.FormatDefaultValues);
+
+ var settingsWithout = JsonFormatter.Settings.Default.WithFormatDefaultValues(false);
+ Assert.AreEqual(false, settingsWithout.FormatDefaultValues);
+ }
+
+ [Test]
+ public void WithFormatEnumsAsIntegers()
+ {
+ var settingsWith = JsonFormatter.Settings.Default.WithFormatEnumsAsIntegers(true);
+ Assert.AreEqual(true, settingsWith.FormatEnumsAsIntegers);
+
+ var settingsWithout = JsonFormatter.Settings.Default.WithFormatEnumsAsIntegers(false);
+ Assert.AreEqual(false, settingsWithout.FormatEnumsAsIntegers);
+ }
+
+ [Test]
+ public void WithMethodsPreserveExistingSettings()
+ {
+ var typeRegistry = TypeRegistry.Empty;
+ var baseSettings = JsonFormatter.Settings.Default
+ .WithIndentation("\t")
+ .WithFormatDefaultValues(true)
+ .WithFormatEnumsAsIntegers(true)
+ .WithTypeRegistry(typeRegistry)
+ .WithPreserveProtoFieldNames(true);
+
+ var settings1 = baseSettings.WithIndentation("\t");
+ var settings2 = baseSettings.WithFormatDefaultValues(true);
+ var settings3 = baseSettings.WithFormatEnumsAsIntegers(true);
+ var settings4 = baseSettings.WithTypeRegistry(typeRegistry);
+ var settings5 = baseSettings.WithPreserveProtoFieldNames(true);
+
+ AssertAreEqual(baseSettings, settings1);
+ AssertAreEqual(baseSettings, settings2);
+ AssertAreEqual(baseSettings, settings3);
+ AssertAreEqual(baseSettings, settings4);
+ AssertAreEqual(baseSettings, settings5);
+ }
+
+ private static void AssertAreEqual(JsonFormatter.Settings settings, JsonFormatter.Settings other)
+ {
+ Assert.AreEqual(settings.Indentation, other.Indentation);
+ Assert.AreEqual(settings.FormatDefaultValues, other.FormatDefaultValues);
+ Assert.AreEqual(settings.FormatEnumsAsIntegers, other.FormatEnumsAsIntegers);
+ Assert.AreEqual(settings.TypeRegistry, other.TypeRegistry);
+ }
+ }
+}
diff --git a/csharp/src/Google.Protobuf.Test/JsonFormatterTest.cs b/csharp/src/Google.Protobuf.Test/JsonFormatterTest.cs
index 3a77990..f4dfde2 100644
--- a/csharp/src/Google.Protobuf.Test/JsonFormatterTest.cs
+++ b/csharp/src/Google.Protobuf.Test/JsonFormatterTest.cs
@@ -168,8 +168,7 @@
[Test]
public void WithFormatDefaultValues_DoesNotAffectProto3OptionalFields()
{
- var message = new TestProto3Optional();
- message.OptionalInt32 = 0;
+ var message = new TestProto3Optional { OptionalInt32 = 0 };
var formatter = new JsonFormatter(JsonFormatter.Settings.Default.WithFormatDefaultValues(true));
var json = formatter.Format(message);
// The non-optional proto3 fields are formatted, as is the optional-but-specified field.
@@ -179,8 +178,7 @@
[Test]
public void WithFormatDefaultValues_DoesNotAffectProto2Fields()
{
- var message = new TestProtos.Proto2.ForeignMessage();
- message.C = 0;
+ var message = new TestProtos.Proto2.ForeignMessage { C = 0 };
var formatter = new JsonFormatter(JsonFormatter.Settings.Default.WithFormatDefaultValues(true));
var json = formatter.Format(message);
// The specified field is formatted, but the non-specified field (d) is not.
@@ -677,6 +675,200 @@
}
[Test]
+ public void WriteValueWithIndentation_EmptyMessage()
+ {
+ var value = new TestEmptyMessage();
+
+ AssertWriteValue(value, "{}", JsonFormatter.Settings.Default.WithIndentation());
+ }
+
+ [Test]
+ public void WriteValueWithIndentation_NestedTestAllTypes()
+ {
+ var value = new NestedTestAllTypes
+ {
+ Payload = new TestAllTypes
+ {
+ SingleBool = true,
+ SingleInt32 = 100,
+ SingleString = "multiple fields",
+ RepeatedString = { "string1", "string2" },
+ },
+ Child = new NestedTestAllTypes
+ {
+ Payload = new TestAllTypes
+ {
+ SingleString = "single field",
+ },
+ },
+ RepeatedChild =
+ {
+ new NestedTestAllTypes { Payload = new TestAllTypes { SingleString = "child 1", RepeatedString = { "string" } } },
+ new NestedTestAllTypes { Payload = new TestAllTypes { SingleString = "child 2" } },
+ },
+ };
+
+ const string expectedJson = @"
+{
+ 'child': {
+ 'payload': {
+ 'singleString': 'single field'
+ }
+ },
+ 'payload': {
+ 'singleInt32': 100,
+ 'singleBool': true,
+ 'singleString': 'multiple fields',
+ 'repeatedString': [
+ 'string1',
+ 'string2'
+ ]
+ },
+ 'repeatedChild': [
+ {
+ 'payload': {
+ 'singleString': 'child 1',
+ 'repeatedString': [
+ 'string'
+ ]
+ }
+ },
+ {
+ 'payload': {
+ 'singleString': 'child 2'
+ }
+ }
+ ]
+}";
+ AssertWriteValue(value, expectedJson, JsonFormatter.Settings.Default.WithIndentation());
+ }
+
+ [Test]
+ public void WriteValueWithIndentation_WellKnownTypes()
+ {
+ var value = new TestWellKnownTypes
+ {
+ StructField = new Struct
+ {
+ Fields =
+ {
+ { "string", Value.ForString("foo") },
+ { "numbers", Value.ForList(Value.ForNumber(1), Value.ForNumber(2), Value.ForNumber(3)) },
+ { "emptyList", Value.ForList() },
+ { "emptyStruct", Value.ForStruct(new Struct()) },
+ },
+ },
+ };
+
+ const string expectedJson = @"
+{
+ 'structField': {
+ 'string': 'foo',
+ 'numbers': [
+ 1,
+ 2,
+ 3
+ ],
+ 'emptyList': [],
+ 'emptyStruct': {}
+ }
+}";
+ AssertWriteValue(value, expectedJson, JsonFormatter.Settings.Default.WithIndentation());
+ }
+
+ [Test]
+ public void WriteValueWithIndentation_StructSingleField()
+ {
+ var value = new Struct { Fields = { { "structField1", Value.ForString("structFieldValue1") } } };
+
+ const string expectedJson = @"
+{
+ 'structField1': 'structFieldValue1'
+}";
+ AssertWriteValue(value, expectedJson, JsonFormatter.Settings.Default.WithIndentation());
+ }
+
+ [Test]
+ public void WriteValueWithIndentation_StructMultipleFields()
+ {
+ var value = new Struct
+ {
+ Fields =
+ {
+ { "structField1", Value.ForString("structFieldValue1") },
+ { "structField2", Value.ForString("structFieldValue2") },
+ { "structField3", Value.ForString("structFieldValue3") },
+ },
+ };
+
+ const string expectedJson = @"
+{
+ 'structField1': 'structFieldValue1',
+ 'structField2': 'structFieldValue2',
+ 'structField3': 'structFieldValue3'
+}";
+ AssertWriteValue(value, expectedJson, JsonFormatter.Settings.Default.WithIndentation());
+ }
+
+ [Test]
+ public void FormatWithIndentation_EmbeddedMessage()
+ {
+ var value = new TestAllTypes { SingleInt32 = 100, SingleInt64 = 3210987654321L };
+ var formatter = new JsonFormatter(JsonFormatter.Settings.Default.WithIndentation());
+ var valueJson = formatter.Format(value, indentationLevel: 1);
+
+ var actualJson = $@"
+{{
+ ""data"": {valueJson}
+}}";
+ const string expectedJson = @"
+{
+ 'data': {
+ 'singleInt32': 100,
+ 'singleInt64': '3210987654321'
+ }
+}";
+ AssertJson(expectedJson, actualJson.Trim());
+ }
+
+ [Test]
+ public void WriteValueWithIndentation_Map()
+ {
+ var value = new TestMap
+ {
+ MapStringString =
+ {
+ { "key1", "value1" },
+ { "key2", "value2" },
+ },
+ };
+
+ const string expectedJson = @"
+{
+ 'mapStringString': {
+ 'key1': 'value1',
+ 'key2': 'value2'
+ }
+}";
+
+ AssertWriteValue(value, expectedJson, JsonFormatter.Settings.Default.WithIndentation());
+ }
+
+ [Test]
+ public void WriteValueWithIndentation_List()
+ {
+ var value = new RepeatedField<int> { 1, 2, 3 };
+ AssertWriteValue(value, "[\n 1,\n 2,\n 3\n]", JsonFormatter.Settings.Default.WithIndentation());
+ }
+
+ [Test]
+ public void WriteValueWithIndentation_CustomIndentation()
+ {
+ var value = new RepeatedField<int> { 1, 2, 3 };
+ AssertWriteValue(value, "[\n\t1,\n\t2,\n\t3\n]", JsonFormatter.Settings.Default.WithIndentation("\t"));
+ }
+
+ [Test]
public void Proto2_DefaultValuesWritten()
{
var value = new ProtobufTestMessages.Proto2.TestAllTypesProto2() { FieldName13 = 0 };
@@ -685,7 +877,7 @@
private static void AssertWriteValue(object value, string expectedJson, JsonFormatter.Settings settings = null)
{
- var writer = new StringWriter();
+ var writer = new StringWriter { NewLine = "\n" };
new JsonFormatter(settings ?? JsonFormatter.Settings.Default).WriteValue(writer, value);
string actual = writer.ToString();
AssertJson(expectedJson, actual);
@@ -693,13 +885,17 @@
/// <summary>
/// Checks that the actual JSON is the same as the expected JSON - but after replacing
- /// all apostrophes in the expected JSON with double quotes. This basically makes the tests easier
- /// to read.
+ /// all apostrophes in the expected JSON with double quotes, trimming leading whitespace and normalizing new lines.
+ /// This basically makes the tests easier to read.
/// </summary>
+ /// <remarks>
+ /// Line endings are normalized because indented JSON strings are generated with system-specific line endings,
+ /// while line endings in the test cases are hard-coded, but may be converted during source checkout, depending
+ /// on git settings, causing unpredictability in the test results otherwise.</remarks>
private static void AssertJson(string expectedJsonWithApostrophes, string actualJson)
{
- var expectedJson = expectedJsonWithApostrophes.Replace("'", "\"");
- Assert.AreEqual(expectedJson, actualJson);
+ var expectedJson = expectedJsonWithApostrophes.Replace("'", "\"").Replace("\r\n", "\n").TrimStart();
+ Assert.AreEqual(expectedJson, actualJson.Replace("\r\n", "\n"));
}
}
}
diff --git a/csharp/src/Google.Protobuf.Test/JsonParserTest.cs b/csharp/src/Google.Protobuf.Test/JsonParserTest.cs
index eb8996e..c03b326 100644
--- a/csharp/src/Google.Protobuf.Test/JsonParserTest.cs
+++ b/csharp/src/Google.Protobuf.Test/JsonParserTest.cs
@@ -576,6 +576,10 @@
[TestCase("-3.402823e38", -3.402823e38f)]
[TestCase("1.5e1", 15f)]
[TestCase("15e-1", 1.5f)]
+ [TestCase("3.4028235e38", float.MaxValue)]
+ [TestCase("-3.4028235e38", float.MinValue)]
+ [TestCase("3.4028235e+38", float.MaxValue)]
+ [TestCase("-3.4028235e+38", float.MinValue)]
public void NumberToFloat_Valid(string jsonValue, float expectedParsedValue)
{
string json = "{ \"singleFloat\": " + jsonValue + "}";
@@ -584,8 +588,10 @@
}
[Test]
- [TestCase("3.402824e38", typeof(InvalidProtocolBufferException))]
- [TestCase("-3.402824e38", typeof(InvalidProtocolBufferException))]
+ [TestCase("3.4028236e38", typeof(InvalidProtocolBufferException))]
+ [TestCase("-3.4028236e38", typeof(InvalidProtocolBufferException))]
+ [TestCase("3.4028236e+38", typeof(InvalidProtocolBufferException))]
+ [TestCase("-3.4028236e+38", typeof(InvalidProtocolBufferException))]
[TestCase("1,0", typeof(InvalidJsonException))]
[TestCase("1.0.0", typeof(InvalidJsonException))]
[TestCase("+1", typeof(InvalidJsonException))]
@@ -641,7 +647,7 @@
[TestCase("9999-12-31T23:59:59.999999999Z", null)]
public void Timestamp_Valid(string jsonValue, string expectedFormatted)
{
- expectedFormatted = expectedFormatted ?? jsonValue;
+ expectedFormatted ??= jsonValue;
string json = WrapInQuotes(jsonValue);
var parsed = Timestamp.Parser.ParseJson(json);
Assert.AreEqual(WrapInQuotes(expectedFormatted), parsed.ToString());
@@ -758,7 +764,7 @@
[TestCase("-315576000000s", null)]
public void Duration_Valid(string jsonValue, string expectedFormatted)
{
- expectedFormatted = expectedFormatted ?? jsonValue;
+ expectedFormatted ??= jsonValue;
string json = WrapInQuotes(jsonValue);
var parsed = Duration.Parser.ParseJson(json);
Assert.AreEqual(WrapInQuotes(expectedFormatted), parsed.ToString());
@@ -1066,25 +1072,26 @@
""mapStringNestedMessage"": null
}";
- TestAllTypesProto3 message = new TestAllTypesProto3();
-
- message.OptionalInt32 = 1;
- message.OptionalInt64 = 1;
- message.OptionalUint32 = 1;
- message.OptionalUint64 = 1;
- message.OptionalSint32 = 1;
- message.OptionalSint64 = 1;
- message.OptionalFixed32 = 1;
- message.OptionalFixed64 = 1;
- message.OptionalSfixed32 = 1;
- message.OptionalSfixed64 = 1;
- message.OptionalFloat = 1;
- message.OptionalDouble = 1;
- message.OptionalBool = true;
- message.OptionalString = "1";
- message.OptionalBytes = ByteString.CopyFrom(new byte[] { 1 });
- message.OptionalNestedEnum = TestAllTypesProto3.Types.NestedEnum.Bar;
- message.OptionalNestedMessage = new TestAllTypesProto3.Types.NestedMessage();
+ var message = new TestAllTypesProto3
+ {
+ OptionalInt32 = 1,
+ OptionalInt64 = 1,
+ OptionalUint32 = 1,
+ OptionalUint64 = 1,
+ OptionalSint32 = 1,
+ OptionalSint64 = 1,
+ OptionalFixed32 = 1,
+ OptionalFixed64 = 1,
+ OptionalSfixed32 = 1,
+ OptionalSfixed64 = 1,
+ OptionalFloat = 1,
+ OptionalDouble = 1,
+ OptionalBool = true,
+ OptionalString = "1",
+ OptionalBytes = ByteString.CopyFrom(new byte[] { 1 }),
+ OptionalNestedEnum = TestAllTypesProto3.Types.NestedEnum.Bar,
+ OptionalNestedMessage = new TestAllTypesProto3.Types.NestedMessage()
+ };
message.RepeatedInt32.Add(1);
message.RepeatedInt64.Add(1);
message.RepeatedUint32.Add(1);
diff --git a/csharp/src/Google.Protobuf.Test/JsonTokenizerTest.cs b/csharp/src/Google.Protobuf.Test/JsonTokenizerTest.cs
index df43eff..06521dd 100644
--- a/csharp/src/Google.Protobuf.Test/JsonTokenizerTest.cs
+++ b/csharp/src/Google.Protobuf.Test/JsonTokenizerTest.cs
@@ -29,6 +29,7 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#endregion
+
using NUnit.Framework;
using System;
using System.IO;
@@ -126,7 +127,7 @@
tokenizer.PushBack(token);
Assert.AreEqual(0, tokenizer.ObjectDepth);
// Read the same token again, and get back to depth 1
- token = tokenizer.Next();
+ _ = tokenizer.Next();
Assert.AreEqual(1, tokenizer.ObjectDepth);
// Now the same in reverse, with EndObject
diff --git a/csharp/src/Google.Protobuf.Test/LegacyGeneratedCodeTest.cs b/csharp/src/Google.Protobuf.Test/LegacyGeneratedCodeTest.cs
index 22adcaa..01fca3e 100644
--- a/csharp/src/Google.Protobuf.Test/LegacyGeneratedCodeTest.cs
+++ b/csharp/src/Google.Protobuf.Test/LegacyGeneratedCodeTest.cs
@@ -29,14 +29,12 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#endregion
-using Google.Protobuf;
-using Google.Protobuf.Reflection;
+
using System.Buffers;
-using pb = global::Google.Protobuf;
-using pbr = global::Google.Protobuf.Reflection;
+using pb = Google.Protobuf;
+using pbr = Google.Protobuf.Reflection;
using NUnit.Framework;
using System.IO;
-using System;
using Google.Protobuf.Buffers;
namespace Google.Protobuf
diff --git a/csharp/src/Google.Protobuf.Test/MessageParsingHelpers.cs b/csharp/src/Google.Protobuf.Test/MessageParsingHelpers.cs
index 05f1e36..f2eb762 100644
--- a/csharp/src/Google.Protobuf.Test/MessageParsingHelpers.cs
+++ b/csharp/src/Google.Protobuf.Test/MessageParsingHelpers.cs
@@ -136,8 +136,7 @@
// test for different IBufferWriter.GetSpan() segment sizes
for (int blockSize = 1; blockSize < 256; blockSize *= 2)
{
- var segmentedBufferWriter = new TestArrayBufferWriter<byte>();
- segmentedBufferWriter.MaxGrowBy = blockSize;
+ var segmentedBufferWriter = new TestArrayBufferWriter<byte> { MaxGrowBy = blockSize };
message.WriteTo(segmentedBufferWriter);
Assert.AreEqual(bytes, segmentedBufferWriter.WrittenSpan.ToArray());
}
diff --git a/csharp/src/Google.Protobuf/Compatibility/MethodInfoExtensions.cs b/csharp/src/Google.Protobuf.Test/ParsingPrimitivesTest.cs
similarity index 62%
copy from csharp/src/Google.Protobuf/Compatibility/MethodInfoExtensions.cs
copy to csharp/src/Google.Protobuf.Test/ParsingPrimitivesTest.cs
index 7b946cb..4d0aa9e 100644
--- a/csharp/src/Google.Protobuf/Compatibility/MethodInfoExtensions.cs
+++ b/csharp/src/Google.Protobuf.Test/ParsingPrimitivesTest.cs
@@ -1,6 +1,6 @@
#region Copyright notice and license
// Protocol Buffers - Google's data interchange format
-// Copyright 2017 Google Inc. All rights reserved.
+// Copyright 2022 Google Inc. All rights reserved.
// https://developers.google.com/protocol-buffers/
//
// Redistribution and use in source and binary forms, with or without
@@ -30,18 +30,34 @@
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#endregion
-#if NET35
+using NUnit.Framework;
using System;
-using System.Reflection;
+using System.Linq;
-namespace Google.Protobuf.Compatibility
+namespace Google.Protobuf.Test;
+
+internal class ParsingPrimitivesTest
{
- // .NET Core (at least netstandard1.0) doesn't have Delegate.CreateDelegate, and .NET 3.5 doesn't have
- // MethodInfo.CreateDelegate. Proxy from one to the other on .NET 3.5...
- internal static class MethodInfoExtensions
+ // Note: test cases use integers rather than bytes as they're easier
+ // to specify in attributes.
+
+ [Test]
+ [TestCase("\ufffd", 255)]
+ [TestCase("A\ufffd", 65, 255)]
+ [TestCase("A\ufffd\ufffdB", 65, 255, 255, 66)]
+ // Overlong form of "space"
+ [TestCase("\ufffd\ufffd", 0xc0, 0xa0)]
+ public void ReadRawString_NonUtf8(string expectedText, params int[] bytes)
{
- internal static Delegate CreateDelegate(this MethodInfo method, Type type) =>
- Delegate.CreateDelegate(type, method);
+ var context = CreateContext(bytes);
+ string text = ParsingPrimitives.ReadRawString(ref context.buffer, ref context.state, bytes.Length);
+ Assert.AreEqual(expectedText, text);
+ }
+
+ private static ParseContext CreateContext(int[] bytes)
+ {
+ byte[] actualBytes = bytes.Select(b => (byte) b).ToArray();
+ ParseContext.Initialize(actualBytes.AsSpan(), out var context);
+ return context;
}
}
-#endif
diff --git a/csharp/src/Google.Protobuf.Test/Proto3OptionalTest.cs b/csharp/src/Google.Protobuf.Test/Proto3OptionalTest.cs
index 46a8c57..b5b0b72 100644
--- a/csharp/src/Google.Protobuf.Test/Proto3OptionalTest.cs
+++ b/csharp/src/Google.Protobuf.Test/Proto3OptionalTest.cs
@@ -38,7 +38,7 @@
namespace Google.Protobuf.Test
{
- class Proto3OptionalTest
+ public class Proto3OptionalTest
{
[Test]
public void OptionalInt32FieldLifecycle()
diff --git a/csharp/src/Google.Protobuf.Test/ReadOnlySequenceFactory.cs b/csharp/src/Google.Protobuf.Test/ReadOnlySequenceFactory.cs
index f0248ac..d4dfd18 100644
--- a/csharp/src/Google.Protobuf.Test/ReadOnlySequenceFactory.cs
+++ b/csharp/src/Google.Protobuf.Test/ReadOnlySequenceFactory.cs
@@ -33,9 +33,6 @@
using System;
using System.Buffers;
using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
namespace Google.Protobuf
{
@@ -50,7 +47,7 @@
if (addEmptySegmentDelimiters)
{
- segments.Add(new byte[0]);
+ segments.Add(Array.Empty<byte>());
}
var currentIndex = 0;
@@ -65,7 +62,7 @@
if (addEmptySegmentDelimiters)
{
- segments.Add(new byte[0]);
+ segments.Add(Array.Empty<byte>());
}
}
diff --git a/csharp/src/Google.Protobuf.Test/RefStructCompatibilityTest.cs b/csharp/src/Google.Protobuf.Test/RefStructCompatibilityTest.cs
index 9dca501..f3651df 100644
--- a/csharp/src/Google.Protobuf.Test/RefStructCompatibilityTest.cs
+++ b/csharp/src/Google.Protobuf.Test/RefStructCompatibilityTest.cs
@@ -77,43 +77,42 @@
/// <param name="args"></param>
/// <param name="workingDirectory"></param>
private void RunOldCsharpCompilerAndCheckSuccess(string args, string workingDirectory)
- {
- using (var process = new Process())
+ {
+ using var process = new Process();
+
+ // Get the path to the old C# 5 compiler from .NET framework. This approach is not 100% reliable, but works on most machines.
+ // Alternative way of getting the framework path is System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory()
+ // but it only works with the net45 target.
+ var oldCsharpCompilerPath = Path.Combine(Environment.GetEnvironmentVariable("WINDIR"), "Microsoft.NET", "Framework", "v4.0.30319", "csc.exe");
+ process.StartInfo.FileName = oldCsharpCompilerPath;
+ process.StartInfo.RedirectStandardOutput = true;
+ process.StartInfo.RedirectStandardError = true;
+ process.StartInfo.UseShellExecute = false;
+ process.StartInfo.Arguments = args;
+ process.StartInfo.WorkingDirectory = workingDirectory;
+
+ process.OutputDataReceived += (sender, e) =>
{
- // Get the path to the old C# 5 compiler from .NET framework. This approach is not 100% reliable, but works on most machines.
- // Alternative way of getting the framework path is System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory()
- // but it only works with the net45 target.
- var oldCsharpCompilerPath = Path.Combine(Environment.GetEnvironmentVariable("WINDIR"), "Microsoft.NET", "Framework", "v4.0.30319", "csc.exe");
- process.StartInfo.FileName = oldCsharpCompilerPath;
- process.StartInfo.RedirectStandardOutput = true;
- process.StartInfo.RedirectStandardError = true;
- process.StartInfo.UseShellExecute = false;
- process.StartInfo.Arguments = args;
- process.StartInfo.WorkingDirectory = workingDirectory;
-
- process.OutputDataReceived += (sender, e) =>
+ if (e.Data != null)
{
- if (e.Data != null)
- {
- Console.WriteLine(e.Data);
- }
- };
- process.ErrorDataReceived += (sender, e) =>
+ Console.WriteLine(e.Data);
+ }
+ };
+ process.ErrorDataReceived += (sender, e) =>
+ {
+ if (e.Data != null)
{
- if (e.Data != null)
- {
- Console.WriteLine(e.Data);
- }
- };
+ Console.WriteLine(e.Data);
+ }
+ };
- process.Start();
+ process.Start();
- process.BeginErrorReadLine();
- process.BeginOutputReadLine();
+ process.BeginErrorReadLine();
+ process.BeginOutputReadLine();
- process.WaitForExit();
- Assert.AreEqual(0, process.ExitCode);
- }
+ process.WaitForExit();
+ Assert.AreEqual(0, process.ExitCode);
}
}
}
\ No newline at end of file
diff --git a/csharp/src/Google.Protobuf.Test/Reflection/CustomOptionsTest.cs b/csharp/src/Google.Protobuf.Test/Reflection/CustomOptionsTest.cs
index 68b9bd3..589c35c 100644
--- a/csharp/src/Google.Protobuf.Test/Reflection/CustomOptionsTest.cs
+++ b/csharp/src/Google.Protobuf.Test/Reflection/CustomOptionsTest.cs
@@ -31,13 +31,10 @@
#endregion
using Google.Protobuf.Reflection;
-using Google.Protobuf.WellKnownTypes;
using NUnit.Framework;
using System;
-using System.IO;
using System.Linq;
using UnitTest.Issues.TestProtos;
-using static Google.Protobuf.WireFormat;
using static UnitTest.Issues.TestProtos.ComplexOptionType2.Types;
using static UnitTest.Issues.TestProtos.UnittestCustomOptionsProto3Extensions;
using static UnitTest.Issues.TestProtos.DummyMessageContainingEnum.Types;
@@ -65,7 +62,7 @@
}
else
{
- v = default(E);
+ v = default;
return false;
}
};
diff --git a/csharp/src/Google.Protobuf.Test/Reflection/DescriptorsTest.cs b/csharp/src/Google.Protobuf.Test/Reflection/DescriptorsTest.cs
index 65c8b82..03722d4 100644
--- a/csharp/src/Google.Protobuf.Test/Reflection/DescriptorsTest.cs
+++ b/csharp/src/Google.Protobuf.Test/Reflection/DescriptorsTest.cs
@@ -35,7 +35,6 @@
using ProtobufUnittest;
using System;
using System.Collections.Generic;
-using System.IO;
using System.Linq;
using UnitTest.Issues.TestProtos;
diff --git a/csharp/src/Google.Protobuf.Test/UnknownFieldSetTest.cs b/csharp/src/Google.Protobuf.Test/UnknownFieldSetTest.cs
index f3e5af2..eeb9f89 100644
--- a/csharp/src/Google.Protobuf.Test/UnknownFieldSetTest.cs
+++ b/csharp/src/Google.Protobuf.Test/UnknownFieldSetTest.cs
@@ -30,10 +30,8 @@
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#endregion
-using System;
using System.IO;
using Google.Protobuf.TestProtos;
-using Proto2 = Google.Protobuf.TestProtos.Proto2;
using NUnit.Framework;
namespace Google.Protobuf
@@ -127,8 +125,7 @@
public void TestClone(IMessage message)
{
var emptyMessage = new TestEmptyMessage();
- var otherEmptyMessage = new TestEmptyMessage();
- otherEmptyMessage = emptyMessage.Clone();
+ TestEmptyMessage otherEmptyMessage = emptyMessage.Clone();
Assert.AreEqual(emptyMessage.CalculateSize(), otherEmptyMessage.CalculateSize());
Assert.AreEqual(emptyMessage.ToByteArray(), otherEmptyMessage.ToByteArray());
@@ -169,13 +166,13 @@
byte[] data = message.ToByteArray();
int fullSize = message.CalculateSize();
- Action<IMessage> assertEmpty = msg =>
+ void AssertEmpty(IMessage msg)
{
Assert.AreEqual(0, msg.CalculateSize());
Assert.AreEqual(goldenEmptyMessage, msg);
- };
+ }
- Action<IMessage> assertFull = msg => Assert.AreEqual(fullSize, msg.CalculateSize());
+ void AssertFull(IMessage msg) => Assert.AreEqual(fullSize, msg.CalculateSize());
// Test the behavior of the parsers with and without discarding, both generic and non-generic.
MessageParser<TestEmptyMessage> retainingParser1 = TestEmptyMessage.Parser;
@@ -184,28 +181,28 @@
MessageParser discardingParser2 = retainingParser2.WithDiscardUnknownFields(true);
// Test parse from byte[]
- MessageParsingHelpers.AssertReadingMessage(retainingParser1, data, m => assertFull(m));
- MessageParsingHelpers.AssertReadingMessage(retainingParser2, data, m => assertFull(m));
- MessageParsingHelpers.AssertReadingMessage(discardingParser1, data, m => assertEmpty(m));
- MessageParsingHelpers.AssertReadingMessage(discardingParser2, data, m => assertEmpty(m));
+ MessageParsingHelpers.AssertReadingMessage(retainingParser1, data, m => AssertFull(m));
+ MessageParsingHelpers.AssertReadingMessage(retainingParser2, data, m => AssertFull(m));
+ MessageParsingHelpers.AssertReadingMessage(discardingParser1, data, m => AssertEmpty(m));
+ MessageParsingHelpers.AssertReadingMessage(discardingParser2, data, m => AssertEmpty(m));
// Test parse from byte[] with offset
- assertFull(retainingParser1.ParseFrom(data, 0, data.Length));
- assertFull(retainingParser2.ParseFrom(data, 0, data.Length));
- assertEmpty(discardingParser1.ParseFrom(data, 0, data.Length));
- assertEmpty(discardingParser2.ParseFrom(data, 0, data.Length));
+ AssertFull(retainingParser1.ParseFrom(data, 0, data.Length));
+ AssertFull(retainingParser2.ParseFrom(data, 0, data.Length));
+ AssertEmpty(discardingParser1.ParseFrom(data, 0, data.Length));
+ AssertEmpty(discardingParser2.ParseFrom(data, 0, data.Length));
// Test parse from CodedInputStream
- assertFull(retainingParser1.ParseFrom(new CodedInputStream(data)));
- assertFull(retainingParser2.ParseFrom(new CodedInputStream(data)));
- assertEmpty(discardingParser1.ParseFrom(new CodedInputStream(data)));
- assertEmpty(discardingParser2.ParseFrom(new CodedInputStream(data)));
+ AssertFull(retainingParser1.ParseFrom(new CodedInputStream(data)));
+ AssertFull(retainingParser2.ParseFrom(new CodedInputStream(data)));
+ AssertEmpty(discardingParser1.ParseFrom(new CodedInputStream(data)));
+ AssertEmpty(discardingParser2.ParseFrom(new CodedInputStream(data)));
// Test parse from Stream
- assertFull(retainingParser1.ParseFrom(new MemoryStream(data)));
- assertFull(retainingParser2.ParseFrom(new MemoryStream(data)));
- assertEmpty(discardingParser1.ParseFrom(new MemoryStream(data)));
- assertEmpty(discardingParser2.ParseFrom(new MemoryStream(data)));
+ AssertFull(retainingParser1.ParseFrom(new MemoryStream(data)));
+ AssertFull(retainingParser2.ParseFrom(new MemoryStream(data)));
+ AssertEmpty(discardingParser1.ParseFrom(new MemoryStream(data)));
+ AssertEmpty(discardingParser2.ParseFrom(new MemoryStream(data)));
}
[Test]
diff --git a/csharp/src/Google.Protobuf.Test/WellKnownTypes/AnyTest.cs b/csharp/src/Google.Protobuf.Test/WellKnownTypes/AnyTest.cs
index c05cb08..187e06a 100644
--- a/csharp/src/Google.Protobuf.Test/WellKnownTypes/AnyTest.cs
+++ b/csharp/src/Google.Protobuf.Test/WellKnownTypes/AnyTest.cs
@@ -30,8 +30,11 @@
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#endregion
+using Google.Protobuf.Reflection;
using Google.Protobuf.TestProtos;
using NUnit.Framework;
+using System.Linq;
+using UnitTest.Issues.TestProtos;
namespace Google.Protobuf.WellKnownTypes
{
@@ -123,7 +126,6 @@
[TestCase("foobar", "")]
public void GetTypeName(string typeUrl, string expectedTypeName)
{
- var any = new Any { TypeUrl = typeUrl };
Assert.AreEqual(expectedTypeName, Any.GetTypeName(typeUrl));
}
@@ -148,10 +150,34 @@
Assert.False(any.Is(TestOneof.Descriptor));
}
+ [Test]
public void IsRightType()
{
var any = Any.Pack(SampleMessages.CreateFullTestAllTypes());
Assert.True(any.Is(TestAllTypes.Descriptor));
}
+
+ [Test]
+ public void Unpack_TypeRegistry()
+ {
+ var messages = new IMessage[]
+ {
+ SampleMessages.CreateFullTestAllTypes(),
+ new TestWellKnownTypes { BoolField = true },
+ new MoreString { Data = { "x" } },
+ new MoreBytes { Data = ByteString.CopyFromUtf8("xyz") },
+ new ReservedNames { Descriptor_ = 10 }
+ };
+ var anyMessages = messages.Select(Any.Pack);
+
+ // The type registry handles the first four of the packed messages, but not the final one.
+ var registry = TypeRegistry.FromFiles(
+ UnittestWellKnownTypesReflection.Descriptor,
+ UnittestProto3Reflection.Descriptor);
+ var unpacked = anyMessages.Select(any => any.Unpack(registry)).ToList();
+ var expected = (IMessage[]) messages.Clone();
+ expected[4] = null;
+ Assert.AreEqual(expected, unpacked);
+ }
}
}
diff --git a/csharp/src/Google.Protobuf.Test/WellKnownTypes/DurationTest.cs b/csharp/src/Google.Protobuf.Test/WellKnownTypes/DurationTest.cs
index 141faf8..8124f0c 100644
--- a/csharp/src/Google.Protobuf.Test/WellKnownTypes/DurationTest.cs
+++ b/csharp/src/Google.Protobuf.Test/WellKnownTypes/DurationTest.cs
@@ -128,5 +128,38 @@
var duration = new Duration { Seconds = 1, Nanos = -1 };
Assert.AreEqual("{ \"@warning\": \"Invalid Duration\", \"seconds\": \"1\", \"nanos\": -1 }", duration.ToString());
}
+
+ [Test]
+ public void Comparability()
+ {
+ Duration[] durationsInExpectedSortOrder =
+ {
+ null,
+ new Duration { Seconds = -10, Nanos = -10 },
+ new Duration { Seconds = -10, Nanos = -1 },
+ new Duration { Seconds = -1, Nanos = -10 },
+ new Duration { Seconds = -1, Nanos = -1 },
+ new Duration(),
+ new Duration { Seconds = 1, Nanos = 1 },
+ new Duration { Seconds = 1, Nanos = 10 },
+ new Duration { Seconds = 10, Nanos = 1 },
+ new Duration { Seconds = 10, Nanos = 10 }
+ };
+
+ for (int i = 0; i < durationsInExpectedSortOrder.Length; i++)
+ {
+ var target = durationsInExpectedSortOrder[i];
+ if (target is null)
+ {
+ continue;
+ }
+ for (int j = 0; j < durationsInExpectedSortOrder.Length; j++)
+ {
+ var expectedResult = Math.Sign(i - j);
+ var actualResult = target.CompareTo(durationsInExpectedSortOrder[j]);
+ Assert.AreEqual(expectedResult, actualResult);
+ }
+ }
+ }
}
}
diff --git a/csharp/src/Google.Protobuf/Compatibility/MethodInfoExtensions.cs b/csharp/src/Google.Protobuf.Test/WritingPrimitivesTest.cs
similarity index 62%
rename from csharp/src/Google.Protobuf/Compatibility/MethodInfoExtensions.cs
rename to csharp/src/Google.Protobuf.Test/WritingPrimitivesTest.cs
index 7b946cb..069df34 100644
--- a/csharp/src/Google.Protobuf/Compatibility/MethodInfoExtensions.cs
+++ b/csharp/src/Google.Protobuf.Test/WritingPrimitivesTest.cs
@@ -1,6 +1,6 @@
#region Copyright notice and license
// Protocol Buffers - Google's data interchange format
-// Copyright 2017 Google Inc. All rights reserved.
+// Copyright 2022 Google Inc. All rights reserved.
// https://developers.google.com/protocol-buffers/
//
// Redistribution and use in source and binary forms, with or without
@@ -30,18 +30,32 @@
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#endregion
-#if NET35
+using NUnit.Framework;
using System;
-using System.Reflection;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
-namespace Google.Protobuf.Compatibility
+namespace Google.Protobuf.Test;
+
+internal class WritingPrimitivesTest
{
- // .NET Core (at least netstandard1.0) doesn't have Delegate.CreateDelegate, and .NET 3.5 doesn't have
- // MethodInfo.CreateDelegate. Proxy from one to the other on .NET 3.5...
- internal static class MethodInfoExtensions
+ [Test]
+ public void WriteRawString_IllFormedUnicodeString()
{
- internal static Delegate CreateDelegate(this MethodInfo method, Type type) =>
- Delegate.CreateDelegate(type, method);
+ // See https://codeblog.jonskeet.uk/2014/11/07/when-is-a-string-not-a-string/
+ char c1 = '\u0058';
+ char c2 = '\ud800';
+ char c3 = '\u0059';
+ string text = new string(new[] { c1, c2, c3 });
+ Span<byte> buffer = new byte[10];
+ WriteContext.Initialize(ref buffer, out var context);
+ WritingPrimitives.WriteString(ref context.buffer, ref context.state, text);
+
+ // The high surrogate is written out in a "raw" form, surrounded by the ASCII
+ // characters.
+ byte[] expectedBytes = { 0x5, 0x58, 0xef, 0xbf, 0xbd, 0x59 };
+ Assert.AreEqual(expectedBytes, buffer.Slice(0, context.state.position).ToArray());
}
}
-#endif
diff --git a/csharp/src/Google.Protobuf.Test/testprotos.pb b/csharp/src/Google.Protobuf.Test/testprotos.pb
index 83958c6..ae89679 100644
--- a/csharp/src/Google.Protobuf.Test/testprotos.pb
+++ b/csharp/src/Google.Protobuf.Test/testprotos.pb
Binary files differ
diff --git a/csharp/src/Google.Protobuf.sln b/csharp/src/Google.Protobuf.sln
index b571e53..b0bebec 100644
--- a/csharp/src/Google.Protobuf.sln
+++ b/csharp/src/Google.Protobuf.sln
@@ -12,8 +12,6 @@
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Google.Protobuf.JsonDump", "Google.Protobuf.JsonDump\Google.Protobuf.JsonDump.csproj", "{9695E08F-9829-497D-B95C-B38F28D48690}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Google.Protobuf.Benchmarks", "Google.Protobuf.Benchmarks\Google.Protobuf.Benchmarks.csproj", "{D25E4804-4DEA-45AB-9F8C-BA4DBD8E5A07}"
-EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Google.Protobuf.Test.TestProtos", "Google.Protobuf.Test.TestProtos\Google.Protobuf.Test.TestProtos.csproj", "{ADF24BEB-A318-4530-8448-356B72B820EA}"
EndProject
Global
@@ -42,10 +40,6 @@
{9695E08F-9829-497D-B95C-B38F28D48690}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9695E08F-9829-497D-B95C-B38F28D48690}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9695E08F-9829-497D-B95C-B38F28D48690}.Release|Any CPU.Build.0 = Release|Any CPU
- {D25E4804-4DEA-45AB-9F8C-BA4DBD8E5A07}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {D25E4804-4DEA-45AB-9F8C-BA4DBD8E5A07}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {D25E4804-4DEA-45AB-9F8C-BA4DBD8E5A07}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {D25E4804-4DEA-45AB-9F8C-BA4DBD8E5A07}.Release|Any CPU.Build.0 = Release|Any CPU
{ADF24BEB-A318-4530-8448-356B72B820EA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{ADF24BEB-A318-4530-8448-356B72B820EA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{ADF24BEB-A318-4530-8448-356B72B820EA}.Release|Any CPU.ActiveCfg = Release|Any CPU
diff --git a/csharp/src/Google.Protobuf/ByteString.cs b/csharp/src/Google.Protobuf/ByteString.cs
index 8c6eb5b..b13b611 100644
--- a/csharp/src/Google.Protobuf/ByteString.cs
+++ b/csharp/src/Google.Protobuf/ByteString.cs
@@ -37,13 +37,8 @@
using System.Runtime.InteropServices;
using System.Security;
using System.Text;
-#if !NET35
using System.Threading;
using System.Threading.Tasks;
-#endif
-#if NET35
-using Google.Protobuf.Compatibility;
-#endif
namespace Google.Protobuf
{
@@ -186,7 +181,6 @@
return AttachBytes(bytes);
}
-#if !NET35
/// <summary>
/// Constructs a <see cref="ByteString"/> from data in the given stream, asynchronously.
/// </summary>
@@ -195,12 +189,11 @@
/// <param name="stream">The stream to copy into a ByteString.</param>
/// <param name="cancellationToken">The cancellation token to use when reading from the stream, if any.</param>
/// <returns>A ByteString with content read from the given stream.</returns>
- public static Task<ByteString> FromStreamAsync(Stream stream, CancellationToken cancellationToken = default(CancellationToken))
+ public static Task<ByteString> FromStreamAsync(Stream stream, CancellationToken cancellationToken = default)
{
ProtoPreconditions.CheckNotNull(stream, nameof(stream));
return ByteStringAsync.FromStreamAsyncCore(stream, cancellationToken);
}
-#endif
/// <summary>
/// Constructs a <see cref="ByteString" /> from the given array. The contents
@@ -347,7 +340,7 @@
{
return true;
}
- if (ReferenceEquals(lhs, null) || ReferenceEquals(rhs, null))
+ if (lhs is null || rhs is null)
{
return false;
}
diff --git a/csharp/src/Google.Protobuf/ByteStringAsync.cs b/csharp/src/Google.Protobuf/ByteStringAsync.cs
index 3465cc6..5aa92f0 100644
--- a/csharp/src/Google.Protobuf/ByteStringAsync.cs
+++ b/csharp/src/Google.Protobuf/ByteStringAsync.cs
@@ -43,7 +43,6 @@
/// </summary>
internal static class ByteStringAsync
{
-#if !NET35
internal static async Task<ByteString> FromStreamAsyncCore(Stream stream, CancellationToken cancellationToken)
{
int capacity = stream.CanSeek ? checked((int)(stream.Length - stream.Position)) : 0;
@@ -59,6 +58,5 @@
#endif
return ByteString.AttachBytes(bytes);
}
-#endif
}
}
\ No newline at end of file
diff --git a/csharp/src/Google.Protobuf/CodedInputStream.cs b/csharp/src/Google.Protobuf/CodedInputStream.cs
index 96ae84c..aea546a 100644
--- a/csharp/src/Google.Protobuf/CodedInputStream.cs
+++ b/csharp/src/Google.Protobuf/CodedInputStream.cs
@@ -32,10 +32,7 @@
using Google.Protobuf.Collections;
using System;
-using System.Collections.Generic;
using System.IO;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
using System.Security;
namespace Google.Protobuf
@@ -650,21 +647,6 @@
}
/// <summary>
- /// Called when buffer is empty to read more bytes from the
- /// input. If <paramref name="mustSucceed"/> is true, RefillBuffer() guarantees that
- /// either there will be at least one byte in the buffer when it returns
- /// or it will throw an exception. If <paramref name="mustSucceed"/> is false,
- /// RefillBuffer() returns false if no more bytes were available.
- /// </summary>
- /// <param name="mustSucceed"></param>
- /// <returns></returns>
- private bool RefillBuffer(bool mustSucceed)
- {
- var span = new ReadOnlySpan<byte>(buffer);
- return state.segmentedBufferHelper.RefillBuffer(ref span, ref state, mustSucceed);
- }
-
- /// <summary>
/// Reads a fixed size of bytes from the input.
/// </summary>
/// <exception cref="InvalidProtocolBufferException">
diff --git a/csharp/src/Google.Protobuf/CodedOutputStream.cs b/csharp/src/Google.Protobuf/CodedOutputStream.cs
index 5b8cca1..2a162c6 100644
--- a/csharp/src/Google.Protobuf/CodedOutputStream.cs
+++ b/csharp/src/Google.Protobuf/CodedOutputStream.cs
@@ -30,11 +30,9 @@
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#endregion
-using Google.Protobuf.Collections;
using System;
using System.IO;
using System.Security;
-using System.Text;
namespace Google.Protobuf
{
diff --git a/csharp/src/Google.Protobuf/Collections/Lists.cs b/csharp/src/Google.Protobuf/Collections/Lists.cs
index 860795c..9007709 100644
--- a/csharp/src/Google.Protobuf/Collections/Lists.cs
+++ b/csharp/src/Google.Protobuf/Collections/Lists.cs
@@ -31,7 +31,6 @@
#endregion
using System.Collections.Generic;
-using System.Collections.ObjectModel;
namespace Google.Protobuf.Collections
{
diff --git a/csharp/src/Google.Protobuf/Collections/MapField.cs b/csharp/src/Google.Protobuf/Collections/MapField.cs
index e5217f4..09afb75 100644
--- a/csharp/src/Google.Protobuf/Collections/MapField.cs
+++ b/csharp/src/Google.Protobuf/Collections/MapField.cs
@@ -31,9 +31,7 @@
#endregion
using Google.Protobuf.Compatibility;
-using Google.Protobuf.Reflection;
using System;
-using System.Buffers;
using System.Collections;
using System.Collections.Generic;
using System.IO;
@@ -68,18 +66,14 @@
/// in future versions.
/// </para>
/// </remarks>
- public sealed class MapField<TKey, TValue> : IDeepCloneable<MapField<TKey, TValue>>, IDictionary<TKey, TValue>, IEquatable<MapField<TKey, TValue>>, IDictionary
-#if !NET35
- , IReadOnlyDictionary<TKey, TValue>
-#endif
+ public sealed class MapField<TKey, TValue> : IDeepCloneable<MapField<TKey, TValue>>, IDictionary<TKey, TValue>, IEquatable<MapField<TKey, TValue>>, IDictionary, IReadOnlyDictionary<TKey, TValue>
{
private static readonly EqualityComparer<TValue> ValueEqualityComparer = ProtobufEqualityComparers.GetEqualityComparer<TValue>();
private static readonly EqualityComparer<TKey> KeyEqualityComparer = ProtobufEqualityComparers.GetEqualityComparer<TKey>();
// TODO: Don't create the map/list until we have an entry. (Assume many maps will be empty.)
- private readonly Dictionary<TKey, LinkedListNode<KeyValuePair<TKey, TValue>>> map =
- new Dictionary<TKey, LinkedListNode<KeyValuePair<TKey, TValue>>>(KeyEqualityComparer);
- private readonly LinkedList<KeyValuePair<TKey, TValue>> list = new LinkedList<KeyValuePair<TKey, TValue>>();
+ private readonly Dictionary<TKey, LinkedListNode<KeyValuePair<TKey, TValue>>> map = new(KeyEqualityComparer);
+ private readonly LinkedList<KeyValuePair<TKey, TValue>> list = new();
/// <summary>
/// Creates a deep clone of this object.
@@ -147,8 +141,7 @@
public bool Remove(TKey key)
{
ProtoPreconditions.CheckNotNullUnconstrained(key, nameof(key));
- LinkedListNode<KeyValuePair<TKey, TValue>> node;
- if (map.TryGetValue(key, out node))
+ if (map.TryGetValue(key, out LinkedListNode<KeyValuePair<TKey, TValue>> node))
{
map.Remove(key);
node.List.Remove(node);
@@ -170,15 +163,14 @@
/// <returns><c>true</c> if the map contains an element with the specified key; otherwise, <c>false</c>.</returns>
public bool TryGetValue(TKey key, out TValue value)
{
- LinkedListNode<KeyValuePair<TKey, TValue>> node;
- if (map.TryGetValue(key, out node))
+ if (map.TryGetValue(key, out LinkedListNode<KeyValuePair<TKey, TValue>> node))
{
value = node.Value.Value;
return true;
}
else
{
- value = default(TValue);
+ value = default;
return false;
}
}
@@ -195,8 +187,7 @@
get
{
ProtoPreconditions.CheckNotNullUnconstrained(key, nameof(key));
- TValue value;
- if (TryGetValue(key, out value))
+ if (TryGetValue(key, out TValue value))
{
return value;
}
@@ -210,9 +201,8 @@
{
ProtoPreconditions.CheckNotNullUnconstrained(value, nameof(value));
}
- LinkedListNode<KeyValuePair<TKey, TValue>> node;
var pair = new KeyValuePair<TKey, TValue>(key, value);
- if (map.TryGetValue(key, out node))
+ if (map.TryGetValue(key, out LinkedListNode<KeyValuePair<TKey, TValue>> node))
{
node.Value = pair;
}
@@ -227,12 +217,12 @@
/// <summary>
/// Gets a collection containing the keys in the map.
/// </summary>
- public ICollection<TKey> Keys { get { return new MapView<TKey>(this, pair => pair.Key, ContainsKey); } }
+ public ICollection<TKey> Keys => new MapView<TKey>(this, pair => pair.Key, ContainsKey);
/// <summary>
/// Gets a collection containing the values in the map.
/// </summary>
- public ICollection<TValue> Values { get { return new MapView<TValue>(this, pair => pair.Value, ContainsValue); } }
+ public ICollection<TValue> Values => new MapView<TValue>(this, pair => pair.Value, ContainsValue);
/// <summary>
/// Adds the specified entries to the map. The keys and values are not automatically cloned.
@@ -248,15 +238,27 @@
}
/// <summary>
+ /// Adds the specified entries to the map, replacing any existing entries with the same keys.
+ /// The keys and values are not automatically cloned.
+ /// </summary>
+ /// <remarks>This method primarily exists to be called from MergeFrom methods in generated classes for messages.</remarks>
+ /// <param name="entries">The entries to add to the map.</param>
+ public void MergeFrom(IDictionary<TKey, TValue> entries)
+ {
+ ProtoPreconditions.CheckNotNull(entries, nameof(entries));
+ foreach (var pair in entries)
+ {
+ this[pair.Key] = pair.Value;
+ }
+ }
+
+ /// <summary>
/// Returns an enumerator that iterates through the collection.
/// </summary>
/// <returns>
/// An enumerator that can be used to iterate through the collection.
/// </returns>
- public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator()
- {
- return list.GetEnumerator();
- }
+ public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator() => list.GetEnumerator();
/// <summary>
/// Returns an enumerator that iterates through a collection.
@@ -264,19 +266,13 @@
/// <returns>
/// An <see cref="T:System.Collections.IEnumerator" /> object that can be used to iterate through the collection.
/// </returns>
- IEnumerator IEnumerable.GetEnumerator()
- {
- return GetEnumerator();
- }
+ IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
/// <summary>
/// Adds the specified item to the map.
/// </summary>
/// <param name="item">The item to add to the map.</param>
- void ICollection<KeyValuePair<TKey, TValue>>.Add(KeyValuePair<TKey, TValue> item)
- {
- Add(item.Key, item.Value);
- }
+ void ICollection<KeyValuePair<TKey, TValue>>.Add(KeyValuePair<TKey, TValue> item) => Add(item.Key, item.Value);
/// <summary>
/// Removes all items from the map.
@@ -292,21 +288,16 @@
/// </summary>
/// <param name="item">The key/value pair to find.</param>
/// <returns></returns>
- bool ICollection<KeyValuePair<TKey, TValue>>.Contains(KeyValuePair<TKey, TValue> item)
- {
- TValue value;
- return TryGetValue(item.Key, out value) && ValueEqualityComparer.Equals(item.Value, value);
- }
+ bool ICollection<KeyValuePair<TKey, TValue>>.Contains(KeyValuePair<TKey, TValue> item) =>
+ TryGetValue(item.Key, out TValue value) && ValueEqualityComparer.Equals(item.Value, value);
/// <summary>
/// Copies the key/value pairs in this map to an array.
/// </summary>
/// <param name="array">The array to copy the entries into.</param>
/// <param name="arrayIndex">The index of the array at which to start copying values.</param>
- void ICollection<KeyValuePair<TKey, TValue>>.CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex)
- {
+ void ICollection<KeyValuePair<TKey, TValue>>.CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex) =>
list.CopyTo(array, arrayIndex);
- }
/// <summary>
/// Removes the specified key/value pair from the map.
@@ -320,8 +311,7 @@
{
throw new ArgumentException("Key is null", nameof(item));
}
- LinkedListNode<KeyValuePair<TKey, TValue>> node;
- if (map.TryGetValue(item.Key, out node) &&
+ if (map.TryGetValue(item.Key, out LinkedListNode<KeyValuePair<TKey, TValue>> node) &&
EqualityComparer<TValue>.Default.Equals(item.Value, node.Value.Value))
{
map.Remove(item.Key);
@@ -337,12 +327,12 @@
/// <summary>
/// Gets the number of elements contained in the map.
/// </summary>
- public int Count { get { return list.Count; } }
+ public int Count => list.Count;
/// <summary>
/// Gets a value indicating whether the map is read-only.
/// </summary>
- public bool IsReadOnly { get { return false; } }
+ public bool IsReadOnly => false;
/// <summary>
/// Determines whether the specified <see cref="System.Object" />, is equal to this instance.
@@ -351,10 +341,7 @@
/// <returns>
/// <c>true</c> if the specified <see cref="System.Object" /> is equal to this instance; otherwise, <c>false</c>.
/// </returns>
- public override bool Equals(object other)
- {
- return Equals(other as MapField<TKey, TValue>);
- }
+ public override bool Equals(object other) => Equals(other as MapField<TKey, TValue>);
/// <summary>
/// Returns a hash code for this instance.
@@ -399,8 +386,7 @@
var valueComparer = ValueEqualityComparer;
foreach (var pair in this)
{
- TValue value;
- if (!other.TryGetValue(pair.Key, out value))
+ if (!other.TryGetValue(pair.Key, out TValue value))
{
return false;
}
@@ -532,33 +518,20 @@
}
#region IDictionary explicit interface implementation
- void IDictionary.Add(object key, object value)
- {
- Add((TKey)key, (TValue)value);
- }
- bool IDictionary.Contains(object key)
- {
- if (!(key is TKey))
- {
- return false;
- }
- return ContainsKey((TKey)key);
- }
+ void IDictionary.Add(object key, object value) => Add((TKey)key, (TValue)value);
- IDictionaryEnumerator IDictionary.GetEnumerator()
- {
- return new DictionaryEnumerator(GetEnumerator());
- }
+ bool IDictionary.Contains(object key) => key is TKey k && ContainsKey(k);
+
+ IDictionaryEnumerator IDictionary.GetEnumerator() => new DictionaryEnumerator(GetEnumerator());
void IDictionary.Remove(object key)
{
ProtoPreconditions.CheckNotNull(key, nameof(key));
- if (!(key is TKey))
+ if (key is TKey k)
{
- return;
+ Remove(k);
}
- Remove((TKey)key);
}
void ICollection.CopyTo(Array array, int index)
@@ -568,28 +541,27 @@
temp.CopyTo(array, index);
}
- bool IDictionary.IsFixedSize { get { return false; } }
+ bool IDictionary.IsFixedSize => false;
- ICollection IDictionary.Keys { get { return (ICollection)Keys; } }
+ ICollection IDictionary.Keys => (ICollection)Keys;
- ICollection IDictionary.Values { get { return (ICollection)Values; } }
+ ICollection IDictionary.Values => (ICollection)Values;
- bool ICollection.IsSynchronized { get { return false; } }
+ bool ICollection.IsSynchronized => false;
- object ICollection.SyncRoot { get { return this; } }
+ object ICollection.SyncRoot => this;
object IDictionary.this[object key]
{
get
{
ProtoPreconditions.CheckNotNull(key, nameof(key));
- if (!(key is TKey))
+ if (key is TKey k)
{
- return null;
+ TryGetValue(k, out TValue value);
+ return value;
}
- TValue value;
- TryGetValue((TKey)key, out value);
- return value;
+ return null;
}
set
@@ -600,11 +572,8 @@
#endregion
#region IReadOnlyDictionary explicit interface implementation
-#if !NET35
IEnumerable<TKey> IReadOnlyDictionary<TKey, TValue>.Keys => Keys;
-
IEnumerable<TValue> IReadOnlyDictionary<TKey, TValue>.Values => Values;
-#endif
#endregion
private class DictionaryEnumerator : IDictionaryEnumerator
@@ -616,20 +585,14 @@
this.enumerator = enumerator;
}
- public bool MoveNext()
- {
- return enumerator.MoveNext();
- }
+ public bool MoveNext() => enumerator.MoveNext();
- public void Reset()
- {
- enumerator.Reset();
- }
+ public void Reset() => enumerator.Reset();
- public object Current { get { return Entry; } }
- public DictionaryEntry Entry { get { return new DictionaryEntry(Key, Value); } }
- public object Key { get { return enumerator.Current.Key; } }
- public object Value { get { return enumerator.Current.Value; } }
+ public object Current => Entry;
+ public DictionaryEntry Entry => new DictionaryEntry(Key, Value);
+ public object Key => enumerator.Current.Key;
+ public object Value => enumerator.Current.Value;
}
/// <summary>
@@ -688,28 +651,19 @@
this.containsCheck = containsCheck;
}
- public int Count { get { return parent.Count; } }
+ public int Count => parent.Count;
- public bool IsReadOnly { get { return true; } }
+ public bool IsReadOnly => true;
- public bool IsSynchronized { get { return false; } }
+ public bool IsSynchronized => false;
- public object SyncRoot { get { return parent; } }
+ public object SyncRoot => parent;
- public void Add(T item)
- {
- throw new NotSupportedException();
- }
+ public void Add(T item) => throw new NotSupportedException();
- public void Clear()
- {
- throw new NotSupportedException();
- }
+ public void Clear() => throw new NotSupportedException();
- public bool Contains(T item)
- {
- return containsCheck(item);
- }
+ public bool Contains(T item) => containsCheck(item);
public void CopyTo(T[] array, int arrayIndex)
{
@@ -732,15 +686,9 @@
return parent.list.Select(projection).GetEnumerator();
}
- public bool Remove(T item)
- {
- throw new NotSupportedException();
- }
+ public bool Remove(T item) => throw new NotSupportedException();
- IEnumerator IEnumerable.GetEnumerator()
- {
- return GetEnumerator();
- }
+ IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
public void CopyTo(Array array, int index)
{
diff --git a/csharp/src/Google.Protobuf/Collections/ReadOnlyDictionary.cs b/csharp/src/Google.Protobuf/Collections/ReadOnlyDictionary.cs
deleted file mode 100644
index 28530a2..0000000
--- a/csharp/src/Google.Protobuf/Collections/ReadOnlyDictionary.cs
+++ /dev/null
@@ -1,147 +0,0 @@
-#region Copyright notice and license
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#endregion
-
-using System;
-using System.Collections;
-using System.Collections.Generic;
-
-namespace Google.Protobuf.Collections
-{
- /// <summary>
- /// Read-only wrapper around another dictionary.
- /// </summary>
- internal sealed class ReadOnlyDictionary<TKey, TValue> : IDictionary<TKey, TValue>
- {
- private readonly IDictionary<TKey, TValue> wrapped;
-
- public ReadOnlyDictionary(IDictionary<TKey, TValue> wrapped)
- {
- this.wrapped = wrapped;
- }
-
- public void Add(TKey key, TValue value)
- {
- throw new InvalidOperationException();
- }
-
- public bool ContainsKey(TKey key)
- {
- return wrapped.ContainsKey(key);
- }
-
- public ICollection<TKey> Keys
- {
- get { return wrapped.Keys; }
- }
-
- public bool Remove(TKey key)
- {
- throw new InvalidOperationException();
- }
-
- public bool TryGetValue(TKey key, out TValue value)
- {
- return wrapped.TryGetValue(key, out value);
- }
-
- public ICollection<TValue> Values
- {
- get { return wrapped.Values; }
- }
-
- public TValue this[TKey key]
- {
- get { return wrapped[key]; }
- set { throw new InvalidOperationException(); }
- }
-
- public void Add(KeyValuePair<TKey, TValue> item)
- {
- throw new InvalidOperationException();
- }
-
- public void Clear()
- {
- throw new InvalidOperationException();
- }
-
- public bool Contains(KeyValuePair<TKey, TValue> item)
- {
- return wrapped.Contains(item);
- }
-
- public void CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex)
- {
- wrapped.CopyTo(array, arrayIndex);
- }
-
- public int Count
- {
- get { return wrapped.Count; }
- }
-
- public bool IsReadOnly
- {
- get { return true; }
- }
-
- public bool Remove(KeyValuePair<TKey, TValue> item)
- {
- throw new InvalidOperationException();
- }
-
- public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator()
- {
- return wrapped.GetEnumerator();
- }
-
- IEnumerator IEnumerable.GetEnumerator()
- {
- return ((IEnumerable) wrapped).GetEnumerator();
- }
-
- public override bool Equals(object obj)
- {
- return wrapped.Equals(obj);
- }
-
- public override int GetHashCode()
- {
- return wrapped.GetHashCode();
- }
-
- public override string ToString()
- {
- return wrapped.ToString();
- }
- }
-}
\ No newline at end of file
diff --git a/csharp/src/Google.Protobuf/Collections/RepeatedField.cs b/csharp/src/Google.Protobuf/Collections/RepeatedField.cs
index 9269c74..56117fd 100644
--- a/csharp/src/Google.Protobuf/Collections/RepeatedField.cs
+++ b/csharp/src/Google.Protobuf/Collections/RepeatedField.cs
@@ -35,7 +35,6 @@
using System.Collections.Generic;
using System.IO;
using System.Security;
-using System.Threading;
namespace Google.Protobuf.Collections
{
@@ -48,10 +47,7 @@
/// supported by Protocol Buffers but nor does it guarantee that all operations will work in such cases.
/// </remarks>
/// <typeparam name="T">The element type of the repeated field.</typeparam>
- public sealed class RepeatedField<T> : IList<T>, IList, IDeepCloneable<RepeatedField<T>>, IEquatable<RepeatedField<T>>
-#if !NET35
- , IReadOnlyList<T>
-#endif
+ public sealed class RepeatedField<T> : IList<T>, IList, IDeepCloneable<RepeatedField<T>>, IEquatable<RepeatedField<T>>, IReadOnlyList<T>
{
private static readonly EqualityComparer<T> EqualityComparer = ProtobufEqualityComparers.GetEqualityComparer<T>();
private static readonly T[] EmptyArray = new T[0];
@@ -77,8 +73,7 @@
if (array != EmptyArray)
{
clone.array = (T[])array.Clone();
- IDeepCloneable<T>[] cloneableArray = clone.array as IDeepCloneable<T>[];
- if (cloneableArray != null)
+ if (clone.array is IDeepCloneable<T>[] cloneableArray)
{
for (int i = 0; i < count; i++)
{
@@ -284,8 +279,9 @@
}
/// <summary>
- /// Gets and sets the capacity of the RepeatedField's internal array. WHen set, the internal array is reallocated to the given capacity.
- /// <exception cref="ArgumentOutOfRangeException">The new value is less than Count -or- when Count is less than 0.</exception>
+ /// Gets and sets the capacity of the RepeatedField's internal array.
+ /// When set, the internal array is reallocated to the given capacity.
+ /// <exception cref="ArgumentOutOfRangeException">The new value is less than <see cref="Count"/>.</exception>
/// </summary>
public int Capacity
{
@@ -343,7 +339,10 @@
/// </summary>
public void Clear()
{
- array = EmptyArray;
+ // Clear the content of the array (so that any objects it referred to can be garbage collected)
+ // but keep the capacity the same. This allows large repeated fields to be reused without
+ // array reallocation.
+ Array.Clear(array, 0, count);
count = 0;
}
@@ -352,10 +351,7 @@
/// </summary>
/// <param name="item">The item to find.</param>
/// <returns><c>true</c> if this collection contains the given item; <c>false</c> otherwise.</returns>
- public bool Contains(T item)
- {
- return IndexOf(item) != -1;
- }
+ public bool Contains(T item) => IndexOf(item) != -1;
/// <summary>
/// Copies this collection to the given array.
@@ -381,7 +377,7 @@
}
Array.Copy(array, index + 1, array, index, count - index - 1);
count--;
- array[count] = default(T);
+ array[count] = default;
return true;
}
@@ -405,8 +401,7 @@
// Optimization 1: If the collection we're adding is already a RepeatedField<T>,
// we know the values are valid.
- var otherRepeatedField = values as RepeatedField<T>;
- if (otherRepeatedField != null)
+ if (values is RepeatedField<T> otherRepeatedField)
{
EnsureSize(count + otherRepeatedField.count);
Array.Copy(otherRepeatedField.array, 0, array, count, otherRepeatedField.count);
@@ -416,8 +411,7 @@
// Optimization 2: The collection is an ICollection, so we can expand
// just once and ask the collection to copy itself into the array.
- var collection = values as ICollection;
- if (collection != null)
+ if (values is ICollection collection)
{
var extraCount = collection.Count;
// For reference types and nullable value types, we need to check that there are no nulls
@@ -487,21 +481,15 @@
/// <returns>
/// <c>true</c> if the specified <see cref="System.Object" /> is equal to this instance; otherwise, <c>false</c>.
/// </returns>
- public override bool Equals(object obj)
- {
- return Equals(obj as RepeatedField<T>);
- }
-
+ public override bool Equals(object obj) => Equals(obj as RepeatedField<T>);
+
/// <summary>
/// Returns an enumerator that iterates through a collection.
/// </summary>
/// <returns>
/// An <see cref="T:System.Collections.IEnumerator" /> object that can be used to iterate through the collection.
/// </returns>
- IEnumerator IEnumerable.GetEnumerator()
- {
- return GetEnumerator();
- }
+ IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
/// <summary>
/// Returns a hash code for this instance.
@@ -526,7 +514,7 @@
/// <returns><c>true</c> if <paramref name="other"/> refers to an equal repeated field; <c>false</c> otherwise.</returns>
public bool Equals(RepeatedField<T> other)
{
- if (ReferenceEquals(other, null))
+ if (other is null)
{
return false;
}
@@ -599,7 +587,7 @@
}
Array.Copy(array, index + 1, array, index, count - index - 1);
count--;
- array[count] = default(T);
+ array[count] = default;
}
/// <summary>
@@ -645,10 +633,7 @@
#region Explicit interface implementation for IList and ICollection.
bool IList.IsFixedSize => false;
- void ICollection.CopyTo(Array array, int index)
- {
- Array.Copy(this.array, 0, array, index, count);
- }
+ void ICollection.CopyTo(Array array, int index) => Array.Copy(this.array, 0, array, index, count);
bool ICollection.IsSynchronized => false;
@@ -656,8 +641,8 @@
object IList.this[int index]
{
- get { return this[index]; }
- set { this[index] = (T)value; }
+ get => this[index];
+ set => this[index] = (T)value;
}
int IList.Add(object value)
@@ -666,32 +651,18 @@
return count - 1;
}
- bool IList.Contains(object value)
- {
- return (value is T && Contains((T)value));
- }
+ bool IList.Contains(object value) => (value is T t && Contains(t));
- int IList.IndexOf(object value)
- {
- if (!(value is T))
- {
- return -1;
- }
- return IndexOf((T)value);
- }
+ int IList.IndexOf(object value) => (value is T t) ? IndexOf(t) : -1;
- void IList.Insert(int index, object value)
- {
- Insert(index, (T) value);
- }
+ void IList.Insert(int index, object value) => Insert(index, (T) value);
void IList.Remove(object value)
{
- if (!(value is T))
+ if (value is T t)
{
- return;
+ Remove(t);
}
- Remove((T)value);
}
#endregion
}
diff --git a/csharp/src/Google.Protobuf/Compatibility/PropertyInfoExtensions.cs b/csharp/src/Google.Protobuf/Compatibility/PropertyInfoExtensions.cs
index 95a02c7..8a6fefa 100644
--- a/csharp/src/Google.Protobuf/Compatibility/PropertyInfoExtensions.cs
+++ b/csharp/src/Google.Protobuf/Compatibility/PropertyInfoExtensions.cs
@@ -47,11 +47,7 @@
/// </summary>
internal static MethodInfo GetGetMethod(this PropertyInfo target)
{
-#if NET35
- var method = target.GetGetMethod();
-#else
var method = target.GetMethod;
-#endif
return method != null && method.IsPublic ? method : null;
}
@@ -61,11 +57,7 @@
/// </summary>
internal static MethodInfo GetSetMethod(this PropertyInfo target)
{
-#if NET35
- var method = target.GetSetMethod();
-#else
var method = target.SetMethod;
-#endif
return method != null && method.IsPublic ? method : null;
}
}
diff --git a/csharp/src/Google.Protobuf/Compatibility/StreamExtensions.cs b/csharp/src/Google.Protobuf/Compatibility/StreamExtensions.cs
deleted file mode 100644
index bf4bf22..0000000
--- a/csharp/src/Google.Protobuf/Compatibility/StreamExtensions.cs
+++ /dev/null
@@ -1,66 +0,0 @@
-#region Copyright notice and license
-// Protocol Buffers - Google's data interchange format
-// Copyright 2015 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#endregion
-
-#if NET35
-using System;
-using System.IO;
-
-namespace Google.Protobuf.Compatibility
-{
- /// <summary>
- /// Extension methods for <see cref="Stream"/> in order to provide
- /// backwards compatibility with .NET 3.5
- /// </summary>
- public static class StreamExtensions
- {
- // 81920 seems to be the default buffer size used in .NET 4.5.1
- private const int BUFFER_SIZE = 81920;
-
- /// <summary>
- /// Write the contents of the current stream to the destination stream
- /// </summary>
- public static void CopyTo(this Stream source, Stream destination)
- {
- if (destination == null)
- {
- throw new ArgumentNullException(nameof(destination));
- }
-
- byte[] buffer = new byte[BUFFER_SIZE];
- int numBytesRead;
- while ((numBytesRead = source.Read(buffer, 0, buffer.Length)) > 0) {
- destination.Write(buffer, 0, numBytesRead);
- }
- }
- }
-}
-#endif
diff --git a/csharp/src/Google.Protobuf/Compatibility/TypeExtensions.cs b/csharp/src/Google.Protobuf/Compatibility/TypeExtensions.cs
index b3acda2..5db5dca 100644
--- a/csharp/src/Google.Protobuf/Compatibility/TypeExtensions.cs
+++ b/csharp/src/Google.Protobuf/Compatibility/TypeExtensions.cs
@@ -34,7 +34,6 @@
using System.Diagnostics.CodeAnalysis;
using System.Reflection;
-#if !NET35
namespace Google.Protobuf.Compatibility
{
/// <summary>
@@ -112,4 +111,3 @@
}
}
}
-#endif
diff --git a/csharp/src/Google.Protobuf/Compiler/Plugin.cs b/csharp/src/Google.Protobuf/Compiler/Plugin.cs
new file mode 100644
index 0000000..f3a6c17
--- /dev/null
+++ b/csharp/src/Google.Protobuf/Compiler/Plugin.cs
@@ -0,0 +1,1490 @@
+// <auto-generated>
+// Generated by the protocol buffer compiler. DO NOT EDIT!
+// source: google/protobuf/compiler/plugin.proto
+// </auto-generated>
+#pragma warning disable 1591, 0612, 3021, 8981
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace Google.Protobuf.Compiler {
+
+ /// <summary>Holder for reflection information generated from google/protobuf/compiler/plugin.proto</summary>
+ public static partial class PluginReflection {
+
+ #region Descriptor
+ /// <summary>File descriptor for google/protobuf/compiler/plugin.proto</summary>
+ public static pbr::FileDescriptor Descriptor {
+ get { return descriptor; }
+ }
+ private static pbr::FileDescriptor descriptor;
+
+ static PluginReflection() {
+ byte[] descriptorData = global::System.Convert.FromBase64String(
+ string.Concat(
+ "CiVnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnByb3RvEhhnb29n",
+ "bGUucHJvdG9idWYuY29tcGlsZXIaIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlw",
+ "dG9yLnByb3RvIkYKB1ZlcnNpb24SDQoFbWFqb3IYASABKAUSDQoFbWlub3IY",
+ "AiABKAUSDQoFcGF0Y2gYAyABKAUSDgoGc3VmZml4GAQgASgJIroBChRDb2Rl",
+ "R2VuZXJhdG9yUmVxdWVzdBIYChBmaWxlX3RvX2dlbmVyYXRlGAEgAygJEhEK",
+ "CXBhcmFtZXRlchgCIAEoCRI4Cgpwcm90b19maWxlGA8gAygLMiQuZ29vZ2xl",
+ "LnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8SOwoQY29tcGlsZXJfdmVy",
+ "c2lvbhgDIAEoCzIhLmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5WZXJzaW9u",
+ "IsECChVDb2RlR2VuZXJhdG9yUmVzcG9uc2USDQoFZXJyb3IYASABKAkSGgoS",
+ "c3VwcG9ydGVkX2ZlYXR1cmVzGAIgASgEEkIKBGZpbGUYDyADKAsyNC5nb29n",
+ "bGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZp",
+ "bGUafwoERmlsZRIMCgRuYW1lGAEgASgJEhcKD2luc2VydGlvbl9wb2ludBgC",
+ "IAEoCRIPCgdjb250ZW50GA8gASgJEj8KE2dlbmVyYXRlZF9jb2RlX2luZm8Y",
+ "ECABKAsyIi5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8iOAoH",
+ "RmVhdHVyZRIQCgxGRUFUVVJFX05PTkUQABIbChdGRUFUVVJFX1BST1RPM19P",
+ "UFRJT05BTBABQlcKHGNvbS5nb29nbGUucHJvdG9idWYuY29tcGlsZXJCDFBs",
+ "dWdpblByb3Rvc1opZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMv",
+ "cGx1Z2lucGI="));
+ descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+ new pbr::FileDescriptor[] { global::Google.Protobuf.Reflection.DescriptorReflection.Descriptor, },
+ new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] {
+ new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Compiler.Version), global::Google.Protobuf.Compiler.Version.Parser, new[]{ "Major", "Minor", "Patch", "Suffix" }, null, null, null, null),
+ new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Compiler.CodeGeneratorRequest), global::Google.Protobuf.Compiler.CodeGeneratorRequest.Parser, new[]{ "FileToGenerate", "Parameter", "ProtoFile", "CompilerVersion" }, null, null, null, null),
+ new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Compiler.CodeGeneratorResponse), global::Google.Protobuf.Compiler.CodeGeneratorResponse.Parser, new[]{ "Error", "SupportedFeatures", "File" }, null, new[]{ typeof(global::Google.Protobuf.Compiler.CodeGeneratorResponse.Types.Feature) }, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Compiler.CodeGeneratorResponse.Types.File), global::Google.Protobuf.Compiler.CodeGeneratorResponse.Types.File.Parser, new[]{ "Name", "InsertionPoint", "Content", "GeneratedCodeInfo" }, null, null, null, null)})
+ }));
+ }
+ #endregion
+
+ }
+ #region Messages
+ /// <summary>
+ /// The version number of protocol compiler.
+ /// </summary>
+ public sealed partial class Version : pb::IMessage<Version>
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ , pb::IBufferMessage
+ #endif
+ {
+ private static readonly pb::MessageParser<Version> _parser = new pb::MessageParser<Version>(() => new Version());
+ private pb::UnknownFieldSet _unknownFields;
+ private int _hasBits0;
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public static pb::MessageParser<Version> Parser { get { return _parser; } }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public static pbr::MessageDescriptor Descriptor {
+ get { return global::Google.Protobuf.Compiler.PluginReflection.Descriptor.MessageTypes[0]; }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ pbr::MessageDescriptor pb::IMessage.Descriptor {
+ get { return Descriptor; }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public Version() {
+ OnConstruction();
+ }
+
+ partial void OnConstruction();
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public Version(Version other) : this() {
+ _hasBits0 = other._hasBits0;
+ major_ = other.major_;
+ minor_ = other.minor_;
+ patch_ = other.patch_;
+ suffix_ = other.suffix_;
+ _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public Version Clone() {
+ return new Version(this);
+ }
+
+ /// <summary>Field number for the "major" field.</summary>
+ public const int MajorFieldNumber = 1;
+ private readonly static int MajorDefaultValue = 0;
+
+ private int major_;
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public int Major {
+ get { if ((_hasBits0 & 1) != 0) { return major_; } else { return MajorDefaultValue; } }
+ set {
+ _hasBits0 |= 1;
+ major_ = value;
+ }
+ }
+ /// <summary>Gets whether the "major" field is set</summary>
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public bool HasMajor {
+ get { return (_hasBits0 & 1) != 0; }
+ }
+ /// <summary>Clears the value of the "major" field</summary>
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public void ClearMajor() {
+ _hasBits0 &= ~1;
+ }
+
+ /// <summary>Field number for the "minor" field.</summary>
+ public const int MinorFieldNumber = 2;
+ private readonly static int MinorDefaultValue = 0;
+
+ private int minor_;
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public int Minor {
+ get { if ((_hasBits0 & 2) != 0) { return minor_; } else { return MinorDefaultValue; } }
+ set {
+ _hasBits0 |= 2;
+ minor_ = value;
+ }
+ }
+ /// <summary>Gets whether the "minor" field is set</summary>
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public bool HasMinor {
+ get { return (_hasBits0 & 2) != 0; }
+ }
+ /// <summary>Clears the value of the "minor" field</summary>
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public void ClearMinor() {
+ _hasBits0 &= ~2;
+ }
+
+ /// <summary>Field number for the "patch" field.</summary>
+ public const int PatchFieldNumber = 3;
+ private readonly static int PatchDefaultValue = 0;
+
+ private int patch_;
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public int Patch {
+ get { if ((_hasBits0 & 4) != 0) { return patch_; } else { return PatchDefaultValue; } }
+ set {
+ _hasBits0 |= 4;
+ patch_ = value;
+ }
+ }
+ /// <summary>Gets whether the "patch" field is set</summary>
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public bool HasPatch {
+ get { return (_hasBits0 & 4) != 0; }
+ }
+ /// <summary>Clears the value of the "patch" field</summary>
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public void ClearPatch() {
+ _hasBits0 &= ~4;
+ }
+
+ /// <summary>Field number for the "suffix" field.</summary>
+ public const int SuffixFieldNumber = 4;
+ private readonly static string SuffixDefaultValue = "";
+
+ private string suffix_;
+ /// <summary>
+ /// A suffix for alpha, beta or rc release, e.g., "alpha-1", "rc2". It should
+ /// be empty for mainline stable releases.
+ /// </summary>
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public string Suffix {
+ get { return suffix_ ?? SuffixDefaultValue; }
+ set {
+ suffix_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+ }
+ }
+ /// <summary>Gets whether the "suffix" field is set</summary>
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public bool HasSuffix {
+ get { return suffix_ != null; }
+ }
+ /// <summary>Clears the value of the "suffix" field</summary>
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public void ClearSuffix() {
+ suffix_ = null;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public override bool Equals(object other) {
+ return Equals(other as Version);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public bool Equals(Version other) {
+ if (ReferenceEquals(other, null)) {
+ return false;
+ }
+ if (ReferenceEquals(other, this)) {
+ return true;
+ }
+ if (Major != other.Major) return false;
+ if (Minor != other.Minor) return false;
+ if (Patch != other.Patch) return false;
+ if (Suffix != other.Suffix) return false;
+ return Equals(_unknownFields, other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public override int GetHashCode() {
+ int hash = 1;
+ if (HasMajor) hash ^= Major.GetHashCode();
+ if (HasMinor) hash ^= Minor.GetHashCode();
+ if (HasPatch) hash ^= Patch.GetHashCode();
+ if (HasSuffix) hash ^= Suffix.GetHashCode();
+ if (_unknownFields != null) {
+ hash ^= _unknownFields.GetHashCode();
+ }
+ return hash;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public override string ToString() {
+ return pb::JsonFormatter.ToDiagnosticString(this);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public void WriteTo(pb::CodedOutputStream output) {
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ output.WriteRawMessage(this);
+ #else
+ if (HasMajor) {
+ output.WriteRawTag(8);
+ output.WriteInt32(Major);
+ }
+ if (HasMinor) {
+ output.WriteRawTag(16);
+ output.WriteInt32(Minor);
+ }
+ if (HasPatch) {
+ output.WriteRawTag(24);
+ output.WriteInt32(Patch);
+ }
+ if (HasSuffix) {
+ output.WriteRawTag(34);
+ output.WriteString(Suffix);
+ }
+ if (_unknownFields != null) {
+ _unknownFields.WriteTo(output);
+ }
+ #endif
+ }
+
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
+ if (HasMajor) {
+ output.WriteRawTag(8);
+ output.WriteInt32(Major);
+ }
+ if (HasMinor) {
+ output.WriteRawTag(16);
+ output.WriteInt32(Minor);
+ }
+ if (HasPatch) {
+ output.WriteRawTag(24);
+ output.WriteInt32(Patch);
+ }
+ if (HasSuffix) {
+ output.WriteRawTag(34);
+ output.WriteString(Suffix);
+ }
+ if (_unknownFields != null) {
+ _unknownFields.WriteTo(ref output);
+ }
+ }
+ #endif
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public int CalculateSize() {
+ int size = 0;
+ if (HasMajor) {
+ size += 1 + pb::CodedOutputStream.ComputeInt32Size(Major);
+ }
+ if (HasMinor) {
+ size += 1 + pb::CodedOutputStream.ComputeInt32Size(Minor);
+ }
+ if (HasPatch) {
+ size += 1 + pb::CodedOutputStream.ComputeInt32Size(Patch);
+ }
+ if (HasSuffix) {
+ size += 1 + pb::CodedOutputStream.ComputeStringSize(Suffix);
+ }
+ if (_unknownFields != null) {
+ size += _unknownFields.CalculateSize();
+ }
+ return size;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public void MergeFrom(Version other) {
+ if (other == null) {
+ return;
+ }
+ if (other.HasMajor) {
+ Major = other.Major;
+ }
+ if (other.HasMinor) {
+ Minor = other.Minor;
+ }
+ if (other.HasPatch) {
+ Patch = other.Patch;
+ }
+ if (other.HasSuffix) {
+ Suffix = other.Suffix;
+ }
+ _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public void MergeFrom(pb::CodedInputStream input) {
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ input.ReadRawMessage(this);
+ #else
+ uint tag;
+ while ((tag = input.ReadTag()) != 0) {
+ switch(tag) {
+ default:
+ _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+ break;
+ case 8: {
+ Major = input.ReadInt32();
+ break;
+ }
+ case 16: {
+ Minor = input.ReadInt32();
+ break;
+ }
+ case 24: {
+ Patch = input.ReadInt32();
+ break;
+ }
+ case 34: {
+ Suffix = input.ReadString();
+ break;
+ }
+ }
+ }
+ #endif
+ }
+
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
+ uint tag;
+ while ((tag = input.ReadTag()) != 0) {
+ switch(tag) {
+ default:
+ _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
+ break;
+ case 8: {
+ Major = input.ReadInt32();
+ break;
+ }
+ case 16: {
+ Minor = input.ReadInt32();
+ break;
+ }
+ case 24: {
+ Patch = input.ReadInt32();
+ break;
+ }
+ case 34: {
+ Suffix = input.ReadString();
+ break;
+ }
+ }
+ }
+ }
+ #endif
+
+ }
+
+ /// <summary>
+ /// An encoded CodeGeneratorRequest is written to the plugin's stdin.
+ /// </summary>
+ public sealed partial class CodeGeneratorRequest : pb::IMessage<CodeGeneratorRequest>
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ , pb::IBufferMessage
+ #endif
+ {
+ private static readonly pb::MessageParser<CodeGeneratorRequest> _parser = new pb::MessageParser<CodeGeneratorRequest>(() => new CodeGeneratorRequest());
+ private pb::UnknownFieldSet _unknownFields;
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public static pb::MessageParser<CodeGeneratorRequest> Parser { get { return _parser; } }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public static pbr::MessageDescriptor Descriptor {
+ get { return global::Google.Protobuf.Compiler.PluginReflection.Descriptor.MessageTypes[1]; }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ pbr::MessageDescriptor pb::IMessage.Descriptor {
+ get { return Descriptor; }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public CodeGeneratorRequest() {
+ OnConstruction();
+ }
+
+ partial void OnConstruction();
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public CodeGeneratorRequest(CodeGeneratorRequest other) : this() {
+ fileToGenerate_ = other.fileToGenerate_.Clone();
+ parameter_ = other.parameter_;
+ protoFile_ = other.protoFile_.Clone();
+ compilerVersion_ = other.compilerVersion_ != null ? other.compilerVersion_.Clone() : null;
+ _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public CodeGeneratorRequest Clone() {
+ return new CodeGeneratorRequest(this);
+ }
+
+ /// <summary>Field number for the "file_to_generate" field.</summary>
+ public const int FileToGenerateFieldNumber = 1;
+ private static readonly pb::FieldCodec<string> _repeated_fileToGenerate_codec
+ = pb::FieldCodec.ForString(10);
+ private readonly pbc::RepeatedField<string> fileToGenerate_ = new pbc::RepeatedField<string>();
+ /// <summary>
+ /// The .proto files that were explicitly listed on the command-line. The
+ /// code generator should generate code only for these files. Each file's
+ /// descriptor will be included in proto_file, below.
+ /// </summary>
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public pbc::RepeatedField<string> FileToGenerate {
+ get { return fileToGenerate_; }
+ }
+
+ /// <summary>Field number for the "parameter" field.</summary>
+ public const int ParameterFieldNumber = 2;
+ private readonly static string ParameterDefaultValue = "";
+
+ private string parameter_;
+ /// <summary>
+ /// The generator parameter passed on the command-line.
+ /// </summary>
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public string Parameter {
+ get { return parameter_ ?? ParameterDefaultValue; }
+ set {
+ parameter_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+ }
+ }
+ /// <summary>Gets whether the "parameter" field is set</summary>
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public bool HasParameter {
+ get { return parameter_ != null; }
+ }
+ /// <summary>Clears the value of the "parameter" field</summary>
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public void ClearParameter() {
+ parameter_ = null;
+ }
+
+ /// <summary>Field number for the "proto_file" field.</summary>
+ public const int ProtoFileFieldNumber = 15;
+ private static readonly pb::FieldCodec<global::Google.Protobuf.Reflection.FileDescriptorProto> _repeated_protoFile_codec
+ = pb::FieldCodec.ForMessage(122, global::Google.Protobuf.Reflection.FileDescriptorProto.Parser);
+ private readonly pbc::RepeatedField<global::Google.Protobuf.Reflection.FileDescriptorProto> protoFile_ = new pbc::RepeatedField<global::Google.Protobuf.Reflection.FileDescriptorProto>();
+ /// <summary>
+ /// FileDescriptorProtos for all files in files_to_generate and everything
+ /// they import. The files will appear in topological order, so each file
+ /// appears before any file that imports it.
+ ///
+ /// protoc guarantees that all proto_files will be written after
+ /// the fields above, even though this is not technically guaranteed by the
+ /// protobuf wire format. This theoretically could allow a plugin to stream
+ /// in the FileDescriptorProtos and handle them one by one rather than read
+ /// the entire set into memory at once. However, as of this writing, this
+ /// is not similarly optimized on protoc's end -- it will store all fields in
+ /// memory at once before sending them to the plugin.
+ ///
+ /// Type names of fields and extensions in the FileDescriptorProto are always
+ /// fully qualified.
+ /// </summary>
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public pbc::RepeatedField<global::Google.Protobuf.Reflection.FileDescriptorProto> ProtoFile {
+ get { return protoFile_; }
+ }
+
+ /// <summary>Field number for the "compiler_version" field.</summary>
+ public const int CompilerVersionFieldNumber = 3;
+ private global::Google.Protobuf.Compiler.Version compilerVersion_;
+ /// <summary>
+ /// The version number of protocol compiler.
+ /// </summary>
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public global::Google.Protobuf.Compiler.Version CompilerVersion {
+ get { return compilerVersion_; }
+ set {
+ compilerVersion_ = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public override bool Equals(object other) {
+ return Equals(other as CodeGeneratorRequest);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public bool Equals(CodeGeneratorRequest other) {
+ if (ReferenceEquals(other, null)) {
+ return false;
+ }
+ if (ReferenceEquals(other, this)) {
+ return true;
+ }
+ if(!fileToGenerate_.Equals(other.fileToGenerate_)) return false;
+ if (Parameter != other.Parameter) return false;
+ if(!protoFile_.Equals(other.protoFile_)) return false;
+ if (!object.Equals(CompilerVersion, other.CompilerVersion)) return false;
+ return Equals(_unknownFields, other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public override int GetHashCode() {
+ int hash = 1;
+ hash ^= fileToGenerate_.GetHashCode();
+ if (HasParameter) hash ^= Parameter.GetHashCode();
+ hash ^= protoFile_.GetHashCode();
+ if (compilerVersion_ != null) hash ^= CompilerVersion.GetHashCode();
+ if (_unknownFields != null) {
+ hash ^= _unknownFields.GetHashCode();
+ }
+ return hash;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public override string ToString() {
+ return pb::JsonFormatter.ToDiagnosticString(this);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public void WriteTo(pb::CodedOutputStream output) {
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ output.WriteRawMessage(this);
+ #else
+ fileToGenerate_.WriteTo(output, _repeated_fileToGenerate_codec);
+ if (HasParameter) {
+ output.WriteRawTag(18);
+ output.WriteString(Parameter);
+ }
+ if (compilerVersion_ != null) {
+ output.WriteRawTag(26);
+ output.WriteMessage(CompilerVersion);
+ }
+ protoFile_.WriteTo(output, _repeated_protoFile_codec);
+ if (_unknownFields != null) {
+ _unknownFields.WriteTo(output);
+ }
+ #endif
+ }
+
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
+ fileToGenerate_.WriteTo(ref output, _repeated_fileToGenerate_codec);
+ if (HasParameter) {
+ output.WriteRawTag(18);
+ output.WriteString(Parameter);
+ }
+ if (compilerVersion_ != null) {
+ output.WriteRawTag(26);
+ output.WriteMessage(CompilerVersion);
+ }
+ protoFile_.WriteTo(ref output, _repeated_protoFile_codec);
+ if (_unknownFields != null) {
+ _unknownFields.WriteTo(ref output);
+ }
+ }
+ #endif
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public int CalculateSize() {
+ int size = 0;
+ size += fileToGenerate_.CalculateSize(_repeated_fileToGenerate_codec);
+ if (HasParameter) {
+ size += 1 + pb::CodedOutputStream.ComputeStringSize(Parameter);
+ }
+ size += protoFile_.CalculateSize(_repeated_protoFile_codec);
+ if (compilerVersion_ != null) {
+ size += 1 + pb::CodedOutputStream.ComputeMessageSize(CompilerVersion);
+ }
+ if (_unknownFields != null) {
+ size += _unknownFields.CalculateSize();
+ }
+ return size;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public void MergeFrom(CodeGeneratorRequest other) {
+ if (other == null) {
+ return;
+ }
+ fileToGenerate_.Add(other.fileToGenerate_);
+ if (other.HasParameter) {
+ Parameter = other.Parameter;
+ }
+ protoFile_.Add(other.protoFile_);
+ if (other.compilerVersion_ != null) {
+ if (compilerVersion_ == null) {
+ CompilerVersion = new global::Google.Protobuf.Compiler.Version();
+ }
+ CompilerVersion.MergeFrom(other.CompilerVersion);
+ }
+ _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public void MergeFrom(pb::CodedInputStream input) {
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ input.ReadRawMessage(this);
+ #else
+ uint tag;
+ while ((tag = input.ReadTag()) != 0) {
+ switch(tag) {
+ default:
+ _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+ break;
+ case 10: {
+ fileToGenerate_.AddEntriesFrom(input, _repeated_fileToGenerate_codec);
+ break;
+ }
+ case 18: {
+ Parameter = input.ReadString();
+ break;
+ }
+ case 26: {
+ if (compilerVersion_ == null) {
+ CompilerVersion = new global::Google.Protobuf.Compiler.Version();
+ }
+ input.ReadMessage(CompilerVersion);
+ break;
+ }
+ case 122: {
+ protoFile_.AddEntriesFrom(input, _repeated_protoFile_codec);
+ break;
+ }
+ }
+ }
+ #endif
+ }
+
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
+ uint tag;
+ while ((tag = input.ReadTag()) != 0) {
+ switch(tag) {
+ default:
+ _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
+ break;
+ case 10: {
+ fileToGenerate_.AddEntriesFrom(ref input, _repeated_fileToGenerate_codec);
+ break;
+ }
+ case 18: {
+ Parameter = input.ReadString();
+ break;
+ }
+ case 26: {
+ if (compilerVersion_ == null) {
+ CompilerVersion = new global::Google.Protobuf.Compiler.Version();
+ }
+ input.ReadMessage(CompilerVersion);
+ break;
+ }
+ case 122: {
+ protoFile_.AddEntriesFrom(ref input, _repeated_protoFile_codec);
+ break;
+ }
+ }
+ }
+ }
+ #endif
+
+ }
+
+ /// <summary>
+ /// The plugin writes an encoded CodeGeneratorResponse to stdout.
+ /// </summary>
+ public sealed partial class CodeGeneratorResponse : pb::IMessage<CodeGeneratorResponse>
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ , pb::IBufferMessage
+ #endif
+ {
+ private static readonly pb::MessageParser<CodeGeneratorResponse> _parser = new pb::MessageParser<CodeGeneratorResponse>(() => new CodeGeneratorResponse());
+ private pb::UnknownFieldSet _unknownFields;
+ private int _hasBits0;
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public static pb::MessageParser<CodeGeneratorResponse> Parser { get { return _parser; } }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public static pbr::MessageDescriptor Descriptor {
+ get { return global::Google.Protobuf.Compiler.PluginReflection.Descriptor.MessageTypes[2]; }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ pbr::MessageDescriptor pb::IMessage.Descriptor {
+ get { return Descriptor; }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public CodeGeneratorResponse() {
+ OnConstruction();
+ }
+
+ partial void OnConstruction();
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public CodeGeneratorResponse(CodeGeneratorResponse other) : this() {
+ _hasBits0 = other._hasBits0;
+ error_ = other.error_;
+ supportedFeatures_ = other.supportedFeatures_;
+ file_ = other.file_.Clone();
+ _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public CodeGeneratorResponse Clone() {
+ return new CodeGeneratorResponse(this);
+ }
+
+ /// <summary>Field number for the "error" field.</summary>
+ public const int ErrorFieldNumber = 1;
+ private readonly static string ErrorDefaultValue = "";
+
+ private string error_;
+ /// <summary>
+ /// Error message. If non-empty, code generation failed. The plugin process
+ /// should exit with status code zero even if it reports an error in this way.
+ ///
+ /// This should be used to indicate errors in .proto files which prevent the
+ /// code generator from generating correct code. Errors which indicate a
+ /// problem in protoc itself -- such as the input CodeGeneratorRequest being
+ /// unparseable -- should be reported by writing a message to stderr and
+ /// exiting with a non-zero status code.
+ /// </summary>
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public string Error {
+ get { return error_ ?? ErrorDefaultValue; }
+ set {
+ error_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+ }
+ }
+ /// <summary>Gets whether the "error" field is set</summary>
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public bool HasError {
+ get { return error_ != null; }
+ }
+ /// <summary>Clears the value of the "error" field</summary>
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public void ClearError() {
+ error_ = null;
+ }
+
+ /// <summary>Field number for the "supported_features" field.</summary>
+ public const int SupportedFeaturesFieldNumber = 2;
+ private readonly static ulong SupportedFeaturesDefaultValue = 0UL;
+
+ private ulong supportedFeatures_;
+ /// <summary>
+ /// A bitmask of supported features that the code generator supports.
+ /// This is a bitwise "or" of values from the Feature enum.
+ /// </summary>
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public ulong SupportedFeatures {
+ get { if ((_hasBits0 & 1) != 0) { return supportedFeatures_; } else { return SupportedFeaturesDefaultValue; } }
+ set {
+ _hasBits0 |= 1;
+ supportedFeatures_ = value;
+ }
+ }
+ /// <summary>Gets whether the "supported_features" field is set</summary>
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public bool HasSupportedFeatures {
+ get { return (_hasBits0 & 1) != 0; }
+ }
+ /// <summary>Clears the value of the "supported_features" field</summary>
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public void ClearSupportedFeatures() {
+ _hasBits0 &= ~1;
+ }
+
+ /// <summary>Field number for the "file" field.</summary>
+ public const int FileFieldNumber = 15;
+ private static readonly pb::FieldCodec<global::Google.Protobuf.Compiler.CodeGeneratorResponse.Types.File> _repeated_file_codec
+ = pb::FieldCodec.ForMessage(122, global::Google.Protobuf.Compiler.CodeGeneratorResponse.Types.File.Parser);
+ private readonly pbc::RepeatedField<global::Google.Protobuf.Compiler.CodeGeneratorResponse.Types.File> file_ = new pbc::RepeatedField<global::Google.Protobuf.Compiler.CodeGeneratorResponse.Types.File>();
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public pbc::RepeatedField<global::Google.Protobuf.Compiler.CodeGeneratorResponse.Types.File> File {
+ get { return file_; }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public override bool Equals(object other) {
+ return Equals(other as CodeGeneratorResponse);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public bool Equals(CodeGeneratorResponse other) {
+ if (ReferenceEquals(other, null)) {
+ return false;
+ }
+ if (ReferenceEquals(other, this)) {
+ return true;
+ }
+ if (Error != other.Error) return false;
+ if (SupportedFeatures != other.SupportedFeatures) return false;
+ if(!file_.Equals(other.file_)) return false;
+ return Equals(_unknownFields, other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public override int GetHashCode() {
+ int hash = 1;
+ if (HasError) hash ^= Error.GetHashCode();
+ if (HasSupportedFeatures) hash ^= SupportedFeatures.GetHashCode();
+ hash ^= file_.GetHashCode();
+ if (_unknownFields != null) {
+ hash ^= _unknownFields.GetHashCode();
+ }
+ return hash;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public override string ToString() {
+ return pb::JsonFormatter.ToDiagnosticString(this);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public void WriteTo(pb::CodedOutputStream output) {
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ output.WriteRawMessage(this);
+ #else
+ if (HasError) {
+ output.WriteRawTag(10);
+ output.WriteString(Error);
+ }
+ if (HasSupportedFeatures) {
+ output.WriteRawTag(16);
+ output.WriteUInt64(SupportedFeatures);
+ }
+ file_.WriteTo(output, _repeated_file_codec);
+ if (_unknownFields != null) {
+ _unknownFields.WriteTo(output);
+ }
+ #endif
+ }
+
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
+ if (HasError) {
+ output.WriteRawTag(10);
+ output.WriteString(Error);
+ }
+ if (HasSupportedFeatures) {
+ output.WriteRawTag(16);
+ output.WriteUInt64(SupportedFeatures);
+ }
+ file_.WriteTo(ref output, _repeated_file_codec);
+ if (_unknownFields != null) {
+ _unknownFields.WriteTo(ref output);
+ }
+ }
+ #endif
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public int CalculateSize() {
+ int size = 0;
+ if (HasError) {
+ size += 1 + pb::CodedOutputStream.ComputeStringSize(Error);
+ }
+ if (HasSupportedFeatures) {
+ size += 1 + pb::CodedOutputStream.ComputeUInt64Size(SupportedFeatures);
+ }
+ size += file_.CalculateSize(_repeated_file_codec);
+ if (_unknownFields != null) {
+ size += _unknownFields.CalculateSize();
+ }
+ return size;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public void MergeFrom(CodeGeneratorResponse other) {
+ if (other == null) {
+ return;
+ }
+ if (other.HasError) {
+ Error = other.Error;
+ }
+ if (other.HasSupportedFeatures) {
+ SupportedFeatures = other.SupportedFeatures;
+ }
+ file_.Add(other.file_);
+ _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public void MergeFrom(pb::CodedInputStream input) {
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ input.ReadRawMessage(this);
+ #else
+ uint tag;
+ while ((tag = input.ReadTag()) != 0) {
+ switch(tag) {
+ default:
+ _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+ break;
+ case 10: {
+ Error = input.ReadString();
+ break;
+ }
+ case 16: {
+ SupportedFeatures = input.ReadUInt64();
+ break;
+ }
+ case 122: {
+ file_.AddEntriesFrom(input, _repeated_file_codec);
+ break;
+ }
+ }
+ }
+ #endif
+ }
+
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
+ uint tag;
+ while ((tag = input.ReadTag()) != 0) {
+ switch(tag) {
+ default:
+ _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
+ break;
+ case 10: {
+ Error = input.ReadString();
+ break;
+ }
+ case 16: {
+ SupportedFeatures = input.ReadUInt64();
+ break;
+ }
+ case 122: {
+ file_.AddEntriesFrom(ref input, _repeated_file_codec);
+ break;
+ }
+ }
+ }
+ }
+ #endif
+
+ #region Nested types
+ /// <summary>Container for nested types declared in the CodeGeneratorResponse message type.</summary>
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public static partial class Types {
+ /// <summary>
+ /// Sync with code_generator.h.
+ /// </summary>
+ public enum Feature {
+ [pbr::OriginalName("FEATURE_NONE")] None = 0,
+ [pbr::OriginalName("FEATURE_PROTO3_OPTIONAL")] Proto3Optional = 1,
+ }
+
+ /// <summary>
+ /// Represents a single generated file.
+ /// </summary>
+ public sealed partial class File : pb::IMessage<File>
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ , pb::IBufferMessage
+ #endif
+ {
+ private static readonly pb::MessageParser<File> _parser = new pb::MessageParser<File>(() => new File());
+ private pb::UnknownFieldSet _unknownFields;
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public static pb::MessageParser<File> Parser { get { return _parser; } }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public static pbr::MessageDescriptor Descriptor {
+ get { return global::Google.Protobuf.Compiler.CodeGeneratorResponse.Descriptor.NestedTypes[0]; }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ pbr::MessageDescriptor pb::IMessage.Descriptor {
+ get { return Descriptor; }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public File() {
+ OnConstruction();
+ }
+
+ partial void OnConstruction();
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public File(File other) : this() {
+ name_ = other.name_;
+ insertionPoint_ = other.insertionPoint_;
+ content_ = other.content_;
+ generatedCodeInfo_ = other.generatedCodeInfo_ != null ? other.generatedCodeInfo_.Clone() : null;
+ _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public File Clone() {
+ return new File(this);
+ }
+
+ /// <summary>Field number for the "name" field.</summary>
+ public const int NameFieldNumber = 1;
+ private readonly static string NameDefaultValue = "";
+
+ private string name_;
+ /// <summary>
+ /// The file name, relative to the output directory. The name must not
+ /// contain "." or ".." components and must be relative, not be absolute (so,
+ /// the file cannot lie outside the output directory). "/" must be used as
+ /// the path separator, not "\".
+ ///
+ /// If the name is omitted, the content will be appended to the previous
+ /// file. This allows the generator to break large files into small chunks,
+ /// and allows the generated text to be streamed back to protoc so that large
+ /// files need not reside completely in memory at one time. Note that as of
+ /// this writing protoc does not optimize for this -- it will read the entire
+ /// CodeGeneratorResponse before writing files to disk.
+ /// </summary>
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public string Name {
+ get { return name_ ?? NameDefaultValue; }
+ set {
+ name_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+ }
+ }
+ /// <summary>Gets whether the "name" field is set</summary>
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public bool HasName {
+ get { return name_ != null; }
+ }
+ /// <summary>Clears the value of the "name" field</summary>
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public void ClearName() {
+ name_ = null;
+ }
+
+ /// <summary>Field number for the "insertion_point" field.</summary>
+ public const int InsertionPointFieldNumber = 2;
+ private readonly static string InsertionPointDefaultValue = "";
+
+ private string insertionPoint_;
+ /// <summary>
+ /// If non-empty, indicates that the named file should already exist, and the
+ /// content here is to be inserted into that file at a defined insertion
+ /// point. This feature allows a code generator to extend the output
+ /// produced by another code generator. The original generator may provide
+ /// insertion points by placing special annotations in the file that look
+ /// like:
+ /// @@protoc_insertion_point(NAME)
+ /// The annotation can have arbitrary text before and after it on the line,
+ /// which allows it to be placed in a comment. NAME should be replaced with
+ /// an identifier naming the point -- this is what other generators will use
+ /// as the insertion_point. Code inserted at this point will be placed
+ /// immediately above the line containing the insertion point (thus multiple
+ /// insertions to the same point will come out in the order they were added).
+ /// The double-@ is intended to make it unlikely that the generated code
+ /// could contain things that look like insertion points by accident.
+ ///
+ /// For example, the C++ code generator places the following line in the
+ /// .pb.h files that it generates:
+ /// // @@protoc_insertion_point(namespace_scope)
+ /// This line appears within the scope of the file's package namespace, but
+ /// outside of any particular class. Another plugin can then specify the
+ /// insertion_point "namespace_scope" to generate additional classes or
+ /// other declarations that should be placed in this scope.
+ ///
+ /// Note that if the line containing the insertion point begins with
+ /// whitespace, the same whitespace will be added to every line of the
+ /// inserted text. This is useful for languages like Python, where
+ /// indentation matters. In these languages, the insertion point comment
+ /// should be indented the same amount as any inserted code will need to be
+ /// in order to work correctly in that context.
+ ///
+ /// The code generator that generates the initial file and the one which
+ /// inserts into it must both run as part of a single invocation of protoc.
+ /// Code generators are executed in the order in which they appear on the
+ /// command line.
+ ///
+ /// If |insertion_point| is present, |name| must also be present.
+ /// </summary>
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public string InsertionPoint {
+ get { return insertionPoint_ ?? InsertionPointDefaultValue; }
+ set {
+ insertionPoint_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+ }
+ }
+ /// <summary>Gets whether the "insertion_point" field is set</summary>
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public bool HasInsertionPoint {
+ get { return insertionPoint_ != null; }
+ }
+ /// <summary>Clears the value of the "insertion_point" field</summary>
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public void ClearInsertionPoint() {
+ insertionPoint_ = null;
+ }
+
+ /// <summary>Field number for the "content" field.</summary>
+ public const int ContentFieldNumber = 15;
+ private readonly static string ContentDefaultValue = "";
+
+ private string content_;
+ /// <summary>
+ /// The file contents.
+ /// </summary>
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public string Content {
+ get { return content_ ?? ContentDefaultValue; }
+ set {
+ content_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+ }
+ }
+ /// <summary>Gets whether the "content" field is set</summary>
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public bool HasContent {
+ get { return content_ != null; }
+ }
+ /// <summary>Clears the value of the "content" field</summary>
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public void ClearContent() {
+ content_ = null;
+ }
+
+ /// <summary>Field number for the "generated_code_info" field.</summary>
+ public const int GeneratedCodeInfoFieldNumber = 16;
+ private global::Google.Protobuf.Reflection.GeneratedCodeInfo generatedCodeInfo_;
+ /// <summary>
+ /// Information describing the file content being inserted. If an insertion
+ /// point is used, this information will be appropriately offset and inserted
+ /// into the code generation metadata for the generated files.
+ /// </summary>
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public global::Google.Protobuf.Reflection.GeneratedCodeInfo GeneratedCodeInfo {
+ get { return generatedCodeInfo_; }
+ set {
+ generatedCodeInfo_ = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public override bool Equals(object other) {
+ return Equals(other as File);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public bool Equals(File other) {
+ if (ReferenceEquals(other, null)) {
+ return false;
+ }
+ if (ReferenceEquals(other, this)) {
+ return true;
+ }
+ if (Name != other.Name) return false;
+ if (InsertionPoint != other.InsertionPoint) return false;
+ if (Content != other.Content) return false;
+ if (!object.Equals(GeneratedCodeInfo, other.GeneratedCodeInfo)) return false;
+ return Equals(_unknownFields, other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public override int GetHashCode() {
+ int hash = 1;
+ if (HasName) hash ^= Name.GetHashCode();
+ if (HasInsertionPoint) hash ^= InsertionPoint.GetHashCode();
+ if (HasContent) hash ^= Content.GetHashCode();
+ if (generatedCodeInfo_ != null) hash ^= GeneratedCodeInfo.GetHashCode();
+ if (_unknownFields != null) {
+ hash ^= _unknownFields.GetHashCode();
+ }
+ return hash;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public override string ToString() {
+ return pb::JsonFormatter.ToDiagnosticString(this);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public void WriteTo(pb::CodedOutputStream output) {
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ output.WriteRawMessage(this);
+ #else
+ if (HasName) {
+ output.WriteRawTag(10);
+ output.WriteString(Name);
+ }
+ if (HasInsertionPoint) {
+ output.WriteRawTag(18);
+ output.WriteString(InsertionPoint);
+ }
+ if (HasContent) {
+ output.WriteRawTag(122);
+ output.WriteString(Content);
+ }
+ if (generatedCodeInfo_ != null) {
+ output.WriteRawTag(130, 1);
+ output.WriteMessage(GeneratedCodeInfo);
+ }
+ if (_unknownFields != null) {
+ _unknownFields.WriteTo(output);
+ }
+ #endif
+ }
+
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
+ if (HasName) {
+ output.WriteRawTag(10);
+ output.WriteString(Name);
+ }
+ if (HasInsertionPoint) {
+ output.WriteRawTag(18);
+ output.WriteString(InsertionPoint);
+ }
+ if (HasContent) {
+ output.WriteRawTag(122);
+ output.WriteString(Content);
+ }
+ if (generatedCodeInfo_ != null) {
+ output.WriteRawTag(130, 1);
+ output.WriteMessage(GeneratedCodeInfo);
+ }
+ if (_unknownFields != null) {
+ _unknownFields.WriteTo(ref output);
+ }
+ }
+ #endif
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public int CalculateSize() {
+ int size = 0;
+ if (HasName) {
+ size += 1 + pb::CodedOutputStream.ComputeStringSize(Name);
+ }
+ if (HasInsertionPoint) {
+ size += 1 + pb::CodedOutputStream.ComputeStringSize(InsertionPoint);
+ }
+ if (HasContent) {
+ size += 1 + pb::CodedOutputStream.ComputeStringSize(Content);
+ }
+ if (generatedCodeInfo_ != null) {
+ size += 2 + pb::CodedOutputStream.ComputeMessageSize(GeneratedCodeInfo);
+ }
+ if (_unknownFields != null) {
+ size += _unknownFields.CalculateSize();
+ }
+ return size;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public void MergeFrom(File other) {
+ if (other == null) {
+ return;
+ }
+ if (other.HasName) {
+ Name = other.Name;
+ }
+ if (other.HasInsertionPoint) {
+ InsertionPoint = other.InsertionPoint;
+ }
+ if (other.HasContent) {
+ Content = other.Content;
+ }
+ if (other.generatedCodeInfo_ != null) {
+ if (generatedCodeInfo_ == null) {
+ GeneratedCodeInfo = new global::Google.Protobuf.Reflection.GeneratedCodeInfo();
+ }
+ GeneratedCodeInfo.MergeFrom(other.GeneratedCodeInfo);
+ }
+ _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public void MergeFrom(pb::CodedInputStream input) {
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ input.ReadRawMessage(this);
+ #else
+ uint tag;
+ while ((tag = input.ReadTag()) != 0) {
+ switch(tag) {
+ default:
+ _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+ break;
+ case 10: {
+ Name = input.ReadString();
+ break;
+ }
+ case 18: {
+ InsertionPoint = input.ReadString();
+ break;
+ }
+ case 122: {
+ Content = input.ReadString();
+ break;
+ }
+ case 130: {
+ if (generatedCodeInfo_ == null) {
+ GeneratedCodeInfo = new global::Google.Protobuf.Reflection.GeneratedCodeInfo();
+ }
+ input.ReadMessage(GeneratedCodeInfo);
+ break;
+ }
+ }
+ }
+ #endif
+ }
+
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
+ uint tag;
+ while ((tag = input.ReadTag()) != 0) {
+ switch(tag) {
+ default:
+ _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
+ break;
+ case 10: {
+ Name = input.ReadString();
+ break;
+ }
+ case 18: {
+ InsertionPoint = input.ReadString();
+ break;
+ }
+ case 122: {
+ Content = input.ReadString();
+ break;
+ }
+ case 130: {
+ if (generatedCodeInfo_ == null) {
+ GeneratedCodeInfo = new global::Google.Protobuf.Reflection.GeneratedCodeInfo();
+ }
+ input.ReadMessage(GeneratedCodeInfo);
+ break;
+ }
+ }
+ }
+ }
+ #endif
+
+ }
+
+ }
+ #endregion
+
+ }
+
+ #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/csharp/src/Google.Protobuf/Extension.cs b/csharp/src/Google.Protobuf/Extension.cs
index d10a668..2807260 100644
--- a/csharp/src/Google.Protobuf/Extension.cs
+++ b/csharp/src/Google.Protobuf/Extension.cs
@@ -77,7 +77,7 @@
this.codec = codec;
}
- internal TValue DefaultValue => codec != null ? codec.DefaultValue : default(TValue);
+ internal TValue DefaultValue => codec != null ? codec.DefaultValue : default;
internal override Type TargetType => typeof(TTarget);
diff --git a/csharp/src/Google.Protobuf/ExtensionRegistry.cs b/csharp/src/Google.Protobuf/ExtensionRegistry.cs
index e72314b..be381f0 100644
--- a/csharp/src/Google.Protobuf/ExtensionRegistry.cs
+++ b/csharp/src/Google.Protobuf/ExtensionRegistry.cs
@@ -55,7 +55,7 @@
internal static ExtensionComparer Instance = new ExtensionComparer();
}
- private IDictionary<ObjectIntPair<Type>, Extension> extensions;
+ private readonly IDictionary<ObjectIntPair<Type>, Extension> extensions;
/// <summary>
/// Creates a new empty extension registry
diff --git a/csharp/src/Google.Protobuf/ExtensionSet.cs b/csharp/src/Google.Protobuf/ExtensionSet.cs
index 306e45e..aa1acbd 100644
--- a/csharp/src/Google.Protobuf/ExtensionSet.cs
+++ b/csharp/src/Google.Protobuf/ExtensionSet.cs
@@ -61,8 +61,7 @@
/// </summary>
public static TValue Get<TTarget, TValue>(ref ExtensionSet<TTarget> set, Extension<TTarget, TValue> extension) where TTarget : IExtendableMessage<TTarget>
{
- IExtensionValue value;
- if (TryGetValue(ref set, extension, out value))
+ if (TryGetValue(ref set, extension, out IExtensionValue value))
{
// The stored ExtensionValue can be a different type to what is being requested.
// This happens when the same extension proto is compiled in different assemblies.
@@ -98,7 +97,7 @@
}
}
}
- else
+ else
{
return extension.DefaultValue;
}
@@ -109,8 +108,7 @@
/// </summary>
public static RepeatedField<TValue> Get<TTarget, TValue>(ref ExtensionSet<TTarget> set, RepeatedExtension<TTarget, TValue> extension) where TTarget : IExtendableMessage<TTarget>
{
- IExtensionValue value;
- if (TryGetValue(ref set, extension, out value))
+ if (TryGetValue(ref set, extension, out IExtensionValue value))
{
if (value is RepeatedExtensionValue<TValue> extensionValue)
{
@@ -132,7 +130,7 @@
}
}
}
- else
+ else
{
return null;
}
@@ -193,8 +191,7 @@
/// </summary>
public static bool Has<TTarget, TValue>(ref ExtensionSet<TTarget> set, Extension<TTarget, TValue> extension) where TTarget : IExtendableMessage<TTarget>
{
- IExtensionValue value;
- return TryGetValue(ref set, extension, out value);
+ return TryGetValue(ref set, extension, out IExtensionValue _);
}
/// <summary>
@@ -252,20 +249,18 @@
/// </summary>
public static bool TryMergeFieldFrom<TTarget>(ref ExtensionSet<TTarget> set, ref ParseContext ctx) where TTarget : IExtendableMessage<TTarget>
{
- Extension extension;
int lastFieldNumber = WireFormat.GetTagFieldNumber(ctx.LastTag);
- IExtensionValue extensionValue;
- if (set != null && set.ValuesByNumber.TryGetValue(lastFieldNumber, out extensionValue))
+ if (set != null && set.ValuesByNumber.TryGetValue(lastFieldNumber, out IExtensionValue extensionValue))
{
extensionValue.MergeFrom(ref ctx);
return true;
}
- else if (ctx.ExtensionRegistry != null && ctx.ExtensionRegistry.ContainsInputField(ctx.LastTag, typeof(TTarget), out extension))
+ else if (ctx.ExtensionRegistry != null && ctx.ExtensionRegistry.ContainsInputField(ctx.LastTag, typeof(TTarget), out Extension extension))
{
IExtensionValue value = extension.CreateValue();
value.MergeFrom(ref ctx);
- set = (set ?? new ExtensionSet<TTarget>());
+ set ??= new ExtensionSet<TTarget>();
set.ValuesByNumber.Add(extension.FieldNumber, value);
return true;
}
@@ -290,8 +285,7 @@
}
foreach (var pair in second.ValuesByNumber)
{
- IExtensionValue value;
- if (first.ValuesByNumber.TryGetValue(pair.Key, out value))
+ if (first.ValuesByNumber.TryGetValue(pair.Key, out IExtensionValue value))
{
value.MergeFrom(pair.Value);
}
@@ -365,8 +359,7 @@
}
foreach (var pair in ValuesByNumber)
{
- IExtensionValue secondValue;
- if (!otherSet.ValuesByNumber.TryGetValue(pair.Key, out secondValue))
+ if (!otherSet.ValuesByNumber.TryGetValue(pair.Key, out IExtensionValue secondValue))
{
return false;
}
diff --git a/csharp/src/Google.Protobuf/ExtensionValue.cs b/csharp/src/Google.Protobuf/ExtensionValue.cs
index 1329b2f..9637f1b 100644
--- a/csharp/src/Google.Protobuf/ExtensionValue.cs
+++ b/csharp/src/Google.Protobuf/ExtensionValue.cs
@@ -32,7 +32,6 @@
using Google.Protobuf.Collections;
using System;
-using System.Linq;
namespace Google.Protobuf
{
@@ -50,7 +49,7 @@
internal sealed class ExtensionValue<T> : IExtensionValue
{
private T field;
- private FieldCodec<T> codec;
+ private readonly FieldCodec<T> codec;
internal ExtensionValue(FieldCodec<T> codec)
{
diff --git a/csharp/src/Google.Protobuf/FieldCodec.cs b/csharp/src/Google.Protobuf/FieldCodec.cs
index ee6bd6a..d3b0b71 100644
--- a/csharp/src/Google.Protobuf/FieldCodec.cs
+++ b/csharp/src/Google.Protobuf/FieldCodec.cs
@@ -31,7 +31,6 @@
#endregion
using Google.Protobuf.Collections;
-using Google.Protobuf.Compatibility;
using Google.Protobuf.WellKnownTypes;
using System;
using System.Collections.Generic;
@@ -51,150 +50,105 @@
/// </summary>
/// <param name="tag">The tag.</param>
/// <returns>A codec for the given tag.</returns>
- public static FieldCodec<string> ForString(uint tag)
- {
- return FieldCodec.ForString(tag, "");
- }
+ public static FieldCodec<string> ForString(uint tag) => ForString(tag, "");
/// <summary>
/// Retrieves a codec suitable for a bytes field with the given tag.
/// </summary>
/// <param name="tag">The tag.</param>
/// <returns>A codec for the given tag.</returns>
- public static FieldCodec<ByteString> ForBytes(uint tag)
- {
- return FieldCodec.ForBytes(tag, ByteString.Empty);
- }
+ public static FieldCodec<ByteString> ForBytes(uint tag) => ForBytes(tag, ByteString.Empty);
/// <summary>
/// Retrieves a codec suitable for a bool field with the given tag.
/// </summary>
/// <param name="tag">The tag.</param>
/// <returns>A codec for the given tag.</returns>
- public static FieldCodec<bool> ForBool(uint tag)
- {
- return FieldCodec.ForBool(tag, false);
- }
+ public static FieldCodec<bool> ForBool(uint tag) => ForBool(tag, false);
/// <summary>
/// Retrieves a codec suitable for an int32 field with the given tag.
/// </summary>
/// <param name="tag">The tag.</param>
/// <returns>A codec for the given tag.</returns>
- public static FieldCodec<int> ForInt32(uint tag)
- {
- return FieldCodec.ForInt32(tag, 0);
- }
+ public static FieldCodec<int> ForInt32(uint tag) => ForInt32(tag, 0);
/// <summary>
/// Retrieves a codec suitable for an sint32 field with the given tag.
/// </summary>
/// <param name="tag">The tag.</param>
/// <returns>A codec for the given tag.</returns>
- public static FieldCodec<int> ForSInt32(uint tag)
- {
- return FieldCodec.ForSInt32(tag, 0);
- }
+ public static FieldCodec<int> ForSInt32(uint tag) => ForSInt32(tag, 0);
/// <summary>
/// Retrieves a codec suitable for a fixed32 field with the given tag.
/// </summary>
/// <param name="tag">The tag.</param>
/// <returns>A codec for the given tag.</returns>
- public static FieldCodec<uint> ForFixed32(uint tag)
- {
- return FieldCodec.ForFixed32(tag, 0);
- }
+ public static FieldCodec<uint> ForFixed32(uint tag) => ForFixed32(tag, 0);
/// <summary>
/// Retrieves a codec suitable for an sfixed32 field with the given tag.
/// </summary>
/// <param name="tag">The tag.</param>
/// <returns>A codec for the given tag.</returns>
- public static FieldCodec<int> ForSFixed32(uint tag)
- {
- return FieldCodec.ForSFixed32(tag, 0);
- }
+ public static FieldCodec<int> ForSFixed32(uint tag) => ForSFixed32(tag, 0);
/// <summary>
/// Retrieves a codec suitable for a uint32 field with the given tag.
/// </summary>
/// <param name="tag">The tag.</param>
/// <returns>A codec for the given tag.</returns>
- public static FieldCodec<uint> ForUInt32(uint tag)
- {
- return FieldCodec.ForUInt32(tag, 0);
- }
+ public static FieldCodec<uint> ForUInt32(uint tag) => ForUInt32(tag, 0);
/// <summary>
/// Retrieves a codec suitable for an int64 field with the given tag.
/// </summary>
/// <param name="tag">The tag.</param>
/// <returns>A codec for the given tag.</returns>
- public static FieldCodec<long> ForInt64(uint tag)
- {
- return FieldCodec.ForInt64(tag, 0);
- }
+ public static FieldCodec<long> ForInt64(uint tag) => ForInt64(tag, 0);
/// <summary>
/// Retrieves a codec suitable for an sint64 field with the given tag.
/// </summary>
/// <param name="tag">The tag.</param>
/// <returns>A codec for the given tag.</returns>
- public static FieldCodec<long> ForSInt64(uint tag)
- {
- return FieldCodec.ForSInt64(tag, 0);
- }
+ public static FieldCodec<long> ForSInt64(uint tag) => ForSInt64(tag, 0);
/// <summary>
/// Retrieves a codec suitable for a fixed64 field with the given tag.
/// </summary>
/// <param name="tag">The tag.</param>
/// <returns>A codec for the given tag.</returns>
- public static FieldCodec<ulong> ForFixed64(uint tag)
- {
- return FieldCodec.ForFixed64(tag, 0);
- }
+ public static FieldCodec<ulong> ForFixed64(uint tag) => ForFixed64(tag, 0);
/// <summary>
/// Retrieves a codec suitable for an sfixed64 field with the given tag.
/// </summary>
/// <param name="tag">The tag.</param>
/// <returns>A codec for the given tag.</returns>
- public static FieldCodec<long> ForSFixed64(uint tag)
- {
- return FieldCodec.ForSFixed64(tag, 0);
- }
+ public static FieldCodec<long> ForSFixed64(uint tag) => ForSFixed64(tag, 0);
/// <summary>
/// Retrieves a codec suitable for a uint64 field with the given tag.
/// </summary>
/// <param name="tag">The tag.</param>
/// <returns>A codec for the given tag.</returns>
- public static FieldCodec<ulong> ForUInt64(uint tag)
- {
- return FieldCodec.ForUInt64(tag, 0);
- }
+ public static FieldCodec<ulong> ForUInt64(uint tag) => ForUInt64(tag, 0);
/// <summary>
/// Retrieves a codec suitable for a float field with the given tag.
/// </summary>
/// <param name="tag">The tag.</param>
/// <returns>A codec for the given tag.</returns>
- public static FieldCodec<float> ForFloat(uint tag)
- {
- return FieldCodec.ForFloat(tag, 0);
- }
+ public static FieldCodec<float> ForFloat(uint tag) => ForFloat(tag, 0);
/// <summary>
/// Retrieves a codec suitable for a double field with the given tag.
/// </summary>
/// <param name="tag">The tag.</param>
/// <returns>A codec for the given tag.</returns>
- public static FieldCodec<double> ForDouble(uint tag)
- {
- return FieldCodec.ForDouble(tag, 0);
- }
+ public static FieldCodec<double> ForDouble(uint tag) => ForDouble(tag, 0);
// Enums are tricky. We can probably use expression trees to build these delegates automatically,
// but it's easy to generate the code for it.
@@ -206,10 +160,8 @@
/// <param name="toInt32">A conversion function from <see cref="Int32"/> to the enum type.</param>
/// <param name="fromInt32">A conversion function from the enum type to <see cref="Int32"/>.</param>
/// <returns>A codec for the given tag.</returns>
- public static FieldCodec<T> ForEnum<T>(uint tag, Func<T, int> toInt32, Func<int, T> fromInt32)
- {
- return FieldCodec.ForEnum(tag, toInt32, fromInt32, default(T));
- }
+ public static FieldCodec<T> ForEnum<T>(uint tag, Func<T, int> toInt32, Func<int, T> fromInt32) =>
+ ForEnum(tag, toInt32, fromInt32, default);
/// <summary>
/// Retrieves a codec suitable for a string field with the given tag.
@@ -565,8 +517,7 @@
/// </summary>
internal static FieldCodec<T> GetCodec<T>()
{
- object value;
- if (!Codecs.TryGetValue(typeof(T), out value))
+ if (!Codecs.TryGetValue(typeof(T), out object value))
{
throw new InvalidOperationException("Invalid type argument requested for wrapper codec: " + typeof(T));
}
@@ -575,8 +526,7 @@
internal static ValueReader<T?> GetReader<T>() where T : struct
{
- object value;
- if (!Readers.TryGetValue(typeof(T), out value))
+ if (!Readers.TryGetValue(typeof(T), out object value))
{
throw new InvalidOperationException("Invalid type argument requested for wrapper reader: " + typeof(T));
}
diff --git a/csharp/src/Google.Protobuf/FieldMaskTree.cs b/csharp/src/Google.Protobuf/FieldMaskTree.cs
index 2297e7a..084374f 100644
--- a/csharp/src/Google.Protobuf/FieldMaskTree.cs
+++ b/csharp/src/Google.Protobuf/FieldMaskTree.cs
@@ -120,8 +120,7 @@
return this;
}
- Node childNode;
- if (!node.Children.TryGetValue(part, out childNode))
+ if (!node.Children.TryGetValue(part, out Node childNode))
{
createNewBranch = true;
childNode = new Node();
@@ -333,15 +332,24 @@
{
if (sourceField != null)
{
- var sourceByteString = ((IMessage)sourceField).ToByteString();
- var destinationValue = (IMessage)field.Accessor.GetValue(destination);
- if (destinationValue != null)
+ // Well-known wrapper types are represented as nullable primitive types, so we do not "merge" them.
+ // Instead, any non-null value just overwrites the previous value directly.
+ if (field.MessageType.IsWrapperType)
{
- destinationValue.MergeFrom(sourceByteString);
+ field.Accessor.SetValue(destination, sourceField);
}
else
{
- field.Accessor.SetValue(destination, field.MessageType.Parser.ParseFrom(sourceByteString));
+ var sourceByteString = ((IMessage)sourceField).ToByteString();
+ var destinationValue = (IMessage)field.Accessor.GetValue(destination);
+ if (destinationValue != null)
+ {
+ destinationValue.MergeFrom(sourceByteString);
+ }
+ else
+ {
+ field.Accessor.SetValue(destination, field.MessageType.Parser.ParseFrom(sourceByteString));
+ }
}
}
}
diff --git a/csharp/src/Google.Protobuf/Google.Protobuf.csproj b/csharp/src/Google.Protobuf/Google.Protobuf.csproj
index f10db5e..016218c 100644
--- a/csharp/src/Google.Protobuf/Google.Protobuf.csproj
+++ b/csharp/src/Google.Protobuf/Google.Protobuf.csproj
@@ -5,8 +5,7 @@
<Copyright>Copyright 2015, Google Inc.</Copyright>
<AssemblyTitle>Google Protocol Buffers</AssemblyTitle>
<VersionPrefix>3.21.7</VersionPrefix>
- <!-- C# 7.2 is required for Span/BufferWriter/ReadOnlySequence -->
- <LangVersion>7.2</LangVersion>
+ <LangVersion>10.0</LangVersion>
<Authors>Google Inc.</Authors>
<TargetFrameworks>netstandard1.1;netstandard2.0;net45;net50</TargetFrameworks>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
diff --git a/csharp/src/Google.Protobuf/InvalidProtocolBufferException.cs b/csharp/src/Google.Protobuf/InvalidProtocolBufferException.cs
index 6a3dbd6..333838b 100644
--- a/csharp/src/Google.Protobuf/InvalidProtocolBufferException.cs
+++ b/csharp/src/Google.Protobuf/InvalidProtocolBufferException.cs
@@ -136,5 +136,5 @@
{
return new InvalidProtocolBufferException("Message was missing required fields");
}
-}
+ }
}
\ No newline at end of file
diff --git a/csharp/src/Google.Protobuf/JsonFormatter.cs b/csharp/src/Google.Protobuf/JsonFormatter.cs
index 16f7c5a..9cecb6a 100644
--- a/csharp/src/Google.Protobuf/JsonFormatter.cs
+++ b/csharp/src/Google.Protobuf/JsonFormatter.cs
@@ -62,9 +62,13 @@
internal const string AnyTypeUrlField = "@type";
internal const string AnyDiagnosticValueField = "@value";
internal const string AnyWellKnownTypeValueField = "value";
- private const string TypeUrlPrefix = "type.googleapis.com";
private const string NameValueSeparator = ": ";
- private const string PropertySeparator = ", ";
+ private const string ValueSeparator = ", ";
+ private const string MultilineValueSeparator = ",";
+ private const char ObjectOpenBracket = '{';
+ private const char ObjectCloseBracket = '}';
+ private const char ListBracketOpen = '[';
+ private const char ListBracketClose = ']';
/// <summary>
/// Returns a formatter using the default settings.
@@ -141,11 +145,26 @@
/// Formats the specified message as JSON.
/// </summary>
/// <param name="message">The message to format.</param>
+ /// <remarks>This method delegates to <c>Format(IMessage, int)</c> with <c>indentationLevel = 0</c>.</remarks>
/// <returns>The formatted message.</returns>
- public string Format(IMessage message)
+ public string Format(IMessage message) => Format(message, indentationLevel: 0);
+
+ /// <summary>
+ /// Formats the specified message as JSON.
+ /// </summary>
+ /// <param name="message">The message to format.</param>
+ /// <param name="indentationLevel">Indentation level to start at.</param>
+ /// <remarks>To keep consistent indentation when embedding a message inside another JSON string, set <paramref name="indentationLevel"/>. E.g:
+ /// <code>
+ /// var response = $@"{{
+ /// ""data"": { Format(message, indentationLevel: 1) }
+ /// }}"</code>
+ /// </remarks>
+ /// <returns>The formatted message.</returns>
+ public string Format(IMessage message, int indentationLevel)
{
var writer = new StringWriter();
- Format(message, writer);
+ Format(message, writer, indentationLevel);
return writer.ToString();
}
@@ -154,19 +173,29 @@
/// </summary>
/// <param name="message">The message to format.</param>
/// <param name="writer">The TextWriter to write the formatted message to.</param>
+ /// <remarks>This method delegates to <c>Format(IMessage, TextWriter, int)</c> with <c>indentationLevel = 0</c>.</remarks>
/// <returns>The formatted message.</returns>
- public void Format(IMessage message, TextWriter writer)
+ public void Format(IMessage message, TextWriter writer) => Format(message, writer, indentationLevel: 0);
+
+ /// <summary>
+ /// Formats the specified message as JSON. When <see cref="Settings.Indentation"/> is not null, start indenting at the specified <paramref name="indentationLevel"/>.
+ /// </summary>
+ /// <param name="message">The message to format.</param>
+ /// <param name="writer">The TextWriter to write the formatted message to.</param>
+ /// <param name="indentationLevel">Indentation level to start at.</param>
+ /// <remarks>To keep consistent indentation when embedding a message inside another JSON string, set <paramref name="indentationLevel"/>.</remarks>
+ public void Format(IMessage message, TextWriter writer, int indentationLevel)
{
ProtoPreconditions.CheckNotNull(message, nameof(message));
ProtoPreconditions.CheckNotNull(writer, nameof(writer));
if (message.Descriptor.IsWellKnownType)
{
- WriteWellKnownTypeValue(writer, message.Descriptor, message);
+ WriteWellKnownTypeValue(writer, message.Descriptor, message, indentationLevel);
}
else
{
- WriteMessage(writer, message);
+ WriteMessage(writer, message, indentationLevel);
}
}
@@ -193,7 +222,7 @@
return diagnosticFormatter.Format(message);
}
- private void WriteMessage(TextWriter writer, IMessage message)
+ private void WriteMessage(TextWriter writer, IMessage message, int indentationLevel)
{
if (message == null)
{
@@ -202,19 +231,19 @@
}
if (DiagnosticOnly)
{
- ICustomDiagnosticMessage customDiagnosticMessage = message as ICustomDiagnosticMessage;
- if (customDiagnosticMessage != null)
+ if (message is ICustomDiagnosticMessage customDiagnosticMessage)
{
writer.Write(customDiagnosticMessage.ToDiagnosticString());
return;
}
}
- writer.Write("{ ");
- bool writtenFields = WriteMessageFields(writer, message, false);
- writer.Write(writtenFields ? " }" : "}");
+
+ WriteBracketOpen(writer, ObjectOpenBracket);
+ bool writtenFields = WriteMessageFields(writer, message, false, indentationLevel + 1);
+ WriteBracketClose(writer, ObjectCloseBracket, writtenFields, indentationLevel);
}
- private bool WriteMessageFields(TextWriter writer, IMessage message, bool assumeFirstFieldWritten)
+ private bool WriteMessageFields(TextWriter writer, IMessage message, bool assumeFirstFieldWritten, int indentationLevel)
{
var fields = message.Descriptor.Fields;
bool first = !assumeFirstFieldWritten;
@@ -228,10 +257,8 @@
continue;
}
- if (!first)
- {
- writer.Write(PropertySeparator);
- }
+ MaybeWriteValueSeparator(writer, first);
+ MaybeWriteValueWhitespace(writer, indentationLevel);
if (settings.PreserveProtoFieldNames)
{
@@ -242,13 +269,23 @@
WriteString(writer, accessor.Descriptor.JsonName);
}
writer.Write(NameValueSeparator);
- WriteValue(writer, value);
+ WriteValue(writer, value, indentationLevel);
first = false;
}
return !first;
}
+ private void MaybeWriteValueSeparator(TextWriter writer, bool first)
+ {
+ if (first)
+ {
+ return;
+ }
+
+ writer.Write(settings.Indentation == null ? ValueSeparator : MultilineValueSeparator);
+ }
+
/// <summary>
/// Determines whether or not a field value should be serialized according to the field,
/// its value in the message, and the settings of this formatter.
@@ -320,39 +357,20 @@
IList list = (IList) value;
return list.Count == 0;
}
- switch (descriptor.FieldType)
+ return descriptor.FieldType switch
{
- case FieldType.Bool:
- return (bool) value == false;
- case FieldType.Bytes:
- return (ByteString) value == ByteString.Empty;
- case FieldType.String:
- return (string) value == "";
- case FieldType.Double:
- return (double) value == 0.0;
- case FieldType.SInt32:
- case FieldType.Int32:
- case FieldType.SFixed32:
- case FieldType.Enum:
- return (int) value == 0;
- case FieldType.Fixed32:
- case FieldType.UInt32:
- return (uint) value == 0;
- case FieldType.Fixed64:
- case FieldType.UInt64:
- return (ulong) value == 0;
- case FieldType.SFixed64:
- case FieldType.Int64:
- case FieldType.SInt64:
- return (long) value == 0;
- case FieldType.Float:
- return (float) value == 0f;
- case FieldType.Message:
- case FieldType.Group: // Never expect to get this, but...
- return value == null;
- default:
- throw new ArgumentException("Invalid field type");
- }
+ FieldType.Bool => (bool) value == false,
+ FieldType.Bytes => (ByteString) value == ByteString.Empty,
+ FieldType.String => (string) value == "",
+ FieldType.Double => (double) value == 0.0,
+ FieldType.SInt32 or FieldType.Int32 or FieldType.SFixed32 or FieldType.Enum => (int) value == 0,
+ FieldType.Fixed32 or FieldType.UInt32 => (uint) value == 0,
+ FieldType.Fixed64 or FieldType.UInt64 => (ulong) value == 0,
+ FieldType.SFixed64 or FieldType.Int64 or FieldType.SInt64 => (long) value == 0,
+ FieldType.Float => (float) value == 0f,
+ FieldType.Message or FieldType.Group => value == null,
+ _ => throw new ArgumentException("Invalid field type"),
+ };
}
/// <summary>
@@ -363,34 +381,46 @@
/// </summary>
/// <param name="writer">The writer to write the value to. Must not be null.</param>
/// <param name="value">The value to write. May be null.</param>
- public void WriteValue(TextWriter writer, object value)
+ /// <remarks>Delegates to <c>WriteValue(TextWriter, object, int)</c> with <c>indentationLevel = 0</c>.</remarks>
+ public void WriteValue(TextWriter writer, object value) => WriteValue(writer, value, 0);
+
+ /// <summary>
+ /// Writes a single value to the given writer as JSON. Only types understood by
+ /// Protocol Buffers can be written in this way. This method is only exposed for
+ /// advanced use cases; most users should be using <see cref="Format(IMessage)"/>
+ /// or <see cref="Format(IMessage, TextWriter)"/>.
+ /// </summary>
+ /// <param name="writer">The writer to write the value to. Must not be null.</param>
+ /// <param name="value">The value to write. May be null.</param>
+ /// <param name="indentationLevel">The current indentationLevel. Not used when <see cref="Settings.Indentation"/> is null.</param>
+ public void WriteValue(TextWriter writer, object value, int indentationLevel)
{
if (value == null || value is NullValue)
{
WriteNull(writer);
}
- else if (value is bool)
+ else if (value is bool b)
{
- writer.Write((bool)value ? "true" : "false");
+ writer.Write(b ? "true" : "false");
}
- else if (value is ByteString)
+ else if (value is ByteString byteString)
{
// Nothing in Base64 needs escaping
writer.Write('"');
- writer.Write(((ByteString)value).ToBase64());
+ writer.Write(byteString.ToBase64());
writer.Write('"');
}
- else if (value is string)
+ else if (value is string str)
{
- WriteString(writer, (string)value);
+ WriteString(writer, str);
}
- else if (value is IDictionary)
+ else if (value is IDictionary dictionary)
{
- WriteDictionary(writer, (IDictionary)value);
+ WriteDictionary(writer, dictionary, indentationLevel);
}
- else if (value is IList)
+ else if (value is IList list)
{
- WriteList(writer, (IList)value);
+ WriteList(writer, list, indentationLevel);
}
else if (value is int || value is uint)
{
@@ -437,9 +467,9 @@
writer.Write(text);
}
}
- else if (value is IMessage)
+ else if (value is IMessage message)
{
- Format((IMessage)value, writer);
+ Format(message, writer, indentationLevel);
}
else
{
@@ -453,7 +483,7 @@
/// values are using the embedded well-known types, in order to allow for dynamic messages
/// in the future.
/// </summary>
- private void WriteWellKnownTypeValue(TextWriter writer, MessageDescriptor descriptor, object value)
+ private void WriteWellKnownTypeValue(TextWriter writer, MessageDescriptor descriptor, object value, int indentationLevel)
{
// Currently, we can never actually get here, because null values are always handled by the caller. But if we *could*,
// this would do the right thing.
@@ -469,9 +499,8 @@
// WriteValue will do the right thing.)
if (descriptor.IsWrapperType)
{
- if (value is IMessage)
+ if (value is IMessage message)
{
- var message = (IMessage) value;
value = message.Descriptor.Fields[WrappersReflection.WrapperValueFieldNumber].Accessor.GetValue(message);
}
WriteValue(writer, value);
@@ -494,26 +523,26 @@
}
if (descriptor.FullName == Struct.Descriptor.FullName)
{
- WriteStruct(writer, (IMessage)value);
+ WriteStruct(writer, (IMessage)value, indentationLevel);
return;
}
if (descriptor.FullName == ListValue.Descriptor.FullName)
{
var fieldAccessor = descriptor.Fields[ListValue.ValuesFieldNumber].Accessor;
- WriteList(writer, (IList)fieldAccessor.GetValue((IMessage)value));
+ WriteList(writer, (IList)fieldAccessor.GetValue((IMessage)value), indentationLevel);
return;
}
if (descriptor.FullName == Value.Descriptor.FullName)
{
- WriteStructFieldValue(writer, (IMessage)value);
+ WriteStructFieldValue(writer, (IMessage)value, indentationLevel);
return;
}
if (descriptor.FullName == Any.Descriptor.FullName)
{
- WriteAny(writer, (IMessage)value);
+ WriteAny(writer, (IMessage)value, indentationLevel);
return;
}
- WriteMessage(writer, (IMessage)value);
+ WriteMessage(writer, (IMessage)value, indentationLevel);
}
private void WriteTimestamp(TextWriter writer, IMessage value)
@@ -541,7 +570,7 @@
writer.Write(FieldMask.ToJson(paths, DiagnosticOnly));
}
- private void WriteAny(TextWriter writer, IMessage value)
+ private void WriteAny(TextWriter writer, IMessage value, int indentationLevel)
{
if (DiagnosticOnly)
{
@@ -558,23 +587,23 @@
throw new InvalidOperationException($"Type registry has no descriptor for type name '{typeName}'");
}
IMessage message = descriptor.Parser.ParseFrom(data);
- writer.Write("{ ");
+ WriteBracketOpen(writer, ObjectOpenBracket);
WriteString(writer, AnyTypeUrlField);
writer.Write(NameValueSeparator);
WriteString(writer, typeUrl);
if (descriptor.IsWellKnownType)
{
- writer.Write(PropertySeparator);
+ writer.Write(ValueSeparator);
WriteString(writer, AnyWellKnownTypeValueField);
writer.Write(NameValueSeparator);
- WriteWellKnownTypeValue(writer, descriptor, message);
+ WriteWellKnownTypeValue(writer, descriptor, message, indentationLevel);
}
else
{
- WriteMessageFields(writer, message, true);
+ WriteMessageFields(writer, message, true, indentationLevel);
}
- writer.Write(" }");
+ WriteBracketClose(writer, ObjectCloseBracket, true, indentationLevel);
}
private void WriteDiagnosticOnlyAny(TextWriter writer, IMessage value)
@@ -585,7 +614,7 @@
WriteString(writer, AnyTypeUrlField);
writer.Write(NameValueSeparator);
WriteString(writer, typeUrl);
- writer.Write(PropertySeparator);
+ writer.Write(ValueSeparator);
WriteString(writer, AnyDiagnosticValueField);
writer.Write(NameValueSeparator);
writer.Write('"');
@@ -594,9 +623,9 @@
writer.Write(" }");
}
- private void WriteStruct(TextWriter writer, IMessage message)
+ private void WriteStruct(TextWriter writer, IMessage message, int indentationLevel)
{
- writer.Write("{ ");
+ WriteBracketOpen(writer, ObjectOpenBracket);
IDictionary fields = (IDictionary) message.Descriptor.Fields[Struct.FieldsFieldNumber].Accessor.GetValue(message);
bool first = true;
foreach (DictionaryEntry entry in fields)
@@ -608,19 +637,17 @@
throw new InvalidOperationException("Struct fields cannot have an empty key or a null value.");
}
- if (!first)
- {
- writer.Write(PropertySeparator);
- }
+ MaybeWriteValueSeparator(writer, first);
+ MaybeWriteValueWhitespace(writer, indentationLevel + 1);
WriteString(writer, key);
writer.Write(NameValueSeparator);
- WriteStructFieldValue(writer, value);
+ WriteStructFieldValue(writer, value, indentationLevel + 1);
first = false;
}
- writer.Write(first ? "}" : " }");
+ WriteBracketClose(writer, ObjectCloseBracket, !first, indentationLevel);
}
- private void WriteStructFieldValue(TextWriter writer, IMessage message)
+ private void WriteStructFieldValue(TextWriter writer, IMessage message, int indentationLevel)
{
var specifiedField = message.Descriptor.Oneofs[0].Accessor.GetCaseFieldDescriptor(message);
if (specifiedField == null)
@@ -641,7 +668,7 @@
case Value.ListValueFieldNumber:
// Structs and ListValues are nested messages, and already well-known types.
var nestedMessage = (IMessage) specifiedField.Accessor.GetValue(message);
- WriteWellKnownTypeValue(writer, nestedMessage.Descriptor, nestedMessage);
+ WriteWellKnownTypeValue(writer, nestedMessage.Descriptor, nestedMessage, indentationLevel);
return;
case Value.NullValueFieldNumber:
WriteNull(writer);
@@ -651,43 +678,40 @@
}
}
- internal void WriteList(TextWriter writer, IList list)
+ internal void WriteList(TextWriter writer, IList list, int indentationLevel = 0)
{
- writer.Write("[ ");
+ WriteBracketOpen(writer, ListBracketOpen);
+
bool first = true;
foreach (var value in list)
{
- if (!first)
- {
- writer.Write(PropertySeparator);
- }
- WriteValue(writer, value);
+ MaybeWriteValueSeparator(writer, first);
+ MaybeWriteValueWhitespace(writer, indentationLevel + 1);
+ WriteValue(writer, value, indentationLevel + 1);
first = false;
}
- writer.Write(first ? "]" : " ]");
+
+ WriteBracketClose(writer, ListBracketClose, !first, indentationLevel);
}
- internal void WriteDictionary(TextWriter writer, IDictionary dictionary)
+ internal void WriteDictionary(TextWriter writer, IDictionary dictionary, int indentationLevel = 0)
{
- writer.Write("{ ");
+ WriteBracketOpen(writer, ObjectOpenBracket);
+
bool first = true;
// This will box each pair. Could use IDictionaryEnumerator, but that's ugly in terms of disposal.
foreach (DictionaryEntry pair in dictionary)
{
- if (!first)
- {
- writer.Write(PropertySeparator);
- }
string keyText;
- if (pair.Key is string)
+ if (pair.Key is string s)
{
- keyText = (string) pair.Key;
+ keyText = s;
}
- else if (pair.Key is bool)
+ else if (pair.Key is bool b)
{
- keyText = (bool) pair.Key ? "true" : "false";
+ keyText = b ? "true" : "false";
}
- else if (pair.Key is int || pair.Key is uint | pair.Key is long || pair.Key is ulong)
+ else if (pair.Key is int || pair.Key is uint || pair.Key is long || pair.Key is ulong)
{
keyText = ((IFormattable) pair.Key).ToString("d", CultureInfo.InvariantCulture);
}
@@ -699,12 +723,16 @@
}
throw new ArgumentException("Unhandled dictionary key type: " + pair.Key.GetType());
}
+
+ MaybeWriteValueSeparator(writer, first);
+ MaybeWriteValueWhitespace(writer, indentationLevel + 1);
WriteString(writer, keyText);
writer.Write(NameValueSeparator);
WriteValue(writer, pair.Value);
first = false;
}
- writer.Write(first ? "}" : " }");
+
+ WriteBracketClose(writer, ObjectCloseBracket, !first, indentationLevel);
}
/// <summary>
@@ -788,6 +816,49 @@
writer.Write(Hex[(c >> 0) & 0xf]);
}
+ private void WriteBracketOpen(TextWriter writer, char openChar)
+ {
+ writer.Write(openChar);
+ if (settings.Indentation == null)
+ {
+ writer.Write(' ');
+ }
+ }
+
+ private void WriteBracketClose(TextWriter writer, char closeChar, bool hasFields, int indentationLevel)
+ {
+ if (hasFields)
+ {
+ if (settings.Indentation != null)
+ {
+ writer.WriteLine();
+ WriteIndentation(writer, indentationLevel);
+ }
+ else
+ {
+ writer.Write(" ");
+ }
+ }
+
+ writer.Write(closeChar);
+ }
+
+ private void MaybeWriteValueWhitespace(TextWriter writer, int indentationLevel)
+ {
+ if (settings.Indentation != null) {
+ writer.WriteLine();
+ WriteIndentation(writer, indentationLevel);
+ }
+ }
+
+ private void WriteIndentation(TextWriter writer, int indentationLevel)
+ {
+ for (int i = 0; i < indentationLevel; i++)
+ {
+ writer.Write(settings.Indentation);
+ }
+ }
+
/// <summary>
/// Settings controlling JSON formatting.
/// </summary>
@@ -828,6 +899,10 @@
/// </summary>
public bool PreserveProtoFieldNames { get; }
+ /// <summary>
+ /// Indentation string, used for formatting. Setting null disables indentation.
+ /// </summary>
+ public string Indentation { get; }
/// <summary>
/// Creates a new <see cref="Settings"/> object with the specified formatting of default values
@@ -855,40 +930,54 @@
/// <param name="typeRegistry">The <see cref="TypeRegistry"/> to use when formatting <see cref="Any"/> messages. TypeRegistry.Empty will be used if it is null.</param>
/// <param name="formatEnumsAsIntegers"><c>true</c> to format the enums as integers; <c>false</c> to format enums as enum names.</param>
/// <param name="preserveProtoFieldNames"><c>true</c> to preserve proto field names; <c>false</c> to convert them to lowerCamelCase.</param>
+ /// <param name="indentation">The indentation string to use for multi-line formatting. <c>null</c> to disable multi-line format.</param>
private Settings(bool formatDefaultValues,
TypeRegistry typeRegistry,
bool formatEnumsAsIntegers,
- bool preserveProtoFieldNames)
+ bool preserveProtoFieldNames,
+ string indentation = null)
{
FormatDefaultValues = formatDefaultValues;
TypeRegistry = typeRegistry ?? TypeRegistry.Empty;
FormatEnumsAsIntegers = formatEnumsAsIntegers;
PreserveProtoFieldNames = preserveProtoFieldNames;
+ Indentation = indentation;
}
/// <summary>
/// Creates a new <see cref="Settings"/> object with the specified formatting of default values and the current settings.
/// </summary>
/// <param name="formatDefaultValues"><c>true</c> if default values (0, empty strings etc) should be formatted; <c>false</c> otherwise.</param>
- public Settings WithFormatDefaultValues(bool formatDefaultValues) => new Settings(formatDefaultValues, TypeRegistry, FormatEnumsAsIntegers, PreserveProtoFieldNames);
+ public Settings WithFormatDefaultValues(bool formatDefaultValues) => new Settings(formatDefaultValues, TypeRegistry, FormatEnumsAsIntegers, PreserveProtoFieldNames, Indentation);
/// <summary>
/// Creates a new <see cref="Settings"/> object with the specified type registry and the current settings.
/// </summary>
/// <param name="typeRegistry">The <see cref="TypeRegistry"/> to use when formatting <see cref="Any"/> messages.</param>
- public Settings WithTypeRegistry(TypeRegistry typeRegistry) => new Settings(FormatDefaultValues, typeRegistry, FormatEnumsAsIntegers, PreserveProtoFieldNames);
+ public Settings WithTypeRegistry(TypeRegistry typeRegistry) => new Settings(FormatDefaultValues, typeRegistry, FormatEnumsAsIntegers, PreserveProtoFieldNames, Indentation);
/// <summary>
/// Creates a new <see cref="Settings"/> object with the specified enums formatting option and the current settings.
/// </summary>
/// <param name="formatEnumsAsIntegers"><c>true</c> to format the enums as integers; <c>false</c> to format enums as enum names.</param>
- public Settings WithFormatEnumsAsIntegers(bool formatEnumsAsIntegers) => new Settings(FormatDefaultValues, TypeRegistry, formatEnumsAsIntegers, PreserveProtoFieldNames);
+ public Settings WithFormatEnumsAsIntegers(bool formatEnumsAsIntegers) => new Settings(FormatDefaultValues, TypeRegistry, formatEnumsAsIntegers, PreserveProtoFieldNames, Indentation);
/// <summary>
/// Creates a new <see cref="Settings"/> object with the specified field name formatting option and the current settings.
/// </summary>
/// <param name="preserveProtoFieldNames"><c>true</c> to preserve proto field names; <c>false</c> to convert them to lowerCamelCase.</param>
- public Settings WithPreserveProtoFieldNames(bool preserveProtoFieldNames) => new Settings(FormatDefaultValues, TypeRegistry, FormatEnumsAsIntegers, preserveProtoFieldNames);
+ public Settings WithPreserveProtoFieldNames(bool preserveProtoFieldNames) => new Settings(FormatDefaultValues, TypeRegistry, FormatEnumsAsIntegers, preserveProtoFieldNames, Indentation);
+
+ /// <summary>
+ /// Creates a new <see cref="Settings"/> object with the specified indentation and the current settings.
+ /// </summary>
+ /// <param name="indentation">The string to output for each level of indentation (nesting). The default is two spaces per level. Use null to disable indentation entirely.</param>
+ /// <remarks>A non-null value for <see cref="Indentation"/> will insert additional line-breaks to the JSON output.
+ /// Each line will contain either a single value, or braces. The default line-break is determined by <see cref="Environment.NewLine"/>,
+ /// which is <c>"\n"</c> on Unix platforms, and <c>"\r\n"</c> on Windows. If <see cref="JsonFormatter"/> seems to produce empty lines,
+ /// you need to pass a <see cref="TextWriter"/> that uses a <c>"\n"</c> newline. See <see cref="JsonFormatter.Format(Google.Protobuf.IMessage, TextWriter)"/>.
+ /// </remarks>
+ public Settings WithIndentation(string indentation = " ") => new Settings(FormatDefaultValues, TypeRegistry, FormatEnumsAsIntegers, PreserveProtoFieldNames, indentation);
}
// Effectively a cache of mapping from enum values to the original name as specified in the proto file,
@@ -916,9 +1005,8 @@
}
}
- string originalName;
// If this returns false, originalName will be null, which is what we want.
- nameMapping.TryGetValue(value, out originalName);
+ nameMapping.TryGetValue(value, out string originalName);
return originalName;
}
diff --git a/csharp/src/Google.Protobuf/JsonParser.cs b/csharp/src/Google.Protobuf/JsonParser.cs
index cb5f5a8..6cb98d6 100644
--- a/csharp/src/Google.Protobuf/JsonParser.cs
+++ b/csharp/src/Google.Protobuf/JsonParser.cs
@@ -70,8 +70,7 @@
// TODO: Consider introducing a class containing parse state of the parser, tokenizer and depth. That would simplify these handlers
// and the signatures of various methods.
- private static readonly Dictionary<string, Action<JsonParser, IMessage, JsonTokenizer>>
- WellKnownTypeHandlers = new Dictionary<string, Action<JsonParser, IMessage, JsonTokenizer>>
+ private static readonly Dictionary<string, Action<JsonParser, IMessage, JsonTokenizer>> WellKnownTypeHandlers = new()
{
{ Timestamp.Descriptor.FullName, (parser, message, tokenizer) => MergeTimestamp(message, tokenizer.Next()) },
{ Duration.Descriptor.FullName, (parser, message, tokenizer) => MergeDuration(message, tokenizer.Next()) },
@@ -156,8 +155,7 @@
}
if (message.Descriptor.IsWellKnownType)
{
- Action<JsonParser, IMessage, JsonTokenizer> handler;
- if (WellKnownTypeHandlers.TryGetValue(message.Descriptor.FullName, out handler))
+ if (WellKnownTypeHandlers.TryGetValue(message.Descriptor.FullName, out Action<JsonParser, IMessage, JsonTokenizer> handler))
{
handler(this, message, tokenizer);
return;
@@ -187,8 +185,7 @@
throw new InvalidOperationException("Unexpected token type " + token.Type);
}
string name = token.StringValue;
- FieldDescriptor field;
- if (jsonFieldMap.TryGetValue(name, out field))
+ if (jsonFieldMap.TryGetValue(name, out FieldDescriptor field))
{
if (field.ContainingOneof != null)
{
@@ -303,11 +300,7 @@
}
object key = ParseMapKey(keyField, token.StringValue);
object value = ParseSingleValue(valueField, tokenizer);
- if (value == null)
- {
- throw new InvalidProtocolBufferException("Map values must not be null");
- }
- dictionary[key] = value;
+ dictionary[key] = value ?? throw new InvalidProtocolBufferException("Map values must not be null");
}
}
@@ -649,19 +642,15 @@
{
return float.NaN;
}
- if (value > float.MaxValue || value < float.MinValue)
+ float converted = (float) value;
+ // If the value is out of range of float, the cast representation will be infinite.
+ // If the original value was infinite as well, that's fine - we'll return the 32-bit
+ // version (with the correct sign).
+ if (float.IsInfinity(converted) && !double.IsInfinity(value))
{
- if (double.IsPositiveInfinity(value))
- {
- return float.PositiveInfinity;
- }
- if (double.IsNegativeInfinity(value))
- {
- return float.NegativeInfinity;
- }
throw new InvalidProtocolBufferException($"Value out of range: {value}");
}
- return (float) value;
+ return converted;
case FieldType.Enum:
CheckInteger(value);
// Just return it as an int, and let the CLR convert it.
@@ -853,7 +842,7 @@
if (secondsToAdd < 0 && nanosToAdd > 0)
{
secondsToAdd++;
- nanosToAdd = nanosToAdd - Duration.NanosecondsPerSecond;
+ nanosToAdd -= Duration.NanosecondsPerSecond;
}
if (secondsToAdd != 0 || nanosToAdd != 0)
{
@@ -1049,23 +1038,20 @@
/// when unknown fields are encountered.
/// </summary>
/// <param name="ignoreUnknownFields"><c>true</c> if unknown fields should be ignored when parsing; <c>false</c> to throw an exception.</param>
- public Settings WithIgnoreUnknownFields(bool ignoreUnknownFields) =>
- new Settings(RecursionLimit, TypeRegistry, ignoreUnknownFields);
+ public Settings WithIgnoreUnknownFields(bool ignoreUnknownFields) => new(RecursionLimit, TypeRegistry, ignoreUnknownFields);
/// <summary>
/// Creates a new <see cref="Settings"/> object based on this one, but with the specified recursion limit.
/// </summary>
/// <param name="recursionLimit">The new recursion limit.</param>
- public Settings WithRecursionLimit(int recursionLimit) =>
- new Settings(recursionLimit, TypeRegistry, IgnoreUnknownFields);
+ public Settings WithRecursionLimit(int recursionLimit) => new(recursionLimit, TypeRegistry, IgnoreUnknownFields);
/// <summary>
/// Creates a new <see cref="Settings"/> object based on this one, but with the specified type registry.
/// </summary>
/// <param name="typeRegistry">The new type registry. Must not be null.</param>
public Settings WithTypeRegistry(TypeRegistry typeRegistry) =>
- new Settings(
- RecursionLimit,
+ new(RecursionLimit,
ProtoPreconditions.CheckNotNull(typeRegistry, nameof(typeRegistry)),
IgnoreUnknownFields);
}
diff --git a/csharp/src/Google.Protobuf/JsonToken.cs b/csharp/src/Google.Protobuf/JsonToken.cs
index 6c0138c..c23a25c 100644
--- a/csharp/src/Google.Protobuf/JsonToken.cs
+++ b/csharp/src/Google.Protobuf/JsonToken.cs
@@ -36,24 +36,14 @@
{
internal sealed class JsonToken : IEquatable<JsonToken>
{
- // Tokens with no value can be reused.
- private static readonly JsonToken _true = new JsonToken(TokenType.True);
- private static readonly JsonToken _false = new JsonToken(TokenType.False);
- private static readonly JsonToken _null = new JsonToken(TokenType.Null);
- private static readonly JsonToken startObject = new JsonToken(TokenType.StartObject);
- private static readonly JsonToken endObject = new JsonToken(TokenType.EndObject);
- private static readonly JsonToken startArray = new JsonToken(TokenType.StartArray);
- private static readonly JsonToken endArray = new JsonToken(TokenType.EndArray);
- private static readonly JsonToken endDocument = new JsonToken(TokenType.EndDocument);
-
- internal static JsonToken Null { get { return _null; } }
- internal static JsonToken False { get { return _false; } }
- internal static JsonToken True { get { return _true; } }
- internal static JsonToken StartObject{ get { return startObject; } }
- internal static JsonToken EndObject { get { return endObject; } }
- internal static JsonToken StartArray { get { return startArray; } }
- internal static JsonToken EndArray { get { return endArray; } }
- internal static JsonToken EndDocument { get { return endDocument; } }
+ internal static JsonToken Null { get; } = new JsonToken(TokenType.Null);
+ internal static JsonToken False { get; } = new JsonToken(TokenType.False);
+ internal static JsonToken True { get; } = new JsonToken(TokenType.True);
+ internal static JsonToken StartObject { get; } = new JsonToken(TokenType.StartObject);
+ internal static JsonToken EndObject { get; } = new JsonToken(TokenType.EndObject);
+ internal static JsonToken StartArray { get; } = new JsonToken(TokenType.StartArray);
+ internal static JsonToken EndArray { get; } = new JsonToken(TokenType.EndArray);
+ internal static JsonToken EndDocument { get; } = new JsonToken(TokenType.EndDocument);
internal static JsonToken Name(string name)
{
@@ -94,9 +84,9 @@
private readonly string stringValue;
private readonly double numberValue;
- internal TokenType Type { get { return type; } }
- internal string StringValue { get { return stringValue; } }
- internal double NumberValue { get { return numberValue; } }
+ internal TokenType Type => type;
+ internal string StringValue => stringValue;
+ internal double NumberValue => numberValue;
private JsonToken(TokenType type, string stringValue = null, double numberValue = 0)
{
@@ -105,10 +95,7 @@
this.numberValue = numberValue;
}
- public override bool Equals(object obj)
- {
- return Equals(obj as JsonToken);
- }
+ public override bool Equals(object obj) => Equals(obj as JsonToken);
public override int GetHashCode()
{
@@ -124,38 +111,26 @@
public override string ToString()
{
- switch (type)
+ return type switch
{
- case TokenType.Null:
- return "null";
- case TokenType.True:
- return "true";
- case TokenType.False:
- return "false";
- case TokenType.Name:
- return "name (" + stringValue + ")";
- case TokenType.StringValue:
- return "value (" + stringValue + ")";
- case TokenType.Number:
- return "number (" + numberValue + ")";
- case TokenType.StartObject:
- return "start-object";
- case TokenType.EndObject:
- return "end-object";
- case TokenType.StartArray:
- return "start-array";
- case TokenType.EndArray:
- return "end-array";
- case TokenType.EndDocument:
- return "end-document";
- default:
- throw new InvalidOperationException("Token is of unknown type " + type);
- }
+ TokenType.Null => "null",
+ TokenType.True => "true",
+ TokenType.False => "false",
+ TokenType.Name => $"name ({stringValue})",
+ TokenType.StringValue => $"value ({stringValue})",
+ TokenType.Number => $"number ({numberValue})",
+ TokenType.StartObject => "start-object",
+ TokenType.EndObject => "end-object",
+ TokenType.StartArray => "start-array",
+ TokenType.EndArray => "end-array",
+ TokenType.EndDocument => "end-document",
+ _ => throw new InvalidOperationException($"Token is of unknown type {type}"),
+ };
}
public bool Equals(JsonToken other)
{
- if (ReferenceEquals(other, null))
+ if (other is null)
{
return false;
}
diff --git a/csharp/src/Google.Protobuf/JsonTokenizer.cs b/csharp/src/Google.Protobuf/JsonTokenizer.cs
index 13a12c0..ed54734 100644
--- a/csharp/src/Google.Protobuf/JsonTokenizer.cs
+++ b/csharp/src/Google.Protobuf/JsonTokenizer.cs
@@ -29,6 +29,7 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#endregion
+
using System;
using System.Collections.Generic;
using System.Globalization;
@@ -362,29 +363,19 @@
private char ReadEscapedCharacter()
{
char c = reader.ReadOrFail("Unexpected end of text while reading character escape sequence");
- switch (c)
+ return c switch
{
- case 'n':
- return '\n';
- case '\\':
- return '\\';
- case 'b':
- return '\b';
- case 'f':
- return '\f';
- case 'r':
- return '\r';
- case 't':
- return '\t';
- case '"':
- return '"';
- case '/':
- return '/';
- case 'u':
- return ReadUnicodeEscape();
- default:
- throw reader.CreateException(string.Format(CultureInfo.InvariantCulture, "Invalid character in character escape sequence: U+{0:x4}", (int) c));
- }
+ 'n' => '\n',
+ '\\' => '\\',
+ 'b' => '\b',
+ 'f' => '\f',
+ 'r' => '\r',
+ 't' => '\t',
+ '"' => '"',
+ '/' => '/',
+ 'u' => ReadUnicodeEscape(),
+ _ => throw reader.CreateException(string.Format(CultureInfo.InvariantCulture, "Invalid character in character escape sequence: U+{0:x4}", (int)c)),
+ };
}
/// <summary>
@@ -498,8 +489,7 @@
throw reader.CreateException("Invalid numeric literal");
}
builder.Append(first);
- int digitCount;
- char? next = ConsumeDigits(builder, out digitCount);
+ char? next = ConsumeDigits(builder, out int digitCount);
if (first == '0' && digitCount != 0)
{
throw reader.CreateException("Invalid numeric literal: leading 0 for non-zero value.");
@@ -510,8 +500,7 @@
private char? ReadFrac(StringBuilder builder)
{
builder.Append('.'); // Already consumed this
- int digitCount;
- char? next = ConsumeDigits(builder, out digitCount);
+ char? next = ConsumeDigits(builder, out int digitCount);
if (digitCount == 0)
{
throw reader.CreateException("Invalid numeric literal: fraction with no trailing digits");
@@ -535,8 +524,7 @@
{
reader.PushBack(next.Value);
}
- int digitCount;
- next = ConsumeDigits(builder, out digitCount);
+ next = ConsumeDigits(builder, out int digitCount);
if (digitCount == 0)
{
throw reader.CreateException("Invalid numeric literal: exponent without value");
@@ -591,20 +579,13 @@
{
containerStack.Pop();
var parent = containerStack.Peek();
- switch (parent)
+ state = parent switch
{
- case ContainerType.Object:
- state = State.ObjectAfterProperty;
- break;
- case ContainerType.Array:
- state = State.ArrayAfterValue;
- break;
- case ContainerType.Document:
- state = State.ExpectedEndOfDocument;
- break;
- default:
- throw new InvalidOperationException("Unexpected container type: " + parent);
- }
+ ContainerType.Object => State.ObjectAfterProperty,
+ ContainerType.Array => State.ArrayAfterValue,
+ ContainerType.Document => State.ExpectedEndOfDocument,
+ _ => throw new InvalidOperationException("Unexpected container type: " + parent),
+ };
}
private enum ContainerType
diff --git a/csharp/src/Google.Protobuf/LimitedInputStream.cs b/csharp/src/Google.Protobuf/LimitedInputStream.cs
index 50ead9c..46d5295 100644
--- a/csharp/src/Google.Protobuf/LimitedInputStream.cs
+++ b/csharp/src/Google.Protobuf/LimitedInputStream.cs
@@ -51,34 +51,20 @@
bytesLeft = size;
}
- public override bool CanRead
- {
- get { return true; }
- }
-
- public override bool CanSeek
- {
- get { return false; }
- }
-
- public override bool CanWrite
- {
- get { return false; }
- }
+ public override bool CanRead => true;
+ public override bool CanSeek => false;
+ public override bool CanWrite => false;
public override void Flush()
{
}
- public override long Length
- {
- get { throw new NotSupportedException(); }
- }
+ public override long Length => throw new NotSupportedException();
public override long Position
{
- get { throw new NotSupportedException(); }
- set { throw new NotSupportedException(); }
+ get => throw new NotSupportedException();
+ set => throw new NotSupportedException();
}
public override int Read(byte[] buffer, int offset, int count)
@@ -92,19 +78,10 @@
return 0;
}
- public override long Seek(long offset, SeekOrigin origin)
- {
- throw new NotSupportedException();
- }
+ public override long Seek(long offset, SeekOrigin origin) => throw new NotSupportedException();
- public override void SetLength(long value)
- {
- throw new NotSupportedException();
- }
+ public override void SetLength(long value) => throw new NotSupportedException();
- public override void Write(byte[] buffer, int offset, int count)
- {
- throw new NotSupportedException();
- }
+ public override void Write(byte[] buffer, int offset, int count) => throw new NotSupportedException();
}
}
diff --git a/csharp/src/Google.Protobuf/MessageExtensions.cs b/csharp/src/Google.Protobuf/MessageExtensions.cs
index c4b3f82..22d3a2f 100644
--- a/csharp/src/Google.Protobuf/MessageExtensions.cs
+++ b/csharp/src/Google.Protobuf/MessageExtensions.cs
@@ -107,7 +107,7 @@
/// <returns>The message data as a byte array.</returns>
public static byte[] ToByteArray(this IMessage message)
{
- ProtoPreconditions.CheckNotNull(message, "message");
+ ProtoPreconditions.CheckNotNull(message, nameof(message));
byte[] result = new byte[message.CalculateSize()];
CodedOutputStream output = new CodedOutputStream(result);
message.WriteTo(output);
@@ -122,8 +122,8 @@
/// <param name="output">The stream to write to.</param>
public static void WriteTo(this IMessage message, Stream output)
{
- ProtoPreconditions.CheckNotNull(message, "message");
- ProtoPreconditions.CheckNotNull(output, "output");
+ ProtoPreconditions.CheckNotNull(message, nameof(message));
+ ProtoPreconditions.CheckNotNull(output, nameof(output));
CodedOutputStream codedOutput = new CodedOutputStream(output);
message.WriteTo(codedOutput);
codedOutput.Flush();
@@ -136,8 +136,8 @@
/// <param name="output">The output stream to write to.</param>
public static void WriteDelimitedTo(this IMessage message, Stream output)
{
- ProtoPreconditions.CheckNotNull(message, "message");
- ProtoPreconditions.CheckNotNull(output, "output");
+ ProtoPreconditions.CheckNotNull(message, nameof(message));
+ ProtoPreconditions.CheckNotNull(output, nameof(output));
CodedOutputStream codedOutput = new CodedOutputStream(output);
codedOutput.WriteLength(message.CalculateSize());
message.WriteTo(codedOutput);
@@ -151,7 +151,7 @@
/// <returns>The message data as a byte string.</returns>
public static ByteString ToByteString(this IMessage message)
{
- ProtoPreconditions.CheckNotNull(message, "message");
+ ProtoPreconditions.CheckNotNull(message, nameof(message));
return ByteString.AttachBytes(message.ToByteArray());
}
@@ -251,30 +251,34 @@
// Implementations allowing unknown fields to be discarded.
internal static void MergeFrom(this IMessage message, byte[] data, bool discardUnknownFields, ExtensionRegistry registry)
{
- ProtoPreconditions.CheckNotNull(message, "message");
- ProtoPreconditions.CheckNotNull(data, "data");
- CodedInputStream input = new CodedInputStream(data);
- input.DiscardUnknownFields = discardUnknownFields;
- input.ExtensionRegistry = registry;
+ ProtoPreconditions.CheckNotNull(message, nameof(message));
+ ProtoPreconditions.CheckNotNull(data, nameof(data));
+ CodedInputStream input = new CodedInputStream(data)
+ {
+ DiscardUnknownFields = discardUnknownFields,
+ ExtensionRegistry = registry
+ };
message.MergeFrom(input);
input.CheckReadEndOfStreamTag();
}
internal static void MergeFrom(this IMessage message, byte[] data, int offset, int length, bool discardUnknownFields, ExtensionRegistry registry)
{
- ProtoPreconditions.CheckNotNull(message, "message");
- ProtoPreconditions.CheckNotNull(data, "data");
- CodedInputStream input = new CodedInputStream(data, offset, length);
- input.DiscardUnknownFields = discardUnknownFields;
- input.ExtensionRegistry = registry;
+ ProtoPreconditions.CheckNotNull(message, nameof(message));
+ ProtoPreconditions.CheckNotNull(data, nameof(data));
+ CodedInputStream input = new CodedInputStream(data, offset, length)
+ {
+ DiscardUnknownFields = discardUnknownFields,
+ ExtensionRegistry = registry
+ };
message.MergeFrom(input);
input.CheckReadEndOfStreamTag();
}
internal static void MergeFrom(this IMessage message, ByteString data, bool discardUnknownFields, ExtensionRegistry registry)
{
- ProtoPreconditions.CheckNotNull(message, "message");
- ProtoPreconditions.CheckNotNull(data, "data");
+ ProtoPreconditions.CheckNotNull(message, nameof(message));
+ ProtoPreconditions.CheckNotNull(data, nameof(data));
CodedInputStream input = data.CreateCodedInput();
input.DiscardUnknownFields = discardUnknownFields;
input.ExtensionRegistry = registry;
@@ -284,11 +288,13 @@
internal static void MergeFrom(this IMessage message, Stream input, bool discardUnknownFields, ExtensionRegistry registry)
{
- ProtoPreconditions.CheckNotNull(message, "message");
- ProtoPreconditions.CheckNotNull(input, "input");
- CodedInputStream codedInput = new CodedInputStream(input);
- codedInput.DiscardUnknownFields = discardUnknownFields;
- codedInput.ExtensionRegistry = registry;
+ ProtoPreconditions.CheckNotNull(message, nameof(message));
+ ProtoPreconditions.CheckNotNull(input, nameof(input));
+ CodedInputStream codedInput = new CodedInputStream(input)
+ {
+ DiscardUnknownFields = discardUnknownFields,
+ ExtensionRegistry = registry
+ };
message.MergeFrom(codedInput);
codedInput.CheckReadEndOfStreamTag();
}
@@ -315,8 +321,8 @@
internal static void MergeDelimitedFrom(this IMessage message, Stream input, bool discardUnknownFields, ExtensionRegistry registry)
{
- ProtoPreconditions.CheckNotNull(message, "message");
- ProtoPreconditions.CheckNotNull(input, "input");
+ ProtoPreconditions.CheckNotNull(message, nameof(message));
+ ProtoPreconditions.CheckNotNull(input, nameof(input));
int size = (int) CodedInputStream.ReadRawVarint32(input);
Stream limitedStream = new LimitedInputStream(input, size);
MergeFrom(message, limitedStream, discardUnknownFields, registry);
diff --git a/csharp/src/Google.Protobuf/MessageParser.cs b/csharp/src/Google.Protobuf/MessageParser.cs
index a10c908..5710292 100644
--- a/csharp/src/Google.Protobuf/MessageParser.cs
+++ b/csharp/src/Google.Protobuf/MessageParser.cs
@@ -43,9 +43,8 @@
/// </summary>
public class MessageParser
{
- private Func<IMessage> factory;
- // TODO: When we use a C# 7.1 compiler, make this private protected.
- internal bool DiscardUnknownFields { get; }
+ private readonly Func<IMessage> factory;
+ private protected bool DiscardUnknownFields { get; }
internal ExtensionRegistry Extensions { get; }
@@ -172,6 +171,10 @@
/// <summary>
/// Parses a message from the given JSON.
/// </summary>
+ /// <remarks>This method always uses the default JSON parser; it is not affected by <see cref="WithDiscardUnknownFields(bool)"/>.
+ /// To ignore unknown fields when parsing JSON, create a <see cref="JsonParser"/> using a <see cref="JsonParser.Settings"/>
+ /// with <see cref="JsonParser.Settings.IgnoreUnknownFields"/> set to true and call <see cref="JsonParser.Parse{T}(string)"/> directly.
+ /// </remarks>
/// <param name="json">The JSON to parse.</param>
/// <returns>The parsed message.</returns>
/// <exception cref="InvalidJsonException">The JSON does not comply with RFC 7159</exception>
@@ -204,6 +207,9 @@
/// <summary>
/// Creates a new message parser which optionally discards unknown fields when parsing.
/// </summary>
+ /// <remarks>Note that this does not affect the behavior of <see cref="ParseJson(string)"/>
+ /// at all. To ignore unknown fields when parsing JSON, create a <see cref="JsonParser"/> using a <see cref="JsonParser.Settings"/>
+ /// with <see cref="JsonParser.Settings.IgnoreUnknownFields"/> set to true and call <see cref="JsonParser.Parse{T}(string)"/> directly.</remarks>
/// <param name="discardUnknownFields">Whether or not to discard unknown fields when parsing.</param>
/// <returns>A newly configured message parser.</returns>
public MessageParser WithDiscardUnknownFields(bool discardUnknownFields) =>
diff --git a/csharp/src/Google.Protobuf/ObjectIntPair.cs b/csharp/src/Google.Protobuf/ObjectIntPair.cs
index b61fc68..3270b49 100644
--- a/csharp/src/Google.Protobuf/ObjectIntPair.cs
+++ b/csharp/src/Google.Protobuf/ObjectIntPair.cs
@@ -23,14 +23,7 @@
&& number == other.number;
}
- public override bool Equals(object obj)
- {
- if (obj is ObjectIntPair<T>)
- {
- return Equals((ObjectIntPair<T>)obj);
- }
- return false;
- }
+ public override bool Equals(object obj) => obj is ObjectIntPair<T> pair && Equals(pair);
public override int GetHashCode()
{
diff --git a/csharp/src/Google.Protobuf/ParseContext.cs b/csharp/src/Google.Protobuf/ParseContext.cs
index 7b278b5..85ea567 100644
--- a/csharp/src/Google.Protobuf/ParseContext.cs
+++ b/csharp/src/Google.Protobuf/ParseContext.cs
@@ -32,14 +32,8 @@
using System;
using System.Buffers;
-using System.Buffers.Binary;
-using System.Collections.Generic;
-using System.IO;
using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
using System.Security;
-using System.Text;
-using Google.Protobuf.Collections;
namespace Google.Protobuf
{
@@ -53,7 +47,7 @@
public ref struct ParseContext
{
internal const int DefaultRecursionLimit = 100;
- internal const int DefaultSizeLimit = Int32.MaxValue;
+ internal const int DefaultSizeLimit = int.MaxValue;
internal ReadOnlySpan<byte> buffer;
internal ParserInternalState state;
@@ -127,14 +121,15 @@
/// Returns the last tag read, or 0 if no tags have been read or we've read beyond
/// the end of the input.
/// </summary>
- internal uint LastTag { get { return state.lastTag; } }
+ internal uint LastTag => state.lastTag;
/// <summary>
/// Internal-only property; when set to true, unknown fields will be discarded while parsing.
/// </summary>
- internal bool DiscardUnknownFields {
- get { return state.DiscardUnknownFields; }
- set { state.DiscardUnknownFields = value; }
+ internal bool DiscardUnknownFields
+ {
+ get => state.DiscardUnknownFields;
+ set => state.DiscardUnknownFields = value;
}
/// <summary>
@@ -142,8 +137,8 @@
/// </summary>
internal ExtensionRegistry ExtensionRegistry
{
- get { return state.ExtensionRegistry; }
- set { state.ExtensionRegistry = value; }
+ get => state.ExtensionRegistry;
+ set => state.ExtensionRegistry = value;
}
/// <summary>
@@ -156,125 +151,85 @@
/// </remarks>
/// <returns>The next field tag, or 0 for end of input. (0 is never a valid tag.)</returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- public uint ReadTag()
- {
- return ParsingPrimitives.ParseTag(ref buffer, ref state);
- }
+ public uint ReadTag() => ParsingPrimitives.ParseTag(ref buffer, ref state);
/// <summary>
/// Reads a double field from the input.
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- public double ReadDouble()
- {
- return ParsingPrimitives.ParseDouble(ref buffer, ref state);
- }
+ public double ReadDouble() => ParsingPrimitives.ParseDouble(ref buffer, ref state);
/// <summary>
/// Reads a float field from the input.
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- public float ReadFloat()
- {
- return ParsingPrimitives.ParseFloat(ref buffer, ref state);
- }
+ public float ReadFloat() => ParsingPrimitives.ParseFloat(ref buffer, ref state);
/// <summary>
/// Reads a uint64 field from the input.
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- public ulong ReadUInt64()
- {
- return ParsingPrimitives.ParseRawVarint64(ref buffer, ref state);
- }
+ public ulong ReadUInt64() => ParsingPrimitives.ParseRawVarint64(ref buffer, ref state);
/// <summary>
/// Reads an int64 field from the input.
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- public long ReadInt64()
- {
- return (long)ParsingPrimitives.ParseRawVarint64(ref buffer, ref state);
- }
+ public long ReadInt64() => (long)ParsingPrimitives.ParseRawVarint64(ref buffer, ref state);
/// <summary>
/// Reads an int32 field from the input.
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- public int ReadInt32()
- {
- return (int)ParsingPrimitives.ParseRawVarint32(ref buffer, ref state);
- }
+ public int ReadInt32() => (int)ParsingPrimitives.ParseRawVarint32(ref buffer, ref state);
/// <summary>
/// Reads a fixed64 field from the input.
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- public ulong ReadFixed64()
- {
- return ParsingPrimitives.ParseRawLittleEndian64(ref buffer, ref state);
- }
+ public ulong ReadFixed64() => ParsingPrimitives.ParseRawLittleEndian64(ref buffer, ref state);
/// <summary>
/// Reads a fixed32 field from the input.
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- public uint ReadFixed32()
- {
- return ParsingPrimitives.ParseRawLittleEndian32(ref buffer, ref state);
- }
+ public uint ReadFixed32() => ParsingPrimitives.ParseRawLittleEndian32(ref buffer, ref state);
/// <summary>
/// Reads a bool field from the input.
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- public bool ReadBool()
- {
- return ParsingPrimitives.ParseRawVarint64(ref buffer, ref state) != 0;
- }
+ public bool ReadBool() => ParsingPrimitives.ParseRawVarint64(ref buffer, ref state) != 0;
+
/// <summary>
/// Reads a string field from the input.
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- public string ReadString()
- {
- return ParsingPrimitives.ReadString(ref buffer, ref state);
- }
+ public string ReadString() => ParsingPrimitives.ReadString(ref buffer, ref state);
/// <summary>
/// Reads an embedded message field value from the input.
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- public void ReadMessage(IMessage message)
- {
- ParsingPrimitivesMessages.ReadMessage(ref this, message);
- }
+ public void ReadMessage(IMessage message) => ParsingPrimitivesMessages.ReadMessage(ref this, message);
/// <summary>
/// Reads an embedded group field from the input.
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- public void ReadGroup(IMessage message)
- {
- ParsingPrimitivesMessages.ReadGroup(ref this, message);
- }
+ public void ReadGroup(IMessage message) => ParsingPrimitivesMessages.ReadGroup(ref this, message);
/// <summary>
/// Reads a bytes field value from the input.
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- public ByteString ReadBytes()
- {
- return ParsingPrimitives.ReadBytes(ref buffer, ref state);
- }
+ public ByteString ReadBytes() => ParsingPrimitives.ReadBytes(ref buffer, ref state);
+
/// <summary>
/// Reads a uint32 field value from the input.
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- public uint ReadUInt32()
- {
- return ParsingPrimitives.ParseRawVarint32(ref buffer, ref state);
- }
+ public uint ReadUInt32() => ParsingPrimitives.ParseRawVarint32(ref buffer, ref state);
/// <summary>
/// Reads an enum field value from the input.
@@ -290,37 +245,25 @@
/// Reads an sfixed32 field value from the input.
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- public int ReadSFixed32()
- {
- return (int)ParsingPrimitives.ParseRawLittleEndian32(ref buffer, ref state);
- }
+ public int ReadSFixed32() => (int)ParsingPrimitives.ParseRawLittleEndian32(ref buffer, ref state);
/// <summary>
/// Reads an sfixed64 field value from the input.
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- public long ReadSFixed64()
- {
- return (long)ParsingPrimitives.ParseRawLittleEndian64(ref buffer, ref state);
- }
+ public long ReadSFixed64() => (long)ParsingPrimitives.ParseRawLittleEndian64(ref buffer, ref state);
/// <summary>
/// Reads an sint32 field value from the input.
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- public int ReadSInt32()
- {
- return ParsingPrimitives.DecodeZigZag32(ParsingPrimitives.ParseRawVarint32(ref buffer, ref state));
- }
+ public int ReadSInt32() => ParsingPrimitives.DecodeZigZag32(ParsingPrimitives.ParseRawVarint32(ref buffer, ref state));
/// <summary>
/// Reads an sint64 field value from the input.
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- public long ReadSInt64()
- {
- return ParsingPrimitives.DecodeZigZag64(ParsingPrimitives.ParseRawVarint64(ref buffer, ref state));
- }
+ public long ReadSInt64() => ParsingPrimitives.DecodeZigZag64(ParsingPrimitives.ParseRawVarint64(ref buffer, ref state));
/// <summary>
/// Reads a length for length-delimited data.
@@ -330,10 +273,7 @@
/// to make the calling code clearer.
/// </remarks>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- public int ReadLength()
- {
- return (int)ParsingPrimitives.ParseRawVarint32(ref buffer, ref state);
- }
+ public int ReadLength() => (int)ParsingPrimitives.ParseRawVarint32(ref buffer, ref state);
internal void CopyStateTo(CodedInputStream input)
{
diff --git a/csharp/src/Google.Protobuf/ParserInternalState.cs b/csharp/src/Google.Protobuf/ParserInternalState.cs
index cb4f471..af7dd78 100644
--- a/csharp/src/Google.Protobuf/ParserInternalState.cs
+++ b/csharp/src/Google.Protobuf/ParserInternalState.cs
@@ -30,20 +30,8 @@
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#endregion
-using System;
-using System.Buffers;
-using System.Buffers.Binary;
-using System.Collections.Generic;
-using System.IO;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-using System.Security;
-using System.Text;
-using Google.Protobuf.Collections;
-
namespace Google.Protobuf
{
-
// warning: this is a mutable struct, so it needs to be only passed as a ref!
internal struct ParserInternalState
{
diff --git a/csharp/src/Google.Protobuf/ParsingPrimitives.cs b/csharp/src/Google.Protobuf/ParsingPrimitives.cs
index e270ed8..4321d26 100644
--- a/csharp/src/Google.Protobuf/ParsingPrimitives.cs
+++ b/csharp/src/Google.Protobuf/ParsingPrimitives.cs
@@ -34,13 +34,10 @@
using System.Buffers;
using System.Buffers.Binary;
using System.Collections.Generic;
-using System.Diagnostics;
using System.IO;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Security;
-using System.Text;
-using Google.Protobuf.Collections;
namespace Google.Protobuf
{
diff --git a/csharp/src/Google.Protobuf/ParsingPrimitivesMessages.cs b/csharp/src/Google.Protobuf/ParsingPrimitivesMessages.cs
index eabaf96..5e1babf 100644
--- a/csharp/src/Google.Protobuf/ParsingPrimitivesMessages.cs
+++ b/csharp/src/Google.Protobuf/ParsingPrimitivesMessages.cs
@@ -33,8 +33,6 @@
using System;
using System.Buffers;
using System.Collections.Generic;
-using System.IO;
-using System.Runtime.CompilerServices;
using System.Security;
using Google.Protobuf.Collections;
diff --git a/csharp/src/Google.Protobuf/ParsingPrimitivesWrappers.cs b/csharp/src/Google.Protobuf/ParsingPrimitivesWrappers.cs
index 629ec32..e874935 100644
--- a/csharp/src/Google.Protobuf/ParsingPrimitivesWrappers.cs
+++ b/csharp/src/Google.Protobuf/ParsingPrimitivesWrappers.cs
@@ -31,15 +31,7 @@
#endregion
using System;
-using System.Buffers;
-using System.Buffers.Binary;
-using System.Collections.Generic;
-using System.IO;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
using System.Security;
-using System.Text;
-using Google.Protobuf.Collections;
namespace Google.Protobuf
{
diff --git a/csharp/src/Google.Protobuf/Properties/AssemblyInfo.cs b/csharp/src/Google.Protobuf/Properties/AssemblyInfo.cs
index 4328e2e..ae885f8 100644
--- a/csharp/src/Google.Protobuf/Properties/AssemblyInfo.cs
+++ b/csharp/src/Google.Protobuf/Properties/AssemblyInfo.cs
@@ -47,10 +47,3 @@
"981207041fd5b2da3b498346fcfcd94910d52f25537c4a43ce3fbe17dc7d43e6cbdb4d8f1242dc" +
"b6bd9b5906be74da8daa7d7280f97130f318a16c07baf118839b156299a48522f9fae2371c9665" +
"c5ae9cb6")]
-
-[assembly: InternalsVisibleTo("Google.Protobuf.Benchmarks, PublicKey=" +
- "002400000480000094000000060200000024000052534131000400000100010025800fbcfc63a1" +
- "7c66b303aae80b03a6beaa176bb6bef883be436f2a1579edd80ce23edf151a1f4ced97af83abcd" +
- "981207041fd5b2da3b498346fcfcd94910d52f25537c4a43ce3fbe17dc7d43e6cbdb4d8f1242dc" +
- "b6bd9b5906be74da8daa7d7280f97130f318a16c07baf118839b156299a48522f9fae2371c9665" +
- "c5ae9cb6")]
diff --git a/csharp/src/Google.Protobuf/Reflection/CustomOptions.cs b/csharp/src/Google.Protobuf/Reflection/CustomOptions.cs
index f6fa152..2c5d2c8 100644
--- a/csharp/src/Google.Protobuf/Reflection/CustomOptions.cs
+++ b/csharp/src/Google.Protobuf/Reflection/CustomOptions.cs
@@ -31,7 +31,6 @@
#endregion
using Google.Protobuf.Collections;
-using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
@@ -226,24 +225,21 @@
{
if (values == null)
{
- value = default(T);
+ value = default;
return false;
}
- IExtensionValue extensionValue;
- if (values.TryGetValue(field, out extensionValue))
+ if (values.TryGetValue(field, out IExtensionValue extensionValue))
{
- if (extensionValue is ExtensionValue<T>)
+ if (extensionValue is ExtensionValue<T> single)
{
- ExtensionValue<T> single = extensionValue as ExtensionValue<T>;
ByteString bytes = single.GetValue().ToByteString();
value = new T();
value.MergeFrom(bytes);
return true;
}
- else if (extensionValue is RepeatedExtensionValue<T>)
+ else if (extensionValue is RepeatedExtensionValue<T> repeated)
{
- RepeatedExtensionValue<T> repeated = extensionValue as RepeatedExtensionValue<T>;
value = repeated.GetValue()
.Select(v => v.ToByteString())
.Aggregate(new T(), (t, b) =>
@@ -264,22 +260,19 @@
{
if (values == null)
{
- value = default(T);
+ value = default;
return false;
}
- IExtensionValue extensionValue;
- if (values.TryGetValue(field, out extensionValue))
+ if (values.TryGetValue(field, out IExtensionValue extensionValue))
{
- if (extensionValue is ExtensionValue<T>)
+ if (extensionValue is ExtensionValue<T> single)
{
- ExtensionValue<T> single = extensionValue as ExtensionValue<T>;
value = single.GetValue();
return true;
}
- else if (extensionValue is RepeatedExtensionValue<T>)
+ else if (extensionValue is RepeatedExtensionValue<T> repeated)
{
- RepeatedExtensionValue<T> repeated = extensionValue as RepeatedExtensionValue<T>;
if (repeated.GetValue().Count != 0)
{
RepeatedField<T> repeatedField = repeated.GetValue();
@@ -317,7 +310,7 @@
}
}
- value = default(T);
+ value = default;
return false;
}
}
diff --git a/csharp/src/Google.Protobuf/Reflection/Descriptor.cs b/csharp/src/Google.Protobuf/Reflection/Descriptor.cs
index 1cb43c0..e252372 100644
--- a/csharp/src/Google.Protobuf/Reflection/Descriptor.cs
+++ b/csharp/src/Google.Protobuf/Reflection/Descriptor.cs
@@ -26,7 +26,7 @@
string.Concat(
"CiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bxIPZ29vZ2xlLnBy",
"b3RvYnVmIkcKEUZpbGVEZXNjcmlwdG9yU2V0EjIKBGZpbGUYASADKAsyJC5n",
- "b29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90byLbAwoTRmlsZURl",
+ "b29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90byLsAwoTRmlsZURl",
"c2NyaXB0b3JQcm90bxIMCgRuYW1lGAEgASgJEg8KB3BhY2thZ2UYAiABKAkS",
"EgoKZGVwZW5kZW5jeRgDIAMoCRIZChFwdWJsaWNfZGVwZW5kZW5jeRgKIAMo",
"BRIXCg93ZWFrX2RlcGVuZGVuY3kYCyADKAUSNgoMbWVzc2FnZV90eXBlGAQg",
@@ -37,134 +37,137 @@
"LnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvEi0KB29wdGlvbnMYCCAB",
"KAsyHC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMSOQoQc291cmNlX2Nv",
"ZGVfaW5mbxgJIAEoCzIfLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5m",
- "bxIOCgZzeW50YXgYDCABKAkiqQUKD0Rlc2NyaXB0b3JQcm90bxIMCgRuYW1l",
- "GAEgASgJEjQKBWZpZWxkGAIgAygLMiUuZ29vZ2xlLnByb3RvYnVmLkZpZWxk",
- "RGVzY3JpcHRvclByb3RvEjgKCWV4dGVuc2lvbhgGIAMoCzIlLmdvb2dsZS5w",
- "cm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90bxI1CgtuZXN0ZWRfdHlwZRgD",
- "IAMoCzIgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8SNwoJZW51",
- "bV90eXBlGAQgAygLMiQuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9y",
- "UHJvdG8SSAoPZXh0ZW5zaW9uX3JhbmdlGAUgAygLMi8uZ29vZ2xlLnByb3Rv",
- "YnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZRI5CgpvbmVvZl9k",
- "ZWNsGAggAygLMiUuZ29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclBy",
- "b3RvEjAKB29wdGlvbnMYByABKAsyHy5nb29nbGUucHJvdG9idWYuTWVzc2Fn",
- "ZU9wdGlvbnMSRgoOcmVzZXJ2ZWRfcmFuZ2UYCSADKAsyLi5nb29nbGUucHJv",
- "dG9idWYuRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2USFQoNcmVzZXJ2",
- "ZWRfbmFtZRgKIAMoCRplCg5FeHRlbnNpb25SYW5nZRINCgVzdGFydBgBIAEo",
- "BRILCgNlbmQYAiABKAUSNwoHb3B0aW9ucxgDIAEoCzImLmdvb2dsZS5wcm90",
- "b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnMaKwoNUmVzZXJ2ZWRSYW5nZRIN",
- "CgVzdGFydBgBIAEoBRILCgNlbmQYAiABKAUiZwoVRXh0ZW5zaW9uUmFuZ2VP",
+ "bxIOCgZzeW50YXgYDCABKAkSDwoHZWRpdGlvbhgNIAEoCSKpBQoPRGVzY3Jp",
+ "cHRvclByb3RvEgwKBG5hbWUYASABKAkSNAoFZmllbGQYAiADKAsyJS5nb29n",
+ "bGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8SOAoJZXh0ZW5zaW9u",
+ "GAYgAygLMiUuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3Rv",
+ "EjUKC25lc3RlZF90eXBlGAMgAygLMiAuZ29vZ2xlLnByb3RvYnVmLkRlc2Ny",
+ "aXB0b3JQcm90bxI3CgllbnVtX3R5cGUYBCADKAsyJC5nb29nbGUucHJvdG9i",
+ "dWYuRW51bURlc2NyaXB0b3JQcm90bxJICg9leHRlbnNpb25fcmFuZ2UYBSAD",
+ "KAsyLy5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lv",
+ "blJhbmdlEjkKCm9uZW9mX2RlY2wYCCADKAsyJS5nb29nbGUucHJvdG9idWYu",
+ "T25lb2ZEZXNjcmlwdG9yUHJvdG8SMAoHb3B0aW9ucxgHIAEoCzIfLmdvb2ds",
+ "ZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxJGCg5yZXNlcnZlZF9yYW5nZRgJ",
+ "IAMoCzIuLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2",
+ "ZWRSYW5nZRIVCg1yZXNlcnZlZF9uYW1lGAogAygJGmUKDkV4dGVuc2lvblJh",
+ "bmdlEg0KBXN0YXJ0GAEgASgFEgsKA2VuZBgCIAEoBRI3CgdvcHRpb25zGAMg",
+ "ASgLMiYuZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9ucxor",
+ "Cg1SZXNlcnZlZFJhbmdlEg0KBXN0YXJ0GAEgASgFEgsKA2VuZBgCIAEoBSJn",
+ "ChVFeHRlbnNpb25SYW5nZU9wdGlvbnMSQwoUdW5pbnRlcnByZXRlZF9vcHRp",
+ "b24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRp",
+ "b24qCQjoBxCAgICAAiLVBQoURmllbGREZXNjcmlwdG9yUHJvdG8SDAoEbmFt",
+ "ZRgBIAEoCRIOCgZudW1iZXIYAyABKAUSOgoFbGFiZWwYBCABKA4yKy5nb29n",
+ "bGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uTGFiZWwSOAoEdHlw",
+ "ZRgFIAEoDjIqLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90",
+ "by5UeXBlEhEKCXR5cGVfbmFtZRgGIAEoCRIQCghleHRlbmRlZRgCIAEoCRIV",
+ "Cg1kZWZhdWx0X3ZhbHVlGAcgASgJEhMKC29uZW9mX2luZGV4GAkgASgFEhEK",
+ "CWpzb25fbmFtZRgKIAEoCRIuCgdvcHRpb25zGAggASgLMh0uZ29vZ2xlLnBy",
+ "b3RvYnVmLkZpZWxkT3B0aW9ucxIXCg9wcm90bzNfb3B0aW9uYWwYESABKAgi",
+ "tgIKBFR5cGUSDwoLVFlQRV9ET1VCTEUQARIOCgpUWVBFX0ZMT0FUEAISDgoK",
+ "VFlQRV9JTlQ2NBADEg8KC1RZUEVfVUlOVDY0EAQSDgoKVFlQRV9JTlQzMhAF",
+ "EhAKDFRZUEVfRklYRUQ2NBAGEhAKDFRZUEVfRklYRUQzMhAHEg0KCVRZUEVf",
+ "Qk9PTBAIEg8KC1RZUEVfU1RSSU5HEAkSDgoKVFlQRV9HUk9VUBAKEhAKDFRZ",
+ "UEVfTUVTU0FHRRALEg4KClRZUEVfQllURVMQDBIPCgtUWVBFX1VJTlQzMhAN",
+ "Eg0KCVRZUEVfRU5VTRAOEhEKDVRZUEVfU0ZJWEVEMzIQDxIRCg1UWVBFX1NG",
+ "SVhFRDY0EBASDwoLVFlQRV9TSU5UMzIQERIPCgtUWVBFX1NJTlQ2NBASIkMK",
+ "BUxhYmVsEhIKDkxBQkVMX09QVElPTkFMEAESEgoOTEFCRUxfUkVRVUlSRUQQ",
+ "AhISCg5MQUJFTF9SRVBFQVRFRBADIlQKFE9uZW9mRGVzY3JpcHRvclByb3Rv",
+ "EgwKBG5hbWUYASABKAkSLgoHb3B0aW9ucxgCIAEoCzIdLmdvb2dsZS5wcm90",
+ "b2J1Zi5PbmVvZk9wdGlvbnMipAIKE0VudW1EZXNjcmlwdG9yUHJvdG8SDAoE",
+ "bmFtZRgBIAEoCRI4CgV2YWx1ZRgCIAMoCzIpLmdvb2dsZS5wcm90b2J1Zi5F",
+ "bnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8SLQoHb3B0aW9ucxgDIAEoCzIcLmdv",
+ "b2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucxJOCg5yZXNlcnZlZF9yYW5nZRgE",
+ "IAMoCzI2Lmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLkVu",
+ "dW1SZXNlcnZlZFJhbmdlEhUKDXJlc2VydmVkX25hbWUYBSADKAkaLwoRRW51",
+ "bVJlc2VydmVkUmFuZ2USDQoFc3RhcnQYASABKAUSCwoDZW5kGAIgASgFImwK",
+ "GEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bxIMCgRuYW1lGAEgASgJEg4KBm51",
+ "bWJlchgCIAEoBRIyCgdvcHRpb25zGAMgASgLMiEuZ29vZ2xlLnByb3RvYnVm",
+ "LkVudW1WYWx1ZU9wdGlvbnMikAEKFlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8S",
+ "DAoEbmFtZRgBIAEoCRI2CgZtZXRob2QYAiADKAsyJi5nb29nbGUucHJvdG9i",
+ "dWYuTWV0aG9kRGVzY3JpcHRvclByb3RvEjAKB29wdGlvbnMYAyABKAsyHy5n",
+ "b29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMiwQEKFU1ldGhvZERlc2Ny",
+ "aXB0b3JQcm90bxIMCgRuYW1lGAEgASgJEhIKCmlucHV0X3R5cGUYAiABKAkS",
+ "EwoLb3V0cHV0X3R5cGUYAyABKAkSLwoHb3B0aW9ucxgEIAEoCzIeLmdvb2ds",
+ "ZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zEh8KEGNsaWVudF9zdHJlYW1pbmcY",
+ "BSABKAg6BWZhbHNlEh8KEHNlcnZlcl9zdHJlYW1pbmcYBiABKAg6BWZhbHNl",
+ "IqUGCgtGaWxlT3B0aW9ucxIUCgxqYXZhX3BhY2thZ2UYASABKAkSHAoUamF2",
+ "YV9vdXRlcl9jbGFzc25hbWUYCCABKAkSIgoTamF2YV9tdWx0aXBsZV9maWxl",
+ "cxgKIAEoCDoFZmFsc2USKQodamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hh",
+ "c2gYFCABKAhCAhgBEiUKFmphdmFfc3RyaW5nX2NoZWNrX3V0ZjgYGyABKAg6",
+ "BWZhbHNlEkYKDG9wdGltaXplX2ZvchgJIAEoDjIpLmdvb2dsZS5wcm90b2J1",
+ "Zi5GaWxlT3B0aW9ucy5PcHRpbWl6ZU1vZGU6BVNQRUVEEhIKCmdvX3BhY2th",
+ "Z2UYCyABKAkSIgoTY2NfZ2VuZXJpY19zZXJ2aWNlcxgQIAEoCDoFZmFsc2US",
+ "JAoVamF2YV9nZW5lcmljX3NlcnZpY2VzGBEgASgIOgVmYWxzZRIiChNweV9n",
+ "ZW5lcmljX3NlcnZpY2VzGBIgASgIOgVmYWxzZRIjChRwaHBfZ2VuZXJpY19z",
+ "ZXJ2aWNlcxgqIAEoCDoFZmFsc2USGQoKZGVwcmVjYXRlZBgXIAEoCDoFZmFs",
+ "c2USHgoQY2NfZW5hYmxlX2FyZW5hcxgfIAEoCDoEdHJ1ZRIZChFvYmpjX2Ns",
+ "YXNzX3ByZWZpeBgkIAEoCRIYChBjc2hhcnBfbmFtZXNwYWNlGCUgASgJEhQK",
+ "DHN3aWZ0X3ByZWZpeBgnIAEoCRIYChBwaHBfY2xhc3NfcHJlZml4GCggASgJ",
+ "EhUKDXBocF9uYW1lc3BhY2UYKSABKAkSHgoWcGhwX21ldGFkYXRhX25hbWVz",
+ "cGFjZRgsIAEoCRIUCgxydWJ5X3BhY2thZ2UYLSABKAkSQwoUdW5pbnRlcnBy",
+ "ZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJw",
+ "cmV0ZWRPcHRpb24iOgoMT3B0aW1pemVNb2RlEgkKBVNQRUVEEAESDQoJQ09E",
+ "RV9TSVpFEAISEAoMTElURV9SVU5USU1FEAMqCQjoBxCAgICAAkoECCYQJyKE",
+ "AgoOTWVzc2FnZU9wdGlvbnMSJgoXbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQY",
+ "ASABKAg6BWZhbHNlEi4KH25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNz",
+ "b3IYAiABKAg6BWZhbHNlEhkKCmRlcHJlY2F0ZWQYAyABKAg6BWZhbHNlEhEK",
+ "CW1hcF9lbnRyeRgHIAEoCBJDChR1bmludGVycHJldGVkX29wdGlvbhjnByAD",
+ "KAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbioJCOgH",
+ "EICAgIACSgQIBBAFSgQIBRAGSgQIBhAHSgQICBAJSgQICRAKIr4DCgxGaWVs",
+ "ZE9wdGlvbnMSOgoFY3R5cGUYASABKA4yIy5nb29nbGUucHJvdG9idWYuRmll",
+ "bGRPcHRpb25zLkNUeXBlOgZTVFJJTkcSDgoGcGFja2VkGAIgASgIEj8KBmpz",
+ "dHlwZRgGIAEoDjIkLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuSlNU",
+ "eXBlOglKU19OT1JNQUwSEwoEbGF6eRgFIAEoCDoFZmFsc2USHgoPdW52ZXJp",
+ "ZmllZF9sYXp5GA8gASgIOgVmYWxzZRIZCgpkZXByZWNhdGVkGAMgASgIOgVm",
+ "YWxzZRITCgR3ZWFrGAogASgIOgVmYWxzZRJDChR1bmludGVycHJldGVkX29w",
+ "dGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9w",
+ "dGlvbiIvCgVDVHlwZRIKCgZTVFJJTkcQABIICgRDT1JEEAESEAoMU1RSSU5H",
+ "X1BJRUNFEAIiNQoGSlNUeXBlEg0KCUpTX05PUk1BTBAAEg0KCUpTX1NUUklO",
+ "RxABEg0KCUpTX05VTUJFUhACKgkI6AcQgICAgAJKBAgEEAUiXgoMT25lb2ZP",
"cHRpb25zEkMKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2ds",
- "ZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAIi1QUK",
- "FEZpZWxkRGVzY3JpcHRvclByb3RvEgwKBG5hbWUYASABKAkSDgoGbnVtYmVy",
- "GAMgASgFEjoKBWxhYmVsGAQgASgOMisuZ29vZ2xlLnByb3RvYnVmLkZpZWxk",
- "RGVzY3JpcHRvclByb3RvLkxhYmVsEjgKBHR5cGUYBSABKA4yKi5nb29nbGUu",
- "cHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZRIRCgl0eXBlX25h",
- "bWUYBiABKAkSEAoIZXh0ZW5kZWUYAiABKAkSFQoNZGVmYXVsdF92YWx1ZRgH",
- "IAEoCRITCgtvbmVvZl9pbmRleBgJIAEoBRIRCglqc29uX25hbWUYCiABKAkS",
- "LgoHb3B0aW9ucxgIIAEoCzIdLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlv",
- "bnMSFwoPcHJvdG8zX29wdGlvbmFsGBEgASgIIrYCCgRUeXBlEg8KC1RZUEVf",
- "RE9VQkxFEAESDgoKVFlQRV9GTE9BVBACEg4KClRZUEVfSU5UNjQQAxIPCgtU",
- "WVBFX1VJTlQ2NBAEEg4KClRZUEVfSU5UMzIQBRIQCgxUWVBFX0ZJWEVENjQQ",
- "BhIQCgxUWVBFX0ZJWEVEMzIQBxINCglUWVBFX0JPT0wQCBIPCgtUWVBFX1NU",
- "UklORxAJEg4KClRZUEVfR1JPVVAQChIQCgxUWVBFX01FU1NBR0UQCxIOCgpU",
- "WVBFX0JZVEVTEAwSDwoLVFlQRV9VSU5UMzIQDRINCglUWVBFX0VOVU0QDhIR",
- "Cg1UWVBFX1NGSVhFRDMyEA8SEQoNVFlQRV9TRklYRUQ2NBAQEg8KC1RZUEVf",
- "U0lOVDMyEBESDwoLVFlQRV9TSU5UNjQQEiJDCgVMYWJlbBISCg5MQUJFTF9P",
- "UFRJT05BTBABEhIKDkxBQkVMX1JFUVVJUkVEEAISEgoOTEFCRUxfUkVQRUFU",
- "RUQQAyJUChRPbmVvZkRlc2NyaXB0b3JQcm90bxIMCgRuYW1lGAEgASgJEi4K",
- "B29wdGlvbnMYAiABKAsyHS5nb29nbGUucHJvdG9idWYuT25lb2ZPcHRpb25z",
- "IqQCChNFbnVtRGVzY3JpcHRvclByb3RvEgwKBG5hbWUYASABKAkSOAoFdmFs",
- "dWUYAiADKAsyKS5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRv",
- "clByb3RvEi0KB29wdGlvbnMYAyABKAsyHC5nb29nbGUucHJvdG9idWYuRW51",
- "bU9wdGlvbnMSTgoOcmVzZXJ2ZWRfcmFuZ2UYBCADKAsyNi5nb29nbGUucHJv",
- "dG9idWYuRW51bURlc2NyaXB0b3JQcm90by5FbnVtUmVzZXJ2ZWRSYW5nZRIV",
- "Cg1yZXNlcnZlZF9uYW1lGAUgAygJGi8KEUVudW1SZXNlcnZlZFJhbmdlEg0K",
- "BXN0YXJ0GAEgASgFEgsKA2VuZBgCIAEoBSJsChhFbnVtVmFsdWVEZXNjcmlw",
- "dG9yUHJvdG8SDAoEbmFtZRgBIAEoCRIOCgZudW1iZXIYAiABKAUSMgoHb3B0",
- "aW9ucxgDIAEoCzIhLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25z",
- "IpABChZTZXJ2aWNlRGVzY3JpcHRvclByb3RvEgwKBG5hbWUYASABKAkSNgoG",
- "bWV0aG9kGAIgAygLMiYuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0",
- "b3JQcm90bxIwCgdvcHRpb25zGAMgASgLMh8uZ29vZ2xlLnByb3RvYnVmLlNl",
- "cnZpY2VPcHRpb25zIsEBChVNZXRob2REZXNjcmlwdG9yUHJvdG8SDAoEbmFt",
- "ZRgBIAEoCRISCgppbnB1dF90eXBlGAIgASgJEhMKC291dHB1dF90eXBlGAMg",
- "ASgJEi8KB29wdGlvbnMYBCABKAsyHi5nb29nbGUucHJvdG9idWYuTWV0aG9k",
- "T3B0aW9ucxIfChBjbGllbnRfc3RyZWFtaW5nGAUgASgIOgVmYWxzZRIfChBz",
- "ZXJ2ZXJfc3RyZWFtaW5nGAYgASgIOgVmYWxzZSKlBgoLRmlsZU9wdGlvbnMS",
- "FAoMamF2YV9wYWNrYWdlGAEgASgJEhwKFGphdmFfb3V0ZXJfY2xhc3NuYW1l",
- "GAggASgJEiIKE2phdmFfbXVsdGlwbGVfZmlsZXMYCiABKAg6BWZhbHNlEikK",
- "HWphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoGBQgASgIQgIYARIlChZq",
- "YXZhX3N0cmluZ19jaGVja191dGY4GBsgASgIOgVmYWxzZRJGCgxvcHRpbWl6",
- "ZV9mb3IYCSABKA4yKS5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuT3B0",
- "aW1pemVNb2RlOgVTUEVFRBISCgpnb19wYWNrYWdlGAsgASgJEiIKE2NjX2dl",
- "bmVyaWNfc2VydmljZXMYECABKAg6BWZhbHNlEiQKFWphdmFfZ2VuZXJpY19z",
- "ZXJ2aWNlcxgRIAEoCDoFZmFsc2USIgoTcHlfZ2VuZXJpY19zZXJ2aWNlcxgS",
- "IAEoCDoFZmFsc2USIwoUcGhwX2dlbmVyaWNfc2VydmljZXMYKiABKAg6BWZh",
- "bHNlEhkKCmRlcHJlY2F0ZWQYFyABKAg6BWZhbHNlEh4KEGNjX2VuYWJsZV9h",
- "cmVuYXMYHyABKAg6BHRydWUSGQoRb2JqY19jbGFzc19wcmVmaXgYJCABKAkS",
- "GAoQY3NoYXJwX25hbWVzcGFjZRglIAEoCRIUCgxzd2lmdF9wcmVmaXgYJyAB",
- "KAkSGAoQcGhwX2NsYXNzX3ByZWZpeBgoIAEoCRIVCg1waHBfbmFtZXNwYWNl",
- "GCkgASgJEh4KFnBocF9tZXRhZGF0YV9uYW1lc3BhY2UYLCABKAkSFAoMcnVi",
- "eV9wYWNrYWdlGC0gASgJEkMKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMo",
- "CzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIjoKDE9w",
- "dGltaXplTW9kZRIJCgVTUEVFRBABEg0KCUNPREVfU0laRRACEhAKDExJVEVf",
- "UlVOVElNRRADKgkI6AcQgICAgAJKBAgmECcihAIKDk1lc3NhZ2VPcHRpb25z",
- "EiYKF21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0GAEgASgIOgVmYWxzZRIuCh9u",
- "b19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yGAIgASgIOgVmYWxzZRIZ",
- "CgpkZXByZWNhdGVkGAMgASgIOgVmYWxzZRIRCgltYXBfZW50cnkYByABKAgS",
- "QwoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3Rv",
- "YnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAkoECAQQBUoECAUQ",
- "BkoECAYQB0oECAgQCUoECAkQCiK+AwoMRmllbGRPcHRpb25zEjoKBWN0eXBl",
- "GAEgASgOMiMuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5DVHlwZToG",
- "U1RSSU5HEg4KBnBhY2tlZBgCIAEoCBI/CgZqc3R5cGUYBiABKA4yJC5nb29n",
- "bGUucHJvdG9idWYuRmllbGRPcHRpb25zLkpTVHlwZToJSlNfTk9STUFMEhMK",
- "BGxhenkYBSABKAg6BWZhbHNlEh4KD3VudmVyaWZpZWRfbGF6eRgPIAEoCDoF",
- "ZmFsc2USGQoKZGVwcmVjYXRlZBgDIAEoCDoFZmFsc2USEwoEd2VhaxgKIAEo",
- "CDoFZmFsc2USQwoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29v",
- "Z2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24iLwoFQ1R5cGUSCgoG",
- "U1RSSU5HEAASCAoEQ09SRBABEhAKDFNUUklOR19QSUVDRRACIjUKBkpTVHlw",
- "ZRINCglKU19OT1JNQUwQABINCglKU19TVFJJTkcQARINCglKU19OVU1CRVIQ",
- "AioJCOgHEICAgIACSgQIBBAFIl4KDE9uZW9mT3B0aW9ucxJDChR1bmludGVy",
- "cHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRl",
- "cnByZXRlZE9wdGlvbioJCOgHEICAgIACIpMBCgtFbnVtT3B0aW9ucxITCgth",
- "bGxvd19hbGlhcxgCIAEoCBIZCgpkZXByZWNhdGVkGAMgASgIOgVmYWxzZRJD",
- "ChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9i",
- "dWYuVW5pbnRlcnByZXRlZE9wdGlvbioJCOgHEICAgIACSgQIBRAGIn0KEEVu",
- "dW1WYWx1ZU9wdGlvbnMSGQoKZGVwcmVjYXRlZBgBIAEoCDoFZmFsc2USQwoU",
- "dW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVm",
- "LlVuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiJ7Cg5TZXJ2aWNlT3B0",
- "aW9ucxIZCgpkZXByZWNhdGVkGCEgASgIOgVmYWxzZRJDChR1bmludGVycHJl",
- "dGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnBy",
- "ZXRlZE9wdGlvbioJCOgHEICAgIACIq0CCg1NZXRob2RPcHRpb25zEhkKCmRl",
- "cHJlY2F0ZWQYISABKAg6BWZhbHNlEl8KEWlkZW1wb3RlbmN5X2xldmVsGCIg",
- "ASgOMi8uZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMuSWRlbXBvdGVu",
- "Y3lMZXZlbDoTSURFTVBPVEVOQ1lfVU5LTk9XThJDChR1bmludGVycHJldGVk",
- "X29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRl",
- "ZE9wdGlvbiJQChBJZGVtcG90ZW5jeUxldmVsEhcKE0lERU1QT1RFTkNZX1VO",
- "S05PV04QABITCg9OT19TSURFX0VGRkVDVFMQARIOCgpJREVNUE9URU5UEAIq",
- "CQjoBxCAgICAAiKeAgoTVW5pbnRlcnByZXRlZE9wdGlvbhI7CgRuYW1lGAIg",
- "AygLMi0uZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFt",
- "ZVBhcnQSGAoQaWRlbnRpZmllcl92YWx1ZRgDIAEoCRIaChJwb3NpdGl2ZV9p",
- "bnRfdmFsdWUYBCABKAQSGgoSbmVnYXRpdmVfaW50X3ZhbHVlGAUgASgDEhQK",
- "DGRvdWJsZV92YWx1ZRgGIAEoARIUCgxzdHJpbmdfdmFsdWUYByABKAwSFwoP",
- "YWdncmVnYXRlX3ZhbHVlGAggASgJGjMKCE5hbWVQYXJ0EhEKCW5hbWVfcGFy",
- "dBgBIAIoCRIUCgxpc19leHRlbnNpb24YAiACKAgi1QEKDlNvdXJjZUNvZGVJ",
- "bmZvEjoKCGxvY2F0aW9uGAEgAygLMiguZ29vZ2xlLnByb3RvYnVmLlNvdXJj",
- "ZUNvZGVJbmZvLkxvY2F0aW9uGoYBCghMb2NhdGlvbhIQCgRwYXRoGAEgAygF",
- "QgIQARIQCgRzcGFuGAIgAygFQgIQARIYChBsZWFkaW5nX2NvbW1lbnRzGAMg",
- "ASgJEhkKEXRyYWlsaW5nX2NvbW1lbnRzGAQgASgJEiEKGWxlYWRpbmdfZGV0",
- "YWNoZWRfY29tbWVudHMYBiADKAkipwEKEUdlbmVyYXRlZENvZGVJbmZvEkEK",
- "CmFubm90YXRpb24YASADKAsyLS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVk",
- "Q29kZUluZm8uQW5ub3RhdGlvbhpPCgpBbm5vdGF0aW9uEhAKBHBhdGgYASAD",
- "KAVCAhABEhMKC3NvdXJjZV9maWxlGAIgASgJEg0KBWJlZ2luGAMgASgFEgsK",
- "A2VuZBgEIAEoBUJ+ChNjb20uZ29vZ2xlLnByb3RvYnVmQhBEZXNjcmlwdG9y",
- "UHJvdG9zSAFaLWdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2Rl",
- "c2NyaXB0b3JwYvgBAaICA0dQQqoCGkdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0",
- "aW9u"));
+ "ZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAIikwEK",
+ "C0VudW1PcHRpb25zEhMKC2FsbG93X2FsaWFzGAIgASgIEhkKCmRlcHJlY2F0",
+ "ZWQYAyABKAg6BWZhbHNlEkMKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMo",
+ "CzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uKgkI6AcQ",
+ "gICAgAJKBAgFEAYifQoQRW51bVZhbHVlT3B0aW9ucxIZCgpkZXByZWNhdGVk",
+ "GAEgASgIOgVmYWxzZRJDChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsy",
+ "JC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbioJCOgHEICA",
+ "gIACInsKDlNlcnZpY2VPcHRpb25zEhkKCmRlcHJlY2F0ZWQYISABKAg6BWZh",
+ "bHNlEkMKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5w",
+ "cm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAIirQIKDU1l",
+ "dGhvZE9wdGlvbnMSGQoKZGVwcmVjYXRlZBghIAEoCDoFZmFsc2USXwoRaWRl",
+ "bXBvdGVuY3lfbGV2ZWwYIiABKA4yLy5nb29nbGUucHJvdG9idWYuTWV0aG9k",
+ "T3B0aW9ucy5JZGVtcG90ZW5jeUxldmVsOhNJREVNUE9URU5DWV9VTktOT1dO",
+ "EkMKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90",
+ "b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIlAKEElkZW1wb3RlbmN5TGV2ZWwS",
+ "FwoTSURFTVBPVEVOQ1lfVU5LTk9XThAAEhMKD05PX1NJREVfRUZGRUNUUxAB",
+ "Eg4KCklERU1QT1RFTlQQAioJCOgHEICAgIACIp4CChNVbmludGVycHJldGVk",
+ "T3B0aW9uEjsKBG5hbWUYAiADKAsyLS5nb29nbGUucHJvdG9idWYuVW5pbnRl",
+ "cnByZXRlZE9wdGlvbi5OYW1lUGFydBIYChBpZGVudGlmaWVyX3ZhbHVlGAMg",
+ "ASgJEhoKEnBvc2l0aXZlX2ludF92YWx1ZRgEIAEoBBIaChJuZWdhdGl2ZV9p",
+ "bnRfdmFsdWUYBSABKAMSFAoMZG91YmxlX3ZhbHVlGAYgASgBEhQKDHN0cmlu",
+ "Z192YWx1ZRgHIAEoDBIXCg9hZ2dyZWdhdGVfdmFsdWUYCCABKAkaMwoITmFt",
+ "ZVBhcnQSEQoJbmFtZV9wYXJ0GAEgAigJEhQKDGlzX2V4dGVuc2lvbhgCIAIo",
+ "CCLVAQoOU291cmNlQ29kZUluZm8SOgoIbG9jYXRpb24YASADKAsyKC5nb29n",
+ "bGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ahgEKCExvY2F0",
+ "aW9uEhAKBHBhdGgYASADKAVCAhABEhAKBHNwYW4YAiADKAVCAhABEhgKEGxl",
+ "YWRpbmdfY29tbWVudHMYAyABKAkSGQoRdHJhaWxpbmdfY29tbWVudHMYBCAB",
+ "KAkSIQoZbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cxgGIAMoCSKcAgoRR2Vu",
+ "ZXJhdGVkQ29kZUluZm8SQQoKYW5ub3RhdGlvbhgBIAMoCzItLmdvb2dsZS5w",
+ "cm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uGsMBCgpBbm5v",
+ "dGF0aW9uEhAKBHBhdGgYASADKAVCAhABEhMKC3NvdXJjZV9maWxlGAIgASgJ",
+ "Eg0KBWJlZ2luGAMgASgFEgsKA2VuZBgEIAEoBRJICghzZW1hbnRpYxgFIAEo",
+ "DjI2Lmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0",
+ "aW9uLlNlbWFudGljIigKCFNlbWFudGljEggKBE5PTkUQABIHCgNTRVQQARIJ",
+ "CgVBTElBUxACQn4KE2NvbS5nb29nbGUucHJvdG9idWZCEERlc2NyaXB0b3JQ",
+ "cm90b3NIAVotZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMvZGVz",
+ "Y3JpcHRvcnBi+AEBogIDR1BCqgIaR29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rp",
+ "b24="));
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
new pbr::FileDescriptor[] { },
new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] {
new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.FileDescriptorSet), global::Google.Protobuf.Reflection.FileDescriptorSet.Parser, new[]{ "File" }, null, null, null, null),
- new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.FileDescriptorProto), global::Google.Protobuf.Reflection.FileDescriptorProto.Parser, new[]{ "Name", "Package", "Dependency", "PublicDependency", "WeakDependency", "MessageType", "EnumType", "Service", "Extension", "Options", "SourceCodeInfo", "Syntax" }, null, null, null, null),
+ new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.FileDescriptorProto), global::Google.Protobuf.Reflection.FileDescriptorProto.Parser, new[]{ "Name", "Package", "Dependency", "PublicDependency", "WeakDependency", "MessageType", "EnumType", "Service", "Extension", "Options", "SourceCodeInfo", "Syntax", "Edition" }, null, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.DescriptorProto), global::Google.Protobuf.Reflection.DescriptorProto.Parser, new[]{ "Name", "Field", "Extension", "NestedType", "EnumType", "ExtensionRange", "OneofDecl", "Options", "ReservedRange", "ReservedName" }, null, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.DescriptorProto.Types.ExtensionRange), global::Google.Protobuf.Reflection.DescriptorProto.Types.ExtensionRange.Parser, new[]{ "Start", "End", "Options" }, null, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.DescriptorProto.Types.ReservedRange), global::Google.Protobuf.Reflection.DescriptorProto.Types.ReservedRange.Parser, new[]{ "Start", "End" }, null, null, null, null)}),
new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.ExtensionRangeOptions), global::Google.Protobuf.Reflection.ExtensionRangeOptions.Parser, new[]{ "UninterpretedOption" }, null, null, null, null),
@@ -184,7 +187,7 @@
new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.MethodOptions), global::Google.Protobuf.Reflection.MethodOptions.Parser, new[]{ "Deprecated", "IdempotencyLevel", "UninterpretedOption" }, null, new[]{ typeof(global::Google.Protobuf.Reflection.MethodOptions.Types.IdempotencyLevel) }, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.UninterpretedOption), global::Google.Protobuf.Reflection.UninterpretedOption.Parser, new[]{ "Name", "IdentifierValue", "PositiveIntValue", "NegativeIntValue", "DoubleValue", "StringValue", "AggregateValue" }, null, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.UninterpretedOption.Types.NamePart), global::Google.Protobuf.Reflection.UninterpretedOption.Types.NamePart.Parser, new[]{ "NamePart_", "IsExtension" }, null, null, null, null)}),
new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.SourceCodeInfo), global::Google.Protobuf.Reflection.SourceCodeInfo.Parser, new[]{ "Location" }, null, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.SourceCodeInfo.Types.Location), global::Google.Protobuf.Reflection.SourceCodeInfo.Types.Location.Parser, new[]{ "Path", "Span", "LeadingComments", "TrailingComments", "LeadingDetachedComments" }, null, null, null, null)}),
- new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.GeneratedCodeInfo), global::Google.Protobuf.Reflection.GeneratedCodeInfo.Parser, new[]{ "Annotation" }, null, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.GeneratedCodeInfo.Types.Annotation), global::Google.Protobuf.Reflection.GeneratedCodeInfo.Types.Annotation.Parser, new[]{ "Path", "SourceFile", "Begin", "End" }, null, null, null, null)})
+ new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.GeneratedCodeInfo), global::Google.Protobuf.Reflection.GeneratedCodeInfo.Parser, new[]{ "Annotation" }, null, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::Google.Protobuf.Reflection.GeneratedCodeInfo.Types.Annotation), global::Google.Protobuf.Reflection.GeneratedCodeInfo.Types.Annotation.Parser, new[]{ "Path", "SourceFile", "Begin", "End", "Semantic" }, null, new[]{ typeof(global::Google.Protobuf.Reflection.GeneratedCodeInfo.Types.Annotation.Types.Semantic) }, null, null)})
}));
}
#endregion
@@ -422,6 +425,7 @@
options_ = other.options_ != null ? other.options_.Clone() : null;
sourceCodeInfo_ = other.sourceCodeInfo_ != null ? other.sourceCodeInfo_.Clone() : null;
syntax_ = other.syntax_;
+ edition_ = other.edition_;
_unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
}
@@ -616,7 +620,9 @@
private string syntax_;
/// <summary>
/// The syntax of the proto file.
- /// The supported values are "proto2" and "proto3".
+ /// The supported values are "proto2", "proto3", and "editions".
+ ///
+ /// If `edition` is present, this value must be "editions".
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
@@ -639,6 +645,35 @@
syntax_ = null;
}
+ /// <summary>Field number for the "edition" field.</summary>
+ public const int EditionFieldNumber = 13;
+ private readonly static string EditionDefaultValue = "";
+
+ private string edition_;
+ /// <summary>
+ /// The edition of the proto file, which is an opaque string.
+ /// </summary>
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public string Edition {
+ get { return edition_ ?? EditionDefaultValue; }
+ set {
+ edition_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+ }
+ }
+ /// <summary>Gets whether the "edition" field is set</summary>
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public bool HasEdition {
+ get { return edition_ != null; }
+ }
+ /// <summary>Clears the value of the "edition" field</summary>
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public void ClearEdition() {
+ edition_ = null;
+ }
+
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public override bool Equals(object other) {
@@ -666,6 +701,7 @@
if (!object.Equals(Options, other.Options)) return false;
if (!object.Equals(SourceCodeInfo, other.SourceCodeInfo)) return false;
if (Syntax != other.Syntax) return false;
+ if (Edition != other.Edition) return false;
return Equals(_unknownFields, other._unknownFields);
}
@@ -685,6 +721,7 @@
if (options_ != null) hash ^= Options.GetHashCode();
if (sourceCodeInfo_ != null) hash ^= SourceCodeInfo.GetHashCode();
if (HasSyntax) hash ^= Syntax.GetHashCode();
+ if (HasEdition) hash ^= Edition.GetHashCode();
if (_unknownFields != null) {
hash ^= _unknownFields.GetHashCode();
}
@@ -730,6 +767,10 @@
output.WriteRawTag(98);
output.WriteString(Syntax);
}
+ if (HasEdition) {
+ output.WriteRawTag(106);
+ output.WriteString(Edition);
+ }
if (_unknownFields != null) {
_unknownFields.WriteTo(output);
}
@@ -767,6 +808,10 @@
output.WriteRawTag(98);
output.WriteString(Syntax);
}
+ if (HasEdition) {
+ output.WriteRawTag(106);
+ output.WriteString(Edition);
+ }
if (_unknownFields != null) {
_unknownFields.WriteTo(ref output);
}
@@ -799,6 +844,9 @@
if (HasSyntax) {
size += 1 + pb::CodedOutputStream.ComputeStringSize(Syntax);
}
+ if (HasEdition) {
+ size += 1 + pb::CodedOutputStream.ComputeStringSize(Edition);
+ }
if (_unknownFields != null) {
size += _unknownFields.CalculateSize();
}
@@ -839,6 +887,9 @@
if (other.HasSyntax) {
Syntax = other.Syntax;
}
+ if (other.HasEdition) {
+ Edition = other.Edition;
+ }
_unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
}
@@ -910,6 +961,10 @@
Syntax = input.ReadString();
break;
}
+ case 106: {
+ Edition = input.ReadString();
+ break;
+ }
}
}
#endif
@@ -981,6 +1036,10 @@
Syntax = input.ReadString();
break;
}
+ case 106: {
+ Edition = input.ReadString();
+ break;
+ }
}
}
}
@@ -6582,6 +6641,10 @@
private bool mapEntry_;
/// <summary>
+ /// NOTE: Do not set the option in .proto files. Always use the maps syntax
+ /// instead. The option should only be implicitly set by the proto compiler
+ /// parser.
+ ///
/// Whether the message is an automatically generated map entry type for the
/// maps field.
///
@@ -6599,10 +6662,6 @@
/// use a native map in the target language to hold the keys and values.
/// The reflection APIs in such implementations still need to work as
/// if the field is a repeated message field.
- ///
- /// NOTE: Do not set the option in .proto files. Always use the maps syntax
- /// instead. The option should only be implicitly set by the proto compiler
- /// parser.
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
@@ -7098,11 +7157,8 @@
/// check its required fields, regardless of whether or not the message has
/// been parsed.
///
- /// As of 2021, lazy does no correctness checks on the byte stream during
- /// parsing. This may lead to crashes if and when an invalid byte stream is
- /// finally parsed upon access.
- ///
- /// TODO(b/211906113): Enable validation on lazy fields.
+ /// As of May 2022, lazy verifies the contents of the byte stream during
+ /// parsing. An invalid byte stream will cause the overall parsing to fail.
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
@@ -10758,6 +10814,7 @@
sourceFile_ = other.sourceFile_;
begin_ = other.begin_;
end_ = other.end_;
+ semantic_ = other.semantic_;
_unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
}
@@ -10849,7 +10906,7 @@
private int end_;
/// <summary>
/// Identifies the ending offset in bytes in the generated code that
- /// relates to the identified offset. The end offset should be one past
+ /// relates to the identified object. The end offset should be one past
/// the last relevant byte (so the length of the text = end - begin).
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@@ -10874,6 +10931,33 @@
_hasBits0 &= ~2;
}
+ /// <summary>Field number for the "semantic" field.</summary>
+ public const int SemanticFieldNumber = 5;
+ private readonly static global::Google.Protobuf.Reflection.GeneratedCodeInfo.Types.Annotation.Types.Semantic SemanticDefaultValue = global::Google.Protobuf.Reflection.GeneratedCodeInfo.Types.Annotation.Types.Semantic.None;
+
+ private global::Google.Protobuf.Reflection.GeneratedCodeInfo.Types.Annotation.Types.Semantic semantic_;
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public global::Google.Protobuf.Reflection.GeneratedCodeInfo.Types.Annotation.Types.Semantic Semantic {
+ get { if ((_hasBits0 & 4) != 0) { return semantic_; } else { return SemanticDefaultValue; } }
+ set {
+ _hasBits0 |= 4;
+ semantic_ = value;
+ }
+ }
+ /// <summary>Gets whether the "semantic" field is set</summary>
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public bool HasSemantic {
+ get { return (_hasBits0 & 4) != 0; }
+ }
+ /// <summary>Clears the value of the "semantic" field</summary>
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public void ClearSemantic() {
+ _hasBits0 &= ~4;
+ }
+
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public override bool Equals(object other) {
@@ -10893,6 +10977,7 @@
if (SourceFile != other.SourceFile) return false;
if (Begin != other.Begin) return false;
if (End != other.End) return false;
+ if (Semantic != other.Semantic) return false;
return Equals(_unknownFields, other._unknownFields);
}
@@ -10904,6 +10989,7 @@
if (HasSourceFile) hash ^= SourceFile.GetHashCode();
if (HasBegin) hash ^= Begin.GetHashCode();
if (HasEnd) hash ^= End.GetHashCode();
+ if (HasSemantic) hash ^= Semantic.GetHashCode();
if (_unknownFields != null) {
hash ^= _unknownFields.GetHashCode();
}
@@ -10935,6 +11021,10 @@
output.WriteRawTag(32);
output.WriteInt32(End);
}
+ if (HasSemantic) {
+ output.WriteRawTag(40);
+ output.WriteEnum((int) Semantic);
+ }
if (_unknownFields != null) {
_unknownFields.WriteTo(output);
}
@@ -10958,6 +11048,10 @@
output.WriteRawTag(32);
output.WriteInt32(End);
}
+ if (HasSemantic) {
+ output.WriteRawTag(40);
+ output.WriteEnum((int) Semantic);
+ }
if (_unknownFields != null) {
_unknownFields.WriteTo(ref output);
}
@@ -10978,6 +11072,9 @@
if (HasEnd) {
size += 1 + pb::CodedOutputStream.ComputeInt32Size(End);
}
+ if (HasSemantic) {
+ size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Semantic);
+ }
if (_unknownFields != null) {
size += _unknownFields.CalculateSize();
}
@@ -11000,6 +11097,9 @@
if (other.HasEnd) {
End = other.End;
}
+ if (other.HasSemantic) {
+ Semantic = other.Semantic;
+ }
_unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
}
@@ -11032,6 +11132,10 @@
End = input.ReadInt32();
break;
}
+ case 40: {
+ Semantic = (global::Google.Protobuf.Reflection.GeneratedCodeInfo.Types.Annotation.Types.Semantic) input.ReadEnum();
+ break;
+ }
}
}
#endif
@@ -11064,11 +11168,42 @@
End = input.ReadInt32();
break;
}
+ case 40: {
+ Semantic = (global::Google.Protobuf.Reflection.GeneratedCodeInfo.Types.Annotation.Types.Semantic) input.ReadEnum();
+ break;
+ }
}
}
}
#endif
+ #region Nested types
+ /// <summary>Container for nested types declared in the Annotation message type.</summary>
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+ public static partial class Types {
+ /// <summary>
+ /// Represents the identified object's effect on the element in the original
+ /// .proto file.
+ /// </summary>
+ public enum Semantic {
+ /// <summary>
+ /// There is no effect or the effect is indescribable.
+ /// </summary>
+ [pbr::OriginalName("NONE")] None = 0,
+ /// <summary>
+ /// The element is set or otherwise mutated.
+ /// </summary>
+ [pbr::OriginalName("SET")] Set = 1,
+ /// <summary>
+ /// An alias to the element is returned.
+ /// </summary>
+ [pbr::OriginalName("ALIAS")] Alias = 2,
+ }
+
+ }
+ #endregion
+
}
}
diff --git a/csharp/src/Google.Protobuf/Reflection/DescriptorDeclaration.cs b/csharp/src/Google.Protobuf/Reflection/DescriptorDeclaration.cs
index b22048f..3c7fac2 100644
--- a/csharp/src/Google.Protobuf/Reflection/DescriptorDeclaration.cs
+++ b/csharp/src/Google.Protobuf/Reflection/DescriptorDeclaration.cs
@@ -30,11 +30,9 @@
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#endregion
-using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
-using System.Text;
using static Google.Protobuf.Reflection.SourceCodeInfo.Types;
namespace Google.Protobuf.Reflection
diff --git a/csharp/src/Google.Protobuf/Reflection/DescriptorPool.cs b/csharp/src/Google.Protobuf/Reflection/DescriptorPool.cs
index 93f2fa9..5128ad9 100644
--- a/csharp/src/Google.Protobuf/Reflection/DescriptorPool.cs
+++ b/csharp/src/Google.Protobuf/Reflection/DescriptorPool.cs
@@ -51,12 +51,11 @@
private readonly IDictionary<ObjectIntPair<IDescriptor>, EnumValueDescriptor> enumValuesByNumber =
new Dictionary<ObjectIntPair<IDescriptor>, EnumValueDescriptor>();
- private readonly HashSet<FileDescriptor> dependencies;
+ private readonly HashSet<FileDescriptor> dependencies = new HashSet<FileDescriptor>();
internal DescriptorPool(IEnumerable<FileDescriptor> dependencyFiles)
{
- dependencies = new HashSet<FileDescriptor>();
- foreach (var dependencyFile in dependencyFiles)
+ foreach (FileDescriptor dependencyFile in dependencyFiles)
{
dependencies.Add(dependencyFile);
ImportPublicDependencies(dependencyFile);
@@ -88,10 +87,8 @@
/// or null if the symbol doesn't exist or has the wrong type</returns>
internal T FindSymbol<T>(string fullName) where T : class
{
- IDescriptor result;
- descriptorsByName.TryGetValue(fullName, out result);
- T descriptor = result as T;
- if (descriptor != null)
+ descriptorsByName.TryGetValue(fullName, out IDescriptor result);
+ if (result is T descriptor)
{
return descriptor;
}
@@ -131,10 +128,9 @@
name = fullName;
}
- IDescriptor old;
- if (descriptorsByName.TryGetValue(fullName, out old))
+ if (descriptorsByName.TryGetValue(fullName, out IDescriptor old))
{
- if (!(old is PackageDescriptor))
+ if (old is not PackageDescriptor)
{
throw new DescriptorValidationException(file,
"\"" + name +
@@ -153,10 +149,9 @@
internal void AddSymbol(IDescriptor descriptor)
{
ValidateSymbolName(descriptor);
- String fullName = descriptor.FullName;
+ string fullName = descriptor.FullName;
- IDescriptor old;
- if (descriptorsByName.TryGetValue(fullName, out old))
+ if (descriptorsByName.TryGetValue(fullName, out IDescriptor old))
{
int dotPos = fullName.LastIndexOf('.');
string message;
@@ -181,8 +176,7 @@
descriptorsByName[fullName] = descriptor;
}
- private static readonly Regex ValidationRegex = new Regex("^[_A-Za-z][_A-Za-z0-9]*$",
- FrameworkPortability.CompiledRegexWhereAvailable);
+ private static readonly Regex ValidationRegex = new Regex("^[_A-Za-z][_A-Za-z0-9]*$", FrameworkPortability.CompiledRegexWhereAvailable);
/// <summary>
/// Verifies that the descriptor's name is valid (i.e. it contains
@@ -191,7 +185,7 @@
/// <param name="descriptor"></param>
private static void ValidateSymbolName(IDescriptor descriptor)
{
- if (descriptor.Name == "")
+ if (descriptor.Name.Length == 0)
{
throw new DescriptorValidationException(descriptor, "Missing name.");
}
@@ -208,15 +202,13 @@
/// </summary>
internal FieldDescriptor FindFieldByNumber(MessageDescriptor messageDescriptor, int number)
{
- FieldDescriptor ret;
- fieldsByNumber.TryGetValue(new ObjectIntPair<IDescriptor>(messageDescriptor, number), out ret);
+ fieldsByNumber.TryGetValue(new ObjectIntPair<IDescriptor>(messageDescriptor, number), out FieldDescriptor ret);
return ret;
}
internal EnumValueDescriptor FindEnumValueByNumber(EnumDescriptor enumDescriptor, int number)
{
- EnumValueDescriptor ret;
- enumValuesByNumber.TryGetValue(new ObjectIntPair<IDescriptor>(enumDescriptor, number), out ret);
+ enumValuesByNumber.TryGetValue(new ObjectIntPair<IDescriptor>(enumDescriptor, number), out EnumValueDescriptor ret);
return ret;
}
@@ -229,8 +221,7 @@
{
// for extensions, we use the extended type, otherwise we use the containing type
ObjectIntPair<IDescriptor> key = new ObjectIntPair<IDescriptor>(field.Proto.HasExtendee ? field.ExtendeeType : field.ContainingType, field.FieldNumber);
- FieldDescriptor old;
- if (fieldsByNumber.TryGetValue(key, out old))
+ if (fieldsByNumber.TryGetValue(key, out FieldDescriptor old))
{
throw new DescriptorValidationException(field, "Field number " + field.FieldNumber +
"has already been used in \"" +
diff --git a/csharp/src/Google.Protobuf/Reflection/DescriptorValidationException.cs b/csharp/src/Google.Protobuf/Reflection/DescriptorValidationException.cs
index 143671d..f48e8e1 100644
--- a/csharp/src/Google.Protobuf/Reflection/DescriptorValidationException.cs
+++ b/csharp/src/Google.Protobuf/Reflection/DescriptorValidationException.cs
@@ -40,25 +40,16 @@
/// </summary>
public sealed class DescriptorValidationException : Exception
{
- private readonly String name;
- private readonly string description;
-
/// <value>
/// The full name of the descriptor where the error occurred.
/// </value>
- public String ProblemSymbolName
- {
- get { return name; }
- }
+ public string ProblemSymbolName { get; }
/// <value>
/// A human-readable description of the error. (The Message property
/// is made up of the descriptor's name and this description.)
/// </value>
- public string Description
- {
- get { return description; }
- }
+ public string Description { get; }
internal DescriptorValidationException(IDescriptor problemDescriptor, string description) :
base(problemDescriptor.FullName + ": " + description)
@@ -66,15 +57,15 @@
// Note that problemDescriptor may be partially uninitialized, so we
// don't want to expose it directly to the user. So, we only provide
// the name and the original proto.
- name = problemDescriptor.FullName;
- this.description = description;
+ ProblemSymbolName = problemDescriptor.FullName;
+ Description = description;
}
internal DescriptorValidationException(IDescriptor problemDescriptor, string description, Exception cause) :
base(problemDescriptor.FullName + ": " + description, cause)
{
- name = problemDescriptor.FullName;
- this.description = description;
+ ProblemSymbolName = problemDescriptor.FullName;
+ Description = description;
}
}
}
\ No newline at end of file
diff --git a/csharp/src/Google.Protobuf/Reflection/EnumDescriptor.cs b/csharp/src/Google.Protobuf/Reflection/EnumDescriptor.cs
index 3f2e1c4..a14cc1d 100644
--- a/csharp/src/Google.Protobuf/Reflection/EnumDescriptor.cs
+++ b/csharp/src/Google.Protobuf/Reflection/EnumDescriptor.cs
@@ -41,17 +41,12 @@
/// </summary>
public sealed class EnumDescriptor : DescriptorBase
{
- private readonly EnumDescriptorProto proto;
- private readonly MessageDescriptor containingType;
- private readonly IList<EnumValueDescriptor> values;
- private readonly Type clrType;
-
internal EnumDescriptor(EnumDescriptorProto proto, FileDescriptor file, MessageDescriptor parent, int index, Type clrType)
: base(file, file.ComputeFullName(parent, proto.Name), index)
{
- this.proto = proto;
- this.clrType = clrType;
- containingType = parent;
+ Proto = proto;
+ ClrType = clrType;
+ ContainingType = parent;
if (proto.Value.Count == 0)
{
@@ -60,13 +55,13 @@
throw new DescriptorValidationException(this, "Enums must contain at least one value.");
}
- values = DescriptorUtil.ConvertAndMakeReadOnly(proto.Value,
+ Values = DescriptorUtil.ConvertAndMakeReadOnly(proto.Value,
(value, i) => new EnumValueDescriptor(value, file, this, i));
File.DescriptorPool.AddSymbol(this);
}
- internal EnumDescriptorProto Proto { get { return proto; } }
+ internal EnumDescriptorProto Proto { get; }
/// <summary>
/// Returns a clone of the underlying <see cref="EnumDescriptorProto"/> describing this enum.
@@ -79,39 +74,29 @@
/// <summary>
/// The brief name of the descriptor's target.
/// </summary>
- public override string Name { get { return proto.Name; } }
+ public override string Name => Proto.Name;
- internal override IReadOnlyList<DescriptorBase> GetNestedDescriptorListForField(int fieldNumber)
- {
- switch (fieldNumber)
+ internal override IReadOnlyList<DescriptorBase> GetNestedDescriptorListForField(int fieldNumber) =>
+ fieldNumber switch
{
- case EnumDescriptorProto.ValueFieldNumber:
- return (IReadOnlyList<DescriptorBase>) Values;
- default:
- return null;
- }
- }
+ EnumDescriptorProto.ValueFieldNumber => (IReadOnlyList<DescriptorBase>)Values,
+ _ => null,
+ };
/// <summary>
/// The CLR type for this enum. For generated code, this will be a CLR enum type.
/// </summary>
- public Type ClrType { get { return clrType; } }
+ public Type ClrType { get; }
/// <value>
/// If this is a nested type, get the outer descriptor, otherwise null.
/// </value>
- public MessageDescriptor ContainingType
- {
- get { return containingType; }
- }
+ public MessageDescriptor ContainingType { get; }
/// <value>
/// An unmodifiable list of defined value descriptors for this enum.
/// </value>
- public IList<EnumValueDescriptor> Values
- {
- get { return values; }
- }
+ public IList<EnumValueDescriptor> Values { get; }
/// <summary>
/// Finds an enum value by number. If multiple enum values have the
diff --git a/csharp/src/Google.Protobuf/Reflection/EnumValueDescriptor.cs b/csharp/src/Google.Protobuf/Reflection/EnumValueDescriptor.cs
index 50b26a4..7a0cce0 100644
--- a/csharp/src/Google.Protobuf/Reflection/EnumValueDescriptor.cs
+++ b/csharp/src/Google.Protobuf/Reflection/EnumValueDescriptor.cs
@@ -40,20 +40,17 @@
/// </summary>
public sealed class EnumValueDescriptor : DescriptorBase
{
- private readonly EnumDescriptor enumDescriptor;
- private readonly EnumValueDescriptorProto proto;
-
internal EnumValueDescriptor(EnumValueDescriptorProto proto, FileDescriptor file,
EnumDescriptor parent, int index)
: base(file, parent.FullName + "." + proto.Name, index)
{
- this.proto = proto;
- enumDescriptor = parent;
+ Proto = proto;
+ EnumDescriptor = parent;
file.DescriptorPool.AddSymbol(this);
file.DescriptorPool.AddEnumValueByNumber(this);
}
- internal EnumValueDescriptorProto Proto { get { return proto; } }
+ internal EnumValueDescriptorProto Proto { get; }
/// <summary>
/// Returns a clone of the underlying <see cref="EnumValueDescriptorProto"/> describing this enum value.
@@ -66,17 +63,17 @@
/// <summary>
/// Returns the name of the enum value described by this object.
/// </summary>
- public override string Name { get { return proto.Name; } }
+ public override string Name => Proto.Name;
/// <summary>
/// Returns the number associated with this enum value.
/// </summary>
- public int Number { get { return Proto.Number; } }
+ public int Number => Proto.Number;
/// <summary>
/// Returns the enum descriptor that this value is part of.
/// </summary>
- public EnumDescriptor EnumDescriptor { get { return enumDescriptor; } }
+ public EnumDescriptor EnumDescriptor { get; }
/// <summary>
/// The (possibly empty) set of custom options for this enum value.
diff --git a/csharp/src/Google.Protobuf/Reflection/ExtensionCollection.cs b/csharp/src/Google.Protobuf/Reflection/ExtensionCollection.cs
index ca874f9..1e10060 100644
--- a/csharp/src/Google.Protobuf/Reflection/ExtensionCollection.cs
+++ b/csharp/src/Google.Protobuf/Reflection/ExtensionCollection.cs
@@ -107,8 +107,7 @@
{
descriptor.CrossLink();
- IList<FieldDescriptor> list;
- if (!declarationOrder.TryGetValue(descriptor.ExtendeeType, out list))
+ if (!declarationOrder.TryGetValue(descriptor.ExtendeeType, out IList<FieldDescriptor> list))
{
list = new List<FieldDescriptor>();
declarationOrder.Add(descriptor.ExtendeeType, list);
diff --git a/csharp/src/Google.Protobuf/Reflection/FieldAccessorBase.cs b/csharp/src/Google.Protobuf/Reflection/FieldAccessorBase.cs
index 85b7d39..156025d 100644
--- a/csharp/src/Google.Protobuf/Reflection/FieldAccessorBase.cs
+++ b/csharp/src/Google.Protobuf/Reflection/FieldAccessorBase.cs
@@ -42,15 +42,14 @@
internal abstract class FieldAccessorBase : IFieldAccessor
{
private readonly Func<IMessage, object> getValueDelegate;
- private readonly FieldDescriptor descriptor;
internal FieldAccessorBase(PropertyInfo property, FieldDescriptor descriptor)
{
- this.descriptor = descriptor;
+ Descriptor = descriptor;
getValueDelegate = ReflectionUtil.CreateFuncIMessageObject(property.GetGetMethod());
}
- public FieldDescriptor Descriptor { get { return descriptor; } }
+ public FieldDescriptor Descriptor { get; }
public object GetValue(IMessage message)
{
diff --git a/csharp/src/Google.Protobuf/Reflection/FieldDescriptor.cs b/csharp/src/Google.Protobuf/Reflection/FieldDescriptor.cs
index 84ad49d..e4fd7d2 100644
--- a/csharp/src/Google.Protobuf/Reflection/FieldDescriptor.cs
+++ b/csharp/src/Google.Protobuf/Reflection/FieldDescriptor.cs
@@ -176,47 +176,28 @@
/// </summary>
private static FieldType GetFieldTypeFromProtoType(FieldDescriptorProto.Types.Type type)
{
- switch (type)
+ return type switch
{
- case FieldDescriptorProto.Types.Type.Double:
- return FieldType.Double;
- case FieldDescriptorProto.Types.Type.Float:
- return FieldType.Float;
- case FieldDescriptorProto.Types.Type.Int64:
- return FieldType.Int64;
- case FieldDescriptorProto.Types.Type.Uint64:
- return FieldType.UInt64;
- case FieldDescriptorProto.Types.Type.Int32:
- return FieldType.Int32;
- case FieldDescriptorProto.Types.Type.Fixed64:
- return FieldType.Fixed64;
- case FieldDescriptorProto.Types.Type.Fixed32:
- return FieldType.Fixed32;
- case FieldDescriptorProto.Types.Type.Bool:
- return FieldType.Bool;
- case FieldDescriptorProto.Types.Type.String:
- return FieldType.String;
- case FieldDescriptorProto.Types.Type.Group:
- return FieldType.Group;
- case FieldDescriptorProto.Types.Type.Message:
- return FieldType.Message;
- case FieldDescriptorProto.Types.Type.Bytes:
- return FieldType.Bytes;
- case FieldDescriptorProto.Types.Type.Uint32:
- return FieldType.UInt32;
- case FieldDescriptorProto.Types.Type.Enum:
- return FieldType.Enum;
- case FieldDescriptorProto.Types.Type.Sfixed32:
- return FieldType.SFixed32;
- case FieldDescriptorProto.Types.Type.Sfixed64:
- return FieldType.SFixed64;
- case FieldDescriptorProto.Types.Type.Sint32:
- return FieldType.SInt32;
- case FieldDescriptorProto.Types.Type.Sint64:
- return FieldType.SInt64;
- default:
- throw new ArgumentException("Invalid type specified");
- }
+ FieldDescriptorProto.Types.Type.Double => FieldType.Double,
+ FieldDescriptorProto.Types.Type.Float => FieldType.Float,
+ FieldDescriptorProto.Types.Type.Int64 => FieldType.Int64,
+ FieldDescriptorProto.Types.Type.Uint64 => FieldType.UInt64,
+ FieldDescriptorProto.Types.Type.Int32 => FieldType.Int32,
+ FieldDescriptorProto.Types.Type.Fixed64 => FieldType.Fixed64,
+ FieldDescriptorProto.Types.Type.Fixed32 => FieldType.Fixed32,
+ FieldDescriptorProto.Types.Type.Bool => FieldType.Bool,
+ FieldDescriptorProto.Types.Type.String => FieldType.String,
+ FieldDescriptorProto.Types.Type.Group => FieldType.Group,
+ FieldDescriptorProto.Types.Type.Message => FieldType.Message,
+ FieldDescriptorProto.Types.Type.Bytes => FieldType.Bytes,
+ FieldDescriptorProto.Types.Type.Uint32 => FieldType.UInt32,
+ FieldDescriptorProto.Types.Type.Enum => FieldType.Enum,
+ FieldDescriptorProto.Types.Type.Sfixed32 => FieldType.SFixed32,
+ FieldDescriptorProto.Types.Type.Sfixed64 => FieldType.SFixed64,
+ FieldDescriptorProto.Types.Type.Sint32 => FieldType.SInt32,
+ FieldDescriptorProto.Types.Type.Sint64 => FieldType.SInt64,
+ _ => throw new ArgumentException("Invalid type specified"),
+ };
}
/// <summary>
@@ -391,11 +372,11 @@
if (fieldType == FieldType.Message || fieldType == FieldType.Group)
{
- if (!(typeDescriptor is MessageDescriptor))
+ if (typeDescriptor is not MessageDescriptor m)
{
throw new DescriptorValidationException(this, $"\"{Proto.TypeName}\" is not a message type.");
}
- messageType = (MessageDescriptor) typeDescriptor;
+ messageType = m;
if (Proto.HasDefaultValue)
{
@@ -404,11 +385,11 @@
}
else if (fieldType == FieldType.Enum)
{
- if (!(typeDescriptor is EnumDescriptor))
+ if (typeDescriptor is not EnumDescriptor e)
{
throw new DescriptorValidationException(this, $"\"{Proto.TypeName}\" is not an enum type.");
}
- enumType = (EnumDescriptor) typeDescriptor;
+ enumType = e;
}
else
{
diff --git a/csharp/src/Google.Protobuf/Reflection/FileDescriptor.cs b/csharp/src/Google.Protobuf/Reflection/FileDescriptor.cs
index d7701da..cb711de 100644
--- a/csharp/src/Google.Protobuf/Reflection/FileDescriptor.cs
+++ b/csharp/src/Google.Protobuf/Reflection/FileDescriptor.cs
@@ -35,7 +35,6 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
-using System.Diagnostics;
using System.Linq;
using System.Threading;
using static Google.Protobuf.Reflection.SourceCodeInfo.Types;
@@ -173,25 +172,18 @@
return list[index];
}
- private IReadOnlyList<DescriptorBase> GetNestedDescriptorListForField(int fieldNumber)
- {
- switch (fieldNumber)
+ private IReadOnlyList<DescriptorBase> GetNestedDescriptorListForField(int fieldNumber) =>
+ fieldNumber switch
{
- case FileDescriptorProto.ServiceFieldNumber:
- return (IReadOnlyList<DescriptorBase>) Services;
- case FileDescriptorProto.MessageTypeFieldNumber:
- return (IReadOnlyList<DescriptorBase>) MessageTypes;
- case FileDescriptorProto.EnumTypeFieldNumber:
- return (IReadOnlyList<DescriptorBase>) EnumTypes;
- default:
- return null;
- }
- }
+ FileDescriptorProto.ServiceFieldNumber => (IReadOnlyList<DescriptorBase>)Services,
+ FileDescriptorProto.MessageTypeFieldNumber => (IReadOnlyList<DescriptorBase>)MessageTypes,
+ FileDescriptorProto.EnumTypeFieldNumber => (IReadOnlyList<DescriptorBase>)EnumTypes,
+ _ => null,
+ };
internal DescriptorDeclaration GetDeclaration(IDescriptor descriptor)
{
- DescriptorDeclaration declaration;
- declarations.Value.TryGetValue(descriptor, out declaration);
+ declarations.Value.TryGetValue(descriptor, out DescriptorDeclaration declaration);
return declaration;
}
@@ -227,8 +219,7 @@
throw new DescriptorValidationException(@this, "Invalid public dependency index.");
}
string name = proto.Dependency[index];
- FileDescriptor file;
- if (!nameToFileMap.TryGetValue(name, out file))
+ if (!nameToFileMap.TryGetValue(name, out FileDescriptor file))
{
if (!allowUnknownDependencies)
{
@@ -332,7 +323,7 @@
/// <param name="name">The unqualified type name to look for.</param>
/// <typeparam name="T">The type of descriptor to look for</typeparam>
/// <returns>The type's descriptor, or null if not found.</returns>
- public T FindTypeByName<T>(String name)
+ public T FindTypeByName<T>(string name)
where T : class, IDescriptor
{
// Don't allow looking up nested types. This will make optimization
@@ -507,8 +498,7 @@
var dependencies = new List<FileDescriptor>();
foreach (var dependencyName in proto.Dependency)
{
- FileDescriptor dependency;
- if (!descriptorsByName.TryGetValue(dependencyName, out dependency))
+ if (!descriptorsByName.TryGetValue(dependencyName, out FileDescriptor dependency))
{
throw new ArgumentException($"Dependency missing: {dependencyName}");
}
@@ -565,7 +555,7 @@
/// <value>
/// The file descriptor for <c>descriptor.proto</c>.
/// </value>
- public static FileDescriptor DescriptorProtoFileDescriptor { get { return DescriptorReflection.Descriptor; } }
+ public static FileDescriptor DescriptorProtoFileDescriptor => DescriptorReflection.Descriptor;
/// <summary>
/// The (possibly empty) set of custom options for this file.
diff --git a/csharp/src/Google.Protobuf/Reflection/GeneratedClrTypeInfo.cs b/csharp/src/Google.Protobuf/Reflection/GeneratedClrTypeInfo.cs
index d0a495b..dbf16c6 100644
--- a/csharp/src/Google.Protobuf/Reflection/GeneratedClrTypeInfo.cs
+++ b/csharp/src/Google.Protobuf/Reflection/GeneratedClrTypeInfo.cs
@@ -29,6 +29,7 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#endregion
+
using System;
using System.Diagnostics.CodeAnalysis;
@@ -57,7 +58,7 @@
/// Irrelevant for file descriptors; the CLR type for the message for message descriptors.
/// </summary>
[DynamicallyAccessedMembers(MessageAccessibility)]
- public Type ClrType { get; private set; }
+ public Type ClrType { get; }
/// <summary>
/// Irrelevant for file descriptors; the parser for message descriptors.
diff --git a/csharp/src/Google.Protobuf/Reflection/MessageDescriptor.cs b/csharp/src/Google.Protobuf/Reflection/MessageDescriptor.cs
index 40a6ff8..f2bb61c 100644
--- a/csharp/src/Google.Protobuf/Reflection/MessageDescriptor.cs
+++ b/csharp/src/Google.Protobuf/Reflection/MessageDescriptor.cs
@@ -36,10 +36,6 @@
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Reflection;
-#if NET35
-// Needed for ReadOnlyDictionary, which does not exist in .NET 3.5
-using Google.Protobuf.Collections;
-#endif
namespace Google.Protobuf.Reflection
{
@@ -134,20 +130,14 @@
/// </summary>
public override string Name => Proto.Name;
- internal override IReadOnlyList<DescriptorBase> GetNestedDescriptorListForField(int fieldNumber)
- {
- switch (fieldNumber)
+ internal override IReadOnlyList<DescriptorBase> GetNestedDescriptorListForField(int fieldNumber) =>
+ fieldNumber switch
{
- case DescriptorProto.FieldFieldNumber:
- return (IReadOnlyList<DescriptorBase>) fieldsInDeclarationOrder;
- case DescriptorProto.NestedTypeFieldNumber:
- return (IReadOnlyList<DescriptorBase>) NestedTypes;
- case DescriptorProto.EnumTypeFieldNumber:
- return (IReadOnlyList<DescriptorBase>) EnumTypes;
- default:
- return null;
- }
- }
+ DescriptorProto.FieldFieldNumber => (IReadOnlyList<DescriptorBase>)fieldsInDeclarationOrder,
+ DescriptorProto.NestedTypeFieldNumber => (IReadOnlyList<DescriptorBase>)NestedTypes,
+ DescriptorProto.EnumTypeFieldNumber => (IReadOnlyList<DescriptorBase>)EnumTypes,
+ _ => null,
+ };
internal DescriptorProto Proto { get; }
@@ -276,7 +266,7 @@
/// </summary>
/// <param name="name">The unqualified name of the field (e.g. "foo").</param>
/// <returns>The field's descriptor, or null if not found.</returns>
- public FieldDescriptor FindFieldByName(String name) => File.DescriptorPool.FindSymbol<FieldDescriptor>(FullName + "." + name);
+ public FieldDescriptor FindFieldByName(string name) => File.DescriptorPool.FindSymbol<FieldDescriptor>(FullName + "." + name);
/// <summary>
/// Finds a field by field number.
diff --git a/csharp/src/Google.Protobuf/Reflection/MethodDescriptor.cs b/csharp/src/Google.Protobuf/Reflection/MethodDescriptor.cs
index f5ecf2e..4f0ea43 100644
--- a/csharp/src/Google.Protobuf/Reflection/MethodDescriptor.cs
+++ b/csharp/src/Google.Protobuf/Reflection/MethodDescriptor.cs
@@ -40,35 +40,31 @@
/// </summary>
public sealed class MethodDescriptor : DescriptorBase
{
- private readonly MethodDescriptorProto proto;
- private readonly ServiceDescriptor service;
- private MessageDescriptor inputType;
- private MessageDescriptor outputType;
/// <value>
/// The service this method belongs to.
/// </value>
- public ServiceDescriptor Service { get { return service; } }
+ public ServiceDescriptor Service { get; }
/// <value>
/// The method's input type.
/// </value>
- public MessageDescriptor InputType { get { return inputType; } }
+ public MessageDescriptor InputType { get; private set; }
/// <value>
/// The method's input type.
/// </value>
- public MessageDescriptor OutputType { get { return outputType; } }
+ public MessageDescriptor OutputType { get; private set; }
/// <value>
/// Indicates if client streams multiple requests.
/// </value>
- public bool IsClientStreaming { get { return proto.ClientStreaming; } }
+ public bool IsClientStreaming => Proto.ClientStreaming;
/// <value>
/// Indicates if server streams multiple responses.
/// </value>
- public bool IsServerStreaming { get { return proto.ServerStreaming; } }
+ public bool IsServerStreaming => Proto.ServerStreaming;
/// <summary>
/// The (possibly empty) set of custom options for this method.
@@ -91,7 +87,7 @@
public T GetOption<T>(Extension<MethodOptions, T> extension)
{
var value = Proto.Options.GetExtension(extension);
- return value is IDeepCloneable<T> ? (value as IDeepCloneable<T>).Clone() : value;
+ return value is IDeepCloneable<T> c ? c.Clone() : value;
}
/// <summary>
@@ -107,12 +103,12 @@
ServiceDescriptor parent, int index)
: base(file, parent.FullName + "." + proto.Name, index)
{
- this.proto = proto;
- service = parent;
+ Proto = proto;
+ Service = parent;
file.DescriptorPool.AddSymbol(this);
}
- internal MethodDescriptorProto Proto { get { return proto; } }
+ internal MethodDescriptorProto Proto { get; private set; }
/// <summary>
/// Returns a clone of the underlying <see cref="MethodDescriptorProto"/> describing this method.
@@ -125,23 +121,23 @@
/// <summary>
/// The brief name of the descriptor's target.
/// </summary>
- public override string Name { get { return proto.Name; } }
+ public override string Name => Proto.Name;
internal void CrossLink()
{
IDescriptor lookup = File.DescriptorPool.LookupSymbol(Proto.InputType, this);
- if (!(lookup is MessageDescriptor))
+ if (lookup is not MessageDescriptor inpoutType)
{
throw new DescriptorValidationException(this, "\"" + Proto.InputType + "\" is not a message type.");
}
- inputType = (MessageDescriptor) lookup;
+ InputType = inpoutType;
lookup = File.DescriptorPool.LookupSymbol(Proto.OutputType, this);
- if (!(lookup is MessageDescriptor))
+ if (lookup is not MessageDescriptor outputType)
{
throw new DescriptorValidationException(this, "\"" + Proto.OutputType + "\" is not a message type.");
}
- outputType = (MessageDescriptor) lookup;
+ OutputType = outputType;
}
}
}
diff --git a/csharp/src/Google.Protobuf/Reflection/OriginalNameAttribute.cs b/csharp/src/Google.Protobuf/Reflection/OriginalNameAttribute.cs
index 63f5228..880716a 100644
--- a/csharp/src/Google.Protobuf/Reflection/OriginalNameAttribute.cs
+++ b/csharp/src/Google.Protobuf/Reflection/OriginalNameAttribute.cs
@@ -60,6 +60,5 @@
Name = ProtoPreconditions.CheckNotNull(name, nameof(name));
PreferredAlias = true;
}
-
}
}
diff --git a/csharp/src/Google.Protobuf/Reflection/PackageDescriptor.cs b/csharp/src/Google.Protobuf/Reflection/PackageDescriptor.cs
index e547d83..0b6de81 100644
--- a/csharp/src/Google.Protobuf/Reflection/PackageDescriptor.cs
+++ b/csharp/src/Google.Protobuf/Reflection/PackageDescriptor.cs
@@ -39,30 +39,15 @@
/// </summary>
internal sealed class PackageDescriptor : IDescriptor
{
- private readonly string name;
- private readonly string fullName;
- private readonly FileDescriptor file;
-
internal PackageDescriptor(string name, string fullName, FileDescriptor file)
{
- this.file = file;
- this.fullName = fullName;
- this.name = name;
+ File = file;
+ FullName = fullName;
+ Name = name;
}
- public string Name
- {
- get { return name; }
- }
-
- public string FullName
- {
- get { return fullName; }
- }
-
- public FileDescriptor File
- {
- get { return file; }
- }
+ public string Name { get; }
+ public string FullName { get; }
+ public FileDescriptor File { get; }
}
}
\ No newline at end of file
diff --git a/csharp/src/Google.Protobuf/Reflection/ReflectionUtil.cs b/csharp/src/Google.Protobuf/Reflection/ReflectionUtil.cs
index 73efcc2..2a6afdb 100644
--- a/csharp/src/Google.Protobuf/Reflection/ReflectionUtil.cs
+++ b/csharp/src/Google.Protobuf/Reflection/ReflectionUtil.cs
@@ -221,20 +221,18 @@
public object GetExtension(IMessage message)
{
- if (!(message is T1))
+ if (message is not T1 extensionMessage)
{
throw new InvalidCastException("Cannot access extension on message that isn't IExtensionMessage");
}
- T1 extensionMessage = (T1)message;
-
- if (extension is Extension<T1, T3>)
+ if (extension is Extension<T1, T3> ext13)
{
- return extensionMessage.GetExtension(extension as Extension<T1, T3>);
+ return extensionMessage.GetExtension(ext13);
}
- else if (extension is RepeatedExtension<T1, T3>)
+ else if (extension is RepeatedExtension<T1, T3> repeatedExt13)
{
- return extensionMessage.GetOrInitializeExtension(extension as RepeatedExtension<T1, T3>);
+ return extensionMessage.GetOrInitializeExtension(repeatedExt13);
}
else
{
@@ -244,16 +242,14 @@
public bool HasExtension(IMessage message)
{
- if (!(message is T1))
+ if (message is not T1 extensionMessage)
{
throw new InvalidCastException("Cannot access extension on message that isn't IExtensionMessage");
}
- T1 extensionMessage = (T1)message;
-
- if (extension is Extension<T1, T3>)
+ if (extension is Extension<T1, T3> ext13)
{
- return extensionMessage.HasExtension(extension as Extension<T1, T3>);
+ return extensionMessage.HasExtension(ext13);
}
else if (extension is RepeatedExtension<T1, T3>)
{
@@ -267,16 +263,14 @@
public void SetExtension(IMessage message, object value)
{
- if (!(message is T1))
+ if (message is not T1 extensionMessage)
{
throw new InvalidCastException("Cannot access extension on message that isn't IExtensionMessage");
}
- T1 extensionMessage = (T1)message;
-
- if (extension is Extension<T1, T3>)
+ if (extension is Extension<T1, T3> ext13)
{
- extensionMessage.SetExtension(extension as Extension<T1, T3>, (T3)value);
+ extensionMessage.SetExtension(ext13, (T3)value);
}
else if (extension is RepeatedExtension<T1, T3>)
{
@@ -290,20 +284,18 @@
public void ClearExtension(IMessage message)
{
- if (!(message is T1))
+ if (message is not T1 extensionMessage)
{
throw new InvalidCastException("Cannot access extension on message that isn't IExtensionMessage");
}
- T1 extensionMessage = (T1)message;
-
- if (extension is Extension<T1, T3>)
+ if (extension is Extension<T1, T3> ext13)
{
- extensionMessage.ClearExtension(extension as Extension<T1, T3>);
+ extensionMessage.ClearExtension(ext13);
}
- else if (extension is RepeatedExtension<T1, T3>)
+ else if (extension is RepeatedExtension<T1, T3> repeatedExt13)
{
- extensionMessage.GetExtension(extension as RepeatedExtension<T1, T3>).Clear();
+ extensionMessage.GetExtension(repeatedExt13).Clear();
}
else
{
diff --git a/csharp/src/Google.Protobuf/Reflection/RepeatedFieldAccessor.cs b/csharp/src/Google.Protobuf/Reflection/RepeatedFieldAccessor.cs
index afb4a69..2073be3 100644
--- a/csharp/src/Google.Protobuf/Reflection/RepeatedFieldAccessor.cs
+++ b/csharp/src/Google.Protobuf/Reflection/RepeatedFieldAccessor.cs
@@ -60,6 +60,5 @@
{
throw new InvalidOperationException("SetValue is not implemented for repeated fields");
}
-
}
}
diff --git a/csharp/src/Google.Protobuf/Reflection/ServiceDescriptor.cs b/csharp/src/Google.Protobuf/Reflection/ServiceDescriptor.cs
index 944ea11..55d812b 100644
--- a/csharp/src/Google.Protobuf/Reflection/ServiceDescriptor.cs
+++ b/csharp/src/Google.Protobuf/Reflection/ServiceDescriptor.cs
@@ -33,7 +33,6 @@
using Google.Protobuf.Collections;
using System;
using System.Collections.Generic;
-using System.Collections.ObjectModel;
namespace Google.Protobuf.Reflection
{
@@ -42,14 +41,11 @@
/// </summary>
public sealed class ServiceDescriptor : DescriptorBase
{
- private readonly ServiceDescriptorProto proto;
- private readonly IList<MethodDescriptor> methods;
-
internal ServiceDescriptor(ServiceDescriptorProto proto, FileDescriptor file, int index)
: base(file, file.ComputeFullName(null, proto.Name), index)
{
- this.proto = proto;
- methods = DescriptorUtil.ConvertAndMakeReadOnly(proto.Method,
+ Proto = proto;
+ Methods = DescriptorUtil.ConvertAndMakeReadOnly(proto.Method,
(method, i) => new MethodDescriptor(method, file, this, i));
file.DescriptorPool.AddSymbol(this);
@@ -58,20 +54,16 @@
/// <summary>
/// The brief name of the descriptor's target.
/// </summary>
- public override string Name { get { return proto.Name; } }
+ public override string Name => Proto.Name;
- internal override IReadOnlyList<DescriptorBase> GetNestedDescriptorListForField(int fieldNumber)
- {
- switch (fieldNumber)
+ internal override IReadOnlyList<DescriptorBase> GetNestedDescriptorListForField(int fieldNumber) =>
+ fieldNumber switch
{
- case ServiceDescriptorProto.MethodFieldNumber:
- return (IReadOnlyList<DescriptorBase>) methods;
- default:
- return null;
- }
- }
+ ServiceDescriptorProto.MethodFieldNumber => (IReadOnlyList<DescriptorBase>)Methods,
+ _ => null,
+ };
- internal ServiceDescriptorProto Proto { get { return proto; } }
+ internal ServiceDescriptorProto Proto { get; }
/// <summary>
/// Returns a clone of the underlying <see cref="ServiceDescriptorProto"/> describing this service.
@@ -84,20 +76,15 @@
/// <value>
/// An unmodifiable list of methods in this service.
/// </value>
- public IList<MethodDescriptor> Methods
- {
- get { return methods; }
- }
+ public IList<MethodDescriptor> Methods { get; }
/// <summary>
/// Finds a method by name.
/// </summary>
/// <param name="name">The unqualified name of the method (e.g. "Foo").</param>
/// <returns>The method's descriptor, or null if not found.</returns>
- public MethodDescriptor FindMethodByName(String name)
- {
- return File.DescriptorPool.FindSymbol<MethodDescriptor>(FullName + "." + name);
- }
+ public MethodDescriptor FindMethodByName(string name) =>
+ File.DescriptorPool.FindSymbol<MethodDescriptor>(FullName + "." + name);
/// <summary>
/// The (possibly empty) set of custom options for this service.
@@ -134,7 +121,7 @@
internal void CrossLink()
{
- foreach (MethodDescriptor method in methods)
+ foreach (MethodDescriptor method in Methods)
{
method.CrossLink();
}
diff --git a/csharp/src/Google.Protobuf/Reflection/SingleFieldAccessor.cs b/csharp/src/Google.Protobuf/Reflection/SingleFieldAccessor.cs
index ac35e72..284effe 100644
--- a/csharp/src/Google.Protobuf/Reflection/SingleFieldAccessor.cs
+++ b/csharp/src/Google.Protobuf/Reflection/SingleFieldAccessor.cs
@@ -31,7 +31,6 @@
#endregion
using System;
-using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Reflection;
using Google.Protobuf.Compatibility;
@@ -108,7 +107,7 @@
// Primitive proto3 fields without the optional keyword, which aren't in oneofs.
else
{
- hasDelegate = message => { throw new InvalidOperationException("Presence is not implemented for this field"); };
+ hasDelegate = message => throw new InvalidOperationException("Presence is not implemented for this field");
// While presence isn't supported, clearing still is; it's just setting to a default value.
object defaultValue = GetDefaultValue(descriptor);
@@ -116,42 +115,21 @@
}
}
- private static object GetDefaultValue(FieldDescriptor descriptor)
- {
- switch (descriptor.FieldType)
+ private static object GetDefaultValue(FieldDescriptor descriptor) =>
+ descriptor.FieldType switch
{
- case FieldType.Bool:
- return false;
- case FieldType.Bytes:
- return ByteString.Empty;
- case FieldType.String:
- return "";
- case FieldType.Double:
- return 0.0;
- case FieldType.SInt32:
- case FieldType.Int32:
- case FieldType.SFixed32:
- case FieldType.Enum:
- return 0;
- case FieldType.Fixed32:
- case FieldType.UInt32:
- return (uint)0;
- case FieldType.Fixed64:
- case FieldType.UInt64:
- return 0UL;
- case FieldType.SFixed64:
- case FieldType.Int64:
- case FieldType.SInt64:
- return 0L;
- case FieldType.Float:
- return 0f;
- case FieldType.Message:
- case FieldType.Group: // Never expect to get this, but...
- return null;
- default:
- throw new ArgumentException("Invalid field type");
- }
- }
+ FieldType.Bool => false,
+ FieldType.Bytes => ByteString.Empty,
+ FieldType.String => "",
+ FieldType.Double => 0.0,
+ FieldType.SInt32 or FieldType.Int32 or FieldType.SFixed32 or FieldType.Enum => 0,
+ FieldType.Fixed32 or FieldType.UInt32 => (uint)0,
+ FieldType.Fixed64 or FieldType.UInt64 => 0UL,
+ FieldType.SFixed64 or FieldType.Int64 or FieldType.SInt64 => 0L,
+ FieldType.Float => 0f,
+ FieldType.Message or FieldType.Group => null,
+ _ => throw new ArgumentException("Invalid field type"),
+ };
public override void Clear(IMessage message) => clearDelegate(message);
public override bool HasValue(IMessage message) => hasDelegate(message);
diff --git a/csharp/src/Google.Protobuf/Reflection/TypeRegistry.cs b/csharp/src/Google.Protobuf/Reflection/TypeRegistry.cs
index e94e3e6..222bc7e 100644
--- a/csharp/src/Google.Protobuf/Reflection/TypeRegistry.cs
+++ b/csharp/src/Google.Protobuf/Reflection/TypeRegistry.cs
@@ -29,6 +29,7 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#endregion
+
using System.Collections.Generic;
using System.Linq;
@@ -60,9 +61,8 @@
/// if there is no such message descriptor.</returns>
public MessageDescriptor Find(string fullName)
{
- MessageDescriptor ret;
// Ignore the return value as ret will end up with the right value either way.
- fullNameToMessageMap.TryGetValue(fullName, out ret);
+ fullNameToMessageMap.TryGetValue(fullName, out MessageDescriptor ret);
return ret;
}
diff --git a/csharp/src/Google.Protobuf/UnknownField.cs b/csharp/src/Google.Protobuf/UnknownField.cs
index 4793a64..abec108 100644
--- a/csharp/src/Google.Protobuf/UnknownField.cs
+++ b/csharp/src/Google.Protobuf/UnknownField.cs
@@ -30,9 +30,7 @@
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#endregion
-using System;
using System.Collections.Generic;
-using System.Collections.ObjectModel;
using Google.Protobuf.Collections;
namespace Google.Protobuf
@@ -73,13 +71,12 @@
{
return true;
}
- UnknownField otherField = other as UnknownField;
- return otherField != null
- && Lists.Equals(varintList, otherField.varintList)
- && Lists.Equals(fixed32List, otherField.fixed32List)
- && Lists.Equals(fixed64List, otherField.fixed64List)
- && Lists.Equals(lengthDelimitedList, otherField.lengthDelimitedList)
- && Lists.Equals(groupList, otherField.groupList);
+ return other is UnknownField otherField
+ && Lists.Equals(varintList, otherField.varintList)
+ && Lists.Equals(fixed32List, otherField.fixed32List)
+ && Lists.Equals(fixed64List, otherField.fixed64List)
+ && Lists.Equals(lengthDelimitedList, otherField.lengthDelimitedList)
+ && Lists.Equals(groupList, otherField.groupList);
}
/// <summary>
diff --git a/csharp/src/Google.Protobuf/UnknownFieldSet.cs b/csharp/src/Google.Protobuf/UnknownFieldSet.cs
index 9888dd1..b97eb5e 100644
--- a/csharp/src/Google.Protobuf/UnknownFieldSet.cs
+++ b/csharp/src/Google.Protobuf/UnknownFieldSet.cs
@@ -32,9 +32,7 @@
using System;
using System.Collections.Generic;
-using System.IO;
using System.Security;
-using Google.Protobuf.Reflection;
namespace Google.Protobuf
{
@@ -49,14 +47,13 @@
/// </summary>
public sealed partial class UnknownFieldSet
{
- private readonly IDictionary<int, UnknownField> fields;
+ private readonly IDictionary<int, UnknownField> fields = new Dictionary<int, UnknownField>();
/// <summary>
/// Creates a new UnknownFieldSet.
/// </summary>
internal UnknownFieldSet()
{
- this.fields = new Dictionary<int, UnknownField>();
}
/// <summary>
@@ -125,8 +122,7 @@
}
foreach (KeyValuePair<int, UnknownField> leftEntry in fields)
{
- UnknownField rightValue;
- if (!otherFields.TryGetValue(leftEntry.Key, out rightValue))
+ if (!otherFields.TryGetValue(leftEntry.Key, out UnknownField rightValue))
{
return false;
}
@@ -170,8 +166,7 @@
return null;
}
- UnknownField existing;
- if (fields.TryGetValue(number, out existing))
+ if (fields.TryGetValue(number, out UnknownField existing))
{
return existing;
}
diff --git a/csharp/src/Google.Protobuf/WellKnownTypes/AnyPartial.cs b/csharp/src/Google.Protobuf/WellKnownTypes/AnyPartial.cs
index 5e7b6d5..04b64ab 100644
--- a/csharp/src/Google.Protobuf/WellKnownTypes/AnyPartial.cs
+++ b/csharp/src/Google.Protobuf/WellKnownTypes/AnyPartial.cs
@@ -112,7 +112,7 @@
T target = new T();
if (GetTypeName(TypeUrl) != target.Descriptor.FullName)
{
- result = default(T); // Can't use null as there's no class constraint, but this always *will* be null in real usage.
+ result = default; // Can't use null as there's no class constraint, but this always *will* be null in real usage.
return false;
}
target.MergeFrom(Value);
@@ -121,6 +121,26 @@
}
/// <summary>
+ /// Attempts to unpack the content of this Any message into one of the message types
+ /// in the given type registry, based on the type URL.
+ /// </summary>
+ /// <param name="registry">The type registry to consult for messages.</param>
+ /// <returns>The unpacked message, or <c>null</c> if no matching message was found.</returns>
+ public IMessage Unpack(TypeRegistry registry)
+ {
+ string typeName = GetTypeName(TypeUrl);
+ MessageDescriptor descriptor = registry.Find(typeName);
+ if (descriptor == null)
+ {
+ return null;
+ }
+
+ var message = descriptor.Parser.CreateTemplate();
+ message.MergeFrom(Value);
+ return message;
+ }
+
+ /// <summary>
/// Packs the specified message into an Any message using a type URL prefix of "type.googleapis.com".
/// </summary>
/// <param name="message">The message to pack.</param>
diff --git a/csharp/src/Google.Protobuf/WellKnownTypes/DurationPartial.cs b/csharp/src/Google.Protobuf/WellKnownTypes/DurationPartial.cs
index 9a468fc..cdf3c31 100644
--- a/csharp/src/Google.Protobuf/WellKnownTypes/DurationPartial.cs
+++ b/csharp/src/Google.Protobuf/WellKnownTypes/DurationPartial.cs
@@ -38,7 +38,7 @@
{
// Manually-written partial class for the Duration well-known type,
// providing a conversion to TimeSpan and convenience operators.
- public partial class Duration : ICustomDiagnosticMessage
+ public partial class Duration : ICustomDiagnosticMessage, IComparable<Duration>
{
/// <summary>
/// The number of nanoseconds in a second.
@@ -266,5 +266,26 @@
}
}
}
+
+
+ /// <summary>
+ /// Given another duration, returns 0 if the durations are equivalent, -1 if this duration is shorter than the other, and 1 otherwise.
+ /// </summary>
+ /// <remarks>
+ /// This method expects that both durations are normalized; that is, that the values of <see cref="Seconds"/>
+ /// and <see cref="Nanos"/> are within the documented bounds.
+ /// If either value is not normalized, the results of this method are unspecified.
+ /// </remarks>
+ /// <param name="other">The duration to compare with this object.</param>
+ /// <returns>An integer indicating whether this duration is shorter or longer than <paramref name="other"/>.</returns>
+ public int CompareTo(Duration other)
+ {
+ return other == null ? 1
+ : Seconds < other.Seconds ? -1
+ : Seconds > other.Seconds ? 1
+ : Nanos < other.Nanos ? -1
+ : Nanos > other.Nanos ? 1
+ : 0;
+ }
}
}
diff --git a/csharp/src/Google.Protobuf/WellKnownTypes/FieldMaskPartial.cs b/csharp/src/Google.Protobuf/WellKnownTypes/FieldMaskPartial.cs
index 58a33cb..dd00e2d 100644
--- a/csharp/src/Google.Protobuf/WellKnownTypes/FieldMaskPartial.cs
+++ b/csharp/src/Google.Protobuf/WellKnownTypes/FieldMaskPartial.cs
@@ -63,12 +63,7 @@
if (firstInvalid == null)
{
var writer = new StringWriter();
-#if NET35
- var query = paths.Select(JsonFormatter.ToJsonName);
- JsonFormatter.WriteString(writer, string.Join(",", query.ToArray()));
-#else
JsonFormatter.WriteString(writer, string.Join(",", paths.Select(JsonFormatter.ToJsonName)));
-#endif
return writer.ToString();
}
else
diff --git a/csharp/src/Google.Protobuf/WellKnownTypes/Struct.cs b/csharp/src/Google.Protobuf/WellKnownTypes/Struct.cs
index 8c1eec5..aa25686 100644
--- a/csharp/src/Google.Protobuf/WellKnownTypes/Struct.cs
+++ b/csharp/src/Google.Protobuf/WellKnownTypes/Struct.cs
@@ -212,7 +212,7 @@
if (other == null) {
return;
}
- fields_.Add(other.fields_);
+ fields_.MergeFrom(other.fields_);
_unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
}
diff --git a/csharp/src/Google.Protobuf/WellKnownTypes/TimestampPartial.cs b/csharp/src/Google.Protobuf/WellKnownTypes/TimestampPartial.cs
index 2f5172f..c52147f 100644
--- a/csharp/src/Google.Protobuf/WellKnownTypes/TimestampPartial.cs
+++ b/csharp/src/Google.Protobuf/WellKnownTypes/TimestampPartial.cs
@@ -59,8 +59,8 @@
/// <returns>The difference between the two specified timestamps.</returns>
public static Duration operator -(Timestamp lhs, Timestamp rhs)
{
- ProtoPreconditions.CheckNotNull(lhs, "lhs");
- ProtoPreconditions.CheckNotNull(rhs, "rhs");
+ ProtoPreconditions.CheckNotNull(lhs, nameof(lhs));
+ ProtoPreconditions.CheckNotNull(rhs, nameof(rhs));
checked
{
return Duration.Normalize(lhs.Seconds - rhs.Seconds, lhs.Nanos - rhs.Nanos);
@@ -75,8 +75,8 @@
/// <returns>The result of adding the duration to the timestamp.</returns>
public static Timestamp operator +(Timestamp lhs, Duration rhs)
{
- ProtoPreconditions.CheckNotNull(lhs, "lhs");
- ProtoPreconditions.CheckNotNull(rhs, "rhs");
+ ProtoPreconditions.CheckNotNull(lhs, nameof(lhs));
+ ProtoPreconditions.CheckNotNull(rhs, nameof(rhs));
checked
{
return Normalize(lhs.Seconds + rhs.Seconds, lhs.Nanos + rhs.Nanos);
@@ -91,8 +91,8 @@
/// <returns>The result of subtracting the duration from the timestamp.</returns>
public static Timestamp operator -(Timestamp lhs, Duration rhs)
{
- ProtoPreconditions.CheckNotNull(lhs, "lhs");
- ProtoPreconditions.CheckNotNull(rhs, "rhs");
+ ProtoPreconditions.CheckNotNull(lhs, nameof(lhs));
+ ProtoPreconditions.CheckNotNull(rhs, nameof(rhs));
checked
{
return Normalize(lhs.Seconds - rhs.Seconds, lhs.Nanos - rhs.Nanos);
@@ -308,7 +308,7 @@
/// <returns>true if the two timestamps refer to the same nanosecond</returns>
public static bool operator ==(Timestamp a, Timestamp b)
{
- return ReferenceEquals(a, b) || (ReferenceEquals(a, null) ? (ReferenceEquals(b, null) ? true : false) : a.Equals(b));
+ return ReferenceEquals(a, b) || (a is null ? (b is null) : a.Equals(b));
}
/// <summary>
diff --git a/csharp/src/Google.Protobuf/WellKnownTypes/ValuePartial.cs b/csharp/src/Google.Protobuf/WellKnownTypes/ValuePartial.cs
index d34b560..a6846e7 100644
--- a/csharp/src/Google.Protobuf/WellKnownTypes/ValuePartial.cs
+++ b/csharp/src/Google.Protobuf/WellKnownTypes/ValuePartial.cs
@@ -41,7 +41,7 @@
/// <returns>A newly-created Value message with the given value.</returns>
public static Value ForString(string value)
{
- ProtoPreconditions.CheckNotNull(value, "value");
+ ProtoPreconditions.CheckNotNull(value, nameof(value));
return new Value { StringValue = value };
}
@@ -81,7 +81,7 @@
/// <returns>A newly-created Value message an initial list value.</returns>
public static Value ForList(params Value[] values)
{
- ProtoPreconditions.CheckNotNull(values, "values");
+ ProtoPreconditions.CheckNotNull(values, nameof(values));
return new Value { ListValue = new ListValue { Values = { values } } };
}
@@ -92,7 +92,7 @@
/// <returns>A newly-created Value message an initial struct value.</returns>
public static Value ForStruct(Struct value)
{
- ProtoPreconditions.CheckNotNull(value, "value");
+ ProtoPreconditions.CheckNotNull(value, nameof(value));
return new Value { StructValue = value };
}
}
diff --git a/csharp/src/Google.Protobuf/WriteBufferHelper.cs b/csharp/src/Google.Protobuf/WriteBufferHelper.cs
index f2a59bc..9230aa6 100644
--- a/csharp/src/Google.Protobuf/WriteBufferHelper.cs
+++ b/csharp/src/Google.Protobuf/WriteBufferHelper.cs
@@ -32,7 +32,6 @@
using System;
using System.Buffers;
-using System.IO;
using System.Runtime.CompilerServices;
using System.Security;
diff --git a/csharp/src/Google.Protobuf/WriteContext.cs b/csharp/src/Google.Protobuf/WriteContext.cs
index e822e1d..082c20e 100644
--- a/csharp/src/Google.Protobuf/WriteContext.cs
+++ b/csharp/src/Google.Protobuf/WriteContext.cs
@@ -32,14 +32,8 @@
using System;
using System.Buffers;
-using System.Buffers.Binary;
-using System.Collections.Generic;
-using System.IO;
using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
using System.Security;
-using System.Text;
-using Google.Protobuf.Collections;
namespace Google.Protobuf
{
@@ -101,166 +95,112 @@
/// Writes a double field value, without a tag.
/// </summary>
/// <param name="value">The value to write</param>
- public void WriteDouble(double value)
- {
- WritingPrimitives.WriteDouble(ref buffer, ref state, value);
- }
+ public void WriteDouble(double value) => WritingPrimitives.WriteDouble(ref buffer, ref state, value);
/// <summary>
/// Writes a float field value, without a tag.
/// </summary>
/// <param name="value">The value to write</param>
- public void WriteFloat(float value)
- {
- WritingPrimitives.WriteFloat(ref buffer, ref state, value);
- }
+ public void WriteFloat(float value) => WritingPrimitives.WriteFloat(ref buffer, ref state, value);
/// <summary>
/// Writes a uint64 field value, without a tag.
/// </summary>
/// <param name="value">The value to write</param>
- public void WriteUInt64(ulong value)
- {
- WritingPrimitives.WriteUInt64(ref buffer, ref state, value);
- }
+ public void WriteUInt64(ulong value) => WritingPrimitives.WriteUInt64(ref buffer, ref state, value);
/// <summary>
/// Writes an int64 field value, without a tag.
/// </summary>
/// <param name="value">The value to write</param>
- public void WriteInt64(long value)
- {
- WritingPrimitives.WriteInt64(ref buffer, ref state, value);
- }
+ public void WriteInt64(long value) => WritingPrimitives.WriteInt64(ref buffer, ref state, value);
/// <summary>
/// Writes an int32 field value, without a tag.
/// </summary>
/// <param name="value">The value to write</param>
- public void WriteInt32(int value)
- {
- WritingPrimitives.WriteInt32(ref buffer, ref state, value);
- }
+ public void WriteInt32(int value) => WritingPrimitives.WriteInt32(ref buffer, ref state, value);
/// <summary>
/// Writes a fixed64 field value, without a tag.
/// </summary>
/// <param name="value">The value to write</param>
- public void WriteFixed64(ulong value)
- {
- WritingPrimitives.WriteFixed64(ref buffer, ref state, value);
- }
+ public void WriteFixed64(ulong value) => WritingPrimitives.WriteFixed64(ref buffer, ref state, value);
/// <summary>
/// Writes a fixed32 field value, without a tag.
/// </summary>
/// <param name="value">The value to write</param>
- public void WriteFixed32(uint value)
- {
- WritingPrimitives.WriteFixed32(ref buffer, ref state, value);
- }
+ public void WriteFixed32(uint value) => WritingPrimitives.WriteFixed32(ref buffer, ref state, value);
/// <summary>
/// Writes a bool field value, without a tag.
/// </summary>
/// <param name="value">The value to write</param>
- public void WriteBool(bool value)
- {
- WritingPrimitives.WriteBool(ref buffer, ref state, value);
- }
+ public void WriteBool(bool value) => WritingPrimitives.WriteBool(ref buffer, ref state, value);
/// <summary>
/// Writes a string field value, without a tag.
/// The data is length-prefixed.
/// </summary>
/// <param name="value">The value to write</param>
- public void WriteString(string value)
- {
- WritingPrimitives.WriteString(ref buffer, ref state, value);
- }
+ public void WriteString(string value) => WritingPrimitives.WriteString(ref buffer, ref state, value);
/// <summary>
/// Writes a message, without a tag.
/// The data is length-prefixed.
/// </summary>
/// <param name="value">The value to write</param>
- public void WriteMessage(IMessage value)
- {
- WritingPrimitivesMessages.WriteMessage(ref this, value);
- }
+ public void WriteMessage(IMessage value) => WritingPrimitivesMessages.WriteMessage(ref this, value);
/// <summary>
/// Writes a group, without a tag, to the stream.
/// </summary>
/// <param name="value">The value to write</param>
- public void WriteGroup(IMessage value)
- {
- WritingPrimitivesMessages.WriteGroup(ref this, value);
- }
+ public void WriteGroup(IMessage value) => WritingPrimitivesMessages.WriteGroup(ref this, value);
/// <summary>
/// Write a byte string, without a tag, to the stream.
/// The data is length-prefixed.
/// </summary>
/// <param name="value">The value to write</param>
- public void WriteBytes(ByteString value)
- {
- WritingPrimitives.WriteBytes(ref buffer, ref state, value);
- }
+ public void WriteBytes(ByteString value) => WritingPrimitives.WriteBytes(ref buffer, ref state, value);
/// <summary>
/// Writes a uint32 value, without a tag.
/// </summary>
/// <param name="value">The value to write</param>
- public void WriteUInt32(uint value)
- {
- WritingPrimitives.WriteUInt32(ref buffer, ref state, value);
- }
+ public void WriteUInt32(uint value) => WritingPrimitives.WriteUInt32(ref buffer, ref state, value);
/// <summary>
/// Writes an enum value, without a tag.
/// </summary>
/// <param name="value">The value to write</param>
- public void WriteEnum(int value)
- {
- WritingPrimitives.WriteEnum(ref buffer, ref state, value);
- }
+ public void WriteEnum(int value) => WritingPrimitives.WriteEnum(ref buffer, ref state, value);
/// <summary>
/// Writes an sfixed32 value, without a tag.
/// </summary>
/// <param name="value">The value to write.</param>
- public void WriteSFixed32(int value)
- {
- WritingPrimitives.WriteSFixed32(ref buffer, ref state, value);
- }
+ public void WriteSFixed32(int value) => WritingPrimitives.WriteSFixed32(ref buffer, ref state, value);
/// <summary>
/// Writes an sfixed64 value, without a tag.
/// </summary>
/// <param name="value">The value to write</param>
- public void WriteSFixed64(long value)
- {
- WritingPrimitives.WriteSFixed64(ref buffer, ref state, value);
- }
+ public void WriteSFixed64(long value) => WritingPrimitives.WriteSFixed64(ref buffer, ref state, value);
/// <summary>
/// Writes an sint32 value, without a tag.
/// </summary>
/// <param name="value">The value to write</param>
- public void WriteSInt32(int value)
- {
- WritingPrimitives.WriteSInt32(ref buffer, ref state, value);
- }
+ public void WriteSInt32(int value) => WritingPrimitives.WriteSInt32(ref buffer, ref state, value);
/// <summary>
/// Writes an sint64 value, without a tag.
/// </summary>
/// <param name="value">The value to write</param>
- public void WriteSInt64(long value)
- {
- WritingPrimitives.WriteSInt64(ref buffer, ref state, value);
- }
+ public void WriteSInt64(long value) => WritingPrimitives.WriteSInt64(ref buffer, ref state, value);
/// <summary>
/// Writes a length (in bytes) for length-delimited data.
@@ -269,48 +209,33 @@
/// This method simply writes a rawint, but exists for clarity in calling code.
/// </remarks>
/// <param name="length">Length value, in bytes.</param>
- public void WriteLength(int length)
- {
- WritingPrimitives.WriteLength(ref buffer, ref state, length);
- }
+ public void WriteLength(int length) => WritingPrimitives.WriteLength(ref buffer, ref state, length);
/// <summary>
/// Encodes and writes a tag.
/// </summary>
/// <param name="fieldNumber">The number of the field to write the tag for</param>
/// <param name="type">The wire format type of the tag to write</param>
- public void WriteTag(int fieldNumber, WireFormat.WireType type)
- {
- WritingPrimitives.WriteTag(ref buffer, ref state, fieldNumber, type);
- }
+ public void WriteTag(int fieldNumber, WireFormat.WireType type) => WritingPrimitives.WriteTag(ref buffer, ref state, fieldNumber, type);
/// <summary>
/// Writes an already-encoded tag.
/// </summary>
/// <param name="tag">The encoded tag</param>
- public void WriteTag(uint tag)
- {
- WritingPrimitives.WriteTag(ref buffer, ref state, tag);
- }
+ public void WriteTag(uint tag) => WritingPrimitives.WriteTag(ref buffer, ref state, tag);
/// <summary>
/// Writes the given single-byte tag.
/// </summary>
/// <param name="b1">The encoded tag</param>
- public void WriteRawTag(byte b1)
- {
- WritingPrimitives.WriteRawTag(ref buffer, ref state, b1);
- }
+ public void WriteRawTag(byte b1) => WritingPrimitives.WriteRawTag(ref buffer, ref state, b1);
/// <summary>
/// Writes the given two-byte tag.
/// </summary>
/// <param name="b1">The first byte of the encoded tag</param>
/// <param name="b2">The second byte of the encoded tag</param>
- public void WriteRawTag(byte b1, byte b2)
- {
- WritingPrimitives.WriteRawTag(ref buffer, ref state, b1, b2);
- }
+ public void WriteRawTag(byte b1, byte b2) => WritingPrimitives.WriteRawTag(ref buffer, ref state, b1, b2);
/// <summary>
/// Writes the given three-byte tag.
@@ -318,10 +243,7 @@
/// <param name="b1">The first byte of the encoded tag</param>
/// <param name="b2">The second byte of the encoded tag</param>
/// <param name="b3">The third byte of the encoded tag</param>
- public void WriteRawTag(byte b1, byte b2, byte b3)
- {
- WritingPrimitives.WriteRawTag(ref buffer, ref state, b1, b2, b3);
- }
+ public void WriteRawTag(byte b1, byte b2, byte b3) => WritingPrimitives.WriteRawTag(ref buffer, ref state, b1, b2, b3);
/// <summary>
/// Writes the given four-byte tag.
@@ -330,10 +252,7 @@
/// <param name="b2">The second byte of the encoded tag</param>
/// <param name="b3">The third byte of the encoded tag</param>
/// <param name="b4">The fourth byte of the encoded tag</param>
- public void WriteRawTag(byte b1, byte b2, byte b3, byte b4)
- {
- WritingPrimitives.WriteRawTag(ref buffer, ref state, b1, b2, b3, b4);
- }
+ public void WriteRawTag(byte b1, byte b2, byte b3, byte b4) => WritingPrimitives.WriteRawTag(ref buffer, ref state, b1, b2, b3, b4);
/// <summary>
/// Writes the given five-byte tag.
@@ -343,20 +262,11 @@
/// <param name="b3">The third byte of the encoded tag</param>
/// <param name="b4">The fourth byte of the encoded tag</param>
/// <param name="b5">The fifth byte of the encoded tag</param>
- public void WriteRawTag(byte b1, byte b2, byte b3, byte b4, byte b5)
- {
- WritingPrimitives.WriteRawTag(ref buffer, ref state, b1, b2, b3, b4, b5);
- }
+ public void WriteRawTag(byte b1, byte b2, byte b3, byte b4, byte b5) => WritingPrimitives.WriteRawTag(ref buffer, ref state, b1, b2, b3, b4, b5);
- internal void Flush()
- {
- WriteBufferHelper.Flush(ref buffer, ref state);
- }
+ internal void Flush() => WriteBufferHelper.Flush(ref buffer, ref state);
- internal void CheckNoSpaceLeft()
- {
- WriteBufferHelper.CheckNoSpaceLeft(ref state);
- }
+ internal void CheckNoSpaceLeft() => WriteBufferHelper.CheckNoSpaceLeft(ref state);
internal void CopyStateTo(CodedOutputStream output)
{
diff --git a/csharp/src/Google.Protobuf/WriterInternalState.cs b/csharp/src/Google.Protobuf/WriterInternalState.cs
index a779305..ea4515a 100644
--- a/csharp/src/Google.Protobuf/WriterInternalState.cs
+++ b/csharp/src/Google.Protobuf/WriterInternalState.cs
@@ -30,20 +30,8 @@
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#endregion
-using System;
-using System.Buffers;
-using System.Buffers.Binary;
-using System.Collections.Generic;
-using System.IO;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-using System.Security;
-using System.Text;
-using Google.Protobuf.Collections;
-
namespace Google.Protobuf
{
-
// warning: this is a mutable struct, so it needs to be only passed as a ref!
internal struct WriterInternalState
{
diff --git a/csharp/src/Google.Protobuf/WritingPrimitives.cs b/csharp/src/Google.Protobuf/WritingPrimitives.cs
index 8beefc5..cfba5c7 100644
--- a/csharp/src/Google.Protobuf/WritingPrimitives.cs
+++ b/csharp/src/Google.Protobuf/WritingPrimitives.cs
@@ -32,7 +32,6 @@
using System;
using System.Buffers.Binary;
-using System.Diagnostics;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
#if GOOGLE_PROTOBUF_SIMD
diff --git a/csharp/src/Google.Protobuf/WritingPrimitivesMessages.cs b/csharp/src/Google.Protobuf/WritingPrimitivesMessages.cs
index cd2d437..6e70ee2 100644
--- a/csharp/src/Google.Protobuf/WritingPrimitivesMessages.cs
+++ b/csharp/src/Google.Protobuf/WritingPrimitivesMessages.cs
@@ -30,9 +30,7 @@
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#endregion
-using System;
using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices.ComTypes;
using System.Security;
namespace Google.Protobuf
diff --git a/docs/cmake_protobuf_generate.md b/docs/cmake_protobuf_generate.md
new file mode 100644
index 0000000..d3e9110
--- /dev/null
+++ b/docs/cmake_protobuf_generate.md
@@ -0,0 +1,135 @@
+# How to use `protobuf_generate`
+
+This document explains how to use the function `protobuf_generate` which is provided by protobuf's CMake module.
+
+## Usage
+
+In the same directory that called `find_package(protobuf CONFIG)` and any of its subdirectories, the CMake function `protobuf_generate` is made available by
+[`protobuf-generate.cmake`](../cmake/protobuf-generate.cmake). It can be used to automatically generate source files from `.proto` schema files at build time.
+
+### Basic example
+
+Let us see how `protobuf_generate` can be used to generate and compile the source files of a proto schema whenever an object target called `proto-objects` is built.
+
+Given the following directory structure:
+
+- `proto/helloworld/helloworld.proto`
+- `CMakeLists.txt`
+
+where `helloworld.proto` is a protobuf schema file and `CMakeLists.txt` contains:
+
+```cmake
+find_package(protobuf CONFIG REQUIRED)
+
+add_library(proto-objects OBJECT "${CMAKE_CURRENT_LIST_DIR}/proto/helloworld/helloworld.proto")
+
+target_link_libraries(proto-objects PUBLIC protobuf::libprotobuf)
+
+set(PROTO_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated")
+
+target_include_directories(proto-objects PUBLIC "$<BUILD_INTERFACE:${PROTO_BINARY_DIR}>")
+
+protobuf_generate(
+ TARGET proto-objects
+ IMPORT_DIRS "${CMAKE_CURRENT_LIST_DIR}/proto"
+ PROTOC_OUT_DIR "${PROTO_BINARY_DIR}")
+```
+
+Building the target `proto-objects` will generate the files:
+
+- `${CMAKE_CURRENT_BINARY_DIR}/generated/helloworld/helloworld.pb.h`
+- `${CMAKE_CURRENT_BINARY_DIR}/generated/helloworld/helloworld.pb.cc`
+
+and (depending on the build system) output:
+
+```shell
+[build] [1/2] Running cpp protocol buffer compiler on /proto/helloworld/helloworld.proto
+[build] [2/2] Building CXX object /build/generated/helloworld/helloworld.pb.cc.o
+```
+
+### gRPC example
+
+`protobuf_generate` can also be customized to invoke plugins like gRPC's `grpc_cpp_plugin`. Given the same directory structure as in the [basic example](#basic-example)
+and let `CMakeLists.txt` contain:
+
+```cmake
+find_package(gRPC CONFIG REQUIRED)
+
+add_library(proto-objects OBJECT "${CMAKE_CURRENT_LIST_DIR}/proto/helloworld/helloworld.proto")
+
+target_link_libraries(proto-objects PUBLIC protobuf::libprotobuf gRPC::grpc++)
+
+set(PROTO_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated")
+set(PROTO_IMPORT_DIRS "${CMAKE_CURRENT_LIST_DIR}/proto")
+
+target_include_directories(proto-objects PUBLIC "$<BUILD_INTERFACE:${PROTO_BINARY_DIR}>")
+
+protobuf_generate(
+ TARGET proto-objects
+ IMPORT_DIRS ${PROTO_IMPORT_DIRS}
+ PROTOC_OUT_DIR "${PROTO_BINARY_DIR}")
+
+protobuf_generate(
+ TARGET proto-objects
+ LANGUAGE grpc
+ GENERATE_EXTENSIONS .grpc.pb.h .grpc.pb.cc
+ PLUGIN "protoc-gen-grpc=\$<TARGET_FILE:gRPC::grpc_cpp_plugin>"
+ IMPORT_DIRS ${PROTO_IMPORT_DIRS}
+ PROTOC_OUT_DIR "${PROTO_BINARY_DIR}")
+```
+
+Then building `proto-objects` will generate and compile:
+
+- `${CMAKE_CURRENT_BINARY_DIR}/generated/helloworld/helloworld.pb.h`
+- `${CMAKE_CURRENT_BINARY_DIR}/generated/helloworld/helloworld.pb.cc`
+- `${CMAKE_CURRENT_BINARY_DIR}/generated/helloworld/helloworld.grpc.pb.h`
+- `${CMAKE_CURRENT_BINARY_DIR}/generated/helloworld/helloworld.grpc.pb.cc`
+
+And `protoc` will automatically be re-run whenever the schema files change and `proto-objects` is built.
+
+### Note on unity builds
+
+Since protobuf's generated source files are unsuited for [jumbo/unity builds](https://cmake.org/cmake/help/latest/prop_tgt/UNITY_BUILD.html) it is recommended
+to exclude them from such builds which can be achieved by adjusting their properties:
+
+```cmake
+protobuf_generate(
+ OUT_VAR PROTO_GENERATED_FILES
+ ...)
+
+set_source_files_properties(${PROTO_GENERATED_FILES} PROPERTIES SKIP_UNITY_BUILD_INCLUSION on)
+```
+
+## How it works
+
+For each source file ending in `proto` of the argument provided to `TARGET` or each file provided through `PROTOS`, `protobuf_generate` will set up
+a [add_custom_command](https://cmake.org/cmake/help/latest/command/add_custom_command.html) which depends on `protobuf::protoc` and the proto files.
+It declares the generated source files as `OUTPUT` which means that any target that depends on them will automatically cause the custom command to execute
+when it is brought up to date. The command itself is made up of the arguments for `protoc`, like the output directory, the schema files, the language to
+generate for, the plugins to use, etc.
+
+## Reference
+
+Arguments accepted by `protobuf_generate`.
+
+Flag arguments:
+
+- `APPEND_PATH` — A flag that causes the base path of all proto schema files to be added to `IMPORT_DIRS`.
+
+Single-value arguments:
+
+- `LANGUAGE` — A single value: cpp or python. Determines what kind of source files are being generated.
+- `OUT_VAR` — Name of a CMake variable that will be filled with the paths to the generated source files.
+- `EXPORT_MACRO` — Name of a macro that is applied to all generated Protobuf message classes and extern variables. It can, for example, be used to declare DLL exports.
+- `PROTOC_OUT_DIR` — Output directory of generated source files. Defaults to `CMAKE_CURRENT_BINARY_DIR`.
+- `PLUGIN` — An optional plugin executable. This could, for example, be the path to `grpc_cpp_plugin`.
+- `PLUGIN_OPTIONS` — Additional options provided to the plugin, such as `generate_mock_code=true` for the gRPC cpp plugin.
+- `DEPENDENCIES` — Arguments forwarded to the `DEPENDS` of the underlying `add_custom_command` invocation.
+- `TARGET` — CMake target that will have the generated files added as sources.
+
+Multi-value arguments:
+
+- `PROTOS` — List of proto schema files. If omitted, then every source file ending in *proto* of `TARGET` will be used.
+- `IMPORT_DIRS` — A common parent directory for the schema files. For example, if the schema file is `proto/helloworld/helloworld.proto` and the import directory `proto/` then the generated files are `${PROTOC_OUT_DIR}/helloworld/helloworld.pb.h` and `${PROTOC_OUT_DIR}/helloworld/helloworld.pb.cc`.
+- `GENERATE_EXTENSIONS` — If LANGUAGE is omitted then this must be set to the extensions that protoc generates.
+- `PROTOC_OPTIONS` — Additional arguments that are forwarded to protoc.
\ No newline at end of file
diff --git a/docs/cpp_build_systems.md b/docs/cpp_build_systems.md
new file mode 100644
index 0000000..b7f827b
--- /dev/null
+++ b/docs/cpp_build_systems.md
@@ -0,0 +1,338 @@
+# How Protobuf supports multiple C++ build systems
+
+This document explains how the Protobuf project supports multiple C++ build
+systems.
+
+## Background
+
+Protobuf primarily uses [Bazel](https://bazel.build) to build the Protobuf C++
+runtime and Protobuf compiler[^historical_sot]. However, there are several
+different build systems in common use for C++, each one of which requires
+essentially a complete copy of the same build definitions.
+
+[^historical_sot]:
+ On a historical note, prior to its [release as Open Source
+ Software](https://opensource.googleblog.com/2008/07/protocol-buffers-googles-data.html),
+ the Protobuf project was developed using Google's internal build system, which
+ was the predecessor to Bazel (the vast majority of Google's contributions
+ continue to be developed this way). The Open Source Protobuf project, however,
+ historically used Autoconf to build the C++ implementation.
+ Over time, other build systems (including Bazel) have been added, thanks in
+ large part to substantial contributions from the Open Source community. Since
+ the Protobuf project deals with multiple languages (all of which ultimately
+ rely upon C++, for the Protobuf compiler), Bazel is a natural choice for a
+ project-wide build system -- in fact, Bazel (and its predecessor, Blaze)
+ was designed in large part to support exactly this type of rich,
+ multi-language build.
+
+Currently, C++ Protobuf can be built with Bazel and CMake. Each of these build
+systems has different semantics and structure, but share in common the list of
+files needed to build the runtime and compiler.
+
+## Design
+
+### Extracting information from Bazel
+
+Bazel's Starlark API provides [aspects](https://bazel.build/rules/aspects) to
+traverse the build graph, inspect build rules, define additional actions, and
+expose information through
+[providers](https://bazel.build/rules/rules#providers). For example, the
+`cc_proto_library` rule uses an aspect to traverse the dependency graph of
+`proto_library` rules, and dynamically attaches actions to generate C++ code
+using the Protobuf compiler and compile using the C++ compiler.
+
+In order to support multiple build systems, the overall build structure is
+defined once for each system, and expose frequently-changing metadata
+from Bazel in a way that can be included from the build definition. Primarily,
+this means exposing the list of source files in a way that can be included
+in other build definitions.
+
+Two aspects are used to extract this information from the Bazel build
+definitions:
+
+* `cc_file_list_aspect` extracts `srcs`, `hdrs`, and `textual_hdrs` from build
+ rules like `cc_library`. The sources are exposed through a provider named
+ `CcFileList`.
+* `proto_file_list_aspect` extracts the `srcs` from a `proto_library`, and
+ also generates the expected filenames that would be generated by the
+ Protobuf compiler. This information is exposed through a provider named
+ `ProtoFileList`.
+
+On their own, these aspects have limited utility. However, they can be
+instantiated by custom rules, so that an ordinary `BUILD.bazel` target can
+produce outputs based on the information gleaned from these aspects.
+
+### (Aside) Distribution libraries
+
+Bazel's native `cc_library` rule is typically used on a "fine-grained" level, so
+that, for example, lightweight unit tests can be written with narrow scope.
+Although Bazel does build library artifacts (such as `.so` and `.a` files on
+Linux), they correspond to `cc_library` rules.
+
+Since the entire "Protobuf library" includes many constituent `cc_library`
+rules, a special rule, `cc_dist_library`, combines several fine-grained
+libraries into a single, monolithic library.
+
+For the Protobuf project, these "distribution libraries" are intended to match
+the granularity of the CMake-based builds. Since the Bazel-built
+distribution library covers the rules with the source files needed by other
+builds, the `cc_dist_library` rule invokes the `cc_file_list_aspect` on its
+input libraries. The result is that a `cc_dist_library` rule not only produces
+composite library artifacts, but also collect and provide the list of sources
+that were inputs.
+
+For example:
+
+```
+$ cat cc_dist_library_example/BUILD.bazel
+load("@rules_cc//cc:defs.bzl", "cc_library")
+load("//pkg:cc_dist_library.bzl", "cc_dist_library")
+
+cc_library(
+ name = "a",
+ srcs = ["a.cc"],
+)
+
+cc_library(
+ name = "b",
+ srcs = ["b.cc"],
+ deps = [":c"],
+)
+
+# N.B.: not part of the cc_dist_library, even though it is in the deps of 'b':
+cc_library(
+ name = "c",
+ srcs = ["c.cc"],
+)
+
+cc_dist_library(
+ name = "lib",
+ deps = [
+ ":a",
+ ":b",
+ ],
+ visibility = ["//visibility:public"],
+)
+
+# Note: the output below has been formatted for clarity:
+$ bazel cquery //cc_dist_library_example:lib \
+ --output=starlark \
+ --starlark:expr='providers(target)["//pkg:cc_dist_library.bzl%CcFileList"]'
+struct(
+ hdrs = depset([]),
+ internal_hdrs = depset([]),
+ srcs = depset([
+ <source file cc_dist_library_example/a.cc>,
+ <source file cc_dist_library_example/b.cc>,
+ ]),
+ textual_hdrs = depset([]),
+)
+```
+
+The upshot is that the "coarse-grained" library can be defined by the Bazel
+build, and then export the list of source files that are needed to reproduce the
+library in a different build system.
+
+One major difference from most Bazel rule types is that the file list aspects do
+not propagate. In other words, they only expose the immediate dependency's
+sources, not transitive sources. This is for two reasons:
+
+1. Immediate dependencies are conceptually simple, while transitivity requires
+ substantially more thought. For example, if transitive dependencies were
+ considered, then some way would be needed to exclude dependencies that
+ should not be part of the final library (for example, a distribution library
+ for `//:protobuf` could be defined not to include all of
+ `//:protobuf_lite`). While dependency elision is an interesting design
+ problem, the protobuf library is small enough that directly listing
+ dependencies should not be problematic.
+2. Dealing only with immediate dependencies gives finer-grained control over
+ what goes into the composite library. For example, a Starlark `select()`
+ could conditionally add fine-grained libraries to some builds, but not
+ others.
+
+Another subtlety for tests is due to Bazel internals. Internally, a slightly
+different configuration is used when evaluating `cc_test` rules as compared to
+`cc_dist_library`. If `cc_test` targets are included in a `cc_dist_library`
+rule, and both are evaluated by Bazel, this can result in a build-time error:
+the config used for the test contains additional options that tell Bazel how to
+execute the test that the `cc_file_list_aspect` build config does not. Bazel
+detects this as two conflicting actions generating the same outputs. (For
+`cc_test` rules, the simplest workaround is to provide sources through a
+`filegroup` or similar.)
+
+### File list generation
+
+Lists of input files are generated by Bazel in a format that can be imported to
+other build systems. Currently only CMake-style files can be generated.
+
+The lists of files are derived from Bazel build targets. The sources can be:
+* `cc_dist_library` rules (as described above)
+* `proto_library` rules
+* individual files
+* `filegroup` rules
+* `pkg_files` or `pkg_filegroup` rules from
+ https://github.com/bazelbuild/rules_pkg
+
+For example:
+
+```
+$ cat gen_file_lists_example/BUILD.bazel
+load("@rules_proto//proto:defs.bzl", "proto_library")
+load("//pkg:build_systems.bzl", "gen_cmake_file_lists")
+
+filegroup(
+ name = "doc_files",
+ srcs = [
+ "README.md",
+ "englilsh_paper.md",
+ ],
+)
+
+proto_library(
+ name = "message",
+ srcs = ["message.proto"],
+)
+
+gen_cmake_file_lists(
+ name = "source_lists",
+ out = "source_lists.cmake",
+ src_libs = {
+ ":doc_files": "docs",
+ ":message": "buff",
+ "//cc_dist_library_example:c": "distlib",
+ },
+)
+
+$ bazel build gen_file_lists_example:source_lists
+$ cat bazel-bin/gen_file_lists_example/source_lists.cmake
+# Auto-generated by //gen_file_lists_example:source_lists
+#
+# This file contains lists of sources based on Bazel rules. It should
+# be included from a hand-written CMake file that defines targets.
+#
+# Changes to this file will be overwritten based on Bazel definitions.
+
+if(${CMAKE_VERSION} VERSION_GREATER 3.10 OR ${CMAKE_VERSION} VERSION_EQUAL 3.10)
+ include_guard()
+endif()
+
+# //gen_file_lists_example:doc_files
+set(docs_files
+ gen_file_lists_example/README.md
+ gen_file_lists_example/englilsh_paper.md
+)
+
+# //gen_file_lists_example:message
+set(buff_proto_srcs
+ gen_file_lists_example/message.proto
+)
+
+# //gen_file_lists_example:message
+set(buff_srcs
+ gen_file_lists_example/message.proto.pb.cc
+)
+
+# //gen_file_lists_example:message
+set(buff_hdrs
+ gen_file_lists_example/message.proto.pb.h
+)
+
+# //gen_file_lists_example:message
+set(buff_files
+ gen_file_lists_example/message-descriptor-set.proto.bin
+)
+
+# //cc_dist_library_example:c
+set(distlib_srcs
+ cc_dist_library_example/a.cc
+ cc_dist_library_example/b.cc
+)
+
+# //cc_dist_library_example:c
+set(distlib_hdrs
+
+)
+```
+
+A hand-written CMake build rule could then use the generated file to define
+libraries, such as:
+
+```
+include(source_lists.cmake)
+add_library(distlib ${distlib_srcs} ${buff_srcs})
+```
+
+### Protobuf usage
+
+The main C++ runtimes (lite and full) and the Protobuf compiler use their
+corresponding `cc_dist_library` rules to generate file lists. For
+`proto_library` targets, the file list generation can extract the source files
+directly. For other targets, notably `cc_test` targets, the file list generators
+use `filegroup` rules.
+
+In general, adding new targets to a non-Bazel build system in Protobuf (or
+adding a new build system altogether) requires some one-time setup:
+
+1. The overall structure of the new build system has to be defined. It should
+ import lists of files and refer to them by variable, instead of listing
+ files directly.
+2. (Only if the build system is new) A new rule type has to be added to
+ `//pkg:build_systems.bzl`. Most of the implementation is shared, but a
+ "fragment generator" is need to declare a file list variable, and the rule
+ type itself has to be defined and call the shared implementation.
+
+When files are added or deleted, or when the Protobuf Bazel structure is
+changed, these changes may need to be reflected in the file list logic. These
+are some example scenarios:
+
+* Files are added to (or removed from) the `srcs` of an existing `cc_library`:
+ no changes needed. If the `cc_library` is already part of a
+ `cc_dist_library`, then regenerating the source lists will reflect the
+ change.
+* A `cc_library` is added: the new target may need to be added to the Protobuf
+ `cc_dist_library` targets, as appropriate.
+* A `cc_library` is deleted: if a `cc_dist_library` depends upon the deleted
+ target, then a build-time error will result. The library needs to be removed
+ from the `cc_dist_library`.
+* A `cc_test` is added or deleted: test sources are handled by `filegroup`
+ rules defined in the same package as the `cc_test` rule. The `filegroup`s
+ are usually given a name like `"test_srcs"`, and often use `glob()` to find
+ sources. This means that adding or removing a test may not require any extra
+ work, but this can be verified within the same package as the test rule.
+* Test-only proto files are added: the `proto_library` might need to be added
+ to the file list map in `//pkg:BUILD.bazel`, and then the file added to
+ various build systems. However, most test-only protos are already exposed
+ through libraries like `//src/google/protobuf:test_protos`.
+
+If there are changes, then the regenerated file lists need to be copied back
+into the repo. That way, the corresponding build systems can be used with a git
+checkout, without needing to run Bazel first.
+
+### (Aside) Distribution archives
+
+A very similar set of rules is defined in `//pkg` to build source distribution
+archives for releases. In addition to the full sources, Protobuf releases also
+include source archives sliced by language, so that, for example, a Ruby-based
+project can get just the sources needed to build the Ruby runtime. (The
+per-language slices also include sources needed to build the protobuf compiler,
+so they all effectively include the C++ runtime.)
+
+These archives are defined using rules from the
+[rules_pkg](https://github.com/bazelbuild/rules_pkg) project. Although they are
+similar to `cc_dist_library` and the file list generation rules, the goals are
+different: the build system file lists described above only apply to C++, and
+are organized according to what should or should not be included in different
+parts of the build (e.g., no tests are included in the main library). On the
+other hand, the distribution archives deal with languages other than C++, and
+contain all the files that need to be distributed as part of a release (even for
+C++, this is more than just the C++ sources).
+
+While it might be possible to use information from the `CcFileList` and
+`ProtoFileList` providers to define the distribution files, additional files
+(such as the various `BUILD.bazel` files) are also needed in the distribution
+archive. The lists of distribution files can usually be generated by `glob()`,
+anyhow, so sharing logic with the file list aspects may not be beneficial.
+
+Currently, all of the file lists are checked in. However, it would be possible
+to build the file lists on-the-fly and include them in the distribution
+archives, rather than checking them in.
diff --git a/docs/implementing_proto3_presence.md b/docs/implementing_proto3_presence.md
index 7c3e213..4abfbd5 100644
--- a/docs/implementing_proto3_presence.md
+++ b/docs/implementing_proto3_presence.md
@@ -131,11 +131,11 @@
```
# One option:
-$ ./src/protoc test.proto --cpp_out=. --experimental_allow_proto3_optional
+$ protoc test.proto --cpp_out=. --experimental_allow_proto3_optional
# Another option:
$ cp test.proto test_proto3_optional.proto
-$ ./src/protoc test_proto3_optional.proto --cpp_out=.
+$ protoc test_proto3_optional.proto --cpp_out=.
$
```
@@ -152,7 +152,7 @@
run into a different error:
```
-$ ./src/protoc test_proto3_optional.proto --my_codegen_out=.
+$ protoc test_proto3_optional.proto --my_codegen_out=.
test_proto3_optional.proto: is a proto3 file that contains optional fields, but
code generator --my_codegen_out hasn't been updated to support optional fields in
proto3. Please ask the owner of this code generator to support proto3 optional.
@@ -201,7 +201,7 @@
generator to generate a file containing proto3 optional fields:
```
-$ ./src/protoc test_proto3_optional.proto --my_codegen_out=.
+$ protoc test_proto3_optional.proto --my_codegen_out=.
```
### Updating Your Code Generator
diff --git a/docs/jvm_aot.md b/docs/jvm_aot.md
index 304c829..d9c1b6b 100644
--- a/docs/jvm_aot.md
+++ b/docs/jvm_aot.md
@@ -1,8 +1,8 @@
-# Ahead Of Time (AOT) compilation for the Java Virtual Machine (JVM)"
+# Ahead Of Time (AOT) compilation for the Java Virtual Machine (JVM)
Ahead Of Time (AOT) compilation build tools such as those provided by [GraalVM's `native-image`](https://www.graalvm.org/reference-manual/native-image/) can require some configuration when using protobuf.
-Protobuf for the JVM uses reflection and some of its target classes are not possible to determine in advance.
-Historically, there were good reasons to use reflection based on APIs that were published effectively requiring them, and this situation is unlikely to change.
+Protobuf for the JVM uses reflection, and some of its target classes are not possible to determine in advance.
+This situation is unlikely to change.
[The Lite version of protobuf for the JVM](https://github.com/protocolbuffers/protobuf/blob/main/java/lite.md)
avoids reflection and may be better suited for use with AOT compilation tooling. This Lite version was originally targeted for use on Android which has similar AOT compilation
@@ -10,9 +10,11 @@
## GraalVM native-image
-This section addresses GraalVM's `native-image` configuration specifically as this AOT compilation tool due to its popularity. The `native-image` tool can be configured
-with respect to: the [Java Native Interface](https://en.wikipedia.org/wiki/Java_Native_Interface) (JNI), http proxying, reflection, and other resources. While these
-considerations can be manually declared as JSON files, we recommend that a JVM application is exercised along with
+The GraalVM `native-image` tool can be configured with options for the
+[Java Native Interface](https://www.graalvm.org/22.0/reference-manual/native-image/JNI/) (JNI),
+http proxying, reflection, and other resources. While these
+configuration options can be manually specified in JSON files, we recommend
+that you exercise the application with
[the assisted configuration agent](https://www.graalvm.org/reference-manual/native-image/BuildConfiguration/#assisted-configuration-of-native-image-builds). The agent
-will generate files that you can then subsequently point at when invoking `native-image`. We recommend that the generated files are retained with a project's source
-code.
+will generate native-image.properties files that you add to the project's
+META-INF/native-image/ directory. The Native Image builder uses configuration options provided in META-INF/native-image/ to construct native-image command line arguments.
diff --git a/docs/options.md b/docs/options.md
index b489288..87f7dca 100644
--- a/docs/options.md
+++ b/docs/options.md
@@ -320,3 +320,31 @@
1. Protoc-gen-authz
* Website: https://github.com/Neakxs/protoc-gen-authz
* Extension: 1145
+
+1. Protonium
+ * Website: https://github.com/zyp/protonium
+ * Extension: 1146
+
+1. Protoc-gen-xo
+ * Website: https://github.com/xo/ecosystem
+ * Extension: 1147
+
+1. Ballerina gRPC
+ * Website: https://github.com/ballerina-platform/module-ballerina-grpc
+ * Extension: 1148
+
+1. Protoc-gen-referential-integrity
+ * Website: https://github.com/ComponentCorp/protoc-gen-referential-integrity
+ * Extension: 1149
+
+1. Oclea Service Layer RPC
+ * Website: https://oclea.com/
+ * Extension: 1150
+
+1. mypy-protobuf
+ * Website: https://github.com/nipunn1313/mypy-protobuf
+ * Extension: 1151-1154
+
+1. Pigweed protobuf compiler
+ * Website: https://pigweed.dev/pw_protobuf
+ * Extension: 1155
diff --git a/docs/performance.md b/docs/performance.md
deleted file mode 100644
index 245fdf1..0000000
--- a/docs/performance.md
+++ /dev/null
@@ -1,304 +0,0 @@
-# Protobuf Performance
-The following benchmark test results were produced on a workstation utilizing an Intel® Xeon® Processor E5-2630 with 32GB of RAM.
-
-This table contains the results of three separate languages:
-
-* **C++** - For C++, there are three parsing methods:
- * **new** - This is for using a new operator for creating a message instance.
- * **new arena** - This is for using arena for creating a new message instance.
- * **reuse** - This is for reusing the same message instance for parsing.
-* **Java** - For Java, there are three parsing/serialization methods:
- * **byte[]** - This is for parsing from a Byte Array.
- * **ByteString** - This is for parsing from a
- com.google.protobuf.ByteString.
- * **InputStream** - This is for parsing from an InputStream.
-* **Python** - For Python, there are three types of Python protobuf for testing:
- * **C++-generated-code** - This is for using C++ generated code of the
- proto file as a dynamic linked library.
- * **C++-reflection** - This is for using C++ reflection, for which there's no
- generated code, but still using C++ protobuf library as a dynamic linked
- library.
- * **pure-Python** - This is for the pure version of Python, which does not link with
- any C++ protobuf library.
-
-## Parsing performance
-
-<table>
-<tbody><tr>
-<th rowspan="2"> </th>
-<th colspan="3" rowspan="1">C++</th>
-<th colspan="3" rowspan="1">C++ with tcmalloc</th>
-<th colspan="3" rowspan="1">java</th>
-<th colspan="3" rowspan="1">python</th>
-</tr>
-<tr>
-<th colspan="1">new</th>
-<th colspan="1">new arena</th>
-<th colspan="1">reuse</th>
-<th colspan="1">new</th>
-<th colspan="1">new arena</th>
-<th colspan="1">reuse</th>
-<th colspan="1">byte[]</th>
-<th colspan="1">ByteString</th>
-<th colspan="1">InputStream</th>
-<th colspan="1">C++-generated-code</th>
-<th colspan="1">C++-reflection</th>
-<th colspan="1">pure-Python</th>
-</tr>
-<tr>
-<td>google_message1_proto2</td>
-<td>368.717MB/s</td>
-<td>261.847MB/s</td>
-<td>799.403MB/s</td>
-<td>645.183MB/s</td>
-<td>441.023MB/s</td>
-<td>1.122GB/s</td>
-<td>425.437MB/s</td>
-<td>425.937MB/s</td>
-<td>251.018MB/s</td>
-<td>82.8314MB/s</td>
-<td>47.6763MB/s</td>
-<td>3.76299MB/s</td>
-</tr>
-<tr>
-<td>google_message1_proto3</td>
-<td>294.517MB/s</td>
-<td>229.116MB/s</td>
-<td>469.982MB/s</td>
-<td>434.510MB/s</td>
-<td>394.701MB/s</td>
-<td>591.931MB/s</td>
-<td>357.597MB/s</td>
-<td>378.568MB/s</td>
-<td>221.676MB/s</td>
-<td>82.0498MB/s</td>
-<td>39.9467MB/s</td>
-<td>3.77751MB/s</td>
-</tr>
-<tr>
-<td>google_message2</td>
-<td>277.242MB/s</td>
-<td>347.611MB/s</td>
-<td>793.67MB/s</td>
-<td>503.721MB/s</td>
-<td>596.333MB/s</td>
-<td>922.533MB/s</td>
-<td>416.778MB/s</td>
-<td>419.543MB/s</td>
-<td>367.145MB/s</td>
-<td>241.46MB/s</td>
-<td>71.5723MB/s</td>
-<td>2.73538MB/s</td>
-</tr>
-<tr>
-<td>google_message3_1</td>
-<td>213.478MB/s</td>
-<td>291.58MB/s</td>
-<td>543.398MB/s</td>
-<td>539.704MB/s</td>
-<td>717.300MB/s</td>
-<td>927.333MB/s</td>
-<td>684.241MB/s</td>
-<td>704.47MB/s</td>
-<td>648.624MB/s</td>
-<td>209.036MB/s</td>
-<td>142.356MB/s</td>
-<td>15.3324MB/s</td>
-</tr>
-<tr>
-<td>google_message3_2</td>
-<td>672.685MB/s</td>
-<td>802.767MB/s</td>
-<td>1.21505GB/s</td>
-<td>985.790MB/s</td>
-<td>1.136GB/s</td>
-<td>1.367GB/s</td>
-<td>1.54439GB/s</td>
-<td>1.60603GB/s</td>
-<td>1.33443GB/s</td>
-<td>573.835MB/s</td>
-<td>314.33MB/s</td>
-<td>15.0169MB/s</td>
-</tr>
-<tr>
-<td>google_message3_3</td>
-<td>207.681MB/s</td>
-<td>140.591MB/s</td>
-<td>535.181MB/s</td>
-<td>369.743MB/s</td>
-<td>262.301MB/s</td>
-<td>556.644MB/s</td>
-<td>279.385MB/s</td>
-<td>304.853MB/s</td>
-<td>107.575MB/s</td>
-<td>32.248MB/s</td>
-<td>26.1431MB/s</td>
-<td>2.63541MB/s</td>
-</tr>
-<tr>
-<td>google_message3_4</td>
-<td>7.96091GB/s</td>
-<td>7.10024GB/s</td>
-<td>9.3013GB/s</td>
-<td>8.518GB/s</td>
-<td>8.171GB/s</td>
-<td>9.917GB/s</td>
-<td>5.78006GB/s</td>
-<td>5.85198GB/s</td>
-<td>4.62609GB/s</td>
-<td>2.49631GB/s</td>
-<td>2.35442GB/s</td>
-<td>802.061MB/s</td>
-</tr>
-<tr>
-<td>google_message3_5</td>
-<td>76.0072MB/s</td>
-<td>51.6769MB/s</td>
-<td>237.856MB/s</td>
-<td>178.495MB/s</td>
-<td>111.751MB/s</td>
-<td>329.569MB/s</td>
-<td>121.038MB/s</td>
-<td>132.866MB/s</td>
-<td>36.9197MB/s</td>
-<td>10.3962MB/s</td>
-<td>8.84659MB/s</td>
-<td>1.25203MB/s</td>
-</tr>
-<tr>
-<td>google_message4</td>
-<td>331.46MB/s</td>
-<td>404.862MB/s</td>
-<td>427.99MB/s</td>
-<td>589.887MB/s</td>
-<td>720.367MB/s</td>
-<td>705.373MB/s</td>
-<td>606.228MB/s</td>
-<td>589.13MB/s</td>
-<td>530.692MB/s</td>
-<td>305.543MB/s</td>
-<td>174.834MB/s</td>
-<td>7.86485MB/s</td>
-</tr>
-</tbody></table>
-
-## Serialization performance
-
-<table>
-<tbody><tr>
-<th rowspan="2"> </th>
-<th colspan="1" rowspan="2">C++</th>
-<th colspan="1" rowspan="2">C++ with tcmalloc</th>
-<th colspan="3" rowspan="1">java</th>
-<th colspan="3" rowspan="1">python</th>
-</tr>
-<tr>
-<th colspan="1">byte[]</th>
-<th colspan="1">ByteString</th>
-<th colspan="1">InputStream</th>
-<th colspan="1">C++-generated-code</th>
-<th colspan="1">C++-reflection</th>
-<th colspan="1">pure-Python</th>
-</tr>
-<tr>
-<td>google_message1_proto2</td>
-<td>1.39698GB/s</td>
-<td>1.701GB/s</td>
-<td>1.12915GB/s</td>
-<td>1.13589GB/s</td>
-<td>758.609MB/s</td>
-<td>260.911MB/s</td>
-<td>58.4815MB/s</td>
-<td>5.77824MB/s</td>
-</tr>
-<tr>
-<td>google_message1_proto3</td>
-<td>959.305MB/s</td>
-<td>939.404MB/s</td>
-<td>1.15372GB/s</td>
-<td>1.07824GB/s</td>
-<td>802.337MB/s</td>
-<td>239.4MB/s</td>
-<td>33.6336MB/s</td>
-<td>5.80524MB/s</td>
-</tr>
-<tr>
-<td>google_message2</td>
-<td>1.27429GB/s</td>
-<td>1.402GB/s</td>
-<td>1.01039GB/s</td>
-<td>1022.99MB/s</td>
-<td>798.736MB/s</td>
-<td>996.755MB/s</td>
-<td>57.9601MB/s</td>
-<td>4.09246MB/s</td>
-</tr>
-<tr>
-<td>google_message3_1</td>
-<td>1.31916GB/s</td>
-<td>2.049GB/s</td>
-<td>991.496MB/s</td>
-<td>860.332MB/s</td>
-<td>662.88MB/s</td>
-<td>1.48625GB/s</td>
-<td>421.287MB/s</td>
-<td>18.002MB/s</td>
-</tr>
-<tr>
-<td>google_message3_2</td>
-<td>2.15676GB/s</td>
-<td>2.632GB/s</td>
-<td>2.14736GB/s</td>
-<td>2.08136GB/s</td>
-<td>1.55997GB/s</td>
-<td>2.39597GB/s</td>
-<td>326.777MB/s</td>
-<td>16.0527MB/s</td>
-</tr>
-<tr>
-<td>google_message3_3</td>
-<td>650.456MB/s</td>
-<td>1.040GB/s</td>
-<td>593.52MB/s</td>
-<td>580.667MB/s</td>
-<td>346.839MB/s</td>
-<td>123.978MB/s</td>
-<td>35.893MB/s</td>
-<td>2.32834MB/s</td>
-</tr>
-<tr>
-<td>google_message3_4</td>
-<td>8.70154GB/s</td>
-<td>9.825GB/s</td>
-<td>5.88645GB/s</td>
-<td>5.93946GB/s</td>
-<td>2.44388GB/s</td>
-<td>5.9241GB/s</td>
-<td>4.05837GB/s</td>
-<td>876.87MB/s</td>
-</tr>
-<tr>
-<td>google_message3_5</td>
-<td>246.33MB/s</td>
-<td>443.993MB/s</td>
-<td>283.278MB/s</td>
-<td>259.167MB/s</td>
-<td>206.37MB/s</td>
-<td>37.0285MB/s</td>
-<td>12.2228MB/s</td>
-<td>1.1979MB/s</td>
-</tr>
-<tr>
-<td>google_message4</td>
-<td>1.56674GB/s</td>
-<td>2.19601GB/s</td>
-<td>776.907MB/s</td>
-<td>770.707MB/s</td>
-<td>702.931MB/s</td>
-<td>1.49623GB/s</td>
-<td>205.116MB/s</td>
-<td>8.93428MB/s</td>
-</tr>
-</tbody></table>
-
-\* The cpp performance can be improved by using [tcmalloc](https://gperftools.github.io/gperftools/tcmalloc.html), please follow the (instruction)[https://github.com/protocolbuffers/protobuf/blob/main/benchmarks/README.md] to link with tcmalloc to get the faster result.
diff --git a/docs/third_party.md b/docs/third_party.md
index d8478e9..d9ff970 100644
--- a/docs/third_party.md
+++ b/docs/third_party.md
@@ -203,3 +203,4 @@
* [vim-protolint: A protobuf linter for Vim](https://github.com/yoheimuta/vim-protolint)
* [super-linter: Protocol Buffer lint as GitHub Action](https://github.com/github/super-linter)
* [protoc-gen-fieldmask - A plugin to generate static type fieldmask paths](https://github.com/idodod/protoc-gen-fieldmask)
+* [protoc-gen-bq-schema - A protoc plugin to generate BigQuery schema files](https://github.com/GoogleCloudPlatform/protoc-gen-bq-schema)
diff --git a/examples/.bazelrc b/examples/.bazelrc
new file mode 100644
index 0000000..554440c
--- /dev/null
+++ b/examples/.bazelrc
@@ -0,0 +1 @@
+build --cxxopt=-std=c++14 --host_cxxopt=-std=c++14
diff --git a/examples/AddPerson.java b/examples/AddPerson.java
index 2f6a231..83971ab 100644
--- a/examples/AddPerson.java
+++ b/examples/AddPerson.java
@@ -1,4 +1,4 @@
-// See README.txt for information and build instructions.
+// See README.md for information and build instructions.
import com.example.tutorial.protos.AddressBook;
import com.example.tutorial.protos.Person;
diff --git a/examples/ListPeople.java b/examples/ListPeople.java
index ab07b79..d0e037a 100644
--- a/examples/ListPeople.java
+++ b/examples/ListPeople.java
@@ -1,4 +1,4 @@
-// See README.txt for information and build instructions.
+// See README.md for information and build instructions.
import com.example.tutorial.protos.AddressBook;
import com.example.tutorial.protos.Person;
diff --git a/examples/Makefile b/examples/Makefile
index 1c7ec8d..ef7a4ef 100644
--- a/examples/Makefile
+++ b/examples/Makefile
@@ -1,4 +1,4 @@
-# See README.txt.
+# See README.md.
.PHONY: all cpp java python clean
@@ -13,13 +13,14 @@
clean:
rm -f add_person_cpp list_people_cpp add_person_java list_people_java add_person_python list_people_python
- rm -f javac_middleman AddPerson*.class ListPeople*.class com/example/tutorial/*.class
- rm -f protoc_middleman addressbook.pb.cc addressbook.pb.h addressbook_pb2.py com/example/tutorial/AddressBookProtos.java
+ rm -f javac_middleman AddPerson*.class ListPeople*.class com/example/tutorial/protos/*.class
+ rm -f protoc_middleman addressbook.pb.cc addressbook.pb.h addressbook_pb2.py com/example/tutorial/protos/*.java
rm -f *.pyc
rm -f go/tutorialpb/*.pb.go add_person_go list_people_go
rm -f protoc_middleman_dart dart_tutorial/*.pb*.dart
rmdir dart_tutorial 2>/dev/null || true
rmdir tutorial 2>/dev/null || true
+ rmdir com/example/tutorial/protos 2>/dev/null || true
rmdir com/example/tutorial 2>/dev/null || true
rmdir com/example 2>/dev/null || true
rmdir com 2>/dev/null || true
@@ -40,11 +41,11 @@
add_person_cpp: add_person.cc protoc_middleman
pkg-config --cflags protobuf # fails if protobuf is not installed
- c++ -std=c++11 add_person.cc addressbook.pb.cc -o add_person_cpp `pkg-config --cflags --libs protobuf`
+ c++ -std=c++14 add_person.cc addressbook.pb.cc -o add_person_cpp `pkg-config --cflags --libs protobuf`
list_people_cpp: list_people.cc protoc_middleman
pkg-config --cflags protobuf # fails if protobuf is not installed
- c++ -std=c++11 list_people.cc addressbook.pb.cc -o list_people_cpp `pkg-config --cflags --libs protobuf`
+ c++ -std=c++14 list_people.cc addressbook.pb.cc -o list_people_cpp `pkg-config --cflags --libs protobuf`
add_person_dart: add_person.dart protoc_middleman_dart
@@ -63,7 +64,7 @@
cd go && go test ./cmd/list_people
javac_middleman: AddPerson.java ListPeople.java protoc_middleman
- javac -cp $$CLASSPATH AddPerson.java ListPeople.java com/example/tutorial/AddressBookProtos.java
+ javac -cp $$CLASSPATH AddPerson.java ListPeople.java com/example/tutorial/protos/*.java
@touch javac_middleman
add_person_java: javac_middleman
diff --git a/examples/README.md b/examples/README.md
index a99883e..64e6d90 100644
--- a/examples/README.md
+++ b/examples/README.md
@@ -28,7 +28,7 @@
$ bazel-bin/add_person_cpp addressbook.data
To use protobuf in your own bazel project, please follow instructions in the
-[BUILD](BUILD) file and [WORKSPACE](WORKSPACE) file.
+[BUILD.bazel](BUILD.bazel) file and [WORKSPACE](WORKSPACE) file.
## Build the example using make
@@ -37,14 +37,14 @@
and the protobuf runtime for the language you want to build.
You can simply run "make" to build the example for all languages (except for
-Go). However, since different language has different installation requirement,
+Go). However, since different languages have different installation requirements,
it will likely fail. It's better to follow individual instructions below to
build only the language you are interested in.
### C++
You can follow instructions in [../src/README.md](../src/README.md) to install
-protoc and protobuf C++ runtime from source.
+protoc from source.
Then run "make cpp" in this examples directory to build the C++ example. It
will create two executables: add_person_cpp and list_people_cpp. These programs
diff --git a/examples/WORKSPACE b/examples/WORKSPACE
index 3897572..e9811ef 100644
--- a/examples/WORKSPACE
+++ b/examples/WORKSPACE
@@ -10,9 +10,11 @@
#
# http_archive(
# name = "com_google_protobuf",
-# strip_prefix = "protobuf-main",
-# urls = ["https://github.com/protocolbuffers/protobuf/archive/main.zip"],
+# sha256 = "c29d8b4b79389463c546f98b15aa4391d4ed7ec459340c47bffe15db63eb9126",
+# strip_prefix = "protobuf-3.21.3",
+# urls = ["https://github.com/protocolbuffers/protobuf/archive/v3.21.3.tar.gz"],
# )
+
local_repository(
name = "com_google_protobuf",
path = "..",
diff --git a/examples/add_person.cc b/examples/add_person.cc
index 856e90b..d54d0f1 100644
--- a/examples/add_person.cc
+++ b/examples/add_person.cc
@@ -1,4 +1,4 @@
-// See README.txt for information and build instructions.
+// See README.md for information and build instructions.
#include <ctime>
#include <fstream>
diff --git a/examples/add_person.py b/examples/add_person.py
index aa0fbca..aa53d58 100755
--- a/examples/add_person.py
+++ b/examples/add_person.py
@@ -1,6 +1,6 @@
#! /usr/bin/env python
-# See README.txt for information and build instructions.
+# See README.md for information and build instructions.
import addressbook_pb2
import sys
diff --git a/examples/addressbook.proto b/examples/addressbook.proto
index 1bff4ad..5f52698 100644
--- a/examples/addressbook.proto
+++ b/examples/addressbook.proto
@@ -1,4 +1,4 @@
-// See README.txt for information and build instructions.
+// See README.md for information and build instructions.
//
// Note: START and END tags are used in comments to define sections used in
// tutorials. They are not part of the syntax for Protocol Buffers.
diff --git a/examples/list_people.cc b/examples/list_people.cc
index b309c59..6f0cf20 100644
--- a/examples/list_people.cc
+++ b/examples/list_people.cc
@@ -1,4 +1,4 @@
-// See README.txt for information and build instructions.
+// See README.md for information and build instructions.
#include <fstream>
#include <google/protobuf/util/time_util.h>
diff --git a/examples/list_people.py b/examples/list_people.py
index d2c294c..98a08ed 100755
--- a/examples/list_people.py
+++ b/examples/list_people.py
@@ -1,6 +1,6 @@
#! /usr/bin/env python
-# See README.txt for information and build instructions.
+# See README.md for information and build instructions.
from __future__ import print_function
import addressbook_pb2
diff --git a/generate_descriptor_proto.sh b/generate_descriptor_proto.sh
index dc03fee..91c1217 100755
--- a/generate_descriptor_proto.sh
+++ b/generate_descriptor_proto.sh
@@ -7,7 +7,7 @@
# generate.
#
# HINT: Flags passed to generate_descriptor_proto.sh will be passed directly
-# to make when building protoc. This is particularly useful for passing
+# to bazel when building protoc. This is particularly useful for passing
# -j4 to run 4 jobs simultaneously.
if test ! -e src/google/protobuf/stubs/common.h; then
@@ -62,12 +62,12 @@
PROTOC=$BOOTSTRAP_PROTOC
BOOTSTRAP_PROTOC=""
else
- make -j$(nproc) $@ protoc
+ bazel build $@ //:protoc
if test $? -ne 0; then
echo "Failed to build protoc."
exit 1
fi
- PROTOC="./protoc"
+ PROTOC="../bazel-bin/protoc"
fi
$PROTOC --cpp_out=dllexport_decl=PROTOBUF_EXPORT:$TMP ${RUNTIME_PROTO_FILES[@]} && \
diff --git a/java/BUILD.bazel b/java/BUILD.bazel
index b3178c9..2c6582c 100644
--- a/java/BUILD.bazel
+++ b/java/BUILD.bazel
@@ -33,6 +33,7 @@
"bom/pom.xml",
"lite.md",
"pom.xml",
+ "protoc/pom.xml",
],
strip_prefix = strip_prefix.from_root(""),
visibility = ["//pkg:__pkg__"],
diff --git a/java/core/BUILD.bazel b/java/core/BUILD.bazel
index cfd53f4..5a5eed9 100644
--- a/java/core/BUILD.bazel
+++ b/java/core/BUILD.bazel
@@ -191,7 +191,7 @@
maven_coordinates = "com.google.protobuf:protobuf-java:%s" % PROTOBUF_JAVA_VERSION,
pom_template = "pom_template.xml",
resources = [
- "//:built_in_runtime_protos",
+ "//src/google/protobuf:descriptor_proto_srcs",
"//:well_known_type_protos",
],
tags = ["manual"],
@@ -242,8 +242,9 @@
deps = [
"//:any_proto",
"//:descriptor_proto",
- "//:generic_test_protos",
+ "//:lite_test_protos",
"//:wrappers_proto",
+ "//src/google/protobuf:generic_test_protos",
],
)
@@ -252,7 +253,15 @@
visibility = [
"//java:__subpackages__",
],
- deps = ["//:generic_test_protos"],
+ deps = ["//src/google/protobuf:generic_test_protos"],
+)
+
+java_proto_library(
+ name = "lite_test_protos_java_proto",
+ visibility = [
+ "//java:__subpackages__",
+ ],
+ deps = ["//:lite_test_protos"],
)
java_proto_library(
@@ -271,6 +280,7 @@
":core",
":generic_test_protos_java_proto",
":java_test_protos_java_proto",
+ ":lite_test_protos_java_proto",
"@maven//:com_google_guava_guava",
"@maven//:junit_junit",
],
@@ -312,11 +322,12 @@
"src/test/java/com/google/protobuf/TestUtilLite.java",
],
),
- data = ["//:testdata"],
+ data = ["//src/google/protobuf:testdata"],
deps = [
":core",
":generic_test_protos_java_proto",
":java_test_protos_java_proto",
+ ":lite_test_protos_java_proto",
":test_util",
"@maven//:com_google_guava_guava",
"@maven//:com_google_truth_truth",
@@ -349,7 +360,16 @@
"//java/kotlin-lite:__pkg__",
"//java/lite:__pkg__",
],
- deps = ["//:generic_test_protos"],
+ deps = ["//src/google/protobuf:generic_test_protos"],
+)
+
+java_lite_proto_library(
+ name = "lite_test_protos_java_proto_lite",
+ visibility = [
+ "//java/kotlin-lite:__pkg__",
+ "//java/lite:__pkg__",
+ ],
+ deps = ["//:lite_test_protos"],
)
java_lite_proto_library(
@@ -384,6 +404,7 @@
":generic_test_protos_java_proto_lite",
":java_test_protos_java_proto_lite",
":lite_runtime_only",
+ ":lite_test_protos_java_proto_lite",
"@maven//:com_google_guava_guava",
"@maven//:junit_junit",
],
@@ -440,12 +461,13 @@
["src/test/java/**/*.java"],
exclude = LITE_TEST_EXCLUSIONS,
),
- data = ["//:testdata"],
+ data = ["//src/google/protobuf:testdata"],
test_prefix = "Lite",
deps = [
":generic_test_protos_java_proto_lite",
":java_test_protos_java_proto_lite",
":lite",
+ ":lite_test_protos_java_proto_lite",
":test_util_lite",
"@maven//:com_google_truth_truth",
"@maven//:junit_junit",
diff --git a/java/core/src/main/java/com/google/protobuf/BinaryWriter.java b/java/core/src/main/java/com/google/protobuf/BinaryWriter.java
index cf394e3..66cf51d 100644
--- a/java/core/src/main/java/com/google/protobuf/BinaryWriter.java
+++ b/java/core/src/main/java/com/google/protobuf/BinaryWriter.java
@@ -209,7 +209,7 @@
}
}
- private final void writeInt32List_Internal(int fieldNumber, List<Integer> list, boolean packed)
+ private void writeInt32List_Internal(int fieldNumber, List<Integer> list, boolean packed)
throws IOException {
if (packed) {
requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * MAX_VARINT64_SIZE));
@@ -227,7 +227,7 @@
}
}
- private final void writeInt32List_Internal(int fieldNumber, IntArrayList list, boolean packed)
+ private void writeInt32List_Internal(int fieldNumber, IntArrayList list, boolean packed)
throws IOException {
if (packed) {
requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * MAX_VARINT64_SIZE));
@@ -255,7 +255,7 @@
}
}
- private final void writeFixed32List_Internal(int fieldNumber, List<Integer> list, boolean packed)
+ private void writeFixed32List_Internal(int fieldNumber, List<Integer> list, boolean packed)
throws IOException {
if (packed) {
requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * FIXED32_SIZE));
@@ -273,7 +273,7 @@
}
}
- private final void writeFixed32List_Internal(int fieldNumber, IntArrayList list, boolean packed)
+ private void writeFixed32List_Internal(int fieldNumber, IntArrayList list, boolean packed)
throws IOException {
if (packed) {
requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * FIXED32_SIZE));
@@ -307,7 +307,7 @@
}
}
- private final void writeUInt64List_Internal(int fieldNumber, List<Long> list, boolean packed)
+ private void writeUInt64List_Internal(int fieldNumber, List<Long> list, boolean packed)
throws IOException {
if (packed) {
requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * MAX_VARINT64_SIZE));
@@ -325,7 +325,7 @@
}
}
- private final void writeUInt64List_Internal(int fieldNumber, LongArrayList list, boolean packed)
+ private void writeUInt64List_Internal(int fieldNumber, LongArrayList list, boolean packed)
throws IOException {
if (packed) {
requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * MAX_VARINT64_SIZE));
@@ -353,7 +353,7 @@
}
}
- private final void writeFixed64List_Internal(int fieldNumber, List<Long> list, boolean packed)
+ private void writeFixed64List_Internal(int fieldNumber, List<Long> list, boolean packed)
throws IOException {
if (packed) {
requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * FIXED64_SIZE));
@@ -371,7 +371,7 @@
}
}
- private final void writeFixed64List_Internal(int fieldNumber, LongArrayList list, boolean packed)
+ private void writeFixed64List_Internal(int fieldNumber, LongArrayList list, boolean packed)
throws IOException {
if (packed) {
requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * FIXED64_SIZE));
@@ -399,7 +399,7 @@
}
}
- private final void writeFloatList_Internal(int fieldNumber, List<Float> list, boolean packed)
+ private void writeFloatList_Internal(int fieldNumber, List<Float> list, boolean packed)
throws IOException {
if (packed) {
requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * FIXED32_SIZE));
@@ -417,7 +417,7 @@
}
}
- private final void writeFloatList_Internal(int fieldNumber, FloatArrayList list, boolean packed)
+ private void writeFloatList_Internal(int fieldNumber, FloatArrayList list, boolean packed)
throws IOException {
if (packed) {
requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * FIXED32_SIZE));
@@ -445,7 +445,7 @@
}
}
- private final void writeDoubleList_Internal(int fieldNumber, List<Double> list, boolean packed)
+ private void writeDoubleList_Internal(int fieldNumber, List<Double> list, boolean packed)
throws IOException {
if (packed) {
requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * FIXED64_SIZE));
@@ -463,7 +463,7 @@
}
}
- private final void writeDoubleList_Internal(int fieldNumber, DoubleArrayList list, boolean packed)
+ private void writeDoubleList_Internal(int fieldNumber, DoubleArrayList list, boolean packed)
throws IOException {
if (packed) {
requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * FIXED64_SIZE));
@@ -497,7 +497,7 @@
}
}
- private final void writeBoolList_Internal(int fieldNumber, List<Boolean> list, boolean packed)
+ private void writeBoolList_Internal(int fieldNumber, List<Boolean> list, boolean packed)
throws IOException {
if (packed) {
requireSpace((MAX_VARINT32_SIZE * 2) + list.size());
@@ -515,7 +515,7 @@
}
}
- private final void writeBoolList_Internal(int fieldNumber, BooleanArrayList list, boolean packed)
+ private void writeBoolList_Internal(int fieldNumber, BooleanArrayList list, boolean packed)
throws IOException {
if (packed) {
requireSpace((MAX_VARINT32_SIZE * 2) + list.size());
@@ -572,7 +572,7 @@
}
}
- private final void writeUInt32List_Internal(int fieldNumber, List<Integer> list, boolean packed)
+ private void writeUInt32List_Internal(int fieldNumber, List<Integer> list, boolean packed)
throws IOException {
if (packed) {
requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * MAX_VARINT32_SIZE));
@@ -590,7 +590,7 @@
}
}
- private final void writeUInt32List_Internal(int fieldNumber, IntArrayList list, boolean packed)
+ private void writeUInt32List_Internal(int fieldNumber, IntArrayList list, boolean packed)
throws IOException {
if (packed) {
requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * MAX_VARINT32_SIZE));
@@ -630,7 +630,7 @@
}
}
- private final void writeSInt32List_Internal(int fieldNumber, List<Integer> list, boolean packed)
+ private void writeSInt32List_Internal(int fieldNumber, List<Integer> list, boolean packed)
throws IOException {
if (packed) {
requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * MAX_VARINT32_SIZE));
@@ -648,7 +648,7 @@
}
}
- private final void writeSInt32List_Internal(int fieldNumber, IntArrayList list, boolean packed)
+ private void writeSInt32List_Internal(int fieldNumber, IntArrayList list, boolean packed)
throws IOException {
if (packed) {
requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * MAX_VARINT32_SIZE));
@@ -759,7 +759,7 @@
}
}
- private final void writeSInt64List_Internal(int fieldNumber, List<Long> list, boolean packed)
+ private void writeSInt64List_Internal(int fieldNumber, List<Long> list, boolean packed)
throws IOException {
if (packed) {
requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * MAX_VARINT64_SIZE));
@@ -777,7 +777,7 @@
}
}
- private final void writeSInt64List_Internal(int fieldNumber, LongArrayList list, boolean packed)
+ private void writeSInt64List_Internal(int fieldNumber, LongArrayList list, boolean packed)
throws IOException {
if (packed) {
requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * MAX_VARINT64_SIZE));
diff --git a/java/core/src/main/java/com/google/protobuf/ByteString.java b/java/core/src/main/java/com/google/protobuf/ByteString.java
index 480f85f..0e03ebd 100644
--- a/java/core/src/main/java/com/google/protobuf/ByteString.java
+++ b/java/core/src/main/java/com/google/protobuf/ByteString.java
@@ -385,8 +385,7 @@
// String -> ByteString
/**
- * Returns a {@code ByteString} from a hexadecimal String. Alternative CharSequences should use
- * {@link ByteStrings#decode(CharSequence, BaseEncoding)}
+ * Returns a {@code ByteString} from a hexadecimal String.
*
* @param hexString String of hexadecimal digits to create {@code ByteString} from.
* @throws NumberFormatException if the hexString does not contain a parsable hex String.
@@ -1130,13 +1129,6 @@
return ByteString.copyFrom(flushedBuffers);
}
- /** Implement java.util.Arrays.copyOf() for jdk 1.5. */
- private byte[] copyArray(byte[] buffer, int length) {
- byte[] result = new byte[length];
- System.arraycopy(buffer, 0, result, 0, Math.min(buffer.length, length));
- return result;
- }
-
/**
* Writes the complete contents of this byte array output stream to the specified output stream
* argument.
@@ -1151,7 +1143,7 @@
synchronized (this) {
// Copy the information we need into local variables so as to hold
// the lock for as short a time as possible.
- cachedFlushBuffers = flushedBuffers.toArray(new ByteString[flushedBuffers.size()]);
+ cachedFlushBuffers = flushedBuffers.toArray(new ByteString[0]);
cachedBuffer = buffer;
cachedBufferPos = bufferPos;
}
@@ -1159,7 +1151,7 @@
byteString.writeTo(out);
}
- out.write(copyArray(cachedBuffer, cachedBufferPos));
+ out.write(Arrays.copyOf(cachedBuffer, cachedBufferPos));
}
/**
@@ -1210,7 +1202,7 @@
private void flushLastBuffer() {
if (bufferPos < buffer.length) {
if (bufferPos > 0) {
- byte[] bufferCopy = copyArray(buffer, bufferPos);
+ byte[] bufferCopy = Arrays.copyOf(buffer, bufferPos);
flushedBuffers.add(new LiteralByteString(bufferCopy));
}
// We reuse this buffer for further writes.
diff --git a/java/core/src/main/java/com/google/protobuf/CheckReturnValue.java b/java/core/src/main/java/com/google/protobuf/CheckReturnValue.java
index 38c83d8..99abc32 100644
--- a/java/core/src/main/java/com/google/protobuf/CheckReturnValue.java
+++ b/java/core/src/main/java/com/google/protobuf/CheckReturnValue.java
@@ -41,13 +41,13 @@
import java.lang.annotation.Target;
/**
- * Indicates that the return value of the annotated method must be checked. An error is triggered
- * when one of these methods is called but the result is not used.
+ * Indicates that the return value of the annotated method must be used. An error is triggered when
+ * one of these methods is called but the result is not used.
*
* <p>{@code @CheckReturnValue} may be applied to a class or package to indicate that all methods in
- * that class or package must have their return values checked. For convenience, we provide an
- * annotation, {@link CanIgnoreReturnValue}, to exempt specific methods or classes from this
- * behavior.
+ * that class (including indirectly; that is, methods of inner classes within the annotated class)
+ * or package must have their return values used. For convenience, we provide an annotation, {@link
+ * CanIgnoreReturnValue}, to exempt specific methods or classes from this behavior.
*/
@Documented
@Target({METHOD, CONSTRUCTOR, TYPE, PACKAGE})
diff --git a/java/core/src/main/java/com/google/protobuf/Descriptors.java b/java/core/src/main/java/com/google/protobuf/Descriptors.java
index a36195b..91c9b19 100644
--- a/java/core/src/main/java/com/google/protobuf/Descriptors.java
+++ b/java/core/src/main/java/com/google/protobuf/Descriptors.java
@@ -78,6 +78,7 @@
*
* @author kenton@google.com Kenton Varda
*/
+@CheckReturnValue
public final class Descriptors {
private static final Logger logger = Logger.getLogger(Descriptors.class.getName());
private static final int[] EMPTY_INT_ARRAY = new int[0];
@@ -461,21 +462,20 @@
}
/**
- * This method is to be called by generated code only. It is used to update the
+ * This method is to be called by generated code only. It updates the
* FileDescriptorProto associated with the descriptor by parsing it again with the given
* ExtensionRegistry. This is needed to recognize custom options.
*/
public static void internalUpdateFileDescriptor(
- final FileDescriptor descriptor, final ExtensionRegistry registry) {
+ FileDescriptor descriptor, ExtensionRegistry registry) {
ByteString bytes = descriptor.proto.toByteString();
- FileDescriptorProto proto;
try {
- proto = FileDescriptorProto.parseFrom(bytes, registry);
+ FileDescriptorProto proto = FileDescriptorProto.parseFrom(bytes, registry);
+ descriptor.setProto(proto);
} catch (InvalidProtocolBufferException e) {
throw new IllegalArgumentException(
"Failed to parse protocol buffer descriptor for generated code.", e);
}
- descriptor.setProto(proto);
}
/**
@@ -1788,6 +1788,27 @@
return Collections.unmodifiableList(Arrays.asList(values));
}
+ /** Determines if the given field number is reserved. */
+ public boolean isReservedNumber(final int number) {
+ for (final EnumDescriptorProto.EnumReservedRange range : proto.getReservedRangeList()) {
+ if (range.getStart() <= number && number <= range.getEnd()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /** Determines if the given field name is reserved. */
+ public boolean isReservedName(final String name) {
+ checkNotNull(name);
+ for (final String reservedName : proto.getReservedNameList()) {
+ if (reservedName.equals(name)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
/**
* Find an enum value by name.
*
diff --git a/java/core/src/main/java/com/google/protobuf/ExtensionRegistryLite.java b/java/core/src/main/java/com/google/protobuf/ExtensionRegistryLite.java
index caa58e1..4b2aa07 100644
--- a/java/core/src/main/java/com/google/protobuf/ExtensionRegistryLite.java
+++ b/java/core/src/main/java/com/google/protobuf/ExtensionRegistryLite.java
@@ -123,16 +123,15 @@
* ExtensionRegistry} (if the full (non-Lite) proto libraries are available).
*/
public static ExtensionRegistryLite getEmptyRegistry() {
+ if (!doFullRuntimeInheritanceCheck) {
+ return EMPTY_REGISTRY_LITE;
+ }
ExtensionRegistryLite result = emptyRegistry;
if (result == null) {
synchronized (ExtensionRegistryLite.class) {
result = emptyRegistry;
if (result == null) {
- result =
- emptyRegistry =
- doFullRuntimeInheritanceCheck
- ? ExtensionRegistryFactory.createEmpty()
- : EMPTY_REGISTRY_LITE;
+ result = emptyRegistry = ExtensionRegistryFactory.createEmpty();
}
}
}
diff --git a/java/core/src/main/java/com/google/protobuf/GeneratedMessage.java b/java/core/src/main/java/com/google/protobuf/GeneratedMessage.java
index de0ee11..26cc5bb 100644
--- a/java/core/src/main/java/com/google/protobuf/GeneratedMessage.java
+++ b/java/core/src/main/java/com/google/protobuf/GeneratedMessage.java
@@ -36,7 +36,6 @@
import com.google.protobuf.Descriptors.FieldDescriptor;
import com.google.protobuf.Descriptors.FileDescriptor;
import com.google.protobuf.Descriptors.OneofDescriptor;
-
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectStreamException;
@@ -51,25 +50,23 @@
import java.util.TreeMap;
/**
- * All generated protocol message classes extend this class. This class
- * implements most of the Message and Builder interfaces using Java reflection.
- * Users can ignore this class and pretend that generated messages implement
- * the Message interface directly.
+ * All generated protocol message classes extend this class. This class implements most of the
+ * Message and Builder interfaces using Java reflection. Users can ignore this class and pretend
+ * that generated messages implement the Message interface directly.
*
* @author kenton@google.com Kenton Varda
*/
-public abstract class GeneratedMessage extends AbstractMessage
- implements Serializable {
+public abstract class GeneratedMessage extends AbstractMessage implements Serializable {
private static final long serialVersionUID = 1L;
/**
- * For testing. Allows a test to disable the optimization that avoids using
- * field builders for nested messages until they are requested. By disabling
- * this optimization, existing tests can be reused to test the field builders.
+ * For testing. Allows a test to disable the optimization that avoids using field builders for
+ * nested messages until they are requested. By disabling this optimization, existing tests can be
+ * reused to test the field builders.
*/
protected static boolean alwaysUseFieldBuilders = false;
- /** For use by generated code only. */
+ /** For use by generated code only. */
protected UnknownFieldSet unknownFields;
protected GeneratedMessage() {
@@ -82,24 +79,22 @@
@Override
public Parser<? extends GeneratedMessage> getParserForType() {
- throw new UnsupportedOperationException(
- "This is supposed to be overridden by subclasses.");
+ throw new UnsupportedOperationException("This is supposed to be overridden by subclasses.");
}
- /**
- * For testing. Allows a test to disable the optimization that avoids using
- * field builders for nested messages until they are requested. By disabling
- * this optimization, existing tests can be reused to test the field builders.
- * See {@link RepeatedFieldBuilder} and {@link SingleFieldBuilder}.
- */
+ /**
+ * For testing. Allows a test to disable the optimization that avoids using field builders for
+ * nested messages until they are requested. By disabling this optimization, existing tests can be
+ * reused to test the field builders. See {@link RepeatedFieldBuilder} and {@link
+ * SingleFieldBuilder}.
+ */
static void enableAlwaysUseFieldBuildersForTesting() {
alwaysUseFieldBuilders = true;
}
/**
- * Get the FieldAccessorTable for this type. We can't have the message
- * class pass this in to the constructor because of bootstrapping trouble
- * with DescriptorProtos.
+ * Get the FieldAccessorTable for this type. We can't have the message class pass this in to the
+ * constructor because of bootstrapping trouble with DescriptorProtos.
*/
protected abstract FieldAccessorTable internalGetFieldAccessorTable();
@@ -109,16 +104,14 @@
}
/**
- * Internal helper to return a modifiable map containing all the fields.
- * The returned Map is modifialbe so that the caller can add additional
- * extension fields to implement {@link #getAllFields()}.
+ * Internal helper to return a modifiable map containing all the fields. The returned Map is
+ * modifialbe so that the caller can add additional extension fields to implement {@link
+ * #getAllFields()}.
*
* @param getBytesForString whether to generate ByteString for string fields
*/
- private Map<FieldDescriptor, Object> getAllFieldsMutable(
- boolean getBytesForString) {
- final TreeMap<FieldDescriptor, Object> result =
- new TreeMap<FieldDescriptor, Object>();
+ private Map<FieldDescriptor, Object> getAllFieldsMutable(boolean getBytesForString) {
+ final TreeMap<FieldDescriptor, Object> result = new TreeMap<FieldDescriptor, Object>();
final Descriptor descriptor = internalGetFieldAccessorTable().descriptor;
final List<FieldDescriptor> fields = descriptor.getFields();
@@ -174,8 +167,8 @@
// Check that embedded messages are initialized.
if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
if (field.isRepeated()) {
- @SuppressWarnings("unchecked") final
- List<Message> messageList = (List<Message>) getField(field);
+ @SuppressWarnings("unchecked")
+ final List<Message> messageList = (List<Message>) getField(field);
for (final Message element : messageList) {
if (!element.isInitialized()) {
return false;
@@ -194,23 +187,19 @@
@Override
public Map<FieldDescriptor, Object> getAllFields() {
- return Collections.unmodifiableMap(
- getAllFieldsMutable(/* getBytesForString = */ false));
+ return Collections.unmodifiableMap(getAllFieldsMutable(/* getBytesForString = */ false));
}
/**
- * Returns a collection of all the fields in this message which are set
- * and their corresponding values. A singular ("required" or "optional")
- * field is set iff hasField() returns true for that field. A "repeated"
- * field is set iff getRepeatedFieldCount() is greater than zero. The
- * values are exactly what would be returned by calling
- * {@link #getFieldRaw(Descriptors.FieldDescriptor)} for each field. The map
- * is guaranteed to be a sorted map, so iterating over it will return fields
- * in order by field number.
+ * Returns a collection of all the fields in this message which are set and their corresponding
+ * values. A singular ("required" or "optional") field is set iff hasField() returns true for that
+ * field. A "repeated" field is set iff getRepeatedFieldCount() is greater than zero. The values
+ * are exactly what would be returned by calling {@link #getFieldRaw(Descriptors.FieldDescriptor)}
+ * for each field. The map is guaranteed to be a sorted map, so iterating over it will return
+ * fields in order by field number.
*/
Map<FieldDescriptor, Object> getAllFieldsRaw() {
- return Collections.unmodifiableMap(
- getAllFieldsMutable(/* getBytesForString = */ true));
+ return Collections.unmodifiableMap(getAllFieldsMutable(/* getBytesForString = */ true));
}
@Override
@@ -234,12 +223,11 @@
}
/**
- * Obtains the value of the given field, or the default value if it is
- * not set. For primitive fields, the boxed primitive value is returned.
- * For enum fields, the EnumValueDescriptor for the value is returned. For
- * embedded message fields, the sub-message is returned. For repeated
- * fields, a java.util.List is returned. For present string fields, a
- * ByteString is returned representing the bytes that the field contains.
+ * Obtains the value of the given field, or the default value if it is not set. For primitive
+ * fields, the boxed primitive value is returned. For enum fields, the EnumValueDescriptor for the
+ * value is returned. For embedded message fields, the sub-message is returned. For repeated
+ * fields, a java.util.List is returned. For present string fields, a ByteString is returned
+ * representing the bytes that the field contains.
*/
Object getFieldRaw(final FieldDescriptor field) {
return internalGetFieldAccessorTable().getField(field).getRaw(this);
@@ -247,31 +235,30 @@
@Override
public int getRepeatedFieldCount(final FieldDescriptor field) {
- return internalGetFieldAccessorTable().getField(field)
- .getRepeatedCount(this);
+ return internalGetFieldAccessorTable().getField(field).getRepeatedCount(this);
}
@Override
public Object getRepeatedField(final FieldDescriptor field, final int index) {
- return internalGetFieldAccessorTable().getField(field)
- .getRepeated(this, index);
+ return internalGetFieldAccessorTable().getField(field).getRepeated(this, index);
}
@Override
public UnknownFieldSet getUnknownFields() {
- throw new UnsupportedOperationException(
- "This is supposed to be overridden by subclasses.");
+ throw new UnsupportedOperationException("This is supposed to be overridden by subclasses.");
}
/**
* Called by subclasses to parse an unknown field.
+ *
* @return {@code true} unless the tag is an end-group tag.
*/
protected boolean parseUnknownField(
CodedInputStream input,
UnknownFieldSet.Builder unknownFields,
ExtensionRegistryLite extensionRegistry,
- int tag) throws IOException {
+ int tag)
+ throws IOException {
return unknownFields.mergeFieldFrom(tag, input);
}
@@ -284,8 +271,8 @@
}
}
- protected static <M extends Message> M parseWithIOException(Parser<M> parser, InputStream input,
- ExtensionRegistryLite extensions) throws IOException {
+ protected static <M extends Message> M parseWithIOException(
+ Parser<M> parser, InputStream input, ExtensionRegistryLite extensions) throws IOException {
try {
return parser.parseFrom(input, extensions);
} catch (InvalidProtocolBufferException e) {
@@ -293,8 +280,8 @@
}
}
- protected static <M extends Message> M parseWithIOException(Parser<M> parser,
- CodedInputStream input) throws IOException {
+ protected static <M extends Message> M parseWithIOException(
+ Parser<M> parser, CodedInputStream input) throws IOException {
try {
return parser.parseFrom(input);
} catch (InvalidProtocolBufferException e) {
@@ -302,8 +289,9 @@
}
}
- protected static <M extends Message> M parseWithIOException(Parser<M> parser,
- CodedInputStream input, ExtensionRegistryLite extensions) throws IOException {
+ protected static <M extends Message> M parseWithIOException(
+ Parser<M> parser, CodedInputStream input, ExtensionRegistryLite extensions)
+ throws IOException {
try {
return parser.parseFrom(input, extensions);
} catch (InvalidProtocolBufferException e) {
@@ -311,8 +299,8 @@
}
}
- protected static <M extends Message> M parseDelimitedWithIOException(Parser<M> parser,
- InputStream input) throws IOException {
+ protected static <M extends Message> M parseDelimitedWithIOException(
+ Parser<M> parser, InputStream input) throws IOException {
try {
return parser.parseDelimitedFrom(input);
} catch (InvalidProtocolBufferException e) {
@@ -320,8 +308,8 @@
}
}
- protected static <M extends Message> M parseDelimitedWithIOException(Parser<M> parser,
- InputStream input, ExtensionRegistryLite extensions) throws IOException {
+ protected static <M extends Message> M parseDelimitedWithIOException(
+ Parser<M> parser, InputStream input, ExtensionRegistryLite extensions) throws IOException {
try {
return parser.parseDelimitedFrom(input, extensions);
} catch (InvalidProtocolBufferException e) {
@@ -341,46 +329,38 @@
return size;
}
- memoizedSize = MessageReflection.getSerializedSize(
- this, getAllFieldsRaw());
+ memoizedSize = MessageReflection.getSerializedSize(this, getAllFieldsRaw());
return memoizedSize;
}
-
-
- /**
- * Used by parsing constructors in generated classes.
- */
+ /** Used by parsing constructors in generated classes. */
protected void makeExtensionsImmutable() {
// Noop for messages without extensions.
}
/**
- * TODO(xiaofeng): remove this after b/29368482 is fixed. We need to move this
- * interface to AbstractMessage in order to versioning GeneratedMessage but
- * this move breaks binary compatibility for AppEngine. After AppEngine is
- * fixed we can exclude this from google3.
+ * TODO(xiaofeng): remove this after b/29368482 is fixed. We need to move this interface to
+ * AbstractMessage in order to versioning GeneratedMessage but this move breaks binary
+ * compatibility for AppEngine. After AppEngine is fixed we can exclude this from google3.
*/
protected interface BuilderParent extends AbstractMessage.BuilderParent {}
- /**
- * TODO(xiaofeng): remove this together with GeneratedMessage.BuilderParent.
- */
+ /** TODO(xiaofeng): remove this together with GeneratedMessage.BuilderParent. */
protected abstract Message.Builder newBuilderForType(BuilderParent parent);
@Override
protected Message.Builder newBuilderForType(final AbstractMessage.BuilderParent parent) {
- return newBuilderForType(new BuilderParent() {
- @Override
- public void markDirty() {
- parent.markDirty();
- }
- });
+ return newBuilderForType(
+ new BuilderParent() {
+ @Override
+ public void markDirty() {
+ parent.markDirty();
+ }
+ });
}
-
@SuppressWarnings("unchecked")
- public abstract static class Builder <BuilderType extends Builder<BuilderType>>
+ public abstract static class Builder<BuilderType extends Builder<BuilderType>>
extends AbstractMessage.Builder<BuilderType> {
private BuilderParent builderParent;
@@ -391,8 +371,7 @@
// to dispatch dirty invalidations. See GeneratedMessage.BuilderListener.
private boolean isClean;
- private UnknownFieldSet unknownFields =
- UnknownFieldSet.getDefaultInstance();
+ private UnknownFieldSet unknownFields = UnknownFieldSet.getDefaultInstance();
protected Builder() {
this(null);
@@ -407,9 +386,7 @@
builderParent = null;
}
- /**
- * Called by the subclass when a message is built.
- */
+ /** Called by the subclass when a message is built. */
protected void onBuilt() {
if (builderParent != null) {
markClean();
@@ -417,8 +394,8 @@
}
/**
- * Called by the subclass or a builder to notify us that a message was
- * built and may be cached and therefore invalidations are needed.
+ * Called by the subclass or a builder to notify us that a message was built and may be cached
+ * and therefore invalidations are needed.
*/
@Override
protected void markClean() {
@@ -436,15 +413,14 @@
@Override
public BuilderType clone() {
- BuilderType builder =
- (BuilderType) getDefaultInstanceForType().newBuilderForType();
+ BuilderType builder = (BuilderType) getDefaultInstanceForType().newBuilderForType();
builder.mergeFrom(buildPartial());
return builder;
}
/**
- * Called by the initialization and clear code paths to allow subclasses to
- * reset any of their builtin fields back to the initial values.
+ * Called by the initialization and clear code paths to allow subclasses to reset any of their
+ * builtin fields back to the initial values.
*/
@Override
public BuilderType clear() {
@@ -454,9 +430,8 @@
}
/**
- * Get the FieldAccessorTable for this type. We can't have the message
- * class pass this in to the constructor because of bootstrapping trouble
- * with DescriptorProtos.
+ * Get the FieldAccessorTable for this type. We can't have the message class pass this in to the
+ * constructor because of bootstrapping trouble with DescriptorProtos.
*/
protected abstract FieldAccessorTable internalGetFieldAccessorTable();
@@ -472,8 +447,7 @@
/** Internal helper which returns a mutable map. */
private Map<FieldDescriptor, Object> getAllFieldsMutable() {
- final TreeMap<FieldDescriptor, Object> result =
- new TreeMap<FieldDescriptor, Object>();
+ final TreeMap<FieldDescriptor, Object> result = new TreeMap<FieldDescriptor, Object>();
final Descriptor descriptor = internalGetFieldAccessorTable().descriptor;
final List<FieldDescriptor> fields = descriptor.getFields();
@@ -525,8 +499,7 @@
@Override
public Message.Builder getRepeatedFieldBuilder(final FieldDescriptor field, int index) {
- return internalGetFieldAccessorTable().getField(field).getRepeatedBuilder(
- this, index);
+ return internalGetFieldAccessorTable().getField(field).getRepeatedBuilder(this, index);
}
@Override
@@ -576,21 +549,18 @@
@Override
public int getRepeatedFieldCount(final FieldDescriptor field) {
- return internalGetFieldAccessorTable().getField(field)
- .getRepeatedCount(this);
+ return internalGetFieldAccessorTable().getField(field).getRepeatedCount(this);
}
@Override
public Object getRepeatedField(final FieldDescriptor field, final int index) {
- return internalGetFieldAccessorTable().getField(field)
- .getRepeated(this, index);
+ return internalGetFieldAccessorTable().getField(field).getRepeated(this, index);
}
@Override
public BuilderType setRepeatedField(
final FieldDescriptor field, final int index, final Object value) {
- internalGetFieldAccessorTable().getField(field)
- .setRepeated(this, index, value);
+ internalGetFieldAccessorTable().getField(field).setRepeated(this, index, value);
return (BuilderType) this;
}
@@ -608,12 +578,9 @@
}
@Override
- public BuilderType mergeUnknownFields(
- final UnknownFieldSet unknownFields) {
+ public BuilderType mergeUnknownFields(final UnknownFieldSet unknownFields) {
this.unknownFields =
- UnknownFieldSet.newBuilder(this.unknownFields)
- .mergeFrom(unknownFields)
- .build();
+ UnknownFieldSet.newBuilder(this.unknownFields).mergeFrom(unknownFields).build();
onChanged();
return (BuilderType) this;
}
@@ -630,16 +597,15 @@
// Check that embedded messages are initialized.
if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
if (field.isRepeated()) {
- @SuppressWarnings("unchecked") final
- List<Message> messageList = (List<Message>) getField(field);
+ @SuppressWarnings("unchecked")
+ final List<Message> messageList = (List<Message>) getField(field);
for (final Message element : messageList) {
if (!element.isInitialized()) {
return false;
}
}
} else {
- if (hasField(field) &&
- !((Message) getField(field)).isInitialized()) {
+ if (hasField(field) && !((Message) getField(field)).isInitialized()) {
return false;
}
}
@@ -655,20 +621,21 @@
/**
* Called by subclasses to parse an unknown field.
+ *
* @return {@code true} unless the tag is an end-group tag.
*/
protected boolean parseUnknownField(
final CodedInputStream input,
final UnknownFieldSet.Builder unknownFields,
final ExtensionRegistryLite extensionRegistry,
- final int tag) throws IOException {
+ final int tag)
+ throws IOException {
return unknownFields.mergeFieldFrom(tag, input);
}
/**
- * Implementation of {@link BuilderParent} for giving to our children. This
- * small inner class makes it so we don't publicly expose the BuilderParent
- * methods.
+ * Implementation of {@link BuilderParent} for giving to our children. This small inner class
+ * makes it so we don't publicly expose the BuilderParent methods.
*/
private class BuilderParentImpl implements BuilderParent {
@@ -680,6 +647,7 @@
/**
* Gets the {@link BuilderParent} for giving to our children.
+ *
* @return The builder parent for our children.
*/
protected BuilderParent getParentForChildren() {
@@ -690,8 +658,8 @@
}
/**
- * Called when a the builder or one of its nested children has changed
- * and any parent should be notified of its invalidation.
+ * Called when a the builder or one of its nested children has changed and any parent should be
+ * notified of its invalidation.
*/
protected final void onChanged() {
if (isClean && builderParent != null) {
@@ -703,22 +671,19 @@
}
/**
- * Gets the map field with the given field number. This method should be
- * overridden in the generated message class if the message contains map
- * fields.
+ * Gets the map field with the given field number. This method should be overridden in the
+ * generated message class if the message contains map fields.
*
- * Unlike other field types, reflection support for map fields can't be
- * implemented based on generated public API because we need to access a
- * map field as a list in reflection API but the generated API only allows
- * us to access it as a map. This method returns the underlying map field
- * directly and thus enables us to access the map field as a list.
+ * <p>Unlike other field types, reflection support for map fields can't be implemented based on
+ * generated public API because we need to access a map field as a list in reflection API but
+ * the generated API only allows us to access it as a map. This method returns the underlying
+ * map field directly and thus enables us to access the map field as a list.
*/
@SuppressWarnings({"unused", "rawtypes"})
protected MapField internalGetMapField(int fieldNumber) {
// Note that we can't use descriptor names here because this method will
// be called when descriptor is being initialized.
- throw new RuntimeException(
- "No map fields found in " + getClass().getName());
+ throw new RuntimeException("No map fields found in " + getClass().getName());
}
/** Like {@link #internalGetMapField} but return a mutable version. */
@@ -726,76 +691,57 @@
protected MapField internalGetMutableMapField(int fieldNumber) {
// Note that we can't use descriptor names here because this method will
// be called when descriptor is being initialized.
- throw new RuntimeException(
- "No map fields found in " + getClass().getName());
+ throw new RuntimeException("No map fields found in " + getClass().getName());
}
}
// =================================================================
// Extensions-related stuff
- public interface ExtendableMessageOrBuilder<
- MessageType extends ExtendableMessage> extends MessageOrBuilder {
+ public interface ExtendableMessageOrBuilder<MessageType extends ExtendableMessage>
+ extends MessageOrBuilder {
// Re-define for return type covariance.
@Override
Message getDefaultInstanceForType();
/** Check if a singular extension is present. */
- <Type> boolean hasExtension(
- ExtensionLite<MessageType, Type> extension);
+ <Type> boolean hasExtension(ExtensionLite<MessageType, Type> extension);
/** Get the number of elements in a repeated extension. */
- <Type> int getExtensionCount(
- ExtensionLite<MessageType, List<Type>> extension);
+ <Type> int getExtensionCount(ExtensionLite<MessageType, List<Type>> extension);
/** Get the value of an extension. */
- <Type> Type getExtension(
- ExtensionLite<MessageType, Type> extension);
+ <Type> Type getExtension(ExtensionLite<MessageType, Type> extension);
/** Get one element of a repeated extension. */
- <Type> Type getExtension(
- ExtensionLite<MessageType, List<Type>> extension,
- int index);
+ <Type> Type getExtension(ExtensionLite<MessageType, List<Type>> extension, int index);
/** Check if a singular extension is present. */
- <Type> boolean hasExtension(
- Extension<MessageType, Type> extension);
+ <Type> boolean hasExtension(Extension<MessageType, Type> extension);
/** Check if a singular extension is present. */
- <Type> boolean hasExtension(
- GeneratedExtension<MessageType, Type> extension);
+ <Type> boolean hasExtension(GeneratedExtension<MessageType, Type> extension);
/** Get the number of elements in a repeated extension. */
- <Type> int getExtensionCount(
- Extension<MessageType, List<Type>> extension);
+ <Type> int getExtensionCount(Extension<MessageType, List<Type>> extension);
/** Get the number of elements in a repeated extension. */
- <Type> int getExtensionCount(
- GeneratedExtension<MessageType, List<Type>> extension);
+ <Type> int getExtensionCount(GeneratedExtension<MessageType, List<Type>> extension);
/** Get the value of an extension. */
- <Type> Type getExtension(
- Extension<MessageType, Type> extension);
+ <Type> Type getExtension(Extension<MessageType, Type> extension);
/** Get the value of an extension. */
- <Type> Type getExtension(
- GeneratedExtension<MessageType, Type> extension);
+ <Type> Type getExtension(GeneratedExtension<MessageType, Type> extension);
/** Get one element of a repeated extension. */
- <Type> Type getExtension(
- Extension<MessageType, List<Type>> extension,
- int index);
+ <Type> Type getExtension(Extension<MessageType, List<Type>> extension, int index);
/** Get one element of a repeated extension. */
- <Type> Type getExtension(
- GeneratedExtension<MessageType, List<Type>> extension,
- int index);
+ <Type> Type getExtension(GeneratedExtension<MessageType, List<Type>> extension, int index);
}
/**
- * Generated message classes for message types that contain extension ranges
- * subclass this.
+ * Generated message classes for message types that contain extension ranges subclass this.
*
- * <p>This class implements type-safe accessors for extensions. They
- * implement all the same operations that you can do with normal fields --
- * e.g. "has", "get", and "getCount" -- but for extensions. The extensions
- * are identified using instances of the class {@link GeneratedExtension};
- * the protocol compiler generates a static instance of this class for every
- * extension in its input. Through the magic of generics, all is made
- * type-safe.
+ * <p>This class implements type-safe accessors for extensions. They implement all the same
+ * operations that you can do with normal fields -- e.g. "has", "get", and "getCount" -- but for
+ * extensions. The extensions are identified using instances of the class {@link
+ * GeneratedExtension}; the protocol compiler generates a static instance of this class for every
+ * extension in its input. Through the magic of generics, all is made type-safe.
*
* <p>For example, imagine you have the {@code .proto} file:
*
@@ -820,10 +766,8 @@
*
* <p>See also {@link ExtendableBuilder}.
*/
- public abstract static class ExtendableMessage<
- MessageType extends ExtendableMessage>
- extends GeneratedMessage
- implements ExtendableMessageOrBuilder<MessageType> {
+ public abstract static class ExtendableMessage<MessageType extends ExtendableMessage>
+ extends GeneratedMessage implements ExtendableMessageOrBuilder<MessageType> {
private static final long serialVersionUID = 1L;
@@ -833,22 +777,20 @@
this.extensions = FieldSet.newFieldSet();
}
- protected ExtendableMessage(
- ExtendableBuilder<MessageType, ?> builder) {
+ protected ExtendableMessage(ExtendableBuilder<MessageType, ?> builder) {
super(builder);
this.extensions = builder.buildExtensions();
}
- private void verifyExtensionContainingType(
- final Extension<MessageType, ?> extension) {
- if (extension.getDescriptor().getContainingType() !=
- getDescriptorForType()) {
+ private void verifyExtensionContainingType(final Extension<MessageType, ?> extension) {
+ if (extension.getDescriptor().getContainingType() != getDescriptorForType()) {
// This can only happen if someone uses unchecked operations.
throw new IllegalArgumentException(
- "Extension is for type \"" +
- extension.getDescriptor().getContainingType().getFullName() +
- "\" which does not match message type \"" +
- getDescriptorForType().getFullName() + "\".");
+ "Extension is for type \""
+ + extension.getDescriptor().getContainingType().getFullName()
+ + "\" which does not match message type \""
+ + getDescriptorForType().getFullName()
+ + "\".");
}
}
@@ -886,12 +828,10 @@
if (value == null) {
if (descriptor.isRepeated()) {
return (Type) Collections.emptyList();
- } else if (descriptor.getJavaType() ==
- FieldDescriptor.JavaType.MESSAGE) {
+ } else if (descriptor.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
return (Type) extension.getMessageDefaultInstance();
} else {
- return (Type) extension.fromReflectionType(
- descriptor.getDefaultValue());
+ return (Type) extension.fromReflectionType(descriptor.getDefaultValue());
}
} else {
return (Type) extension.fromReflectionType(value);
@@ -907,8 +847,8 @@
verifyExtensionContainingType(extension);
FieldDescriptor descriptor = extension.getDescriptor();
- return (Type) extension.singularFromReflectionType(
- extensions.getRepeatedField(descriptor, index));
+ return (Type)
+ extension.singularFromReflectionType(extensions.getRepeatedField(descriptor, index));
}
/** Check if a singular extension is present. */
@@ -924,8 +864,7 @@
}
/** Get the number of elements in a repeated extension. */
@Override
- public final <Type> int getExtensionCount(
- final Extension<MessageType, List<Type>> extension) {
+ public final <Type> int getExtensionCount(final Extension<MessageType, List<Type>> extension) {
return getExtensionCount((ExtensionLite<MessageType, List<Type>>) extension);
}
/** Get the number of elements in a repeated extension. */
@@ -941,8 +880,7 @@
}
/** Get the value of an extension. */
@Override
- public final <Type> Type getExtension(
- final GeneratedExtension<MessageType, Type> extension) {
+ public final <Type> Type getExtension(final GeneratedExtension<MessageType, Type> extension) {
return getExtension((ExtensionLite<MessageType, Type>) extension);
}
/** Get one element of a repeated extension. */
@@ -973,33 +911,33 @@
CodedInputStream input,
UnknownFieldSet.Builder unknownFields,
ExtensionRegistryLite extensionRegistry,
- int tag) throws IOException {
+ int tag)
+ throws IOException {
return MessageReflection.mergeFieldFrom(
- input, unknownFields, extensionRegistry, getDescriptorForType(),
- new MessageReflection.ExtensionAdapter(extensions), tag);
+ input,
+ unknownFields,
+ extensionRegistry,
+ getDescriptorForType(),
+ new MessageReflection.ExtensionAdapter(extensions),
+ tag);
}
-
- /**
- * Used by parsing constructors in generated classes.
- */
+ /** Used by parsing constructors in generated classes. */
@Override
protected void makeExtensionsImmutable() {
extensions.makeImmutable();
}
/**
- * Used by subclasses to serialize extensions. Extension ranges may be
- * interleaved with field numbers, but we must write them in canonical
- * (sorted by field number) order. ExtensionWriter helps us write
- * individual ranges of extensions at once.
+ * Used by subclasses to serialize extensions. Extension ranges may be interleaved with field
+ * numbers, but we must write them in canonical (sorted by field number) order. ExtensionWriter
+ * helps us write individual ranges of extensions at once.
*/
protected class ExtensionWriter {
// Imagine how much simpler this code would be if Java iterators had
// a way to get the next element without advancing the iterator.
- private final Iterator<Map.Entry<FieldDescriptor, Object>> iter =
- extensions.iterator();
+ private final Iterator<Map.Entry<FieldDescriptor, Object>> iter = extensions.iterator();
private Map.Entry<FieldDescriptor, Object> next;
private final boolean messageSetWireFormat;
@@ -1010,19 +948,18 @@
this.messageSetWireFormat = messageSetWireFormat;
}
- public void writeUntil(final int end, final CodedOutputStream output)
- throws IOException {
+ public void writeUntil(final int end, final CodedOutputStream output) throws IOException {
while (next != null && next.getKey().getNumber() < end) {
FieldDescriptor descriptor = next.getKey();
- if (messageSetWireFormat && descriptor.getLiteJavaType() ==
- WireFormat.JavaType.MESSAGE &&
- !descriptor.isRepeated()) {
+ if (messageSetWireFormat
+ && descriptor.getLiteJavaType() == WireFormat.JavaType.MESSAGE
+ && !descriptor.isRepeated()) {
if (next instanceof LazyField.LazyEntry<?>) {
- output.writeRawMessageSetExtension(descriptor.getNumber(),
+ output.writeRawMessageSetExtension(
+ descriptor.getNumber(),
((LazyField.LazyEntry<?>) next).getField().toByteString());
} else {
- output.writeMessageSetExtension(descriptor.getNumber(),
- (Message) next.getValue());
+ output.writeMessageSetExtension(descriptor.getNumber(), (Message) next.getValue());
}
} else {
// TODO(xiangl): Taken care of following code, it may cause
@@ -1046,6 +983,7 @@
protected ExtensionWriter newExtensionWriter() {
return new ExtensionWriter(false);
}
+
protected ExtensionWriter newMessageSetExtensionWriter() {
return new ExtensionWriter(true);
}
@@ -1054,6 +992,7 @@
protected int extensionsSerializedSize() {
return extensions.getSerializedSize();
}
+
protected int extensionsSerializedSizeAsMessageSet() {
return extensions.getMessageSetSerializedSize();
}
@@ -1125,8 +1064,7 @@
}
@Override
- public Object getRepeatedField(final FieldDescriptor field,
- final int index) {
+ public Object getRepeatedField(final FieldDescriptor field, final int index) {
if (field.isExtension()) {
verifyContainingType(field);
return extensions.getRepeatedField(field, index);
@@ -1137,23 +1075,19 @@
private void verifyContainingType(final FieldDescriptor field) {
if (field.getContainingType() != getDescriptorForType()) {
- throw new IllegalArgumentException(
- "FieldDescriptor does not match message type.");
+ throw new IllegalArgumentException("FieldDescriptor does not match message type.");
}
}
}
/**
- * Generated message builders for message types that contain extension ranges
- * subclass this.
+ * Generated message builders for message types that contain extension ranges subclass this.
*
- * <p>This class implements type-safe accessors for extensions. They
- * implement all the same operations that you can do with normal fields --
- * e.g. "get", "set", and "add" -- but for extensions. The extensions are
- * identified using instances of the class {@link GeneratedExtension}; the
- * protocol compiler generates a static instance of this class for every
- * extension in its input. Through the magic of generics, all is made
- * type-safe.
+ * <p>This class implements type-safe accessors for extensions. They implement all the same
+ * operations that you can do with normal fields -- e.g. "get", "set", and "add" -- but for
+ * extensions. The extensions are identified using instances of the class {@link
+ * GeneratedExtension}; the protocol compiler generates a static instance of this class for every
+ * extension in its input. Through the magic of generics, all is made type-safe.
*
* <p>For example, imagine you have the {@code .proto} file:
*
@@ -1182,17 +1116,15 @@
*/
@SuppressWarnings("unchecked")
public abstract static class ExtendableBuilder<
- MessageType extends ExtendableMessage,
- BuilderType extends ExtendableBuilder<MessageType, BuilderType>>
- extends Builder<BuilderType>
- implements ExtendableMessageOrBuilder<MessageType> {
+ MessageType extends ExtendableMessage,
+ BuilderType extends ExtendableBuilder<MessageType, BuilderType>>
+ extends Builder<BuilderType> implements ExtendableMessageOrBuilder<MessageType> {
private FieldSet<FieldDescriptor> extensions = FieldSet.emptySet();
protected ExtendableBuilder() {}
- protected ExtendableBuilder(
- BuilderParent parent) {
+ protected ExtendableBuilder(BuilderParent parent) {
super(parent);
}
@@ -1221,16 +1153,15 @@
}
}
- private void verifyExtensionContainingType(
- final Extension<MessageType, ?> extension) {
- if (extension.getDescriptor().getContainingType() !=
- getDescriptorForType()) {
+ private void verifyExtensionContainingType(final Extension<MessageType, ?> extension) {
+ if (extension.getDescriptor().getContainingType() != getDescriptorForType()) {
// This can only happen if someone uses unchecked operations.
throw new IllegalArgumentException(
- "Extension is for type \"" +
- extension.getDescriptor().getContainingType().getFullName() +
- "\" which does not match message type \"" +
- getDescriptorForType().getFullName() + "\".");
+ "Extension is for type \""
+ + extension.getDescriptor().getContainingType().getFullName()
+ + "\" which does not match message type \""
+ + getDescriptorForType().getFullName()
+ + "\".");
}
}
@@ -1265,12 +1196,10 @@
if (value == null) {
if (descriptor.isRepeated()) {
return (Type) Collections.emptyList();
- } else if (descriptor.getJavaType() ==
- FieldDescriptor.JavaType.MESSAGE) {
+ } else if (descriptor.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
return (Type) extension.getMessageDefaultInstance();
} else {
- return (Type) extension.fromReflectionType(
- descriptor.getDefaultValue());
+ return (Type) extension.fromReflectionType(descriptor.getDefaultValue());
}
} else {
return (Type) extension.fromReflectionType(value);
@@ -1285,14 +1214,13 @@
verifyExtensionContainingType(extension);
FieldDescriptor descriptor = extension.getDescriptor();
- return (Type) extension.singularFromReflectionType(
- extensions.getRepeatedField(descriptor, index));
+ return (Type)
+ extension.singularFromReflectionType(extensions.getRepeatedField(descriptor, index));
}
/** Set the value of an extension. */
public final <Type> BuilderType setExtension(
- final ExtensionLite<MessageType, Type> extensionLite,
- final Type value) {
+ final ExtensionLite<MessageType, Type> extensionLite, final Type value) {
Extension<MessageType, Type> extension = checkNotLite(extensionLite);
verifyExtensionContainingType(extension);
@@ -1306,30 +1234,27 @@
/** Set the value of one element of a repeated extension. */
public final <Type> BuilderType setExtension(
final ExtensionLite<MessageType, List<Type>> extensionLite,
- final int index, final Type value) {
- Extension<MessageType, List<Type>> extension = checkNotLite(extensionLite);
-
- verifyExtensionContainingType(extension);
- ensureExtensionsIsMutable();
- final FieldDescriptor descriptor = extension.getDescriptor();
- extensions.setRepeatedField(
- descriptor, index,
- extension.singularToReflectionType(value));
- onChanged();
- return (BuilderType) this;
- }
-
- /** Append a value to a repeated extension. */
- public final <Type> BuilderType addExtension(
- final ExtensionLite<MessageType, List<Type>> extensionLite,
+ final int index,
final Type value) {
Extension<MessageType, List<Type>> extension = checkNotLite(extensionLite);
verifyExtensionContainingType(extension);
ensureExtensionsIsMutable();
final FieldDescriptor descriptor = extension.getDescriptor();
- extensions.addRepeatedField(
- descriptor, extension.singularToReflectionType(value));
+ extensions.setRepeatedField(descriptor, index, extension.singularToReflectionType(value));
+ onChanged();
+ return (BuilderType) this;
+ }
+
+ /** Append a value to a repeated extension. */
+ public final <Type> BuilderType addExtension(
+ final ExtensionLite<MessageType, List<Type>> extensionLite, final Type value) {
+ Extension<MessageType, List<Type>> extension = checkNotLite(extensionLite);
+
+ verifyExtensionContainingType(extension);
+ ensureExtensionsIsMutable();
+ final FieldDescriptor descriptor = extension.getDescriptor();
+ extensions.addRepeatedField(descriptor, extension.singularToReflectionType(value));
onChanged();
return (BuilderType) this;
}
@@ -1359,8 +1284,7 @@
}
/** Get the number of elements in a repeated extension. */
@Override
- public final <Type> int getExtensionCount(
- final Extension<MessageType, List<Type>> extension) {
+ public final <Type> int getExtensionCount(final Extension<MessageType, List<Type>> extension) {
return getExtensionCount((ExtensionLite<MessageType, List<Type>>) extension);
}
/** Get the number of elements in a repeated extension. */
@@ -1376,8 +1300,7 @@
}
/** Get the value of an extension. */
@Override
- public final <Type> Type getExtension(
- final GeneratedExtension<MessageType, Type> extension) {
+ public final <Type> Type getExtension(final GeneratedExtension<MessageType, Type> extension) {
return getExtension((ExtensionLite<MessageType, Type>) extension);
}
/** Get the value of an extension. */
@@ -1404,14 +1327,14 @@
}
/** Set the value of one element of a repeated extension. */
public final <Type> BuilderType setExtension(
- final Extension<MessageType, List<Type>> extension,
- final int index, final Type value) {
+ final Extension<MessageType, List<Type>> extension, final int index, final Type value) {
return setExtension((ExtensionLite<MessageType, List<Type>>) extension, index, value);
}
/** Set the value of one element of a repeated extension. */
public <Type> BuilderType setExtension(
final GeneratedExtension<MessageType, List<Type>> extension,
- final int index, final Type value) {
+ final int index,
+ final Type value) {
return setExtension((ExtensionLite<MessageType, List<Type>>) extension, index, value);
}
/** Append a value to a repeated extension. */
@@ -1425,13 +1348,11 @@
return addExtension((ExtensionLite<MessageType, List<Type>>) extension, value);
}
/** Clear an extension. */
- public final <Type> BuilderType clearExtension(
- final Extension<MessageType, ?> extension) {
+ public final <Type> BuilderType clearExtension(final Extension<MessageType, ?> extension) {
return clearExtension((ExtensionLite<MessageType, ?>) extension);
}
/** Clear an extension. */
- public <Type> BuilderType clearExtension(
- final GeneratedExtension<MessageType, ?> extension) {
+ public <Type> BuilderType clearExtension(final GeneratedExtension<MessageType, ?> extension) {
return clearExtension((ExtensionLite<MessageType, ?>) extension);
}
@@ -1441,8 +1362,7 @@
}
/**
- * Called by the build code path to create a copy of the extensions for
- * building the message.
+ * Called by the build code path to create a copy of the extensions for building the message.
*/
private FieldSet<FieldDescriptor> buildExtensions() {
extensions.makeImmutable();
@@ -1456,6 +1376,7 @@
/**
* Called by subclasses to parse an unknown field or an extension.
+ *
* @return {@code true} unless the tag is an end-group tag.
*/
@Override
@@ -1463,10 +1384,15 @@
final CodedInputStream input,
final UnknownFieldSet.Builder unknownFields,
final ExtensionRegistryLite extensionRegistry,
- final int tag) throws IOException {
+ final int tag)
+ throws IOException {
return MessageReflection.mergeFieldFrom(
- input, unknownFields, extensionRegistry, getDescriptorForType(),
- new MessageReflection.BuilderAdapter(this), tag);
+ input,
+ unknownFields,
+ extensionRegistry,
+ getDescriptorForType(),
+ new MessageReflection.BuilderAdapter(this),
+ tag);
}
// ---------------------------------------------------------------
@@ -1511,8 +1437,7 @@
}
@Override
- public Object getRepeatedField(final FieldDescriptor field,
- final int index) {
+ public Object getRepeatedField(final FieldDescriptor field, final int index) {
if (field.isExtension()) {
verifyContainingType(field);
return extensions.getRepeatedField(field, index);
@@ -1532,8 +1457,7 @@
}
@Override
- public BuilderType setField(final FieldDescriptor field,
- final Object value) {
+ public BuilderType setField(final FieldDescriptor field, final Object value) {
if (field.isExtension()) {
verifyContainingType(field);
ensureExtensionsIsMutable();
@@ -1559,8 +1483,8 @@
}
@Override
- public BuilderType setRepeatedField(final FieldDescriptor field,
- final int index, final Object value) {
+ public BuilderType setRepeatedField(
+ final FieldDescriptor field, final int index, final Object value) {
if (field.isExtension()) {
verifyContainingType(field);
ensureExtensionsIsMutable();
@@ -1573,8 +1497,7 @@
}
@Override
- public BuilderType addRepeatedField(final FieldDescriptor field,
- final Object value) {
+ public BuilderType addRepeatedField(final FieldDescriptor field, final Object value) {
if (field.isExtension()) {
verifyContainingType(field);
ensureExtensionsIsMutable();
@@ -1594,8 +1517,7 @@
private void verifyContainingType(final FieldDescriptor field) {
if (field.getContainingType() != getDescriptorForType()) {
- throw new IllegalArgumentException(
- "FieldDescriptor does not match message type.");
+ throw new IllegalArgumentException("FieldDescriptor does not match message type.");
}
}
}
@@ -1603,8 +1525,8 @@
// -----------------------------------------------------------------
/**
- * Gets the descriptor for an extension. The implementation depends on whether
- * the extension is scoped in the top level of a file or scoped in a Message.
+ * Gets the descriptor for an extension. The implementation depends on whether the extension is
+ * scoped in the top level of a file or scoped in a Message.
*/
static interface ExtensionDescriptorRetriever {
FieldDescriptor getDescriptor();
@@ -1612,11 +1534,11 @@
/** For use by generated code only. */
public static <ContainingType extends Message, Type>
- GeneratedExtension<ContainingType, Type>
- newMessageScopedGeneratedExtension(final Message scope,
- final int descriptorIndex,
- final Class singularType,
- final Message defaultInstance) {
+ GeneratedExtension<ContainingType, Type> newMessageScopedGeneratedExtension(
+ final Message scope,
+ final int descriptorIndex,
+ final Class singularType,
+ final Message defaultInstance) {
// For extensions scoped within a Message, we use the Message to resolve
// the outer class's descriptor, from which the extension descriptor is
// obtained.
@@ -1634,22 +1556,21 @@
/** For use by generated code only. */
public static <ContainingType extends Message, Type>
- GeneratedExtension<ContainingType, Type>
- newFileScopedGeneratedExtension(final Class singularType,
- final Message defaultInstance) {
+ GeneratedExtension<ContainingType, Type> newFileScopedGeneratedExtension(
+ final Class singularType, final Message defaultInstance) {
// For extensions scoped within a file, we rely on the outer class's
// static initializer to call internalInit() on the extension when the
// descriptor is available.
return new GeneratedExtension<ContainingType, Type>(
- null, // ExtensionDescriptorRetriever is initialized in internalInit();
+ null, // ExtensionDescriptorRetriever is initialized in internalInit();
singularType,
defaultInstance,
Extension.ExtensionType.IMMUTABLE);
}
- private abstract static class CachedDescriptorRetriever
- implements ExtensionDescriptorRetriever {
+ private abstract static class CachedDescriptorRetriever implements ExtensionDescriptorRetriever {
private volatile FieldDescriptor descriptor;
+
protected abstract FieldDescriptor loadDescriptor();
@Override
@@ -1668,15 +1589,16 @@
/**
* Used in proto1 generated code only.
*
- * After enabling bridge, we can define proto2 extensions (the extended type
- * is a proto2 mutable message) in a proto1 .proto file. For these extensions
- * we should generate proto2 GeneratedExtensions.
+ * <p>After enabling bridge, we can define proto2 extensions (the extended type is a proto2
+ * mutable message) in a proto1 .proto file. For these extensions we should generate proto2
+ * GeneratedExtensions.
*/
public static <ContainingType extends Message, Type>
- GeneratedExtension<ContainingType, Type>
- newMessageScopedGeneratedExtension(
- final Message scope, final String name,
- final Class singularType, final Message defaultInstance) {
+ GeneratedExtension<ContainingType, Type> newMessageScopedGeneratedExtension(
+ final Message scope,
+ final String name,
+ final Class singularType,
+ final Message defaultInstance) {
// For extensions scoped within a Message, we use the Message to resolve
// the outer class's descriptor, from which the extension descriptor is
// obtained.
@@ -1695,15 +1617,16 @@
/**
* Used in proto1 generated code only.
*
- * After enabling bridge, we can define proto2 extensions (the extended type
- * is a proto2 mutable message) in a proto1 .proto file. For these extensions
- * we should generate proto2 GeneratedExtensions.
+ * <p>After enabling bridge, we can define proto2 extensions (the extended type is a proto2
+ * mutable message) in a proto1 .proto file. For these extensions we should generate proto2
+ * GeneratedExtensions.
*/
public static <ContainingType extends Message, Type>
- GeneratedExtension<ContainingType, Type>
- newFileScopedGeneratedExtension(
- final Class singularType, final Message defaultInstance,
- final String descriptorOuterClass, final String extensionName) {
+ GeneratedExtension<ContainingType, Type> newFileScopedGeneratedExtension(
+ final Class singularType,
+ final Message defaultInstance,
+ final String descriptorOuterClass,
+ final String extensionName) {
// For extensions scoped within a file, we load the descriptor outer
// class and rely on it to get the FileDescriptor which then can be
// used to obtain the extension's FieldDescriptor.
@@ -1730,8 +1653,8 @@
}
/**
- * Type used to represent generated extensions. The protocol compiler
- * generates a static singleton instance of this class for each extension.
+ * Type used to represent generated extensions. The protocol compiler generates a static singleton
+ * instance of this class for each extension.
*
* <p>For example, imagine you have the {@code .proto} file:
*
@@ -1747,16 +1670,14 @@
* }
* </pre>
*
- * <p>Then, {@code MyProto.Foo.bar} has type
- * {@code GeneratedExtension<MyProto.Foo, Integer>}.
+ * <p>Then, {@code MyProto.Foo.bar} has type {@code GeneratedExtension<MyProto.Foo, Integer>}.
*
- * <p>In general, users should ignore the details of this type, and simply use
- * these static singletons as parameters to the extension accessors defined
- * in {@link ExtendableMessage} and {@link ExtendableBuilder}.
+ * <p>In general, users should ignore the details of this type, and simply use these static
+ * singletons as parameters to the extension accessors defined in {@link ExtendableMessage} and
+ * {@link ExtendableBuilder}.
*/
- public static class GeneratedExtension<
- ContainingType extends Message, Type> extends
- Extension<ContainingType, Type> {
+ public static class GeneratedExtension<ContainingType extends Message, Type>
+ extends Extension<ContainingType, Type> {
// TODO(kenton): Find ways to avoid using Java reflection within this
// class. Also try to avoid suppressing unchecked warnings.
@@ -1772,12 +1693,13 @@
// In the case of non-nested extensions, we initialize the
// ExtensionDescriptorRetriever to null and rely on the outer class's static
// initializer to call internalInit() after the descriptor has been parsed.
- GeneratedExtension(ExtensionDescriptorRetriever descriptorRetriever,
+ GeneratedExtension(
+ ExtensionDescriptorRetriever descriptorRetriever,
Class singularType,
Message messageDefaultInstance,
ExtensionType extensionType) {
- if (Message.class.isAssignableFrom(singularType) &&
- !singularType.isInstance(messageDefaultInstance)) {
+ if (Message.class.isAssignableFrom(singularType)
+ && !singularType.isInstance(messageDefaultInstance)) {
throw new IllegalArgumentException(
"Bad messageDefaultInstance for " + singularType.getName());
}
@@ -1786,10 +1708,8 @@
this.messageDefaultInstance = messageDefaultInstance;
if (ProtocolMessageEnum.class.isAssignableFrom(singularType)) {
- this.enumValueOf = getMethodOrDie(singularType, "valueOf",
- EnumValueDescriptor.class);
- this.enumGetValueDescriptor =
- getMethodOrDie(singularType, "getValueDescriptor");
+ this.enumValueOf = getMethodOrDie(singularType, "valueOf", EnumValueDescriptor.class);
+ this.enumGetValueDescriptor = getMethodOrDie(singularType, "getValueDescriptor");
} else {
this.enumValueOf = null;
this.enumGetValueDescriptor = null;
@@ -1821,15 +1741,14 @@
@Override
public FieldDescriptor getDescriptor() {
if (descriptorRetriever == null) {
- throw new IllegalStateException(
- "getDescriptor() called before internalInit()");
+ throw new IllegalStateException("getDescriptor() called before internalInit()");
}
return descriptorRetriever.getDescriptor();
}
/**
- * If the extension is an embedded message or group, returns the default
- * instance of the message.
+ * If the extension is an embedded message or group, returns the default instance of the
+ * message.
*/
@Override
public Message getMessageDefaultInstance() {
@@ -1842,18 +1761,17 @@
}
/**
- * Convert from the type used by the reflection accessors to the type used
- * by native accessors. E.g., for enums, the reflection accessors use
- * EnumValueDescriptors but the native accessors use the generated enum
- * type.
+ * Convert from the type used by the reflection accessors to the type used by native accessors.
+ * E.g., for enums, the reflection accessors use EnumValueDescriptors but the native accessors
+ * use the generated enum type.
*/
@Override
@SuppressWarnings("unchecked")
protected Object fromReflectionType(final Object value) {
FieldDescriptor descriptor = getDescriptor();
if (descriptor.isRepeated()) {
- if (descriptor.getJavaType() == FieldDescriptor.JavaType.MESSAGE ||
- descriptor.getJavaType() == FieldDescriptor.JavaType.ENUM) {
+ if (descriptor.getJavaType() == FieldDescriptor.JavaType.MESSAGE
+ || descriptor.getJavaType() == FieldDescriptor.JavaType.ENUM) {
// Must convert the whole list.
final List result = new ArrayList();
for (final Object element : (List) value) {
@@ -1869,8 +1787,8 @@
}
/**
- * Like {@link #fromReflectionType(Object)}, but if the type is a repeated
- * type, this converts a single element.
+ * Like {@link #fromReflectionType(Object)}, but if the type is a repeated type, this converts a
+ * single element.
*/
@Override
protected Object singularFromReflectionType(final Object value) {
@@ -1880,8 +1798,7 @@
if (singularType.isInstance(value)) {
return value;
} else {
- return messageDefaultInstance.newBuilderForType()
- .mergeFrom((Message) value).build();
+ return messageDefaultInstance.newBuilderForType().mergeFrom((Message) value).build();
}
case ENUM:
return invokeOrDie(enumValueOf, null, (EnumValueDescriptor) value);
@@ -1891,10 +1808,9 @@
}
/**
- * Convert from the type used by the native accessors to the type used
- * by reflection accessors. E.g., for enums, the reflection accessors use
- * EnumValueDescriptors but the native accessors use the generated enum
- * type.
+ * Convert from the type used by the native accessors to the type used by reflection accessors.
+ * E.g., for enums, the reflection accessors use EnumValueDescriptors but the native accessors
+ * use the generated enum type.
*/
@Override
@SuppressWarnings("unchecked")
@@ -1917,8 +1833,8 @@
}
/**
- * Like {@link #toReflectionType(Object)}, but if the type is a repeated
- * type, this converts a single element.
+ * Like {@link #toReflectionType(Object)}, but if the type is a repeated type, this converts a
+ * single element.
*/
@Override
protected Object singularToReflectionType(final Object value) {
@@ -1955,8 +1871,7 @@
if (getDescriptor().getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
return (Type) messageDefaultInstance;
}
- return (Type) singularFromReflectionType(
- getDescriptor().getDefaultValue());
+ return (Type) singularFromReflectionType(getDescriptor().getDefaultValue());
}
}
@@ -1970,8 +1885,8 @@
return clazz.getMethod(name, params);
} catch (NoSuchMethodException e) {
throw new RuntimeException(
- "Generated message class \"" + clazz.getName() +
- "\" missing method \"" + name + "\".", e);
+ "Generated message class \"" + clazz.getName() + "\" missing method \"" + name + "\".",
+ e);
}
}
@@ -1982,8 +1897,7 @@
return method.invoke(object, params);
} catch (IllegalAccessException e) {
throw new RuntimeException(
- "Couldn't use Java reflection to implement protocol message " +
- "reflection.", e);
+ "Couldn't use Java reflection to implement protocol message " + "reflection.", e);
} catch (InvocationTargetException e) {
final Throwable cause = e.getCause();
if (cause instanceof RuntimeException) {
@@ -1992,45 +1906,42 @@
throw (Error) cause;
} else {
throw new RuntimeException(
- "Unexpected exception thrown by generated accessor method.", cause);
+ "Unexpected exception thrown by generated accessor method.", cause);
}
}
}
/**
- * Gets the map field with the given field number. This method should be
- * overridden in the generated message class if the message contains map
- * fields.
+ * Gets the map field with the given field number. This method should be overridden in the
+ * generated message class if the message contains map fields.
*
- * Unlike other field types, reflection support for map fields can't be
- * implemented based on generated public API because we need to access a
- * map field as a list in reflection API but the generated API only allows
- * us to access it as a map. This method returns the underlying map field
- * directly and thus enables us to access the map field as a list.
+ * <p>Unlike other field types, reflection support for map fields can't be implemented based on
+ * generated public API because we need to access a map field as a list in reflection API but the
+ * generated API only allows us to access it as a map. This method returns the underlying map
+ * field directly and thus enables us to access the map field as a list.
*/
@SuppressWarnings({"rawtypes", "unused"})
protected MapField internalGetMapField(int fieldNumber) {
// Note that we can't use descriptor names here because this method will
// be called when descriptor is being initialized.
- throw new RuntimeException(
- "No map fields found in " + getClass().getName());
+ throw new RuntimeException("No map fields found in " + getClass().getName());
}
/**
- * Users should ignore this class. This class provides the implementation
- * with access to the fields of a message object using Java reflection.
+ * Users should ignore this class. This class provides the implementation with access to the
+ * fields of a message object using Java reflection.
*/
public static final class FieldAccessorTable {
/**
- * Construct a FieldAccessorTable for a particular message class. Only
- * one FieldAccessorTable should ever be constructed per class.
+ * Construct a FieldAccessorTable for a particular message class. Only one FieldAccessorTable
+ * should ever be constructed per class.
*
- * @param descriptor The type's descriptor.
- * @param camelCaseNames The camelcase names of all fields in the message.
- * These are used to derive the accessor method names.
- * @param messageClass The message type.
- * @param builderClass The builder type.
+ * @param descriptor The type's descriptor.
+ * @param camelCaseNames The camelcase names of all fields in the message. These are used to
+ * derive the accessor method names.
+ * @param messageClass The message type.
+ * @param builderClass The builder type.
*/
public FieldAccessorTable(
final Descriptor descriptor,
@@ -2042,12 +1953,10 @@
}
/**
- * Construct a FieldAccessorTable for a particular message class without
- * initializing FieldAccessors.
+ * Construct a FieldAccessorTable for a particular message class without initializing
+ * FieldAccessors.
*/
- public FieldAccessorTable(
- final Descriptor descriptor,
- final String[] camelCaseNames) {
+ public FieldAccessorTable(final Descriptor descriptor, final String[] camelCaseNames) {
this.descriptor = descriptor;
this.camelCaseNames = camelCaseNames;
fields = new FieldAccessor[descriptor.getFields().size()];
@@ -2063,16 +1972,19 @@
/**
* Ensures the field accessors are initialized. This method is thread-safe.
*
- * @param messageClass The message type.
- * @param builderClass The builder type.
+ * @param messageClass The message type.
+ * @param builderClass The builder type.
* @return this
*/
public FieldAccessorTable ensureFieldAccessorsInitialized(
- Class<? extends GeneratedMessage> messageClass,
- Class<? extends Builder> builderClass) {
- if (initialized) { return this; }
+ Class<? extends GeneratedMessage> messageClass, Class<? extends Builder> builderClass) {
+ if (initialized) {
+ return this;
+ }
synchronized (this) {
- if (initialized) { return this; }
+ if (initialized) {
+ return this;
+ }
int fieldsSize = fields.length;
for (int i = 0; i < fieldsSize; i++) {
FieldDescriptor field = descriptor.getFields().get(i);
@@ -2084,45 +1996,63 @@
if (field.isRepeated()) {
if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
if (field.isMapField() && isMapFieldEnabled(field)) {
- fields[i] = new MapFieldAccessor(
- field, camelCaseNames[i], messageClass, builderClass);
+ fields[i] =
+ new MapFieldAccessor(field, camelCaseNames[i], messageClass, builderClass);
} else {
- fields[i] = new RepeatedMessageFieldAccessor(
- field, camelCaseNames[i], messageClass, builderClass);
+ fields[i] =
+ new RepeatedMessageFieldAccessor(
+ field, camelCaseNames[i], messageClass, builderClass);
}
} else if (field.getJavaType() == FieldDescriptor.JavaType.ENUM) {
- fields[i] = new RepeatedEnumFieldAccessor(
- field, camelCaseNames[i], messageClass, builderClass);
+ fields[i] =
+ new RepeatedEnumFieldAccessor(
+ field, camelCaseNames[i], messageClass, builderClass);
} else {
- fields[i] = new RepeatedFieldAccessor(
- field, camelCaseNames[i], messageClass, builderClass);
+ fields[i] =
+ new RepeatedFieldAccessor(field, camelCaseNames[i], messageClass, builderClass);
}
} else {
if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
- fields[i] = new SingularMessageFieldAccessor(
- field, camelCaseNames[i], messageClass, builderClass,
- containingOneofCamelCaseName);
+ fields[i] =
+ new SingularMessageFieldAccessor(
+ field,
+ camelCaseNames[i],
+ messageClass,
+ builderClass,
+ containingOneofCamelCaseName);
} else if (field.getJavaType() == FieldDescriptor.JavaType.ENUM) {
- fields[i] = new SingularEnumFieldAccessor(
- field, camelCaseNames[i], messageClass, builderClass,
- containingOneofCamelCaseName);
+ fields[i] =
+ new SingularEnumFieldAccessor(
+ field,
+ camelCaseNames[i],
+ messageClass,
+ builderClass,
+ containingOneofCamelCaseName);
} else if (field.getJavaType() == FieldDescriptor.JavaType.STRING) {
- fields[i] = new SingularStringFieldAccessor(
- field, camelCaseNames[i], messageClass, builderClass,
- containingOneofCamelCaseName);
+ fields[i] =
+ new SingularStringFieldAccessor(
+ field,
+ camelCaseNames[i],
+ messageClass,
+ builderClass,
+ containingOneofCamelCaseName);
} else {
- fields[i] = new SingularFieldAccessor(
- field, camelCaseNames[i], messageClass, builderClass,
- containingOneofCamelCaseName);
+ fields[i] =
+ new SingularFieldAccessor(
+ field,
+ camelCaseNames[i],
+ messageClass,
+ builderClass,
+ containingOneofCamelCaseName);
}
}
}
int oneofsSize = oneofs.length;
for (int i = 0; i < oneofsSize; i++) {
- oneofs[i] = new OneofAccessor(
- descriptor, camelCaseNames[i + fieldsSize],
- messageClass, builderClass);
+ oneofs[i] =
+ new OneofAccessor(
+ descriptor, camelCaseNames[i + fieldsSize], messageClass, builderClass);
}
initialized = true;
camelCaseNames = null;
@@ -2139,13 +2069,11 @@
/** Get the FieldAccessor for a particular field. */
private FieldAccessor getField(final FieldDescriptor field) {
if (field.getContainingType() != descriptor) {
- throw new IllegalArgumentException(
- "FieldDescriptor does not match message type.");
+ throw new IllegalArgumentException("FieldDescriptor does not match message type.");
} else if (field.isExtension()) {
// If this type had extensions, it would subclass ExtendableMessage,
// which overrides the reflection interface to handle extensions.
- throw new IllegalArgumentException(
- "This type does not have extensions.");
+ throw new IllegalArgumentException("This type does not have extensions.");
}
return fields[field.getIndex()];
}
@@ -2153,51 +2081,65 @@
/** Get the OneofAccessor for a particular oneof. */
private OneofAccessor getOneof(final OneofDescriptor oneof) {
if (oneof.getContainingType() != descriptor) {
- throw new IllegalArgumentException(
- "OneofDescriptor does not match message type.");
+ throw new IllegalArgumentException("OneofDescriptor does not match message type.");
}
return oneofs[oneof.getIndex()];
}
/**
- * Abstract interface that provides access to a single field. This is
- * implemented differently depending on the field type and cardinality.
+ * Abstract interface that provides access to a single field. This is implemented differently
+ * depending on the field type and cardinality.
*/
private interface FieldAccessor {
Object get(GeneratedMessage message);
+
Object get(GeneratedMessage.Builder builder);
+
Object getRaw(GeneratedMessage message);
+
Object getRaw(GeneratedMessage.Builder builder);
+
void set(Builder builder, Object value);
+
Object getRepeated(GeneratedMessage message, int index);
+
Object getRepeated(GeneratedMessage.Builder builder, int index);
+
Object getRepeatedRaw(GeneratedMessage message, int index);
+
Object getRepeatedRaw(GeneratedMessage.Builder builder, int index);
- void setRepeated(Builder builder,
- int index, Object value);
+
+ void setRepeated(Builder builder, int index, Object value);
+
void addRepeated(Builder builder, Object value);
+
boolean has(GeneratedMessage message);
+
boolean has(GeneratedMessage.Builder builder);
+
int getRepeatedCount(GeneratedMessage message);
+
int getRepeatedCount(GeneratedMessage.Builder builder);
+
void clear(Builder builder);
+
Message.Builder newBuilder();
+
Message.Builder getBuilder(GeneratedMessage.Builder builder);
- Message.Builder getRepeatedBuilder(GeneratedMessage.Builder builder,
- int index);
+
+ Message.Builder getRepeatedBuilder(GeneratedMessage.Builder builder, int index);
}
/** OneofAccessor provides access to a single oneof. */
private static class OneofAccessor {
OneofAccessor(
- final Descriptor descriptor, final String camelCaseName,
+ final Descriptor descriptor,
+ final String camelCaseName,
final Class<? extends GeneratedMessage> messageClass,
final Class<? extends Builder> builderClass) {
this.descriptor = descriptor;
- caseMethod =
- getMethodOrDie(messageClass, "get" + camelCaseName + "Case");
- caseMethodBuilder =
- getMethodOrDie(builderClass, "get" + camelCaseName + "Case");
+ caseMethod = getMethodOrDie(messageClass, "get" + camelCaseName + "Case");
+ caseMethodBuilder = getMethodOrDie(builderClass, "get" + camelCaseName + "Case");
clearMethod = getMethodOrDie(builderClass, "clear" + camelCaseName);
}
@@ -2249,27 +2191,32 @@
private static class SingularFieldAccessor implements FieldAccessor {
SingularFieldAccessor(
- final FieldDescriptor descriptor, final String camelCaseName,
+ final FieldDescriptor descriptor,
+ final String camelCaseName,
final Class<? extends GeneratedMessage> messageClass,
final Class<? extends Builder> builderClass,
final String containingOneofCamelCaseName) {
field = descriptor;
isOneofField = descriptor.getContainingOneof() != null;
- hasHasMethod = supportFieldPresence(descriptor.getFile())
- || (!isOneofField && descriptor.getJavaType() == FieldDescriptor.JavaType.MESSAGE);
+ hasHasMethod =
+ supportFieldPresence(descriptor.getFile())
+ || (!isOneofField && descriptor.getJavaType() == FieldDescriptor.JavaType.MESSAGE);
getMethod = getMethodOrDie(messageClass, "get" + camelCaseName);
getMethodBuilder = getMethodOrDie(builderClass, "get" + camelCaseName);
type = getMethod.getReturnType();
setMethod = getMethodOrDie(builderClass, "set" + camelCaseName, type);
- hasMethod =
- hasHasMethod ? getMethodOrDie(messageClass, "has" + camelCaseName) : null;
+ hasMethod = hasHasMethod ? getMethodOrDie(messageClass, "has" + camelCaseName) : null;
hasMethodBuilder =
hasHasMethod ? getMethodOrDie(builderClass, "has" + camelCaseName) : null;
clearMethod = getMethodOrDie(builderClass, "clear" + camelCaseName);
- caseMethod = isOneofField ? getMethodOrDie(
- messageClass, "get" + containingOneofCamelCaseName + "Case") : null;
- caseMethodBuilder = isOneofField ? getMethodOrDie(
- builderClass, "get" + containingOneofCamelCaseName + "Case") : null;
+ caseMethod =
+ isOneofField
+ ? getMethodOrDie(messageClass, "get" + containingOneofCamelCaseName + "Case")
+ : null;
+ caseMethodBuilder =
+ isOneofField
+ ? getMethodOrDie(builderClass, "get" + containingOneofCamelCaseName + "Case")
+ : null;
}
// Note: We use Java reflection to call public methods rather than
@@ -2300,52 +2247,59 @@
public Object get(final GeneratedMessage message) {
return invokeOrDie(getMethod, message);
}
+
@Override
public Object get(GeneratedMessage.Builder builder) {
return invokeOrDie(getMethodBuilder, builder);
}
+
@Override
public Object getRaw(final GeneratedMessage message) {
return get(message);
}
+
@Override
public Object getRaw(GeneratedMessage.Builder builder) {
return get(builder);
}
+
@Override
public void set(final Builder builder, final Object value) {
invokeOrDie(setMethod, builder, value);
}
+
@Override
public Object getRepeated(final GeneratedMessage message, final int index) {
- throw new UnsupportedOperationException(
- "getRepeatedField() called on a singular field.");
+ throw new UnsupportedOperationException("getRepeatedField() called on a singular field.");
}
+
@Override
public Object getRepeatedRaw(final GeneratedMessage message, final int index) {
throw new UnsupportedOperationException(
- "getRepeatedFieldRaw() called on a singular field.");
+ "getRepeatedFieldRaw() called on a singular field.");
}
+
@Override
public Object getRepeated(GeneratedMessage.Builder builder, int index) {
- throw new UnsupportedOperationException(
- "getRepeatedField() called on a singular field.");
+ throw new UnsupportedOperationException("getRepeatedField() called on a singular field.");
}
+
@Override
public Object getRepeatedRaw(GeneratedMessage.Builder builder, int index) {
throw new UnsupportedOperationException(
- "getRepeatedFieldRaw() called on a singular field.");
+ "getRepeatedFieldRaw() called on a singular field.");
}
+
@Override
public void setRepeated(final Builder builder, final int index, final Object value) {
- throw new UnsupportedOperationException(
- "setRepeatedField() called on a singular field.");
+ throw new UnsupportedOperationException("setRepeatedField() called on a singular field.");
}
+
@Override
public void addRepeated(final Builder builder, final Object value) {
- throw new UnsupportedOperationException(
- "addRepeatedField() called on a singular field.");
+ throw new UnsupportedOperationException("addRepeatedField() called on a singular field.");
}
+
@Override
public boolean has(final GeneratedMessage message) {
if (!hasHasMethod) {
@@ -2356,6 +2310,7 @@
}
return (Boolean) invokeOrDie(hasMethod, message);
}
+
@Override
public boolean has(GeneratedMessage.Builder builder) {
if (!hasHasMethod) {
@@ -2366,34 +2321,39 @@
}
return (Boolean) invokeOrDie(hasMethodBuilder, builder);
}
+
@Override
public int getRepeatedCount(final GeneratedMessage message) {
throw new UnsupportedOperationException(
- "getRepeatedFieldSize() called on a singular field.");
+ "getRepeatedFieldSize() called on a singular field.");
}
+
@Override
public int getRepeatedCount(GeneratedMessage.Builder builder) {
throw new UnsupportedOperationException(
- "getRepeatedFieldSize() called on a singular field.");
+ "getRepeatedFieldSize() called on a singular field.");
}
+
@Override
public void clear(final Builder builder) {
invokeOrDie(clearMethod, builder);
}
+
@Override
public Message.Builder newBuilder() {
throw new UnsupportedOperationException(
- "newBuilderForField() called on a non-Message type.");
+ "newBuilderForField() called on a non-Message type.");
}
+
@Override
public Message.Builder getBuilder(GeneratedMessage.Builder builder) {
- throw new UnsupportedOperationException(
- "getFieldBuilder() called on a non-Message type.");
+ throw new UnsupportedOperationException("getFieldBuilder() called on a non-Message type.");
}
+
@Override
public Message.Builder getRepeatedBuilder(GeneratedMessage.Builder builder, int index) {
throw new UnsupportedOperationException(
- "getRepeatedFieldBuilder() called on a non-Message type.");
+ "getRepeatedFieldBuilder() called on a non-Message type.");
}
}
@@ -2410,27 +2370,20 @@
protected final Method clearMethod;
RepeatedFieldAccessor(
- final FieldDescriptor descriptor, final String camelCaseName,
+ final FieldDescriptor descriptor,
+ final String camelCaseName,
final Class<? extends GeneratedMessage> messageClass,
final Class<? extends Builder> builderClass) {
- getMethod = getMethodOrDie(messageClass,
- "get" + camelCaseName + "List");
- getMethodBuilder = getMethodOrDie(builderClass,
- "get" + camelCaseName + "List");
- getRepeatedMethod =
- getMethodOrDie(messageClass, "get" + camelCaseName, Integer.TYPE);
+ getMethod = getMethodOrDie(messageClass, "get" + camelCaseName + "List");
+ getMethodBuilder = getMethodOrDie(builderClass, "get" + camelCaseName + "List");
+ getRepeatedMethod = getMethodOrDie(messageClass, "get" + camelCaseName, Integer.TYPE);
getRepeatedMethodBuilder =
getMethodOrDie(builderClass, "get" + camelCaseName, Integer.TYPE);
type = getRepeatedMethod.getReturnType();
- setRepeatedMethod =
- getMethodOrDie(builderClass, "set" + camelCaseName,
- Integer.TYPE, type);
- addRepeatedMethod =
- getMethodOrDie(builderClass, "add" + camelCaseName, type);
- getCountMethod =
- getMethodOrDie(messageClass, "get" + camelCaseName + "Count");
- getCountMethodBuilder =
- getMethodOrDie(builderClass, "get" + camelCaseName + "Count");
+ setRepeatedMethod = getMethodOrDie(builderClass, "set" + camelCaseName, Integer.TYPE, type);
+ addRepeatedMethod = getMethodOrDie(builderClass, "add" + camelCaseName, type);
+ getCountMethod = getMethodOrDie(messageClass, "get" + camelCaseName + "Count");
+ getCountMethodBuilder = getMethodOrDie(builderClass, "get" + camelCaseName + "Count");
clearMethod = getMethodOrDie(builderClass, "clear" + camelCaseName);
}
@@ -2439,18 +2392,22 @@
public Object get(final GeneratedMessage message) {
return invokeOrDie(getMethod, message);
}
+
@Override
public Object get(GeneratedMessage.Builder builder) {
return invokeOrDie(getMethodBuilder, builder);
}
+
@Override
public Object getRaw(final GeneratedMessage message) {
return get(message);
}
+
@Override
public Object getRaw(GeneratedMessage.Builder builder) {
return get(builder);
}
+
@Override
public void set(final Builder builder, final Object value) {
// Add all the elements individually. This serves two purposes:
@@ -2462,81 +2419,91 @@
addRepeated(builder, element);
}
}
+
@Override
public Object getRepeated(final GeneratedMessage message, final int index) {
return invokeOrDie(getRepeatedMethod, message, index);
}
+
@Override
public Object getRepeated(GeneratedMessage.Builder builder, int index) {
return invokeOrDie(getRepeatedMethodBuilder, builder, index);
}
+
@Override
public Object getRepeatedRaw(GeneratedMessage message, int index) {
return getRepeated(message, index);
}
+
@Override
public Object getRepeatedRaw(GeneratedMessage.Builder builder, int index) {
return getRepeated(builder, index);
}
+
@Override
public void setRepeated(final Builder builder, final int index, final Object value) {
invokeOrDie(setRepeatedMethod, builder, index, value);
}
+
@Override
public void addRepeated(final Builder builder, final Object value) {
invokeOrDie(addRepeatedMethod, builder, value);
}
+
@Override
public boolean has(final GeneratedMessage message) {
- throw new UnsupportedOperationException(
- "hasField() called on a repeated field.");
+ throw new UnsupportedOperationException("hasField() called on a repeated field.");
}
+
@Override
public boolean has(GeneratedMessage.Builder builder) {
- throw new UnsupportedOperationException(
- "hasField() called on a repeated field.");
+ throw new UnsupportedOperationException("hasField() called on a repeated field.");
}
+
@Override
public int getRepeatedCount(final GeneratedMessage message) {
return (Integer) invokeOrDie(getCountMethod, message);
}
+
@Override
public int getRepeatedCount(GeneratedMessage.Builder builder) {
return (Integer) invokeOrDie(getCountMethodBuilder, builder);
}
+
@Override
public void clear(final Builder builder) {
invokeOrDie(clearMethod, builder);
}
+
@Override
public Message.Builder newBuilder() {
throw new UnsupportedOperationException(
- "newBuilderForField() called on a non-Message type.");
+ "newBuilderForField() called on a non-Message type.");
}
+
@Override
public Message.Builder getBuilder(GeneratedMessage.Builder builder) {
- throw new UnsupportedOperationException(
- "getFieldBuilder() called on a non-Message type.");
+ throw new UnsupportedOperationException("getFieldBuilder() called on a non-Message type.");
}
+
@Override
public Message.Builder getRepeatedBuilder(GeneratedMessage.Builder builder, int index) {
throw new UnsupportedOperationException(
- "getRepeatedFieldBuilder() called on a non-Message type.");
+ "getRepeatedFieldBuilder() called on a non-Message type.");
}
}
private static class MapFieldAccessor implements FieldAccessor {
MapFieldAccessor(
- final FieldDescriptor descriptor, final String camelCaseName,
+ final FieldDescriptor descriptor,
+ final String camelCaseName,
final Class<? extends GeneratedMessage> messageClass,
final Class<? extends Builder> builderClass) {
field = descriptor;
- Method getDefaultInstanceMethod =
- getMethodOrDie(messageClass, "getDefaultInstance");
- MapField defaultMapField = getMapField(
- (GeneratedMessage) invokeOrDie(getDefaultInstanceMethod, null));
- mapEntryMessageDefaultInstance =
- defaultMapField.getMapEntryMessageDefaultInstance();
+ Method getDefaultInstanceMethod = getMethodOrDie(messageClass, "getDefaultInstance");
+ MapField defaultMapField =
+ getMapField((GeneratedMessage) invokeOrDie(getDefaultInstanceMethod, null));
+ mapEntryMessageDefaultInstance = defaultMapField.getMapEntryMessageDefaultInstance();
}
private final FieldDescriptor field;
@@ -2550,10 +2517,8 @@
return (MapField<?, ?>) builder.internalGetMapField(field.getNumber());
}
- private MapField<?, ?> getMutableMapField(
- GeneratedMessage.Builder builder) {
- return (MapField<?, ?>) builder.internalGetMutableMapField(
- field.getNumber());
+ private MapField<?, ?> getMutableMapField(GeneratedMessage.Builder builder) {
+ return (MapField<?, ?>) builder.internalGetMutableMapField(field.getNumber());
}
@Override
@@ -2626,14 +2591,12 @@
@Override
public boolean has(GeneratedMessage message) {
- throw new UnsupportedOperationException(
- "hasField() is not supported for repeated fields.");
+ throw new UnsupportedOperationException("hasField() is not supported for repeated fields.");
}
@Override
public boolean has(Builder builder) {
- throw new UnsupportedOperationException(
- "hasField() is not supported for repeated fields.");
+ throw new UnsupportedOperationException("hasField() is not supported for repeated fields.");
}
@Override
@@ -2658,23 +2621,21 @@
@Override
public com.google.protobuf.Message.Builder getBuilder(Builder builder) {
- throw new UnsupportedOperationException(
- "Nested builder not supported for map fields.");
+ throw new UnsupportedOperationException("Nested builder not supported for map fields.");
}
@Override
public com.google.protobuf.Message.Builder getRepeatedBuilder(Builder builder, int index) {
- throw new UnsupportedOperationException(
- "Nested builder not supported for map fields.");
+ throw new UnsupportedOperationException("Nested builder not supported for map fields.");
}
}
// ---------------------------------------------------------------
- private static final class SingularEnumFieldAccessor
- extends SingularFieldAccessor {
+ private static final class SingularEnumFieldAccessor extends SingularFieldAccessor {
SingularEnumFieldAccessor(
- final FieldDescriptor descriptor, final String camelCaseName,
+ final FieldDescriptor descriptor,
+ final String camelCaseName,
final Class<? extends GeneratedMessage> messageClass,
final Class<? extends Builder> builderClass,
final String containingOneofCamelCaseName) {
@@ -2682,19 +2643,14 @@
enumDescriptor = descriptor.getEnumType();
- valueOfMethod = getMethodOrDie(type, "valueOf",
- EnumValueDescriptor.class);
- getValueDescriptorMethod =
- getMethodOrDie(type, "getValueDescriptor");
+ valueOfMethod = getMethodOrDie(type, "valueOf", EnumValueDescriptor.class);
+ getValueDescriptorMethod = getMethodOrDie(type, "getValueDescriptor");
supportUnknownEnumValue = descriptor.getFile().supportsUnknownEnumValue();
if (supportUnknownEnumValue) {
- getValueMethod =
- getMethodOrDie(messageClass, "get" + camelCaseName + "Value");
- getValueMethodBuilder =
- getMethodOrDie(builderClass, "get" + camelCaseName + "Value");
- setValueMethod =
- getMethodOrDie(builderClass, "set" + camelCaseName + "Value", int.class);
+ getValueMethod = getMethodOrDie(messageClass, "get" + camelCaseName + "Value");
+ getValueMethodBuilder = getMethodOrDie(builderClass, "get" + camelCaseName + "Value");
+ setValueMethod = getMethodOrDie(builderClass, "set" + camelCaseName + "Value", int.class);
}
}
@@ -2729,28 +2685,25 @@
@Override
public void set(final Builder builder, final Object value) {
if (supportUnknownEnumValue) {
- invokeOrDie(setValueMethod, builder,
- ((EnumValueDescriptor) value).getNumber());
+ invokeOrDie(setValueMethod, builder, ((EnumValueDescriptor) value).getNumber());
return;
}
super.set(builder, invokeOrDie(valueOfMethod, null, value));
}
}
- private static final class RepeatedEnumFieldAccessor
- extends RepeatedFieldAccessor {
+ private static final class RepeatedEnumFieldAccessor extends RepeatedFieldAccessor {
RepeatedEnumFieldAccessor(
- final FieldDescriptor descriptor, final String camelCaseName,
+ final FieldDescriptor descriptor,
+ final String camelCaseName,
final Class<? extends GeneratedMessage> messageClass,
final Class<? extends Builder> builderClass) {
super(descriptor, camelCaseName, messageClass, builderClass);
enumDescriptor = descriptor.getEnumType();
- valueOfMethod = getMethodOrDie(type, "valueOf",
- EnumValueDescriptor.class);
- getValueDescriptorMethod =
- getMethodOrDie(type, "getValueDescriptor");
+ valueOfMethod = getMethodOrDie(type, "valueOf", EnumValueDescriptor.class);
+ getValueDescriptorMethod = getMethodOrDie(type, "getValueDescriptor");
supportUnknownEnumValue = descriptor.getFile().supportsUnknownEnumValue();
if (supportUnknownEnumValue) {
@@ -2764,6 +2717,7 @@
getMethodOrDie(builderClass, "add" + camelCaseName + "Value", int.class);
}
}
+
private EnumDescriptor enumDescriptor;
private final Method valueOfMethod;
@@ -2798,41 +2752,37 @@
}
@Override
- public Object getRepeated(final GeneratedMessage message,
- final int index) {
+ public Object getRepeated(final GeneratedMessage message, final int index) {
if (supportUnknownEnumValue) {
int value = (Integer) invokeOrDie(getRepeatedValueMethod, message, index);
return enumDescriptor.findValueByNumberCreatingIfUnknown(value);
}
- return invokeOrDie(getValueDescriptorMethod,
- super.getRepeated(message, index));
+ return invokeOrDie(getValueDescriptorMethod, super.getRepeated(message, index));
}
+
@Override
- public Object getRepeated(final GeneratedMessage.Builder builder,
- final int index) {
+ public Object getRepeated(final GeneratedMessage.Builder builder, final int index) {
if (supportUnknownEnumValue) {
int value = (Integer) invokeOrDie(getRepeatedValueMethodBuilder, builder, index);
return enumDescriptor.findValueByNumberCreatingIfUnknown(value);
}
- return invokeOrDie(getValueDescriptorMethod,
- super.getRepeated(builder, index));
+ return invokeOrDie(getValueDescriptorMethod, super.getRepeated(builder, index));
}
+
@Override
- public void setRepeated(final Builder builder,
- final int index, final Object value) {
+ public void setRepeated(final Builder builder, final int index, final Object value) {
if (supportUnknownEnumValue) {
- invokeOrDie(setRepeatedValueMethod, builder, index,
- ((EnumValueDescriptor) value).getNumber());
+ invokeOrDie(
+ setRepeatedValueMethod, builder, index, ((EnumValueDescriptor) value).getNumber());
return;
}
- super.setRepeated(builder, index, invokeOrDie(valueOfMethod, null,
- value));
+ super.setRepeated(builder, index, invokeOrDie(valueOfMethod, null, value));
}
+
@Override
public void addRepeated(final Builder builder, final Object value) {
if (supportUnknownEnumValue) {
- invokeOrDie(addRepeatedValueMethod, builder,
- ((EnumValueDescriptor) value).getNumber());
+ invokeOrDie(addRepeatedValueMethod, builder, ((EnumValueDescriptor) value).getNumber());
return;
}
super.addRepeated(builder, invokeOrDie(valueOfMethod, null, value));
@@ -2844,29 +2794,25 @@
/**
* Field accessor for string fields.
*
- * <p>This class makes getFooBytes() and setFooBytes() available for
- * reflection API so that reflection based serialize/parse functions can
- * access the raw bytes of the field to preserve non-UTF8 bytes in the
- * string.
+ * <p>This class makes getFooBytes() and setFooBytes() available for reflection API so that
+ * reflection based serialize/parse functions can access the raw bytes of the field to preserve
+ * non-UTF8 bytes in the string.
*
- * <p>This ensures the serialize/parse round-trip safety, which is important
- * for servers which forward messages.
+ * <p>This ensures the serialize/parse round-trip safety, which is important for servers which
+ * forward messages.
*/
- private static final class SingularStringFieldAccessor
- extends SingularFieldAccessor {
+ private static final class SingularStringFieldAccessor extends SingularFieldAccessor {
SingularStringFieldAccessor(
- final FieldDescriptor descriptor, final String camelCaseName,
+ final FieldDescriptor descriptor,
+ final String camelCaseName,
final Class<? extends GeneratedMessage> messageClass,
final Class<? extends Builder> builderClass,
final String containingOneofCamelCaseName) {
- super(descriptor, camelCaseName, messageClass, builderClass,
- containingOneofCamelCaseName);
- getBytesMethod = getMethodOrDie(messageClass,
- "get" + camelCaseName + "Bytes");
- getBytesMethodBuilder = getMethodOrDie(builderClass,
- "get" + camelCaseName + "Bytes");
- setBytesMethodBuilder = getMethodOrDie(builderClass,
- "set" + camelCaseName + "Bytes", ByteString.class);
+ super(descriptor, camelCaseName, messageClass, builderClass, containingOneofCamelCaseName);
+ getBytesMethod = getMethodOrDie(messageClass, "get" + camelCaseName + "Bytes");
+ getBytesMethodBuilder = getMethodOrDie(builderClass, "get" + camelCaseName + "Bytes");
+ setBytesMethodBuilder =
+ getMethodOrDie(builderClass, "set" + camelCaseName + "Bytes", ByteString.class);
}
private final Method getBytesMethod;
@@ -2895,19 +2841,17 @@
// ---------------------------------------------------------------
- private static final class SingularMessageFieldAccessor
- extends SingularFieldAccessor {
+ private static final class SingularMessageFieldAccessor extends SingularFieldAccessor {
SingularMessageFieldAccessor(
- final FieldDescriptor descriptor, final String camelCaseName,
+ final FieldDescriptor descriptor,
+ final String camelCaseName,
final Class<? extends GeneratedMessage> messageClass,
final Class<? extends Builder> builderClass,
final String containingOneofCamelCaseName) {
- super(descriptor, camelCaseName, messageClass, builderClass,
- containingOneofCamelCaseName);
+ super(descriptor, camelCaseName, messageClass, builderClass, containingOneofCamelCaseName);
newBuilderMethod = getMethodOrDie(type, "newBuilder");
- getBuilderMethodBuilder =
- getMethodOrDie(builderClass, "get" + camelCaseName + "Builder");
+ getBuilderMethodBuilder = getMethodOrDie(builderClass, "get" + camelCaseName + "Builder");
}
private final Method newBuilderMethod;
@@ -2922,7 +2866,8 @@
// DynamicMessage -- we should accept it. In this case we can make
// a copy of the message.
return ((Message.Builder) invokeOrDie(newBuilderMethod, null))
- .mergeFrom((Message) value).buildPartial();
+ .mergeFrom((Message) value)
+ .buildPartial();
}
}
@@ -2930,27 +2875,29 @@
public void set(final Builder builder, final Object value) {
super.set(builder, coerceType(value));
}
+
@Override
public Message.Builder newBuilder() {
return (Message.Builder) invokeOrDie(newBuilderMethod, null);
}
+
@Override
public Message.Builder getBuilder(GeneratedMessage.Builder builder) {
return (Message.Builder) invokeOrDie(getBuilderMethodBuilder, builder);
}
}
- private static final class RepeatedMessageFieldAccessor
- extends RepeatedFieldAccessor {
+ private static final class RepeatedMessageFieldAccessor extends RepeatedFieldAccessor {
RepeatedMessageFieldAccessor(
- final FieldDescriptor descriptor, final String camelCaseName,
+ final FieldDescriptor descriptor,
+ final String camelCaseName,
final Class<? extends GeneratedMessage> messageClass,
final Class<? extends Builder> builderClass) {
super(descriptor, camelCaseName, messageClass, builderClass);
newBuilderMethod = getMethodOrDie(type, "newBuilder");
- getBuilderMethodBuilder = getMethodOrDie(builderClass,
- "get" + camelCaseName + "Builder", Integer.TYPE);
+ getBuilderMethodBuilder =
+ getMethodOrDie(builderClass, "get" + camelCaseName + "Builder", Integer.TYPE);
}
private final Method newBuilderMethod;
@@ -2965,36 +2912,39 @@
// DynamicMessage -- we should accept it. In this case we can make
// a copy of the message.
return ((Message.Builder) invokeOrDie(newBuilderMethod, null))
- .mergeFrom((Message) value).build();
+ .mergeFrom((Message) value)
+ .build();
}
}
@Override
- public void setRepeated(final Builder builder,
- final int index, final Object value) {
+ public void setRepeated(final Builder builder, final int index, final Object value) {
super.setRepeated(builder, index, coerceType(value));
}
+
@Override
public void addRepeated(final Builder builder, final Object value) {
super.addRepeated(builder, coerceType(value));
}
+
@Override
public Message.Builder newBuilder() {
return (Message.Builder) invokeOrDie(newBuilderMethod, null);
}
+
@Override
public Message.Builder getRepeatedBuilder(
final GeneratedMessage.Builder builder, final int index) {
- return (Message.Builder) invokeOrDie(
- getBuilderMethodBuilder, builder, index);
+ return (Message.Builder) invokeOrDie(getBuilderMethodBuilder, builder, index);
}
}
}
/**
- * Replaces this object in the output stream with a serialized form.
- * Part of Java's serialization magic. Generated sub-classes must override
- * this method by calling {@code return super.writeReplace();}
+ * Replaces this object in the output stream with a serialized form. Part of Java's serialization
+ * magic. Generated sub-classes must override this method by calling {@code return
+ * super.writeReplace();}
+ *
* @return a SerializedForm of this message
*/
protected Object writeReplace() throws ObjectStreamException {
@@ -3002,12 +2952,10 @@
}
/**
- * Checks that the {@link Extension} is non-Lite and returns it as a
- * {@link GeneratedExtension}.
+ * Checks that the {@link Extension} is non-Lite and returns it as a {@link GeneratedExtension}.
*/
private static <MessageType extends ExtendableMessage<MessageType>, T>
- Extension<MessageType, T> checkNotLite(
- ExtensionLite<MessageType, T> extension) {
+ Extension<MessageType, T> checkNotLite(ExtensionLite<MessageType, T> extension) {
if (extension.isLite()) {
throw new IllegalArgumentException("Expected non-lite extension.");
}
@@ -3040,8 +2988,8 @@
}
}
- protected static void writeStringNoTag(
- CodedOutputStream output, final Object value) throws IOException {
+ protected static void writeStringNoTag(CodedOutputStream output, final Object value)
+ throws IOException {
if (value instanceof String) {
output.writeStringNoTag((String) value);
} else {
diff --git a/java/core/src/main/java/com/google/protobuf/GeneratedMessageLite.java b/java/core/src/main/java/com/google/protobuf/GeneratedMessageLite.java
index d4151f4..85930c9 100644
--- a/java/core/src/main/java/com/google/protobuf/GeneratedMessageLite.java
+++ b/java/core/src/main/java/com/google/protobuf/GeneratedMessageLite.java
@@ -188,7 +188,7 @@
// any unnecessary intermediary allocations while reducing the generated code size.
/** Lazily initializes unknown fields. */
- private final void ensureUnknownFieldsInitialized() {
+ private void ensureUnknownFieldsInitialized() {
if (unknownFields == UnknownFieldSetLite.getDefaultInstance()) {
unknownFields = UnknownFieldSetLite.newInstance();
}
@@ -295,11 +295,16 @@
*
* <p>For use by generated code only.
*/
- protected abstract Object dynamicMethod(MethodToInvoke method, Object arg0, Object arg1);
+ protected abstract Object dynamicMethod(
+ MethodToInvoke method,
+ Object arg0,
+ Object arg1);
/** Same as {@link #dynamicMethod(MethodToInvoke, Object, Object)} with {@code null} padding. */
@CanIgnoreReturnValue
- protected Object dynamicMethod(MethodToInvoke method, Object arg0) {
+ protected Object dynamicMethod(
+ MethodToInvoke method,
+ Object arg0) {
return dynamicMethod(method, arg0, null);
}
@@ -1345,11 +1350,11 @@
}
@SuppressWarnings("unchecked")
- Object fromFieldSetType(final Object value) {
+ Object fromFieldSetType(Object value) {
if (descriptor.isRepeated()) {
if (descriptor.getLiteJavaType() == WireFormat.JavaType.ENUM) {
- final List result = new ArrayList<>();
- for (final Object element : (List) value) {
+ List<Object> result = new ArrayList<>();
+ for (Object element : (List) value) {
result.add(singularFromFieldSetType(element));
}
return result;
@@ -1361,7 +1366,7 @@
}
}
- Object singularFromFieldSetType(final Object value) {
+ Object singularFromFieldSetType(Object value) {
if (descriptor.getLiteJavaType() == WireFormat.JavaType.ENUM) {
return descriptor.enumTypeMap.findValueByNumber((Integer) value);
} else {
@@ -1369,12 +1374,11 @@
}
}
- @SuppressWarnings("unchecked")
- Object toFieldSetType(final Object value) {
+ Object toFieldSetType(Object value) {
if (descriptor.isRepeated()) {
if (descriptor.getLiteJavaType() == WireFormat.JavaType.ENUM) {
- final List result = new ArrayList<>();
- for (final Object element : (List) value) {
+ List<Object> result = new ArrayList<>();
+ for (Object element : (List) value) {
result.add(singularToFieldSetType(element));
}
return result;
@@ -1386,7 +1390,7 @@
}
}
- Object singularToFieldSetType(final Object value) {
+ Object singularToFieldSetType(Object value) {
if (descriptor.getLiteJavaType() == WireFormat.JavaType.ENUM) {
return ((Internal.EnumLite) value).getNumber();
} else {
diff --git a/java/core/src/main/java/com/google/protobuf/GeneratedMessageV3.java b/java/core/src/main/java/com/google/protobuf/GeneratedMessageV3.java
index 355bf46..41ea0a1 100644
--- a/java/core/src/main/java/com/google/protobuf/GeneratedMessageV3.java
+++ b/java/core/src/main/java/com/google/protobuf/GeneratedMessageV3.java
@@ -69,15 +69,13 @@
import java.util.TreeMap;
/**
- * All generated protocol message classes extend this class. This class
- * implements most of the Message and Builder interfaces using Java reflection.
- * Users can ignore this class and pretend that generated messages implement
- * the Message interface directly.
+ * All generated protocol message classes extend this class. This class implements most of the
+ * Message and Builder interfaces using Java reflection. Users can ignore this class and pretend
+ * that generated messages implement the Message interface directly.
*
* @author kenton@google.com Kenton Varda
*/
-public abstract class GeneratedMessageV3 extends AbstractMessage
- implements Serializable {
+public abstract class GeneratedMessageV3 extends AbstractMessage implements Serializable {
private static final long serialVersionUID = 1L;
/**
@@ -87,7 +85,7 @@
*/
protected static boolean alwaysUseFieldBuilders = false;
- /** For use by generated code only. */
+ /** For use by generated code only. */
protected UnknownFieldSet unknownFields;
protected GeneratedMessageV3() {
@@ -100,31 +98,29 @@
@Override
public Parser<? extends GeneratedMessageV3> getParserForType() {
- throw new UnsupportedOperationException(
- "This is supposed to be overridden by subclasses.");
+ throw new UnsupportedOperationException("This is supposed to be overridden by subclasses.");
}
- /**
- * @see #setAlwaysUseFieldBuildersForTesting(boolean)
- */
+ /**
+ * @see #setAlwaysUseFieldBuildersForTesting(boolean)
+ */
static void enableAlwaysUseFieldBuildersForTesting() {
setAlwaysUseFieldBuildersForTesting(true);
}
/**
- * For testing. Allows a test to disable/re-enable the optimization that avoids
- * using field builders for nested messages until they are requested. By disabling
- * this optimization, existing tests can be reused to test the field builders.
- * See {@link RepeatedFieldBuilder} and {@link SingleFieldBuilder}.
+ * For testing. Allows a test to disable/re-enable the optimization that avoids using field
+ * builders for nested messages until they are requested. By disabling this optimization, existing
+ * tests can be reused to test the field builders. See {@link RepeatedFieldBuilder} and {@link
+ * SingleFieldBuilder}.
*/
static void setAlwaysUseFieldBuildersForTesting(boolean useBuilders) {
alwaysUseFieldBuilders = useBuilders;
}
/**
- * Get the FieldAccessorTable for this type. We can't have the message
- * class pass this in to the constructor because of bootstrapping trouble
- * with DescriptorProtos.
+ * Get the FieldAccessorTable for this type. We can't have the message class pass this in to the
+ * constructor because of bootstrapping trouble with DescriptorProtos.
*/
protected abstract FieldAccessorTable internalGetFieldAccessorTable();
@@ -153,16 +149,14 @@
}
/**
- * Internal helper to return a modifiable map containing all the fields.
- * The returned Map is modifiable so that the caller can add additional
- * extension fields to implement {@link #getAllFields()}.
+ * Internal helper to return a modifiable map containing all the fields. The returned Map is
+ * modifiable so that the caller can add additional extension fields to implement {@link
+ * #getAllFields()}.
*
* @param getBytesForString whether to generate ByteString for string fields
*/
- private Map<FieldDescriptor, Object> getAllFieldsMutable(
- boolean getBytesForString) {
- final TreeMap<FieldDescriptor, Object> result =
- new TreeMap<FieldDescriptor, Object>();
+ private Map<FieldDescriptor, Object> getAllFieldsMutable(boolean getBytesForString) {
+ final TreeMap<FieldDescriptor, Object> result = new TreeMap<FieldDescriptor, Object>();
final Descriptor descriptor = internalGetFieldAccessorTable().descriptor;
final List<FieldDescriptor> fields = descriptor.getFields();
@@ -218,8 +212,8 @@
// Check that embedded messages are initialized.
if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
if (field.isRepeated()) {
- @SuppressWarnings("unchecked") final
- List<Message> messageList = (List<Message>) getField(field);
+ @SuppressWarnings("unchecked")
+ final List<Message> messageList = (List<Message>) getField(field);
for (final Message element : messageList) {
if (!element.isInitialized()) {
return false;
@@ -238,23 +232,19 @@
@Override
public Map<FieldDescriptor, Object> getAllFields() {
- return Collections.unmodifiableMap(
- getAllFieldsMutable(/* getBytesForString = */ false));
+ return Collections.unmodifiableMap(getAllFieldsMutable(/* getBytesForString = */ false));
}
/**
- * Returns a collection of all the fields in this message which are set
- * and their corresponding values. A singular ("required" or "optional")
- * field is set iff hasField() returns true for that field. A "repeated"
- * field is set iff getRepeatedFieldCount() is greater than zero. The
- * values are exactly what would be returned by calling
- * {@link #getFieldRaw(Descriptors.FieldDescriptor)} for each field. The map
- * is guaranteed to be a sorted map, so iterating over it will return fields
- * in order by field number.
+ * Returns a collection of all the fields in this message which are set and their corresponding
+ * values. A singular ("required" or "optional") field is set iff hasField() returns true for that
+ * field. A "repeated" field is set iff getRepeatedFieldCount() is greater than zero. The values
+ * are exactly what would be returned by calling {@link #getFieldRaw(Descriptors.FieldDescriptor)}
+ * for each field. The map is guaranteed to be a sorted map, so iterating over it will return
+ * fields in order by field number.
*/
Map<FieldDescriptor, Object> getAllFieldsRaw() {
- return Collections.unmodifiableMap(
- getAllFieldsMutable(/* getBytesForString = */ true));
+ return Collections.unmodifiableMap(getAllFieldsMutable(/* getBytesForString = */ true));
}
@Override
@@ -278,12 +268,11 @@
}
/**
- * Obtains the value of the given field, or the default value if it is
- * not set. For primitive fields, the boxed primitive value is returned.
- * For enum fields, the EnumValueDescriptor for the value is returned. For
- * embedded message fields, the sub-message is returned. For repeated
- * fields, a java.util.List is returned. For present string fields, a
- * ByteString is returned representing the bytes that the field contains.
+ * Obtains the value of the given field, or the default value if it is not set. For primitive
+ * fields, the boxed primitive value is returned. For enum fields, the EnumValueDescriptor for the
+ * value is returned. For embedded message fields, the sub-message is returned. For repeated
+ * fields, a java.util.List is returned. For present string fields, a ByteString is returned
+ * representing the bytes that the field contains.
*/
Object getFieldRaw(final FieldDescriptor field) {
return internalGetFieldAccessorTable().getField(field).getRaw(this);
@@ -291,14 +280,12 @@
@Override
public int getRepeatedFieldCount(final FieldDescriptor field) {
- return internalGetFieldAccessorTable().getField(field)
- .getRepeatedCount(this);
+ return internalGetFieldAccessorTable().getField(field).getRepeatedCount(this);
}
@Override
public Object getRepeatedField(final FieldDescriptor field, final int index) {
- return internalGetFieldAccessorTable().getField(field)
- .getRepeated(this, index);
+ return internalGetFieldAccessorTable().getField(field).getRepeated(this, index);
}
@Override
@@ -349,8 +336,8 @@
}
}
- protected static <M extends Message> M parseWithIOException(Parser<M> parser, InputStream input,
- ExtensionRegistryLite extensions) throws IOException {
+ protected static <M extends Message> M parseWithIOException(
+ Parser<M> parser, InputStream input, ExtensionRegistryLite extensions) throws IOException {
try {
return parser.parseFrom(input, extensions);
} catch (InvalidProtocolBufferException e) {
@@ -358,8 +345,8 @@
}
}
- protected static <M extends Message> M parseWithIOException(Parser<M> parser,
- CodedInputStream input) throws IOException {
+ protected static <M extends Message> M parseWithIOException(
+ Parser<M> parser, CodedInputStream input) throws IOException {
try {
return parser.parseFrom(input);
} catch (InvalidProtocolBufferException e) {
@@ -367,8 +354,9 @@
}
}
- protected static <M extends Message> M parseWithIOException(Parser<M> parser,
- CodedInputStream input, ExtensionRegistryLite extensions) throws IOException {
+ protected static <M extends Message> M parseWithIOException(
+ Parser<M> parser, CodedInputStream input, ExtensionRegistryLite extensions)
+ throws IOException {
try {
return parser.parseFrom(input, extensions);
} catch (InvalidProtocolBufferException e) {
@@ -376,8 +364,8 @@
}
}
- protected static <M extends Message> M parseDelimitedWithIOException(Parser<M> parser,
- InputStream input) throws IOException {
+ protected static <M extends Message> M parseDelimitedWithIOException(
+ Parser<M> parser, InputStream input) throws IOException {
try {
return parser.parseDelimitedFrom(input);
} catch (InvalidProtocolBufferException e) {
@@ -385,8 +373,8 @@
}
}
- protected static <M extends Message> M parseDelimitedWithIOException(Parser<M> parser,
- InputStream input, ExtensionRegistryLite extensions) throws IOException {
+ protected static <M extends Message> M parseDelimitedWithIOException(
+ Parser<M> parser, InputStream input, ExtensionRegistryLite extensions) throws IOException {
try {
return parser.parseDelimitedFrom(input, extensions);
} catch (InvalidProtocolBufferException e) {
@@ -487,63 +475,53 @@
}
-
/**
* This class is used to make a generated protected method inaccessible from user's code (e.g.,
* the {@link #newInstance} method below). When this class is used as a parameter's type in a
- * generated protected method, the method is visible to user's code in the same package, but
- * since the constructor of this class is private to protobuf runtime, user's code can't obtain
- * an instance of this class and as such can't actually make a method call on the protected
- * method.
+ * generated protected method, the method is visible to user's code in the same package, but since
+ * the constructor of this class is private to protobuf runtime, user's code can't obtain an
+ * instance of this class and as such can't actually make a method call on the protected method.
*/
protected static final class UnusedPrivateParameter {
static final UnusedPrivateParameter INSTANCE = new UnusedPrivateParameter();
- private UnusedPrivateParameter() {
- }
+ private UnusedPrivateParameter() {}
}
- /**
- * Creates a new instance of this message type. Overridden in the generated code.
- */
+ /** Creates a new instance of this message type. Overridden in the generated code. */
@SuppressWarnings({"unused"})
protected Object newInstance(UnusedPrivateParameter unused) {
throw new UnsupportedOperationException("This method must be overridden by the subclass.");
}
- /**
- * Used by parsing constructors in generated classes.
- */
+ /** Used by parsing constructors in generated classes. */
protected void makeExtensionsImmutable() {
// Noop for messages without extensions.
}
/**
- * TODO(xiaofeng): remove this after b/29368482 is fixed. We need to move this
- * interface to AbstractMessage in order to versioning GeneratedMessageV3 but
- * this move breaks binary compatibility for AppEngine. After AppEngine is
- * fixed we can exclude this from google3.
+ * TODO(xiaofeng): remove this after b/29368482 is fixed. We need to move this interface to
+ * AbstractMessage in order to versioning GeneratedMessageV3 but this move breaks binary
+ * compatibility for AppEngine. After AppEngine is fixed we can exclude this from google3.
*/
protected interface BuilderParent extends AbstractMessage.BuilderParent {}
- /**
- * TODO(xiaofeng): remove this together with GeneratedMessageV3.BuilderParent.
- */
+ /** TODO(xiaofeng): remove this together with GeneratedMessageV3.BuilderParent. */
protected abstract Message.Builder newBuilderForType(BuilderParent parent);
@Override
protected Message.Builder newBuilderForType(final AbstractMessage.BuilderParent parent) {
- return newBuilderForType(new BuilderParent() {
- @Override
- public void markDirty() {
- parent.markDirty();
- }
- });
+ return newBuilderForType(
+ new BuilderParent() {
+ @Override
+ public void markDirty() {
+ parent.markDirty();
+ }
+ });
}
-
@SuppressWarnings("unchecked")
- public abstract static class Builder <BuilderType extends Builder<BuilderType>>
+ public abstract static class Builder<BuilderType extends Builder<BuilderType>>
extends AbstractMessage.Builder<BuilderType> {
private BuilderParent builderParent;
@@ -580,9 +558,7 @@
builderParent = null;
}
- /**
- * Called by the subclass when a message is built.
- */
+ /** Called by the subclass when a message is built. */
protected void onBuilt() {
if (builderParent != null) {
markClean();
@@ -590,8 +566,8 @@
}
/**
- * Called by the subclass or a builder to notify us that a message was
- * built and may be cached and therefore invalidations are needed.
+ * Called by the subclass or a builder to notify us that a message was built and may be cached
+ * and therefore invalidations are needed.
*/
@Override
protected void markClean() {
@@ -609,15 +585,14 @@
@Override
public BuilderType clone() {
- BuilderType builder =
- (BuilderType) getDefaultInstanceForType().newBuilderForType();
+ BuilderType builder = (BuilderType) getDefaultInstanceForType().newBuilderForType();
builder.mergeFrom(buildPartial());
return builder;
}
/**
- * Called by the initialization and clear code paths to allow subclasses to
- * reset any of their builtin fields back to the initial values.
+ * Called by the initialization and clear code paths to allow subclasses to reset any of their
+ * builtin fields back to the initial values.
*/
@Override
public BuilderType clear() {
@@ -627,9 +602,8 @@
}
/**
- * Get the FieldAccessorTable for this type. We can't have the message
- * class pass this in to the constructor because of bootstrapping trouble
- * with DescriptorProtos.
+ * Get the FieldAccessorTable for this type. We can't have the message class pass this in to the
+ * constructor because of bootstrapping trouble with DescriptorProtos.
*/
protected abstract FieldAccessorTable internalGetFieldAccessorTable();
@@ -645,8 +619,7 @@
/** Internal helper which returns a mutable map. */
private Map<FieldDescriptor, Object> getAllFieldsMutable() {
- final TreeMap<FieldDescriptor, Object> result =
- new TreeMap<FieldDescriptor, Object>();
+ final TreeMap<FieldDescriptor, Object> result = new TreeMap<FieldDescriptor, Object>();
final Descriptor descriptor = internalGetFieldAccessorTable().descriptor;
final List<FieldDescriptor> fields = descriptor.getFields();
@@ -698,8 +671,7 @@
@Override
public Message.Builder getRepeatedFieldBuilder(final FieldDescriptor field, int index) {
- return internalGetFieldAccessorTable().getField(field).getRepeatedBuilder(
- this, index);
+ return internalGetFieldAccessorTable().getField(field).getRepeatedBuilder(this, index);
}
@Override
@@ -749,21 +721,18 @@
@Override
public int getRepeatedFieldCount(final FieldDescriptor field) {
- return internalGetFieldAccessorTable().getField(field)
- .getRepeatedCount(this);
+ return internalGetFieldAccessorTable().getField(field).getRepeatedCount(this);
}
@Override
public Object getRepeatedField(final FieldDescriptor field, final int index) {
- return internalGetFieldAccessorTable().getField(field)
- .getRepeated(this, index);
+ return internalGetFieldAccessorTable().getField(field).getRepeated(this, index);
}
@Override
public BuilderType setRepeatedField(
final FieldDescriptor field, final int index, final Object value) {
- internalGetFieldAccessorTable().getField(field)
- .setRepeated(this, index, value);
+ internalGetFieldAccessorTable().getField(field).setRepeated(this, index, value);
return (BuilderType) this;
}
@@ -785,8 +754,7 @@
}
/**
- * This method is obsolete, but we must retain it for compatibility with
- * older generated code.
+ * This method is obsolete, but we must retain it for compatibility with older generated code.
*/
protected BuilderType setUnknownFieldsProto3(final UnknownFieldSet unknownFields) {
return setUnknownFieldsInternal(unknownFields);
@@ -809,7 +777,6 @@
return (BuilderType) this;
}
-
@Override
public boolean isInitialized() {
for (final FieldDescriptor field : getDescriptorForType().getFields()) {
@@ -822,16 +789,15 @@
// Check that embedded messages are initialized.
if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
if (field.isRepeated()) {
- @SuppressWarnings("unchecked") final
- List<Message> messageList = (List<Message>) getField(field);
+ @SuppressWarnings("unchecked")
+ final List<Message> messageList = (List<Message>) getField(field);
for (final Message element : messageList) {
if (!element.isInitialized()) {
return false;
}
}
} else {
- if (hasField(field) &&
- !((Message) getField(field)).isInitialized()) {
+ if (hasField(field) && !((Message) getField(field)).isInitialized()) {
return false;
}
}
@@ -889,9 +855,8 @@
}
/**
- * Implementation of {@link BuilderParent} for giving to our children. This
- * small inner class makes it so we don't publicly expose the BuilderParent
- * methods.
+ * Implementation of {@link BuilderParent} for giving to our children. This small inner class
+ * makes it so we don't publicly expose the BuilderParent methods.
*/
private class BuilderParentImpl implements BuilderParent {
@@ -903,6 +868,7 @@
/**
* Gets the {@link BuilderParent} for giving to our children.
+ *
* @return The builder parent for our children.
*/
protected BuilderParent getParentForChildren() {
@@ -913,8 +879,8 @@
}
/**
- * Called when a the builder or one of its nested children has changed
- * and any parent should be notified of its invalidation.
+ * Called when a the builder or one of its nested children has changed and any parent should be
+ * notified of its invalidation.
*/
protected final void onChanged() {
if (isClean && builderParent != null) {
@@ -926,22 +892,19 @@
}
/**
- * Gets the map field with the given field number. This method should be
- * overridden in the generated message class if the message contains map
- * fields.
+ * Gets the map field with the given field number. This method should be overridden in the
+ * generated message class if the message contains map fields.
*
- * Unlike other field types, reflection support for map fields can't be
- * implemented based on generated public API because we need to access a
- * map field as a list in reflection API but the generated API only allows
- * us to access it as a map. This method returns the underlying map field
- * directly and thus enables us to access the map field as a list.
+ * <p>Unlike other field types, reflection support for map fields can't be implemented based on
+ * generated public API because we need to access a map field as a list in reflection API but
+ * the generated API only allows us to access it as a map. This method returns the underlying
+ * map field directly and thus enables us to access the map field as a list.
*/
@SuppressWarnings({"unused", "rawtypes"})
protected MapField internalGetMapField(int fieldNumber) {
// Note that we can't use descriptor names here because this method will
// be called when descriptor is being initialized.
- throw new RuntimeException(
- "No map fields found in " + getClass().getName());
+ throw new RuntimeException("No map fields found in " + getClass().getName());
}
/** Like {@link #internalGetMapField} but return a mutable version. */
@@ -949,36 +912,30 @@
protected MapField internalGetMutableMapField(int fieldNumber) {
// Note that we can't use descriptor names here because this method will
// be called when descriptor is being initialized.
- throw new RuntimeException(
- "No map fields found in " + getClass().getName());
+ throw new RuntimeException("No map fields found in " + getClass().getName());
}
}
// =================================================================
// Extensions-related stuff
- public interface ExtendableMessageOrBuilder<
- MessageType extends ExtendableMessage> extends MessageOrBuilder {
+ public interface ExtendableMessageOrBuilder<MessageType extends ExtendableMessage>
+ extends MessageOrBuilder {
// Re-define for return type covariance.
@Override
Message getDefaultInstanceForType();
/** Check if a singular extension is present. */
- <Type> boolean hasExtension(
- ExtensionLite<MessageType, Type> extension);
+ <Type> boolean hasExtension(ExtensionLite<MessageType, Type> extension);
/** Get the number of elements in a repeated extension. */
- <Type> int getExtensionCount(
- ExtensionLite<MessageType, List<Type>> extension);
+ <Type> int getExtensionCount(ExtensionLite<MessageType, List<Type>> extension);
/** Get the value of an extension. */
- <Type> Type getExtension(
- ExtensionLite<MessageType, Type> extension);
+ <Type> Type getExtension(ExtensionLite<MessageType, Type> extension);
/** Get one element of a repeated extension. */
- <Type> Type getExtension(
- ExtensionLite<MessageType, List<Type>> extension,
- int index);
+ <Type> Type getExtension(ExtensionLite<MessageType, List<Type>> extension, int index);
/** Check if a singular extension is present. */
<Type> boolean hasExtension(
@@ -1009,16 +966,13 @@
}
/**
- * Generated message classes for message types that contain extension ranges
- * subclass this.
+ * Generated message classes for message types that contain extension ranges subclass this.
*
- * <p>This class implements type-safe accessors for extensions. They
- * implement all the same operations that you can do with normal fields --
- * e.g. "has", "get", and "getCount" -- but for extensions. The extensions
- * are identified using instances of the class {@link GeneratedExtension};
- * the protocol compiler generates a static instance of this class for every
- * extension in its input. Through the magic of generics, all is made
- * type-safe.
+ * <p>This class implements type-safe accessors for extensions. They implement all the same
+ * operations that you can do with normal fields -- e.g. "has", "get", and "getCount" -- but for
+ * extensions. The extensions are identified using instances of the class {@link
+ * GeneratedExtension}; the protocol compiler generates a static instance of this class for every
+ * extension in its input. Through the magic of generics, all is made type-safe.
*
* <p>For example, imagine you have the {@code .proto} file:
*
@@ -1043,10 +997,8 @@
*
* <p>See also {@link ExtendableBuilder}.
*/
- public abstract static class ExtendableMessage<
- MessageType extends ExtendableMessage>
- extends GeneratedMessageV3
- implements ExtendableMessageOrBuilder<MessageType> {
+ public abstract static class ExtendableMessage<MessageType extends ExtendableMessage>
+ extends GeneratedMessageV3 implements ExtendableMessageOrBuilder<MessageType> {
private static final long serialVersionUID = 1L;
@@ -1056,22 +1008,20 @@
this.extensions = FieldSet.newFieldSet();
}
- protected ExtendableMessage(
- ExtendableBuilder<MessageType, ?> builder) {
+ protected ExtendableMessage(ExtendableBuilder<MessageType, ?> builder) {
super(builder);
this.extensions = builder.buildExtensions();
}
- private void verifyExtensionContainingType(
- final Extension<MessageType, ?> extension) {
- if (extension.getDescriptor().getContainingType() !=
- getDescriptorForType()) {
+ private void verifyExtensionContainingType(final Extension<MessageType, ?> extension) {
+ if (extension.getDescriptor().getContainingType() != getDescriptorForType()) {
// This can only happen if someone uses unchecked operations.
throw new IllegalArgumentException(
- "Extension is for type \"" +
- extension.getDescriptor().getContainingType().getFullName() +
- "\" which does not match message type \"" +
- getDescriptorForType().getFullName() + "\".");
+ "Extension is for type \""
+ + extension.getDescriptor().getContainingType().getFullName()
+ + "\" which does not match message type \""
+ + getDescriptorForType().getFullName()
+ + "\".");
}
}
@@ -1109,12 +1059,10 @@
if (value == null) {
if (descriptor.isRepeated()) {
return (Type) Collections.emptyList();
- } else if (descriptor.getJavaType() ==
- FieldDescriptor.JavaType.MESSAGE) {
+ } else if (descriptor.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
return (Type) extension.getMessageDefaultInstance();
} else {
- return (Type) extension.fromReflectionType(
- descriptor.getDefaultValue());
+ return (Type) extension.fromReflectionType(descriptor.getDefaultValue());
}
} else {
return (Type) extension.fromReflectionType(value);
@@ -1130,8 +1078,8 @@
verifyExtensionContainingType(extension);
FieldDescriptor descriptor = extension.getDescriptor();
- return (Type) extension.singularFromReflectionType(
- extensions.getRepeatedField(descriptor, index));
+ return (Type)
+ extension.singularFromReflectionType(extensions.getRepeatedField(descriptor, index));
}
/** Check if a singular extension is present. */
@@ -1196,10 +1144,15 @@
CodedInputStream input,
UnknownFieldSet.Builder unknownFields,
ExtensionRegistryLite extensionRegistry,
- int tag) throws IOException {
+ int tag)
+ throws IOException {
return MessageReflection.mergeFieldFrom(
- input, input.shouldDiscardUnknownFields() ? null : unknownFields, extensionRegistry,
- getDescriptorForType(), new MessageReflection.ExtensionAdapter(extensions), tag);
+ input,
+ input.shouldDiscardUnknownFields() ? null : unknownFields,
+ extensionRegistry,
+ getDescriptorForType(),
+ new MessageReflection.ExtensionAdapter(extensions),
+ tag);
}
/**
@@ -1211,31 +1164,28 @@
CodedInputStream input,
UnknownFieldSet.Builder unknownFields,
ExtensionRegistryLite extensionRegistry,
- int tag) throws IOException {
+ int tag)
+ throws IOException {
return parseUnknownField(input, unknownFields, extensionRegistry, tag);
}
- /**
- * Used by parsing constructors in generated classes.
- */
+ /** Used by parsing constructors in generated classes. */
@Override
protected void makeExtensionsImmutable() {
extensions.makeImmutable();
}
/**
- * Used by subclasses to serialize extensions. Extension ranges may be
- * interleaved with field numbers, but we must write them in canonical
- * (sorted by field number) order. ExtensionWriter helps us write
- * individual ranges of extensions at once.
+ * Used by subclasses to serialize extensions. Extension ranges may be interleaved with field
+ * numbers, but we must write them in canonical (sorted by field number) order. ExtensionWriter
+ * helps us write individual ranges of extensions at once.
*/
protected class ExtensionWriter {
// Imagine how much simpler this code would be if Java iterators had
// a way to get the next element without advancing the iterator.
- private final Iterator<Map.Entry<FieldDescriptor, Object>> iter =
- extensions.iterator();
+ private final Iterator<Map.Entry<FieldDescriptor, Object>> iter = extensions.iterator();
private Map.Entry<FieldDescriptor, Object> next;
private final boolean messageSetWireFormat;
@@ -1246,19 +1196,18 @@
this.messageSetWireFormat = messageSetWireFormat;
}
- public void writeUntil(final int end, final CodedOutputStream output)
- throws IOException {
+ public void writeUntil(final int end, final CodedOutputStream output) throws IOException {
while (next != null && next.getKey().getNumber() < end) {
FieldDescriptor descriptor = next.getKey();
- if (messageSetWireFormat && descriptor.getLiteJavaType() ==
- WireFormat.JavaType.MESSAGE &&
- !descriptor.isRepeated()) {
+ if (messageSetWireFormat
+ && descriptor.getLiteJavaType() == WireFormat.JavaType.MESSAGE
+ && !descriptor.isRepeated()) {
if (next instanceof LazyField.LazyEntry<?>) {
- output.writeRawMessageSetExtension(descriptor.getNumber(),
+ output.writeRawMessageSetExtension(
+ descriptor.getNumber(),
((LazyField.LazyEntry<?>) next).getField().toByteString());
} else {
- output.writeMessageSetExtension(descriptor.getNumber(),
- (Message) next.getValue());
+ output.writeMessageSetExtension(descriptor.getNumber(), (Message) next.getValue());
}
} else {
// TODO(xiangl): Taken care of following code, it may cause
@@ -1282,6 +1231,7 @@
protected ExtensionWriter newExtensionWriter() {
return new ExtensionWriter(false);
}
+
protected ExtensionWriter newMessageSetExtensionWriter() {
return new ExtensionWriter(true);
}
@@ -1290,6 +1240,7 @@
protected int extensionsSerializedSize() {
return extensions.getSerializedSize();
}
+
protected int extensionsSerializedSizeAsMessageSet() {
return extensions.getMessageSetSerializedSize();
}
@@ -1361,8 +1312,7 @@
}
@Override
- public Object getRepeatedField(final FieldDescriptor field,
- final int index) {
+ public Object getRepeatedField(final FieldDescriptor field, final int index) {
if (field.isExtension()) {
verifyContainingType(field);
return extensions.getRepeatedField(field, index);
@@ -1373,23 +1323,19 @@
private void verifyContainingType(final FieldDescriptor field) {
if (field.getContainingType() != getDescriptorForType()) {
- throw new IllegalArgumentException(
- "FieldDescriptor does not match message type.");
+ throw new IllegalArgumentException("FieldDescriptor does not match message type.");
}
}
}
/**
- * Generated message builders for message types that contain extension ranges
- * subclass this.
+ * Generated message builders for message types that contain extension ranges subclass this.
*
- * <p>This class implements type-safe accessors for extensions. They
- * implement all the same operations that you can do with normal fields --
- * e.g. "get", "set", and "add" -- but for extensions. The extensions are
- * identified using instances of the class {@link GeneratedExtension}; the
- * protocol compiler generates a static instance of this class for every
- * extension in its input. Through the magic of generics, all is made
- * type-safe.
+ * <p>This class implements type-safe accessors for extensions. They implement all the same
+ * operations that you can do with normal fields -- e.g. "get", "set", and "add" -- but for
+ * extensions. The extensions are identified using instances of the class {@link
+ * GeneratedExtension}; the protocol compiler generates a static instance of this class for every
+ * extension in its input. Through the magic of generics, all is made type-safe.
*
* <p>For example, imagine you have the {@code .proto} file:
*
@@ -1418,17 +1364,15 @@
*/
@SuppressWarnings("unchecked")
public abstract static class ExtendableBuilder<
- MessageType extends ExtendableMessage,
- BuilderType extends ExtendableBuilder<MessageType, BuilderType>>
- extends Builder<BuilderType>
- implements ExtendableMessageOrBuilder<MessageType> {
+ MessageType extends ExtendableMessage,
+ BuilderType extends ExtendableBuilder<MessageType, BuilderType>>
+ extends Builder<BuilderType> implements ExtendableMessageOrBuilder<MessageType> {
private FieldSet.Builder<FieldDescriptor> extensions;
protected ExtendableBuilder() {}
- protected ExtendableBuilder(
- BuilderParent parent) {
+ protected ExtendableBuilder(BuilderParent parent) {
super(parent);
}
@@ -1449,16 +1393,15 @@
}
}
- private void verifyExtensionContainingType(
- final Extension<MessageType, ?> extension) {
- if (extension.getDescriptor().getContainingType() !=
- getDescriptorForType()) {
+ private void verifyExtensionContainingType(final Extension<MessageType, ?> extension) {
+ if (extension.getDescriptor().getContainingType() != getDescriptorForType()) {
// This can only happen if someone uses unchecked operations.
throw new IllegalArgumentException(
- "Extension is for type \"" +
- extension.getDescriptor().getContainingType().getFullName() +
- "\" which does not match message type \"" +
- getDescriptorForType().getFullName() + "\".");
+ "Extension is for type \""
+ + extension.getDescriptor().getContainingType().getFullName()
+ + "\" which does not match message type \""
+ + getDescriptorForType().getFullName()
+ + "\".");
}
}
@@ -1493,12 +1436,10 @@
if (value == null) {
if (descriptor.isRepeated()) {
return (Type) Collections.emptyList();
- } else if (descriptor.getJavaType() ==
- FieldDescriptor.JavaType.MESSAGE) {
+ } else if (descriptor.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
return (Type) extension.getMessageDefaultInstance();
} else {
- return (Type) extension.fromReflectionType(
- descriptor.getDefaultValue());
+ return (Type) extension.fromReflectionType(descriptor.getDefaultValue());
}
} else {
return (Type) extension.fromReflectionType(value);
@@ -1522,8 +1463,7 @@
/** Set the value of an extension. */
public final <Type> BuilderType setExtension(
- final ExtensionLite<MessageType, Type> extensionLite,
- final Type value) {
+ final ExtensionLite<MessageType, Type> extensionLite, final Type value) {
Extension<MessageType, Type> extension = checkNotLite(extensionLite);
verifyExtensionContainingType(extension);
@@ -1537,30 +1477,27 @@
/** Set the value of one element of a repeated extension. */
public final <Type> BuilderType setExtension(
final ExtensionLite<MessageType, List<Type>> extensionLite,
- final int index, final Type value) {
- Extension<MessageType, List<Type>> extension = checkNotLite(extensionLite);
-
- verifyExtensionContainingType(extension);
- ensureExtensionsIsMutable();
- final FieldDescriptor descriptor = extension.getDescriptor();
- extensions.setRepeatedField(
- descriptor, index,
- extension.singularToReflectionType(value));
- onChanged();
- return (BuilderType) this;
- }
-
- /** Append a value to a repeated extension. */
- public final <Type> BuilderType addExtension(
- final ExtensionLite<MessageType, List<Type>> extensionLite,
+ final int index,
final Type value) {
Extension<MessageType, List<Type>> extension = checkNotLite(extensionLite);
verifyExtensionContainingType(extension);
ensureExtensionsIsMutable();
final FieldDescriptor descriptor = extension.getDescriptor();
- extensions.addRepeatedField(
- descriptor, extension.singularToReflectionType(value));
+ extensions.setRepeatedField(descriptor, index, extension.singularToReflectionType(value));
+ onChanged();
+ return (BuilderType) this;
+ }
+
+ /** Append a value to a repeated extension. */
+ public final <Type> BuilderType addExtension(
+ final ExtensionLite<MessageType, List<Type>> extensionLite, final Type value) {
+ Extension<MessageType, List<Type>> extension = checkNotLite(extensionLite);
+
+ verifyExtensionContainingType(extension);
+ ensureExtensionsIsMutable();
+ final FieldDescriptor descriptor = extension.getDescriptor();
+ extensions.addRepeatedField(descriptor, extension.singularToReflectionType(value));
onChanged();
return (BuilderType) this;
}
@@ -1671,8 +1608,7 @@
}
/**
- * Called by the build code path to create a copy of the extensions for
- * building the message.
+ * Called by the build code path to create a copy of the extensions for building the message.
*/
private FieldSet<FieldDescriptor> buildExtensions() {
return extensions == null
@@ -1762,8 +1698,7 @@
}
@Override
- public Object getRepeatedField(final FieldDescriptor field,
- final int index) {
+ public Object getRepeatedField(final FieldDescriptor field, final int index) {
if (field.isExtension()) {
verifyContainingType(field);
if (extensions == null) {
@@ -1812,8 +1747,7 @@
}
@Override
- public BuilderType setField(final FieldDescriptor field,
- final Object value) {
+ public BuilderType setField(final FieldDescriptor field, final Object value) {
if (field.isExtension()) {
verifyContainingType(field);
ensureExtensionsIsMutable();
@@ -1839,8 +1773,8 @@
}
@Override
- public BuilderType setRepeatedField(final FieldDescriptor field,
- final int index, final Object value) {
+ public BuilderType setRepeatedField(
+ final FieldDescriptor field, final int index, final Object value) {
if (field.isExtension()) {
verifyContainingType(field);
ensureExtensionsIsMutable();
@@ -1853,8 +1787,7 @@
}
@Override
- public BuilderType addRepeatedField(final FieldDescriptor field,
- final Object value) {
+ public BuilderType addRepeatedField(final FieldDescriptor field, final Object value) {
if (field.isExtension()) {
verifyContainingType(field);
ensureExtensionsIsMutable();
@@ -1899,8 +1832,7 @@
private void verifyContainingType(final FieldDescriptor field) {
if (field.getContainingType() != getDescriptorForType()) {
- throw new IllegalArgumentException(
- "FieldDescriptor does not match message type.");
+ throw new IllegalArgumentException("FieldDescriptor does not match message type.");
}
}
}
@@ -1908,8 +1840,8 @@
// -----------------------------------------------------------------
/**
- * Gets the descriptor for an extension. The implementation depends on whether
- * the extension is scoped in the top level of a file or scoped in a Message.
+ * Gets the descriptor for an extension. The implementation depends on whether the extension is
+ * scoped in the top level of a file or scoped in a Message.
*/
static interface ExtensionDescriptorRetriever {
FieldDescriptor getDescriptor();
@@ -1926,8 +1858,8 @@
return clazz.getMethod(name, params);
} catch (NoSuchMethodException e) {
throw new RuntimeException(
- "Generated message class \"" + clazz.getName() +
- "\" missing method \"" + name + "\".", e);
+ "Generated message class \"" + clazz.getName() + "\" missing method \"" + name + "\".",
+ e);
}
}
@@ -1939,8 +1871,7 @@
return method.invoke(object, params);
} catch (IllegalAccessException e) {
throw new RuntimeException(
- "Couldn't use Java reflection to implement protocol message " +
- "reflection.", e);
+ "Couldn't use Java reflection to implement protocol message " + "reflection.", e);
} catch (InvocationTargetException e) {
final Throwable cause = e.getCause();
if (cause instanceof RuntimeException) {
@@ -1949,7 +1880,7 @@
throw (Error) cause;
} else {
throw new RuntimeException(
- "Unexpected exception thrown by generated accessor method.", cause);
+ "Unexpected exception thrown by generated accessor method.", cause);
}
}
}
@@ -1967,25 +1898,24 @@
protected MapField internalGetMapField(int fieldNumber) {
// Note that we can't use descriptor names here because this method will
// be called when descriptor is being initialized.
- throw new RuntimeException(
- "No map fields found in " + getClass().getName());
+ throw new RuntimeException("No map fields found in " + getClass().getName());
}
/**
- * Users should ignore this class. This class provides the implementation
- * with access to the fields of a message object using Java reflection.
+ * Users should ignore this class. This class provides the implementation with access to the
+ * fields of a message object using Java reflection.
*/
public static final class FieldAccessorTable {
/**
- * Construct a FieldAccessorTable for a particular message class. Only
- * one FieldAccessorTable should ever be constructed per class.
+ * Construct a FieldAccessorTable for a particular message class. Only one FieldAccessorTable
+ * should ever be constructed per class.
*
- * @param descriptor The type's descriptor.
- * @param camelCaseNames The camelcase names of all fields in the message.
- * These are used to derive the accessor method names.
- * @param messageClass The message type.
- * @param builderClass The builder type.
+ * @param descriptor The type's descriptor.
+ * @param camelCaseNames The camelcase names of all fields in the message. These are used to
+ * derive the accessor method names.
+ * @param messageClass The message type.
+ * @param builderClass The builder type.
*/
public FieldAccessorTable(
final Descriptor descriptor,
@@ -1997,12 +1927,10 @@
}
/**
- * Construct a FieldAccessorTable for a particular message class without
- * initializing FieldAccessors.
+ * Construct a FieldAccessorTable for a particular message class without initializing
+ * FieldAccessors.
*/
- public FieldAccessorTable(
- final Descriptor descriptor,
- final String[] camelCaseNames) {
+ public FieldAccessorTable(final Descriptor descriptor, final String[] camelCaseNames) {
this.descriptor = descriptor;
this.camelCaseNames = camelCaseNames;
fields = new FieldAccessor[descriptor.getFields().size()];
@@ -2013,16 +1941,19 @@
/**
* Ensures the field accessors are initialized. This method is thread-safe.
*
- * @param messageClass The message type.
- * @param builderClass The builder type.
+ * @param messageClass The message type.
+ * @param builderClass The builder type.
* @return this
*/
public FieldAccessorTable ensureFieldAccessorsInitialized(
- Class<? extends GeneratedMessageV3> messageClass,
- Class<? extends Builder> builderClass) {
- if (initialized) { return this; }
+ Class<? extends GeneratedMessageV3> messageClass, Class<? extends Builder> builderClass) {
+ if (initialized) {
+ return this;
+ }
synchronized (this) {
- if (initialized) { return this; }
+ if (initialized) {
+ return this;
+ }
int fieldsSize = fields.length;
for (int i = 0; i < fieldsSize; i++) {
FieldDescriptor field = descriptor.getFields().get(i);
@@ -2034,36 +1965,54 @@
if (field.isRepeated()) {
if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
if (field.isMapField()) {
- fields[i] = new MapFieldAccessor(
- field, camelCaseNames[i], messageClass, builderClass);
+ fields[i] =
+ new MapFieldAccessor(field, camelCaseNames[i], messageClass, builderClass);
} else {
- fields[i] = new RepeatedMessageFieldAccessor(
- field, camelCaseNames[i], messageClass, builderClass);
+ fields[i] =
+ new RepeatedMessageFieldAccessor(
+ field, camelCaseNames[i], messageClass, builderClass);
}
} else if (field.getJavaType() == FieldDescriptor.JavaType.ENUM) {
- fields[i] = new RepeatedEnumFieldAccessor(
- field, camelCaseNames[i], messageClass, builderClass);
+ fields[i] =
+ new RepeatedEnumFieldAccessor(
+ field, camelCaseNames[i], messageClass, builderClass);
} else {
- fields[i] = new RepeatedFieldAccessor(
- field, camelCaseNames[i], messageClass, builderClass);
+ fields[i] =
+ new RepeatedFieldAccessor(field, camelCaseNames[i], messageClass, builderClass);
}
} else {
if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
- fields[i] = new SingularMessageFieldAccessor(
- field, camelCaseNames[i], messageClass, builderClass,
- containingOneofCamelCaseName);
+ fields[i] =
+ new SingularMessageFieldAccessor(
+ field,
+ camelCaseNames[i],
+ messageClass,
+ builderClass,
+ containingOneofCamelCaseName);
} else if (field.getJavaType() == FieldDescriptor.JavaType.ENUM) {
- fields[i] = new SingularEnumFieldAccessor(
- field, camelCaseNames[i], messageClass, builderClass,
- containingOneofCamelCaseName);
+ fields[i] =
+ new SingularEnumFieldAccessor(
+ field,
+ camelCaseNames[i],
+ messageClass,
+ builderClass,
+ containingOneofCamelCaseName);
} else if (field.getJavaType() == FieldDescriptor.JavaType.STRING) {
- fields[i] = new SingularStringFieldAccessor(
- field, camelCaseNames[i], messageClass, builderClass,
- containingOneofCamelCaseName);
+ fields[i] =
+ new SingularStringFieldAccessor(
+ field,
+ camelCaseNames[i],
+ messageClass,
+ builderClass,
+ containingOneofCamelCaseName);
} else {
- fields[i] = new SingularFieldAccessor(
- field, camelCaseNames[i], messageClass, builderClass,
- containingOneofCamelCaseName);
+ fields[i] =
+ new SingularFieldAccessor(
+ field,
+ camelCaseNames[i],
+ messageClass,
+ builderClass,
+ containingOneofCamelCaseName);
}
}
}
@@ -2089,13 +2038,11 @@
/** Get the FieldAccessor for a particular field. */
private FieldAccessor getField(final FieldDescriptor field) {
if (field.getContainingType() != descriptor) {
- throw new IllegalArgumentException(
- "FieldDescriptor does not match message type.");
+ throw new IllegalArgumentException("FieldDescriptor does not match message type.");
} else if (field.isExtension()) {
// If this type had extensions, it would subclass ExtendableMessage,
// which overrides the reflection interface to handle extensions.
- throw new IllegalArgumentException(
- "This type does not have extensions.");
+ throw new IllegalArgumentException("This type does not have extensions.");
}
return fields[field.getIndex()];
}
@@ -2103,38 +2050,53 @@
/** Get the OneofAccessor for a particular oneof. */
private OneofAccessor getOneof(final OneofDescriptor oneof) {
if (oneof.getContainingType() != descriptor) {
- throw new IllegalArgumentException(
- "OneofDescriptor does not match message type.");
+ throw new IllegalArgumentException("OneofDescriptor does not match message type.");
}
return oneofs[oneof.getIndex()];
}
/**
- * Abstract interface that provides access to a single field. This is
- * implemented differently depending on the field type and cardinality.
+ * Abstract interface that provides access to a single field. This is implemented differently
+ * depending on the field type and cardinality.
*/
private interface FieldAccessor {
Object get(GeneratedMessageV3 message);
+
Object get(GeneratedMessageV3.Builder builder);
+
Object getRaw(GeneratedMessageV3 message);
+
Object getRaw(GeneratedMessageV3.Builder builder);
+
void set(Builder builder, Object value);
+
Object getRepeated(GeneratedMessageV3 message, int index);
+
Object getRepeated(GeneratedMessageV3.Builder builder, int index);
+
Object getRepeatedRaw(GeneratedMessageV3 message, int index);
+
Object getRepeatedRaw(GeneratedMessageV3.Builder builder, int index);
- void setRepeated(Builder builder,
- int index, Object value);
+
+ void setRepeated(Builder builder, int index, Object value);
+
void addRepeated(Builder builder, Object value);
+
boolean has(GeneratedMessageV3 message);
+
boolean has(GeneratedMessageV3.Builder builder);
+
int getRepeatedCount(GeneratedMessageV3 message);
+
int getRepeatedCount(GeneratedMessageV3.Builder builder);
+
void clear(Builder builder);
+
Message.Builder newBuilder();
+
Message.Builder getBuilder(GeneratedMessageV3.Builder builder);
- Message.Builder getRepeatedBuilder(GeneratedMessageV3.Builder builder,
- int index);
+
+ Message.Builder getRepeatedBuilder(GeneratedMessageV3.Builder builder, int index);
}
/** OneofAccessor provides access to a single oneof. */
@@ -2362,48 +2324,59 @@
public Object get(final GeneratedMessageV3 message) {
return invoker.get(message);
}
+
@Override
public Object get(GeneratedMessageV3.Builder builder) {
return invoker.get(builder);
}
+
@Override
public Object getRaw(final GeneratedMessageV3 message) {
return get(message);
}
+
@Override
public Object getRaw(GeneratedMessageV3.Builder builder) {
return get(builder);
}
+
@Override
public void set(final Builder builder, final Object value) {
invoker.set(builder, value);
}
+
@Override
public Object getRepeated(final GeneratedMessageV3 message, final int index) {
throw new UnsupportedOperationException("getRepeatedField() called on a singular field.");
}
+
@Override
public Object getRepeatedRaw(final GeneratedMessageV3 message, final int index) {
throw new UnsupportedOperationException(
"getRepeatedFieldRaw() called on a singular field.");
}
+
@Override
public Object getRepeated(GeneratedMessageV3.Builder builder, int index) {
throw new UnsupportedOperationException("getRepeatedField() called on a singular field.");
}
+
@Override
public Object getRepeatedRaw(GeneratedMessageV3.Builder builder, int index) {
throw new UnsupportedOperationException(
"getRepeatedFieldRaw() called on a singular field.");
}
+
@Override
public void setRepeated(final Builder builder, final int index, final Object value) {
throw new UnsupportedOperationException("setRepeatedField() called on a singular field.");
}
+
@Override
public void addRepeated(final Builder builder, final Object value) {
throw new UnsupportedOperationException("addRepeatedField() called on a singular field.");
}
+
@Override
public boolean has(final GeneratedMessageV3 message) {
if (!hasHasMethod) {
@@ -2414,6 +2387,7 @@
}
return invoker.has(message);
}
+
@Override
public boolean has(GeneratedMessageV3.Builder builder) {
if (!hasHasMethod) {
@@ -2424,29 +2398,35 @@
}
return invoker.has(builder);
}
+
@Override
public int getRepeatedCount(final GeneratedMessageV3 message) {
throw new UnsupportedOperationException(
"getRepeatedFieldSize() called on a singular field.");
}
+
@Override
public int getRepeatedCount(GeneratedMessageV3.Builder builder) {
throw new UnsupportedOperationException(
"getRepeatedFieldSize() called on a singular field.");
}
+
@Override
public void clear(final Builder builder) {
invoker.clear(builder);
}
+
@Override
public Message.Builder newBuilder() {
throw new UnsupportedOperationException(
"newBuilderForField() called on a non-Message type.");
}
+
@Override
public Message.Builder getBuilder(GeneratedMessageV3.Builder builder) {
throw new UnsupportedOperationException("getFieldBuilder() called on a non-Message type.");
}
+
@Override
public Message.Builder getRepeatedBuilder(GeneratedMessageV3.Builder builder, int index) {
throw new UnsupportedOperationException(
@@ -2517,8 +2497,7 @@
}
@Override
- public Object getRepeated(
- final GeneratedMessageV3 message, final int index) {
+ public Object getRepeated(final GeneratedMessageV3 message, final int index) {
return invokeOrDie(getRepeatedMethod, message, index);
}
@@ -2535,8 +2514,7 @@
}
@Override
- public void addRepeated(
- final GeneratedMessageV3.Builder<?> builder, final Object value) {
+ public void addRepeated(final GeneratedMessageV3.Builder<?> builder, final Object value) {
// TODO(b/230609037): remove the unused variable
Object unused = invokeOrDie(addRepeatedMethod, builder, value);
}
@@ -2562,7 +2540,8 @@
protected final MethodInvoker invoker;
RepeatedFieldAccessor(
- final FieldDescriptor descriptor, final String camelCaseName,
+ final FieldDescriptor descriptor,
+ final String camelCaseName,
final Class<? extends GeneratedMessageV3> messageClass,
final Class<? extends Builder> builderClass) {
ReflectionInvoker reflectionInvoker =
@@ -2579,18 +2558,22 @@
public Object get(final GeneratedMessageV3 message) {
return invoker.get(message);
}
+
@Override
public Object get(GeneratedMessageV3.Builder builder) {
return invoker.get(builder);
}
+
@Override
public Object getRaw(final GeneratedMessageV3 message) {
return get(message);
}
+
@Override
public Object getRaw(GeneratedMessageV3.Builder builder) {
return get(builder);
}
+
@Override
public void set(final Builder builder, final Object value) {
// Add all the elements individually. This serves two purposes:
@@ -2602,59 +2585,73 @@
addRepeated(builder, element);
}
}
+
@Override
public Object getRepeated(final GeneratedMessageV3 message, final int index) {
return invoker.getRepeated(message, index);
}
+
@Override
public Object getRepeated(GeneratedMessageV3.Builder builder, int index) {
return invoker.getRepeated(builder, index);
}
+
@Override
public Object getRepeatedRaw(GeneratedMessageV3 message, int index) {
return getRepeated(message, index);
}
+
@Override
public Object getRepeatedRaw(GeneratedMessageV3.Builder builder, int index) {
return getRepeated(builder, index);
}
+
@Override
public void setRepeated(final Builder builder, final int index, final Object value) {
invoker.setRepeated(builder, index, value);
}
+
@Override
public void addRepeated(final Builder builder, final Object value) {
invoker.addRepeated(builder, value);
}
+
@Override
public boolean has(final GeneratedMessageV3 message) {
throw new UnsupportedOperationException("hasField() called on a repeated field.");
}
+
@Override
public boolean has(GeneratedMessageV3.Builder builder) {
throw new UnsupportedOperationException("hasField() called on a repeated field.");
}
+
@Override
public int getRepeatedCount(final GeneratedMessageV3 message) {
return invoker.getRepeatedCount(message);
}
+
@Override
public int getRepeatedCount(GeneratedMessageV3.Builder builder) {
return invoker.getRepeatedCount(builder);
}
+
@Override
public void clear(final Builder builder) {
invoker.clear(builder);
}
+
@Override
public Message.Builder newBuilder() {
throw new UnsupportedOperationException(
"newBuilderForField() called on a non-Message type.");
}
+
@Override
public Message.Builder getBuilder(GeneratedMessageV3.Builder builder) {
throw new UnsupportedOperationException("getFieldBuilder() called on a non-Message type.");
}
+
@Override
public Message.Builder getRepeatedBuilder(GeneratedMessageV3.Builder builder, int index) {
throw new UnsupportedOperationException(
@@ -2664,16 +2661,15 @@
private static class MapFieldAccessor implements FieldAccessor {
MapFieldAccessor(
- final FieldDescriptor descriptor, final String camelCaseName,
+ final FieldDescriptor descriptor,
+ final String camelCaseName,
final Class<? extends GeneratedMessageV3> messageClass,
final Class<? extends Builder> builderClass) {
field = descriptor;
- Method getDefaultInstanceMethod =
- getMethodOrDie(messageClass, "getDefaultInstance");
- MapField defaultMapField = getMapField(
- (GeneratedMessageV3) invokeOrDie(getDefaultInstanceMethod, null));
- mapEntryMessageDefaultInstance =
- defaultMapField.getMapEntryMessageDefaultInstance();
+ Method getDefaultInstanceMethod = getMethodOrDie(messageClass, "getDefaultInstance");
+ MapField defaultMapField =
+ getMapField((GeneratedMessageV3) invokeOrDie(getDefaultInstanceMethod, null));
+ mapEntryMessageDefaultInstance = defaultMapField.getMapEntryMessageDefaultInstance();
}
private final FieldDescriptor field;
@@ -2687,10 +2683,8 @@
return (MapField<?, ?>) builder.internalGetMapField(field.getNumber());
}
- private MapField<?, ?> getMutableMapField(
- GeneratedMessageV3.Builder builder) {
- return (MapField<?, ?>) builder.internalGetMutableMapField(
- field.getNumber());
+ private MapField<?, ?> getMutableMapField(GeneratedMessageV3.Builder builder) {
+ return (MapField<?, ?>) builder.internalGetMutableMapField(field.getNumber());
}
private Message coerceType(Message value) {
@@ -2777,14 +2771,12 @@
@Override
public boolean has(GeneratedMessageV3 message) {
- throw new UnsupportedOperationException(
- "hasField() is not supported for repeated fields.");
+ throw new UnsupportedOperationException("hasField() is not supported for repeated fields.");
}
@Override
public boolean has(Builder builder) {
- throw new UnsupportedOperationException(
- "hasField() is not supported for repeated fields.");
+ throw new UnsupportedOperationException("hasField() is not supported for repeated fields.");
}
@Override
@@ -2809,8 +2801,7 @@
@Override
public com.google.protobuf.Message.Builder getBuilder(Builder builder) {
- throw new UnsupportedOperationException(
- "Nested builder not supported for map fields.");
+ throw new UnsupportedOperationException("Nested builder not supported for map fields.");
}
@Override
@@ -2821,10 +2812,10 @@
// ---------------------------------------------------------------
- private static final class SingularEnumFieldAccessor
- extends SingularFieldAccessor {
+ private static final class SingularEnumFieldAccessor extends SingularFieldAccessor {
SingularEnumFieldAccessor(
- final FieldDescriptor descriptor, final String camelCaseName,
+ final FieldDescriptor descriptor,
+ final String camelCaseName,
final Class<? extends GeneratedMessageV3> messageClass,
final Class<? extends Builder> builderClass,
final String containingOneofCamelCaseName) {
@@ -2837,12 +2828,9 @@
supportUnknownEnumValue = descriptor.getFile().supportsUnknownEnumValue();
if (supportUnknownEnumValue) {
- getValueMethod =
- getMethodOrDie(messageClass, "get" + camelCaseName + "Value");
- getValueMethodBuilder =
- getMethodOrDie(builderClass, "get" + camelCaseName + "Value");
- setValueMethod =
- getMethodOrDie(builderClass, "set" + camelCaseName + "Value", int.class);
+ getValueMethod = getMethodOrDie(messageClass, "get" + camelCaseName + "Value");
+ getValueMethodBuilder = getMethodOrDie(builderClass, "get" + camelCaseName + "Value");
+ setValueMethod = getMethodOrDie(builderClass, "set" + camelCaseName + "Value", int.class);
}
}
@@ -2886,10 +2874,10 @@
}
}
- private static final class RepeatedEnumFieldAccessor
- extends RepeatedFieldAccessor {
+ private static final class RepeatedEnumFieldAccessor extends RepeatedFieldAccessor {
RepeatedEnumFieldAccessor(
- final FieldDescriptor descriptor, final String camelCaseName,
+ final FieldDescriptor descriptor,
+ final String camelCaseName,
final Class<? extends GeneratedMessageV3> messageClass,
final Class<? extends Builder> builderClass) {
super(descriptor, camelCaseName, messageClass, builderClass);
@@ -2911,6 +2899,7 @@
getMethodOrDie(builderClass, "add" + camelCaseName + "Value", int.class);
}
}
+
private EnumDescriptor enumDescriptor;
private final Method valueOfMethod;
@@ -2976,6 +2965,7 @@
}
super.setRepeated(builder, index, invokeOrDie(valueOfMethod, null, value));
}
+
@Override
public void addRepeated(final Builder builder, final Object value) {
if (supportUnknownEnumValue) {
@@ -2994,29 +2984,25 @@
/**
* Field accessor for string fields.
*
- * <p>This class makes getFooBytes() and setFooBytes() available for
- * reflection API so that reflection based serialize/parse functions can
- * access the raw bytes of the field to preserve non-UTF8 bytes in the
- * string.
+ * <p>This class makes getFooBytes() and setFooBytes() available for reflection API so that
+ * reflection based serialize/parse functions can access the raw bytes of the field to preserve
+ * non-UTF8 bytes in the string.
*
- * <p>This ensures the serialize/parse round-trip safety, which is important
- * for servers which forward messages.
+ * <p>This ensures the serialize/parse round-trip safety, which is important for servers which
+ * forward messages.
*/
- private static final class SingularStringFieldAccessor
- extends SingularFieldAccessor {
+ private static final class SingularStringFieldAccessor extends SingularFieldAccessor {
SingularStringFieldAccessor(
- final FieldDescriptor descriptor, final String camelCaseName,
+ final FieldDescriptor descriptor,
+ final String camelCaseName,
final Class<? extends GeneratedMessageV3> messageClass,
final Class<? extends Builder> builderClass,
final String containingOneofCamelCaseName) {
- super(descriptor, camelCaseName, messageClass, builderClass,
- containingOneofCamelCaseName);
- getBytesMethod = getMethodOrDie(messageClass,
- "get" + camelCaseName + "Bytes");
- getBytesMethodBuilder = getMethodOrDie(builderClass,
- "get" + camelCaseName + "Bytes");
- setBytesMethodBuilder = getMethodOrDie(builderClass,
- "set" + camelCaseName + "Bytes", ByteString.class);
+ super(descriptor, camelCaseName, messageClass, builderClass, containingOneofCamelCaseName);
+ getBytesMethod = getMethodOrDie(messageClass, "get" + camelCaseName + "Bytes");
+ getBytesMethodBuilder = getMethodOrDie(builderClass, "get" + camelCaseName + "Bytes");
+ setBytesMethodBuilder =
+ getMethodOrDie(builderClass, "set" + camelCaseName + "Bytes", ByteString.class);
}
private final Method getBytesMethod;
@@ -3046,19 +3032,17 @@
// ---------------------------------------------------------------
- private static final class SingularMessageFieldAccessor
- extends SingularFieldAccessor {
+ private static final class SingularMessageFieldAccessor extends SingularFieldAccessor {
SingularMessageFieldAccessor(
- final FieldDescriptor descriptor, final String camelCaseName,
+ final FieldDescriptor descriptor,
+ final String camelCaseName,
final Class<? extends GeneratedMessageV3> messageClass,
final Class<? extends Builder> builderClass,
final String containingOneofCamelCaseName) {
- super(descriptor, camelCaseName, messageClass, builderClass,
- containingOneofCamelCaseName);
+ super(descriptor, camelCaseName, messageClass, builderClass, containingOneofCamelCaseName);
newBuilderMethod = getMethodOrDie(type, "newBuilder");
- getBuilderMethodBuilder =
- getMethodOrDie(builderClass, "get" + camelCaseName + "Builder");
+ getBuilderMethodBuilder = getMethodOrDie(builderClass, "get" + camelCaseName + "Builder");
}
private final Method newBuilderMethod;
@@ -3082,27 +3066,29 @@
public void set(final Builder builder, final Object value) {
super.set(builder, coerceType(value));
}
+
@Override
public Message.Builder newBuilder() {
return (Message.Builder) invokeOrDie(newBuilderMethod, null);
}
+
@Override
public Message.Builder getBuilder(GeneratedMessageV3.Builder builder) {
return (Message.Builder) invokeOrDie(getBuilderMethodBuilder, builder);
}
}
- private static final class RepeatedMessageFieldAccessor
- extends RepeatedFieldAccessor {
+ private static final class RepeatedMessageFieldAccessor extends RepeatedFieldAccessor {
RepeatedMessageFieldAccessor(
- final FieldDescriptor descriptor, final String camelCaseName,
+ final FieldDescriptor descriptor,
+ final String camelCaseName,
final Class<? extends GeneratedMessageV3> messageClass,
final Class<? extends Builder> builderClass) {
super(descriptor, camelCaseName, messageClass, builderClass);
newBuilderMethod = getMethodOrDie(type, "newBuilder");
- getBuilderMethodBuilder = getMethodOrDie(builderClass,
- "get" + camelCaseName + "Builder", Integer.TYPE);
+ getBuilderMethodBuilder =
+ getMethodOrDie(builderClass, "get" + camelCaseName + "Builder", Integer.TYPE);
}
private final Method newBuilderMethod;
@@ -3126,27 +3112,30 @@
public void setRepeated(final Builder builder, final int index, final Object value) {
super.setRepeated(builder, index, coerceType(value));
}
+
@Override
public void addRepeated(final Builder builder, final Object value) {
super.addRepeated(builder, coerceType(value));
}
+
@Override
public Message.Builder newBuilder() {
return (Message.Builder) invokeOrDie(newBuilderMethod, null);
}
+
@Override
public Message.Builder getRepeatedBuilder(
final GeneratedMessageV3.Builder builder, final int index) {
- return (Message.Builder) invokeOrDie(
- getBuilderMethodBuilder, builder, index);
+ return (Message.Builder) invokeOrDie(getBuilderMethodBuilder, builder, index);
}
}
}
/**
- * Replaces this object in the output stream with a serialized form.
- * Part of Java's serialization magic. Generated sub-classes must override
- * this method by calling {@code return super.writeReplace();}
+ * Replaces this object in the output stream with a serialized form. Part of Java's serialization
+ * magic. Generated sub-classes must override this method by calling {@code return
+ * super.writeReplace();}
+ *
* @return a SerializedForm of this message
*/
protected Object writeReplace() throws ObjectStreamException {
@@ -3198,8 +3187,8 @@
}
}
- protected static void writeStringNoTag(
- CodedOutputStream output, final Object value) throws IOException {
+ protected static void writeStringNoTag(CodedOutputStream output, final Object value)
+ throws IOException {
if (value instanceof String) {
output.writeStringNoTag((String) value);
} else {
@@ -3211,7 +3200,8 @@
CodedOutputStream out,
MapField<Integer, V> field,
MapEntry<Integer, V> defaultEntry,
- int fieldNumber) throws IOException {
+ int fieldNumber)
+ throws IOException {
Map<Integer, V> m = field.getMap();
if (!out.isSerializationDeterministic()) {
serializeMapTo(out, m, defaultEntry, fieldNumber);
@@ -3226,11 +3216,8 @@
}
Arrays.sort(keys);
for (int key : keys) {
- out.writeMessage(fieldNumber,
- defaultEntry.newBuilderForType()
- .setKey(key)
- .setValue(m.get(key))
- .build());
+ out.writeMessage(
+ fieldNumber, defaultEntry.newBuilderForType().setKey(key).setValue(m.get(key)).build());
}
}
@@ -3253,11 +3240,8 @@
}
Arrays.sort(keys);
for (long key : keys) {
- out.writeMessage(fieldNumber,
- defaultEntry.newBuilderForType()
- .setKey(key)
- .setValue(m.get(key))
- .build());
+ out.writeMessage(
+ fieldNumber, defaultEntry.newBuilderForType().setKey(key).setValue(m.get(key)).build());
}
}
@@ -3279,11 +3263,8 @@
keys = m.keySet().toArray(keys);
Arrays.sort(keys);
for (String key : keys) {
- out.writeMessage(fieldNumber,
- defaultEntry.newBuilderForType()
- .setKey(key)
- .setValue(m.get(key))
- .build());
+ out.writeMessage(
+ fieldNumber, defaultEntry.newBuilderForType().setKey(key).setValue(m.get(key)).build());
}
}
@@ -3310,28 +3291,23 @@
boolean key)
throws IOException {
if (m.containsKey(key)) {
- out.writeMessage(fieldNumber,
- defaultEntry.newBuilderForType()
- .setKey(key)
- .setValue(m.get(key))
- .build());
+ out.writeMessage(
+ fieldNumber, defaultEntry.newBuilderForType().setKey(key).setValue(m.get(key)).build());
}
}
/** Serialize the map using the iteration order. */
private static <K, V> void serializeMapTo(
- CodedOutputStream out,
- Map<K, V> m,
- MapEntry<K, V> defaultEntry,
- int fieldNumber)
+ CodedOutputStream out, Map<K, V> m, MapEntry<K, V> defaultEntry, int fieldNumber)
throws IOException {
for (Map.Entry<K, V> entry : m.entrySet()) {
- out.writeMessage(fieldNumber,
- defaultEntry.newBuilderForType()
+ out.writeMessage(
+ fieldNumber,
+ defaultEntry
+ .newBuilderForType()
.setKey(entry.getKey())
.setValue(entry.getValue())
.build());
}
}
}
-
diff --git a/java/core/src/main/java/com/google/protobuf/Internal.java b/java/core/src/main/java/com/google/protobuf/Internal.java
index b6bbcb1..0fb934f 100644
--- a/java/core/src/main/java/com/google/protobuf/Internal.java
+++ b/java/core/src/main/java/com/google/protobuf/Internal.java
@@ -600,6 +600,7 @@
void addInt(int element);
/** Like {@link #set(int, Object)} but more efficient in that it doesn't box the element. */
+ @CanIgnoreReturnValue
int setInt(int index, int element);
/** Returns a mutable clone of this list with the specified capacity. */
@@ -620,6 +621,7 @@
void addBoolean(boolean element);
/** Like {@link #set(int, Object)} but more efficient in that it doesn't box the element. */
+ @CanIgnoreReturnValue
boolean setBoolean(int index, boolean element);
/** Returns a mutable clone of this list with the specified capacity. */
@@ -640,6 +642,7 @@
void addLong(long element);
/** Like {@link #set(int, Object)} but more efficient in that it doesn't box the element. */
+ @CanIgnoreReturnValue
long setLong(int index, long element);
/** Returns a mutable clone of this list with the specified capacity. */
@@ -660,6 +663,7 @@
void addDouble(double element);
/** Like {@link #set(int, Object)} but more efficient in that it doesn't box the element. */
+ @CanIgnoreReturnValue
double setDouble(int index, double element);
/** Returns a mutable clone of this list with the specified capacity. */
@@ -680,6 +684,7 @@
void addFloat(float element);
/** Like {@link #set(int, Object)} but more efficient in that it doesn't box the element. */
+ @CanIgnoreReturnValue
float setFloat(int index, float element);
/** Returns a mutable clone of this list with the specified capacity. */
diff --git a/java/core/src/main/java/com/google/protobuf/Message.java b/java/core/src/main/java/com/google/protobuf/Message.java
index 3db1c77..f641739 100644
--- a/java/core/src/main/java/com/google/protobuf/Message.java
+++ b/java/core/src/main/java/com/google/protobuf/Message.java
@@ -39,11 +39,12 @@
*
* <p>See also {@link MessageLite}, which defines most of the methods that typical users care about.
* {@link Message} adds methods that are not available in the "lite" runtime. The biggest added
- * features are introspection and reflection; that is, getting descriptors for the message type
- * and accessing the field values dynamically.
+ * features are introspection and reflection; that is, getting descriptors for the message type and
+ * accessing the field values dynamically.
*
* @author kenton@google.com Kenton Varda
*/
+@CheckReturnValue
public interface Message extends MessageLite, MessageOrBuilder {
// (From MessageLite, re-declared here only for return type covariance.)
@@ -102,6 +103,7 @@
// (From MessageLite.Builder, re-declared here only for return type
// covariance.)
@Override
+ @CanIgnoreReturnValue
Builder clear();
/**
@@ -121,6 +123,7 @@
*
* <p>This is equivalent to the {@code Message::MergeFrom} method in C++.
*/
+ @CanIgnoreReturnValue
Builder mergeFrom(Message other);
// (From MessageLite.Builder, re-declared here only for return type
@@ -135,9 +138,11 @@
Builder clone();
@Override
+ @CanIgnoreReturnValue
Builder mergeFrom(CodedInputStream input) throws IOException;
@Override
+ @CanIgnoreReturnValue
Builder mergeFrom(CodedInputStream input, ExtensionRegistryLite extensionRegistry)
throws IOException;
@@ -190,18 +195,21 @@
* Sets a field to the given value. The value must be of the correct type for this field, that
* is, the same type that {@link Message#getField(Descriptors.FieldDescriptor)} returns.
*/
+ @CanIgnoreReturnValue
Builder setField(Descriptors.FieldDescriptor field, Object value);
/**
* Clears the field. This is exactly equivalent to calling the generated "clear" accessor method
* corresponding to the field.
*/
+ @CanIgnoreReturnValue
Builder clearField(Descriptors.FieldDescriptor field);
/**
* Clears the oneof. This is exactly equivalent to calling the generated "clear" accessor method
* corresponding to the oneof.
*/
+ @CanIgnoreReturnValue
Builder clearOneof(Descriptors.OneofDescriptor oneof);
/**
@@ -212,6 +220,7 @@
* @throws IllegalArgumentException if the field is not a repeated field, or {@code
* field.getContainingType() != getDescriptorForType()}.
*/
+ @CanIgnoreReturnValue
Builder setRepeatedField(Descriptors.FieldDescriptor field, int index, Object value);
/**
@@ -220,12 +229,15 @@
* @throws IllegalArgumentException if the field is not a repeated field, or {@code
* field.getContainingType() != getDescriptorForType()}
*/
+ @CanIgnoreReturnValue
Builder addRepeatedField(Descriptors.FieldDescriptor field, Object value);
/** Set the {@link UnknownFieldSet} for this message. */
+ @CanIgnoreReturnValue
Builder setUnknownFields(UnknownFieldSet unknownFields);
/** Merge some unknown fields into the {@link UnknownFieldSet} for this message. */
+ @CanIgnoreReturnValue
Builder mergeUnknownFields(UnknownFieldSet unknownFields);
// ---------------------------------------------------------------
@@ -234,30 +246,38 @@
// (From MessageLite.Builder, re-declared here only for return type
// covariance.)
@Override
+ @CanIgnoreReturnValue
Builder mergeFrom(ByteString data) throws InvalidProtocolBufferException;
@Override
+ @CanIgnoreReturnValue
Builder mergeFrom(ByteString data, ExtensionRegistryLite extensionRegistry)
throws InvalidProtocolBufferException;
@Override
+ @CanIgnoreReturnValue
Builder mergeFrom(byte[] data) throws InvalidProtocolBufferException;
@Override
+ @CanIgnoreReturnValue
Builder mergeFrom(byte[] data, int off, int len) throws InvalidProtocolBufferException;
@Override
+ @CanIgnoreReturnValue
Builder mergeFrom(byte[] data, ExtensionRegistryLite extensionRegistry)
throws InvalidProtocolBufferException;
@Override
+ @CanIgnoreReturnValue
Builder mergeFrom(byte[] data, int off, int len, ExtensionRegistryLite extensionRegistry)
throws InvalidProtocolBufferException;
@Override
+ @CanIgnoreReturnValue
Builder mergeFrom(InputStream input) throws IOException;
@Override
+ @CanIgnoreReturnValue
Builder mergeFrom(InputStream input, ExtensionRegistryLite extensionRegistry)
throws IOException;
diff --git a/java/core/src/main/java/com/google/protobuf/MessageLite.java b/java/core/src/main/java/com/google/protobuf/MessageLite.java
index f9b2f66..d631469 100644
--- a/java/core/src/main/java/com/google/protobuf/MessageLite.java
+++ b/java/core/src/main/java/com/google/protobuf/MessageLite.java
@@ -59,6 +59,7 @@
*
* @author kenton@google.com Kenton Varda
*/
+@CheckReturnValue
public interface MessageLite extends MessageLiteOrBuilder {
/**
@@ -138,6 +139,7 @@
/** Abstract interface implemented by Protocol Message builders. */
interface Builder extends MessageLiteOrBuilder, Cloneable {
/** Resets all fields to their default values. */
+ @CanIgnoreReturnValue
Builder clear();
/**
@@ -181,11 +183,12 @@
* <p>Note: The caller should call {@link CodedInputStream#checkLastTagWas(int)} after calling
* this to verify that the last tag seen was the appropriate end-group tag, or zero for EOF.
*
- * @throws InvalidProtocolBufferException the bytes read are not syntactically correct
- * according to the protobuf wire format specification. The data is corrupt, incomplete,
- * or was never a protobuf in the first place.
+ * @throws InvalidProtocolBufferException the bytes read are not syntactically correct according
+ * to the protobuf wire format specification. The data is corrupt, incomplete, or was never
+ * a protobuf in the first place.
* @throws IOException an I/O error reading from the stream
*/
+ @CanIgnoreReturnValue
Builder mergeFrom(CodedInputStream input) throws IOException;
/**
@@ -193,11 +196,12 @@
* that you want to be able to parse must be registered in {@code extensionRegistry}. Extensions
* not in the registry will be treated as unknown fields.
*
- * @throws InvalidProtocolBufferException the bytes read are not syntactically correct
- * according to the protobuf wire format specification. The data is corrupt, incomplete,
- * or was never a protobuf in the first place.
+ * @throws InvalidProtocolBufferException the bytes read are not syntactically correct according
+ * to the protobuf wire format specification. The data is corrupt, incomplete, or was never
+ * a protobuf in the first place.
* @throws IOException an I/O error reading from the stream
*/
+ @CanIgnoreReturnValue
Builder mergeFrom(CodedInputStream input, ExtensionRegistryLite extensionRegistry)
throws IOException;
@@ -209,10 +213,11 @@
* is just a small wrapper around {@link #mergeFrom(CodedInputStream)}.
*
* @throws InvalidProtocolBufferException the bytes in data are not syntactically correct
- * according to the protobuf wire format specification. The data is corrupt, incomplete,
- * or was never a protobuf in the first place.
+ * according to the protobuf wire format specification. The data is corrupt, incomplete, or
+ * was never a protobuf in the first place.
* @return this
*/
+ @CanIgnoreReturnValue
Builder mergeFrom(ByteString data) throws InvalidProtocolBufferException;
/**
@@ -220,10 +225,11 @@
* is just a small wrapper around {@link #mergeFrom(CodedInputStream,ExtensionRegistryLite)}.
*
* @throws InvalidProtocolBufferException the bytes in data are not syntactically correct
- * according to the protobuf wire format specification. The data is corrupt, incomplete,
- * or was never a protobuf in the first place.
+ * according to the protobuf wire format specification. The data is corrupt, incomplete, or
+ * was never a protobuf in the first place.
* @return this
*/
+ @CanIgnoreReturnValue
Builder mergeFrom(ByteString data, ExtensionRegistryLite extensionRegistry)
throws InvalidProtocolBufferException;
@@ -232,10 +238,11 @@
* is just a small wrapper around {@link #mergeFrom(CodedInputStream)}.
*
* @throws InvalidProtocolBufferException the bytes in data are not syntactically correct
- * according to the protobuf wire format specification. The data is corrupt, incomplete,
- * or was never a protobuf in the first place.
+ * according to the protobuf wire format specification. The data is corrupt, incomplete, or
+ * was never a protobuf in the first place.
* @return this
*/
+ @CanIgnoreReturnValue
Builder mergeFrom(byte[] data) throws InvalidProtocolBufferException;
/**
@@ -243,10 +250,11 @@
* is just a small wrapper around {@link #mergeFrom(CodedInputStream)}.
*
* @throws InvalidProtocolBufferException the bytes in data are not syntactically correct
- * according to the protobuf wire format specification. The data is corrupt, incomplete,
- * or was never a protobuf in the first place.
+ * according to the protobuf wire format specification. The data is corrupt, incomplete, or
+ * was never a protobuf in the first place.
* @return this
*/
+ @CanIgnoreReturnValue
Builder mergeFrom(byte[] data, int off, int len) throws InvalidProtocolBufferException;
/**
@@ -254,10 +262,11 @@
* is just a small wrapper around {@link #mergeFrom(CodedInputStream,ExtensionRegistryLite)}.
*
* @throws InvalidProtocolBufferException the bytes in data are not syntactically correct
- * according to the protobuf wire format specification. The data is corrupt, incomplete,
- * or was never a protobuf in the first place.
+ * according to the protobuf wire format specification. The data is corrupt, incomplete, or
+ * was never a protobuf in the first place.
* @return this
*/
+ @CanIgnoreReturnValue
Builder mergeFrom(byte[] data, ExtensionRegistryLite extensionRegistry)
throws InvalidProtocolBufferException;
@@ -266,10 +275,11 @@
* is just a small wrapper around {@link #mergeFrom(CodedInputStream,ExtensionRegistryLite)}.
*
* @throws InvalidProtocolBufferException the bytes in data are not syntactically correct
- * according to the protobuf wire format specification. The data is corrupt, incomplete,
- * or was never a protobuf in the first place.
+ * according to the protobuf wire format specification. The data is corrupt, incomplete, or
+ * was never a protobuf in the first place.
* @return this
*/
+ @CanIgnoreReturnValue
Builder mergeFrom(byte[] data, int off, int len, ExtensionRegistryLite extensionRegistry)
throws InvalidProtocolBufferException;
@@ -283,12 +293,13 @@
*
* <p>Despite usually reading the entire input, this does not close the stream.
*
- * @throws InvalidProtocolBufferException the bytes read are not syntactically correct
- * according to the protobuf wire format specification. The data is corrupt, incomplete,
- * or was never a protobuf in the first place.
+ * @throws InvalidProtocolBufferException the bytes read are not syntactically correct according
+ * to the protobuf wire format specification. The data is corrupt, incomplete, or was never
+ * a protobuf in the first place.
* @throws IOException an I/O error reading from the stream
* @return this
*/
+ @CanIgnoreReturnValue
Builder mergeFrom(InputStream input) throws IOException;
/**
@@ -298,6 +309,7 @@
*
* @return this
*/
+ @CanIgnoreReturnValue
Builder mergeFrom(InputStream input, ExtensionRegistryLite extensionRegistry)
throws IOException;
@@ -317,6 +329,7 @@
*
* <p>This is equivalent to the {@code Message::MergeFrom} method in C++.
*/
+ @CanIgnoreReturnValue
Builder mergeFrom(MessageLite other);
/**
@@ -326,9 +339,9 @@
*
* @return true if successful, or false if the stream is at EOF when the method starts. Any
* other error (including reaching EOF during parsing) causes an exception to be thrown.
- * @throws InvalidProtocolBufferException the bytes read are not syntactically correct
- * according to the protobuf wire format specification. The data is corrupt, incomplete,
- * or was never a protobuf in the first place.
+ * @throws InvalidProtocolBufferException the bytes read are not syntactically correct according
+ * to the protobuf wire format specification. The data is corrupt, incomplete, or was never
+ * a protobuf in the first place.
* @throws IOException an I/O error reading from the stream
*/
boolean mergeDelimitedFrom(InputStream input) throws IOException;
@@ -338,9 +351,9 @@
*
* @return true if successful, or false if the stream is at EOF when the method starts. Any
* other error (including reaching EOF during parsing) causes an exception to be thrown.
- * @throws InvalidProtocolBufferException the bytes read are not syntactically correct
- * according to the protobuf wire format specification. The data is corrupt, incomplete,
- * or was never a protobuf in the first place.
+ * @throws InvalidProtocolBufferException the bytes read are not syntactically correct according
+ * to the protobuf wire format specification. The data is corrupt, incomplete, or was never
+ * a protobuf in the first place.
* @throws IOException an I/O error reading from the stream
*/
boolean mergeDelimitedFrom(InputStream input, ExtensionRegistryLite extensionRegistry)
diff --git a/java/core/src/main/java/com/google/protobuf/MessageLiteOrBuilder.java b/java/core/src/main/java/com/google/protobuf/MessageLiteOrBuilder.java
index 7a5ef3e..927b95f 100644
--- a/java/core/src/main/java/com/google/protobuf/MessageLiteOrBuilder.java
+++ b/java/core/src/main/java/com/google/protobuf/MessageLiteOrBuilder.java
@@ -36,6 +36,7 @@
*
* @author jonp@google.com (Jon Perlow)
*/
+@CheckReturnValue
public interface MessageLiteOrBuilder {
/**
* Get an instance of the type with no fields set. Because no fields are set, all getters for
diff --git a/java/core/src/main/java/com/google/protobuf/MessageOrBuilder.java b/java/core/src/main/java/com/google/protobuf/MessageOrBuilder.java
index 0254df9..2a4d867 100644
--- a/java/core/src/main/java/com/google/protobuf/MessageOrBuilder.java
+++ b/java/core/src/main/java/com/google/protobuf/MessageOrBuilder.java
@@ -39,6 +39,7 @@
*
* @author jonp@google.com (Jon Perlow)
*/
+@CheckReturnValue
public interface MessageOrBuilder extends MessageLiteOrBuilder {
// (From MessageLite, re-declared here only for return type covariance.)
diff --git a/java/core/src/main/java/com/google/protobuf/RepeatedFieldBuilder.java b/java/core/src/main/java/com/google/protobuf/RepeatedFieldBuilder.java
index d56af6b..757bc66 100644
--- a/java/core/src/main/java/com/google/protobuf/RepeatedFieldBuilder.java
+++ b/java/core/src/main/java/com/google/protobuf/RepeatedFieldBuilder.java
@@ -277,6 +277,7 @@
* @param message the message to set
* @return the builder
*/
+ @CanIgnoreReturnValue
public RepeatedFieldBuilder<MType, BType, IType> setMessage(int index, MType message) {
checkNotNull(message);
ensureMutableMessageList();
@@ -298,6 +299,7 @@
* @param message the message to add
* @return the builder
*/
+ @CanIgnoreReturnValue
public RepeatedFieldBuilder<MType, BType, IType> addMessage(MType message) {
checkNotNull(message);
ensureMutableMessageList();
@@ -319,6 +321,7 @@
* @param message the message to add
* @return the builder
*/
+ @CanIgnoreReturnValue
public RepeatedFieldBuilder<MType, BType, IType> addMessage(int index, MType message) {
checkNotNull(message);
ensureMutableMessageList();
@@ -338,6 +341,7 @@
* @param values the messages to add
* @return the builder
*/
+ @CanIgnoreReturnValue
public RepeatedFieldBuilder<MType, BType, IType> addAllMessages(
Iterable<? extends MType> values) {
for (final MType value : values) {
diff --git a/java/core/src/main/java/com/google/protobuf/RepeatedFieldBuilderV3.java b/java/core/src/main/java/com/google/protobuf/RepeatedFieldBuilderV3.java
index f6acc77..25b2123 100644
--- a/java/core/src/main/java/com/google/protobuf/RepeatedFieldBuilderV3.java
+++ b/java/core/src/main/java/com/google/protobuf/RepeatedFieldBuilderV3.java
@@ -277,6 +277,7 @@
* @param message the message to set
* @return the builder
*/
+ @CanIgnoreReturnValue
public RepeatedFieldBuilderV3<MType, BType, IType> setMessage(int index, MType message) {
checkNotNull(message);
ensureMutableMessageList();
@@ -298,6 +299,7 @@
* @param message the message to add
* @return the builder
*/
+ @CanIgnoreReturnValue
public RepeatedFieldBuilderV3<MType, BType, IType> addMessage(MType message) {
checkNotNull(message);
ensureMutableMessageList();
@@ -319,6 +321,7 @@
* @param message the message to add
* @return the builder
*/
+ @CanIgnoreReturnValue
public RepeatedFieldBuilderV3<MType, BType, IType> addMessage(int index, MType message) {
checkNotNull(message);
ensureMutableMessageList();
@@ -338,6 +341,7 @@
* @param values the messages to add
* @return the builder
*/
+ @CanIgnoreReturnValue
public RepeatedFieldBuilderV3<MType, BType, IType> addAllMessages(
Iterable<? extends MType> values) {
for (final MType value : values) {
diff --git a/java/core/src/main/java/com/google/protobuf/SingleFieldBuilder.java b/java/core/src/main/java/com/google/protobuf/SingleFieldBuilder.java
index acdc1de..ca25756 100644
--- a/java/core/src/main/java/com/google/protobuf/SingleFieldBuilder.java
+++ b/java/core/src/main/java/com/google/protobuf/SingleFieldBuilder.java
@@ -156,6 +156,7 @@
* @param message the message to set
* @return the builder
*/
+ @CanIgnoreReturnValue
public SingleFieldBuilder<MType, BType, IType> setMessage(MType message) {
this.message = checkNotNull(message);
if (builder != null) {
@@ -172,6 +173,7 @@
* @param value the value to merge from
* @return the builder
*/
+ @CanIgnoreReturnValue
public SingleFieldBuilder<MType, BType, IType> mergeFrom(MType value) {
if (builder == null && message == message.getDefaultInstanceForType()) {
message = value;
@@ -188,6 +190,7 @@
* @return the builder
*/
@SuppressWarnings("unchecked")
+ @CanIgnoreReturnValue
public SingleFieldBuilder<MType, BType, IType> clear() {
message =
(MType)
diff --git a/java/core/src/main/java/com/google/protobuf/SingleFieldBuilderV3.java b/java/core/src/main/java/com/google/protobuf/SingleFieldBuilderV3.java
index 78a4a21..c235495 100644
--- a/java/core/src/main/java/com/google/protobuf/SingleFieldBuilderV3.java
+++ b/java/core/src/main/java/com/google/protobuf/SingleFieldBuilderV3.java
@@ -156,6 +156,7 @@
* @param message the message to set
* @return the builder
*/
+ @CanIgnoreReturnValue
public SingleFieldBuilderV3<MType, BType, IType> setMessage(MType message) {
this.message = checkNotNull(message);
if (builder != null) {
@@ -172,6 +173,7 @@
* @param value the value to merge from
* @return the builder
*/
+ @CanIgnoreReturnValue
public SingleFieldBuilderV3<MType, BType, IType> mergeFrom(MType value) {
if (builder == null && message == message.getDefaultInstanceForType()) {
message = value;
@@ -188,6 +190,7 @@
* @return the builder
*/
@SuppressWarnings("unchecked")
+ @CanIgnoreReturnValue
public SingleFieldBuilderV3<MType, BType, IType> clear() {
message =
(MType)
diff --git a/java/core/src/main/java/com/google/protobuf/TextFormat.java b/java/core/src/main/java/com/google/protobuf/TextFormat.java
index a8af845..9b3c356 100644
--- a/java/core/src/main/java/com/google/protobuf/TextFormat.java
+++ b/java/core/src/main/java/com/google/protobuf/TextFormat.java
@@ -61,7 +61,6 @@
private static final String DEBUG_STRING_SILENT_MARKER = "\t ";
-
/**
* Outputs a textual representation of the Protocol Message supplied into the parameter output.
* (This representation is the new version of the classic "ProtocolPrinter" output from the
@@ -116,8 +115,8 @@
/**
* Generates a human readable form of this message, useful for debugging and other purposes, with
- * no newline characters. This is just a trivial wrapper around
- * {@link TextFormat.Printer#shortDebugString(MessageOrBuilder)}.
+ * no newline characters. This is just a trivial wrapper around {@link
+ * TextFormat.Printer#shortDebugString(MessageOrBuilder)}.
*/
public static String shortDebugString(final MessageOrBuilder message) {
return printer().shortDebugString(message);
@@ -459,9 +458,7 @@
}
}
- /**
- * An adapter class that can take a {@link MapEntry} and returns its key and entry.
- */
+ /** An adapter class that can take a {@link MapEntry} and returns its key and entry. */
private static class MapEntryAdapter implements Comparable<MapEntryAdapter> {
private Object entry;
@@ -741,9 +738,9 @@
// Groups must be serialized with their original capitalization.
generator.print(field.getMessageType().getName());
} else {
- generator.print(field.getName());
- }
+ generator.print(field.getName());
}
+ }
if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
generator.print(" {");
@@ -953,6 +950,7 @@
* the next token is parsed.
*/
private boolean containsSilentMarkerAfterCurrentToken = false;
+
private boolean containsSilentMarkerAfterPrevToken = false;
/** Construct a tokenizer that parses tokens from the given text. */
@@ -1378,7 +1376,6 @@
private ParseException floatParseException(final NumberFormatException e) {
return parseException("Couldn't parse number: " + e.getMessage());
}
-
}
/** Thrown when parsing an invalid text format message. */
@@ -1551,7 +1548,7 @@
* the current token is part of the field value, so the silent marker is indicated by
* containsSilentMarkerAfterPrevToken.
*/
- private void detectSilentMarker(Tokenizer tokenizer) {
+ private void detectSilentMarker(Tokenizer tokenizer, String fieldName) {
}
/**
@@ -1628,8 +1625,8 @@
* unknown field is encountered. If this is set, the parser will only log a warning. Allow
* unknown fields will also allow unknown extensions.
*
- * <p>Use of this parameter is discouraged which may hide some errors (e.g.
- * spelling error on field name).
+ * <p>Use of this parameter is discouraged which may hide some errors (e.g. spelling error on
+ * field name).
*/
public Builder setAllowUnknownFields(boolean allowUnknownFields) {
this.allowUnknownFields = allowUnknownFields;
@@ -1637,10 +1634,9 @@
}
/**
- * Set whether this parser will allow unknown extensions. By default, an
- * exception is thrown if unknown extension is encountered. If this is set true,
- * the parser will only log a warning. Allow unknown extensions does not mean
- * allow normal unknown fields.
+ * Set whether this parser will allow unknown extensions. By default, an exception is thrown
+ * if unknown extension is encountered. If this is set true, the parser will only log a
+ * warning. Allow unknown extensions does not mean allow normal unknown fields.
*/
public Builder setAllowUnknownExtensions(boolean allowUnknownExtensions) {
this.allowUnknownExtensions = allowUnknownExtensions;
@@ -1725,7 +1721,8 @@
static final class UnknownField {
static enum Type {
- FIELD, EXTENSION;
+ FIELD,
+ EXTENSION;
}
final String message;
@@ -1786,7 +1783,6 @@
throws ParseException {
final Tokenizer tokenizer = new Tokenizer(input);
MessageReflection.BuilderAdapter target = new MessageReflection.BuilderAdapter(builder);
-
List<UnknownField> unknownFields = new ArrayList<UnknownField>();
while (!tokenizer.atEnd()) {
@@ -1803,12 +1799,7 @@
final MessageReflection.MergeTarget target,
List<UnknownField> unknownFields)
throws ParseException {
- mergeField(
- tokenizer,
- extensionRegistry,
- target,
- parseInfoTreeBuilder,
- unknownFields);
+ mergeField(tokenizer, extensionRegistry, target, parseInfoTreeBuilder, unknownFields);
}
/** Parse a single field from {@code tokenizer} and merge it into {@code target}. */
@@ -1820,38 +1811,40 @@
List<UnknownField> unknownFields)
throws ParseException {
FieldDescriptor field = null;
+ String name;
int startLine = tokenizer.getLine();
int startColumn = tokenizer.getColumn();
final Descriptor type = target.getDescriptorForType();
ExtensionRegistry.ExtensionInfo extension = null;
if ("google.protobuf.Any".equals(type.getFullName()) && tokenizer.tryConsume("[")) {
- mergeAnyFieldValue(tokenizer, extensionRegistry, target, parseTreeBuilder, unknownFields,
- type);
+ mergeAnyFieldValue(
+ tokenizer, extensionRegistry, target, parseTreeBuilder, unknownFields, type);
return;
}
if (tokenizer.tryConsume("[")) {
// An extension.
- final StringBuilder name = new StringBuilder(tokenizer.consumeIdentifier());
+ StringBuilder nameBuilder = new StringBuilder(tokenizer.consumeIdentifier());
while (tokenizer.tryConsume(".")) {
- name.append('.');
- name.append(tokenizer.consumeIdentifier());
+ nameBuilder.append('.');
+ nameBuilder.append(tokenizer.consumeIdentifier());
}
+ name = nameBuilder.toString();
- extension = target.findExtensionByName(extensionRegistry, name.toString());
+ extension = target.findExtensionByName(extensionRegistry, name);
if (extension == null) {
- String message =
- (tokenizer.getPreviousLine() + 1)
- + ":"
- + (tokenizer.getPreviousColumn() + 1)
- + ":\t"
- + type.getFullName()
- + ".["
- + name
- + "]";
- unknownFields.add(new UnknownField(message, UnknownField.Type.EXTENSION));
+ String message =
+ (tokenizer.getPreviousLine() + 1)
+ + ":"
+ + (tokenizer.getPreviousColumn() + 1)
+ + ":\t"
+ + type.getFullName()
+ + ".["
+ + name
+ + "]";
+ unknownFields.add(new UnknownField(message, UnknownField.Type.EXTENSION));
} else {
if (extension.descriptor.getContainingType() != type) {
throw tokenizer.parseExceptionPreviousToken(
@@ -1866,7 +1859,7 @@
tokenizer.consume("]");
} else {
- final String name = tokenizer.consumeIdentifier();
+ name = tokenizer.consumeIdentifier();
field = type.findFieldByName(name);
// Group names are expected to be capitalized as they appear in the
@@ -1890,13 +1883,14 @@
}
if (field == null) {
- String message = (tokenizer.getPreviousLine() + 1)
- + ":"
- + (tokenizer.getPreviousColumn() + 1)
- + ":\t"
- + type.getFullName()
- + "."
- + name;
+ String message =
+ (tokenizer.getPreviousLine() + 1)
+ + ":"
+ + (tokenizer.getPreviousColumn() + 1)
+ + ":\t"
+ + type.getFullName()
+ + "."
+ + name;
unknownFields.add(new UnknownField(message, UnknownField.Type.FIELD));
}
}
@@ -1909,7 +1903,7 @@
// start with "{" or "<" which indicates the beginning of a message body.
// If there is no ":" or there is a "{" or "<" after ":", this field has
// to be a message or the input is ill-formed.
- detectSilentMarker(tokenizer);
+ detectSilentMarker(tokenizer, name);
if (tokenizer.tryConsume(":") && !tokenizer.lookingAt("{") && !tokenizer.lookingAt("<")) {
skipFieldValue(tokenizer);
} else {
@@ -1920,7 +1914,7 @@
// Handle potential ':'.
if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
- detectSilentMarker(tokenizer);
+ detectSilentMarker(tokenizer, field.getFullName());
tokenizer.tryConsume(":"); // optional
if (parseTreeBuilder != null) {
TextFormatParseInfoTree.Builder childParseTreeBuilder =
@@ -1944,7 +1938,7 @@
unknownFields);
}
} else {
- detectSilentMarker(tokenizer);
+ detectSilentMarker(tokenizer, field.getFullName());
tokenizer.consume(":"); // required
consumeFieldValues(
tokenizer,
@@ -1967,6 +1961,29 @@
}
}
+ private String consumeFullTypeName(Tokenizer tokenizer) throws ParseException {
+ // If there is not a leading `[`, this is just a type name.
+ if (!tokenizer.tryConsume("[")) {
+ return tokenizer.consumeIdentifier();
+ }
+
+ // Otherwise, this is an extension or google.protobuf.Any type URL: we consume proto path
+ // elements until we've addressed the type.
+ String name = tokenizer.consumeIdentifier();
+ while (tokenizer.tryConsume(".")) {
+ name += "." + tokenizer.consumeIdentifier();
+ }
+ if (tokenizer.tryConsume("/")) {
+ name += "/" + tokenizer.consumeIdentifier();
+ while (tokenizer.tryConsume(".")) {
+ name += "." + tokenizer.consumeIdentifier();
+ }
+ }
+ tokenizer.consume("]");
+
+ return name;
+ }
+
/**
* Parse a one or more field values from {@code tokenizer} and merge it into {@code builder}.
*/
@@ -2058,8 +2075,13 @@
// (java_proto_library for any_java_proto depends on the protobuf_impl).
Message anyBuilder = DynamicMessage.getDefaultInstance(field.getMessageType());
MessageReflection.MergeTarget anyField = target.newMergeTargetForField(field, anyBuilder);
- mergeAnyFieldValue(tokenizer, extensionRegistry, anyField, parseTreeBuilder,
- unknownFields, field.getMessageType());
+ mergeAnyFieldValue(
+ tokenizer,
+ extensionRegistry,
+ anyField,
+ parseTreeBuilder,
+ unknownFields,
+ field.getMessageType());
value = anyField.finish();
tokenizer.consume(endToken);
} else {
@@ -2206,7 +2228,7 @@
throw tokenizer.parseExceptionPreviousToken("Expected a valid type URL.");
}
}
- detectSilentMarker(tokenizer);
+ detectSilentMarker(tokenizer, typeUrlBuilder.toString());
tokenizer.tryConsume(":");
final String anyEndToken;
if (tokenizer.tryConsume("<")) {
@@ -2244,15 +2266,7 @@
/** Skips the next field including the field's name and value. */
private void skipField(Tokenizer tokenizer) throws ParseException {
- if (tokenizer.tryConsume("[")) {
- // Extension name.
- do {
- tokenizer.consumeIdentifier();
- } while (tokenizer.tryConsume("."));
- tokenizer.consume("]");
- } else {
- tokenizer.consumeIdentifier();
- }
+ String name = consumeFullTypeName(tokenizer);
// Try to guess the type of this field.
// If this field is not a message, there should be a ":" between the
@@ -2260,7 +2274,7 @@
// start with "{" or "<" which indicates the beginning of a message body.
// If there is no ":" or there is a "{" or "<" after ":", this field has
// to be a message or the input is ill-formed.
- detectSilentMarker(tokenizer);
+ detectSilentMarker(tokenizer, name);
if (tokenizer.tryConsume(":") && !tokenizer.lookingAt("<") && !tokenizer.lookingAt("{")) {
skipFieldValue(tokenizer);
} else {
@@ -2469,9 +2483,10 @@
}
Character.UnicodeBlock unicodeBlock = Character.UnicodeBlock.of(codepoint);
if (unicodeBlock != null
- && (unicodeBlock.equals(Character.UnicodeBlock.LOW_SURROGATES)
- || unicodeBlock.equals(Character.UnicodeBlock.HIGH_SURROGATES)
- || unicodeBlock.equals(Character.UnicodeBlock.HIGH_PRIVATE_USE_SURROGATES))) {
+ && (unicodeBlock.equals(Character.UnicodeBlock.LOW_SURROGATES)
+ || unicodeBlock.equals(Character.UnicodeBlock.HIGH_SURROGATES)
+ || unicodeBlock.equals(
+ Character.UnicodeBlock.HIGH_PRIVATE_USE_SURROGATES))) {
throw new InvalidEscapeSequenceException(
"Invalid escape sequence: '\\U"
+ input.substring(i, i + 8).toStringUtf8()
diff --git a/java/core/src/main/java/com/google/protobuf/UnsafeByteOperations.java b/java/core/src/main/java/com/google/protobuf/UnsafeByteOperations.java
index 16521e1..be6f97d 100644
--- a/java/core/src/main/java/com/google/protobuf/UnsafeByteOperations.java
+++ b/java/core/src/main/java/com/google/protobuf/UnsafeByteOperations.java
@@ -43,7 +43,7 @@
* ByteString} can lead to unexpected and undesirable consequences in your application, and will
* likely be difficult to debug. Proceed with caution!
*
- * <p>This can have a number of significant side affects that have spooky-action-at-a-distance-like
+ * <p>This can have a number of significant side effects that have spooky-action-at-a-distance-like
* behavior. In particular, if the bytes value changes out from under a Protocol Buffer:
*
* <ul>
diff --git a/java/core/src/test/java/com/google/protobuf/DescriptorsTest.java b/java/core/src/test/java/com/google/protobuf/DescriptorsTest.java
index a88baca..7988e7c 100644
--- a/java/core/src/test/java/com/google/protobuf/DescriptorsTest.java
+++ b/java/core/src/test/java/com/google/protobuf/DescriptorsTest.java
@@ -61,6 +61,7 @@
import protobuf_unittest.UnittestProto.TestJsonName;
import protobuf_unittest.UnittestProto.TestMultipleExtensionRanges;
import protobuf_unittest.UnittestProto.TestRequired;
+import protobuf_unittest.UnittestProto.TestReservedEnumFields;
import protobuf_unittest.UnittestProto.TestReservedFields;
import protobuf_unittest.UnittestProto.TestService;
import java.util.Collections;
@@ -463,15 +464,15 @@
/** Tests that parsing an unknown enum throws an exception */
@Test
public void testParseUnknownEnum() {
- FieldDescriptorProto.Builder field = FieldDescriptorProto.newBuilder()
- .setLabel(FieldDescriptorProto.Label.LABEL_OPTIONAL)
- .setTypeName("UnknownEnum")
- .setType(FieldDescriptorProto.Type.TYPE_ENUM)
- .setName("bar")
- .setNumber(1);
- DescriptorProto.Builder messageType = DescriptorProto.newBuilder()
- .setName("Foo")
- .addField(field);
+ FieldDescriptorProto.Builder field =
+ FieldDescriptorProto.newBuilder()
+ .setLabel(FieldDescriptorProto.Label.LABEL_OPTIONAL)
+ .setTypeName("UnknownEnum")
+ .setType(FieldDescriptorProto.Type.TYPE_ENUM)
+ .setName("bar")
+ .setNumber(1);
+ DescriptorProto.Builder messageType =
+ DescriptorProto.newBuilder().setName("Foo").addField(field);
FileDescriptorProto fooProto =
FileDescriptorProto.newBuilder()
.setName("foo.proto")
@@ -486,7 +487,6 @@
}
}
-
/**
* Tests the translate/crosslink for an example where a message field's name and type name are the
* same.
@@ -560,8 +560,10 @@
Descriptors.FileDescriptor.buildFrom(barProto, new FileDescriptor[] {fooFile});
// Items in the FileDescriptor array can be in any order.
- Descriptors.FileDescriptor.buildFrom(bazProto, new FileDescriptor[] {fooFile, barFile});
- Descriptors.FileDescriptor.buildFrom(bazProto, new FileDescriptor[] {barFile, fooFile});
+ FileDescriptor unused1 =
+ Descriptors.FileDescriptor.buildFrom(bazProto, new FileDescriptor[] {fooFile, barFile});
+ FileDescriptor unused2 =
+ Descriptors.FileDescriptor.buildFrom(bazProto, new FileDescriptor[] {barFile, fooFile});
}
@Test
@@ -623,7 +625,8 @@
.setName("bar")
.setNumber(1)))
.build();
- Descriptors.FileDescriptor.buildFrom(fooProto, new FileDescriptor[0], true);
+ FileDescriptor unused =
+ Descriptors.FileDescriptor.buildFrom(fooProto, new FileDescriptor[0], true);
}
@Test
@@ -657,7 +660,8 @@
Descriptors.FileDescriptor.buildFrom(forwardProto, new FileDescriptor[] {barFile});
try {
- Descriptors.FileDescriptor.buildFrom(fooProto, new FileDescriptor[] {forwardFile});
+ FileDescriptor unused =
+ Descriptors.FileDescriptor.buildFrom(fooProto, new FileDescriptor[] {forwardFile});
assertWithMessage("DescriptorValidationException expected").fail();
} catch (DescriptorValidationException e) {
assertThat(e).hasMessageThat().contains("Bar");
@@ -695,7 +699,8 @@
FileDescriptor barFile = Descriptors.FileDescriptor.buildFrom(barProto, new FileDescriptor[0]);
FileDescriptor forwardFile =
Descriptors.FileDescriptor.buildFrom(forwardProto, new FileDescriptor[] {barFile});
- Descriptors.FileDescriptor.buildFrom(fooProto, new FileDescriptor[] {forwardFile});
+ FileDescriptor unused =
+ Descriptors.FileDescriptor.buildFrom(fooProto, new FileDescriptor[] {forwardFile});
}
/** Tests the translate/crosslink for an example with a more complex namespace referencing. */
@@ -793,6 +798,20 @@
}
@Test
+ public void testReservedEnumFields() {
+ EnumDescriptor d = TestReservedEnumFields.getDescriptor();
+ assertThat(d.isReservedNumber(2)).isTrue();
+ assertThat(d.isReservedNumber(8)).isFalse();
+ assertThat(d.isReservedNumber(9)).isTrue();
+ assertThat(d.isReservedNumber(10)).isTrue();
+ assertThat(d.isReservedNumber(11)).isTrue();
+ assertThat(d.isReservedNumber(12)).isFalse();
+ assertThat(d.isReservedName("foo")).isFalse();
+ assertThat(d.isReservedName("bar")).isTrue();
+ assertThat(d.isReservedName("baz")).isTrue();
+ }
+
+ @Test
public void testToString() {
assertThat(
UnittestProto.TestAllTypes.getDescriptor()
@@ -826,7 +845,8 @@
.build())
.build())
.build();
- Descriptors.FileDescriptor.buildFrom(fileDescriptorProto, new FileDescriptor[0]);
+ FileDescriptor unused =
+ Descriptors.FileDescriptor.buildFrom(fileDescriptorProto, new FileDescriptor[0]);
}
@Test
diff --git a/java/core/src/test/java/com/google/protobuf/GeneratedMessageTest.java b/java/core/src/test/java/com/google/protobuf/GeneratedMessageTest.java
index 55864af..01c2f4b 100644
--- a/java/core/src/test/java/com/google/protobuf/GeneratedMessageTest.java
+++ b/java/core/src/test/java/com/google/protobuf/GeneratedMessageTest.java
@@ -1529,7 +1529,7 @@
assertThat(builder.getFooInt()).isEqualTo(123);
TestOneof2 message = builder.buildPartial();
assertThat(message.hasFooInt()).isTrue();
- assertThat(123).isEqualTo(message.getFooInt());
+ assertThat(message.getFooInt()).isEqualTo(123);
assertThat(builder.clearFooInt().hasFooInt()).isFalse();
TestOneof2 message2 = builder.build();
@@ -1943,7 +1943,7 @@
@Test
public void
- extendableBuilder_extensionFieldContainingBuilder_setRepeatedFieldOverwritesElement() {
+ extendableBuilder_extensionFieldContainingBuilder_setRepeatedFieldOverwritesElement() {
TestAllExtensions.Builder builder = TestAllExtensions.newBuilder();
builder.addRepeatedField(REPEATED_NESTED_MESSAGE_EXTENSION, NestedMessage.getDefaultInstance());
// Calling getRepeatedFieldBuilder and ignoring the returned Builder should have no
diff --git a/java/core/src/test/java/com/google/protobuf/LiteEqualsAndHashTest.java b/java/core/src/test/java/com/google/protobuf/LiteEqualsAndHashTest.java
index 1270ef0..9ea7f93 100644
--- a/java/core/src/test/java/com/google/protobuf/LiteEqualsAndHashTest.java
+++ b/java/core/src/test/java/com/google/protobuf/LiteEqualsAndHashTest.java
@@ -30,14 +30,13 @@
package com.google.protobuf;
+import junit.framework.TestCase;
import protobuf_unittest.lite_equals_and_hash.LiteEqualsAndHash.Bar;
import protobuf_unittest.lite_equals_and_hash.LiteEqualsAndHash.BarPrime;
import protobuf_unittest.lite_equals_and_hash.LiteEqualsAndHash.Foo;
import protobuf_unittest.lite_equals_and_hash.LiteEqualsAndHash.TestOneofEquals;
import protobuf_unittest.lite_equals_and_hash.LiteEqualsAndHash.TestRecursiveOneof;
-import junit.framework.TestCase;
-
/**
* Test generate equal and hash methods for the lite runtime.
*
@@ -120,6 +119,6 @@
public void testRecursiveHashcode() {
// This tests that we don't infinite loop.
- TestRecursiveOneof.getDefaultInstance().hashCode();
+ int unused = TestRecursiveOneof.getDefaultInstance().hashCode();
}
}
diff --git a/java/core/src/test/java/com/google/protobuf/SingleFieldBuilderV3Test.java b/java/core/src/test/java/com/google/protobuf/SingleFieldBuilderV3Test.java
index d2215b0..872eaf4 100644
--- a/java/core/src/test/java/com/google/protobuf/SingleFieldBuilderV3Test.java
+++ b/java/core/src/test/java/com/google/protobuf/SingleFieldBuilderV3Test.java
@@ -82,7 +82,7 @@
assertThat(mockParent.getInvalidationCount()).isEqualTo(0);
assertThat(builder.getBuilder().getOptionalInt32()).isEqualTo(1);
assertThat(builder.getMessage().getOptionalInt32()).isEqualTo(1);
- builder.build();
+ TestAllTypes unused = builder.build();
builder.getBuilder().setOptionalInt32(2);
assertThat(builder.getBuilder().getOptionalInt32()).isEqualTo(2);
assertThat(builder.getMessage().getOptionalInt32()).isEqualTo(2);
diff --git a/java/core/src/test/java/com/google/protobuf/SmallSortedMapTest.java b/java/core/src/test/java/com/google/protobuf/SmallSortedMapTest.java
index fdeccc2..bb73a6b 100644
--- a/java/core/src/test/java/com/google/protobuf/SmallSortedMapTest.java
+++ b/java/core/src/test/java/com/google/protobuf/SmallSortedMapTest.java
@@ -34,6 +34,7 @@
import static com.google.common.truth.Truth.assertWithMessage;
import static java.lang.Math.min;
+import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
@@ -48,52 +49,6 @@
@RunWith(JUnit4.class)
public class SmallSortedMapTest {
- // java.util.AbstractMap.SimpleEntry is private in JDK 1.5. We re-implement it
- // here for JDK 1.5 users.
- private static class SimpleEntry<K, V> implements Map.Entry<K, V> {
- private final K key;
- private V value;
-
- SimpleEntry(K key, V value) {
- this.key = key;
- this.value = value;
- }
-
- @Override
- public K getKey() {
- return key;
- }
-
- @Override
- public V getValue() {
- return value;
- }
-
- @Override
- public V setValue(V value) {
- V oldValue = this.value;
- this.value = value;
- return oldValue;
- }
-
- private static boolean eq(Object o1, Object o2) {
- return o1 == null ? o2 == null : o1.equals(o2);
- }
-
- @Override
- public boolean equals(Object o) {
- if (!(o instanceof Map.Entry)) {
- return false;
- }
- Map.Entry<?, ?> e = (Map.Entry<?, ?>) o;
- return eq(key, e.getKey()) && eq(value, e.getValue());
- }
-
- @Override
- public int hashCode() {
- return ((key == null) ? 0 : key.hashCode()) ^ ((value == null) ? 0 : value.hashCode());
- }
- }
@Test
public void testPutAndGetArrayEntriesOnly() {
@@ -242,8 +197,8 @@
}
Set<Map.Entry<Integer, Integer>> entrySet = map.entrySet();
for (int i = 0; i < 6; i++) {
- assertThat(entrySet).contains(new SimpleEntry<Integer, Integer>(i, i + 1));
- assertThat(entrySet).doesNotContain(new SimpleEntry<Integer, Integer>(i, i));
+ assertThat(entrySet).contains(new AbstractMap.SimpleEntry<Integer, Integer>(i, i + 1));
+ assertThat(entrySet).doesNotContain(new AbstractMap.SimpleEntry<Integer, Integer>(i, i));
}
}
@@ -252,7 +207,7 @@
SmallSortedMap<Integer, Integer> map = SmallSortedMap.newInstanceForTest(3);
Set<Map.Entry<Integer, Integer>> entrySet = map.entrySet();
for (int i = 0; i < 6; i++) {
- Map.Entry<Integer, Integer> entry = new SimpleEntry<>(i, i + 1);
+ Map.Entry<Integer, Integer> entry = new AbstractMap.SimpleEntry<>(i, i + 1);
assertThat(entrySet.add(entry)).isTrue();
assertThat(entrySet.add(entry)).isFalse();
}
@@ -272,7 +227,7 @@
assertThat(map.put(i, i + 1)).isNull();
}
for (int i = 0; i < 6; i++) {
- Map.Entry<Integer, Integer> entry = new SimpleEntry<>(i, i + 1);
+ Map.Entry<Integer, Integer> entry = new AbstractMap.SimpleEntry<>(i, i + 1);
assertThat(entrySet.remove(entry)).isTrue();
assertThat(entrySet.remove(entry)).isFalse();
}
diff --git a/java/core/src/test/java/com/google/protobuf/TestBadIdentifiers.java b/java/core/src/test/java/com/google/protobuf/TestBadIdentifiers.java
index 38d2471..ad512a9 100644
--- a/java/core/src/test/java/com/google/protobuf/TestBadIdentifiers.java
+++ b/java/core/src/test/java/com/google/protobuf/TestBadIdentifiers.java
@@ -49,7 +49,7 @@
TestBadIdentifiersProto.Override.getDefaultInstance();
}
- @SuppressWarnings("IgnoredPureGetter") // TODO(b/221602772): Fix this
+ @SuppressWarnings({"IgnoredPureGetter", "CheckReturnValue"}) // TODO(b/221602772): Fix this
public void testGetDescriptor() {
TestBadIdentifiersProto.getDescriptor();
TestBadIdentifiersProto.Descriptor.getDefaultInstance().getDescriptor();
diff --git a/java/core/src/test/java/com/google/protobuf/TestUtil.java b/java/core/src/test/java/com/google/protobuf/TestUtil.java
index 46a4d17..71a540a 100644
--- a/java/core/src/test/java/com/google/protobuf/TestUtil.java
+++ b/java/core/src/test/java/com/google/protobuf/TestUtil.java
@@ -235,6 +235,7 @@
import protobuf_unittest.UnittestProto.TestUnpackedTypes;
import java.io.File;
import java.io.IOException;
+import java.io.InputStream;
import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.Collections;
@@ -3842,7 +3843,11 @@
private static ByteString readBytesFromResource(String name) {
try {
- return ByteString.readFrom(TestUtil.class.getResourceAsStream(name));
+ InputStream in = TestUtil.class.getResourceAsStream(name);
+ if (in == null) { //
+ throw new RuntimeException("Tests data file " + name + " is missing.");
+ }
+ return ByteString.readFrom(in);
} catch (IOException e) {
throw new RuntimeException(e);
}
diff --git a/java/core/src/test/java/com/google/protobuf/TextFormatTest.java b/java/core/src/test/java/com/google/protobuf/TextFormatTest.java
index cde1776..1a76848 100644
--- a/java/core/src/test/java/com/google/protobuf/TextFormatTest.java
+++ b/java/core/src/test/java/com/google/protobuf/TextFormatTest.java
@@ -67,9 +67,7 @@
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
-/**
- * Test case for {@link TextFormat}.
- */
+/** Test case for {@link TextFormat}. */
@RunWith(JUnit4.class)
public class TextFormatTest {
@@ -825,6 +823,7 @@
}
}
+ @CanIgnoreReturnValue
private TestAllTypes assertParseSuccessWithOverwriteForbidden(String text)
throws TextFormat.ParseException {
TestAllTypes.Builder builder = TestAllTypes.newBuilder();
@@ -1450,6 +1449,18 @@
+ "unknown_field3: 3\n");
}
+ @Test
+ public void testParseUnknownExtensionWithAnyMessage() throws Exception {
+ assertParseSuccessWithUnknownExtensions(
+ "[unknown_extension]: { "
+ + " any_value { "
+ + " [type.googleapis.com/protobuf_unittest.OneString] { "
+ + " data: 123 "
+ + " } "
+ + " } "
+ + "}");
+ }
+
// See additional coverage in testOneofOverwriteForbidden and testMapOverwriteForbidden.
@Test
public void testParseNonRepeatedFields() throws Exception {
@@ -1762,6 +1773,7 @@
}
}
+ @SuppressWarnings("LenientFormatStringValidation")
private void assertLocation(
TextFormatParseInfoTree tree,
final Descriptor descriptor,
@@ -1775,6 +1787,7 @@
TextFormatParseLocation expected = TextFormatParseLocation.create(line, column);
assertThat(location).isEqualTo(expected);
} else if (line != -1 && column != -1) {
+ // Expected 0 args, but got 3.
assertWithMessage(
"Tree/descriptor/fieldname did not contain index %d, line %d column %d expected",
index, line, column)
diff --git a/java/core/src/test/proto/com/google/protobuf/map_for_proto2_lite_test.proto b/java/core/src/test/proto/com/google/protobuf/map_for_proto2_lite_test.proto
index 4ec9688..fd479bb 100644
--- a/java/core/src/test/proto/com/google/protobuf/map_for_proto2_lite_test.proto
+++ b/java/core/src/test/proto/com/google/protobuf/map_for_proto2_lite_test.proto
@@ -31,7 +31,10 @@
syntax = "proto2";
+package map_for_proto2_lite_test;
option java_outer_classname = "MapForProto2TestProto";
+option optimize_for = LITE_RUNTIME;
+option java_package = "map_lite_test";
message TestMap {
message MessageValue {
@@ -125,6 +128,3 @@
// null is not a 'reserved word' per se but as a literal needs similar care
map<string, SampleEnum> null = 10;
}
-package map_for_proto2_lite_test;
-option java_package = "map_lite_test";
-option optimize_for = LITE_RUNTIME;
diff --git a/java/internal/BUILD.bazel b/java/internal/BUILD.bazel
index 662dabd..ff111e7 100644
--- a/java/internal/BUILD.bazel
+++ b/java/internal/BUILD.bazel
@@ -1,13 +1,24 @@
-package(default_visibility = ["//java:__subpackages__"])
-
load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
+package(default_visibility = ["//java:__subpackages__"])
+
pkg_files(
name = "dist_files",
srcs = [
"BUILD.bazel",
+ "JavaVersionTest.java",
"testing.bzl",
],
strip_prefix = strip_prefix.from_root(""),
visibility = ["//java:__pkg__"],
)
+
+java_test(
+ name = "java_version",
+ srcs = ["JavaVersionTest.java"],
+ test_class = "JavaVersionTest",
+ deps = [
+ "@maven//:com_google_truth_truth",
+ "@maven//:junit_junit",
+ ],
+)
diff --git a/java/internal/JavaVersionTest.java b/java/internal/JavaVersionTest.java
new file mode 100644
index 0000000..eb004d5
--- /dev/null
+++ b/java/internal/JavaVersionTest.java
@@ -0,0 +1,22 @@
+// Test that Kokoro is using the expected version of Java.
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public class JavaVersionTest {
+ @Test
+ public void testJavaVersion() throws Exception {
+ String exp = System.getenv("KOKORO_JAVA_VERSION");
+ if(exp == null || exp.isEmpty()) {
+ System.err.println("No kokoro java version found, skipping check");
+ return;
+ }
+ String version = System.getProperty("java.version");
+ assertWithMessage("Expected Python " + exp + " but found Python " + version)
+ .that(version.startsWith(exp))
+ .isTrue();
+ }
+}
diff --git a/java/kotlin-lite/BUILD.bazel b/java/kotlin-lite/BUILD.bazel
index d3d9ddf..39f8b33 100644
--- a/java/kotlin-lite/BUILD.bazel
+++ b/java/kotlin-lite/BUILD.bazel
@@ -140,7 +140,7 @@
internal_gen_kt_protos(
name = "gen_kotlin_unittest_lite",
lite = True,
- deps = ["//:kt_unittest_lite"],
+ deps = ["//src/google/protobuf:lite_test_protos"],
)
kt_jvm_library(
@@ -152,6 +152,7 @@
deps = [
":evil_names_proto2_java_proto_lite",
"//java/core:generic_test_protos_java_proto_lite",
+ "//java/core:lite_test_protos_java_proto_lite",
"//java/kotlin:only_for_use_in_proto_generated_code_its_generator_and_tests",
"//java/kotlin:shared_runtime",
"//java/lite",
@@ -161,7 +162,7 @@
internal_gen_kt_protos(
name = "gen_kotlin_proto3_unittest_lite",
lite = True,
- deps = ["//:kt_proto3_unittest"],
+ deps = ["//src/google/protobuf:kt_proto3_unittest_protos"],
)
kt_jvm_library(
@@ -175,6 +176,7 @@
":evil_names_proto3_java_proto_lite",
":multiple_files_proto3_java_proto_lite",
"//java/core:generic_test_protos_java_proto_lite",
+ "//java/core:lite_test_protos_java_proto_lite",
"//java/kotlin:only_for_use_in_proto_generated_code_its_generator_and_tests",
"//java/kotlin:shared_runtime",
"//java/lite",
diff --git a/java/kotlin-lite/src/test/kotlin/com/google/protobuf/Proto2LiteTest.kt b/java/kotlin-lite/src/test/kotlin/com/google/protobuf/Proto2LiteTest.kt
index c343ccd..50ebbd7 100644
--- a/java/kotlin-lite/src/test/kotlin/com/google/protobuf/Proto2LiteTest.kt
+++ b/java/kotlin-lite/src/test/kotlin/com/google/protobuf/Proto2LiteTest.kt
@@ -46,13 +46,6 @@
import com.google.protobuf.UnittestLite.TestEmptyMessageWithExtensionsLite
import com.google.protobuf.copy
import com.google.protobuf.foreignMessageLite
-import com.google.protobuf.kotlin.generator.EvilNamesProto2OuterClass.EvilNamesProto2
-import com.google.protobuf.kotlin.generator.EvilNamesProto2OuterClass.HardKeywordsAllTypesProto2
-import com.google.protobuf.kotlin.generator.EvilNamesProto2OuterClass.Interface
-import com.google.protobuf.kotlin.generator.HardKeywordsAllTypesProto2Kt
-import com.google.protobuf.kotlin.generator.evilNamesProto2
-import com.google.protobuf.kotlin.generator.hardKeywordsAllTypesProto2
-import com.google.protobuf.kotlin.generator.interface_
import com.google.protobuf.optionalGroupExtensionLite
import com.google.protobuf.repeatedGroupExtensionLite
import com.google.protobuf.testAllExtensionsLite
@@ -62,6 +55,13 @@
import protobuf_unittest.MapLiteUnittest.MapEnumLite
import protobuf_unittest.MapLiteUnittest.TestMapLite
import protobuf_unittest.testMapLite
+import `in`.com.google.protobuf.kotlin.generator.EvilNamesProto2OuterClass.EvilNamesProto2
+import `in`.com.google.protobuf.kotlin.generator.EvilNamesProto2OuterClass.HardKeywordsAllTypesProto2
+import `in`.com.google.protobuf.kotlin.generator.EvilNamesProto2OuterClass.Interface
+import `in`.com.google.protobuf.kotlin.generator.HardKeywordsAllTypesProto2Kt
+import `in`.com.google.protobuf.kotlin.generator.evilNamesProto2
+import `in`.com.google.protobuf.kotlin.generator.hardKeywordsAllTypesProto2
+import `in`.com.google.protobuf.kotlin.generator.interface_
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.JUnit4
@@ -178,6 +178,7 @@
.isEqualTo(TestUtilLite.getAllLiteSetBuilder().build())
}
+ @Suppress("CheckResult")
@Test
fun testGetters() {
testAllTypesLite {
@@ -198,6 +199,7 @@
}
}
+ @Suppress("CheckResult")
@Test
fun testDefaultGetters() {
testAllTypesLite {
@@ -208,6 +210,7 @@
}
}
+ @Suppress("CheckResult")
@Test
fun testRepeatedGettersAndSetters() {
testAllTypesLite {
@@ -298,6 +301,7 @@
}
}
+ @Suppress("CheckResult")
@Test
fun testHazzers() {
testAllTypesLite {
@@ -328,6 +332,7 @@
}
}
+ @Suppress("CheckResult")
@Test
fun testClears() {
testAllTypesLite {
@@ -520,6 +525,7 @@
.isEqualTo(TestUtilLite.getAllLiteExtensionsSet())
}
+ @Suppress("CheckResult")
@Test
fun testExtensionGetters() {
testAllExtensionsLite {
@@ -543,6 +549,7 @@
}
}
+ @Suppress("CheckResult")
@Test
fun testRepeatedExtensionGettersAndSetters() {
testAllExtensionsLite {
@@ -632,6 +639,7 @@
}
}
+ @Suppress("CheckResult")
@Test
fun testExtensionContains() {
testAllExtensionsLite {
@@ -663,6 +671,7 @@
}
}
+ @Suppress("CheckResult")
@Test
fun testExtensionClears() {
testAllExtensionsLite {
@@ -751,6 +760,7 @@
)
}
+ @Suppress("CheckResult")
@Test
fun testMapGettersAndSetters() {
testMapLite {
@@ -806,6 +816,7 @@
}
}
+ @Suppress("CheckResult")
@Test
fun testMapRemove() {
testMapLite {
@@ -831,6 +842,7 @@
}
}
+ @Suppress("CheckResult")
@Test
fun testMapClear() {
testMapLite {
@@ -877,7 +889,6 @@
boolean = 1L
sealed = "foo"
interface_ = 1F
- in_ = 1
object_ = "foo"
cachedSize_ = "foo"
serializedSize_ = true
@@ -903,7 +914,6 @@
.setBoolean(1L)
.setSealed("foo")
.setInterface(1F)
- .setIn(1)
.setObject("foo")
.setCachedSize_("foo")
.setSerializedSize_(true)
@@ -914,15 +924,13 @@
assertThat(interface_ {}).isEqualTo(Interface.newBuilder().build())
}
+ @Suppress("CheckResult")
@Test
fun testHardKeywordGettersAndSetters() {
hardKeywordsAllTypesProto2 {
as_ = 1
assertThat(as_).isEqualTo(1)
- in_ = "foo"
- assertThat(in_).isEqualTo("foo")
-
break_ = HardKeywordsAllTypesProto2.NestedEnum.FOO
assertThat(break_).isEqualTo(HardKeywordsAllTypesProto2.NestedEnum.FOO)
@@ -946,15 +954,13 @@
}
}
+ @Suppress("CheckResult")
@Test
fun testHardKeywordHazzers() {
hardKeywordsAllTypesProto2 {
as_ = 1
assertThat(hasAs_()).isTrue()
- in_ = "foo"
- assertThat(hasIn_()).isTrue()
-
break_ = HardKeywordsAllTypesProto2.NestedEnum.FOO
assertThat(hasBreak_()).isTrue()
@@ -963,6 +969,7 @@
}
}
+ @Suppress("CheckResult")
@Test
fun testHardKeywordClears() {
hardKeywordsAllTypesProto2 {
@@ -970,10 +977,6 @@
clearAs_()
assertThat(hasAs_()).isFalse()
- in_ = "foo"
- clearIn_()
- assertThat(hasIn_()).isFalse()
-
break_ = HardKeywordsAllTypesProto2.NestedEnum.FOO
clearBreak_()
assertThat(hasBreak_()).isFalse()
diff --git a/java/kotlin/BUILD.bazel b/java/kotlin/BUILD.bazel
index 67fc6e0..c809117 100644
--- a/java/kotlin/BUILD.bazel
+++ b/java/kotlin/BUILD.bazel
@@ -25,6 +25,7 @@
deps = [
":only_for_use_in_proto_generated_code_its_generator_and_tests",
"//java/lite",
+ "@maven//:com_google_errorprone_error_prone_annotations",
],
)
@@ -59,7 +60,7 @@
maven_coordinates = "com.google.protobuf:protobuf-kotlin:%s" % PROTOBUF_JAVA_VERSION,
pom_template = "//java/kotlin:pom_template.xml",
resources = [
- "//:built_in_runtime_protos",
+ "//src/google/protobuf:descriptor_proto_srcs",
"//:well_known_type_protos",
],
tags = ["manual"],
@@ -224,7 +225,7 @@
internal_gen_kt_protos(
name = "gen_kotlin_unittest",
visibility = ["//java:__subpackages__"],
- deps = ["//:kt_unittest"],
+ deps = ["//src/google/protobuf:kt_unittest_protos"],
)
kt_jvm_library(
@@ -240,12 +241,13 @@
":well_known_protos_kotlin",
"//java/core",
"//java/core:generic_test_protos_java_proto",
+ "//java/core:lite_test_protos_java_proto",
],
)
internal_gen_kt_protos(
name = "gen_kotlin_proto3_unittest",
- deps = ["//:kt_proto3_unittest"],
+ deps = ["//src/google/protobuf:kt_proto3_unittest_protos"],
)
kt_jvm_library(
@@ -262,6 +264,7 @@
":shared_runtime",
"//java/core",
"//java/core:generic_test_protos_java_proto",
+ "//java/core:lite_test_protos_java_proto",
],
)
diff --git a/java/kotlin/pom.xml b/java/kotlin/pom.xml
index 3be4b09..0177a72 100644
--- a/java/kotlin/pom.xml
+++ b/java/kotlin/pom.xml
@@ -35,6 +35,11 @@
<scope>test</scope>
</dependency>
<dependency>
+ <groupId>com.google.errorprone</groupId>
+ <artifactId>error_prone_annotations</artifactId>
+ <version>2.5.1</version>
+ </dependency>
+ <dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<scope>test</scope>
diff --git a/java/kotlin/src/test/kotlin/com/google/protobuf/Proto2Test.kt b/java/kotlin/src/test/kotlin/com/google/protobuf/Proto2Test.kt
index af797cc..426b367 100644
--- a/java/kotlin/src/test/kotlin/com/google/protobuf/Proto2Test.kt
+++ b/java/kotlin/src/test/kotlin/com/google/protobuf/Proto2Test.kt
@@ -33,13 +33,6 @@
import com.google.common.truth.Truth.assertThat
import com.google.protobuf.TestUtil
import com.google.protobuf.TestUtil.toBytes
-import com.google.protobuf.kotlin.generator.EvilNamesProto2OuterClass.EvilNamesProto2
-import com.google.protobuf.kotlin.generator.EvilNamesProto2OuterClass.HardKeywordsAllTypesProto2
-import com.google.protobuf.kotlin.generator.EvilNamesProto2OuterClass.Interface
-import com.google.protobuf.kotlin.generator.HardKeywordsAllTypesProto2Kt
-import com.google.protobuf.kotlin.generator.evilNamesProto2
-import com.google.protobuf.kotlin.generator.hardKeywordsAllTypesProto2
-import com.google.protobuf.kotlin.generator.interface_
import com.google.protobuf.test.UnittestImport.ImportEnum
import com.google.protobuf.test.UnittestImport.ImportMessage
import com.google.protobuf.test.UnittestImportPublic.PublicImportMessage
@@ -67,6 +60,13 @@
import protobuf_unittest.testEnumMap
import protobuf_unittest.testIntIntMap
import protobuf_unittest.testMaps
+import `in`.com.google.protobuf.kotlin.generator.EvilNamesProto2OuterClass.EvilNamesProto2
+import `in`.com.google.protobuf.kotlin.generator.EvilNamesProto2OuterClass.HardKeywordsAllTypesProto2
+import `in`.com.google.protobuf.kotlin.generator.EvilNamesProto2OuterClass.Interface
+import `in`.com.google.protobuf.kotlin.generator.HardKeywordsAllTypesProto2Kt
+import `in`.com.google.protobuf.kotlin.generator.evilNamesProto2
+import `in`.com.google.protobuf.kotlin.generator.hardKeywordsAllTypesProto2
+import `in`.com.google.protobuf.kotlin.generator.interface_
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.JUnit4
@@ -183,6 +183,7 @@
.isEqualTo(TestUtil.getAllSetBuilder().build())
}
+ @Suppress("CheckResult")
@Test
fun testGetters() {
testAllTypes {
@@ -203,6 +204,7 @@
}
}
+ @Suppress("CheckResult")
@Test
fun testDefaultGetters() {
testAllTypes {
@@ -213,6 +215,7 @@
}
}
+ @Suppress("CheckResult")
@Test
fun testRepeatedGettersAndSetters() {
testAllTypes {
@@ -294,6 +297,7 @@
}
}
+ @Suppress("CheckResult")
@Test
fun testHazzers() {
testAllTypes {
@@ -324,6 +328,7 @@
}
}
+ @Suppress("CheckResult")
@Test
fun testClears() {
testAllTypes {
@@ -512,6 +517,7 @@
.isEqualTo(TestUtil.getAllExtensionsSet())
}
+ @Suppress("CheckResult")
@Test
fun testExtensionGetters() {
testAllExtensions {
@@ -534,6 +540,7 @@
}
}
+ @Suppress("CheckResult")
@Test
fun testRepeatedExtensionGettersAndSetters() {
testAllExtensions {
@@ -614,6 +621,7 @@
}
}
+ @Suppress("CheckResult")
@Test
fun testExtensionContains() {
testAllExtensions {
@@ -644,6 +652,7 @@
}
}
+ @Suppress("CheckResult")
@Test
fun testExtensionClears() {
testAllExtensions {
@@ -725,6 +734,7 @@
)
}
+ @Suppress("CheckResult")
@Test
fun testMapGettersAndSetters() {
val intMap = testIntIntMap {
@@ -776,6 +786,7 @@
}
}
+ @Suppress("CheckResult")
@Test
fun testMapRemove() {
val intMap = testIntIntMap {
@@ -803,6 +814,7 @@
}
}
+ @Suppress("CheckResult")
@Test
fun testMapClear() {
val intMap = testIntIntMap {
@@ -851,7 +863,6 @@
boolean = 1L
sealed = "foo"
interface_ = 1F
- in_ = 1
object_ = "foo"
cachedSize_ = "foo"
serializedSize_ = true
@@ -877,7 +888,6 @@
.setBoolean(1L)
.setSealed("foo")
.setInterface(1F)
- .setIn(1)
.setObject("foo")
.setCachedSize_("foo")
.setSerializedSize_(true)
@@ -888,15 +898,13 @@
assertThat(interface_ {}).isEqualTo(Interface.newBuilder().build())
}
+ @Suppress("CheckResult")
@Test
fun testHardKeywordGettersAndSetters() {
hardKeywordsAllTypesProto2 {
as_ = 1
assertThat(as_).isEqualTo(1)
- in_ = "foo"
- assertThat(in_).isEqualTo("foo")
-
break_ = HardKeywordsAllTypesProto2.NestedEnum.FOO
assertThat(break_).isEqualTo(HardKeywordsAllTypesProto2.NestedEnum.FOO)
@@ -920,15 +928,13 @@
}
}
+ @Suppress("CheckResult")
@Test
fun testHardKeywordHazzers() {
hardKeywordsAllTypesProto2 {
as_ = 1
assertThat(hasAs_()).isTrue()
- in_ = "foo"
- assertThat(hasIn_()).isTrue()
-
break_ = HardKeywordsAllTypesProto2.NestedEnum.FOO
assertThat(hasBreak_()).isTrue()
@@ -937,6 +943,7 @@
}
}
+ @Suppress("CheckResult")
@Test
fun testHardKeywordClears() {
hardKeywordsAllTypesProto2 {
@@ -944,10 +951,6 @@
clearAs_()
assertThat(hasAs_()).isFalse()
- in_ = "foo"
- clearIn_()
- assertThat(hasIn_()).isFalse()
-
break_ = HardKeywordsAllTypesProto2.NestedEnum.FOO
clearBreak_()
assertThat(hasBreak_()).isFalse()
diff --git a/java/kotlin/src/test/kotlin/com/google/protobuf/Proto3Test.kt b/java/kotlin/src/test/kotlin/com/google/protobuf/Proto3Test.kt
index d6d0ab5..8ce0094 100644
--- a/java/kotlin/src/test/kotlin/com/google/protobuf/Proto3Test.kt
+++ b/java/kotlin/src/test/kotlin/com/google/protobuf/Proto3Test.kt
@@ -31,13 +31,13 @@
package com.google.protobuf.kotlin
import com.google.common.truth.Truth.assertThat
-import com.google.protobuf.kotlin.generator.EvilNamesProto3OuterClass.Class
-import com.google.protobuf.kotlin.generator.EvilNamesProto3OuterClass.EvilNamesProto3
-import com.google.protobuf.kotlin.generator.EvilNamesProto3OuterClass.HardKeywordsAllTypesProto3
-import com.google.protobuf.kotlin.generator.HardKeywordsAllTypesProto3Kt
-import com.google.protobuf.kotlin.generator.class_
-import com.google.protobuf.kotlin.generator.evilNamesProto3
-import com.google.protobuf.kotlin.generator.hardKeywordsAllTypesProto3
+import com.google.protobuf.kotlin.generator.`in`.EvilNamesProto3OuterClass.Class
+import com.google.protobuf.kotlin.generator.`in`.EvilNamesProto3OuterClass.EvilNamesProto3
+import com.google.protobuf.kotlin.generator.`in`.EvilNamesProto3OuterClass.HardKeywordsAllTypesProto3
+import com.google.protobuf.kotlin.generator.`in`.HardKeywordsAllTypesProto3Kt
+import com.google.protobuf.kotlin.generator.`in`.class_
+import com.google.protobuf.kotlin.generator.`in`.evilNamesProto3
+import com.google.protobuf.kotlin.generator.`in`.hardKeywordsAllTypesProto3
import proto3_unittest.TestAllTypesKt
import proto3_unittest.TestAllTypesKt.nestedMessage
import proto3_unittest.UnittestProto3.TestAllTypes
@@ -54,6 +54,7 @@
@RunWith(JUnit4::class)
class Proto3Test {
+ @Suppress("CheckResult")
@Test
fun testGettersAndSetters() {
testAllTypes {
@@ -65,11 +66,17 @@
assertThat(optionalNestedMessage).isEqualTo(TestAllTypesKt.nestedMessage { bb = 118 })
optionalNestedEnum = NestedEnum.BAZ
assertThat(optionalNestedEnum).isEqualTo(NestedEnum.BAZ)
+ assertThat(optionalNestedEnumValue).isEqualTo(3)
+ optionalNestedEnumValue = 1
+ assertThat(optionalNestedEnumValue).isEqualTo(1)
+ assertThat(optionalNestedEnum).isEqualTo(NestedEnum.FOO)
+
oneofUint32 = 601
assertThat(oneofUint32).isEqualTo(601)
}
}
+ @Suppress("CheckResult")
@Test
fun testRepeatedGettersAndSetters() {
testAllTypes {
@@ -259,6 +266,7 @@
assertThat(class_ {}).isEqualTo(Class.newBuilder().build())
}
+ @Suppress("CheckResult")
@Test
fun testHardKeywordGettersAndSetters() {
hardKeywordsAllTypesProto3 {
@@ -291,6 +299,7 @@
}
}
+ @Suppress("CheckResult")
@Test
fun testHardKeywordHazzers() {
hardKeywordsAllTypesProto3 {
@@ -308,6 +317,7 @@
}
}
+ @Suppress("CheckResult")
@Test
fun testHardKeywordClears() {
hardKeywordsAllTypesProto3 {
diff --git a/java/kotlin/src/test/proto/com/google/protobuf/evil_names_proto2.proto b/java/kotlin/src/test/proto/com/google/protobuf/evil_names_proto2.proto
index 3735baf..e5cdc7d 100644
--- a/java/kotlin/src/test/proto/com/google/protobuf/evil_names_proto2.proto
+++ b/java/kotlin/src/test/proto/com/google/protobuf/evil_names_proto2.proto
@@ -33,7 +33,7 @@
package protobuf.kotlin.generator;
-option java_package = "com.google.protobuf.kotlin.generator";
+option java_package = "in.com.google.protobuf.kotlin.generator";
message EvilNamesProto2 {
optional bool initialized = 1;
@@ -61,7 +61,6 @@
optional int64 boolean = 18;
optional string sealed = 19;
optional float interface = 20;
- optional int32 in = 21;
optional string object = 22;
optional string cached_size = 23;
optional bool serialized_size = 24;
@@ -79,7 +78,6 @@
}
optional int32 as = 1;
- optional string in = 2;
optional NestedEnum break = 3;
map<int32, int32> continue = 4;
optional NestedMessage do = 5;
diff --git a/java/kotlin/src/test/proto/com/google/protobuf/evil_names_proto3.proto b/java/kotlin/src/test/proto/com/google/protobuf/evil_names_proto3.proto
index f6b06d3..9feb219 100644
--- a/java/kotlin/src/test/proto/com/google/protobuf/evil_names_proto3.proto
+++ b/java/kotlin/src/test/proto/com/google/protobuf/evil_names_proto3.proto
@@ -33,7 +33,7 @@
package protobuf.kotlin.generator;
-option java_package = "com.google.protobuf.kotlin.generator";
+option java_package = "com.google.protobuf.kotlin.generator.in";
message EvilNamesProto3 {
bool initialized = 1;
diff --git a/java/lite/BUILD.bazel b/java/lite/BUILD.bazel
index 9ae3c51..f84b5c5 100644
--- a/java/lite/BUILD.bazel
+++ b/java/lite/BUILD.bazel
@@ -72,6 +72,7 @@
":lite",
"//java/core:generic_test_protos_java_proto_lite",
"//java/core:java_test_protos_java_proto_lite",
+ "//java/core:lite_test_protos_java_proto_lite",
"//java/core:test_util_lite",
"@maven//:com_google_truth_truth",
"@maven//:junit_junit",
diff --git a/java/lite/src/test/java/com/google/protobuf/LiteTest.java b/java/lite/src/test/java/com/google/protobuf/LiteTest.java
index 801303b..ee21b37 100644
--- a/java/lite/src/test/java/com/google/protobuf/LiteTest.java
+++ b/java/lite/src/test/java/com/google/protobuf/LiteTest.java
@@ -51,6 +51,7 @@
import com.google.protobuf.UnittestLite.TestAllTypesLiteOrBuilder;
import com.google.protobuf.UnittestLite.TestHugeFieldNumbersLite;
import com.google.protobuf.UnittestLite.TestNestedExtensionLite;
+import com.google.protobuf.testing.Proto3TestingLite.Proto3MessageLite;
import map_lite_test.MapTestProto.TestMap;
import map_lite_test.MapTestProto.TestMap.MessageValue;
import protobuf_unittest.NestedExtensionLite;
@@ -225,6 +226,22 @@
}
@Test
+ public void testProto3EnumListValueCopyOnWrite() {
+ Proto3MessageLite.Builder builder = Proto3MessageLite.newBuilder();
+
+ Proto3MessageLite message = builder.build();
+ builder.addFieldEnumList30Value(Proto3MessageLite.TestEnum.ONE_VALUE);
+ assertThat(message.getFieldEnumList30List()).isEmpty();
+ assertThat(builder.getFieldEnumList30List()).containsExactly(Proto3MessageLite.TestEnum.ONE);
+ assertThat(message.getFieldEnumList30List()).isEmpty();
+ Proto3MessageLite messageAfterBuild = builder.build();
+ builder.clearFieldEnumList30();
+ assertThat(builder.getFieldEnumList30List()).isEmpty();
+ assertThat(messageAfterBuild.getFieldEnumList30List())
+ .containsExactly(Proto3MessageLite.TestEnum.ONE);
+ }
+
+ @Test
public void testSanityCopyOnWrite() throws InvalidProtocolBufferException {
// Since builders are implemented as a thin wrapper around a message
// instance, we attempt to verify that we can't cause the builder to modify
diff --git a/java/pom.xml b/java/pom.xml
index b3c511e..8b304fa 100644
--- a/java/pom.xml
+++ b/java/pom.xml
@@ -33,7 +33,7 @@
<!-- These are relative to the submodules -->
<protobuf.basedir>${project.basedir}/../..</protobuf.basedir>
<protobuf.source.dir>${protobuf.basedir}/src</protobuf.source.dir>
- <protoc>${protobuf.source.dir}/protoc</protoc>
+ <protoc>${protobuf.basedir}/protoc</protoc>
<test.proto.dir>src/test/proto</test.proto.dir>
<generated.sources.dir>${project.build.directory}/generated-sources</generated.sources.dir>
<generated.testsources.dir>${project.build.directory}/generated-test-sources</generated.testsources.dir>
diff --git a/java/protoc/README.md b/java/protoc/README.md
new file mode 100644
index 0000000..a31ffbe
--- /dev/null
+++ b/java/protoc/README.md
@@ -0,0 +1,42 @@
+# Publish pre-compiled protoc artifacts
+``protoc`` is the compiler for ``.proto`` files. It generates language bindings
+for the messages and/or RPC services from ``.proto`` files.
+
+Because ``protoc`` is a native executable, the scripts under this directory
+publish a ``protoc`` executable (a.k.a. artifact) to Maven repositories. The
+artifact can be used by build automation tools so that users would not need to
+compile and install ``protoc`` for their systems.
+
+If you would like us to publish protoc artifact for a new platform, please
+open an issue to request it.
+
+## Maven Location
+The published protoc artifacts are available on Maven here:
+
+ https://repo.maven.apache.org/maven2/com/google/protobuf/protoc/
+
+## Versioning
+The version of the ``protoc`` artifact must be the same as the version of the
+Protobuf project.
+
+## Artifact name
+The name of a published ``protoc`` artifact is in the following format:
+``protoc-<version>-<os>-<arch>.exe``, e.g., ``protoc-3.6.1-linux-x86_64.exe``.
+
+Note that artifacts for linux/macos also have the `.exe` suffix but they are
+not windows binaries.
+
+## System requirement
+Install [Apache Maven](http://maven.apache.org/) if you don't have it.
+
+The scripts only work under Unix-like environments, e.g., Linux, MacOSX, and
+Cygwin or MinGW for Windows. Please see ``README.md`` of the Protobuf project
+for how to set up the build environment.
+
+## Tested build environments
+We have successfully built artifacts on the following environments:
+- Linux x86_32 and x86_64:
+ - Centos 6.9 (within Docker 1.6.1)
+ - Ubuntu 14.04.5 64-bit
+- Linux aarch_64: Cross compiled with `g++-aarch64-linux-gnu` on Ubuntu 14.04.5 64-bit
+- Mac OS X x86_32 and x86_64: Mac OS X 10.9.5
diff --git a/java/protoc/pom.xml b/java/protoc/pom.xml
new file mode 100644
index 0000000..9b61b98
--- /dev/null
+++ b/java/protoc/pom.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>com.google</groupId>
+ <artifactId>google</artifactId>
+ <version>5</version>
+ </parent>
+ <groupId>com.google.protobuf</groupId>
+ <artifactId>protoc</artifactId>
+ <version>3.21.6</version>
+ <packaging>pom</packaging>
+ <name>Protobuf Compiler</name>
+ <description>
+ Protobuf Compiler (protoc) is a compiler for .proto files. It generates
+ language-specific code for Protobuf messages and RPC interfaces.
+ </description>
+ <inceptionYear>2008</inceptionYear>
+ <url>https://developers.google.com/protocol-buffers/</url>
+ <licenses>
+ <license>
+ <name>BSD-3-Clause</name>
+ <url>https://opensource.org/licenses/BSD-3-Clause</url>
+ <distribution>repo</distribution>
+ </license>
+ </licenses>
+ <scm>
+ <url>https://github.com/protocolbuffers/protobuf</url>
+ <connection>
+ scm:git:https://github.com/protocolbuffers/protobuf.git
+ </connection>
+ </scm>
+</project>
diff --git a/java/util/pom_template.xml b/java/util/pom_template.xml
index b20e62a..13fe3ec 100644
--- a/java/util/pom_template.xml
+++ b/java/util/pom_template.xml
@@ -12,7 +12,8 @@
<name>Protocol Buffers [Util]</name>
<description>Utilities for Protocol Buffers</description>
-
- {dependencies}
+ <dependencies>
+ {dependencies}
+ </dependencies>
</project>
diff --git a/java/util/src/main/java/com/google/protobuf/util/FieldMaskUtil.java b/java/util/src/main/java/com/google/protobuf/util/FieldMaskUtil.java
index 9f36494..55e3079 100644
--- a/java/util/src/main/java/com/google/protobuf/util/FieldMaskUtil.java
+++ b/java/util/src/main/java/com/google/protobuf/util/FieldMaskUtil.java
@@ -101,9 +101,8 @@
/**
* Constructs a FieldMask for a list of field paths in a certain type.
*
- * @throws IllegalArgumentException if any of the field path is not valid.
+ * @throws IllegalArgumentException if any of the field path is not valid
*/
- // TODO(xiaofeng): Consider renaming fromStrings()
public static FieldMask fromStringList(Class<? extends Message> type, Iterable<String> paths) {
return fromStringList(Internal.getDefaultInstance(type).getDescriptorForType(), paths);
}
diff --git a/java/util/src/main/java/com/google/protobuf/util/Timestamps.java b/java/util/src/main/java/com/google/protobuf/util/Timestamps.java
index 95f3665..0b09fcc 100644
--- a/java/util/src/main/java/com/google/protobuf/util/Timestamps.java
+++ b/java/util/src/main/java/com/google/protobuf/util/Timestamps.java
@@ -343,7 +343,8 @@
public static Timestamp fromDate(Date date) {
if (date instanceof java.sql.Timestamp) {
java.sql.Timestamp sqlTimestamp = (java.sql.Timestamp) date;
- long integralSeconds = sqlTimestamp.getTime() / 1000L; // truncate the fractional seconds
+ long time = sqlTimestamp.getTime();
+ long integralSeconds = (time < 0 && time % 1000 != 0) ? time / 1000L - 1 : time / 1000L ; // truncate the fractional seconds
return Timestamp.newBuilder()
.setSeconds(integralSeconds)
.setNanos(sqlTimestamp.getNanos())
diff --git a/java/util/src/test/java/com/google/protobuf/util/TimestampsTest.java b/java/util/src/test/java/com/google/protobuf/util/TimestampsTest.java
index ea90a6b..51f7a85 100644
--- a/java/util/src/test/java/com/google/protobuf/util/TimestampsTest.java
+++ b/java/util/src/test/java/com/google/protobuf/util/TimestampsTest.java
@@ -475,6 +475,20 @@
Timestamp timestamp = Timestamps.fromDate(date);
assertThat(Timestamps.toString(timestamp)).isEqualTo("1970-01-01T00:00:01.111Z");
}
+
+ @Test
+ public void testFromSqlTimestamp_beforeEpoch() {
+ Date date = new java.sql.Timestamp(-1111);
+ Timestamp timestamp = Timestamps.fromDate(date);
+ assertThat(Timestamps.toString(timestamp)).isEqualTo("1969-12-31T23:59:58.889Z");
+ }
+
+ @Test
+ public void testFromSqlTimestamp_beforeEpochWholeSecond() {
+ Date date = new java.sql.Timestamp(-2000);
+ Timestamp timestamp = Timestamps.fromDate(date);
+ assertThat(Timestamps.toString(timestamp)).isEqualTo("1969-12-31T23:59:58Z");
+ }
@Test
public void testTimeOperations() throws Exception {
diff --git a/kokoro/common/bazel_wrapper.sh b/kokoro/common/bazel_wrapper.sh
new file mode 100755
index 0000000..bd35396
--- /dev/null
+++ b/kokoro/common/bazel_wrapper.sh
@@ -0,0 +1,71 @@
+#!/bin/bash
+
+# Wrapper for invoking bazel on Kokoro.
+#
+# This script adds extra flags to a bazel invocation when it is run from Kokoro.
+# When the special environment variables are not present (e.g., if you run
+# Kokoro build scripts locally), this script is equivalent to the "bazel"
+# command.
+#
+# Example of running directly:
+# path/to/bazel_wrapper.sh build //...
+#
+# Example of `source`ing:
+# source path/to/bazel_wrapper.sh
+# bazel_wrapper build //...
+
+function bazel_wrapper::gen_invocation_id() {
+ # Create a new invocation ID and store in the artifacts dir.
+ local _invocation_id=$(uuidgen | tr A-Z a-z)
+
+ # Put the new invocation ID at the start of the output IDs file. Some
+ # Google-internal tools only look at the first entry, so this ensures the most
+ # recent entry is first.
+ local _ids_file=${KOKORO_ARTIFACTS_DIR}/bazel_invocation_ids
+ local _temp_ids=$(mktemp)
+ echo ${_invocation_id} > ${_temp_ids}
+ [[ -e ${_ids_file} ]] && cat ${_ids_file} >> ${_temp_ids}
+ mv -f ${_temp_ids} ${_ids_file}
+
+ echo -n ${_invocation_id}
+}
+
+# Prints flags to use on Kokoro.
+function bazel_wrapper::kokoro_flags() {
+ [[ -n ${KOKORO_BES_PROJECT_ID:-} ]] || return
+
+ local -a _flags
+ _flags+=(
+ --bes_backend=${KOKORO_BES_BACKEND_ADDRESS:-buildeventservice.googleapis.com}
+ --bes_results_url=https://source.cloud.google.com/results/invocations/
+ --invocation_id=$(bazel_wrapper::gen_invocation_id)
+ --project_id=${KOKORO_BES_PROJECT_ID} # --bes_instance_name in Bazel 5+
+ --remote_cache=https://storage.googleapis.com/protobuf-bazel-cache
+ )
+ if [[ -n ${KOKORO_BAZEL_AUTH_CREDENTIAL:-} ]]; then
+ _flags+=( --google_credentials=${KOKORO_BAZEL_AUTH_CREDENTIAL} )
+ else
+ _flags+=( --google_default_credentials=true )
+ fi
+
+ echo "${_flags[@]}"
+}
+
+# Runs bazel with Kokoro flags, if appropriate.
+function bazel_wrapper() {
+ local -a _flags
+
+ # We might need to add flags. They need to come after any startup flags and
+ # the command, but before any terminating "--", so copy them into the _flags
+ # variable.
+ until (( ${#@} == 0 )) || [[ $1 == "--" ]]; do
+ _flags+=( "${1}" ); shift
+ done
+
+ # Set the `BAZEL` env variable to override the actual bazel binary to use:
+ ${BAZEL:=bazel} "${_flags[@]}" $(bazel_wrapper::kokoro_flags) "${@}"
+}
+
+# If this script was called directly, run bazel. Otherwise (i.e., this script
+# was `source`d), the sourcing script will call bazel_wrapper themselves.
+(( ${#BASH_SOURCE[@]} == 1 )) && bazel_wrapper "${@}"
diff --git a/kokoro/caplog.sh b/kokoro/common/caplog.sh
similarity index 98%
rename from kokoro/caplog.sh
rename to kokoro/common/caplog.sh
index fe81949..33ee1ab 100644
--- a/kokoro/caplog.sh
+++ b/kokoro/common/caplog.sh
@@ -19,7 +19,7 @@
#
# Use the provided functions below as build/test fixtures, e.g.:
#
-# source kokoro/capture_logs.sh
+# source kokoro/common/capture_logs.sh
# caplog build/step1 <build command>
# caplog tests/step2 <test command>
#
diff --git a/kokoro/common/cmake.sh b/kokoro/common/cmake.sh
new file mode 100755
index 0000000..99be3be
--- /dev/null
+++ b/kokoro/common/cmake.sh
@@ -0,0 +1,84 @@
+#!/bin/bash
+#
+# Build tests under CMake.
+#
+# This script is used from macos and linux builds. It runs cmake and ctest in
+# the current directory. Any additional setup should be done before running this
+# script.
+#
+# This script uses `caplog` to save logfiles. See caplog.sh for details.
+
+set -eu -o pipefail
+: ${SCRIPT_ROOT:=$(cd $(dirname $0)/../..; pwd)}
+
+################################################################################
+# If you are using this script to run tests, you can set some environment
+# variables to control behavior:
+#
+# By default, find the sources based on this script's path.
+: ${SOURCE_DIR:=${SCRIPT_ROOT}}
+#
+# By default, put outputs under <git root>/cmake/build.
+: ${BUILD_DIR:=${SOURCE_DIR}/cmake/build}
+#
+# CMAKE_BUILD_TYPE is supported in cmake 3.22+. If set, we pass the value of this
+# variable explicitly for compatibility with older versions of cmake. See:
+# https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html
+# (N.B.: not to be confused with CMAKE_CONFIG_TYPE.)
+if [[ -n ${CMAKE_BUILD_TYPE:-} ]]; then
+ CMAKE_BUILD_TYPE_FLAG="-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}"
+else
+ CMAKE_BUILD_TYPE_FLAG=
+fi
+#
+# For several other CMake options, see docs here:
+# https://cmake.org/cmake/help/latest/manual/cmake-env-variables.7.html
+#
+# Some variables you may want to override (see cmake docs for details):
+# CMAKE_BUILD_PARALLEL_LEVEL
+# CMAKE_CONFIG_TYPE (N.B.: not to be confused with CMAKE_BUILD_TYPE)
+# CMAKE_GENERATOR
+# CTEST_PARALLEL_LEVEL
+################################################################################
+
+echo "Building using..."
+echo " Sources: ${SOURCE_DIR}"
+echo " Build output: ${BUILD_DIR}"
+if [[ ${SOURCE_DIR} != ${SCRIPT_ROOT} ]]; then
+ echo " Build scripts: ${SCRIPT_ROOT}"
+fi
+set -x
+source ${SCRIPT_ROOT}/kokoro/common/caplog.sh
+
+#
+# Configure under $BUILD_DIR:
+#
+mkdir -p "${BUILD_DIR}"
+
+(
+ cd "${BUILD_DIR}"
+ caplog 01_configure \
+ cmake -S "${SOURCE_DIR}" \
+ ${CMAKE_BUILD_TYPE_FLAG} \
+ ${CAPLOG_CMAKE_ARGS:-}
+)
+if [[ -n ${CAPLOG_DIR:-} ]]; then
+ # Save configuration logs.
+ mkdir -p "${CAPLOG_DIR}/CMakeFiles"
+ cp "${BUILD_DIR}"/CMakeFiles/CMake*.log "${CAPLOG_DIR}/CMakeFiles"
+fi
+
+#
+# Build:
+#
+caplog 02_build \
+ cmake --build "${BUILD_DIR}"
+
+#
+# Run tests
+#
+(
+ cd "${BUILD_DIR}"
+ caplog 03_combined_testlog \
+ ctest ${CAPLOG_CTEST_ARGS:-}
+)
diff --git a/kokoro/docs/publish-python.sh b/kokoro/docs/publish-python.sh
index 684afa6..9f88017 100755
--- a/kokoro/docs/publish-python.sh
+++ b/kokoro/docs/publish-python.sh
@@ -14,9 +14,9 @@
sudo add-apt-repository universe
sudo apt-get update
sudo apt-get -y install unzip
-wget https://github.com/protocolbuffers/protobuf/releases/download/v21.0-rc1/protoc-21.0-rc-1-linux-x86_64.zip
-unzip protoc-21.0-rc-1-linux-x86_64.zip bin/protoc
-mv bin/protoc ../src/protoc
+wget https://github.com/protocolbuffers/protobuf/releases/download/v21.1/protoc-21.1-linux-x86_64.zip
+unzip protoc-21.1-linux-x86_64.zip bin/protoc
+mv bin/protoc ../protoc
python3 -m venv venv
source venv/bin/activate
python setup.py install
@@ -30,7 +30,7 @@
cd ..
deactivate
-python3 -m pip install protobuf==4.21.0rc1 gcp-docuploader
+python3 -m pip install protobuf==4.21.1 gcp-docuploader==0.6.3
# install a json parser
sudo apt-get -y install jq
diff --git a/kokoro/linux/32-bit/Dockerfile b/kokoro/linux/32-bit/Dockerfile
deleted file mode 100644
index 1278889..0000000
--- a/kokoro/linux/32-bit/Dockerfile
+++ /dev/null
@@ -1,143 +0,0 @@
-# This Dockerfile specifies the recipe for creating an image for the tests
-# to run in.
-#
-# We install as many test dependencies here as we can, because these setup
-# steps can be cached. They do *not* run every time we run the build.
-# The Docker image is only rebuilt when the Dockerfile (ie. this file)
-# changes.
-
-# Base Dockerfile for gRPC dev images
-FROM 32bit/debian:latest
-
-# Apt source for php
-RUN echo "deb http://ppa.launchpad.net/ondrej/php/ubuntu trusty main" | tee /etc/apt/sources.list.d/various-php.list && \
- apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F4FCBB07
-
-# Install dependencies. We start with the basic ones require to build protoc
-# and the C++ build
-RUN apt-get clean && apt-get update && apt-get install -y --force-yes \
- autoconf \
- autotools-dev \
- build-essential \
- bzip2 \
- ccache \
- curl \
- gcc \
- git \
- libc6 \
- libc6-dbg \
- libc6-dev \
- libgtest-dev \
- libtool \
- make \
- parallel \
- time \
- wget \
- unzip \
- # -- For python --
- python-setuptools \
- python-pip \
- python-dev \
- # -- For C++ benchmarks --
- cmake \
- # -- For PHP --
- php5.5 \
- php5.5-dev \
- php5.5-xml \
- php5.6 \
- php5.6-dev \
- php5.6-xml \
- php7.0 \
- php7.0-dev \
- php7.0-xml \
- phpunit \
- valgrind \
- libxml2-dev \
- && apt-get clean
-
-##################
-# PHP dependencies.
-RUN wget http://am1.php.net/get/php-5.5.38.tar.bz2/from/this/mirror
-RUN mv mirror php-5.5.38.tar.bz2
-RUN tar -xvf php-5.5.38.tar.bz2
-RUN cd php-5.5.38 && ./configure --enable-maintainer-zts --prefix=/usr/local/php-5.5-zts && \
- make && make install && make clean && cd ..
-RUN cd php-5.5.38 && make clean && ./configure --enable-bcmath --prefix=/usr/local/php-5.5 && \
- make && make install && make clean && cd ..
-
-RUN wget http://am1.php.net/get/php-5.6.30.tar.bz2/from/this/mirror
-RUN mv mirror php-5.6.30.tar.bz2
-RUN tar -xvf php-5.6.30.tar.bz2
-RUN cd php-5.6.30 && ./configure --enable-maintainer-zts --prefix=/usr/local/php-5.6-zts && \
- make && make install && cd ..
-RUN cd php-5.6.30 && make clean && ./configure --enable-bcmath --prefix=/usr/local/php-5.6 && \
- make && make install && cd ..
-
-RUN wget http://am1.php.net/get/php-7.0.18.tar.bz2/from/this/mirror
-RUN mv mirror php-7.0.18.tar.bz2
-RUN tar -xvf php-7.0.18.tar.bz2
-RUN cd php-7.0.18 && ./configure --enable-maintainer-zts --prefix=/usr/local/php-7.0-zts && \
- make && make install && cd ..
-RUN cd php-7.0.18 && make clean && ./configure --enable-bcmath --prefix=/usr/local/php-7.0 && \
- make && make install && cd ..
-
-RUN wget http://am1.php.net/get/php-7.1.4.tar.bz2/from/this/mirror
-RUN mv mirror php-7.1.4.tar.bz2
-RUN tar -xvf php-7.1.4.tar.bz2
-RUN cd php-7.1.4 && ./configure --enable-maintainer-zts --prefix=/usr/local/php-7.1-zts && \
- make && make install && cd ..
-RUN cd php-7.1.4 && make clean && ./configure --enable-bcmath --prefix=/usr/local/php-7.1 && \
- make && make install && cd ..
-
-RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
-RUN php composer-setup.php
-RUN mv composer.phar /usr/bin/composer
-RUN php -r "unlink('composer-setup.php');"
-RUN composer config -g -- disable-tls true
-RUN composer config -g -- secure-http false
-RUN cd /tmp && \
- git clone https://github.com/google/protobuf.git && \
- cd protobuf/php && \
- git reset --hard 49b44bff2b6257a119f9c6a342d6151c736586b8 && \
- ln -sfn /usr/local/php-5.5/bin/php /usr/bin/php && \
- ln -sfn /usr/local/php-5.5/bin/php-config /usr/bin/php-config && \
- ln -sfn /usr/local/php-5.5/bin/phpize /usr/bin/phpize && \
- composer install && \
- mv vendor /usr/local/vendor-5.5 && \
- ln -sfn /usr/local/php-5.6/bin/php /usr/bin/php && \
- ln -sfn /usr/local/php-5.6/bin/php-config /usr/bin/php-config && \
- ln -sfn /usr/local/php-5.6/bin/phpize /usr/bin/phpize && \
- composer install && \
- mv vendor /usr/local/vendor-5.6 && \
- ln -sfn /usr/local/php-7.0/bin/php /usr/bin/php && \
- ln -sfn /usr/local/php-7.0/bin/php-config /usr/bin/php-config && \
- ln -sfn /usr/local/php-7.0/bin/phpize /usr/bin/phpize && \
- composer install && \
- mv vendor /usr/local/vendor-7.0 && \
- ln -sfn /usr/local/php-7.1/bin/php /usr/bin/php && \
- ln -sfn /usr/local/php-7.1/bin/php-config /usr/bin/php-config && \
- ln -sfn /usr/local/php-7.1/bin/phpize /usr/bin/phpize && \
- composer install && \
- mv vendor /usr/local/vendor-7.1
-
-##################
-# Python dependencies
-
-# These packages exist in apt-get, but their versions are too old, so we have
-# to get updates from pip.
-
-RUN pip install pip --upgrade
-RUN pip install virtualenv tox yattag
-
-##################
-# Prepare ccache
-
-RUN ln -s /usr/bin/ccache /usr/local/bin/gcc
-RUN ln -s /usr/bin/ccache /usr/local/bin/g++
-RUN ln -s /usr/bin/ccache /usr/local/bin/cc
-RUN ln -s /usr/bin/ccache /usr/local/bin/c++
-RUN ln -s /usr/bin/ccache /usr/local/bin/clang
-RUN ln -s /usr/bin/ccache /usr/local/bin/clang++
-
-# Define the default command.
-CMD ["bash"]
diff --git a/kokoro/linux/32-bit/build.sh b/kokoro/linux/32-bit/build.sh
index 8c0a41e..85dd81d 100755
--- a/kokoro/linux/32-bit/build.sh
+++ b/kokoro/linux/32-bit/build.sh
@@ -4,15 +4,20 @@
# running the "pull request 32" project:
#
# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image. Then we delegate to the general
-# build_and_run_docker.sh script.
+# a script to run inside that image.
+
+set -ex
# Change to repo root
cd $(dirname $0)/../../..
+GIT_REPO_ROOT=$(pwd)
-export DOCKERHUB_ORGANIZATION=protobuftesting
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/php_32bit
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="php_all_32"
-./kokoro/linux/build_and_run_docker.sh
+CONTAINER_IMAGE=gcr.io/protobuf-build/php/32bit@sha256:824cbdff02ee543eb69ee4b02c8c58cc7887f70f49e41725a35765d92a898b4f
+
+git submodule update --init --recursive
+
+docker run \
+ "$@" \
+ -v $GIT_REPO_ROOT:/workspace \
+ $CONTAINER_IMAGE \
+ bash -l "/workspace/kokoro/linux/32-bit/test_php.sh"
diff --git a/kokoro/linux/benchmark/continuous.cfg b/kokoro/linux/32-bit/common.cfg
similarity index 67%
copy from kokoro/linux/benchmark/continuous.cfg
copy to kokoro/linux/32-bit/common.cfg
index 8cc8f96..28b66c0 100644
--- a/kokoro/linux/benchmark/continuous.cfg
+++ b/kokoro/linux/32-bit/common.cfg
@@ -1,8 +1,8 @@
# Config file for running tests in Kokoro
# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/benchmark/build.sh"
-timeout_mins: 240
+build_file: "protobuf/kokoro/linux/32-bit/build.sh"
+timeout_mins: 120
action {
define_artifacts {
diff --git a/kokoro/linux/32-bit/continuous.cfg b/kokoro/linux/32-bit/continuous.cfg
index 28b66c0..8523c22 100644
--- a/kokoro/linux/32-bit/continuous.cfg
+++ b/kokoro/linux/32-bit/continuous.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/32-bit/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/32-bit/presubmit.cfg b/kokoro/linux/32-bit/presubmit.cfg
index 28b66c0..8523c22 100644
--- a/kokoro/linux/32-bit/presubmit.cfg
+++ b/kokoro/linux/32-bit/presubmit.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/32-bit/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/32-bit/test_php.sh b/kokoro/linux/32-bit/test_php.sh
new file mode 100644
index 0000000..739467b
--- /dev/null
+++ b/kokoro/linux/32-bit/test_php.sh
@@ -0,0 +1,58 @@
+#!/bin/bash
+
+set -eux
+
+# Change to repo root
+cd $(dirname $0)/../../..
+
+use_php() {
+ VERSION=$1
+ export PATH=/usr/local/php-${VERSION}/bin:$PATH
+}
+
+build_php() {
+ use_php $1
+ pushd php
+ rm -rf vendor
+ php -v
+ php -m
+ composer update
+ composer test
+ popd
+}
+
+test_php_c() {
+ pushd php
+ rm -rf vendor
+ php -v
+ php -m
+ composer update
+ composer test_c
+ popd
+}
+
+build_php_c() {
+ use_php $1
+ test_php_c
+}
+
+mkdir build
+pushd build
+cmake ..
+cmake --build . -- -j20
+ctest --verbose --parallel 20
+export PROTOC=$(pwd)/protoc
+popd
+
+build_php 7.0
+build_php 7.1
+build_php 7.4
+build_php_c 7.0
+build_php_c 7.1
+build_php_c 7.4
+build_php_c 7.1-zts
+build_php_c 7.2-zts
+build_php_c 7.5-zts
+
+# Cleanup after CMake build
+rm -rf build
diff --git a/kokoro/linux/aarch64/cpp_crosscompile_and_run_tests_with_qemu_aarch64.sh b/kokoro/linux/aarch64/cpp_crosscompile_and_run_tests_with_qemu_aarch64.sh
index 425cc90..f7c45f9 100755
--- a/kokoro/linux/aarch64/cpp_crosscompile_and_run_tests_with_qemu_aarch64.sh
+++ b/kokoro/linux/aarch64/cpp_crosscompile_and_run_tests_with_qemu_aarch64.sh
@@ -5,12 +5,9 @@
set -ex
-mkdir -p cmake/crossbuild_aarch64
-cd cmake/crossbuild_aarch64
-
# the build commands are expected to run under dockcross docker image
# where the CC, CXX and other toolchain variables already point to the crosscompiler
-cmake ..
+cmake .
make -j8
# check that the resulting test binary is indeed an aarch64 ELF
diff --git a/kokoro/linux/aarch64/dockcross_helpers/run_dockcross_manylinux2014_aarch64.sh b/kokoro/linux/aarch64/dockcross_helpers/run_dockcross_manylinux2014_aarch64.sh
index ba34fa7..efaf40f 100755
--- a/kokoro/linux/aarch64/dockcross_helpers/run_dockcross_manylinux2014_aarch64.sh
+++ b/kokoro/linux/aarch64/dockcross_helpers/run_dockcross_manylinux2014_aarch64.sh
@@ -13,7 +13,11 @@
fi
# Pin the dockcross image since newer versions of the image break the build
-PINNED_DOCKCROSS_IMAGE_VERSION=dockcross/manylinux2014-aarch64:20210803-41e5c69
+# We use an older version of dockcross image that has gcc4.9.4 because it was built
+# before https://github.com/dockcross/dockcross/pull/449
+# Thanks to that, wheel build with this image aren't actually
+# compliant with manylinux2014, but only with manylinux_2_24
+PINNED_DOCKCROSS_IMAGE_VERSION=dockcross/manylinux2014-aarch64:20200929-608e6ac
# running dockcross image without any arguments generates a wrapper
# scripts that can be used to run commands under the dockcross image
diff --git a/kokoro/linux/aarch64/protoc_crosscompile_aarch64.sh b/kokoro/linux/aarch64/protoc_crosscompile_aarch64.sh
index 77942a4..7f07968 100755
--- a/kokoro/linux/aarch64/protoc_crosscompile_aarch64.sh
+++ b/kokoro/linux/aarch64/protoc_crosscompile_aarch64.sh
@@ -4,6 +4,5 @@
set -ex
-./autogen.sh
-CXXFLAGS="-fPIC -g -O2" ./configure --host=aarch64
+cmake -DCMAKE_POSITION_INDEPENDENT_CODE=ON -Dprotobuf_WITH_ZLIB=0 -Dprotobuf_BUILD_TESTS=OFF .
make -j8
diff --git a/kokoro/linux/aarch64/python_crosscompile_aarch64.sh b/kokoro/linux/aarch64/python_crosscompile_aarch64.sh
index db2e776..a04c7e4 100755
--- a/kokoro/linux/aarch64/python_crosscompile_aarch64.sh
+++ b/kokoro/linux/aarch64/python_crosscompile_aarch64.sh
@@ -8,13 +8,16 @@
PYTHON="/opt/python/cp38-cp38/bin/python"
-./autogen.sh
-CXXFLAGS="-fPIC -g -O2" ./configure --host=aarch64
+# Initialize any submodules.
+git submodule update --init --recursive
+
+# Build protoc and libprotobuf
+cmake -DCMAKE_POSITION_INDEPENDENT_CODE=ON -Dprotobuf_WITH_ZLIB=0 -Dprotobuf_BUILD_TESTS=OFF .
make -j8
# create a simple shell wrapper that runs crosscompiled protoc under qemu
echo '#!/bin/bash' >protoc_qemu_wrapper.sh
-echo 'exec qemu-aarch64 "../src/protoc" "$@"' >>protoc_qemu_wrapper.sh
+echo 'exec qemu-aarch64 "../protoc" "$@"' >>protoc_qemu_wrapper.sh
chmod ugo+x protoc_qemu_wrapper.sh
# PROTOC variable is by build_py step that runs under ./python directory
diff --git a/kokoro/linux/aarch64/python_run_tests_with_qemu_aarch64.sh b/kokoro/linux/aarch64/python_run_tests_with_qemu_aarch64.sh
index 5026d04..0a62cff 100755
--- a/kokoro/linux/aarch64/python_run_tests_with_qemu_aarch64.sh
+++ b/kokoro/linux/aarch64/python_run_tests_with_qemu_aarch64.sh
@@ -16,7 +16,7 @@
# we've built the python extension previously with --inplace option
# so we can just discover all the unittests and run them directly under
# the python/ directory.
-LD_LIBRARY_PATH=../src/.libs PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=cpp ${PYTHON} -m pytest google/protobuf
+LD_LIBRARY_PATH=. PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=cpp ${PYTHON} -m pytest google/protobuf
# step 2: run auditwheel show to check that the wheel is manylinux2014 compatible.
# auditwheel needs to run on wheel's target platform (or under an emulator)
diff --git a/kokoro/linux/aarch64/test_ruby_aarch64.sh b/kokoro/linux/aarch64/test_ruby_aarch64.sh
index 91ee5f2..e256e4e 100755
--- a/kokoro/linux/aarch64/test_ruby_aarch64.sh
+++ b/kokoro/linux/aarch64/test_ruby_aarch64.sh
@@ -24,4 +24,4 @@
# otherwise the UID would be homeless under the docker container and pip install wouldn't work. For simplicity,
# we just run map the user's home to a throwaway temporary directory
-docker run $DOCKER_TTY_ARGS --rm --user "$(id -u):$(id -g)" -e "HOME=/home/fake-user" -v "$(mktemp -d):/home/fake-user" -v "$(pwd)":/work -w /work arm64v8/ruby:2.7.3-buster kokoro/linux/aarch64/ruby_build_and_run_tests_with_qemu_aarch64.sh
\ No newline at end of file
+docker run $DOCKER_TTY_ARGS --rm --user "$(id -u):$(id -g)" -e "HOME=/home/fake-user" -e "PROTOC=/work/protoc" -v "$(mktemp -d):/home/fake-user" -v "$(pwd)":/work -w /work arm64v8/ruby:2.7.3-buster kokoro/linux/aarch64/ruby_build_and_run_tests_with_qemu_aarch64.sh
diff --git a/kokoro/linux/bazel.sh b/kokoro/linux/bazel.sh
new file mode 100755
index 0000000..b7c8000
--- /dev/null
+++ b/kokoro/linux/bazel.sh
@@ -0,0 +1,44 @@
+#!/bin/bash
+
+set -ex
+
+if [[ -z "${CONTAINER_IMAGE}" ]]; then
+ CONTAINER_IMAGE=gcr.io/protobuf-build/bazel/linux@sha256:2bfd061284eff8234f2fcca16d71d43c69ccf3a22206628b54c204a6a9aac277
+fi
+
+cd $(dirname $0)/../..
+GIT_REPO_ROOT=`pwd`
+rm -rf $GIT_REPO_ROOT/logs
+
+ENVS=()
+
+# Check for specific versions pinned to the docker image. In these cases we
+# want to forward the environment variable to tests, so that they can verify
+# that the correct version is being picked up by Bazel.
+ENVS+=("--test_env=KOKORO_JAVA_VERSION")
+ENVS+=("--test_env=KOKORO_PYTHON_VERSION")
+ENVS+=("--test_env=KOKORO_RUBY_VERSION")
+
+if [ -n "$BAZEL_ENV" ]; then
+ for env in $BAZEL_ENV; do
+ ENVS+="--action_env=${env}"
+ done
+fi
+
+tmpfile=$(mktemp -u)
+
+docker run \
+ --cidfile $tmpfile \
+ -v $GIT_REPO_ROOT:/workspace \
+ $CONTAINER_IMAGE \
+ test \
+ --keep_going \
+ --test_output=streamed \
+ ${ENVS[@]} \
+ $PLATFORM_CONFIG \
+ $BAZEL_EXTRA_FLAGS \
+ $BAZEL_TARGETS
+
+# Save logs for Kokoro
+docker cp \
+ `cat $tmpfile`:/workspace/logs $KOKORO_ARTIFACTS_DIR
diff --git a/kokoro/linux/bazel/build.sh b/kokoro/linux/bazel/build.sh
deleted file mode 100755
index a338a99..0000000
--- a/kokoro/linux/bazel/build.sh
+++ /dev/null
@@ -1,47 +0,0 @@
-#!/bin/bash
-#
-# Build file to set up and run tests
-set -ex
-
-# Install Bazel 4.0.0.
-use_bazel.sh 4.0.0
-bazel version
-
-# Print bazel testlogs to stdout when tests failed.
-function print_test_logs {
- # TODO(yannic): Only print logs of failing tests.
- testlogs_dir=$(bazel info bazel-testlogs)
- testlogs=$(find "${testlogs_dir}" -name "*.log")
- for log in $testlogs; do
- cat "${log}"
- done
-}
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-git submodule update --init --recursive
-
-# Disabled for now, re-enable if appropriate.
-# //:build_files_updated_unittest \
-
-trap print_test_logs EXIT
-bazel test -k --copt=-Werror --host_copt=-Werror \
- //build_defs:all \
- //java:tests \
- //:protoc \
- //:protobuf \
- //:protobuf_python \
- //:protobuf_test
-trap - EXIT
-
-pushd examples
-bazel build //...
-popd
-
-# Verify that we can build successfully from generated tar files.
-./autogen.sh && ./configure && make -j$(nproc) dist
-DIST=`ls *.tar.gz`
-tar -xf $DIST
-cd ${DIST//.tar.gz}
-bazel build //:protobuf //:protobuf_java
diff --git a/kokoro/linux/bazel/common.cfg b/kokoro/linux/bazel/common.cfg
new file mode 100644
index 0000000..cd41cb2
--- /dev/null
+++ b/kokoro/linux/bazel/common.cfg
@@ -0,0 +1,16 @@
+# Default setup for the all of our Kokoro builds.
+
+# Location of the build script in repository
+build_file: "protobuf/kokoro/linux/bazel.sh"
+timeout_mins: 15
+
+env_vars {
+ key: "BAZEL_TARGETS"
+ value: "//src/... @com_google_protobuf_examples//..."
+}
+
+action {
+ define_artifacts {
+ regex: "**/sponge_log.*"
+ }
+}
diff --git a/kokoro/linux/bazel/continuous.cfg b/kokoro/linux/bazel/continuous.cfg
index 13cfef1..8523c22 100644
--- a/kokoro/linux/bazel/continuous.cfg
+++ b/kokoro/linux/bazel/continuous.cfg
@@ -1,5 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/bazel/build.sh"
-timeout_mins: 15
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/bazel/presubmit.cfg b/kokoro/linux/bazel/presubmit.cfg
index 13cfef1..8523c22 100644
--- a/kokoro/linux/bazel/presubmit.cfg
+++ b/kokoro/linux/bazel/presubmit.cfg
@@ -1,5 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/bazel/build.sh"
-timeout_mins: 15
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/bazel_distcheck/build.sh b/kokoro/linux/bazel_distcheck/build.sh
deleted file mode 100755
index 4eb6e11..0000000
--- a/kokoro/linux/bazel_distcheck/build.sh
+++ /dev/null
@@ -1,87 +0,0 @@
-#!/bin/bash
-#
-# Build file to set up and run tests using bazel-build dist archive
-#
-# Note that the builds use WORKSPACE to fetch external sources, not
-# git submodules.
-
-set -eux
-
-BUILD_ONLY_TARGETS=(
- //pkg:all
- //:protoc
- //:protobuf
- //:protobuf_python
-)
-
-TEST_TARGETS=(
- //build_defs:all
- //conformance:all
- //java:tests
- //:protobuf_test
-)
-
-use_bazel.sh 5.0.0 || true
-bazel version
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-# Construct temp directory for running the dist build.
-# If you want to run locally and keep the build dir, create a directory
-# and pass it in the DIST_WORK_ROOT env var.
-if [[ -z ${DIST_WORK_ROOT:-} ]]; then
- : ${DIST_WORK_ROOT:=$(mktemp -d)}
- function dist_cleanup() {
- rm -rf ${DIST_WORK_ROOT}
- }
- trap dist_cleanup EXIT
-fi
-
-# Let Bazel share the distdir.
-TMP_DISTDIR=${DIST_WORK_ROOT}/bazel-distdir
-mkdir -p ${TMP_DISTDIR}
-
-# Build distribution archive
-date
-bazel fetch --distdir=${TMP_DISTDIR} //pkg:dist_all_tar
-bazel build --distdir=${TMP_DISTDIR} //pkg:dist_all_tar
-DIST_ARCHIVE=$(readlink $(bazel info bazel-bin)/pkg/dist_all_tar.tar.gz)
-bazel shutdown
-
-# The `pkg_tar` rule emits a symlink based on the rule name. The actual
-# file is named with the current version.
-date
-echo "Resolved archive path: ${DIST_ARCHIVE}"
-
-# Extract the dist archive.
-date
-DIST_WORKSPACE=${DIST_WORK_ROOT}/protobuf
-mkdir -p ${DIST_WORKSPACE}
-tar -C ${DIST_WORKSPACE} --strip-components=1 -axf ${DIST_ARCHIVE}
-
-# Perform build steps in the extracted dist sources.
-
-cd ${DIST_WORKSPACE}
-FAILED=false
-
-date
-bazel fetch --distdir=${TMP_DISTDIR} "${BUILD_ONLY_TARGETS[@]}" "${TEST_TARGETS[@]}"
-
-date
-bazel build --distdir=${TMP_DISTDIR} -k \
- "${BUILD_ONLY_TARGETS[@]}" || FAILED=true
-
-date
-bazel test --distdir=${TMP_DISTDIR} --test_output=errors -k \
- "${TEST_TARGETS[@]}" || FAILED=true
-
-date
-cd examples
-bazel build --distdir=${TMP_DISTDIR} //... || FAILED=true
-
-if ${FAILED}; then
- echo FAILED
- exit 1
-fi
-echo PASS
diff --git a/kokoro/linux/bazel_distcheck/continuous.cfg b/kokoro/linux/bazel_distcheck/continuous.cfg
deleted file mode 100644
index 4ea8b21..0000000
--- a/kokoro/linux/bazel_distcheck/continuous.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/bazel_distcheck/build.sh"
-timeout_mins: 15
diff --git a/kokoro/linux/bazel_distcheck/presubmit.cfg b/kokoro/linux/bazel_distcheck/presubmit.cfg
deleted file mode 100644
index 4ea8b21..0000000
--- a/kokoro/linux/bazel_distcheck/presubmit.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/bazel_distcheck/build.sh"
-timeout_mins: 15
diff --git a/kokoro/linux/benchmark/build.sh b/kokoro/linux/benchmark/build.sh
deleted file mode 100755
index f470989..0000000
--- a/kokoro/linux/benchmark/build.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "pull request" project:
-#
-# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image. Then we delegate to the general
-# build_and_run_docker.sh script.
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERHUB_ORGANIZATION=protobuftesting
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/java_stretch
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="benchmark"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/benchmark/run.sh b/kokoro/linux/benchmark/run.sh
deleted file mode 100755
index 963f779..0000000
--- a/kokoro/linux/benchmark/run.sh
+++ /dev/null
@@ -1,99 +0,0 @@
-#!/bin/bash
-#
-# Change to repo root
-cd $(dirname $0)/../../..
-
-set -ex
-
-export OUTPUT_DIR=testoutput
-repo_root="$(pwd)"
-
-# TODO(jtattermusch): Add back support for benchmarking with tcmalloc for C++ and python.
-# This feature was removed since it used to use tcmalloc from https://github.com/gperftools/gperftools.git
-# which is very outdated. See https://github.com/protocolbuffers/protobuf/issues/8725.
-
-# download datasets for benchmark
-pushd benchmarks
-datasets=$(for file in $(find . -type f -name "dataset.*.pb" -not -path "./tmp/*"); do echo "$(pwd)/$file"; done | xargs)
-echo $datasets
-popd
-
-# build Python protobuf
-./autogen.sh
-./configure CXXFLAGS="-fPIC -O2"
-make -j8
-pushd python
-python3 -m venv env
-source env/bin/activate
-python3 setup.py build --cpp_implementation
-pip3 install --install-option="--cpp_implementation" .
-popd
-
-# build and run Python benchmark
-# We do this before building protobuf C++ since C++ build
-# will rewrite some libraries used by protobuf python.
-pushd benchmarks
-make python-pure-python-benchmark
-make python-cpp-reflection-benchmark
-make -j8 python-cpp-generated-code-benchmark
-echo "[" > tmp/python_result.json
-echo "benchmarking pure python..."
-./python-pure-python-benchmark --json --behavior_prefix="pure-python-benchmark" $datasets >> tmp/python_result.json
-echo "," >> "tmp/python_result.json"
-echo "benchmarking python cpp reflection..."
-env LD_LIBRARY_PATH="${repo_root}/src/.libs" ./python-cpp-reflection-benchmark --json --behavior_prefix="cpp-reflection-benchmark" $datasets >> tmp/python_result.json
-echo "," >> "tmp/python_result.json"
-echo "benchmarking python cpp generated code..."
-env LD_LIBRARY_PATH="${repo_root}/src/.libs" ./python-cpp-generated-code-benchmark --json --behavior_prefix="cpp-generated-code-benchmark" $datasets >> tmp/python_result.json
-echo "]" >> "tmp/python_result.json"
-popd
-
-# build CPP protobuf
-./configure
-make clean && make -j8
-
-pushd java
-mvn package -B -Dmaven.test.skip=true
-popd
-
-pushd benchmarks
-
-# build and run C++ benchmark
-# "make clean" deletes the contents of the tmp/ directory, so we move it elsewhere and then restore it once build is done.
-# TODO(jtattermusch): find a less clumsy way of protecting python_result.json contents
-mv tmp/python_result.json . && make clean && make -j8 cpp-benchmark && mv python_result.json tmp
-echo "benchmarking cpp..."
-env ./cpp-benchmark --benchmark_min_time=5.0 --benchmark_out_format=json --benchmark_out="tmp/cpp_result.json" $datasets
-
-# TODO(jtattermusch): add benchmarks for https://github.com/protocolbuffers/protobuf-go.
-# The original benchmarks for https://github.com/golang/protobuf were removed
-# because:
-# * they were broken and haven't been producing results for a long time
-# * the https://github.com/golang/protobuf implementation has been superseded by
-# https://github.com/protocolbuffers/protobuf-go
-
-# build and run java benchmark (java 11 is required)
-make java-benchmark
-echo "benchmarking java..."
-./java-benchmark -Cresults.file.options.file="tmp/java_result.json" $datasets
-
-# TODO(jtattermusch): re-enable JS benchmarks once https://github.com/protocolbuffers/protobuf/issues/8747 is fixed.
-# build and run js benchmark
-# make js-benchmark
-# echo "benchmarking js..."
-# ./js-benchmark $datasets --json_output=$(pwd)/tmp/node_result.json
-
-# TODO(jtattermusch): add php-c-benchmark. Currently its build is broken.
-
-# persist raw the results in the build job log (for better debuggability)
-cat tmp/cpp_result.json
-cat tmp/java_result.json
-cat tmp/python_result.json
-
-# print the postprocessed results to the build job log
-# TODO(jtattermusch): re-enable uploading results to bigquery (it is currently broken)
-make python_add_init
-env LD_LIBRARY_PATH="${repo_root}/src/.libs" python3 -m util.result_parser \
- -cpp="../tmp/cpp_result.json" -java="../tmp/java_result.json" -python="../tmp/python_result.json"
-popd
-
diff --git a/kokoro/linux/build_and_run_docker.sh b/kokoro/linux/build_and_run_docker.sh
deleted file mode 100755
index cdbd6e2..0000000
--- a/kokoro/linux/build_and_run_docker.sh
+++ /dev/null
@@ -1,64 +0,0 @@
-#!/bin/bash
-#
-# Builds docker image and runs a command under it.
-# This is a generic script that is configured with the following variables:
-#
-# DOCKERHUB_ORGANIZATION - The organization on docker hub storing the
-# Dockerfile.
-# DOCKERFILE_DIR - Directory in which Dockerfile file is located.
-# DOCKER_RUN_SCRIPT - Script to run under docker (relative to protobuf repo root)
-# OUTPUT_DIR - Directory that will be copied from inside docker after finishing.
-# $@ - Extra args to pass to docker run
-
-set -ex
-
-cd $(dirname $0)/../..
-git_root=$(pwd)
-cd -
-
-# Use image name based on Dockerfile sha1
-if [ -z "$DOCKERHUB_ORGANIZATION" ]
-then
- DOCKERHUB_ORGANIZATION=grpctesting/protobuf
- DOCKER_IMAGE_NAME=${DOCKERHUB_ORGANIZATION}_$(sha1sum $DOCKERFILE_DIR/Dockerfile | cut -f1 -d\ )
-else
- # TODO(teboring): Remove this when all tests have been migrated to separate
- # docker images.
- DOCKERFILE_PREFIX=$(basename $DOCKERFILE_DIR)
- DOCKER_IMAGE_NAME=${DOCKERHUB_ORGANIZATION}/${DOCKERFILE_PREFIX}_$(sha1sum $DOCKERFILE_DIR/Dockerfile | cut -f1 -d\ )
-fi
-
-# Pull dockerimage from Dockerhub. This sometimes fails intermittently, so we
-# keep trying until we succeed.
-until docker pull $DOCKER_IMAGE_NAME; do sleep 10; done
-
-# Ensure existence of ccache directory
-CCACHE_DIR=/tmp/protobuf-ccache
-mkdir -p $CCACHE_DIR
-
-# Choose random name for docker container
-CONTAINER_NAME="build_and_run_docker_$(uuidgen)"
-
-echo $git_root
-
-# Run command inside docker
-docker run \
- "$@" \
- -e CCACHE_DIR=$CCACHE_DIR \
- -e KOKORO_BUILD_NUMBER=$KOKORO_BUILD_NUMBER \
- -e KOKORO_BUILD_ID=$KOKORO_BUILD_ID \
- -e EXTERNAL_GIT_ROOT="/var/local/kokoro/protobuf" \
- -e TEST_SET="$TEST_SET" \
- -v "$git_root:/var/local/kokoro/protobuf:ro" \
- -v $CCACHE_DIR:$CCACHE_DIR \
- -w /var/local/git/protobuf \
- --name=$CONTAINER_NAME \
- $DOCKER_IMAGE_NAME \
- bash -l "/var/local/kokoro/protobuf/$DOCKER_RUN_SCRIPT" || FAILED="true"
-
-# remove the container, possibly killing it first
-docker rm -f $CONTAINER_NAME || true
-
-[ -z "$FAILED" ] || {
- exit 1
-}
diff --git a/kokoro/linux/cmake/build.sh b/kokoro/linux/cmake/build.sh
new file mode 100755
index 0000000..ee06d95
--- /dev/null
+++ b/kokoro/linux/cmake/build.sh
@@ -0,0 +1,26 @@
+#!/bin/bash
+#
+# Build file to set up and run tests using CMake
+
+set -eux
+
+# Change to repo root
+cd $(dirname $0)/../../..
+GIT_REPO_ROOT=`pwd`
+
+CONTAINER_IMAGE=gcr.io/protobuf-build/cmake/linux@sha256:79e6ed9d7f3f8e56167a3309a521e5b7e6a212bfb19855c65ee1cbb6f9099671
+
+# Update git submodules
+git submodule update --init --recursive
+
+tmpfile=$(mktemp -u)
+
+docker run \
+ --cidfile $tmpfile \
+ -v $GIT_REPO_ROOT:/workspace \
+ $CONTAINER_IMAGE \
+ /test.sh -Dprotobuf_BUILD_CONFORMANCE=ON -Dprotobuf_BUILD_EXAMPLES=ON
+
+# Save logs for Kokoro
+docker cp \
+ `cat $tmpfile`:/workspace/logs $KOKORO_ARTIFACTS_DIR
diff --git a/kokoro/linux/cmake/common.cfg b/kokoro/linux/cmake/common.cfg
new file mode 100644
index 0000000..f03bd39
--- /dev/null
+++ b/kokoro/linux/cmake/common.cfg
@@ -0,0 +1,11 @@
+# Config file for running tests in Kokoro
+
+# Location of the build script in repository
+build_file: "protobuf/kokoro/linux/cmake/build.sh"
+timeout_mins: 1440
+
+action {
+ define_artifacts {
+ regex: "**/sponge_log.*"
+ }
+}
diff --git a/kokoro/linux/cmake/continuous.cfg b/kokoro/linux/cmake/continuous.cfg
new file mode 100644
index 0000000..8523c22
--- /dev/null
+++ b/kokoro/linux/cmake/continuous.cfg
@@ -0,0 +1 @@
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/cmake/presubmit.cfg b/kokoro/linux/cmake/presubmit.cfg
new file mode 100644
index 0000000..8523c22
--- /dev/null
+++ b/kokoro/linux/cmake/presubmit.cfg
@@ -0,0 +1 @@
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/cmake_install/build.sh b/kokoro/linux/cmake_install/build.sh
new file mode 100755
index 0000000..7fdf267
--- /dev/null
+++ b/kokoro/linux/cmake_install/build.sh
@@ -0,0 +1,30 @@
+#!/bin/bash
+#
+# Build file to build, install, and test using CMake.
+
+set -eux
+
+# Change to repo root
+cd $(dirname $0)/../../..
+GIT_REPO_ROOT=`pwd`
+
+CONTAINER_IMAGE=gcr.io/protobuf-build/cmake/linux@sha256:79e6ed9d7f3f8e56167a3309a521e5b7e6a212bfb19855c65ee1cbb6f9099671
+
+# Update git submodules
+git submodule update --init --recursive
+
+tmpfile=$(mktemp -u)
+
+docker run \
+ --cidfile $tmpfile \
+ -v $GIT_REPO_ROOT:/workspace \
+ $CONTAINER_IMAGE \
+ "/install.sh && /test.sh \
+ -Dprotobuf_REMOVE_INSTALLED_HEADERS=ON \
+ -Dprotobuf_BUILD_PROTOBUF_BINARIES=OFF \
+ -Dprotobuf_BUILD_CONFORMANCE=ON"
+
+
+# Save logs for Kokoro
+docker cp \
+ `cat $tmpfile`:/workspace/logs $KOKORO_ARTIFACTS_DIR
diff --git a/kokoro/linux/cmake_install/common.cfg b/kokoro/linux/cmake_install/common.cfg
new file mode 100644
index 0000000..f1ae0b3
--- /dev/null
+++ b/kokoro/linux/cmake_install/common.cfg
@@ -0,0 +1,11 @@
+# Config file for running tests in Kokoro
+
+# Location of the build script in repository
+build_file: "protobuf/kokoro/linux/cmake_install/build.sh"
+timeout_mins: 1440
+
+action {
+ define_artifacts {
+ regex: "**/sponge_log.*"
+ }
+}
diff --git a/kokoro/linux/cmake_install/continuous.cfg b/kokoro/linux/cmake_install/continuous.cfg
new file mode 100644
index 0000000..8523c22
--- /dev/null
+++ b/kokoro/linux/cmake_install/continuous.cfg
@@ -0,0 +1 @@
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/cmake_install/presubmit.cfg b/kokoro/linux/cmake_install/presubmit.cfg
new file mode 100644
index 0000000..8523c22
--- /dev/null
+++ b/kokoro/linux/cmake_install/presubmit.cfg
@@ -0,0 +1 @@
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/cmake_ninja/build.sh b/kokoro/linux/cmake_ninja/build.sh
new file mode 100755
index 0000000..21cc01e
--- /dev/null
+++ b/kokoro/linux/cmake_ninja/build.sh
@@ -0,0 +1,26 @@
+#!/bin/bash
+#
+# Build file to set up and run tests using CMake with the Ninja generator.
+
+set -eux
+
+# Change to repo root
+cd $(dirname $0)/../../..
+GIT_REPO_ROOT=`pwd`
+
+CONTAINER_IMAGE=gcr.io/protobuf-build/cmake/linux@sha256:79e6ed9d7f3f8e56167a3309a521e5b7e6a212bfb19855c65ee1cbb6f9099671
+
+# Update git submodules
+git submodule update --init --recursive
+
+tmpfile=$(mktemp -u)
+
+docker run \
+ --cidfile $tmpfile \
+ -v $GIT_REPO_ROOT:/workspace \
+ $CONTAINER_IMAGE \
+ /test.sh -G Ninja -Dprotobuf_BUILD_CONFORMANCE=ON
+
+# Save logs for Kokoro
+docker cp \
+ `cat $tmpfile`:/workspace/logs $KOKORO_ARTIFACTS_DIR
diff --git a/kokoro/linux/cmake_ninja/common.cfg b/kokoro/linux/cmake_ninja/common.cfg
new file mode 100644
index 0000000..144fc90
--- /dev/null
+++ b/kokoro/linux/cmake_ninja/common.cfg
@@ -0,0 +1,11 @@
+# Config file for running tests in Kokoro
+
+# Location of the build script in repository
+build_file: "protobuf/kokoro/linux/cmake_ninja/build.sh"
+timeout_mins: 1440
+
+action {
+ define_artifacts {
+ regex: "**/sponge_log.*"
+ }
+}
diff --git a/kokoro/linux/cmake_ninja/continuous.cfg b/kokoro/linux/cmake_ninja/continuous.cfg
new file mode 100644
index 0000000..8523c22
--- /dev/null
+++ b/kokoro/linux/cmake_ninja/continuous.cfg
@@ -0,0 +1 @@
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/cmake_ninja/presubmit.cfg b/kokoro/linux/cmake_ninja/presubmit.cfg
new file mode 100644
index 0000000..8523c22
--- /dev/null
+++ b/kokoro/linux/cmake_ninja/presubmit.cfg
@@ -0,0 +1 @@
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/cmake_shared/build.sh b/kokoro/linux/cmake_shared/build.sh
new file mode 100755
index 0000000..1fda3df
--- /dev/null
+++ b/kokoro/linux/cmake_shared/build.sh
@@ -0,0 +1,26 @@
+#!/bin/bash
+#
+# Build file to set up and run tests via CMake using shared libraries
+
+set -eux
+
+# Change to repo root
+cd $(dirname $0)/../../..
+GIT_REPO_ROOT=`pwd`
+
+CONTAINER_IMAGE=gcr.io/protobuf-build/cmake/linux@sha256:79e6ed9d7f3f8e56167a3309a521e5b7e6a212bfb19855c65ee1cbb6f9099671
+
+# Update git submodules
+git submodule update --init --recursive
+
+tmpfile=$(mktemp -u)
+
+docker run \
+ --cidfile $tmpfile \
+ -v $GIT_REPO_ROOT:/workspace \
+ $CONTAINER_IMAGE \
+ /test.sh -Dprotobuf_BUILD_CONFORMANCE=ON -Dprotobuf_BUILD_SHARED_LIBS=ON
+
+# Save logs for Kokoro
+docker cp \
+ `cat $tmpfile`:/workspace/logs $KOKORO_ARTIFACTS_DIR
diff --git a/kokoro/linux/cmake_shared/common.cfg b/kokoro/linux/cmake_shared/common.cfg
new file mode 100644
index 0000000..f03bd39
--- /dev/null
+++ b/kokoro/linux/cmake_shared/common.cfg
@@ -0,0 +1,11 @@
+# Config file for running tests in Kokoro
+
+# Location of the build script in repository
+build_file: "protobuf/kokoro/linux/cmake/build.sh"
+timeout_mins: 1440
+
+action {
+ define_artifacts {
+ regex: "**/sponge_log.*"
+ }
+}
diff --git a/kokoro/linux/cmake_shared/continuous.cfg b/kokoro/linux/cmake_shared/continuous.cfg
new file mode 100644
index 0000000..8523c22
--- /dev/null
+++ b/kokoro/linux/cmake_shared/continuous.cfg
@@ -0,0 +1 @@
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/cmake_shared/presubmit.cfg b/kokoro/linux/cmake_shared/presubmit.cfg
new file mode 100644
index 0000000..8523c22
--- /dev/null
+++ b/kokoro/linux/cmake_shared/presubmit.cfg
@@ -0,0 +1 @@
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/cpp_aarch64/build.sh b/kokoro/linux/cpp_aarch64/build.sh
deleted file mode 100755
index a43ab1c..0000000
--- a/kokoro/linux/cpp_aarch64/build.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "continuous" and "presubmit" jobs.
-
-set -ex
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-kokoro/linux/aarch64/test_cpp_aarch64.sh
diff --git a/kokoro/linux/cpp_aarch64/common.cfg b/kokoro/linux/cpp_aarch64/common.cfg
new file mode 100644
index 0000000..f77f73b
--- /dev/null
+++ b/kokoro/linux/cpp_aarch64/common.cfg
@@ -0,0 +1,21 @@
+# Config file for running tests in Kokoro
+
+# Location of the build script in repository
+build_file: "protobuf/kokoro/linux/bazel.sh"
+timeout_mins: 120
+
+env_vars {
+ key: "CONTAINER_IMAGE"
+ value: "gcr.io/protobuf-build/emulation/linux:aarch64-4e847d7a01c1792471b6dd985ab0bf2677332e6f"
+}
+
+env_vars {
+ key: "BAZEL_TARGETS"
+ value: "//src/..."
+}
+
+action {
+ define_artifacts {
+ regex: "**/sponge_log.*"
+ }
+}
diff --git a/kokoro/linux/cpp_aarch64/continuous.cfg b/kokoro/linux/cpp_aarch64/continuous.cfg
index 0f1be4a..8523c22 100644
--- a/kokoro/linux/cpp_aarch64/continuous.cfg
+++ b/kokoro/linux/cpp_aarch64/continuous.cfg
@@ -1,5 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/cpp_aarch64/build.sh"
-timeout_mins: 120
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/cpp_aarch64/presubmit.cfg b/kokoro/linux/cpp_aarch64/presubmit.cfg
index 0f1be4a..8523c22 100644
--- a/kokoro/linux/cpp_aarch64/presubmit.cfg
+++ b/kokoro/linux/cpp_aarch64/presubmit.cfg
@@ -1,5 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/cpp_aarch64/build.sh"
-timeout_mins: 120
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/cpp_distcheck/build.sh b/kokoro/linux/cpp_distcheck/build.sh
deleted file mode 100755
index a28843e..0000000
--- a/kokoro/linux/cpp_distcheck/build.sh
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/bin/bash
-#
-# Build file to set up and run tests
-
-set -ex # exit immediately on error
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-./tests.sh cpp_distcheck
-
-# Run tests under release docker image.
-DOCKER_IMAGE_NAME=protobuf/protoc_$(sha1sum protoc-artifacts/Dockerfile | cut -f1 -d " ")
-until docker pull $DOCKER_IMAGE_NAME; do sleep 10; done
-
-docker run -v $(pwd):/var/local/protobuf --rm $DOCKER_IMAGE_NAME \
- bash -l /var/local/protobuf/tests.sh cpp || FAILED="true"
-
-# This directory is owned by root. We need to delete it, because otherwise
-# Kokoro will attempt to rsync it and fail with a permission error.
-rm -rf src/core
-
-if [ "$FAILED" = "true" ]; then
- exit 1
-fi
diff --git a/kokoro/linux/cpp_distcheck/continuous.cfg b/kokoro/linux/cpp_distcheck/continuous.cfg
deleted file mode 100644
index 4289f6a..0000000
--- a/kokoro/linux/cpp_distcheck/continuous.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/cpp_distcheck/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/linux/cpp_distcheck/presubmit.cfg b/kokoro/linux/cpp_distcheck/presubmit.cfg
deleted file mode 100644
index 4289f6a..0000000
--- a/kokoro/linux/cpp_distcheck/presubmit.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/cpp_distcheck/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/linux/cpp_tcmalloc/build.sh b/kokoro/linux/cpp_tcmalloc/build.sh
deleted file mode 100755
index 3c77b11..0000000
--- a/kokoro/linux/cpp_tcmalloc/build.sh
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/bin/bash
-#
-# Build file to set up and run tests
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERHUB_ORGANIZATION=protobuftesting
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/cpp_tcmalloc
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="cpp_tcmalloc"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/cpp_tcmalloc/common.cfg b/kokoro/linux/cpp_tcmalloc/common.cfg
new file mode 100644
index 0000000..fb76204
--- /dev/null
+++ b/kokoro/linux/cpp_tcmalloc/common.cfg
@@ -0,0 +1,21 @@
+# Config file for running tests in Kokoro
+
+# Location of the build script in repository
+build_file: "protobuf/kokoro/linux/bazel.sh"
+timeout_mins: 1440
+
+env_vars {
+ key: "CONTAINER_IMAGE"
+ value: "gcr.io/protobuf-build/tcmalloc/linux:64e8944e4f18d7d6c9649112a8a93be57e693cd8"
+}
+
+env_vars {
+ key: "BAZEL_TARGETS"
+ value: "//src/..."
+}
+
+action {
+ define_artifacts {
+ regex: "**/sponge_log.*"
+ }
+}
diff --git a/kokoro/linux/cpp_tcmalloc/continuous.cfg b/kokoro/linux/cpp_tcmalloc/continuous.cfg
index 46312a9..8523c22 100644
--- a/kokoro/linux/cpp_tcmalloc/continuous.cfg
+++ b/kokoro/linux/cpp_tcmalloc/continuous.cfg
@@ -1,5 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/cpp_tcmalloc/build.sh"
-timeout_mins: 1440
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/cpp_tcmalloc/presubmit.cfg b/kokoro/linux/cpp_tcmalloc/presubmit.cfg
index 46312a9..8523c22 100644
--- a/kokoro/linux/cpp_tcmalloc/presubmit.cfg
+++ b/kokoro/linux/cpp_tcmalloc/presubmit.cfg
@@ -1,5 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/cpp_tcmalloc/build.sh"
-timeout_mins: 1440
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/csharp/build.sh b/kokoro/linux/csharp/build.sh
deleted file mode 100755
index 9a2eb48..0000000
--- a/kokoro/linux/csharp/build.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "pull request" project:
-#
-# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image. Then we delegate to the general
-# build_and_run_docker.sh script.
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERHUB_ORGANIZATION=protobuftesting
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/csharp
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="csharp"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/csharp/common.cfg b/kokoro/linux/csharp/common.cfg
new file mode 100644
index 0000000..2332c00
--- /dev/null
+++ b/kokoro/linux/csharp/common.cfg
@@ -0,0 +1,27 @@
+# Config file for running tests in Kokoro
+
+# Location of the build script in repository
+build_file: "protobuf/kokoro/linux/bazel.sh"
+timeout_mins: 1440
+
+env_vars {
+ key: "CONTAINER_IMAGE"
+ value: "gcr.io/protobuf-build/csharp/linux:3.1.415-6.0.100-6bbe70439ba5b0404bb12662cebc0296909389fa"
+}
+
+env_vars {
+ key: "BAZEL_TARGETS"
+ value: "//csharp/..."
+}
+
+env_vars {
+ key: "BAZEL_EXTRA_FLAGS"
+ value: "--action_env=DOTNET_CLI_TELEMETRY_OPTOUT=1 "
+ "--test_env=DOTNET_CLI_HOME=/home/bazel"
+}
+
+action {
+ define_artifacts {
+ regex: "**/sponge_log.*"
+ }
+}
diff --git a/kokoro/linux/csharp/continuous.cfg b/kokoro/linux/csharp/continuous.cfg
index 3d17767..8523c22 100644
--- a/kokoro/linux/csharp/continuous.cfg
+++ b/kokoro/linux/csharp/continuous.cfg
@@ -1,5 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/csharp/build.sh"
-timeout_mins: 1440
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/csharp/presubmit.cfg b/kokoro/linux/csharp/presubmit.cfg
index 3d17767..8523c22 100644
--- a/kokoro/linux/csharp/presubmit.cfg
+++ b/kokoro/linux/csharp/presubmit.cfg
@@ -1,5 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/csharp/build.sh"
-timeout_mins: 1440
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/benchmark/continuous.cfg b/kokoro/linux/csharp_aarch64/common.cfg
similarity index 66%
copy from kokoro/linux/benchmark/continuous.cfg
copy to kokoro/linux/csharp_aarch64/common.cfg
index 8cc8f96..df28ef3 100644
--- a/kokoro/linux/benchmark/continuous.cfg
+++ b/kokoro/linux/csharp_aarch64/common.cfg
@@ -1,8 +1,8 @@
# Config file for running tests in Kokoro
# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/benchmark/build.sh"
-timeout_mins: 240
+build_file: "protobuf/kokoro/linux/csharp_aarch64/build.sh"
+timeout_mins: 120
action {
define_artifacts {
diff --git a/kokoro/linux/csharp_aarch64/continuous.cfg b/kokoro/linux/csharp_aarch64/continuous.cfg
index df28ef3..8523c22 100644
--- a/kokoro/linux/csharp_aarch64/continuous.cfg
+++ b/kokoro/linux/csharp_aarch64/continuous.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/csharp_aarch64/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/csharp_aarch64/presubmit.cfg b/kokoro/linux/csharp_aarch64/presubmit.cfg
index df28ef3..8523c22 100644
--- a/kokoro/linux/csharp_aarch64/presubmit.cfg
+++ b/kokoro/linux/csharp_aarch64/presubmit.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/csharp_aarch64/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/dist_install/build.sh b/kokoro/linux/dist_install/build.sh
deleted file mode 100755
index c456ee8..0000000
--- a/kokoro/linux/dist_install/build.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/bash
-#
-# Build file to set up and run tests
-
-set -ex # exit immediately on error
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERHUB_ORGANIZATION=protobuftesting
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/java_stretch
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="dist_install"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/dist_install/continuous.cfg b/kokoro/linux/dist_install/continuous.cfg
deleted file mode 100644
index b1e0b20..0000000
--- a/kokoro/linux/dist_install/continuous.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/dist_install/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/linux/dist_install/presubmit.cfg b/kokoro/linux/dist_install/presubmit.cfg
deleted file mode 100644
index b1e0b20..0000000
--- a/kokoro/linux/dist_install/presubmit.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/dist_install/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/linux/dockerfile/push_testing_images.sh b/kokoro/linux/dockerfile/push_testing_images.sh
deleted file mode 100755
index 2d82bab..0000000
--- a/kokoro/linux/dockerfile/push_testing_images.sh
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/bin/bash
-
-set -ex
-
-cd $(dirname $0)/../../..
-git_root=$(pwd)
-cd kokoro/linux/dockerfile
-
-DOCKERHUB_ORGANIZATION=protobuftesting
-
-for DOCKERFILE_DIR in test/*
-do
- # Generate image name based on Dockerfile checksum. That works well as long
- # as can count on dockerfiles being written in a way that changing the logical
- # contents of the docker image always changes the SHA (e.g. using "ADD file"
- # cmd in the dockerfile in not ok as contents of the added file will not be
- # reflected in the SHA).
- DOCKER_IMAGE_NAME=$(basename $DOCKERFILE_DIR)_$(sha1sum $DOCKERFILE_DIR/Dockerfile | cut -f1 -d\ )
-
- echo $DOCKER_IMAGE_NAME
- # skip the image if it already exists in the repo
- curl --silent -f -lSL https://registry.hub.docker.com/v2/repositories/${DOCKERHUB_ORGANIZATION}/${DOCKER_IMAGE_NAME}/tags/latest > /dev/null \
- && continue
-
- docker build -t ${DOCKERHUB_ORGANIZATION}/${DOCKER_IMAGE_NAME} ${DOCKERFILE_DIR}
-
- # "docker login" needs to be run in advance
- docker push ${DOCKERHUB_ORGANIZATION}/${DOCKER_IMAGE_NAME}
-done
diff --git a/kokoro/linux/dockerfile/test/cpp_tcmalloc/Dockerfile b/kokoro/linux/dockerfile/test/cpp_tcmalloc/Dockerfile
deleted file mode 100644
index 0ce9982..0000000
--- a/kokoro/linux/dockerfile/test/cpp_tcmalloc/Dockerfile
+++ /dev/null
@@ -1,29 +0,0 @@
-FROM debian:jessie
-
-# Install dependencies. We start with the basic ones require to build protoc
-# and the C++ build
-RUN apt-get update && apt-get install -y \
- autoconf \
- autotools-dev \
- build-essential \
- bzip2 \
- ccache \
- curl \
- gcc \
- git \
- libc6 \
- libc6-dbg \
- libc6-dev \
- libgtest-dev \
- libtool \
- make \
- parallel \
- time \
- wget \
- && apt-get clean
-
-# Install dependencies for TC malloc
-RUN apt-get install -y \
- google-perftools \
- libgoogle-perftools4 \
- libgoogle-perftools-dev
diff --git a/kokoro/linux/dockerfile/test/csharp/Dockerfile b/kokoro/linux/dockerfile/test/csharp/Dockerfile
deleted file mode 100644
index c07fcbc..0000000
--- a/kokoro/linux/dockerfile/test/csharp/Dockerfile
+++ /dev/null
@@ -1,41 +0,0 @@
-FROM debian:buster
-
-# Install dependencies. We start with the basic ones require to build protoc
-# and the C++ build
-RUN apt-get update && apt-get install -y \
- autoconf \
- autotools-dev \
- build-essential \
- bzip2 \
- ccache \
- curl \
- gcc \
- git \
- libc6 \
- libc6-dbg \
- libc6-dev \
- libgtest-dev \
- libtool \
- make \
- parallel \
- time \
- wget \
- && apt-get clean
-
-# Update ca-certificates to fix known buster + .NET 5 issue
-# https://github.com/NuGet/Announcements/issues/49
-RUN apt-get update && apt-get install -y ca-certificates && apt-get clean
-
-# dotnet SDK prerequisites
-RUN apt-get update && apt-get install -y libunwind8 libicu63 && apt-get clean
-
-# Install dotnet SDK via install script
-RUN wget -q https://dot.net/v1/dotnet-install.sh && \
- chmod u+x dotnet-install.sh && \
- ./dotnet-install.sh --version 3.1.415 && \
- ./dotnet-install.sh --version 6.0.100 && \
- ln -s /root/.dotnet/dotnet /usr/local/bin
-
-RUN wget -q www.nuget.org/NuGet.exe -O /usr/local/bin/nuget.exe
-
-ENV DOTNET_SKIP_FIRST_TIME_EXPERIENCE true
diff --git a/kokoro/linux/dockerfile/test/java_stretch/Dockerfile b/kokoro/linux/dockerfile/test/java_stretch/Dockerfile
deleted file mode 100644
index 0716927..0000000
--- a/kokoro/linux/dockerfile/test/java_stretch/Dockerfile
+++ /dev/null
@@ -1,39 +0,0 @@
-# Despite the name of this image, we are no longer on stretch.
-# We should consider renaming this image, and/or evaluating what
-# software versions we actually need.
-FROM debian:bullseye
-
-# Install dependencies. We start with the basic ones required to build protoc
-# and the C++ build
-RUN apt-get update && apt-get install -y \
- autoconf \
- autotools-dev \
- build-essential \
- bzip2 \
- ccache \
- cmake \
- curl \
- gcc \
- git \
- libc6 \
- libc6-dbg \
- libc6-dev \
- libgtest-dev \
- libtool \
- make \
- parallel \
- pkg-config \
- time \
- wget \
- # Java dependencies
- maven \
- openjdk-11-jdk \
- openjdk-17-jdk \
- # Required for the gtest build.
- python2 \
- # Python dependencies
- python3-dev \
- python3-setuptools \
- python3-pip \
- python3-venv \
- && apt-get clean
diff --git a/kokoro/linux/dockerfile/test/php/Dockerfile b/kokoro/linux/dockerfile/test/php/Dockerfile
deleted file mode 100644
index 4c9d69d..0000000
--- a/kokoro/linux/dockerfile/test/php/Dockerfile
+++ /dev/null
@@ -1,255 +0,0 @@
-FROM debian:jessie
-
-# Install dependencies. We start with the basic ones require to build protoc
-# and the C++ build
-RUN apt-get update && apt-get install -y \
- autoconf \
- autotools-dev \
- build-essential \
- bzip2 \
- ccache \
- curl \
- gcc \
- git \
- libc6 \
- libc6-dbg \
- libc6-dev \
- libgtest-dev \
- libtool \
- make \
- parallel \
- time \
- wget \
- re2c \
- sqlite3 \
- libsqlite3-dev \
- && apt-get clean
-
-# Install php dependencies
-RUN apt-get clean && apt-get update && apt-get install -y --force-yes \
- php5 \
- libcurl4-openssl-dev \
- libgmp-dev \
- libgmp3-dev \
- libssl-dev \
- libxml2-dev \
- unzip \
- zlib1g-dev \
- pkg-config \
- && apt-get clean
-
-# Install other dependencies
-RUN ln -sf /usr/include/x86_64-linux-gnu/gmp.h /usr/include/gmp.h
-RUN wget http://ftp.gnu.org/gnu/bison/bison-2.6.4.tar.gz -O /var/local/bison-2.6.4.tar.gz
-RUN cd /var/local \
- && tar -zxvf bison-2.6.4.tar.gz \
- && cd /var/local/bison-2.6.4 \
- && ./configure \
- && make \
- && make install
-
-# Install composer
-RUN curl -sS https://getcomposer.org/installer | php
-RUN mv composer.phar /usr/local/bin/composer
-
-# Download php source code
-RUN git clone https://github.com/php/php-src
-
-# php 5.6
-RUN cd php-src \
- && git checkout PHP-5.6.39 \
- && ./buildconf --force
-RUN cd php-src \
- && ./configure \
- --enable-bcmath \
- --enable-mbstring \
- --with-gmp \
- --with-openssl \
- --with-zlib \
- --prefix=/usr/local/php-5.6 \
- && make \
- && make install \
- && make clean
-
-RUN wget -O phpunit https://phar.phpunit.de/phpunit-5.phar \
- && chmod +x phpunit \
- && mv phpunit /usr/local/php-5.6/bin
-
-# php 7.0
-RUN cd php-src \
- && git checkout PHP-7.0.33 \
- && ./buildconf --force
-RUN cd php-src \
- && ./configure \
- --enable-bcmath \
- --enable-mbstring \
- --with-gmp \
- --with-openssl \
- --with-zlib \
- --prefix=/usr/local/php-7.0 \
- && make \
- && make install \
- && make clean
-RUN cd php-src \
- && ./configure \
- --enable-maintainer-zts \
- --enable-mbstring \
- --with-gmp \
- --with-openssl \
- --with-zlib \
- --prefix=/usr/local/php-7.0-zts \
- && make \
- && make install \
- && make clean
-
-RUN wget -O phpunit https://phar.phpunit.de/phpunit-6.phar \
- && chmod +x phpunit \
- && cp phpunit /usr/local/php-7.0/bin \
- && mv phpunit /usr/local/php-7.0-zts/bin
-
-# php 7.1
-RUN cd php-src \
- && git checkout PHP-7.1.25 \
- && ./buildconf --force
-RUN cd php-src \
- && ./configure \
- --enable-bcmath \
- --enable-mbstring \
- --with-gmp \
- --with-openssl \
- --with-zlib \
- --prefix=/usr/local/php-7.1 \
- && make \
- && make install \
- && make clean
-RUN cd php-src \
- && ./configure \
- --enable-maintainer-zts \
- --enable-mbstring \
- --with-gmp \
- --with-openssl \
- --with-zlib \
- --prefix=/usr/local/php-7.1-zts \
- && make \
- && make install \
- && make clean
-
-RUN wget -O phpunit https://phar.phpunit.de/phpunit-7.5.0.phar \
- && chmod +x phpunit \
- && cp phpunit /usr/local/php-7.1/bin \
- && mv phpunit /usr/local/php-7.1-zts/bin
-
-# php 7.2
-RUN cd php-src \
- && git checkout PHP-7.2.13 \
- && ./buildconf --force
-RUN cd php-src \
- && ./configure \
- --enable-bcmath \
- --enable-mbstring \
- --with-gmp \
- --with-openssl \
- --with-zlib \
- --prefix=/usr/local/php-7.2 \
- && make \
- && make install \
- && make clean
-RUN cd php-src \
- && ./configure \
- --enable-maintainer-zts \
- --enable-mbstring \
- --with-gmp \
- --with-openssl \
- --with-zlib \
- --prefix=/usr/local/php-7.2-zts \
- && make \
- && make install \
- && make clean
-
-RUN wget -O phpunit https://phar.phpunit.de/phpunit-7.5.0.phar \
- && chmod +x phpunit \
- && cp phpunit /usr/local/php-7.2/bin \
- && mv phpunit /usr/local/php-7.2-zts/bin
-
-# php 7.3
-RUN cd php-src \
- && git checkout PHP-7.3.0 \
- && ./buildconf --force
-RUN cd php-src \
- && ./configure \
- --enable-bcmath \
- --enable-mbstring \
- --with-gmp \
- --with-openssl \
- --with-zlib \
- --prefix=/usr/local/php-7.3 \
- && make \
- && make install \
- && make clean
-RUN cd php-src \
- && ./configure \
- --enable-maintainer-zts \
- --enable-mbstring \
- --with-gmp \
- --with-openssl \
- --with-zlib \
- --prefix=/usr/local/php-7.3-zts \
- && make \
- && make install \
- && make clean
-
-RUN wget -O phpunit https://phar.phpunit.de/phpunit-7.5.0.phar \
- && chmod +x phpunit \
- && cp phpunit /usr/local/php-7.3/bin \
- && mv phpunit /usr/local/php-7.3-zts/bin
-
-# php 7.4
-RUN wget https://ftp.gnu.org/gnu/bison/bison-3.0.1.tar.gz -O /var/local/bison-3.0.1.tar.gz
-RUN cd /var/local \
- && tar -zxvf bison-3.0.1.tar.gz \
- && cd /var/local/bison-3.0.1 \
- && ./configure \
- && make \
- && make install
-
-RUN wget https://github.com/php/php-src/archive/php-7.4.0.tar.gz -O /var/local/php-7.4.0.tar.gz
-
-RUN cd /var/local \
- && tar -zxvf php-7.4.0.tar.gz
-
-RUN cd /var/local/php-src-php-7.4.0 \
- && ./buildconf --force \
- && ./configure \
- --enable-bcmath \
- --enable-mbstring \
- --disable-mbregex \
- --with-gmp \
- --with-openssl \
- --with-zlib \
- --prefix=/usr/local/php-7.4 \
- && make \
- && make install \
- && make clean
-RUN cd /var/local/php-src-php-7.4.0 \
- && ./buildconf --force \
- && ./configure \
- --enable-maintainer-zts \
- --enable-mbstring \
- --disable-mbregex \
- --with-gmp \
- --with-openssl \
- --with-zlib \
- --prefix=/usr/local/php-7.4-zts \
- && make \
- && make install \
- && make clean
-
-RUN wget -O phpunit https://phar.phpunit.de/phpunit-8.phar \
- && chmod +x phpunit \
- && cp phpunit /usr/local/php-7.4/bin \
- && mv phpunit /usr/local/php-7.4-zts/bin
-
-# Install php dependencies
-RUN apt-get clean && apt-get update && apt-get install -y --force-yes \
- valgrind \
- && apt-get clean
diff --git a/kokoro/linux/dockerfile/test/php80/Dockerfile b/kokoro/linux/dockerfile/test/php80/Dockerfile
deleted file mode 100644
index 5b382d0..0000000
--- a/kokoro/linux/dockerfile/test/php80/Dockerfile
+++ /dev/null
@@ -1,124 +0,0 @@
-FROM debian:stretch
-
-# Install dependencies. We start with the basic ones require to build protoc
-# and the C++ build
-RUN apt-get update && apt-get install -y \
- autoconf \
- autotools-dev \
- build-essential \
- bzip2 \
- ccache \
- curl \
- gcc \
- git \
- libc6 \
- libc6-dbg \
- libc6-dev \
- libgtest-dev \
- libtool \
- make \
- parallel \
- time \
- wget \
- re2c \
- sqlite3 \
- vim \
- libonig-dev \
- libsqlite3-dev \
- && apt-get clean
-
-# Install php dependencies
-RUN apt-get clean && apt-get update && apt-get install -y --force-yes \
- php \
- libcurl4-openssl-dev \
- libgmp-dev \
- libgmp3-dev \
- libssl-dev \
- libxml2-dev \
- unzip \
- zlib1g-dev \
- pkg-config \
- && apt-get clean
-
-# Install other dependencies
-RUN ln -sf /usr/include/x86_64-linux-gnu/gmp.h /usr/include/gmp.h
-RUN wget https://ftp.gnu.org/gnu/bison/bison-3.0.1.tar.gz -O /var/local/bison-3.0.1.tar.gz
-RUN cd /var/local \
- && tar -zxvf bison-3.0.1.tar.gz \
- && cd /var/local/bison-3.0.1 \
- && ./configure \
- && make \
- && make install
-
-# Install composer
-RUN curl -sS https://getcomposer.org/installer | php
-RUN mv composer.phar /usr/local/bin/composer
-
-# Download php source code
-RUN git clone https://github.com/php/php-src
-
-# php 8.0
-RUN cd php-src \
- && git checkout php-8.0.0 \
- && ./buildconf --force
-RUN cd php-src \
- && ./configure \
- --enable-bcmath \
- --enable-mbstring \
- --with-gmp \
- --with-openssl \
- --with-zlib \
- --prefix=/usr/local/php-8.0 \
- && make \
- && make install \
- && make clean
-RUN cd php-src \
- && ./configure \
- --enable-bcmath \
- --enable-mbstring \
- --enable-maintainer-zts \
- --with-gmp \
- --with-openssl \
- --with-zlib \
- --prefix=/usr/local/php-8.0-zts \
- && make \
- && make install \
- && make clean
-
-RUN wget -O phpunit https://phar.phpunit.de/phpunit-9.phar \
- && chmod +x phpunit \
- && cp phpunit /usr/local/php-8.0/bin \
- && mv phpunit /usr/local/php-8.0-zts/bin
-
-# php 8.1
-RUN cd php-src \
- && git checkout php-8.1.2 \
- && ./buildconf --force
-RUN cd php-src \
- && ./configure \
- --enable-bcmath \
- --enable-mbstring \
- --with-gmp \
- --with-openssl \
- --with-zlib \
- --prefix=/usr/local/php-8.1 \
- && make \
- && make install \
- && make clean
-RUN cd php-src \
- && ./configure \
- --enable-bcmath \
- --enable-mbstring \
- --enable-maintainer-zts \
- --with-gmp \
- --with-openssl \
- --with-zlib \
- --prefix=/usr/local/php-8.1-zts \
- && make \
- && make install \
- && make clean
-
-# Install php dependencies
-RUN apt-get clean && apt-get update && apt-get install -y --force-yes \
- valgrind \
- && apt-get clean
diff --git a/kokoro/linux/dockerfile/test/php_32bit/Dockerfile b/kokoro/linux/dockerfile/test/php_32bit/Dockerfile
deleted file mode 100644
index 2fd620e..0000000
--- a/kokoro/linux/dockerfile/test/php_32bit/Dockerfile
+++ /dev/null
@@ -1,260 +0,0 @@
-FROM i386/debian:jessie
-
-# Install dependencies. We start with the basic ones require to build protoc
-# and the C++ build
-RUN apt-get update && apt-get install -y \
- autoconf \
- autotools-dev \
- build-essential \
- bzip2 \
- ccache \
- curl \
- gcc \
- git \
- libc6 \
- libc6-dbg \
- libc6-dev \
- libgtest-dev \
- libtool \
- make \
- parallel \
- time \
- wget \
- re2c \
- sqlite3 \
- libsqlite3-dev \
- && apt-get clean
-
-# Install php dependencies
-RUN apt-get clean && apt-get update && apt-get install -y --force-yes \
- bison \
- php5 \
- libcurl4-openssl-dev \
- libssl-dev \
- libxml2-dev \
- unzip \
- zlib1g-dev \
- pkg-config \
- && apt-get clean
-
-# Install other dependencies
-RUN wget http://ftp.gnu.org/gnu/bison/bison-2.6.4.tar.gz -O /var/local/bison-2.6.4.tar.gz
-RUN cd /var/local \
- && tar -zxvf bison-2.6.4.tar.gz \
- && cd /var/local/bison-2.6.4 \
- && ./configure \
- && make \
- && make install
-
-# Install composer
-RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
-RUN php composer-setup.php
-RUN mv composer.phar /usr/bin/composer
-RUN php -r "unlink('composer-setup.php');"
-
-# Download php source code
-RUN git clone https://github.com/php/php-src
-
-# php 5.6
-RUN cd php-src \
- && git checkout PHP-5.6.39 \
- && ./buildconf --force
-RUN cd php-src \
- && ./configure \
- --enable-bcmath \
- --enable-mbstring \
- --with-openssl \
- --with-zlib \
- --prefix=/usr/local/php-5.6 \
- && make \
- && make install \
- && make clean
-
-RUN wget -O phpunit https://phar.phpunit.de/phpunit-5.phar \
- && chmod +x phpunit \
- && mv phpunit /usr/local/php-5.6/bin
-
-# php 7.0
-RUN wget https://github.com/php/php-src/archive/php-7.0.33.tar.gz -O /var/local/php-7.0.33.tar.gz
-
-RUN cd /var/local \
- && tar -zxvf php-7.0.33.tar.gz
-
-RUN cd /var/local/php-src-php-7.0.33 \
- && ./buildconf --force \
- && ./configure \
- --enable-bcmath \
- --enable-mbstring \
- --with-openssl \
- --with-zlib \
- --prefix=/usr/local/php-7.0 \
- && make \
- && make install \
- && make clean
-RUN cd /var/local/php-src-php-7.0.33 \
- && ./buildconf --force \
- && ./configure \
- --enable-maintainer-zts \
- --enable-mbstring \
- --with-openssl \
- --with-zlib \
- --prefix=/usr/local/php-7.0-zts \
- && make \
- && make install \
- && make clean
-
-RUN wget -O phpunit https://phar.phpunit.de/phpunit-6.phar \
- && chmod +x phpunit \
- && cp phpunit /usr/local/php-7.0/bin \
- && mv phpunit /usr/local/php-7.0-zts/bin
-
-# php 7.1
-RUN wget https://github.com/php/php-src/archive/php-7.1.25.tar.gz -O /var/local/php-7.1.25.tar.gz
-
-RUN cd /var/local \
- && tar -zxvf php-7.1.25.tar.gz
-
-RUN cd /var/local/php-src-php-7.1.25 \
- && ./buildconf --force \
- && ./configure \
- --enable-bcmath \
- --enable-mbstring \
- --with-openssl \
- --with-zlib \
- --prefix=/usr/local/php-7.1 \
- && make \
- && make install \
- && make clean
-RUN cd /var/local/php-src-php-7.1.25 \
- && ./buildconf --force \
- && ./configure \
- --enable-maintainer-zts \
- --enable-mbstring \
- --with-openssl \
- --with-zlib \
- --prefix=/usr/local/php-7.1-zts \
- && make \
- && make install \
- && make clean
-
-RUN wget -O phpunit https://phar.phpunit.de/phpunit-7.5.0.phar \
- && chmod +x phpunit \
- && cp phpunit /usr/local/php-7.1/bin \
- && mv phpunit /usr/local/php-7.1-zts/bin
-
-# php 7.2
-RUN wget https://github.com/php/php-src/archive/php-7.2.13.tar.gz -O /var/local/php-7.2.13.tar.gz
-
-RUN cd /var/local \
- && tar -zxvf php-7.2.13.tar.gz
-
-RUN cd /var/local/php-src-php-7.2.13 \
- && ./buildconf --force \
- && ./configure \
- --enable-bcmath \
- --enable-mbstring \
- --with-openssl \
- --with-zlib \
- --prefix=/usr/local/php-7.2 \
- && make \
- && make install \
- && make clean
-RUN cd /var/local/php-src-php-7.2.13 \
- && ./buildconf --force \
- && ./configure \
- --enable-maintainer-zts \
- --enable-mbstring \
- --with-openssl \
- --with-zlib \
- --prefix=/usr/local/php-7.2-zts \
- && make \
- && make install \
- && make clean
-
-RUN wget -O phpunit https://phar.phpunit.de/phpunit-7.5.0.phar \
- && chmod +x phpunit \
- && cp phpunit /usr/local/php-7.2/bin \
- && mv phpunit /usr/local/php-7.2-zts/bin
-
-# php 7.3
-RUN wget https://github.com/php/php-src/archive/php-7.3.0.tar.gz -O /var/local/php-7.3.0.tar.gz
-
-RUN cd /var/local \
- && tar -zxvf php-7.3.0.tar.gz
-
-RUN cd /var/local/php-src-php-7.3.0 \
- && ./buildconf --force \
- && ./configure \
- --enable-bcmath \
- --enable-mbstring \
- --with-openssl \
- --with-zlib \
- --prefix=/usr/local/php-7.3 \
- && make \
- && make install \
- && make clean
-RUN cd /var/local/php-src-php-7.3.0 \
- && ./buildconf --force \
- && ./configure \
- --enable-maintainer-zts \
- --enable-mbstring \
- --with-openssl \
- --with-zlib \
- --prefix=/usr/local/php-7.3-zts \
- && make \
- && make install \
- && make clean
-
-RUN wget -O phpunit https://phar.phpunit.de/phpunit-7.5.0.phar \
- && chmod +x phpunit \
- && cp phpunit /usr/local/php-7.3/bin \
- && mv phpunit /usr/local/php-7.3-zts/bin
-
-# php 7.4
-RUN wget https://ftp.gnu.org/gnu/bison/bison-3.0.1.tar.gz -O /var/local/bison-3.0.1.tar.gz
-RUN cd /var/local \
- && tar -zxvf bison-3.0.1.tar.gz \
- && cd /var/local/bison-3.0.1 \
- && ./configure \
- && make \
- && make install
-
-RUN wget https://github.com/php/php-src/archive/php-7.4.0.tar.gz -O /var/local/php-7.4.0.tar.gz
-
-RUN cd /var/local \
- && tar -zxvf php-7.4.0.tar.gz
-
-RUN cd /var/local/php-src-php-7.4.0 \
- && ./buildconf --force \
- && ./configure \
- --enable-bcmath \
- --enable-mbstring \
- --disable-mbregex \
- --with-openssl \
- --with-zlib \
- --prefix=/usr/local/php-7.4 \
- && make \
- && make install \
- && make clean
-RUN cd /var/local/php-src-php-7.4.0 \
- && ./buildconf --force \
- && ./configure \
- --enable-maintainer-zts \
- --enable-mbstring \
- --disable-mbregex \
- --with-openssl \
- --with-zlib \
- --prefix=/usr/local/php-7.4-zts \
- && make \
- && make install \
- && make clean
-
-RUN wget -O phpunit https://phar.phpunit.de/phpunit-8.phar \
- && chmod +x phpunit \
- && cp phpunit /usr/local/php-7.4/bin \
- && mv phpunit /usr/local/php-7.4-zts/bin
-
-# Install php dependencies
-RUN apt-get clean && apt-get update && apt-get install -y --force-yes \
- valgrind \
- && apt-get clean
diff --git a/kokoro/linux/dockerfile/test/python310/Dockerfile b/kokoro/linux/dockerfile/test/python310/Dockerfile
deleted file mode 100644
index e16e93b..0000000
--- a/kokoro/linux/dockerfile/test/python310/Dockerfile
+++ /dev/null
@@ -1,31 +0,0 @@
-FROM python:3.10-buster
-
-# Install dependencies. We start with the basic ones require to build protoc
-# and the C++ build
-RUN apt-get update && apt-get install -y \
- autoconf \
- autotools-dev \
- build-essential \
- bzip2 \
- ccache \
- curl \
- gcc \
- git \
- libc6 \
- libc6-dbg \
- libc6-dev \
- libgtest-dev \
- libtool \
- make \
- parallel \
- time \
- wget \
- && apt-get clean \
- && rm -rf /var/lib/apt/lists/*
-
-# Install Python libraries.
-RUN python -m pip install --no-cache-dir --upgrade \
- pip \
- setuptools \
- tox \
- wheel
diff --git a/kokoro/linux/dockerfile/test/python37/Dockerfile b/kokoro/linux/dockerfile/test/python37/Dockerfile
deleted file mode 100644
index ee108dd..0000000
--- a/kokoro/linux/dockerfile/test/python37/Dockerfile
+++ /dev/null
@@ -1,31 +0,0 @@
-FROM python:3.7-buster
-
-# Install dependencies. We start with the basic ones require to build protoc
-# and the C++ build
-RUN apt-get update && apt-get install -y \
- autoconf \
- autotools-dev \
- build-essential \
- bzip2 \
- ccache \
- curl \
- gcc \
- git \
- libc6 \
- libc6-dbg \
- libc6-dev \
- libgtest-dev \
- libtool \
- make \
- parallel \
- time \
- wget \
- && apt-get clean \
- && rm -rf /var/lib/apt/lists/*
-
-# Install Python libraries.
-RUN python -m pip install --no-cache-dir --upgrade \
- pip \
- setuptools \
- tox \
- wheel
diff --git a/kokoro/linux/dockerfile/test/python38/Dockerfile b/kokoro/linux/dockerfile/test/python38/Dockerfile
deleted file mode 100644
index 56efc9d..0000000
--- a/kokoro/linux/dockerfile/test/python38/Dockerfile
+++ /dev/null
@@ -1,31 +0,0 @@
-FROM python:3.8-buster
-
-# Install dependencies. We start with the basic ones require to build protoc
-# and the C++ build
-RUN apt-get update && apt-get install -y \
- autoconf \
- autotools-dev \
- build-essential \
- bzip2 \
- ccache \
- curl \
- gcc \
- git \
- libc6 \
- libc6-dbg \
- libc6-dev \
- libgtest-dev \
- libtool \
- make \
- parallel \
- time \
- wget \
- && apt-get clean \
- && rm -rf /var/lib/apt/lists/*
-
-# Install Python libraries.
-RUN python -m pip install --no-cache-dir --upgrade \
- pip \
- setuptools \
- tox \
- wheel
diff --git a/kokoro/linux/dockerfile/test/python39/Dockerfile b/kokoro/linux/dockerfile/test/python39/Dockerfile
deleted file mode 100644
index ee7554d..0000000
--- a/kokoro/linux/dockerfile/test/python39/Dockerfile
+++ /dev/null
@@ -1,31 +0,0 @@
-FROM python:3.9-buster
-
-# Install dependencies. We start with the basic ones require to build protoc
-# and the C++ build
-RUN apt-get update && apt-get install -y \
- autoconf \
- autotools-dev \
- build-essential \
- bzip2 \
- ccache \
- curl \
- gcc \
- git \
- libc6 \
- libc6-dbg \
- libc6-dev \
- libgtest-dev \
- libtool \
- make \
- parallel \
- time \
- wget \
- && apt-get clean \
- && rm -rf /var/lib/apt/lists/*
-
-# Install Python libraries.
-RUN python -m pip install --no-cache-dir --upgrade \
- pip \
- setuptools \
- tox \
- wheel
diff --git a/kokoro/linux/dockerfile/test/ruby/Dockerfile b/kokoro/linux/dockerfile/test/ruby/Dockerfile
deleted file mode 100644
index 0e34fe5..0000000
--- a/kokoro/linux/dockerfile/test/ruby/Dockerfile
+++ /dev/null
@@ -1,44 +0,0 @@
-FROM debian:stretch
-
-# Install dependencies. We start with the basic ones require to build protoc
-# and the C++ build
-RUN apt-get update && apt-get install -y \
- autoconf \
- autotools-dev \
- build-essential \
- bzip2 \
- ccache \
- curl \
- gcc \
- git \
- libc6 \
- libc6-dbg \
- libc6-dev \
- libgtest-dev \
- libtool \
- make \
- parallel \
- time \
- wget \
- # Java dependencies
- maven \
- openjdk-8-jdk \
- && apt-get clean
-
-# Install rvm
-RUN gpg --keyserver hkp://keyserver.ubuntu.com --recv-keys \
- 409B6B1796C275462A1703113804BB82D39DC0E3 \
- 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
-RUN \curl -sSL https://raw.githubusercontent.com/rvm/rvm/master/binscripts/rvm-installer | bash -s master
-
-RUN /bin/bash -l -c "rvm install 2.5.1"
-RUN /bin/bash -l -c "rvm install 2.6.0"
-RUN /bin/bash -l -c "rvm install 2.7.0"
-RUN /bin/bash -l -c "rvm install 3.0.0"
-RUN /bin/bash -l -c "rvm install 3.1.0"
-RUN /bin/bash -l -c "rvm install jruby-9.2.20.1"
-RUN /bin/bash -l -c "rvm install jruby-9.3.3.0"
-RUN /bin/bash -l -c "rvm install jruby-9.3.4.0"
-
-RUN /bin/bash -l -c "echo 'gem: --no-ri --no-rdoc' > ~/.gemrc"
-RUN /bin/bash -l -c "echo 'export PATH=/usr/local/rvm/bin:$PATH' >> ~/.bashrc"
diff --git a/kokoro/linux/java_aarch64/build.sh b/kokoro/linux/java_aarch64/build.sh
deleted file mode 100755
index ed5ad53..0000000
--- a/kokoro/linux/java_aarch64/build.sh
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "continuous" and "presubmit" jobs.
-
-set -ex
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-# Initialize any submodules.
-git submodule update --init --recursive
-
-kokoro/linux/aarch64/qemu_helpers/prepare_qemu.sh
-
-kokoro/linux/aarch64/test_java_aarch64.sh
diff --git a/kokoro/linux/java_aarch64/common.cfg b/kokoro/linux/java_aarch64/common.cfg
new file mode 100644
index 0000000..75e3f0b
--- /dev/null
+++ b/kokoro/linux/java_aarch64/common.cfg
@@ -0,0 +1,21 @@
+# Config file for running tests in Kokoro
+
+# Location of the build script in repository
+build_file: "protobuf/kokoro/linux/bazel.sh"
+timeout_mins: 120
+
+env_vars {
+ key: "CONTAINER_IMAGE"
+ value: "gcr.io/protobuf-build/emulation/linux:aarch64-4e847d7a01c1792471b6dd985ab0bf2677332e6f"
+}
+
+env_vars {
+ key: "BAZEL_TARGETS"
+ value: "//java/..."
+}
+
+action {
+ define_artifacts {
+ regex: "**/sponge_log.*"
+ }
+}
diff --git a/kokoro/linux/java_aarch64/continuous.cfg b/kokoro/linux/java_aarch64/continuous.cfg
index 5db46d4..8523c22 100644
--- a/kokoro/linux/java_aarch64/continuous.cfg
+++ b/kokoro/linux/java_aarch64/continuous.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/java_aarch64/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/java_aarch64/presubmit.cfg b/kokoro/linux/java_aarch64/presubmit.cfg
index 5db46d4..8523c22 100644
--- a/kokoro/linux/java_aarch64/presubmit.cfg
+++ b/kokoro/linux/java_aarch64/presubmit.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/java_aarch64/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/java_jdk11/build.sh b/kokoro/linux/java_jdk11/build.sh
deleted file mode 100755
index d73aa7c..0000000
--- a/kokoro/linux/java_jdk11/build.sh
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "pull request" project:
-#
-# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image. Then we delegate to the general
-# build_and_run_docker.sh script.
-
-# fail on error
-set -e
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERHUB_ORGANIZATION=protobuftesting
-# The image of the Dockerfile sha1 is fetched from the organization
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/java_stretch
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="java_jdk11"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/java_jdk11/common.cfg b/kokoro/linux/java_jdk11/common.cfg
new file mode 100644
index 0000000..3db5cd0
--- /dev/null
+++ b/kokoro/linux/java_jdk11/common.cfg
@@ -0,0 +1,16 @@
+# Config file for running tests in Kokoro
+
+# Location of the build script in repository
+build_file: "protobuf/kokoro/linux/bazel.sh"
+timeout_mins: 120
+
+env_vars {
+ key: "BAZEL_TARGETS"
+ value: "//java/..."
+}
+
+action {
+ define_artifacts {
+ regex: "**/sponge_log.*"
+ }
+}
diff --git a/kokoro/linux/java_jdk11/continuous.cfg b/kokoro/linux/java_jdk11/continuous.cfg
index f8af54d..8523c22 100644
--- a/kokoro/linux/java_jdk11/continuous.cfg
+++ b/kokoro/linux/java_jdk11/continuous.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/java_jdk11/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/java_jdk11/presubmit.cfg b/kokoro/linux/java_jdk11/presubmit.cfg
index 366048c..8523c22 100644
--- a/kokoro/linux/java_jdk11/presubmit.cfg
+++ b/kokoro/linux/java_jdk11/presubmit.cfg
@@ -1,12 +1 @@
-# Config file for running Linkage Monitor in Kokoro
-# https://github.com/GoogleCloudPlatform/cloud-opensource-java/tree/master/linkage-monitor
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/java_jdk11/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/java_jdk17/build.sh b/kokoro/linux/java_jdk17/build.sh
deleted file mode 100755
index 677245a..0000000
--- a/kokoro/linux/java_jdk17/build.sh
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "pull request" project:
-#
-# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image. Then we delegate to the general
-# build_and_run_docker.sh script.
-
-# Fail on error
-set -e
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERHUB_ORGANIZATION=protobuftesting
-# The image of the Dockerfile sha1 is fetched from the organization
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/java_stretch
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="java_jdk17"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/java_jdk17/common.cfg b/kokoro/linux/java_jdk17/common.cfg
new file mode 100644
index 0000000..cd31eda
--- /dev/null
+++ b/kokoro/linux/java_jdk17/common.cfg
@@ -0,0 +1,21 @@
+# Config file for running tests in Kokoro
+
+# Location of the build script in repository
+build_file: "protobuf/kokoro/linux/bazel.sh"
+timeout_mins: 120
+
+env_vars {
+ key: "CONTAINER_IMAGE"
+ value: "gcr.io/protobuf-build/java/linux:17-64e8944e4f18d7d6c9649112a8a93be57e693cd8"
+}
+
+env_vars {
+ key: "BAZEL_TARGETS"
+ value: "//java/..."
+}
+
+action {
+ define_artifacts {
+ regex: "**/sponge_log.*"
+ }
+}
diff --git a/kokoro/linux/java_jdk17/continuous.cfg b/kokoro/linux/java_jdk17/continuous.cfg
index 6bac25c..8523c22 100644
--- a/kokoro/linux/java_jdk17/continuous.cfg
+++ b/kokoro/linux/java_jdk17/continuous.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/java_jdk17/build.sh"
-timeout_mins: 60
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/java_jdk17/presubmit.cfg b/kokoro/linux/java_jdk17/presubmit.cfg
index ee80517..8523c22 100644
--- a/kokoro/linux/java_jdk17/presubmit.cfg
+++ b/kokoro/linux/java_jdk17/presubmit.cfg
@@ -1,12 +1 @@
-# Config file for running Linkage Monitor in Kokoro
-# https://github.com/GoogleCloudPlatform/cloud-opensource-java/tree/master/linkage-monitor
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/java_jdk17/build.sh"
-timeout_mins: 60
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/java_linkage_monitor/build.sh b/kokoro/linux/java_linkage_monitor/build.sh
index c447453..7d4d7b7 100755
--- a/kokoro/linux/java_linkage_monitor/build.sh
+++ b/kokoro/linux/java_linkage_monitor/build.sh
@@ -4,16 +4,24 @@
# running the "pull request" project:
#
# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image. Then we delegate to the general
-# build_and_run_docker.sh script.
+# a script to run inside that image.
+
+use_bazel.sh 4.2.2
# Change to repo root
cd $(dirname $0)/../../..
-export DOCKERHUB_ORGANIZATION=protobuftesting
-# The image of the Dockerfile sha1 is fetched from the organization
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/java_stretch
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="java_linkage_monitor"
-./kokoro/linux/build_and_run_docker.sh
+bazel build //:protoc
+
+# The java build setup expects protoc in the root directory.
+cp bazel-bin/protoc .
+
+cd java
+# Installs the snapshot version locally
+mvn -e -B -Dhttps.protocols=TLSv1.2 install -Dmaven.test.skip=true
+
+# Linkage Monitor uses the snapshot versions installed in $HOME/.m2 to verify compatibility
+JAR=linkage-monitor-latest-all-deps.jar
+curl -v -O "https://storage.googleapis.com/cloud-opensource-java-linkage-monitor/${JAR}"
+# Fails if there's new linkage errors compared with baseline
+java -jar $JAR com.google.cloud:libraries-bom
diff --git a/kokoro/linux/java_linkage_monitor/common.cfg b/kokoro/linux/java_linkage_monitor/common.cfg
new file mode 100644
index 0000000..c02a52f
--- /dev/null
+++ b/kokoro/linux/java_linkage_monitor/common.cfg
@@ -0,0 +1,12 @@
+# Config file for running Linkage Monitor in Kokoro
+# https://github.com/GoogleCloudPlatform/cloud-opensource-java/tree/master/linkage-monitor
+
+# Location of the build script in repository
+build_file: "protobuf/kokoro/linux/java_linkage_monitor/build.sh"
+timeout_mins: 120
+
+action {
+ define_artifacts {
+ regex: "**/sponge_log.xml"
+ }
+}
diff --git a/kokoro/linux/java_linkage_monitor/continuous.cfg b/kokoro/linux/java_linkage_monitor/continuous.cfg
index d0486cc..8523c22 100644
--- a/kokoro/linux/java_linkage_monitor/continuous.cfg
+++ b/kokoro/linux/java_linkage_monitor/continuous.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/java_linkage_monitor/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/java_linkage_monitor/presubmit.cfg b/kokoro/linux/java_linkage_monitor/presubmit.cfg
index c02a52f..8523c22 100644
--- a/kokoro/linux/java_linkage_monitor/presubmit.cfg
+++ b/kokoro/linux/java_linkage_monitor/presubmit.cfg
@@ -1,12 +1 @@
-# Config file for running Linkage Monitor in Kokoro
-# https://github.com/GoogleCloudPlatform/cloud-opensource-java/tree/master/linkage-monitor
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/java_linkage_monitor/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/jruby92/build.sh b/kokoro/linux/jruby92/build.sh
deleted file mode 100755
index 5820115..0000000
--- a/kokoro/linux/jruby92/build.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "pull request" project:
-#
-# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image. Then we delegate to the general
-# build_and_run_docker.sh script.
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERHUB_ORGANIZATION=protobuftesting
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/ruby
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="jruby92"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/jruby92/common.cfg b/kokoro/linux/jruby92/common.cfg
new file mode 100644
index 0000000..9db8f50
--- /dev/null
+++ b/kokoro/linux/jruby92/common.cfg
@@ -0,0 +1,26 @@
+# Config file for running tests in Kokoro
+
+# Location of the build script in repository
+build_file: "protobuf/kokoro/linux/bazel.sh"
+timeout_mins: 120
+
+env_vars {
+ key: "CONTAINER_IMAGE"
+ value: "gcr.io/protobuf-build/ruby/linux:jruby-9.2.20.1-64e8944e4f18d7d6c9649112a8a93be57e693cd8"
+}
+
+env_vars {
+ key: "BAZEL_TARGETS"
+ value: "//ruby/..."
+}
+
+env_vars {
+ key: "BAZEL_EXTRA_FLAGS"
+ value: "--define=ruby_platform=java"
+}
+
+action {
+ define_artifacts {
+ regex: "**/sponge_log.*"
+ }
+}
diff --git a/kokoro/linux/jruby92/continuous.cfg b/kokoro/linux/jruby92/continuous.cfg
index 3339584..8523c22 100644
--- a/kokoro/linux/jruby92/continuous.cfg
+++ b/kokoro/linux/jruby92/continuous.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/jruby92/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/jruby92/presubmit.cfg b/kokoro/linux/jruby92/presubmit.cfg
index 3339584..8523c22 100644
--- a/kokoro/linux/jruby92/presubmit.cfg
+++ b/kokoro/linux/jruby92/presubmit.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/jruby92/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/jruby93/build.sh b/kokoro/linux/jruby93/build.sh
deleted file mode 100755
index 24c54d0..0000000
--- a/kokoro/linux/jruby93/build.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "pull request" project:
-#
-# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image. Then we delegate to the general
-# build_and_run_docker.sh script.
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERHUB_ORGANIZATION=protobuftesting
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/ruby
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="jruby93"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/jruby93/common.cfg b/kokoro/linux/jruby93/common.cfg
new file mode 100644
index 0000000..a5a9bd2
--- /dev/null
+++ b/kokoro/linux/jruby93/common.cfg
@@ -0,0 +1,26 @@
+# Config file for running tests in Kokoro
+
+# Location of the build script in repository
+build_file: "protobuf/kokoro/linux/bazel.sh"
+timeout_mins: 120
+
+env_vars {
+ key: "CONTAINER_IMAGE"
+ value: "gcr.io/protobuf-build/ruby/linux:jruby-9.3.4.0-64e8944e4f18d7d6c9649112a8a93be57e693cd8"
+}
+
+env_vars {
+ key: "BAZEL_TARGETS"
+ value: "//ruby/..."
+}
+
+env_vars {
+ key: "BAZEL_EXTRA_FLAGS"
+ value: "--define=ruby_platform=java"
+}
+
+action {
+ define_artifacts {
+ regex: "**/sponge_log.*"
+ }
+}
diff --git a/kokoro/linux/jruby93/continuous.cfg b/kokoro/linux/jruby93/continuous.cfg
index 706d848..8523c22 100644
--- a/kokoro/linux/jruby93/continuous.cfg
+++ b/kokoro/linux/jruby93/continuous.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/jruby93/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/jruby93/presubmit.cfg b/kokoro/linux/jruby93/presubmit.cfg
index 706d848..8523c22 100644
--- a/kokoro/linux/jruby93/presubmit.cfg
+++ b/kokoro/linux/jruby93/presubmit.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/jruby93/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/make_test_output.py b/kokoro/linux/make_test_output.py
deleted file mode 100644
index 9853685..0000000
--- a/kokoro/linux/make_test_output.py
+++ /dev/null
@@ -1,94 +0,0 @@
-"""Gathers output from test runs and create an XML file in JUnit format.
-
-The output files from the individual tests have been written in a directory
-structure like:
-
- $DIR/joblog (output from "parallel --joblog joblog")
- $DIR/logs/1/cpp/stdout
- $DIR/logs/1/cpp/stderr
- $DIR/logs/1/csharp/stdout
- $DIR/logs/1/csharp/stderr
- $DIR/logs/1/java_jdk7/stdout
- $DIR/logs/1/java_jdk7/stderr
- etc.
-
-This script bundles them into a single output XML file so Jenkins can show
-detailed test results. It runs as the last step before the Jenkins build
-finishes.
-"""
-
-import os
-import sys
-from yattag import Doc
-from collections import defaultdict
-
-
-def readtests(basedir):
- tests = defaultdict(dict)
-
- # Sample input (note: separators are tabs).
- #
- # Seq Host Starttime Runtime Send Receive Exitval Signal Command
- # 1 : 1456263838.313 0.005 0 0 0 0 echo A
- with open(basedir + "/joblog") as jobs:
- firstline = next(jobs)
- for line in jobs:
- values = line.split("\t")
-
- name = values[8].split()[-1]
- test = tests[name]
- test["name"] = name
- test["time"] = values[3]
-
- exitval = values[6]
- if int(exitval):
- # We don't have a more specific message. User should look at stderr.
- test["failure"] = "TEST FAILURE"
- else:
- test["failure"] = False
-
- for testname in os.listdir(basedir + "/logs/1"):
- test = tests[testname]
-
- with open(basedir + "/logs/1/" + testname + "/stdout") as f:
- test["stdout"] = f.read()
-
- with open(basedir + "/logs/1/" + testname + "/stderr") as f:
- test["stderr"] = f.read()
-
- # The cpp test is special since it doesn't run under parallel so doesn't show
- # up in the job log.
- tests["cpp"]["name"] = "cpp"
-
- with open(basedir + '/logs/1/cpp/build_time', 'r') as f:
- tests["cpp"]["time"] = f.read().strip()
- tests["cpp"]["failure"] = False
-
- ret = tests.values()
- ret.sort(key=lambda x: x["name"])
-
- return ret
-
-
-def genxml(tests):
- doc, tag, text = Doc().tagtext()
-
- with tag("testsuites"):
- with tag("testsuite", name="Protobuf Tests"):
- for test in tests:
- with tag("testcase", name=test["name"], classname=test["name"],
- time=test["time"]):
- with tag("system-out"):
- text(test["stdout"])
- with tag("system-err"):
- text(test["stderr"])
- if test["failure"]:
- with tag("failure"):
- text(test["failure"])
-
- return doc.getvalue()
-
-
-sys.stderr.write("make_test_output.py: writing XML from directory: " +
- sys.argv[1] + "\n")
-print(genxml(readtests(sys.argv[1])))
diff --git a/kokoro/linux/benchmark/continuous.cfg b/kokoro/linux/php_aarch64/common.cfg
similarity index 67%
rename from kokoro/linux/benchmark/continuous.cfg
rename to kokoro/linux/php_aarch64/common.cfg
index 8cc8f96..ff20682 100644
--- a/kokoro/linux/benchmark/continuous.cfg
+++ b/kokoro/linux/php_aarch64/common.cfg
@@ -1,8 +1,8 @@
# Config file for running tests in Kokoro
# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/benchmark/build.sh"
-timeout_mins: 240
+build_file: "protobuf/kokoro/linux/php_aarch64/build.sh"
+timeout_mins: 120
action {
define_artifacts {
diff --git a/kokoro/linux/php_aarch64/continuous.cfg b/kokoro/linux/php_aarch64/continuous.cfg
index ff20682..8523c22 100644
--- a/kokoro/linux/php_aarch64/continuous.cfg
+++ b/kokoro/linux/php_aarch64/continuous.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/php_aarch64/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/php_aarch64/presubmit.cfg b/kokoro/linux/php_aarch64/presubmit.cfg
index ff20682..8523c22 100644
--- a/kokoro/linux/php_aarch64/presubmit.cfg
+++ b/kokoro/linux/php_aarch64/presubmit.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/php_aarch64/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/php_all/build.sh b/kokoro/linux/php_all/build.sh
index cfcab00..bfad04c 100755
--- a/kokoro/linux/php_all/build.sh
+++ b/kokoro/linux/php_all/build.sh
@@ -8,16 +8,16 @@
# Change to repo base.
cd $(dirname $0)/../../..
-docker run $(test -t 0 && echo "-it") -v$PWD:/workspace gcr.io/protobuf-build/php/linux:8.0.5-dbg-14a06550010c0649bf69b6c9b803c1ca609bbb6d "composer test_valgrind"
+docker run $(test -t 0 && echo "-it") -v$PWD:/workspace gcr.io/protobuf-build/php/linux:8.0.5-dbg-fd99596d4c4c9b78f984ee667a9b26b91a28eb8d "composer test_valgrind"
-docker run $(test -t 0 && echo "-it") -v$PWD:/workspace gcr.io/protobuf-build/php/linux:7.0.33-dbg-14a06550010c0649bf69b6c9b803c1ca609bbb6d "composer test && composer test_c"
-docker run $(test -t 0 && echo "-it") -v$PWD:/workspace gcr.io/protobuf-build/php/linux:7.3.28-dbg-14a06550010c0649bf69b6c9b803c1ca609bbb6d "composer test && composer test_c"
-docker run $(test -t 0 && echo "-it") -v$PWD:/workspace gcr.io/protobuf-build/php/linux:7.4.18-dbg-14a06550010c0649bf69b6c9b803c1ca609bbb6d "composer test && composer test_c"
-docker run $(test -t 0 && echo "-it") -v$PWD:/workspace gcr.io/protobuf-build/php/linux:8.0.5-dbg-14a06550010c0649bf69b6c9b803c1ca609bbb6d "composer test && composer test_c"
+docker run $(test -t 0 && echo "-it") -v$PWD:/workspace gcr.io/protobuf-build/php/linux:7.0.33-dbg-fd99596d4c4c9b78f984ee667a9b26b91a28eb8d "composer test && composer test_c"
+docker run $(test -t 0 && echo "-it") -v$PWD:/workspace gcr.io/protobuf-build/php/linux:7.3.28-dbg-fd99596d4c4c9b78f984ee667a9b26b91a28eb8d "composer test && composer test_c"
+docker run $(test -t 0 && echo "-it") -v$PWD:/workspace gcr.io/protobuf-build/php/linux:7.4.18-dbg-fd99596d4c4c9b78f984ee667a9b26b91a28eb8d "composer test && composer test_c"
+docker run $(test -t 0 && echo "-it") -v$PWD:/workspace gcr.io/protobuf-build/php/linux:8.0.5-dbg-fd99596d4c4c9b78f984ee667a9b26b91a28eb8d "composer test && composer test_c"
# Run specialized memory leak & multirequest tests.
-docker run $(test -t 0 && echo "-it") -v$PWD:/workspace gcr.io/protobuf-build/php/linux:8.0.5-dbg-14a06550010c0649bf69b6c9b803c1ca609bbb6d "composer test_c && tests/multirequest.sh && tests/memory_leak_test.sh"
+docker run $(test -t 0 && echo "-it") -v$PWD:/workspace gcr.io/protobuf-build/php/linux:8.0.5-dbg-fd99596d4c4c9b78f984ee667a9b26b91a28eb8d "composer test_c && tests/multirequest.sh && tests/memory_leak_test.sh"
# Most of our tests use a debug build of PHP, but we do one build against an opt
# php just in case that surfaces anything unexpected.
-docker run $(test -t 0 && echo "-it") -v$PWD:/workspace gcr.io/protobuf-build/php/linux:8.0.5-14a06550010c0649bf69b6c9b803c1ca609bbb6d "composer test && composer test_c"
+docker run $(test -t 0 && echo "-it") -v$PWD:/workspace gcr.io/protobuf-build/php/linux:8.0.5-fd99596d4c4c9b78f984ee667a9b26b91a28eb8d "composer test && composer test_c"
diff --git a/kokoro/linux/benchmark/continuous.cfg b/kokoro/linux/php_all/common.cfg
similarity index 67%
copy from kokoro/linux/benchmark/continuous.cfg
copy to kokoro/linux/php_all/common.cfg
index 8cc8f96..dfa8037 100644
--- a/kokoro/linux/benchmark/continuous.cfg
+++ b/kokoro/linux/php_all/common.cfg
@@ -1,8 +1,8 @@
# Config file for running tests in Kokoro
# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/benchmark/build.sh"
-timeout_mins: 240
+build_file: "protobuf/kokoro/linux/php_all/build.sh"
+timeout_mins: 120
action {
define_artifacts {
diff --git a/kokoro/linux/php_all/continuous.cfg b/kokoro/linux/php_all/continuous.cfg
index dfa8037..8523c22 100644
--- a/kokoro/linux/php_all/continuous.cfg
+++ b/kokoro/linux/php_all/continuous.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/php_all/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/php_all/presubmit.cfg b/kokoro/linux/php_all/presubmit.cfg
index dfa8037..8523c22 100644
--- a/kokoro/linux/php_all/presubmit.cfg
+++ b/kokoro/linux/php_all/presubmit.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/php_all/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/pull_request_in_docker.sh b/kokoro/linux/pull_request_in_docker.sh
deleted file mode 100755
index a048c47..0000000
--- a/kokoro/linux/pull_request_in_docker.sh
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/bin/bash
-#
-# This is the script that runs inside Docker, once the image has been built,
-# to execute all tests for the "pull request" project.
-
-WORKSPACE_BASE=`pwd`
-MY_DIR="$(dirname "$0")"
-TEST_SCRIPT=./tests.sh
-BUILD_DIR=/tmp/protobuf
-
-set -e # exit immediately on error
-set -x # display all commands
-
-# The protobuf repository is mounted into our Docker image, but read-only.
-# We clone into a directory inside Docker (this is faster than cp).
-rm -rf $BUILD_DIR
-mkdir -p $BUILD_DIR
-cd $BUILD_DIR
-git clone /var/local/kokoro/protobuf
-cd protobuf
-
-# Initialize any submodules:
-git submodule update --init --recursive
-
-$TEST_SCRIPT $TEST_SET
diff --git a/kokoro/linux/python310/build.sh b/kokoro/linux/python310/build.sh
deleted file mode 100755
index 0d8a2c9..0000000
--- a/kokoro/linux/python310/build.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "pull request" project:
-#
-# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image. Then we delegate to the general
-# build_and_run_docker.sh script.
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERHUB_ORGANIZATION=protobuftesting
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/python310
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="python310"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/python310/common.cfg b/kokoro/linux/python310/common.cfg
new file mode 100644
index 0000000..7e4a798
--- /dev/null
+++ b/kokoro/linux/python310/common.cfg
@@ -0,0 +1,21 @@
+# Config file for running tests in Kokoro
+
+# Location of the build script in repository
+build_file: "protobuf/kokoro/linux/bazel.sh"
+timeout_mins: 120
+
+env_vars {
+ key: "CONTAINER_IMAGE"
+ value: "gcr.io/protobuf-build/python/linux:3.10-2f706fd1ab49f4e97af769388be486069b63efee"
+}
+
+env_vars {
+ key: "BAZEL_TARGETS"
+ value: "//python/... @upb//python/..."
+}
+
+action {
+ define_artifacts {
+ regex: "**/sponge_log.*"
+ }
+}
diff --git a/kokoro/linux/python310/continuous.cfg b/kokoro/linux/python310/continuous.cfg
index 6ec74d8..8523c22 100644
--- a/kokoro/linux/python310/continuous.cfg
+++ b/kokoro/linux/python310/continuous.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/python310/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/python310/presubmit.cfg b/kokoro/linux/python310/presubmit.cfg
index 6ec74d8..8523c22 100644
--- a/kokoro/linux/python310/presubmit.cfg
+++ b/kokoro/linux/python310/presubmit.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/python310/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/python310_cpp/build.sh b/kokoro/linux/python310_cpp/build.sh
deleted file mode 100755
index 2903a2d..0000000
--- a/kokoro/linux/python310_cpp/build.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "pull request" project:
-#
-# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image. Then we delegate to the general
-# build_and_run_docker.sh script.
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERHUB_ORGANIZATION=protobuftesting
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/python310
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="python310_cpp"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/python310_cpp/common.cfg b/kokoro/linux/python310_cpp/common.cfg
new file mode 100644
index 0000000..5b87fd6
--- /dev/null
+++ b/kokoro/linux/python310_cpp/common.cfg
@@ -0,0 +1,27 @@
+# Config file for running tests in Kokoro
+
+# Location of the build script in repository
+build_file: "protobuf/kokoro/linux/bazel.sh"
+timeout_mins: 120
+
+env_vars {
+ key: "CONTAINER_IMAGE"
+ value: "gcr.io/protobuf-build/python/linux:3.10-2f706fd1ab49f4e97af769388be486069b63efee"
+}
+
+env_vars {
+ key: "BAZEL_TARGETS"
+ # Note: upb tests don't work since the C++ extension takes precedence here.
+ value: "//python/..."
+}
+
+env_vars {
+ key: "BAZEL_EXTRA_FLAGS"
+ value: "--define=use_fast_cpp_protos=true"
+}
+
+action {
+ define_artifacts {
+ regex: "**/sponge_log.*"
+ }
+}
diff --git a/kokoro/linux/python310_cpp/continuous.cfg b/kokoro/linux/python310_cpp/continuous.cfg
index 7ec8441..8523c22 100644
--- a/kokoro/linux/python310_cpp/continuous.cfg
+++ b/kokoro/linux/python310_cpp/continuous.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/python310_cpp/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/python310_cpp/presubmit.cfg b/kokoro/linux/python310_cpp/presubmit.cfg
index 7ec8441..8523c22 100644
--- a/kokoro/linux/python310_cpp/presubmit.cfg
+++ b/kokoro/linux/python310_cpp/presubmit.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/python310_cpp/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/python37/build.sh b/kokoro/linux/python37/build.sh
deleted file mode 100755
index 2117a27..0000000
--- a/kokoro/linux/python37/build.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "pull request" project:
-#
-# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image. Then we delegate to the general
-# build_and_run_docker.sh script.
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERHUB_ORGANIZATION=protobuftesting
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/python37
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="python37"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/python37/common.cfg b/kokoro/linux/python37/common.cfg
new file mode 100644
index 0000000..3ae100c
--- /dev/null
+++ b/kokoro/linux/python37/common.cfg
@@ -0,0 +1,21 @@
+# Config file for running tests in Kokoro
+
+# Location of the build script in repository
+build_file: "protobuf/kokoro/linux/bazel.sh"
+timeout_mins: 120
+
+env_vars {
+ key: "CONTAINER_IMAGE"
+ value: "gcr.io/protobuf-build/python/linux:3.7-2f706fd1ab49f4e97af769388be486069b63efee"
+}
+
+env_vars {
+ key: "BAZEL_TARGETS"
+ value: "//python/... @upb//python/..."
+}
+
+action {
+ define_artifacts {
+ regex: "**/sponge_log.*"
+ }
+}
diff --git a/kokoro/linux/python37/continuous.cfg b/kokoro/linux/python37/continuous.cfg
index 9fa20c1..8523c22 100644
--- a/kokoro/linux/python37/continuous.cfg
+++ b/kokoro/linux/python37/continuous.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/python37/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/python37/presubmit.cfg b/kokoro/linux/python37/presubmit.cfg
index 9fa20c1..8523c22 100644
--- a/kokoro/linux/python37/presubmit.cfg
+++ b/kokoro/linux/python37/presubmit.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/python37/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/python37_cpp/build.sh b/kokoro/linux/python37_cpp/build.sh
deleted file mode 100755
index 3126b48..0000000
--- a/kokoro/linux/python37_cpp/build.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "pull request" project:
-#
-# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image. Then we delegate to the general
-# build_and_run_docker.sh script.
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERHUB_ORGANIZATION=protobuftesting
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/python37
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="python37_cpp"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/python37_cpp/common.cfg b/kokoro/linux/python37_cpp/common.cfg
new file mode 100644
index 0000000..ebef928
--- /dev/null
+++ b/kokoro/linux/python37_cpp/common.cfg
@@ -0,0 +1,27 @@
+# Config file for running tests in Kokoro
+
+# Location of the build script in repository
+build_file: "protobuf/kokoro/linux/bazel.sh"
+timeout_mins: 120
+
+env_vars {
+ key: "CONTAINER_IMAGE"
+ value: "gcr.io/protobuf-build/python/linux:3.7-2f706fd1ab49f4e97af769388be486069b63efee"
+}
+
+env_vars {
+ key: "BAZEL_TARGETS"
+ # Note: upb tests don't work since the C++ extension takes precedence here.
+ value: "//python/..."
+}
+
+env_vars {
+ key: "BAZEL_EXTRA_FLAGS"
+ value: "--define=use_fast_cpp_protos=true"
+}
+
+action {
+ define_artifacts {
+ regex: "**/sponge_log.*"
+ }
+}
diff --git a/kokoro/linux/python37_cpp/continuous.cfg b/kokoro/linux/python37_cpp/continuous.cfg
index 49c441f..8523c22 100644
--- a/kokoro/linux/python37_cpp/continuous.cfg
+++ b/kokoro/linux/python37_cpp/continuous.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/python37_cpp/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/python37_cpp/presubmit.cfg b/kokoro/linux/python37_cpp/presubmit.cfg
index 49c441f..8523c22 100644
--- a/kokoro/linux/python37_cpp/presubmit.cfg
+++ b/kokoro/linux/python37_cpp/presubmit.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/python37_cpp/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/python38/build.sh b/kokoro/linux/python38/build.sh
deleted file mode 100755
index 299c7ba..0000000
--- a/kokoro/linux/python38/build.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "pull request" project:
-#
-# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image. Then we delegate to the general
-# build_and_run_docker.sh script.
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERHUB_ORGANIZATION=protobuftesting
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/python38
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="python38"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/python38/common.cfg b/kokoro/linux/python38/common.cfg
new file mode 100644
index 0000000..7d9e7aa
--- /dev/null
+++ b/kokoro/linux/python38/common.cfg
@@ -0,0 +1,21 @@
+# Config file for running tests in Kokoro
+
+# Location of the build script in repository
+build_file: "protobuf/kokoro/linux/bazel.sh"
+timeout_mins: 120
+
+env_vars {
+ key: "CONTAINER_IMAGE"
+ value: "gcr.io/protobuf-build/python/linux:3.8-2f706fd1ab49f4e97af769388be486069b63efee"
+}
+
+env_vars {
+ key: "BAZEL_TARGETS"
+ value: "//python/... @upb//python/..."
+}
+
+action {
+ define_artifacts {
+ regex: "**/sponge_log.*"
+ }
+}
diff --git a/kokoro/linux/python38/continuous.cfg b/kokoro/linux/python38/continuous.cfg
index 76425d2..8523c22 100644
--- a/kokoro/linux/python38/continuous.cfg
+++ b/kokoro/linux/python38/continuous.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/python38/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/python38/presubmit.cfg b/kokoro/linux/python38/presubmit.cfg
index 76425d2..8523c22 100644
--- a/kokoro/linux/python38/presubmit.cfg
+++ b/kokoro/linux/python38/presubmit.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/python38/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/python38_cpp/build.sh b/kokoro/linux/python38_cpp/build.sh
deleted file mode 100755
index b43859b..0000000
--- a/kokoro/linux/python38_cpp/build.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "pull request" project:
-#
-# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image. Then we delegate to the general
-# build_and_run_docker.sh script.
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERHUB_ORGANIZATION=protobuftesting
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/python38
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="python38_cpp"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/python38_cpp/common.cfg b/kokoro/linux/python38_cpp/common.cfg
new file mode 100644
index 0000000..decd466
--- /dev/null
+++ b/kokoro/linux/python38_cpp/common.cfg
@@ -0,0 +1,27 @@
+# Config file for running tests in Kokoro
+
+# Location of the build script in repository
+build_file: "protobuf/kokoro/linux/bazel.sh"
+timeout_mins: 120
+
+env_vars {
+ key: "CONTAINER_IMAGE"
+ value: "gcr.io/protobuf-build/python/linux:3.8-2f706fd1ab49f4e97af769388be486069b63efee"
+}
+
+env_vars {
+ key: "BAZEL_TARGETS"
+ # Note: upb tests don't work since the C++ extension takes precedence here.
+ value: "//python/..."
+}
+
+env_vars {
+ key: "BAZEL_EXTRA_FLAGS"
+ value: "--define=use_fast_cpp_protos=true"
+}
+
+action {
+ define_artifacts {
+ regex: "**/sponge_log.*"
+ }
+}
diff --git a/kokoro/linux/python38_cpp/continuous.cfg b/kokoro/linux/python38_cpp/continuous.cfg
index 1e8888c..8523c22 100644
--- a/kokoro/linux/python38_cpp/continuous.cfg
+++ b/kokoro/linux/python38_cpp/continuous.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/python38_cpp/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/python38_cpp/presubmit.cfg b/kokoro/linux/python38_cpp/presubmit.cfg
index 1e8888c..8523c22 100644
--- a/kokoro/linux/python38_cpp/presubmit.cfg
+++ b/kokoro/linux/python38_cpp/presubmit.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/python38_cpp/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/python39/build.sh b/kokoro/linux/python39/build.sh
deleted file mode 100755
index 497dc66..0000000
--- a/kokoro/linux/python39/build.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "pull request" project:
-#
-# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image. Then we delegate to the general
-# build_and_run_docker.sh script.
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERHUB_ORGANIZATION=protobuftesting
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/python39
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="python39"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/python39/common.cfg b/kokoro/linux/python39/common.cfg
new file mode 100644
index 0000000..5133ab5
--- /dev/null
+++ b/kokoro/linux/python39/common.cfg
@@ -0,0 +1,21 @@
+# Config file for running tests in Kokoro
+
+# Location of the build script in repository
+build_file: "protobuf/kokoro/linux/bazel.sh"
+timeout_mins: 120
+
+env_vars {
+ key: "CONTAINER_IMAGE"
+ value: "gcr.io/protobuf-build/python/linux:3.9-2f706fd1ab49f4e97af769388be486069b63efee"
+}
+
+env_vars {
+ key: "BAZEL_TARGETS"
+ value: "//python/... @upb//python/..."
+}
+
+action {
+ define_artifacts {
+ regex: "**/sponge_log.*"
+ }
+}
diff --git a/kokoro/linux/python39/continuous.cfg b/kokoro/linux/python39/continuous.cfg
index b03bc90..8523c22 100644
--- a/kokoro/linux/python39/continuous.cfg
+++ b/kokoro/linux/python39/continuous.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/python39/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/python39/presubmit.cfg b/kokoro/linux/python39/presubmit.cfg
index b03bc90..8523c22 100644
--- a/kokoro/linux/python39/presubmit.cfg
+++ b/kokoro/linux/python39/presubmit.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/python39/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/python39_cpp/build.sh b/kokoro/linux/python39_cpp/build.sh
deleted file mode 100755
index f45d2ec..0000000
--- a/kokoro/linux/python39_cpp/build.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "pull request" project:
-#
-# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image. Then we delegate to the general
-# build_and_run_docker.sh script.
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERHUB_ORGANIZATION=protobuftesting
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/python39
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="python39_cpp"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/python39_cpp/common.cfg b/kokoro/linux/python39_cpp/common.cfg
new file mode 100644
index 0000000..9797008
--- /dev/null
+++ b/kokoro/linux/python39_cpp/common.cfg
@@ -0,0 +1,27 @@
+# Config file for running tests in Kokoro
+
+# Location of the build script in repository
+build_file: "protobuf/kokoro/linux/bazel.sh"
+timeout_mins: 120
+
+env_vars {
+ key: "CONTAINER_IMAGE"
+ value: "gcr.io/protobuf-build/python/linux:3.9-2f706fd1ab49f4e97af769388be486069b63efee"
+}
+
+env_vars {
+ key: "BAZEL_TARGETS"
+ # Note: upb tests don't work since the C++ extension takes precedence here.
+ value: "//python/..."
+}
+
+env_vars {
+ key: "BAZEL_EXTRA_FLAGS"
+ value: "--define=use_fast_cpp_protos=true"
+}
+
+action {
+ define_artifacts {
+ regex: "**/sponge_log.*"
+ }
+}
diff --git a/kokoro/linux/python39_cpp/continuous.cfg b/kokoro/linux/python39_cpp/continuous.cfg
index dd84fbe..8523c22 100644
--- a/kokoro/linux/python39_cpp/continuous.cfg
+++ b/kokoro/linux/python39_cpp/continuous.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/python39_cpp/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/python39_cpp/presubmit.cfg b/kokoro/linux/python39_cpp/presubmit.cfg
index dd84fbe..8523c22 100644
--- a/kokoro/linux/python39_cpp/presubmit.cfg
+++ b/kokoro/linux/python39_cpp/presubmit.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/python39_cpp/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/benchmark/continuous.cfg b/kokoro/linux/python_aarch64/common.cfg
similarity index 66%
copy from kokoro/linux/benchmark/continuous.cfg
copy to kokoro/linux/python_aarch64/common.cfg
index 8cc8f96..dee4a47 100644
--- a/kokoro/linux/benchmark/continuous.cfg
+++ b/kokoro/linux/python_aarch64/common.cfg
@@ -1,8 +1,8 @@
# Config file for running tests in Kokoro
# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/benchmark/build.sh"
-timeout_mins: 240
+build_file: "protobuf/kokoro/linux/python_aarch64/build.sh"
+timeout_mins: 120
action {
define_artifacts {
diff --git a/kokoro/linux/python_aarch64/continuous.cfg b/kokoro/linux/python_aarch64/continuous.cfg
index dee4a47..8523c22 100644
--- a/kokoro/linux/python_aarch64/continuous.cfg
+++ b/kokoro/linux/python_aarch64/continuous.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/python_aarch64/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/python_aarch64/presubmit.cfg b/kokoro/linux/python_aarch64/presubmit.cfg
index dee4a47..8523c22 100644
--- a/kokoro/linux/python_aarch64/presubmit.cfg
+++ b/kokoro/linux/python_aarch64/presubmit.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/python_aarch64/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/ruby25/build.sh b/kokoro/linux/ruby25/build.sh
deleted file mode 100755
index 1e82ec5..0000000
--- a/kokoro/linux/ruby25/build.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "pull request" project:
-#
-# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image. Then we delegate to the general
-# build_and_run_docker.sh script.
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERHUB_ORGANIZATION=protobuftesting
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/ruby
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="ruby25"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/ruby25/common.cfg b/kokoro/linux/ruby25/common.cfg
new file mode 100644
index 0000000..ec975cd
--- /dev/null
+++ b/kokoro/linux/ruby25/common.cfg
@@ -0,0 +1,26 @@
+# Config file for running tests in Kokoro
+
+# Location of the build script in repository
+build_file: "protobuf/kokoro/linux/bazel.sh"
+timeout_mins: 120
+
+env_vars {
+ key: "CONTAINER_IMAGE"
+ value: "gcr.io/protobuf-build/ruby/linux:ruby-2.5.1-64e8944e4f18d7d6c9649112a8a93be57e693cd8"
+}
+
+env_vars {
+ key: "BAZEL_TARGETS"
+ value: "//ruby/..."
+}
+
+env_vars {
+ key: "BAZEL_EXTRA_FLAGS"
+ value: "--define=ruby_platform=c"
+}
+
+action {
+ define_artifacts {
+ regex: "**/sponge_log.*"
+ }
+}
diff --git a/kokoro/linux/ruby25/continuous.cfg b/kokoro/linux/ruby25/continuous.cfg
index dee2db0..8523c22 100644
--- a/kokoro/linux/ruby25/continuous.cfg
+++ b/kokoro/linux/ruby25/continuous.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/ruby25/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/ruby25/presubmit.cfg b/kokoro/linux/ruby25/presubmit.cfg
index dee2db0..8523c22 100644
--- a/kokoro/linux/ruby25/presubmit.cfg
+++ b/kokoro/linux/ruby25/presubmit.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/ruby25/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/ruby26/build.sh b/kokoro/linux/ruby26/build.sh
deleted file mode 100755
index 72d2d45..0000000
--- a/kokoro/linux/ruby26/build.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "pull request" project:
-#
-# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image. Then we delegate to the general
-# build_and_run_docker.sh script.
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERHUB_ORGANIZATION=protobuftesting
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/ruby
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="ruby26"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/ruby26/common.cfg b/kokoro/linux/ruby26/common.cfg
new file mode 100644
index 0000000..d09a405
--- /dev/null
+++ b/kokoro/linux/ruby26/common.cfg
@@ -0,0 +1,26 @@
+# Config file for running tests in Kokoro
+
+# Location of the build script in repository
+build_file: "protobuf/kokoro/linux/bazel.sh"
+timeout_mins: 120
+
+env_vars {
+ key: "CONTAINER_IMAGE"
+ value: "gcr.io/protobuf-build/ruby/linux:ruby-2.6.0-64e8944e4f18d7d6c9649112a8a93be57e693cd8"
+}
+
+env_vars {
+ key: "BAZEL_TARGETS"
+ value: "//ruby/..."
+}
+
+env_vars {
+ key: "BAZEL_EXTRA_FLAGS"
+ value: "--define=ruby_platform=c"
+}
+
+action {
+ define_artifacts {
+ regex: "**/sponge_log.*"
+ }
+}
diff --git a/kokoro/linux/ruby26/continuous.cfg b/kokoro/linux/ruby26/continuous.cfg
index 4779065..8523c22 100644
--- a/kokoro/linux/ruby26/continuous.cfg
+++ b/kokoro/linux/ruby26/continuous.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/ruby26/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/ruby26/presubmit.cfg b/kokoro/linux/ruby26/presubmit.cfg
index 4779065..8523c22 100644
--- a/kokoro/linux/ruby26/presubmit.cfg
+++ b/kokoro/linux/ruby26/presubmit.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/ruby26/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/ruby27/build.sh b/kokoro/linux/ruby27/build.sh
deleted file mode 100755
index c38ee36..0000000
--- a/kokoro/linux/ruby27/build.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "pull request" project:
-#
-# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image. Then we delegate to the general
-# build_and_run_docker.sh script.
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERHUB_ORGANIZATION=protobuftesting
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/ruby
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="ruby27"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/ruby27/common.cfg b/kokoro/linux/ruby27/common.cfg
new file mode 100644
index 0000000..51afa75
--- /dev/null
+++ b/kokoro/linux/ruby27/common.cfg
@@ -0,0 +1,26 @@
+# Config file for running tests in Kokoro
+
+# Location of the build script in repository
+build_file: "protobuf/kokoro/linux/bazel.sh"
+timeout_mins: 120
+
+env_vars {
+ key: "CONTAINER_IMAGE"
+ value: "gcr.io/protobuf-build/ruby/linux:ruby-2.7.0-64e8944e4f18d7d6c9649112a8a93be57e693cd8"
+}
+
+env_vars {
+ key: "BAZEL_TARGETS"
+ value: "//ruby/..."
+}
+
+env_vars {
+ key: "BAZEL_EXTRA_FLAGS"
+ value: "--define=ruby_platform=c"
+}
+
+action {
+ define_artifacts {
+ regex: "**/sponge_log.*"
+ }
+}
diff --git a/kokoro/linux/ruby27/continuous.cfg b/kokoro/linux/ruby27/continuous.cfg
index 9cce8c9..8523c22 100644
--- a/kokoro/linux/ruby27/continuous.cfg
+++ b/kokoro/linux/ruby27/continuous.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/ruby27/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/ruby27/presubmit.cfg b/kokoro/linux/ruby27/presubmit.cfg
index 9cce8c9..8523c22 100644
--- a/kokoro/linux/ruby27/presubmit.cfg
+++ b/kokoro/linux/ruby27/presubmit.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/ruby27/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/ruby30/build.sh b/kokoro/linux/ruby30/build.sh
deleted file mode 100755
index 9e44575..0000000
--- a/kokoro/linux/ruby30/build.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "pull request" project:
-#
-# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image. Then we delegate to the general
-# build_and_run_docker.sh script.
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERHUB_ORGANIZATION=protobuftesting
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/ruby
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="ruby30"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/ruby30/common.cfg b/kokoro/linux/ruby30/common.cfg
new file mode 100644
index 0000000..338505e
--- /dev/null
+++ b/kokoro/linux/ruby30/common.cfg
@@ -0,0 +1,26 @@
+# Config file for running tests in Kokoro
+
+# Location of the build script in repository
+build_file: "protobuf/kokoro/linux/bazel.sh"
+timeout_mins: 120
+
+env_vars {
+ key: "CONTAINER_IMAGE"
+ value: "gcr.io/protobuf-build/ruby/linux:ruby-3.0.2-2f706fd1ab49f4e97af769388be486069b63efee"
+}
+
+env_vars {
+ key: "BAZEL_TARGETS"
+ value: "//ruby/..."
+}
+
+env_vars {
+ key: "BAZEL_EXTRA_FLAGS"
+ value: "--define=ruby_platform=c"
+}
+
+action {
+ define_artifacts {
+ regex: "**/sponge_log.*"
+ }
+}
diff --git a/kokoro/linux/ruby30/continuous.cfg b/kokoro/linux/ruby30/continuous.cfg
index b03a335..8523c22 100644
--- a/kokoro/linux/ruby30/continuous.cfg
+++ b/kokoro/linux/ruby30/continuous.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/ruby30/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/ruby30/presubmit.cfg b/kokoro/linux/ruby30/presubmit.cfg
index b03a335..8523c22 100644
--- a/kokoro/linux/ruby30/presubmit.cfg
+++ b/kokoro/linux/ruby30/presubmit.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/ruby30/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/ruby31/build.sh b/kokoro/linux/ruby31/build.sh
deleted file mode 100644
index c22bdae..0000000
--- a/kokoro/linux/ruby31/build.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "pull request" project:
-#
-# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image. Then we delegate to the general
-# build_and_run_docker.sh script.
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERHUB_ORGANIZATION=protobuftesting
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/ruby
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="ruby31"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/ruby31/common.cfg b/kokoro/linux/ruby31/common.cfg
new file mode 100644
index 0000000..588fe13
--- /dev/null
+++ b/kokoro/linux/ruby31/common.cfg
@@ -0,0 +1,26 @@
+# Config file for running tests in Kokoro
+
+# Location of the build script in repository
+build_file: "protobuf/kokoro/linux/bazel.sh"
+timeout_mins: 120
+
+env_vars {
+ key: "CONTAINER_IMAGE"
+ value: "gcr.io/protobuf-build/ruby/linux:ruby-3.1.0-64e8944e4f18d7d6c9649112a8a93be57e693cd8"
+}
+
+env_vars {
+ key: "BAZEL_TARGETS"
+ value: "//ruby/..."
+}
+
+env_vars {
+ key: "BAZEL_EXTRA_FLAGS"
+ value: "--define=ruby_platform=c"
+}
+
+action {
+ define_artifacts {
+ regex: "**/sponge_log.*"
+ }
+}
diff --git a/kokoro/linux/ruby31/continuous.cfg b/kokoro/linux/ruby31/continuous.cfg
index 0477912..8523c22 100644
--- a/kokoro/linux/ruby31/continuous.cfg
+++ b/kokoro/linux/ruby31/continuous.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/ruby31/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/ruby31/presubmit.cfg b/kokoro/linux/ruby31/presubmit.cfg
index 0477912..8523c22 100644
--- a/kokoro/linux/ruby31/presubmit.cfg
+++ b/kokoro/linux/ruby31/presubmit.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/ruby31/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/benchmark/continuous.cfg b/kokoro/linux/ruby_aarch64/common.cfg
similarity index 66%
copy from kokoro/linux/benchmark/continuous.cfg
copy to kokoro/linux/ruby_aarch64/common.cfg
index 8cc8f96..ae82696 100644
--- a/kokoro/linux/benchmark/continuous.cfg
+++ b/kokoro/linux/ruby_aarch64/common.cfg
@@ -1,8 +1,8 @@
# Config file for running tests in Kokoro
# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/benchmark/build.sh"
-timeout_mins: 240
+build_file: "protobuf/kokoro/linux/ruby_aarch64/build.sh"
+timeout_mins: 120
action {
define_artifacts {
diff --git a/kokoro/linux/ruby_aarch64/continuous.cfg b/kokoro/linux/ruby_aarch64/continuous.cfg
index ae82696..8523c22 100644
--- a/kokoro/linux/ruby_aarch64/continuous.cfg
+++ b/kokoro/linux/ruby_aarch64/continuous.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/ruby_aarch64/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/linux/ruby_aarch64/presubmit.cfg b/kokoro/linux/ruby_aarch64/presubmit.cfg
index ae82696..8523c22 100644
--- a/kokoro/linux/ruby_aarch64/presubmit.cfg
+++ b/kokoro/linux/ruby_aarch64/presubmit.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/ruby_aarch64/build.sh"
-timeout_mins: 120
-
-action {
- define_artifacts {
- regex: "**/sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/macos-next/cpp/build.sh b/kokoro/macos-next/cpp/build.sh
index 490e990..451c850 100755
--- a/kokoro/macos-next/cpp/build.sh
+++ b/kokoro/macos-next/cpp/build.sh
@@ -9,47 +9,21 @@
cd /Volumes/BuildData/tmpfs/src
fi
-# These vars can be changed when running manually, e.g.:
-#
-# % BUILD_CONFIG=RelWithDebInfo path/to/build.sh
+# Default environment variables used by cmake build:
+: ${CMAKE_CONFIG_TYPE:=Debug}
+export CMAKE_CONFIG_TYPE
+: ${CTEST_PARALLEL_LEVEL:=4}
+export CTEST_PARALLEL_LEVEL
-# By default, build using Debug config.
-: ${BUILD_CONFIG:=Debug}
-
-# By default, find the sources based on this script path.
-: ${SOURCE_DIR:=$(cd $(dirname $0)/../../..; pwd)}
-
-# By default, put outputs under <git root>/cmake/build.
-: ${BUILD_DIR:=${SOURCE_DIR}/cmake/build}
-
-source ${SOURCE_DIR}/kokoro/caplog.sh
+# Run from the project root directory.
+cd $(dirname $0)/../../..
#
# Update submodules
#
-git -C "${SOURCE_DIR}" submodule update --init --recursive
+git submodule update --init --recursive
#
-# Configure and build in a separate directory
+# Run build
#
-mkdir -p "${BUILD_DIR}"
-
-caplog 01_configure \
- cmake -S "${SOURCE_DIR}" -B "${BUILD_DIR}" ${CAPLOG_CMAKE_ARGS:-}
-
-if [[ -n ${CAPLOG_DIR:-} ]]; then
- mkdir -p "${CAPLOG_DIR}/CMakeFiles"
- cp "${BUILD_DIR}"/CMakeFiles/CMake*.log "${CAPLOG_DIR}/CMakeFiles"
-fi
-
-caplog 02_build \
- cmake --build "${BUILD_DIR}" --config "${BUILD_CONFIG}"
-
-#
-# Run tests
-#
-(
- cd "${BUILD_DIR}"
- caplog 03_combined_testlog \
- ctest -C "${BUILD_CONFIG}" -j4 ${CAPLOG_CTEST_ARGS:-}
-)
+kokoro/common/cmake.sh
diff --git a/kokoro/macos-next/cpp/common.cfg b/kokoro/macos-next/cpp/common.cfg
new file mode 100644
index 0000000..166caa5
--- /dev/null
+++ b/kokoro/macos-next/cpp/common.cfg
@@ -0,0 +1,13 @@
+# Config file for running tests in Kokoro
+
+# Location of the build script in repository
+build_file: "protobuf/kokoro/macos-next/cpp/build.sh"
+timeout_mins: 1440
+
+# Upload logs
+action: {
+ define_artifacts: {
+ regex: "**/*sponge_log.log"
+ regex: "**/*sponge_log.xml"
+ }
+}
diff --git a/kokoro/macos-next/cpp/continuous.cfg b/kokoro/macos-next/cpp/continuous.cfg
index 166caa5..8523c22 100644
--- a/kokoro/macos-next/cpp/continuous.cfg
+++ b/kokoro/macos-next/cpp/continuous.cfg
@@ -1,13 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos-next/cpp/build.sh"
-timeout_mins: 1440
-
-# Upload logs
-action: {
- define_artifacts: {
- regex: "**/*sponge_log.log"
- regex: "**/*sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/macos-next/cpp/presubmit.cfg b/kokoro/macos-next/cpp/presubmit.cfg
index 166caa5..8523c22 100644
--- a/kokoro/macos-next/cpp/presubmit.cfg
+++ b/kokoro/macos-next/cpp/presubmit.cfg
@@ -1,13 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos-next/cpp/build.sh"
-timeout_mins: 1440
-
-# Upload logs
-action: {
- define_artifacts: {
- regex: "**/*sponge_log.log"
- regex: "**/*sponge_log.xml"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/macos/cpp/build.sh b/kokoro/macos/cpp/build.sh
index bae2ebb..7c21d48 100755
--- a/kokoro/macos/cpp/build.sh
+++ b/kokoro/macos/cpp/build.sh
@@ -2,10 +2,16 @@
#
# Build file to set up and run tests
-# Change to repo root
+set -eux
+set -o pipefail
+
+# Run from the project root directory.
cd $(dirname $0)/../../..
# Prepare worker environment to run tests
source kokoro/macos/prepare_build_macos_rc
-./tests.sh cpp
+#
+# Run build
+#
+bazel test //src/... -k --test_output=streamed
diff --git a/kokoro/macos/php7.3_mac/continuous.cfg b/kokoro/macos/cpp/common.cfg
similarity index 65%
copy from kokoro/macos/php7.3_mac/continuous.cfg
copy to kokoro/macos/cpp/common.cfg
index 9a71745..4bea1cb 100644
--- a/kokoro/macos/php7.3_mac/continuous.cfg
+++ b/kokoro/macos/cpp/common.cfg
@@ -1,5 +1,5 @@
# Config file for running tests in Kokoro
# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/php7.3_mac/build.sh"
+build_file: "protobuf/kokoro/macos/cpp/build.sh"
timeout_mins: 1440
diff --git a/kokoro/macos/cpp/continuous.cfg b/kokoro/macos/cpp/continuous.cfg
index 4bea1cb..8523c22 100644
--- a/kokoro/macos/cpp/continuous.cfg
+++ b/kokoro/macos/cpp/continuous.cfg
@@ -1,5 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/cpp/build.sh"
-timeout_mins: 1440
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/macos/cpp/presubmit.cfg b/kokoro/macos/cpp/presubmit.cfg
index 4bea1cb..8523c22 100644
--- a/kokoro/macos/cpp/presubmit.cfg
+++ b/kokoro/macos/cpp/presubmit.cfg
@@ -1,5 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/cpp/build.sh"
-timeout_mins: 1440
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/macos/cpp_distcheck/build.sh b/kokoro/macos/cpp_distcheck/build.sh
deleted file mode 100755
index d729b63..0000000
--- a/kokoro/macos/cpp_distcheck/build.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/bash
-#
-# Build file to set up and run tests
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-# Prepare worker environment to run tests
-source kokoro/macos/prepare_build_macos_rc
-
-./tests.sh cpp_distcheck
diff --git a/kokoro/macos/cpp_distcheck/continuous.cfg b/kokoro/macos/cpp_distcheck/continuous.cfg
deleted file mode 100644
index 89441bc..0000000
--- a/kokoro/macos/cpp_distcheck/continuous.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/cpp_distcheck/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/macos/cpp_distcheck/presubmit.cfg b/kokoro/macos/cpp_distcheck/presubmit.cfg
deleted file mode 100644
index 89441bc..0000000
--- a/kokoro/macos/cpp_distcheck/presubmit.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/cpp_distcheck/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/macos/objectivec_ios_debug/build.sh b/kokoro/macos/objectivec_ios_debug/build.sh
index 1055d72..77b704f 100755
--- a/kokoro/macos/objectivec_ios_debug/build.sh
+++ b/kokoro/macos/objectivec_ios_debug/build.sh
@@ -8,4 +8,5 @@
# Prepare worker environment to run tests
source kokoro/macos/prepare_build_macos_rc
-./tests.sh objectivec_ios_debug
+objectivec/DevTools/full_mac_build.sh \
+ --core-only --skip-xcode-osx --skip-xcode-tvos --skip-objc-conformance --skip-xcode-release
diff --git a/kokoro/macos/php7.3_mac/continuous.cfg b/kokoro/macos/objectivec_ios_debug/common.cfg
similarity index 61%
copy from kokoro/macos/php7.3_mac/continuous.cfg
copy to kokoro/macos/objectivec_ios_debug/common.cfg
index 9a71745..473d545 100644
--- a/kokoro/macos/php7.3_mac/continuous.cfg
+++ b/kokoro/macos/objectivec_ios_debug/common.cfg
@@ -1,5 +1,5 @@
# Config file for running tests in Kokoro
# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/php7.3_mac/build.sh"
+build_file: "protobuf/kokoro/macos/objectivec_ios_debug/build.sh"
timeout_mins: 1440
diff --git a/kokoro/macos/objectivec_ios_debug/continuous.cfg b/kokoro/macos/objectivec_ios_debug/continuous.cfg
index 473d545..8523c22 100644
--- a/kokoro/macos/objectivec_ios_debug/continuous.cfg
+++ b/kokoro/macos/objectivec_ios_debug/continuous.cfg
@@ -1,5 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/objectivec_ios_debug/build.sh"
-timeout_mins: 1440
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/macos/objectivec_ios_debug/presubmit.cfg b/kokoro/macos/objectivec_ios_debug/presubmit.cfg
index 473d545..8523c22 100644
--- a/kokoro/macos/objectivec_ios_debug/presubmit.cfg
+++ b/kokoro/macos/objectivec_ios_debug/presubmit.cfg
@@ -1,5 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/objectivec_ios_debug/build.sh"
-timeout_mins: 1440
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/macos/objectivec_ios_release/build.sh b/kokoro/macos/objectivec_ios_release/build.sh
index 76ce3ba..adbc4f2 100755
--- a/kokoro/macos/objectivec_ios_release/build.sh
+++ b/kokoro/macos/objectivec_ios_release/build.sh
@@ -8,4 +8,5 @@
# Prepare worker environment to run tests
source kokoro/macos/prepare_build_macos_rc
-./tests.sh objectivec_ios_release
+objectivec/DevTools/full_mac_build.sh \
+ --core-only --skip-xcode-osx --skip-xcode-tvos --skip-objc-conformance --skip-xcode-debug
diff --git a/kokoro/macos/php7.3_mac/continuous.cfg b/kokoro/macos/objectivec_ios_release/common.cfg
similarity index 60%
copy from kokoro/macos/php7.3_mac/continuous.cfg
copy to kokoro/macos/objectivec_ios_release/common.cfg
index 9a71745..3cbfb68 100644
--- a/kokoro/macos/php7.3_mac/continuous.cfg
+++ b/kokoro/macos/objectivec_ios_release/common.cfg
@@ -1,5 +1,5 @@
# Config file for running tests in Kokoro
# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/php7.3_mac/build.sh"
+build_file: "protobuf/kokoro/macos/objectivec_ios_release/build.sh"
timeout_mins: 1440
diff --git a/kokoro/macos/objectivec_ios_release/continuous.cfg b/kokoro/macos/objectivec_ios_release/continuous.cfg
index 3cbfb68..8523c22 100644
--- a/kokoro/macos/objectivec_ios_release/continuous.cfg
+++ b/kokoro/macos/objectivec_ios_release/continuous.cfg
@@ -1,5 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/objectivec_ios_release/build.sh"
-timeout_mins: 1440
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/macos/objectivec_ios_release/presubmit.cfg b/kokoro/macos/objectivec_ios_release/presubmit.cfg
index 3cbfb68..8523c22 100644
--- a/kokoro/macos/objectivec_ios_release/presubmit.cfg
+++ b/kokoro/macos/objectivec_ios_release/presubmit.cfg
@@ -1,5 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/objectivec_ios_release/build.sh"
-timeout_mins: 1440
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/macos/objectivec_osx/build.sh b/kokoro/macos/objectivec_osx/build.sh
index 000be27..7f5d561 100755
--- a/kokoro/macos/objectivec_osx/build.sh
+++ b/kokoro/macos/objectivec_osx/build.sh
@@ -8,4 +8,5 @@
# Prepare worker environment to run tests
source kokoro/macos/prepare_build_macos_rc
-./tests.sh objectivec_osx
+objectivec/DevTools/full_mac_build.sh \
+ --core-only --skip-xcode-ios --skip-xcode-tvos
diff --git a/kokoro/macos/php7.3_mac/continuous.cfg b/kokoro/macos/objectivec_osx/common.cfg
similarity index 63%
copy from kokoro/macos/php7.3_mac/continuous.cfg
copy to kokoro/macos/objectivec_osx/common.cfg
index 9a71745..41bd46a 100644
--- a/kokoro/macos/php7.3_mac/continuous.cfg
+++ b/kokoro/macos/objectivec_osx/common.cfg
@@ -1,5 +1,5 @@
# Config file for running tests in Kokoro
# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/php7.3_mac/build.sh"
+build_file: "protobuf/kokoro/macos/objectivec_osx/build.sh"
timeout_mins: 1440
diff --git a/kokoro/macos/objectivec_osx/continuous.cfg b/kokoro/macos/objectivec_osx/continuous.cfg
index 41bd46a..8523c22 100644
--- a/kokoro/macos/objectivec_osx/continuous.cfg
+++ b/kokoro/macos/objectivec_osx/continuous.cfg
@@ -1,5 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/objectivec_osx/build.sh"
-timeout_mins: 1440
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/macos/objectivec_osx/presubmit.cfg b/kokoro/macos/objectivec_osx/presubmit.cfg
index 41bd46a..8523c22 100644
--- a/kokoro/macos/objectivec_osx/presubmit.cfg
+++ b/kokoro/macos/objectivec_osx/presubmit.cfg
@@ -1,5 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/objectivec_osx/build.sh"
-timeout_mins: 1440
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/macos/php7.0_mac/build.sh b/kokoro/macos/php7.0_mac/build.sh
deleted file mode 100755
index c6717e0..0000000
--- a/kokoro/macos/php7.0_mac/build.sh
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/bash
-#
-# Build file to set up and run tests
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-# Prepare worker environment to run tests
-source kokoro/macos/prepare_build_macos_rc
-
-# TODO(mkruskal) Re-enable this once we can get a working PHP 7.0 installed.
-#./tests.sh php7.0_mac
diff --git a/kokoro/macos/php7.0_mac/continuous.cfg b/kokoro/macos/php7.0_mac/continuous.cfg
deleted file mode 100644
index c2c1811..0000000
--- a/kokoro/macos/php7.0_mac/continuous.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/php7.0_mac/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/macos/php7.0_mac/presubmit.cfg b/kokoro/macos/php7.0_mac/presubmit.cfg
deleted file mode 100644
index c2c1811..0000000
--- a/kokoro/macos/php7.0_mac/presubmit.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/php7.0_mac/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/macos/php7.3_mac/build.sh b/kokoro/macos/php7.3_mac/build.sh
deleted file mode 100755
index 2688ddb..0000000
--- a/kokoro/macos/php7.3_mac/build.sh
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/bash
-#
-# Build file to set up and run tests
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-# Prepare worker environment to run tests
-source kokoro/macos/prepare_build_macos_rc
-
-# TODO(mkruskal) Re-enable this once we can get a working PHP 7.0 installed.
-#./tests.sh php7.3_mac
diff --git a/kokoro/macos/php7.3_mac/presubmit.cfg b/kokoro/macos/php7.3_mac/presubmit.cfg
deleted file mode 100644
index 9a71745..0000000
--- a/kokoro/macos/php7.3_mac/presubmit.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/php7.3_mac/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/macos/php74/build.sh b/kokoro/macos/php74/build.sh
new file mode 100755
index 0000000..2ad4eab
--- /dev/null
+++ b/kokoro/macos/php74/build.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+#
+# Build file to set up and run tests
+
+# Change to repo root
+cd $(dirname $0)/../../..
+
+# Prepare worker environment to run tests
+source kokoro/macos/prepare_build_macos_rc
+
+# Install Dependencies
+brew cleanup
+brew install coreutils php@7.4
+
+# Configure path
+PHP_FOLDER=$(find $HOMEBREW_PREFIX -type d -regex ".*php.*/7.4.[0-9_.]*" | sort -n | tail -n 1)
+test ! -z "$PHP_FOLDER"
+export PATH="$PHP_FOLDER/bin:$PATH"
+
+# Test
+kokoro/macos/test_php.sh
diff --git a/kokoro/macos/php7.3_mac/continuous.cfg b/kokoro/macos/php74/common.cfg
similarity index 65%
copy from kokoro/macos/php7.3_mac/continuous.cfg
copy to kokoro/macos/php74/common.cfg
index 9a71745..cf7e80b 100644
--- a/kokoro/macos/php7.3_mac/continuous.cfg
+++ b/kokoro/macos/php74/common.cfg
@@ -1,5 +1,5 @@
# Config file for running tests in Kokoro
# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/php7.3_mac/build.sh"
+build_file: "protobuf/kokoro/macos/php74/build.sh"
timeout_mins: 1440
diff --git a/kokoro/macos/php74/continuous.cfg b/kokoro/macos/php74/continuous.cfg
new file mode 100644
index 0000000..8523c22
--- /dev/null
+++ b/kokoro/macos/php74/continuous.cfg
@@ -0,0 +1 @@
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/macos/php74/presubmit.cfg b/kokoro/macos/php74/presubmit.cfg
new file mode 100644
index 0000000..8523c22
--- /dev/null
+++ b/kokoro/macos/php74/presubmit.cfg
@@ -0,0 +1 @@
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/macos/php80/build.sh b/kokoro/macos/php80/build.sh
new file mode 100755
index 0000000..e703ffc
--- /dev/null
+++ b/kokoro/macos/php80/build.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+#
+# Build file to set up and run tests
+
+# Change to repo root
+cd $(dirname $0)/../../..
+
+# Prepare worker environment to run tests
+source kokoro/macos/prepare_build_macos_rc
+
+# Install Dependencies
+brew cleanup
+brew install coreutils php@8.0
+
+# Configure path
+PHP_FOLDER=$(find $HOMEBREW_PREFIX -type d -regex ".*php.*/8.0.[0-9_.]*" | sort -n | tail -n 1)
+test ! -z "$PHP_FOLDER"
+export PATH="$PHP_FOLDER/bin:$PATH"
+
+# Test
+kokoro/macos/test_php.sh
diff --git a/kokoro/macos/php7.3_mac/continuous.cfg b/kokoro/macos/php80/common.cfg
similarity index 65%
copy from kokoro/macos/php7.3_mac/continuous.cfg
copy to kokoro/macos/php80/common.cfg
index 9a71745..ded43e6 100644
--- a/kokoro/macos/php7.3_mac/continuous.cfg
+++ b/kokoro/macos/php80/common.cfg
@@ -1,5 +1,5 @@
# Config file for running tests in Kokoro
# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/php7.3_mac/build.sh"
+build_file: "protobuf/kokoro/macos/php80/build.sh"
timeout_mins: 1440
diff --git a/kokoro/macos/php80/continuous.cfg b/kokoro/macos/php80/continuous.cfg
new file mode 100644
index 0000000..8523c22
--- /dev/null
+++ b/kokoro/macos/php80/continuous.cfg
@@ -0,0 +1 @@
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/macos/php80/presubmit.cfg b/kokoro/macos/php80/presubmit.cfg
new file mode 100644
index 0000000..8523c22
--- /dev/null
+++ b/kokoro/macos/php80/presubmit.cfg
@@ -0,0 +1 @@
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/macos/prepare_build_macos_rc b/kokoro/macos/prepare_build_macos_rc
index 8f99f10..fe3b6be 100755
--- a/kokoro/macos/prepare_build_macos_rc
+++ b/kokoro/macos/prepare_build_macos_rc
@@ -7,37 +7,13 @@
export HOMEBREW_PREFIX=$(brew --prefix)
##
-# Remove any pre-existing protobuf installation.
-brew uninstall protobuf
-
-##
-# Select Xcode version
-
-##
# Select Xcode version
export DEVELOPER_DIR=/Applications/Xcode_13.3.1.app/Contents/Developer
sudo xcode-select -s "${DEVELOPER_DIR}"
##
-# Select C/C++ compilers
-
-export CC=gcc
-export CXX=g++
-
-##
-# Install Python 2 by default
-
-eval "$(pyenv init -)"
-pyenv install -v -s 2.7.18 && pyenv global 2.7.18
-
-##
-# Install Tox
-
-if [[ "${KOKORO_INSTALL_TOX:-}" == "yes" ]] ; then
- pyenv install -v -s 3.7.13
- pyenv global 3.7.13
- sudo python -m pip install --upgrade pip tox tox-pyenv
-fi
+# Use Python 2 by default (for googletest)
+pyenv global 2.7.18
##
# Setup RVM
@@ -47,3 +23,19 @@
git config --global --add safe.directory $HOMEBREW_PREFIX/Library/Taps/homebrew/homebrew-services
sudo chown -R $(whoami) $HOME/.rvm/
fi
+
+# "Install" valgrind if it doesn't exist
+##
+if [ ! -x "$(command -v valgrind)" ]; then
+ echo "#! /bin/bash" > valgrind
+ chmod ug+x valgrind
+ sudo mv valgrind /usr/local/bin/valgrind
+fi
+
+##
+# Install Virtual Python Environment
+
+if [[ "${KOKORO_INSTALL_VENV:-}" == "yes" ]] ; then
+ python3 -m venv venv
+ source venv/bin/activate
+fi
diff --git a/kokoro/macos/python/build.sh b/kokoro/macos/python/build.sh
index 388e24b..f1ea3aa 100755
--- a/kokoro/macos/python/build.sh
+++ b/kokoro/macos/python/build.sh
@@ -6,7 +6,7 @@
cd $(dirname $0)/../../..
# Prepare worker environment to run tests
-KOKORO_INSTALL_TOX=yes
+KOKORO_INSTALL_VENV=yes
source kokoro/macos/prepare_build_macos_rc
-./tests.sh python
+bazel test //python/... @upb//python/... -k --macos_minimum_os=10.9 --test_output=streamed
diff --git a/kokoro/macos/python/common.cfg b/kokoro/macos/python/common.cfg
new file mode 100644
index 0000000..ac3cbee
--- /dev/null
+++ b/kokoro/macos/python/common.cfg
@@ -0,0 +1,11 @@
+# Config file for running tests in Kokoro
+
+# Location of the build script in repository
+build_file: "protobuf/kokoro/macos/python/build.sh"
+timeout_mins: 1440
+
+action {
+ define_artifacts {
+ regex: "**/*"
+ }
+}
diff --git a/kokoro/macos/python/continuous.cfg b/kokoro/macos/python/continuous.cfg
index 0fc8b50..8523c22 100644
--- a/kokoro/macos/python/continuous.cfg
+++ b/kokoro/macos/python/continuous.cfg
@@ -1,5 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/python/build.sh"
-timeout_mins: 1440
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/macos/python/presubmit.cfg b/kokoro/macos/python/presubmit.cfg
index 0fc8b50..8523c22 100644
--- a/kokoro/macos/python/presubmit.cfg
+++ b/kokoro/macos/python/presubmit.cfg
@@ -1,5 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/python/build.sh"
-timeout_mins: 1440
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/macos/python_cpp/build.sh b/kokoro/macos/python_cpp/build.sh
index f86dd6f..ae480a5 100755
--- a/kokoro/macos/python_cpp/build.sh
+++ b/kokoro/macos/python_cpp/build.sh
@@ -6,8 +6,7 @@
cd $(dirname $0)/../../..
# Prepare worker environment to run tests
-KOKORO_INSTALL_TOX=yes
+KOKORO_INSTALL_VENV=yes
source kokoro/macos/prepare_build_macos_rc
-g++ --version
-./tests.sh python_cpp
+bazel test //python/... -k --macos_minimum_os=10.9 --test_output=streamed --define=use_fast_cpp_protos=true
diff --git a/kokoro/macos/php7.3_mac/continuous.cfg b/kokoro/macos/python_cpp/common.cfg
similarity index 65%
rename from kokoro/macos/php7.3_mac/continuous.cfg
rename to kokoro/macos/python_cpp/common.cfg
index 9a71745..22f4a0e 100644
--- a/kokoro/macos/php7.3_mac/continuous.cfg
+++ b/kokoro/macos/python_cpp/common.cfg
@@ -1,5 +1,5 @@
# Config file for running tests in Kokoro
# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/php7.3_mac/build.sh"
+build_file: "protobuf/kokoro/macos/python_cpp/build.sh"
timeout_mins: 1440
diff --git a/kokoro/macos/python_cpp/continuous.cfg b/kokoro/macos/python_cpp/continuous.cfg
index 22f4a0e..8523c22 100644
--- a/kokoro/macos/python_cpp/continuous.cfg
+++ b/kokoro/macos/python_cpp/continuous.cfg
@@ -1,5 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/python_cpp/build.sh"
-timeout_mins: 1440
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/macos/python_cpp/presubmit.cfg b/kokoro/macos/python_cpp/presubmit.cfg
index 22f4a0e..8523c22 100644
--- a/kokoro/macos/python_cpp/presubmit.cfg
+++ b/kokoro/macos/python_cpp/presubmit.cfg
@@ -1,5 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/python_cpp/build.sh"
-timeout_mins: 1440
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/macos/ruby25/build.sh b/kokoro/macos/ruby25/build.sh
index 48c8940..81ce2c3 100755
--- a/kokoro/macos/ruby25/build.sh
+++ b/kokoro/macos/ruby25/build.sh
@@ -9,4 +9,5 @@
KOKORO_INSTALL_RVM=yes
source kokoro/macos/prepare_build_macos_rc
-./tests.sh ruby25
+cd ruby
+./travis-test.sh ruby-2.5.1
diff --git a/kokoro/macos/php7.3_mac/continuous.cfg b/kokoro/macos/ruby25/common.cfg
similarity index 65%
copy from kokoro/macos/php7.3_mac/continuous.cfg
copy to kokoro/macos/ruby25/common.cfg
index 9a71745..b3755e4 100644
--- a/kokoro/macos/php7.3_mac/continuous.cfg
+++ b/kokoro/macos/ruby25/common.cfg
@@ -1,5 +1,5 @@
# Config file for running tests in Kokoro
# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/php7.3_mac/build.sh"
+build_file: "protobuf/kokoro/macos/ruby25/build.sh"
timeout_mins: 1440
diff --git a/kokoro/macos/ruby25/continuous.cfg b/kokoro/macos/ruby25/continuous.cfg
index b3755e4..8523c22 100644
--- a/kokoro/macos/ruby25/continuous.cfg
+++ b/kokoro/macos/ruby25/continuous.cfg
@@ -1,5 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/ruby25/build.sh"
-timeout_mins: 1440
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/macos/ruby25/presubmit.cfg b/kokoro/macos/ruby25/presubmit.cfg
index b3755e4..8523c22 100644
--- a/kokoro/macos/ruby25/presubmit.cfg
+++ b/kokoro/macos/ruby25/presubmit.cfg
@@ -1,5 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/ruby25/build.sh"
-timeout_mins: 1440
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/macos/ruby26/build.sh b/kokoro/macos/ruby26/build.sh
index 1b94fe1..ee815b6 100755
--- a/kokoro/macos/ruby26/build.sh
+++ b/kokoro/macos/ruby26/build.sh
@@ -9,4 +9,5 @@
KOKORO_INSTALL_RVM=yes
source kokoro/macos/prepare_build_macos_rc
-./tests.sh ruby26
+cd ruby
+./travis-test.sh ruby-2.6.0
diff --git a/kokoro/macos/php7.3_mac/continuous.cfg b/kokoro/macos/ruby26/common.cfg
similarity index 65%
copy from kokoro/macos/php7.3_mac/continuous.cfg
copy to kokoro/macos/ruby26/common.cfg
index 9a71745..688f63c 100644
--- a/kokoro/macos/php7.3_mac/continuous.cfg
+++ b/kokoro/macos/ruby26/common.cfg
@@ -1,5 +1,5 @@
# Config file for running tests in Kokoro
# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/php7.3_mac/build.sh"
+build_file: "protobuf/kokoro/macos/ruby26/build.sh"
timeout_mins: 1440
diff --git a/kokoro/macos/ruby26/continuous.cfg b/kokoro/macos/ruby26/continuous.cfg
index 688f63c..8523c22 100644
--- a/kokoro/macos/ruby26/continuous.cfg
+++ b/kokoro/macos/ruby26/continuous.cfg
@@ -1,5 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/ruby26/build.sh"
-timeout_mins: 1440
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/macos/ruby26/presubmit.cfg b/kokoro/macos/ruby26/presubmit.cfg
index 688f63c..8523c22 100644
--- a/kokoro/macos/ruby26/presubmit.cfg
+++ b/kokoro/macos/ruby26/presubmit.cfg
@@ -1,5 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/ruby26/build.sh"
-timeout_mins: 1440
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/macos/ruby27/build.sh b/kokoro/macos/ruby27/build.sh
index baebdb7..ca6badb 100755
--- a/kokoro/macos/ruby27/build.sh
+++ b/kokoro/macos/ruby27/build.sh
@@ -9,4 +9,5 @@
KOKORO_INSTALL_RVM=yes
source kokoro/macos/prepare_build_macos_rc
-./tests.sh ruby27
+cd ruby
+./travis-test.sh ruby-2.7.0
diff --git a/kokoro/macos/php7.3_mac/continuous.cfg b/kokoro/macos/ruby27/common.cfg
similarity index 65%
copy from kokoro/macos/php7.3_mac/continuous.cfg
copy to kokoro/macos/ruby27/common.cfg
index 9a71745..b10b455 100644
--- a/kokoro/macos/php7.3_mac/continuous.cfg
+++ b/kokoro/macos/ruby27/common.cfg
@@ -1,5 +1,5 @@
# Config file for running tests in Kokoro
# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/php7.3_mac/build.sh"
+build_file: "protobuf/kokoro/macos/ruby27/build.sh"
timeout_mins: 1440
diff --git a/kokoro/macos/ruby27/continuous.cfg b/kokoro/macos/ruby27/continuous.cfg
index b10b455..8523c22 100644
--- a/kokoro/macos/ruby27/continuous.cfg
+++ b/kokoro/macos/ruby27/continuous.cfg
@@ -1,5 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/ruby27/build.sh"
-timeout_mins: 1440
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/macos/ruby27/presubmit.cfg b/kokoro/macos/ruby27/presubmit.cfg
index b10b455..8523c22 100644
--- a/kokoro/macos/ruby27/presubmit.cfg
+++ b/kokoro/macos/ruby27/presubmit.cfg
@@ -1,5 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/ruby27/build.sh"
-timeout_mins: 1440
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/macos/ruby30/build.sh b/kokoro/macos/ruby30/build.sh
index b1e0641..01bdc47 100755
--- a/kokoro/macos/ruby30/build.sh
+++ b/kokoro/macos/ruby30/build.sh
@@ -9,4 +9,5 @@
KOKORO_INSTALL_RVM=yes
source kokoro/macos/prepare_build_macos_rc
-./tests.sh ruby30
+cd ruby
+./travis-test.sh ruby-3.0.2
diff --git a/kokoro/macos/php7.3_mac/continuous.cfg b/kokoro/macos/ruby30/common.cfg
similarity index 65%
copy from kokoro/macos/php7.3_mac/continuous.cfg
copy to kokoro/macos/ruby30/common.cfg
index 9a71745..d505117 100644
--- a/kokoro/macos/php7.3_mac/continuous.cfg
+++ b/kokoro/macos/ruby30/common.cfg
@@ -1,5 +1,5 @@
# Config file for running tests in Kokoro
# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/php7.3_mac/build.sh"
+build_file: "protobuf/kokoro/macos/ruby30/build.sh"
timeout_mins: 1440
diff --git a/kokoro/macos/ruby30/continuous.cfg b/kokoro/macos/ruby30/continuous.cfg
index d505117..8523c22 100644
--- a/kokoro/macos/ruby30/continuous.cfg
+++ b/kokoro/macos/ruby30/continuous.cfg
@@ -1,5 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/ruby30/build.sh"
-timeout_mins: 1440
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/macos/ruby30/presubmit.cfg b/kokoro/macos/ruby30/presubmit.cfg
index d505117..8523c22 100644
--- a/kokoro/macos/ruby30/presubmit.cfg
+++ b/kokoro/macos/ruby30/presubmit.cfg
@@ -1,5 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/ruby30/build.sh"
-timeout_mins: 1440
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/macos/ruby31/build.sh b/kokoro/macos/ruby31/build.sh
index 3cf61f6..6e4beda 100644
--- a/kokoro/macos/ruby31/build.sh
+++ b/kokoro/macos/ruby31/build.sh
@@ -12,4 +12,5 @@
KOKORO_INSTALL_RVM=yes
source kokoro/macos/prepare_build_macos_rc
-./tests.sh ruby31
+cd ruby
+./travis-test.sh ruby-3.1.0
diff --git a/kokoro/macos/php7.3_mac/continuous.cfg b/kokoro/macos/ruby31/common.cfg
similarity index 65%
copy from kokoro/macos/php7.3_mac/continuous.cfg
copy to kokoro/macos/ruby31/common.cfg
index 9a71745..19e16b3 100644
--- a/kokoro/macos/php7.3_mac/continuous.cfg
+++ b/kokoro/macos/ruby31/common.cfg
@@ -1,5 +1,5 @@
# Config file for running tests in Kokoro
# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/php7.3_mac/build.sh"
+build_file: "protobuf/kokoro/macos/ruby31/build.sh"
timeout_mins: 1440
diff --git a/kokoro/macos/ruby31/continuous.cfg b/kokoro/macos/ruby31/continuous.cfg
index 19e16b3..8523c22 100644
--- a/kokoro/macos/ruby31/continuous.cfg
+++ b/kokoro/macos/ruby31/continuous.cfg
@@ -1,5 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/ruby31/build.sh"
-timeout_mins: 1440
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/macos/ruby31/presubmit.cfg b/kokoro/macos/ruby31/presubmit.cfg
index 19e16b3..8523c22 100644
--- a/kokoro/macos/ruby31/presubmit.cfg
+++ b/kokoro/macos/ruby31/presubmit.cfg
@@ -1,5 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/ruby31/build.sh"
-timeout_mins: 1440
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/macos/test_php.sh b/kokoro/macos/test_php.sh
new file mode 100755
index 0000000..933b251
--- /dev/null
+++ b/kokoro/macos/test_php.sh
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+set -eux
+
+pushd php
+rm -rf vendor
+php -v
+php -m
+composer update
+composer test_c
+popd
+
+git clean -fXd
+bazel test //php:conformance_test_c --action_env=PATH --test_env=PATH --test_output=streamed
diff --git a/kokoro/release/collect_all_artifacts.sh b/kokoro/release/collect_all_artifacts.sh
index 6e0d152..20c6d8d 100755
--- a/kokoro/release/collect_all_artifacts.sh
+++ b/kokoro/release/collect_all_artifacts.sh
@@ -40,8 +40,8 @@
mkdir -p protoc/linux_x64
# Because of maven unrelated reasonse the linux protoc binaries have a dummy .exe extension.
# For the Google.Protobuf.Tools nuget, we don't want that exception, so we just remove it.
-cp ${INPUT_ARTIFACTS_DIR}/protoc-artifacts/target/linux/x86_32/protoc.exe protoc/linux_x86/protoc
-cp ${INPUT_ARTIFACTS_DIR}/protoc-artifacts/target/linux/x86_64/protoc.exe protoc/linux_x64/protoc
+cp ${INPUT_ARTIFACTS_DIR}/kokoro/release/protoc/target/linux/x86_32/protoc.exe protoc/linux_x86/protoc
+cp ${INPUT_ARTIFACTS_DIR}/kokoro/release/protoc/target/linux/x86_64/protoc.exe protoc/linux_x64/protoc
mkdir -p protoc/macosx_x64
cp ${INPUT_ARTIFACTS_DIR}/build64/src/protoc protoc/macosx_x64/protoc
diff --git a/kokoro/release/csharp/windows/common.cfg b/kokoro/release/csharp/windows/common.cfg
new file mode 100644
index 0000000..f508c65
--- /dev/null
+++ b/kokoro/release/csharp/windows/common.cfg
@@ -0,0 +1,11 @@
+# Config file for running tests in Kokoro
+
+# Location of the build script in repository
+build_file: "protobuf/kokoro/release/csharp/windows/build_nuget.bat"
+timeout_mins: 60
+
+action {
+ define_artifacts {
+ regex: "**/*.nupkg"
+ }
+}
diff --git a/kokoro/release/csharp/windows/continuous.cfg b/kokoro/release/csharp/windows/continuous.cfg
index f508c65..8523c22 100644
--- a/kokoro/release/csharp/windows/continuous.cfg
+++ b/kokoro/release/csharp/windows/continuous.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/release/csharp/windows/build_nuget.bat"
-timeout_mins: 60
-
-action {
- define_artifacts {
- regex: "**/*.nupkg"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/release/csharp/windows/presubmit.cfg b/kokoro/release/csharp/windows/presubmit.cfg
index f508c65..8523c22 100644
--- a/kokoro/release/csharp/windows/presubmit.cfg
+++ b/kokoro/release/csharp/windows/presubmit.cfg
@@ -1,11 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/release/csharp/windows/build_nuget.bat"
-timeout_mins: 60
-
-action {
- define_artifacts {
- regex: "**/*.nupkg"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/protoc-artifacts/build-protoc.sh b/kokoro/release/protoc/build-protoc.sh
similarity index 73%
rename from protoc-artifacts/build-protoc.sh
rename to kokoro/release/protoc/build-protoc.sh
index 4602842..d304d5f 100755
--- a/protoc-artifacts/build-protoc.sh
+++ b/kokoro/release/protoc/build-protoc.sh
@@ -19,28 +19,20 @@
# macos osx x86_64
# mingw windows x86_32
# mingw windows x86_64
-#
-# Before running this script, make sure you have generated the configure script
-# in the parent directory (i.e., run ./autogen.sh there).
OS=$1
ARCH=$2
-MAKE_TARGET=$3
+BAZEL_TARGET=$3
if [[ $# < 3 ]]; then
echo "Not enough arguments provided."
exit 1
fi
-case $MAKE_TARGET in
- protoc-gen-javalite)
- ;;
- protoc)
- ;;
- *)
- echo "Target ""$MAKE_TARGET"" invalid."
+if [[ $BAZEL_TARGET != protoc ]]; then
+ echo "Target ""$BAZEL_TARGET"" invalid."
exit 1
-esac
+fi
# Under Cygwin, bash doesn't have these in PATH when called from Maven which
# runs in Windows version of Java.
@@ -146,22 +138,22 @@
host_machine="$(uname -m)";
dump_cmd='ldd '"$1"
if [[ "$ARCH" == x86_32 ]]; then
- white_list="linux-gate\.so\.1\|libpthread\.so\.0\|libm\.so\.6\|libc\.so\.6\|ld-linux\.so\.2"
+ white_list="linux-gate\.so\.1\|libpthread\.so\.0\|libm\.so\.6\|libc\.so\.6\|libgcc_s\.so\.1\|libstdc++\.so\.6\|ld-linux\.so\.2"
elif [[ "$ARCH" == x86_64 ]]; then
- white_list="linux-vdso\.so\.1\|libpthread\.so\.0\|libm\.so\.6\|libc\.so\.6\|ld-linux-x86-64\.so\.2"
+ white_list="linux-vdso\.so\.1\|libpthread\.so\.0\|libm\.so\.6\|libc\.so\.6\|libgcc_s\.so\.1\|libstdc++\.so\.6\|ld-linux-x86-64\.so\.2"
elif [[ "$ARCH" == s390_64 ]]; then
if [[ $host_machine != s390x ]];then
dump_cmd='objdump -p '"$1"' | grep NEEDED'
fi
- white_list="linux-vdso64\.so\.1\|libpthread\.so\.0\|libm\.so\.6\|libc\.so\.6\|libz\.so\.1\|ld64\.so\.1"
+ white_list="linux-vdso64\.so\.1\|libpthread\.so\.0\|libm\.so\.6\|libc\.so\.6\|libgcc_s\.so\.1\|libstdc++\.so\.6\|libz\.so\.1\|ld64\.so\.1"
elif [[ "$ARCH" == ppcle_64 ]]; then
if [[ $host_machine != ppc64le ]];then
dump_cmd='objdump -p '"$1"' | grep NEEDED'
fi
- white_list="linux-vdso64\.so\.1\|libpthread\.so\.0\|libm\.so\.6\|libc\.so\.6\|libz\.so\.1\|ld64\.so\.2"
+ white_list="linux-vdso64\.so\.1\|libpthread\.so\.0\|libm\.so\.6\|libc\.so\.6\|libgcc_s\.so\.1\|libstdc++\.so\.6\|libz\.so\.1\|ld64\.so\.2"
elif [[ "$ARCH" == aarch_64 ]]; then
dump_cmd='objdump -p '"$1"' | grep NEEDED'
- white_list="libpthread\.so\.0\|libm\.so\.6\|libc\.so\.6\|ld-linux-aarch64\.so\.1"
+ white_list="libpthread\.so\.0\|libm\.so\.6\|libc\.so\.6\|libgcc_s\.so\.1\|libstdc++\.so\.6\|ld-linux-aarch64\.so\.1"
fi
elif [[ "$OS" == osx ]]; then
dump_cmd='otool -L '"$1"' | fgrep dylib'
@@ -185,19 +177,14 @@
}
############################################################################
-echo "Building protoc, OS=$OS ARCH=$ARCH TARGET=$MAKE_TARGET"
+echo "Building protoc, OS=$OS ARCH=$ARCH TARGET=$BAZEL_TARGET"
-CONFIGURE_ARGS="--disable-shared"
+BAZEL_ARGS=("--dynamic_mode=off" "--compilation_mode=opt" "--copt=-g0" "--copt=-fpic")
if [[ "$OS" == windows ]]; then
- MAKE_TARGET="${MAKE_TARGET}.exe"
+ BAZEL_TARGET="${BAZEL_TARGET}.exe"
fi
-# Override the default value set in configure.ac that has '-g' which produces
-# huge binary.
-CXXFLAGS="-DNDEBUG"
-LDFLAGS=""
-
if [[ "$(uname)" == CYGWIN* ]]; then
assertEq "$OS" windows $LINENO
# Use mingw32 compilers because executables produced by Cygwin compiler
@@ -217,28 +204,13 @@
assertEq "$ARCH" x86_64 $LINENO
elif [[ "$(uname)" == Linux* ]]; then
if [[ "$OS" == linux ]]; then
- if [[ "$ARCH" == x86_64 ]]; then
- CXXFLAGS="$CXXFLAGS -m64"
- elif [[ "$ARCH" == x86_32 ]]; then
- CXXFLAGS="$CXXFLAGS -m32"
- elif [[ "$ARCH" == aarch_64 ]]; then
- CONFIGURE_ARGS="$CONFIGURE_ARGS --host=aarch64-linux-gnu"
- elif [[ "$ARCH" == ppcle_64 ]]; then
- CXXFLAGS="$CXXFLAGS -m64"
- CONFIGURE_ARGS="$CONFIGURE_ARGS --host=powerpc64le-linux-gnu"
- elif [[ "$ARCH" == s390_64 ]]; then
- CXXFLAGS="$CXXFLAGS -m64"
- CONFIGURE_ARGS="$CONFIGURE_ARGS --host=s390x-linux-gnu"
- else
- fail "Unsupported arch: $ARCH"
- fi
+ BAZEL_ARGS+=("--config=linux-$ARCH")
elif [[ "$OS" == windows ]]; then
# Cross-compilation for Windows
- CONFIGURE_ARGS="$CONFIGURE_ARGS"
if [[ "$ARCH" == x86_64 ]]; then
- CONFIGURE_ARGS="$CONFIGURE_ARGS --host=x86_64-w64-mingw32"
+ BAZEL_ARGS+=("--config=win64")
elif [[ "$ARCH" == x86_32 ]]; then
- CONFIGURE_ARGS="$CONFIGURE_ARGS --host=i686-w64-mingw32"
+ BAZEL_ARGS+=("--config=win32")
else
fail "Unsupported arch: $ARCH"
fi
@@ -248,43 +220,24 @@
elif [[ "$(uname)" == Darwin* ]]; then
assertEq "$OS" osx $LINENO
# Make the binary compatible with OSX 10.7 and later
- CXXFLAGS="$CXXFLAGS -mmacosx-version-min=10.7"
- if [[ "$ARCH" == x86_64 ]]; then
- CXXFLAGS="$CXXFLAGS -m64"
- elif [[ "$ARCH" == x86_32 ]]; then
- CXXFLAGS="$CXXFLAGS -m32"
- else
- fail "Unsupported arch: $ARCH"
- fi
+ BAZEL_ARGS+=("--config=osx-$ARCH" "--macos_minimum_os=10.7")
else
fail "Unsupported system: $(uname)"
fi
-# Statically link libgcc and libstdc++.
-# -s to produce stripped binary.
-if [[ "$OS" == windows ]]; then
- # Also static link libpthread required by mingw64
- LDFLAGS="$LDFLAGS -static-libgcc -static-libstdc++ -Wl,-Bstatic -lstdc++ -lpthread -s"
-elif [[ "$OS" != osx ]]; then
- # And they don't work under Mac.
- LDFLAGS="$LDFLAGS -static-libgcc -static-libstdc++ -s"
-fi
-
-export CXXFLAGS LDFLAGS
-
# Nested double quotes are unintuitive, but it works.
cd "$(dirname "$0")"
WORKING_DIR="$(pwd)"
-BUILD_DIR="build/$OS/$ARCH"
-TARGET_FILE="target/$OS/$ARCH/$MAKE_TARGET.exe"
+TARGET_FILE="target/$OS/$ARCH/$BAZEL_TARGET.exe"
+DOCKER_IMAGE=gcr.io/protobuf-build/bazel/linux@sha256:2bfd061284eff8234f2fcca16d71d43c69ccf3a22206628b54c204a6a9aac277
-mkdir -p "$BUILD_DIR" && cd "$BUILD_DIR" &&
- ../../../../configure $CONFIGURE_ARGS &&
- cd src && make $MAKE_TARGET -j8 &&
- cd "$WORKING_DIR" && mkdir -p $(dirname $TARGET_FILE) &&
- cp $BUILD_DIR/src/$MAKE_TARGET $TARGET_FILE ||
- exit 1
+tmpfile=$(mktemp -u) &&
+docker run --cidfile $tmpfile -v $WORKING_DIR/..:/workspace $DOCKER_IMAGE \
+ build //:$BAZEL_TARGET "${BAZEL_ARGS[@]}" &&
+mkdir -p $(dirname $TARGET_FILE) &&
+docker cp \
+ `cat $tmpfile`:/workspace/bazel-bin/$BAZEL_TARGET $TARGET_FILE || exit 1
if [[ "$OS" == osx ]]; then
# Since Mac linker doesn't accept "-s", we need to run strip
diff --git a/kokoro/release/protoc/linux/build.sh b/kokoro/release/protoc/linux/build.sh
index 44a95aa..a9d58b7 100755
--- a/kokoro/release/protoc/linux/build.sh
+++ b/kokoro/release/protoc/linux/build.sh
@@ -1,44 +1,29 @@
#!/bin/bash
-set -x
+# This is not the source of truth for release protoc executables, and will soon
+# be deprecated.
+
+set -ex
# Change to repo root.
cd $(dirname $0)/../../../..
+GIT_REPO_ROOT=$(pwd)
# Initialize any submodules.
git submodule update --init --recursive
-# Generate the configure script.
-./autogen.sh
-
# Cross-build for aarch64, ppc64le and s390x. Note: we do these builds first to avoid
# file permission issues. The Docker builds will create directories owned by
# root, which causes problems if we try to add new artifacts to those
# directories afterward.
-sudo apt install -y g++-aarch64-linux-gnu
-protoc-artifacts/build-protoc.sh linux aarch_64 protoc
-sudo apt install -y g++-powerpc64le-linux-gnu
-protoc-artifacts/build-protoc.sh linux ppcle_64 protoc
+kokoro/release/protoc/build-protoc.sh linux aarch_64 protoc
-sudo apt install -y g++-s390x-linux-gnu
-protoc-artifacts/build-protoc.sh linux s390_64 protoc
+kokoro/release/protoc/build-protoc.sh linux ppcle_64 protoc
-# Use docker image to build linux artifacts.
-DOCKER_IMAGE_NAME=protobuf/protoc_$(sha1sum protoc-artifacts/Dockerfile | cut -f1 -d " ")
-docker pull $DOCKER_IMAGE_NAME
+kokoro/release/protoc/build-protoc.sh linux s390_64 protoc
-docker run -v $(pwd):/var/local/protobuf --rm $DOCKER_IMAGE_NAME \
- bash -l /var/local/protobuf/protoc-artifacts/build-protoc.sh \
- linux x86_64 protoc || {
- echo "Failed to build protoc for linux + x86_64."
- exit 1
-}
+kokoro/release/protoc/build-protoc.sh linux x86_64 protoc
-docker run -v $(pwd):/var/local/protobuf --rm $DOCKER_IMAGE_NAME \
- bash -l /var/local/protobuf/protoc-artifacts/build-protoc.sh \
- linux x86_32 protoc || {
- echo "Failed to build protoc for linux + x86_32."
- exit 1
-}
+kokoro/release/protoc/build-protoc.sh linux x86_32 protoc
diff --git a/kokoro/release/protoc/macos/build.sh b/kokoro/release/protoc/macos/build.sh
index 47c9bfa..2a31431 100755
--- a/kokoro/release/protoc/macos/build.sh
+++ b/kokoro/release/protoc/macos/build.sh
@@ -4,12 +4,9 @@
CXXFLAGS_COMMON="-std=c++14 -DNDEBUG -mmacosx-version-min=10.9"
cd github/protobuf
-./autogen.sh
-mkdir build64 && cd build64
-export CXXFLAGS="$CXXFLAGS_COMMON -m64"
-../configure --disable-shared
-make -j4
-file src/protoc
-otool -L src/protoc | grep dylib
-cd ..
+bazel build //:protoc --dynamic_mode=off
+mkdir -p build64/src
+cp bazel-bin/protoc build64/src/protoc
+file bazel-bin/protoc
+otool -L bazel-bin/protoc | grep dylib
diff --git a/kokoro/release/protoc/windows/build.bat b/kokoro/release/protoc/windows/build.bat
index 75ea546..50ad223 100644
--- a/kokoro/release/protoc/windows/build.bat
+++ b/kokoro/release/protoc/windows/build.bat
@@ -1,10 +1,13 @@
-set PATH=C:\Program Files (x86)\MSBuild\14.0\bin\;%PATH%
-set generator32=Visual Studio 14
-set generator64=Visual Studio 14 Win64
+set generator32=Visual Studio 15
+set generator64=Visual Studio 15 Win64
set vcplatform32=win32
set vcplatform64=x64
set configuration=Release
+:: VS2017 is installed, but will not be selected by default. This command sets
+:: up the environment so that CMake will find and use it:
+call "%ProgramFiles(x86)%\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat" x64
+
echo Building protoc
cd github\protobuf
@@ -15,13 +18,13 @@
mkdir build32
cd build32
-cmake -G "%generator32%" -Dprotobuf_BUILD_TESTS=OFF -Dprotobuf_BUILD_SHARED_LIBS=OFF -Dprotobuf_UNICODE=ON ../cmake
+cmake -G "%generator32%" -Dprotobuf_BUILD_TESTS=OFF -Dprotobuf_BUILD_SHARED_LIBS=OFF -Dprotobuf_UNICODE=ON ..
msbuild protobuf.sln /p:Platform=%vcplatform32% || goto error
cd ..
mkdir build64
cd build64
-cmake -G "%generator64%" -Dprotobuf_BUILD_TESTS=OFF -Dprotobuf_BUILD_SHARED_LIBS=OFF -Dprotobuf_UNICODE=ON ../cmake
+cmake -G "%generator64%" -Dprotobuf_BUILD_TESTS=OFF -Dprotobuf_BUILD_SHARED_LIBS=OFF -Dprotobuf_UNICODE=ON ..
msbuild protobuf.sln /p:Platform=%vcplatform64% || goto error
cd ..
diff --git a/kokoro/release/python/linux/build_artifacts.sh b/kokoro/release/python/linux/build_artifacts.sh
deleted file mode 100755
index 9a3fc58..0000000
--- a/kokoro/release/python/linux/build_artifacts.sh
+++ /dev/null
@@ -1,90 +0,0 @@
-#!/bin/bash
-
-set -ex
-
-# change to repo root
-pushd $(dirname $0)/../../../..
-
-# Create stage dir
-ORIGINAL_DIR=`pwd`
-pushd ..
-cp -R $ORIGINAL_DIR stage
-export STAGE_DIR="`pwd`/stage"
-popd
-
-export REPO_DIR=protobuf
-export BUILD_VERSION=`grep -i "version" python/google/protobuf/__init__.py | grep -o "'.*'" | tr -d "'"`
-
-export BUILD_COMMIT=`git rev-parse HEAD`
-export PLAT=x86_64
-export UNICODE_WIDTH=32
-export MACOSX_DEPLOYMENT_TARGET=10.9
-
-rm -rf artifacts/
-rm -rf multibuild/
-mkdir artifacts
-export ARTIFACT_DIR=$(pwd)/artifacts
-
-git clone https://github.com/matthew-brett/multibuild.git
-# Pin multibuild scripts at a known commit to avoid potentially unwanted future changes from
-# silently creeping in (see https://github.com/protocolbuffers/protobuf/issues/9180).
-# IMPORTANT: always pin multibuild at the same commit for:
-# - linux/build_artifacts.sh
-# - linux/build_artifacts.sh
-# - windows/build_artifacts.bat
-(cd multibuild; git checkout b89bb903e94308be79abefa4f436bf123ebb1313)
-cp kokoro/release/python/linux/config.sh config.sh
-
-build_artifact_version() {
- MB_PYTHON_VERSION=$1
- cp -R $STAGE_DIR $REPO_DIR
-
- source multibuild/common_utils.sh
- source multibuild/travis_steps.sh
- before_install
-
- clean_code $REPO_DIR $BUILD_COMMIT
-
- build_wheel $REPO_DIR/python $PLAT
-
- mv wheelhouse/* $ARTIFACT_DIR
-
- # Clean up env
- rm -rf venv
- sudo rm -rf $REPO_DIR
-}
-
-build_x86_64_manylinux1_artifact_version() {
- # Explicitly request building manylinux1 wheels, which is no longer the default.
- # https://github.com/protocolbuffers/protobuf/issues/9180
- MB_ML_VER=1
- build_artifact_version $@
-}
-
-build_x86_64_manylinux2010_artifact_version() {
- # Explicitly request building manylinux2010 wheels
- MB_ML_VER=2010
- build_artifact_version $@
-}
-
-build_crosscompiled_aarch64_manylinux2014_artifact_version() {
- # crosscompilation is only supported with the dockcross manylinux2014 image
- DOCKER_IMAGE=dockcross/manylinux2014-aarch64:20210706-65bf2dd
- MB_ML_VER=2014
- PLAT=aarch64
-
- # TODO(jtatermusch): currently when crosscompiling, "auditwheel repair" will be disabled
- # since auditwheel doesn't work for crosscomiled wheels.
- build_artifact_version $@
-}
-
-build_x86_64_manylinux1_artifact_version 3.6
-build_x86_64_manylinux1_artifact_version 3.7
-build_x86_64_manylinux1_artifact_version 3.8
-build_x86_64_manylinux1_artifact_version 3.9
-build_x86_64_manylinux2010_artifact_version 3.10
-
-build_crosscompiled_aarch64_manylinux2014_artifact_version 3.7
-build_crosscompiled_aarch64_manylinux2014_artifact_version 3.8
-build_crosscompiled_aarch64_manylinux2014_artifact_version 3.9
-build_crosscompiled_aarch64_manylinux2014_artifact_version 3.10
diff --git a/kokoro/release/python/linux/config.sh b/kokoro/release/python/linux/config.sh
deleted file mode 100644
index 8920495..0000000
--- a/kokoro/release/python/linux/config.sh
+++ /dev/null
@@ -1,93 +0,0 @@
-# Define custom utilities
-# Test for OSX with [ -n "$IS_OSX" ]
-
-function pre_build {
- # Any stuff that you need to do before you start building the wheels
- # Runs in the root directory of this repository.
- pushd protobuf
-
- if [ "$PLAT" == "aarch64" ]
- then
- local configure_host_flag="--host=aarch64"
- fi
-
- # Build protoc and libprotobuf
- ./autogen.sh
- CXXFLAGS="-fPIC -g -O2" ./configure $configure_host_flag
- make -j8
-
- if [ "$PLAT" == "aarch64" ]
- then
- # we are crosscompiling for aarch64 while running on x64
- # the simplest way for build_py command to be able to generate
- # the protos is by running the protoc process under
- # an emulator. That way we don't have to build a x64 version
- # of protoc. The qemu-arm emulator is already included
- # in the dockcross docker image.
- # Running protoc under an emulator is fast as protoc doesn't
- # really do much.
-
- # create a simple shell wrapper that runs crosscompiled protoc under qemu
- echo '#!/bin/bash' >protoc_qemu_wrapper.sh
- echo 'exec qemu-aarch64 "../src/protoc" "$@"' >>protoc_qemu_wrapper.sh
- chmod ugo+x protoc_qemu_wrapper.sh
-
- # PROTOC variable is by build_py step that runs under ./python directory
- export PROTOC=../protoc_qemu_wrapper.sh
- fi
-
- # Generate python dependencies.
- pushd python
- python setup.py build_py
- popd
-
- popd
-}
-
-function bdist_wheel_cmd {
- # Builds wheel with bdist_wheel, puts into wheelhouse
- #
- # It may sometimes be useful to use bdist_wheel for the wheel building
- # process. For example, versioneer has problems with versions which are
- # fixed with bdist_wheel:
- # https://github.com/warner/python-versioneer/issues/121
- local abs_wheelhouse=$1
-
- # Modify build version
- pwd
- ls
-
- if [ "$PLAT" == "aarch64" ]
- then
- # when crosscompiling for aarch64, --plat-name needs to be set explicitly
- # to end up with correctly named wheel file
- # the value should be manylinuxABC_ARCH and dockcross docker image
- # conveniently provides the value in the AUDITWHEEL_PLAT env
- local plat_name_flag="--plat-name=$AUDITWHEEL_PLAT"
-
- # override the value of EXT_SUFFIX to make sure the crosscompiled .so files in the wheel have the correct filename suffix
- export PROTOCOL_BUFFERS_OVERRIDE_EXT_SUFFIX="$(python -c 'import sysconfig; print(sysconfig.get_config_var("EXT_SUFFIX").replace("-x86_64-linux-gnu.so", "-aarch64-linux-gnu.so"))')"
- fi
-
- python setup.py bdist_wheel --cpp_implementation --compile_static_extension $plat_name_flag
- cp dist/*.whl $abs_wheelhouse
-}
-
-function build_wheel {
- build_wheel_cmd "bdist_wheel_cmd" $@
-}
-
-function run_tests {
- # Runs tests on installed distribution from an empty directory
- python --version
- python -c "from google.protobuf.pyext import _message;"
-}
-
-if [ "$PLAT" == "aarch64" ]
-then
- # when crosscompiling for aarch64, override the default multibuild's repair_wheelhouse logic
- # since "auditwheel repair" doesn't work for crosscompiled wheels
- function repair_wheelhouse {
- echo "Skipping repair_wheelhouse since auditwheel requires build architecture to match wheel architecture."
- }
-fi
diff --git a/kokoro/release/python/linux/continuous.cfg b/kokoro/release/python/linux/continuous.cfg
deleted file mode 100644
index c0b9a01..0000000
--- a/kokoro/release/python/linux/continuous.cfg
+++ /dev/null
@@ -1,8 +0,0 @@
-# Config file for running tests in Kokoro
-build_file: "protobuf/kokoro/release/python/linux/build_artifacts.sh"
-
-action {
- define_artifacts {
- regex: "github/protobuf/artifacts/**"
- }
-}
diff --git a/kokoro/release/python/linux/presubmit.cfg b/kokoro/release/python/linux/presubmit.cfg
deleted file mode 100644
index c0b9a01..0000000
--- a/kokoro/release/python/linux/presubmit.cfg
+++ /dev/null
@@ -1,8 +0,0 @@
-# Config file for running tests in Kokoro
-build_file: "protobuf/kokoro/release/python/linux/build_artifacts.sh"
-
-action {
- define_artifacts {
- regex: "github/protobuf/artifacts/**"
- }
-}
diff --git a/kokoro/release/python/macos/build_artifacts.sh b/kokoro/release/python/macos/build_artifacts.sh
deleted file mode 100755
index 296bd9a..0000000
--- a/kokoro/release/python/macos/build_artifacts.sh
+++ /dev/null
@@ -1,67 +0,0 @@
-#!/bin/bash
-
-set -ex
-
-# Remove any pre-existing protobuf installation.
-brew uninstall protobuf
-
-# change to repo root
-pushd $(dirname $0)/../../../..
-
-# Create stage dir
-ORIGINAL_DIR=`pwd`
-pushd ..
-cp -R $ORIGINAL_DIR stage
-export STAGE_DIR="`pwd`/stage"
-popd
-
-export REPO_DIR=protobuf
-export BUILD_VERSION=`grep -i "version" python/google/protobuf/__init__.py | grep -o "'.*'" | tr -d "'"`
-export BUILD_COMMIT=`git rev-parse HEAD`
-export PLAT=x86_64
-export UNICODE_WIDTH=32
-export MACOSX_DEPLOYMENT_TARGET=10.9
-export TRAVIS_OS_NAME="osx"
-
-rm -rf artifacts/
-rm -rf multibuild/
-mkdir artifacts
-export ARTIFACT_DIR=$(pwd)/artifacts
-
-git clone https://github.com/matthew-brett/multibuild.git
-# Pin multibuild scripts at a known commit to avoid potentially unwanted future changes from
-# silently creeping in (see https://github.com/protocolbuffers/protobuf/issues/9180).
-# IMPORTANT: always pin multibuild at the same commit for:
-# - linux/build_artifacts.sh
-# - linux/build_artifacts.sh
-# - windows/build_artifacts.bat
-(cd multibuild; git checkout b89bb903e94308be79abefa4f436bf123ebb1313)
-cp kokoro/release/python/macos/config.sh config.sh
-
-OLD_PATH=$PATH
-
-build_artifact_version() {
- MB_PYTHON_VERSION=$1
-
- # Clean up env
- rm -rf venv
- sudo rm -rf $REPO_DIR
- cp -R $STAGE_DIR $REPO_DIR
- export PATH=$OLD_PATH
-
- source multibuild/common_utils.sh
- source multibuild/travis_steps.sh
- before_install
-
- clean_code $REPO_DIR $BUILD_COMMIT
-
- build_wheel $REPO_DIR/python $PLAT
-
- mv wheelhouse/* $ARTIFACT_DIR
-}
-
-export MB_PYTHON_OSX_VER=10.9
-build_artifact_version 3.7
-build_artifact_version 3.8
-build_artifact_version 3.9
-build_artifact_version 3.10
diff --git a/kokoro/release/python/macos/config.sh b/kokoro/release/python/macos/config.sh
deleted file mode 100644
index 74e6569..0000000
--- a/kokoro/release/python/macos/config.sh
+++ /dev/null
@@ -1,67 +0,0 @@
-# Define custom utilities
-# Test for OSX with [ -n "$IS_OSX" ]
-
-function remove_travis_ve_pip {
- # Removing the system virtualenv or pip can be very problematic for
- # macOS on Kokoro, so just leave them be.
- :;
-}
-
-function install_pip {
- check_python
- PIP_CMD="sudo $PYTHON_EXE -m pip${pip_args:+ $pip_args}"
- $PIP_CMD install --upgrade pip
-}
-
-function install_virtualenv {
- check_python
- check_pip
- $PIP_CMD install --upgrade virtualenv
- VIRTUALENV_CMD="$PYTHON_EXE -m virtualenv"
-}
-
-function pre_build {
- # Any stuff that you need to do before you start building the wheels
- # Runs in the root directory of this repository.
- pushd protobuf
-
- # Build protoc and protobuf libraries
- bazel build //:protoc
- export PROTOC=$PWD/bazel-bin/protoc
- mkdir src/.libs
- ln -s $PWD/bazel-bin/libprotobuf.a src/.libs/libprotobuf.a
- ln -s $PWD/bazel-bin/libprotobuf_lite.a src/.libs/libprotobuf-lite.a
-
- # Generate python dependencies.
- pushd python
- python setup.py build_py
- popd
-
- popd
-}
-
-function bdist_wheel_cmd {
- # Builds wheel with bdist_wheel, puts into wheelhouse
- #
- # It may sometimes be useful to use bdist_wheel for the wheel building
- # process. For example, versioneer has problems with versions which are
- # fixed with bdist_wheel:
- # https://github.com/warner/python-versioneer/issues/121
- local abs_wheelhouse=$1
-
- # Modify build version
- pwd
- ls
- python setup.py bdist_wheel --cpp_implementation --compile_static_extension
- cp dist/*.whl $abs_wheelhouse
-}
-
-function build_wheel {
- build_wheel_cmd "bdist_wheel_cmd" $@
-}
-
-function run_tests {
- # Runs tests on installed distribution from an empty directory
- python --version
- python -c "from google.protobuf.pyext import _message;"
-}
diff --git a/kokoro/release/python/macos/presubmit.cfg b/kokoro/release/python/macos/presubmit.cfg
deleted file mode 100644
index 85cf81b..0000000
--- a/kokoro/release/python/macos/presubmit.cfg
+++ /dev/null
@@ -1,8 +0,0 @@
-# Configuration for Mac OSX release builds
-build_file: "protobuf/kokoro/release/python/macos/build_artifacts.sh"
-
-action {
- define_artifacts {
- regex: "github/protobuf/artifacts/**"
- }
-}
diff --git a/kokoro/release/python/macos/release.cfg b/kokoro/release/python/macos/release.cfg
deleted file mode 100644
index 85cf81b..0000000
--- a/kokoro/release/python/macos/release.cfg
+++ /dev/null
@@ -1,8 +0,0 @@
-# Configuration for Mac OSX release builds
-build_file: "protobuf/kokoro/release/python/macos/build_artifacts.sh"
-
-action {
- define_artifacts {
- regex: "github/protobuf/artifacts/**"
- }
-}
diff --git a/kokoro/release/python/windows/build_artifacts.bat b/kokoro/release/python/windows/build_artifacts.bat
deleted file mode 100644
index 121283a..0000000
--- a/kokoro/release/python/windows/build_artifacts.bat
+++ /dev/null
@@ -1,88 +0,0 @@
-REM Move scripts to root
-set REPO_DIR_STAGE=%cd%\github\protobuf-stage
-xcopy /S github\protobuf "%REPO_DIR_STAGE%\"
-cd github\protobuf
-copy kokoro\release\python\windows\build_single_artifact.bat build_single_artifact.bat
-
-REM Set environment variables
-set PACKAGE_NAME=protobuf
-set REPO_DIR=protobuf
-set BUILD_DLL=OFF
-set UNICODE=ON
-set OTHER_TEST_DEP="setuptools==38.5.1"
-set OLD_PATH=C:\Program Files (x86)\MSBuild\14.0\bin\;%PATH%
-
-REM Fetch multibuild
-git clone https://github.com/matthew-brett/multibuild.git
-REM Pin multibuild scripts at a known commit to avoid potentially unwanted future changes from
-REM silently creeping in (see https://github.com/protocolbuffers/protobuf/issues/9180).
-REM IMPORTANT: always pin multibuild at the same commit for:
-REM - linux/build_artifacts.sh
-REM - linux/build_artifacts.sh
-REM - windows/build_artifacts.bat
-cd multibuild
-git checkout b89bb903e94308be79abefa4f436bf123ebb1313
-cd ..
-
-REM Install zlib
-mkdir zlib
-curl -L -o zlib.zip http://www.winimage.com/zLibDll/zlib123dll.zip
-curl -L -o zlib-src.zip http://www.winimage.com/zLibDll/zlib123.zip
-7z x zlib.zip -ozlib
-7z x zlib-src.zip -ozlib\include
-SET ZLIB_ROOT=%cd%\zlib
-del /Q zlib.zip
-del /Q zlib-src.zip
-
-REM Create directory for artifacts
-SET ARTIFACT_DIR=%cd%\artifacts
-mkdir %ARTIFACT_DIR%
-
-REM Build wheel
-
-SET PYTHON=C:\python37_32bit
-SET PYTHON_VERSION=3.7
-SET PYTHON_ARCH=32
-CALL build_single_artifact.bat || goto :error
-
-SET PYTHON=C:\python37
-SET PYTHON_VERSION=3.7
-SET PYTHON_ARCH=64
-CALL build_single_artifact.bat || goto :error
-
-powershell -File kokoro/release/python/windows/install_python_interpreters.ps1
-
-SET PYTHON=C:\python38_32bit
-SET PYTHON_VERSION=3.8
-SET PYTHON_ARCH=32
-CALL build_single_artifact.bat || goto :error
-
-SET PYTHON=C:\python38
-SET PYTHON_VERSION=3.8
-SET PYTHON_ARCH=64
-CALL build_single_artifact.bat || goto :error
-
-SET PYTHON=C:\python39_32bit
-SET PYTHON_VERSION=3.9
-SET PYTHON_ARCH=32
-CALL build_single_artifact.bat || goto :error
-
-SET PYTHON=C:\python39
-SET PYTHON_VERSION=3.9
-SET PYTHON_ARCH=64
-CALL build_single_artifact.bat || goto :error
-
-SET PYTHON=C:\python310_32bit
-SET PYTHON_VERSION=3.10
-SET PYTHON_ARCH=32
-CALL build_single_artifact.bat || goto :error
-
-SET PYTHON=C:\python310
-SET PYTHON_VERSION=3.10
-SET PYTHON_ARCH=64
-CALL build_single_artifact.bat || goto :error
-
-goto :EOF
-
-:error
-exit /b %errorlevel%
diff --git a/kokoro/release/python/windows/build_single_artifact.bat b/kokoro/release/python/windows/build_single_artifact.bat
deleted file mode 100644
index af2d265..0000000
--- a/kokoro/release/python/windows/build_single_artifact.bat
+++ /dev/null
@@ -1,78 +0,0 @@
-setlocal
-
-if %PYTHON%==C:\python37_32bit set generator=Visual Studio 14
-if %PYTHON%==C:\python37_32bit set vcplatform=Win32
-
-if %PYTHON%==C:\python37 set generator=Visual Studio 14 Win64
-if %PYTHON%==C:\python37 set vcplatform=x64
-
-if %PYTHON%==C:\python38_32bit set generator=Visual Studio 14
-if %PYTHON%==C:\python38_32bit set vcplatform=Win32
-
-if %PYTHON%==C:\python38 set generator=Visual Studio 14 Win64
-if %PYTHON%==C:\python38 set vcplatform=x64
-
-if %PYTHON%==C:\python39_32bit set generator=Visual Studio 14
-if %PYTHON%==C:\python39_32bit set vcplatform=Win32
-
-if %PYTHON%==C:\python39 set generator=Visual Studio 14 Win64
-if %PYTHON%==C:\python39 set vcplatform=x64
-
-if %PYTHON%==C:\python310_32bit set generator=Visual Studio 14
-if %PYTHON%==C:\python310_32bit set vcplatform=Win32
-
-if %PYTHON%==C:\python310 set generator=Visual Studio 14 Win64
-if %PYTHON%==C:\python310 set vcplatform=x64
-
-REM Prepend newly installed Python to the PATH of this build (this cannot be
-REM done from inside the powershell script as it would require to restart
-REM the parent CMD process).
-SET PATH=C:\Program Files\CMake\bin;%PYTHON%;%PYTHON%\Scripts;%OLD_PATH%
-python -m pip install -U pip
-pip install wheel
-
-REM Check that we have the expected version and architecture for Python
-python --version
-python -c "import struct; print(struct.calcsize('P') * 8)"
-
-rmdir /s/q %REPO_DIR%
-xcopy /s %REPO_DIR_STAGE% "%REPO_DIR%\"
-
-REM Checkout release commit
-cd %REPO_DIR%
-
-REM ======================
-REM Build Protobuf Library
-REM ======================
-
-mkdir src\.libs
-
-mkdir vcprojects
-pushd vcprojects
-cmake -G "%generator%" -Dprotobuf_BUILD_SHARED_LIBS=%BUILD_DLL% -Dprotobuf_UNICODE=%UNICODE% -Dprotobuf_BUILD_TESTS=OFF ../cmake || goto :error
-msbuild protobuf.sln /p:Platform=%vcplatform% /p:Configuration=Release || goto :error
-dir /s /b
-popd
-copy vcprojects\Release\libprotobuf.lib src\.libs\libprotobuf.a
-copy vcprojects\Release\libprotobuf-lite.lib src\.libs\libprotobuf-lite.a
-SET PATH=%cd%\vcprojects\Release;%PATH%
-dir vcprojects\Release
-
-REM ======================
-REM Build python library
-REM ======================
-
-cd python
-
-REM sed -i 's/\ extra_compile_args\ =\ \[\]/\ extra_compile_args\ =\ \[\'\/MT\'\]/g' setup.py
-
-python setup.py bdist_wheel --cpp_implementation --compile_static_extension
-dir dist
-copy dist\* %ARTIFACT_DIR%
-dir %ARTIFACT_DIR%
-cd ..\..
-
-goto :EOF
-
-:error
-exit /b %errorlevel%
diff --git a/kokoro/release/python/windows/continuous.cfg b/kokoro/release/python/windows/continuous.cfg
deleted file mode 100644
index 5261606..0000000
--- a/kokoro/release/python/windows/continuous.cfg
+++ /dev/null
@@ -1,8 +0,0 @@
-# Configuration for Windows protoc release builds
-build_file: "protobuf/kokoro/release/python/windows/build_artifacts.bat"
-
-action {
- define_artifacts {
- regex: "github/protobuf/artifacts/**"
- }
-}
diff --git a/kokoro/release/python/windows/install_python_interpreters.ps1 b/kokoro/release/python/windows/install_python_interpreters.ps1
deleted file mode 100644
index 3f8db95..0000000
--- a/kokoro/release/python/windows/install_python_interpreters.ps1
+++ /dev/null
@@ -1,114 +0,0 @@
-#!/usr/bin/env powershell
-# Install Python 3.8 for x64 and x86 in order to build wheels on Windows.
-# Originally from grpc/tools/internal_ci/helper_scripts/install_python_interpreters.ps1
-
-Set-StrictMode -Version 2
-$ErrorActionPreference = 'Stop'
-
-trap {
- $ErrorActionPreference = "Continue"
- Write-Error $_
- exit 1
-}
-
-# Avoid "Could not create SSL/TLS secure channel"
-[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
-
-function Install-Python {
- Param(
- [string]$PythonVersion,
- [string]$PythonInstaller,
- [string]$PythonInstallPath,
- [string]$PythonInstallerHash
- )
- $PythonInstallerUrl = "https://www.python.org/ftp/python/$PythonVersion/$PythonInstaller.exe"
- $PythonInstallerPath = "C:\tools\$PythonInstaller.exe"
-
- # Downloads installer
- Write-Host "Downloading the Python installer: $PythonInstallerUrl => $PythonInstallerPath"
- Invoke-WebRequest -Uri $PythonInstallerUrl -OutFile $PythonInstallerPath
-
- # Validates checksum
- $HashFromDownload = Get-FileHash -Path $PythonInstallerPath -Algorithm MD5
- if ($HashFromDownload.Hash -ne $PythonInstallerHash) {
- throw "Invalid Python installer: failed checksum!"
- }
- Write-Host "Python installer $PythonInstallerPath validated."
-
- # Installs Python
- & $PythonInstallerPath /passive InstallAllUsers=1 PrependPath=1 Include_test=0 TargetDir=$PythonInstallPath
- if (-Not $?) {
- throw "The Python installation exited with error!"
- }
-
- # NOTE(lidiz) Even if the install command finishes in the script, that
- # doesn't mean the Python installation is finished. If using "ps" to check
- # for running processes, you might see ongoing installers at this point.
- # So, we needs this "hack" to reliably validate that the Python binary is
- # functioning properly.
-
- # Wait for the installer process
- Wait-Process -Name $PythonInstaller -Timeout 300
- Write-Host "Installation process exits normally."
-
- # Validate Python binary
- $PythonBinary = "$PythonInstallPath\python.exe"
- & $PythonBinary -c 'print(42)'
- Write-Host "Python binary works properly."
-
- # Installs pip
- & $PythonBinary -m ensurepip --user
-
- Write-Host "Python $PythonVersion installed by $PythonInstaller at $PythonInstallPath."
-}
-
-# Python 3.8
-$Python38x86Config = @{
- PythonVersion = "3.8.0"
- PythonInstaller = "python-3.8.0"
- PythonInstallPath = "C:\python38_32bit"
- PythonInstallerHash = "412a649d36626d33b8ca5593cf18318c"
-}
-Install-Python @Python38x86Config
-
-$Python38x64Config = @{
- PythonVersion = "3.8.0"
- PythonInstaller = "python-3.8.0-amd64"
- PythonInstallPath = "C:\python38"
- PythonInstallerHash = "29ea87f24c32f5e924b7d63f8a08ee8d"
-}
-Install-Python @Python38x64Config
-
-# Python 3.9
-$Python39x86Config = @{
- PythonVersion = "3.9.0"
- PythonInstaller = "python-3.9.0"
- PythonInstallPath = "C:\python39_32bit"
- PythonInstallerHash = "4a2812db8ab9f2e522c96c7728cfcccb"
-}
-Install-Python @Python39x86Config
-
-$Python39x64Config = @{
- PythonVersion = "3.9.0"
- PythonInstaller = "python-3.9.0-amd64"
- PythonInstallPath = "C:\python39"
- PythonInstallerHash = "b61a33dc28f13b561452f3089c87eb63"
-}
-Install-Python @Python39x64Config
-
-# Python 3.10
-$Python310x86Config = @{
- PythonVersion = "3.10.0"
- PythonInstaller = "python-3.10.0"
- PythonInstallPath = "C:\python310_32bit"
- PythonInstallerHash = "133aa48145032e341ad2a000cd3bff50"
-}
-Install-Python @Python310x86Config
-
-$Python310x64Config = @{
- PythonVersion = "3.10.0"
- PythonInstaller = "python-3.10.0-amd64"
- PythonInstallPath = "C:\python310"
- PythonInstallerHash = "c3917c08a7fe85db7203da6dcaa99a70"
-}
-Install-Python @Python310x64Config
diff --git a/kokoro/release/python/windows/presubmit.cfg b/kokoro/release/python/windows/presubmit.cfg
deleted file mode 100644
index 5261606..0000000
--- a/kokoro/release/python/windows/presubmit.cfg
+++ /dev/null
@@ -1,8 +0,0 @@
-# Configuration for Windows protoc release builds
-build_file: "protobuf/kokoro/release/python/windows/build_artifacts.bat"
-
-action {
- define_artifacts {
- regex: "github/protobuf/artifacts/**"
- }
-}
diff --git a/kokoro/release/python/windows/release.cfg b/kokoro/release/python/windows/release.cfg
deleted file mode 100644
index 5261606..0000000
--- a/kokoro/release/python/windows/release.cfg
+++ /dev/null
@@ -1,8 +0,0 @@
-# Configuration for Windows protoc release builds
-build_file: "protobuf/kokoro/release/python/windows/build_artifacts.bat"
-
-action {
- define_artifacts {
- regex: "github/protobuf/artifacts/**"
- }
-}
diff --git a/kokoro/release/python/linux/release.cfg b/kokoro/release/ruby/linux/common.cfg
similarity index 62%
rename from kokoro/release/python/linux/release.cfg
rename to kokoro/release/ruby/linux/common.cfg
index b31b3f1..dbc71b2 100644
--- a/kokoro/release/python/linux/release.cfg
+++ b/kokoro/release/ruby/linux/common.cfg
@@ -1,5 +1,5 @@
# Configuration for Linux release builds
-build_file: "protobuf/kokoro/release/python/linux/build_artifacts.sh"
+build_file: "protobuf/kokoro/release/ruby/linux/build_artifacts.sh"
action {
define_artifacts {
diff --git a/kokoro/release/ruby/linux/continuous.cfg b/kokoro/release/ruby/linux/continuous.cfg
index dbc71b2..8523c22 100644
--- a/kokoro/release/ruby/linux/continuous.cfg
+++ b/kokoro/release/ruby/linux/continuous.cfg
@@ -1,8 +1 @@
-# Configuration for Linux release builds
-build_file: "protobuf/kokoro/release/ruby/linux/build_artifacts.sh"
-
-action {
- define_artifacts {
- regex: "github/protobuf/artifacts/**"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/release/ruby/linux/presubmit.cfg b/kokoro/release/ruby/linux/presubmit.cfg
index dbc71b2..8523c22 100644
--- a/kokoro/release/ruby/linux/presubmit.cfg
+++ b/kokoro/release/ruby/linux/presubmit.cfg
@@ -1,8 +1 @@
-# Configuration for Linux release builds
-build_file: "protobuf/kokoro/release/ruby/linux/build_artifacts.sh"
-
-action {
- define_artifacts {
- regex: "github/protobuf/artifacts/**"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/release/ruby/linux/ruby/ruby_build.sh b/kokoro/release/ruby/linux/ruby/ruby_build.sh
index 761b54f..12d270e 100755
--- a/kokoro/release/ruby/linux/ruby/ruby_build.sh
+++ b/kokoro/release/ruby/linux/ruby/ruby_build.sh
@@ -5,8 +5,10 @@
# Build protoc
use_bazel.sh 5.1.1
bazel build //:protoc
-cp bazel-bin/protoc src/protoc
-export PROTOC=$PWD/src/protoc
+
+# The java build setup expects protoc in the root directory.
+cp bazel-bin/protoc .
+export PROTOC=$PWD/protoc
umask 0022
pushd ruby
diff --git a/kokoro/release/python/macos/continuous.cfg b/kokoro/release/ruby/macos/common.cfg
similarity index 63%
rename from kokoro/release/python/macos/continuous.cfg
rename to kokoro/release/ruby/macos/common.cfg
index 85cf81b..cb1c08b 100644
--- a/kokoro/release/python/macos/continuous.cfg
+++ b/kokoro/release/ruby/macos/common.cfg
@@ -1,5 +1,5 @@
# Configuration for Mac OSX release builds
-build_file: "protobuf/kokoro/release/python/macos/build_artifacts.sh"
+build_file: "protobuf/kokoro/release/ruby/macos/build_artifacts.sh"
action {
define_artifacts {
diff --git a/kokoro/release/ruby/macos/continuous.cfg b/kokoro/release/ruby/macos/continuous.cfg
index cb1c08b..8523c22 100644
--- a/kokoro/release/ruby/macos/continuous.cfg
+++ b/kokoro/release/ruby/macos/continuous.cfg
@@ -1,8 +1 @@
-# Configuration for Mac OSX release builds
-build_file: "protobuf/kokoro/release/ruby/macos/build_artifacts.sh"
-
-action {
- define_artifacts {
- regex: "github/protobuf/artifacts/**"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/release/ruby/macos/presubmit.cfg b/kokoro/release/ruby/macos/presubmit.cfg
index cb1c08b..8523c22 100644
--- a/kokoro/release/ruby/macos/presubmit.cfg
+++ b/kokoro/release/ruby/macos/presubmit.cfg
@@ -1,8 +1 @@
-# Configuration for Mac OSX release builds
-build_file: "protobuf/kokoro/release/ruby/macos/build_artifacts.sh"
-
-action {
- define_artifacts {
- regex: "github/protobuf/artifacts/**"
- }
-}
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/release/ruby/macos/ruby/ruby_build_environment.sh b/kokoro/release/ruby/macos/ruby/ruby_build_environment.sh
index 2906642..4002d6d 100755
--- a/kokoro/release/ruby/macos/ruby/ruby_build_environment.sh
+++ b/kokoro/release/ruby/macos/ruby/ruby_build_environment.sh
@@ -8,13 +8,9 @@
set +ex # rvm script is very verbose and exits with errorcode
-curl -sSL https://rvm.io/mpapis.asc | gpg --import -
-curl -sSL https://rvm.io/pkuczynski.asc | gpg --import -
-
-# Old OpenSSL versions cannot handle the SSL certificate used by
-# https://get.rvm.io, so as a workaround we download RVM directly from
-# GitHub. See this issue for details: https://github.com/rvm/rvm/issues/5133
-curl -sSL https://raw.githubusercontent.com/rvm/rvm/master/binscripts/rvm-installer | bash -s master --ruby
+# Fix permissions
+sudo chown -R $(whoami) $HOME/.rvm/
+sudo chown -R $(whoami) /Library/Ruby/
source $HOME/.rvm/scripts/rvm
set -e # rvm commands are very verbose
diff --git a/kokoro/windows/bazel/build.bat b/kokoro/windows/bazel/build.bat
new file mode 100644
index 0000000..55fba16
--- /dev/null
+++ b/kokoro/windows/bazel/build.bat
@@ -0,0 +1,33 @@
+@rem enter repo root
+cd /d %~dp0\..\..\..
+
+call kokoro\windows\prepare_build_win64.bat || goto :error
+
+@rem Allow Bazel to create short paths.
+fsutil 8dot3name set 0
+
+@rem TODO(b/241475022) Use docker to guarantee better stability.
+
+@rem Reinstall Bazel due to corrupt installation in kokoro.
+bazel version
+choco install bazel -y -i
+bazel version
+
+@rem Make paths as short as possible to avoid long path issues.
+set BAZEL_STARTUP=--output_user_root=C:/tmp --windows_enable_symlinks
+set BAZEL_FLAGS=--enable_runfiles --keep_going --test_output=streamed --verbose_failures
+
+@rem Build libraries first.
+bazel %BAZEL_STARTUP% build //:protoc //:protobuf //:protobuf_lite %BAZEL_FLAGS% || goto :error
+
+@rem Run C++ tests.
+@rem TODO(b/241484899) Enable conformance tests on windows.
+bazel %BAZEL_STARTUP% test %BAZEL_FLAGS% ^
+ --test_tag_filters=-conformance --build_tag_filters=-conformance ^
+ //src/... @com_google_protobuf_examples//... || goto :error
+
+goto :EOF
+
+:error
+echo Failed!
+exit /b 1
diff --git a/kokoro/macos/php7.3_mac/continuous.cfg b/kokoro/windows/bazel/common.cfg
similarity index 65%
copy from kokoro/macos/php7.3_mac/continuous.cfg
copy to kokoro/windows/bazel/common.cfg
index 9a71745..5978a7a 100644
--- a/kokoro/macos/php7.3_mac/continuous.cfg
+++ b/kokoro/windows/bazel/common.cfg
@@ -1,5 +1,5 @@
# Config file for running tests in Kokoro
# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/php7.3_mac/build.sh"
+build_file: "protobuf/kokoro/windows/bazel/build.bat"
timeout_mins: 1440
diff --git a/kokoro/windows/bazel/continuous.cfg b/kokoro/windows/bazel/continuous.cfg
new file mode 100644
index 0000000..8523c22
--- /dev/null
+++ b/kokoro/windows/bazel/continuous.cfg
@@ -0,0 +1 @@
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/windows/bazel/presubmit.cfg b/kokoro/windows/bazel/presubmit.cfg
new file mode 100644
index 0000000..8523c22
--- /dev/null
+++ b/kokoro/windows/bazel/presubmit.cfg
@@ -0,0 +1 @@
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/windows/cmake/build.bat b/kokoro/windows/cmake/build.bat
new file mode 100644
index 0000000..d24e635
--- /dev/null
+++ b/kokoro/windows/cmake/build.bat
@@ -0,0 +1,33 @@
+@rem enter repo root
+cd /d %~dp0\..\..\..
+
+call kokoro\windows\prepare_build_win64.bat || goto :error
+
+@rem TODO(b/241475022) Use docker to guarantee better stability.
+@rem TODO(b/241484899) Run conformance tests in windows.
+
+md build
+md %KOKORO_ARTIFACTS_DIR%\logs
+
+cd build
+
+cmake .. ^
+ -G "Visual Studio 15 2017" -A x64 ^
+ -Dprotobuf_BUILD_EXAMPLES=ON ^
+ -Dprotobuf_BUILD_CONFORMANCE=OFF ^
+ -Dprotobuf_WITH_ZLIB=OFF ^
+ -Dprotobuf_TEST_XML_OUTDIR=%KOKORO_ARTIFACTS_DIR%\logs\ || goto :error
+
+cmake --build . || goto :error
+
+ctest --verbose -C Debug || goto :error
+
+goto :success
+
+:error
+cd /d %~dp0\..\..\..
+echo Failed!
+exit /b 1
+
+:success
+cd ..
diff --git a/kokoro/macos/php7.3_mac/continuous.cfg b/kokoro/windows/cmake/common.cfg
similarity index 65%
copy from kokoro/macos/php7.3_mac/continuous.cfg
copy to kokoro/windows/cmake/common.cfg
index 9a71745..37e89e0 100644
--- a/kokoro/macos/php7.3_mac/continuous.cfg
+++ b/kokoro/windows/cmake/common.cfg
@@ -1,5 +1,5 @@
# Config file for running tests in Kokoro
# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/php7.3_mac/build.sh"
+build_file: "protobuf/kokoro/windows/cmake/build.bat"
timeout_mins: 1440
diff --git a/kokoro/windows/cmake/continuous.cfg b/kokoro/windows/cmake/continuous.cfg
new file mode 100644
index 0000000..8523c22
--- /dev/null
+++ b/kokoro/windows/cmake/continuous.cfg
@@ -0,0 +1 @@
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/windows/cmake/presubmit.cfg b/kokoro/windows/cmake/presubmit.cfg
new file mode 100644
index 0000000..8523c22
--- /dev/null
+++ b/kokoro/windows/cmake/presubmit.cfg
@@ -0,0 +1 @@
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/windows/cmake_install/build.bat b/kokoro/windows/cmake_install/build.bat
new file mode 100644
index 0000000..c5878de
--- /dev/null
+++ b/kokoro/windows/cmake_install/build.bat
@@ -0,0 +1,45 @@
+@rem enter repo root
+cd /d %~dp0\..\..\..
+
+call kokoro\windows\prepare_build_win64.bat || goto :error
+
+@rem TODO(b/241475022) Use docker to guarantee better stability.
+@rem TODO(b/241484899) Run conformance tests in windows.
+
+md build
+md %KOKORO_ARTIFACTS_DIR%\logs
+
+cd build
+
+@rem First install protobuf from source.
+cmake .. ^
+ -G "Visual Studio 15 2017" -A x64 ^
+ -Dprotobuf_BUILD_CONFORMANCE=OFF ^
+ -Dprotobuf_WITH_ZLIB=OFF || goto :error
+
+cmake --build . --target install || goto :error
+
+@rem Next run tests forcing the use of our installation.
+
+rm -rf *
+
+cmake .. ^
+ -G "Visual Studio 15 2017" -A x64 ^
+ -Dprotobuf_REMOVE_INSTALLED_HEADERS=ON ^
+ -Dprotobuf_BUILD_PROTOBUF_BINARIES=OFF ^
+ -Dprotobuf_BUILD_CONFORMANCE=OFF ^
+ -Dprotobuf_TEST_XML_OUTDIR=%KOKORO_ARTIFACTS_DIR%\logs\ || goto :error
+
+cmake --build . --target ALL_BUILD || goto :error
+
+ctest --verbose -C Debug || goto :error
+
+goto :success
+
+:error
+cd /d %~dp0\..\..\..
+echo Failed!
+exit /b 1
+
+:success
+cd ..
diff --git a/kokoro/macos/php7.3_mac/continuous.cfg b/kokoro/windows/cmake_install/common.cfg
similarity index 62%
copy from kokoro/macos/php7.3_mac/continuous.cfg
copy to kokoro/windows/cmake_install/common.cfg
index 9a71745..2efc0dc 100644
--- a/kokoro/macos/php7.3_mac/continuous.cfg
+++ b/kokoro/windows/cmake_install/common.cfg
@@ -1,5 +1,5 @@
# Config file for running tests in Kokoro
# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/php7.3_mac/build.sh"
+build_file: "protobuf/kokoro/windows/cmake_install/build.bat"
timeout_mins: 1440
diff --git a/kokoro/windows/cmake_install/continuous.cfg b/kokoro/windows/cmake_install/continuous.cfg
new file mode 100644
index 0000000..8523c22
--- /dev/null
+++ b/kokoro/windows/cmake_install/continuous.cfg
@@ -0,0 +1 @@
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/windows/cmake_install/presubmit.cfg b/kokoro/windows/cmake_install/presubmit.cfg
new file mode 100644
index 0000000..8523c22
--- /dev/null
+++ b/kokoro/windows/cmake_install/presubmit.cfg
@@ -0,0 +1 @@
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/windows/cmake_shared/build.bat b/kokoro/windows/cmake_shared/build.bat
new file mode 100644
index 0000000..d4bb2b1
--- /dev/null
+++ b/kokoro/windows/cmake_shared/build.bat
@@ -0,0 +1,33 @@
+@rem enter repo root
+cd /d %~dp0\..\..\..
+
+call kokoro\windows\prepare_build_win64.bat || goto :error
+
+@rem TODO(b/241475022) Use docker to guarantee better stability.
+@rem TODO(b/241484899) Run conformance tests in windows.
+
+md build
+md %KOKORO_ARTIFACTS_DIR%\logs
+
+cd build
+
+cmake .. ^
+ -G "Visual Studio 15 2017" -A x64 ^
+ -Dprotobuf_BUILD_SHARED_LIBS=ON ^
+ -Dprotobuf_BUILD_CONFORMANCE=OFF ^
+ -Dprotobuf_WITH_ZLIB=OFF ^
+ -Dprotobuf_TEST_XML_OUTDIR=%KOKORO_ARTIFACTS_DIR%\logs\ || goto :error
+
+cmake --build . || goto :error
+
+ctest --verbose -C Debug || goto :error
+
+goto :success
+
+:error
+cd /d %~dp0\..\..\..
+echo Failed!
+exit /b 1
+
+:success
+cd ..
diff --git a/kokoro/macos/php7.3_mac/continuous.cfg b/kokoro/windows/cmake_shared/common.cfg
similarity index 63%
copy from kokoro/macos/php7.3_mac/continuous.cfg
copy to kokoro/windows/cmake_shared/common.cfg
index 9a71745..0ba52e2 100644
--- a/kokoro/macos/php7.3_mac/continuous.cfg
+++ b/kokoro/windows/cmake_shared/common.cfg
@@ -1,5 +1,5 @@
# Config file for running tests in Kokoro
# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/php7.3_mac/build.sh"
+build_file: "protobuf/kokoro/windows/cmake_shared/build.bat"
timeout_mins: 1440
diff --git a/kokoro/windows/cmake_shared/continuous.cfg b/kokoro/windows/cmake_shared/continuous.cfg
new file mode 100644
index 0000000..8523c22
--- /dev/null
+++ b/kokoro/windows/cmake_shared/continuous.cfg
@@ -0,0 +1 @@
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/windows/cmake_shared/presubmit.cfg b/kokoro/windows/cmake_shared/presubmit.cfg
new file mode 100644
index 0000000..8523c22
--- /dev/null
+++ b/kokoro/windows/cmake_shared/presubmit.cfg
@@ -0,0 +1 @@
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/macos/php7.3_mac/continuous.cfg b/kokoro/windows/csharp/common.cfg
similarity index 65%
copy from kokoro/macos/php7.3_mac/continuous.cfg
copy to kokoro/windows/csharp/common.cfg
index 9a71745..f586585 100644
--- a/kokoro/macos/php7.3_mac/continuous.cfg
+++ b/kokoro/windows/csharp/common.cfg
@@ -1,5 +1,5 @@
# Config file for running tests in Kokoro
# Location of the build script in repository
-build_file: "protobuf/kokoro/macos/php7.3_mac/build.sh"
+build_file: "protobuf/kokoro/windows/csharp/build.bat"
timeout_mins: 1440
diff --git a/kokoro/windows/csharp/continuous.cfg b/kokoro/windows/csharp/continuous.cfg
index f586585..8523c22 100644
--- a/kokoro/windows/csharp/continuous.cfg
+++ b/kokoro/windows/csharp/continuous.cfg
@@ -1,5 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/windows/csharp/build.bat"
-timeout_mins: 1440
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/windows/csharp/presubmit.cfg b/kokoro/windows/csharp/presubmit.cfg
index f586585..8523c22 100644
--- a/kokoro/windows/csharp/presubmit.cfg
+++ b/kokoro/windows/csharp/presubmit.cfg
@@ -1,5 +1 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/windows/csharp/build.bat"
-timeout_mins: 1440
+# Keep this file empty! Use common.cfg instead.
diff --git a/kokoro/windows/prepare_build_win64.bat b/kokoro/windows/prepare_build_win64.bat
new file mode 100644
index 0000000..d8eb2a2
--- /dev/null
+++ b/kokoro/windows/prepare_build_win64.bat
@@ -0,0 +1,16 @@
+@rem Update Chocolatey
+choco upgrade -y --no-progress chocolatey
+choco install -y --no-progress --pre cmake
+
+@rem Enable long paths.
+Powershell.exe -Command "New-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem -Name LongPathsEnabled -Value 1 -PropertyType DWORD -Force"
+
+@rem Update git submodules.
+git submodule update --init --recursive
+
+@rem Select Visual Studio 2017.
+call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat" x64
+
+@rem Convert Windows line breaks to Unix line breaks
+@rem This allows text-matching tests to pass
+find . -type f -print0 | xargs -0 d2u
diff --git a/m4/ac_system_extensions.m4 b/m4/ac_system_extensions.m4
deleted file mode 100644
index 1ca2eeb..0000000
--- a/m4/ac_system_extensions.m4
+++ /dev/null
@@ -1,37 +0,0 @@
-dnl Provide AC_USE_SYSTEM_EXTENSIONS for old autoconf machines.
-AC_DEFUN([ACX_USE_SYSTEM_EXTENSIONS],[
- ifdef([AC_USE_SYSTEM_EXTENSIONS],[
- AC_USE_SYSTEM_EXTENSIONS
- ],[
- AC_BEFORE([$0], [AC_COMPILE_IFELSE])
- AC_BEFORE([$0], [AC_RUN_IFELSE])
-
- AC_REQUIRE([AC_GNU_SOURCE])
- AC_REQUIRE([AC_AIX])
- AC_REQUIRE([AC_MINIX])
-
- AH_VERBATIM([__EXTENSIONS__],
-[/* Enable extensions on Solaris. */
-#ifndef __EXTENSIONS__
-# undef __EXTENSIONS__
-#endif
-#ifndef _POSIX_PTHREAD_SEMANTICS
-# undef _POSIX_PTHREAD_SEMANTICS
-#endif
-#ifndef _TANDEM_SOURCE
-# undef _TANDEM_SOURCE
-#endif])
- AC_CACHE_CHECK([whether it is safe to define __EXTENSIONS__],
- [ac_cv_safe_to_define___extensions__],
- [AC_COMPILE_IFELSE(
- [AC_LANG_PROGRAM([
-# define __EXTENSIONS__ 1
- AC_INCLUDES_DEFAULT])],
- [ac_cv_safe_to_define___extensions__=yes],
- [ac_cv_safe_to_define___extensions__=no])])
- test $ac_cv_safe_to_define___extensions__ = yes &&
- AC_DEFINE([__EXTENSIONS__])
- AC_DEFINE([_POSIX_PTHREAD_SEMANTICS])
- AC_DEFINE([_TANDEM_SOURCE])
- ])
-])
diff --git a/m4/acx_check_suncc.m4 b/m4/acx_check_suncc.m4
deleted file mode 100644
index 0a9a577..0000000
--- a/m4/acx_check_suncc.m4
+++ /dev/null
@@ -1,73 +0,0 @@
-dnl Check for the presence of the Sun Studio compiler.
-dnl If Sun Studio compiler is found, set appropriate flags.
-dnl Additionally, Sun Studio doesn't default to 64-bit by itself,
-dnl nor does it automatically look in standard Solaris places for
-dnl 64-bit libs, so we must add those options and paths to the search
-dnl paths.
-
-dnl TODO(kenton): This is pretty hacky. It sets CXXFLAGS, which the autoconf
-dnl docs say should never be overridden except by the user. It also isn't
-dnl cross-compile safe. We should fix these problems, but since I don't have
-dnl Sun CC at my disposal for testing, someone else will have to do it.
-
-AC_DEFUN([ACX_CHECK_SUNCC],[
-
- AC_LANG_PUSH([C++])
- AC_CHECK_DECL([__SUNPRO_CC], [SUNCC="yes"], [SUNCC="no"])
- AC_LANG_POP()
-
-
- AC_ARG_ENABLE([64bit-solaris],
- [AS_HELP_STRING([--disable-64bit-solaris],
- [Build 64 bit binary on Solaris @<:@default=on@:>@])],
- [ac_enable_64bit="$enableval"],
- [ac_enable_64bit="yes"])
-
- AS_IF([test "$SUNCC" = "yes" -a "x${ac_cv_env_CXXFLAGS_set}" = "x"],[
- dnl Sun Studio has a crashing bug with -xO4 in some cases. Keep this
- dnl at -xO3 until a proper test to detect those crashes can be done.
- CXXFLAGS="-g0 -xO3 -xlibmil -xdepend -xbuiltin -mt -template=no%extdef ${CXXFLAGS}"
- ])
-
- case $host_os in
- *solaris*)
- AC_CHECK_PROGS(ISAINFO, [isainfo], [no])
- AS_IF([test "x$ISAINFO" != "xno"],
- [isainfo_b=`${ISAINFO} -b`],
- [isainfo_b="x"])
-
- AS_IF([test "$isainfo_b" != "x"],[
-
- isainfo_k=`${ISAINFO} -k`
-
- AS_IF([test "x$ac_enable_64bit" = "xyes"],[
-
- AS_IF([test "x$libdir" = "x\${exec_prefix}/lib"],[
- dnl The user hasn't overridden the default libdir, so we'll
- dnl the dir suffix to match solaris 32/64-bit policy
- libdir="${libdir}/${isainfo_k}"
- ])
-
- dnl This should just be set in CPPFLAGS and in LDFLAGS, but libtool
- dnl does the wrong thing if you don't put it into CXXFLAGS. sigh.
- dnl (It also needs it in CFLAGS, or it does a different wrong thing!)
- CXXFLAGS="${CXXFLAGS} -m64"
- ac_cv_env_CXXFLAGS_set=set
- ac_cv_env_CXXFLAGS_value='-m64'
-
- CFLAGS="${CFLAGS} -m64"
- ac_cv_env_CFLAGS_set=set
- ac_cv_env_CFLAGS_value='-m64'
-
- AS_IF([test "$target_cpu" = "sparc" -a "x$SUNCC" = "xyes" ],[
- CXXFLAGS="-xmemalign=8s ${CXXFLAGS}"
- ])
- ])
- ])
- ;;
- esac
-
- AS_IF([test "$target_cpu" = "sparc" -a "x$SUNCC" = "xyes" ],[
- CXXFLAGS="-xregs=no%appl ${CXXFLAGS}"
- ])
-])
diff --git a/m4/ax_cxx_compile_stdcxx.m4 b/m4/ax_cxx_compile_stdcxx.m4
deleted file mode 100644
index d3288e2..0000000
--- a/m4/ax_cxx_compile_stdcxx.m4
+++ /dev/null
@@ -1,1001 +0,0 @@
-# ===========================================================================
-# http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-# AX_CXX_COMPILE_STDCXX(VERSION, [ext|noext], [mandatory|optional])
-#
-# DESCRIPTION
-#
-# Check for baseline language coverage in the compiler for the specified
-# version of the C++ standard. If necessary, add switches to CXX and
-# CXXCPP to enable support. VERSION may be '11' (for the C++11 standard)
-# or '14' (for the C++14 standard).
-#
-# The second argument, if specified, indicates whether you insist on an
-# extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g.
-# -std=c++11). If neither is specified, you get whatever works, with
-# preference for an extended mode.
-#
-# The third argument, if specified 'mandatory' or if left unspecified,
-# indicates that baseline support for the specified C++ standard is
-# required and that the macro should error out if no mode with that
-# support is found. If specified 'optional', then configuration proceeds
-# regardless, after defining HAVE_CXX${VERSION} if and only if a
-# supporting mode is found.
-#
-# LICENSE
-#
-# Copyright (c) 2008 Benjamin Kosnik <bkoz@redhat.com>
-# Copyright (c) 2012 Zack Weinberg <zackw@panix.com>
-# Copyright (c) 2013 Roy Stogner <roystgnr@ices.utexas.edu>
-# Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov <sokolov@google.com>
-# Copyright (c) 2015 Paul Norman <penorman@mac.com>
-# Copyright (c) 2015 Moritz Klammler <moritz@klammler.eu>
-# Copyright (c) 2016 Krzesimir Nowak <qdlacz@gmail.com>
-#
-# Copying and distribution of this file, with or without modification, are
-# permitted in any medium without royalty provided the copyright notice
-# and this notice are preserved. This file is offered as-is, without any
-# warranty.
-
-#serial 6
-
-dnl This macro is based on the code from the AX_CXX_COMPILE_STDCXX_11 macro
-dnl (serial version number 13).
-
-AX_REQUIRE_DEFINED([AC_MSG_WARN])
-AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl
- m4_if([$1], [11], [ax_cxx_compile_alternatives="11 0x"],
- [$1], [14], [ax_cxx_compile_alternatives="14 1y"],
- [$1], [17], [ax_cxx_compile_alternatives="17 1z"],
- [m4_fatal([invalid first argument `$1' to AX_CXX_COMPILE_STDCXX])])dnl
- m4_if([$2], [], [],
- [$2], [ext], [],
- [$2], [noext], [],
- [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX])])dnl
- m4_if([$3], [], [ax_cxx_compile_cxx$1_required=true],
- [$3], [mandatory], [ax_cxx_compile_cxx$1_required=true],
- [$3], [optional], [ax_cxx_compile_cxx$1_required=false],
- [m4_fatal([invalid third argument `$3' to AX_CXX_COMPILE_STDCXX])])
- AC_LANG_PUSH([C++])dnl
- ac_success=no
- AC_CACHE_CHECK(whether $CXX supports C++$1 features by default,
- ax_cv_cxx_compile_cxx$1,
- [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
- [ax_cv_cxx_compile_cxx$1=yes],
- [ax_cv_cxx_compile_cxx$1=no])])
- if test x$ax_cv_cxx_compile_cxx$1 = xyes; then
- ac_success=yes
- fi
-
- m4_if([$2], [noext], [], [dnl
- if test x$ac_success = xno; then
- for alternative in ${ax_cxx_compile_alternatives}; do
- switch="-std=gnu++${alternative}"
- cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch])
- AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch,
- $cachevar,
- [ac_save_CXX="$CXX"
- CXX="$CXX $switch"
- AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
- [eval $cachevar=yes],
- [eval $cachevar=no])
- CXX="$ac_save_CXX"])
- if eval test x\$$cachevar = xyes; then
- CXX="$CXX $switch"
- if test -n "$CXXCPP" ; then
- CXXCPP="$CXXCPP $switch"
- fi
- ac_success=yes
- break
- fi
- done
- fi])
-
- m4_if([$2], [ext], [], [dnl
- if test x$ac_success = xno; then
- dnl HP's aCC needs +std=c++11 according to:
- dnl http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/PDF_Release_Notes/769149-001.pdf
- dnl Cray's crayCC needs "-h std=c++11"
- for alternative in ${ax_cxx_compile_alternatives}; do
- for switch in -std=c++${alternative} +std=c++${alternative} "-h std=c++${alternative}"; do
- cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch])
- AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch,
- $cachevar,
- [ac_save_CXX="$CXX"
- CXX="$CXX $switch"
- AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
- [eval $cachevar=yes],
- [eval $cachevar=no])
- CXX="$ac_save_CXX"])
- if eval test x\$$cachevar = xyes; then
- CXX="$CXX $switch"
- if test -n "$CXXCPP" ; then
- CXXCPP="$CXXCPP $switch"
- fi
- ac_success=yes
- break
- fi
- done
- if test x$ac_success = xyes; then
- break
- fi
- done
- fi])
- AC_LANG_POP([C++])
- if test x$ax_cxx_compile_cxx$1_required = xtrue; then
- if test x$ac_success = xno; then
- AC_MSG_ERROR([*** A compiler with support for C++$1 language features is required.])
- fi
- fi
- if test x$ac_success = xno; then
- HAVE_CXX$1=0
- AC_MSG_NOTICE([No compiler with C++$1 support was found])
- else
- HAVE_CXX$1=1
- AC_DEFINE(HAVE_CXX$1,1,
- [define if the compiler supports basic C++$1 syntax])
- fi
- AC_SUBST(HAVE_CXX$1)
- m4_if([$1], [17], [AC_MSG_WARN([C++17 is not yet standardized, so the checks may change in incompatible ways anytime])])
-])
-
-
-dnl Test body for checking C++11 support
-
-m4_define([_AX_CXX_COMPILE_STDCXX_testbody_11],
- _AX_CXX_COMPILE_STDCXX_testbody_new_in_11
-)
-
-
-dnl Test body for checking C++14 support
-
-m4_define([_AX_CXX_COMPILE_STDCXX_testbody_14],
- _AX_CXX_COMPILE_STDCXX_testbody_new_in_11
- _AX_CXX_COMPILE_STDCXX_testbody_new_in_14
-)
-
-m4_define([_AX_CXX_COMPILE_STDCXX_testbody_17],
- _AX_CXX_COMPILE_STDCXX_testbody_new_in_11
- _AX_CXX_COMPILE_STDCXX_testbody_new_in_14
- _AX_CXX_COMPILE_STDCXX_testbody_new_in_17
-)
-
-dnl Tests for new features in C++11
-
-m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_11], [[
-
-// If the compiler admits that it is not ready for C++11, why torture it?
-// Hopefully, this will speed up the test.
-
-#ifndef __cplusplus
-
-#error "This is not a C++ compiler"
-
-#elif __cplusplus < 201103L
-
-#error "This is not a C++11 compiler"
-
-#else
-
-#include <utility>
-
-namespace cxx11
-{
-
- namespace test_static_assert
- {
-
- template <typename T>
- struct check
- {
- static_assert(sizeof(int) <= sizeof(T), "not big enough");
- };
-
- }
-
- namespace test_final_override
- {
-
- struct Base
- {
- virtual void f() {}
- };
-
- struct Derived : public Base
- {
- virtual void f() override {}
- };
-
- }
-
- namespace test_double_right_angle_brackets
- {
-
- template < typename T >
- struct check {};
-
- typedef check<void> single_type;
- typedef check<check<void>> double_type;
- typedef check<check<check<void>>> triple_type;
- typedef check<check<check<check<void>>>> quadruple_type;
-
- }
-
- namespace test_decltype
- {
-
- int
- f()
- {
- int a = 1;
- decltype(a) b = 2;
- return a + b;
- }
-
- }
-
- namespace test_type_deduction
- {
-
- template < typename T1, typename T2 >
- struct is_same
- {
- static const bool value = false;
- };
-
- template < typename T >
- struct is_same<T, T>
- {
- static const bool value = true;
- };
-
- template < typename T1, typename T2 >
- auto
- add(T1 a1, T2 a2) -> decltype(a1 + a2)
- {
- return a1 + a2;
- }
-
- int
- test(const int c, volatile int v)
- {
- static_assert(is_same<int, decltype(0)>::value == true, "");
- static_assert(is_same<int, decltype(c)>::value == false, "");
- static_assert(is_same<int, decltype(v)>::value == false, "");
- auto ac = c;
- auto av = v;
- auto sumi = ac + av + 'x';
- auto sumf = ac + av + 1.0;
- static_assert(is_same<int, decltype(ac)>::value == true, "");
- static_assert(is_same<int, decltype(av)>::value == true, "");
- static_assert(is_same<int, decltype(sumi)>::value == true, "");
- static_assert(is_same<int, decltype(sumf)>::value == false, "");
- static_assert(is_same<int, decltype(add(c, v))>::value == true, "");
- return (sumf > 0.0) ? sumi : add(c, v);
- }
-
- }
-
- namespace test_noexcept
- {
-
- int f() { return 0; }
- int g() noexcept { return 0; }
-
- static_assert(noexcept(f()) == false, "");
- static_assert(noexcept(g()) == true, "");
-
- }
-
- namespace test_constexpr
- {
-
- template < typename CharT >
- unsigned long constexpr
- strlen_c_r(const CharT *const s, const unsigned long acc) noexcept
- {
- return *s ? strlen_c_r(s + 1, acc + 1) : acc;
- }
-
- template < typename CharT >
- unsigned long constexpr
- strlen_c(const CharT *const s) noexcept
- {
- return strlen_c_r(s, 0UL);
- }
-
- static_assert(strlen_c("") == 0UL, "");
- static_assert(strlen_c("1") == 1UL, "");
- static_assert(strlen_c("example") == 7UL, "");
- static_assert(strlen_c("another\0example") == 7UL, "");
-
- }
-
- namespace test_rvalue_references
- {
-
- template < int N >
- struct answer
- {
- static constexpr int value = N;
- };
-
- answer<1> f(int&) { return answer<1>(); }
- answer<2> f(const int&) { return answer<2>(); }
- answer<3> f(int&&) { return answer<3>(); }
-
- void
- test()
- {
- int i = 0;
- const int c = 0;
- static_assert(decltype(f(i))::value == 1, "");
- static_assert(decltype(f(c))::value == 2, "");
- static_assert(decltype(f(0))::value == 3, "");
- }
-
- }
-
- namespace test_uniform_initialization
- {
-
- struct test
- {
- static const int zero {};
- static const int one {1};
- };
-
- static_assert(test::zero == 0, "");
- static_assert(test::one == 1, "");
-
- }
-
- namespace test_lambdas
- {
-
- void
- test1()
- {
- auto lambda1 = [](){};
- auto lambda2 = lambda1;
- lambda1();
- lambda2();
- }
-
- int
- test2()
- {
- auto a = [](int i, int j){ return i + j; }(1, 2);
- auto b = []() -> int { return '0'; }();
- auto c = [=](){ return a + b; }();
- auto d = [&](){ return c; }();
- auto e = [a, &b](int x) mutable {
- const auto identity = [](int y){ return y; };
- for (auto i = 0; i < a; ++i)
- a += b--;
- return x + identity(a + b);
- }(0);
- return a + b + c + d + e;
- }
-
- int
- test3()
- {
- const auto nullary = [](){ return 0; };
- const auto unary = [](int x){ return x; };
- using nullary_t = decltype(nullary);
- using unary_t = decltype(unary);
- const auto higher1st = [](nullary_t f){ return f(); };
- const auto higher2nd = [unary](nullary_t f1){
- return [unary, f1](unary_t f2){ return f2(unary(f1())); };
- };
- return higher1st(nullary) + higher2nd(nullary)(unary);
- }
-
- }
-
- namespace test_variadic_templates
- {
-
- template <int...>
- struct sum;
-
- template <int N0, int... N1toN>
- struct sum<N0, N1toN...>
- {
- static constexpr auto value = N0 + sum<N1toN...>::value;
- };
-
- template <>
- struct sum<>
- {
- static constexpr auto value = 0;
- };
-
- static_assert(sum<>::value == 0, "");
- static_assert(sum<1>::value == 1, "");
- static_assert(sum<23>::value == 23, "");
- static_assert(sum<1, 2>::value == 3, "");
- static_assert(sum<5, 5, 11>::value == 21, "");
- static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, "");
-
- }
-
- // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae
- // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function
- // because of this.
- namespace test_template_alias_sfinae
- {
-
- struct foo {};
-
- template<typename T>
- using member = typename T::member_type;
-
- template<typename T>
- void func(...) {}
-
- template<typename T>
- void func(member<T>*) {}
-
- void test();
-
- void test() { func<foo>(0); }
-
- }
-
- namespace test_std_move_and_forward
- {
- struct message {};
- char foo(message&) { return '\0'; }
- int foo(message&&) { return 0; }
-
- template<typename Arg, typename RT>
- void check(Arg&& arg, RT rt) {
- static_assert(sizeof(rt) == sizeof(foo(std::forward<Arg>(arg))), "");
- }
- void test() {
- message a;
- check(a, char());
- check(std::move(a), int());
- }
- }
-
-} // namespace cxx11
-
-#endif // __cplusplus >= 201103L
-
-]])
-
-
-dnl Tests for new features in C++14
-
-m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_14], [[
-
-// If the compiler admits that it is not ready for C++14, why torture it?
-// Hopefully, this will speed up the test.
-
-#ifndef __cplusplus
-
-#error "This is not a C++ compiler"
-
-#elif __cplusplus < 201402L
-
-#error "This is not a C++14 compiler"
-
-#else
-
-namespace cxx14
-{
-
- namespace test_polymorphic_lambdas
- {
-
- int
- test()
- {
- const auto lambda = [](auto&&... args){
- const auto istiny = [](auto x){
- return (sizeof(x) == 1UL) ? 1 : 0;
- };
- const int aretiny[] = { istiny(args)... };
- return aretiny[0];
- };
- return lambda(1, 1L, 1.0f, '1');
- }
-
- }
-
- namespace test_binary_literals
- {
-
- constexpr auto ivii = 0b0000000000101010;
- static_assert(ivii == 42, "wrong value");
-
- }
-
- namespace test_generalized_constexpr
- {
-
- template < typename CharT >
- constexpr unsigned long
- strlen_c(const CharT *const s) noexcept
- {
- auto length = 0UL;
- for (auto p = s; *p; ++p)
- ++length;
- return length;
- }
-
- static_assert(strlen_c("") == 0UL, "");
- static_assert(strlen_c("x") == 1UL, "");
- static_assert(strlen_c("test") == 4UL, "");
- static_assert(strlen_c("another\0test") == 7UL, "");
-
- }
-
- namespace test_lambda_init_capture
- {
-
- int
- test()
- {
- auto x = 0;
- const auto lambda1 = [a = x](int b){ return a + b; };
- const auto lambda2 = [a = lambda1(x)](){ return a; };
- return lambda2();
- }
-
- }
-
- namespace test_digit_separators
- {
-
- constexpr auto ten_million = 100'000'000;
- static_assert(ten_million == 100000000, "");
-
- }
-
- namespace test_return_type_deduction
- {
-
- auto f(int& x) { return x; }
- decltype(auto) g(int& x) { return x; }
-
- template < typename T1, typename T2 >
- struct is_same
- {
- static constexpr auto value = false;
- };
-
- template < typename T >
- struct is_same<T, T>
- {
- static constexpr auto value = true;
- };
-
- int
- test()
- {
- auto x = 0;
- static_assert(is_same<int, decltype(f(x))>::value, "");
- static_assert(is_same<int&, decltype(g(x))>::value, "");
- return x;
- }
-
- }
-
-} // namespace cxx14
-
-#endif // __cplusplus >= 201402L
-
-]])
-
-
-dnl Tests for new features in C++17
-
-m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_17], [[
-
-// If the compiler admits that it is not ready for C++17, why torture it?
-// Hopefully, this will speed up the test.
-
-#ifndef __cplusplus
-
-#error "This is not a C++ compiler"
-
-#elif __cplusplus <= 201402L
-
-#error "This is not a C++17 compiler"
-
-#else
-
-#if defined(__clang__)
- #define REALLY_CLANG
-#else
- #if defined(__GNUC__)
- #define REALLY_GCC
- #endif
-#endif
-
-#include <initializer_list>
-#include <utility>
-#include <type_traits>
-
-namespace cxx17
-{
-
-#if !defined(REALLY_CLANG)
- namespace test_constexpr_lambdas
- {
-
- // TODO: test it with clang++ from git
-
- constexpr int foo = [](){return 42;}();
-
- }
-#endif // !defined(REALLY_CLANG)
-
- namespace test::nested_namespace::definitions
- {
-
- }
-
- namespace test_fold_expression
- {
-
- template<typename... Args>
- int multiply(Args... args)
- {
- return (args * ... * 1);
- }
-
- template<typename... Args>
- bool all(Args... args)
- {
- return (args && ...);
- }
-
- }
-
- namespace test_extended_static_assert
- {
-
- static_assert (true);
-
- }
-
- namespace test_auto_brace_init_list
- {
-
- auto foo = {5};
- auto bar {5};
-
- static_assert(std::is_same<std::initializer_list<int>, decltype(foo)>::value);
- static_assert(std::is_same<int, decltype(bar)>::value);
- }
-
- namespace test_typename_in_template_template_parameter
- {
-
- template<template<typename> typename X> struct D;
-
- }
-
- namespace test_fallthrough_nodiscard_maybe_unused_attributes
- {
-
- int f1()
- {
- return 42;
- }
-
- [[nodiscard]] int f2()
- {
- [[maybe_unused]] auto unused = f1();
-
- switch (f1())
- {
- case 17:
- f1();
- [[fallthrough]];
- case 42:
- f1();
- }
- return f1();
- }
-
- }
-
- namespace test_extended_aggregate_initialization
- {
-
- struct base1
- {
- int b1, b2 = 42;
- };
-
- struct base2
- {
- base2() {
- b3 = 42;
- }
- int b3;
- };
-
- struct derived : base1, base2
- {
- int d;
- };
-
- derived d1 {{1, 2}, {}, 4}; // full initialization
- derived d2 {{}, {}, 4}; // value-initialized bases
-
- }
-
- namespace test_general_range_based_for_loop
- {
-
- struct iter
- {
- int i;
-
- int& operator* ()
- {
- return i;
- }
-
- const int& operator* () const
- {
- return i;
- }
-
- iter& operator++()
- {
- ++i;
- return *this;
- }
- };
-
- struct sentinel
- {
- int i;
- };
-
- bool operator== (const iter& i, const sentinel& s)
- {
- return i.i == s.i;
- }
-
- bool operator!= (const iter& i, const sentinel& s)
- {
- return !(i == s);
- }
-
- struct range
- {
- iter begin() const
- {
- return {0};
- }
-
- sentinel end() const
- {
- return {5};
- }
- };
-
- void f()
- {
- range r {};
-
- for (auto i : r)
- {
- [[maybe_unused]] auto v = i;
- }
- }
-
- }
-
- namespace test_lambda_capture_asterisk_this_by_value
- {
-
- struct t
- {
- int i;
- int foo()
- {
- return [*this]()
- {
- return i;
- }();
- }
- };
-
- }
-
- namespace test_enum_class_construction
- {
-
- enum class byte : unsigned char
- {};
-
- byte foo {42};
-
- }
-
- namespace test_constexpr_if
- {
-
- template <bool cond>
- int f ()
- {
- if constexpr(cond)
- {
- return 13;
- }
- else
- {
- return 42;
- }
- }
-
- }
-
- namespace test_selection_statement_with_initializer
- {
-
- int f()
- {
- return 13;
- }
-
- int f2()
- {
- if (auto i = f(); i > 0)
- {
- return 3;
- }
-
- switch (auto i = f(); i + 4)
- {
- case 17:
- return 2;
-
- default:
- return 1;
- }
- }
-
- }
-
-#if !defined(REALLY_CLANG)
- namespace test_template_argument_deduction_for_class_templates
- {
-
- // TODO: test it with clang++ from git
-
- template <typename T1, typename T2>
- struct pair
- {
- pair (T1 p1, T2 p2)
- : m1 {p1},
- m2 {p2}
- {}
-
- T1 m1;
- T2 m2;
- };
-
- void f()
- {
- [[maybe_unused]] auto p = pair{13, 42u};
- }
-
- }
-#endif // !defined(REALLY_CLANG)
-
- namespace test_non_type_auto_template_parameters
- {
-
- template <auto n>
- struct B
- {};
-
- B<5> b1;
- B<'a'> b2;
-
- }
-
-#if !defined(REALLY_CLANG)
- namespace test_structured_bindings
- {
-
- // TODO: test it with clang++ from git
-
- int arr[2] = { 1, 2 };
- std::pair<int, int> pr = { 1, 2 };
-
- auto f1() -> int(&)[2]
- {
- return arr;
- }
-
- auto f2() -> std::pair<int, int>&
- {
- return pr;
- }
-
- struct S
- {
- int x1 : 2;
- volatile double y1;
- };
-
- S f3()
- {
- return {};
- }
-
- auto [ x1, y1 ] = f1();
- auto& [ xr1, yr1 ] = f1();
- auto [ x2, y2 ] = f2();
- auto& [ xr2, yr2 ] = f2();
- const auto [ x3, y3 ] = f3();
-
- }
-#endif // !defined(REALLY_CLANG)
-
-#if !defined(REALLY_CLANG)
- namespace test_exception_spec_type_system
- {
-
- // TODO: test it with clang++ from git
-
- struct Good {};
- struct Bad {};
-
- void g1() noexcept;
- void g2();
-
- template<typename T>
- Bad
- f(T*, T*);
-
- template<typename T1, typename T2>
- Good
- f(T1*, T2*);
-
- static_assert (std::is_same_v<Good, decltype(f(g1, g2))>);
-
- }
-#endif // !defined(REALLY_CLANG)
-
- namespace test_inline_variables
- {
-
- template<class T> void f(T)
- {}
-
- template<class T> inline T g(T)
- {
- return T{};
- }
-
- template<> inline void f<>(int)
- {}
-
- template<> int g<>(int)
- {
- return 5;
- }
-
- }
-
-} // namespace cxx17
-
-#endif // __cplusplus <= 201402L
-
-]])
diff --git a/m4/ax_prog_cc_for_build.m4 b/m4/ax_prog_cc_for_build.m4
deleted file mode 100644
index 77fd346..0000000
--- a/m4/ax_prog_cc_for_build.m4
+++ /dev/null
@@ -1,125 +0,0 @@
-# ===========================================================================
-# http://www.gnu.org/software/autoconf-archive/ax_prog_cc_for_build.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-# AX_PROG_CC_FOR_BUILD
-#
-# DESCRIPTION
-#
-# This macro searches for a C compiler that generates native executables,
-# that is a C compiler that surely is not a cross-compiler. This can be
-# useful if you have to generate source code at compile-time like for
-# example GCC does.
-#
-# The macro sets the CC_FOR_BUILD and CPP_FOR_BUILD macros to anything
-# needed to compile or link (CC_FOR_BUILD) and preprocess (CPP_FOR_BUILD).
-# The value of these variables can be overridden by the user by specifying
-# a compiler with an environment variable (like you do for standard CC).
-#
-# It also sets BUILD_EXEEXT and BUILD_OBJEXT to the executable and object
-# file extensions for the build platform, and GCC_FOR_BUILD to `yes' if
-# the compiler we found is GCC. All these variables but GCC_FOR_BUILD are
-# substituted in the Makefile.
-#
-# LICENSE
-#
-# Copyright (c) 2008 Paolo Bonzini <bonzini@gnu.org>
-#
-# Copying and distribution of this file, with or without modification, are
-# permitted in any medium without royalty provided the copyright notice
-# and this notice are preserved. This file is offered as-is, without any
-# warranty.
-
-#serial 8
-
-AU_ALIAS([AC_PROG_CC_FOR_BUILD], [AX_PROG_CC_FOR_BUILD])
-AC_DEFUN([AX_PROG_CC_FOR_BUILD], [dnl
-AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([AC_PROG_CPP])dnl
-AC_REQUIRE([AC_EXEEXT])dnl
-AC_REQUIRE([AC_CANONICAL_HOST])dnl
-
-dnl Use the standard macros, but make them use other variable names
-dnl
-pushdef([ac_cv_prog_CPP], ac_cv_build_prog_CPP)dnl
-pushdef([ac_cv_prog_gcc], ac_cv_build_prog_gcc)dnl
-pushdef([ac_cv_prog_cc_works], ac_cv_build_prog_cc_works)dnl
-pushdef([ac_cv_prog_cc_cross], ac_cv_build_prog_cc_cross)dnl
-pushdef([ac_cv_prog_cc_g], ac_cv_build_prog_cc_g)dnl
-pushdef([ac_cv_exeext], ac_cv_build_exeext)dnl
-pushdef([ac_cv_objext], ac_cv_build_objext)dnl
-pushdef([ac_exeext], ac_build_exeext)dnl
-pushdef([ac_objext], ac_build_objext)dnl
-pushdef([CC], CC_FOR_BUILD)dnl
-pushdef([CPP], CPP_FOR_BUILD)dnl
-pushdef([CFLAGS], CFLAGS_FOR_BUILD)dnl
-pushdef([CPPFLAGS], CPPFLAGS_FOR_BUILD)dnl
-pushdef([LDFLAGS], LDFLAGS_FOR_BUILD)dnl
-pushdef([host], build)dnl
-pushdef([host_alias], build_alias)dnl
-pushdef([host_cpu], build_cpu)dnl
-pushdef([host_vendor], build_vendor)dnl
-pushdef([host_os], build_os)dnl
-pushdef([ac_cv_host], ac_cv_build)dnl
-pushdef([ac_cv_host_alias], ac_cv_build_alias)dnl
-pushdef([ac_cv_host_cpu], ac_cv_build_cpu)dnl
-pushdef([ac_cv_host_vendor], ac_cv_build_vendor)dnl
-pushdef([ac_cv_host_os], ac_cv_build_os)dnl
-pushdef([ac_cpp], ac_build_cpp)dnl
-pushdef([ac_compile], ac_build_compile)dnl
-pushdef([ac_link], ac_build_link)dnl
-
-save_cross_compiling=$cross_compiling
-save_ac_tool_prefix=$ac_tool_prefix
-cross_compiling=no
-ac_tool_prefix=
-
-AC_PROG_CC
-AC_PROG_CPP
-AC_EXEEXT
-
-ac_tool_prefix=$save_ac_tool_prefix
-cross_compiling=$save_cross_compiling
-
-dnl Restore the old definitions
-dnl
-popdef([ac_link])dnl
-popdef([ac_compile])dnl
-popdef([ac_cpp])dnl
-popdef([ac_cv_host_os])dnl
-popdef([ac_cv_host_vendor])dnl
-popdef([ac_cv_host_cpu])dnl
-popdef([ac_cv_host_alias])dnl
-popdef([ac_cv_host])dnl
-popdef([host_os])dnl
-popdef([host_vendor])dnl
-popdef([host_cpu])dnl
-popdef([host_alias])dnl
-popdef([host])dnl
-popdef([LDFLAGS])dnl
-popdef([CPPFLAGS])dnl
-popdef([CFLAGS])dnl
-popdef([CPP])dnl
-popdef([CC])dnl
-popdef([ac_objext])dnl
-popdef([ac_exeext])dnl
-popdef([ac_cv_objext])dnl
-popdef([ac_cv_exeext])dnl
-popdef([ac_cv_prog_cc_g])dnl
-popdef([ac_cv_prog_cc_cross])dnl
-popdef([ac_cv_prog_cc_works])dnl
-popdef([ac_cv_prog_gcc])dnl
-popdef([ac_cv_prog_CPP])dnl
-
-dnl Finally, set Makefile variables
-dnl
-BUILD_EXEEXT=$ac_build_exeext
-BUILD_OBJEXT=$ac_build_objext
-AC_SUBST(BUILD_EXEEXT)dnl
-AC_SUBST(BUILD_OBJEXT)dnl
-AC_SUBST([CFLAGS_FOR_BUILD])dnl
-AC_SUBST([CPPFLAGS_FOR_BUILD])dnl
-AC_SUBST([LDFLAGS_FOR_BUILD])dnl
-])
diff --git a/m4/ax_prog_cxx_for_build.m4 b/m4/ax_prog_cxx_for_build.m4
deleted file mode 100644
index 8cc0f73..0000000
--- a/m4/ax_prog_cxx_for_build.m4
+++ /dev/null
@@ -1,110 +0,0 @@
-# ===========================================================================
-# http://www.gnu.org/software/autoconf-archive/ax_prog_cxx_for_build.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-# AX_PROG_CXX_FOR_BUILD
-#
-# DESCRIPTION
-#
-# This macro searches for a C++ compiler that generates native
-# executables, that is a C++ compiler that surely is not a cross-compiler.
-# This can be useful if you have to generate source code at compile-time
-# like for example GCC does.
-#
-# The macro sets the CXX_FOR_BUILD and CXXCPP_FOR_BUILD macros to anything
-# needed to compile or link (CXX_FOR_BUILD) and preprocess
-# (CXXCPP_FOR_BUILD). The value of these variables can be overridden by
-# the user by specifying a compiler with an environment variable (like you
-# do for standard CXX).
-#
-# LICENSE
-#
-# Copyright (c) 2008 Paolo Bonzini <bonzini@gnu.org>
-# Copyright (c) 2012 Avionic Design GmbH
-#
-# Based on the AX_PROG_CC_FOR_BUILD macro by Paolo Bonzini.
-#
-# Copying and distribution of this file, with or without modification, are
-# permitted in any medium without royalty provided the copyright notice
-# and this notice are preserved. This file is offered as-is, without any
-# warranty.
-
-#serial 2
-
-AU_ALIAS([AC_PROG_CXX_FOR_BUILD], [AX_PROG_CXX_FOR_BUILD])
-AC_DEFUN([AX_PROG_CXX_FOR_BUILD], [dnl
-AC_REQUIRE([AX_PROG_CC_FOR_BUILD])dnl
-AC_REQUIRE([AC_PROG_CXX])dnl
-AC_REQUIRE([AC_PROG_CXXCPP])dnl
-AC_REQUIRE([AC_CANONICAL_HOST])dnl
-
-dnl Use the standard macros, but make them use other variable names
-dnl
-pushdef([ac_cv_prog_CXXCPP], ac_cv_build_prog_CXXCPP)dnl
-pushdef([ac_cv_prog_gxx], ac_cv_build_prog_gxx)dnl
-pushdef([ac_cv_prog_cxx_works], ac_cv_build_prog_cxx_works)dnl
-pushdef([ac_cv_prog_cxx_cross], ac_cv_build_prog_cxx_cross)dnl
-pushdef([ac_cv_prog_cxx_g], ac_cv_build_prog_cxx_g)dnl
-pushdef([CXX], CXX_FOR_BUILD)dnl
-pushdef([CXXCPP], CXXCPP_FOR_BUILD)dnl
-pushdef([CXXFLAGS], CXXFLAGS_FOR_BUILD)dnl
-pushdef([CPPFLAGS], CPPFLAGS_FOR_BUILD)dnl
-pushdef([CXXCPPFLAGS], CXXCPPFLAGS_FOR_BUILD)dnl
-pushdef([host], build)dnl
-pushdef([host_alias], build_alias)dnl
-pushdef([host_cpu], build_cpu)dnl
-pushdef([host_vendor], build_vendor)dnl
-pushdef([host_os], build_os)dnl
-pushdef([ac_cv_host], ac_cv_build)dnl
-pushdef([ac_cv_host_alias], ac_cv_build_alias)dnl
-pushdef([ac_cv_host_cpu], ac_cv_build_cpu)dnl
-pushdef([ac_cv_host_vendor], ac_cv_build_vendor)dnl
-pushdef([ac_cv_host_os], ac_cv_build_os)dnl
-pushdef([ac_cxxcpp], ac_build_cxxcpp)dnl
-pushdef([ac_compile], ac_build_compile)dnl
-pushdef([ac_link], ac_build_link)dnl
-
-save_cross_compiling=$cross_compiling
-save_ac_tool_prefix=$ac_tool_prefix
-cross_compiling=no
-ac_tool_prefix=
-
-AC_PROG_CXX
-AC_PROG_CXXCPP
-
-ac_tool_prefix=$save_ac_tool_prefix
-cross_compiling=$save_cross_compiling
-
-dnl Restore the old definitions
-dnl
-popdef([ac_link])dnl
-popdef([ac_compile])dnl
-popdef([ac_cxxcpp])dnl
-popdef([ac_cv_host_os])dnl
-popdef([ac_cv_host_vendor])dnl
-popdef([ac_cv_host_cpu])dnl
-popdef([ac_cv_host_alias])dnl
-popdef([ac_cv_host])dnl
-popdef([host_os])dnl
-popdef([host_vendor])dnl
-popdef([host_cpu])dnl
-popdef([host_alias])dnl
-popdef([host])dnl
-popdef([CXXCPPFLAGS])dnl
-popdef([CPPFLAGS])dnl
-popdef([CXXFLAGS])dnl
-popdef([CXXCPP])dnl
-popdef([CXX])dnl
-popdef([ac_cv_prog_cxx_g])dnl
-popdef([ac_cv_prog_cxx_cross])dnl
-popdef([ac_cv_prog_cxx_works])dnl
-popdef([ac_cv_prog_gxx])dnl
-popdef([ac_cv_prog_CXXCPP])dnl
-
-dnl Finally, set Makefile variables
-dnl
-AC_SUBST([CXXFLAGS_FOR_BUILD])dnl
-AC_SUBST([CXXCPPFLAGS_FOR_BUILD])dnl
-])
diff --git a/m4/ax_pthread.m4 b/m4/ax_pthread.m4
deleted file mode 100644
index 1598d07..0000000
--- a/m4/ax_pthread.m4
+++ /dev/null
@@ -1,507 +0,0 @@
-# ===========================================================================
-# https://www.gnu.org/software/autoconf-archive/ax_pthread.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-# AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
-#
-# DESCRIPTION
-#
-# This macro figures out how to build C programs using POSIX threads. It
-# sets the PTHREAD_LIBS output variable to the threads library and linker
-# flags, and the PTHREAD_CFLAGS output variable to any special C compiler
-# flags that are needed. (The user can also force certain compiler
-# flags/libs to be tested by setting these environment variables.)
-#
-# Also sets PTHREAD_CC to any special C compiler that is needed for
-# multi-threaded programs (defaults to the value of CC otherwise). (This
-# is necessary on AIX to use the special cc_r compiler alias.)
-#
-# NOTE: You are assumed to not only compile your program with these flags,
-# but also to link with them as well. For example, you might link with
-# $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS
-#
-# If you are only building threaded programs, you may wish to use these
-# variables in your default LIBS, CFLAGS, and CC:
-#
-# LIBS="$PTHREAD_LIBS $LIBS"
-# CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
-# CC="$PTHREAD_CC"
-#
-# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant
-# has a nonstandard name, this macro defines PTHREAD_CREATE_JOINABLE to
-# that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
-#
-# Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the
-# PTHREAD_PRIO_INHERIT symbol is defined when compiling with
-# PTHREAD_CFLAGS.
-#
-# ACTION-IF-FOUND is a list of shell commands to run if a threads library
-# is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it
-# is not found. If ACTION-IF-FOUND is not specified, the default action
-# will define HAVE_PTHREAD.
-#
-# Please let the authors know if this macro fails on any platform, or if
-# you have any other suggestions or comments. This macro was based on work
-# by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help
-# from M. Frigo), as well as ac_pthread and hb_pthread macros posted by
-# Alejandro Forero Cuervo to the autoconf macro repository. We are also
-# grateful for the helpful feedback of numerous users.
-#
-# Updated for Autoconf 2.68 by Daniel Richard G.
-#
-# LICENSE
-#
-# Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
-# Copyright (c) 2011 Daniel Richard G. <skunk@iSKUNK.ORG>
-# Copyright (c) 2019 Marc Stevens <marc.stevens@cwi.nl>
-#
-# This program is free software: you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation, either version 3 of the License, or (at your
-# option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-# Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program. If not, see <https://www.gnu.org/licenses/>.
-#
-# As a special exception, the respective Autoconf Macro's copyright owner
-# gives unlimited permission to copy, distribute and modify the configure
-# scripts that are the output of Autoconf when processing the Macro. You
-# need not follow the terms of the GNU General Public License when using
-# or distributing such scripts, even though portions of the text of the
-# Macro appear in them. The GNU General Public License (GPL) does govern
-# all other use of the material that constitutes the Autoconf Macro.
-#
-# This special exception to the GPL applies to versions of the Autoconf
-# Macro released by the Autoconf Archive. When you make and distribute a
-# modified version of the Autoconf Macro, you may extend this special
-# exception to the GPL to apply to your modified version as well.
-
-#serial 27
-
-AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD])
-AC_DEFUN([AX_PTHREAD], [
-AC_REQUIRE([AC_CANONICAL_HOST])
-AC_REQUIRE([AC_PROG_CC])
-AC_REQUIRE([AC_PROG_SED])
-AC_LANG_PUSH([C])
-ax_pthread_ok=no
-
-# We used to check for pthread.h first, but this fails if pthread.h
-# requires special compiler flags (e.g. on Tru64 or Sequent).
-# It gets checked for in the link test anyway.
-
-# First of all, check if the user has set any of the PTHREAD_LIBS,
-# etcetera environment variables, and if threads linking works using
-# them:
-if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then
- ax_pthread_save_CC="$CC"
- ax_pthread_save_CFLAGS="$CFLAGS"
- ax_pthread_save_LIBS="$LIBS"
- AS_IF([test "x$PTHREAD_CC" != "x"], [CC="$PTHREAD_CC"])
- CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
- LIBS="$PTHREAD_LIBS $LIBS"
- AC_MSG_CHECKING([for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS])
- AC_LINK_IFELSE([AC_LANG_CALL([], [pthread_join])], [ax_pthread_ok=yes])
- AC_MSG_RESULT([$ax_pthread_ok])
- if test "x$ax_pthread_ok" = "xno"; then
- PTHREAD_LIBS=""
- PTHREAD_CFLAGS=""
- fi
- CC="$ax_pthread_save_CC"
- CFLAGS="$ax_pthread_save_CFLAGS"
- LIBS="$ax_pthread_save_LIBS"
-fi
-
-# We must check for the threads library under a number of different
-# names; the ordering is very important because some systems
-# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
-# libraries is broken (non-POSIX).
-
-# Create a list of thread flags to try. Items with a "," contain both
-# C compiler flags (before ",") and linker flags (after ","). Other items
-# starting with a "-" are C compiler flags, and remaining items are
-# library names, except for "none" which indicates that we try without
-# any flags at all, and "pthread-config" which is a program returning
-# the flags for the Pth emulation library.
-
-ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
-
-# The ordering *is* (sometimes) important. Some notes on the
-# individual items follow:
-
-# pthreads: AIX (must check this before -lpthread)
-# none: in case threads are in libc; should be tried before -Kthread and
-# other compiler flags to prevent continual compiler warnings
-# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
-# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64
-# (Note: HP C rejects this with "bad form for `-t' option")
-# -pthreads: Solaris/gcc (Note: HP C also rejects)
-# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
-# doesn't hurt to check since this sometimes defines pthreads and
-# -D_REENTRANT too), HP C (must be checked before -lpthread, which
-# is present but should not be used directly; and before -mthreads,
-# because the compiler interprets this as "-mt" + "-hreads")
-# -mthreads: Mingw32/gcc, Lynx/gcc
-# pthread: Linux, etcetera
-# --thread-safe: KAI C++
-# pthread-config: use pthread-config program (for GNU Pth library)
-
-case $host_os in
-
- freebsd*)
-
- # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
- # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
-
- ax_pthread_flags="-kthread lthread $ax_pthread_flags"
- ;;
-
- hpux*)
-
- # From the cc(1) man page: "[-mt] Sets various -D flags to enable
- # multi-threading and also sets -lpthread."
-
- ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags"
- ;;
-
- openedition*)
-
- # IBM z/OS requires a feature-test macro to be defined in order to
- # enable POSIX threads at all, so give the user a hint if this is
- # not set. (We don't define these ourselves, as they can affect
- # other portions of the system API in unpredictable ways.)
-
- AC_EGREP_CPP([AX_PTHREAD_ZOS_MISSING],
- [
-# if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS)
- AX_PTHREAD_ZOS_MISSING
-# endif
- ],
- [AC_MSG_WARN([IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support.])])
- ;;
-
- solaris*)
-
- # On Solaris (at least, for some versions), libc contains stubbed
- # (non-functional) versions of the pthreads routines, so link-based
- # tests will erroneously succeed. (N.B.: The stubs are missing
- # pthread_cleanup_push, or rather a function called by this macro,
- # so we could check for that, but who knows whether they'll stub
- # that too in a future libc.) So we'll check first for the
- # standard Solaris way of linking pthreads (-mt -lpthread).
-
- ax_pthread_flags="-mt,-lpthread pthread $ax_pthread_flags"
- ;;
-esac
-
-# Are we compiling with Clang?
-
-AC_CACHE_CHECK([whether $CC is Clang],
- [ax_cv_PTHREAD_CLANG],
- [ax_cv_PTHREAD_CLANG=no
- # Note that Autoconf sets GCC=yes for Clang as well as GCC
- if test "x$GCC" = "xyes"; then
- AC_EGREP_CPP([AX_PTHREAD_CC_IS_CLANG],
- [/* Note: Clang 2.7 lacks __clang_[a-z]+__ */
-# if defined(__clang__) && defined(__llvm__)
- AX_PTHREAD_CC_IS_CLANG
-# endif
- ],
- [ax_cv_PTHREAD_CLANG=yes])
- fi
- ])
-ax_pthread_clang="$ax_cv_PTHREAD_CLANG"
-
-
-# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC)
-
-# Note that for GCC and Clang -pthread generally implies -lpthread,
-# except when -nostdlib is passed.
-# This is problematic using libtool to build C++ shared libraries with pthread:
-# [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25460
-# [2] https://bugzilla.redhat.com/show_bug.cgi?id=661333
-# [3] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=468555
-# To solve this, first try -pthread together with -lpthread for GCC
-
-AS_IF([test "x$GCC" = "xyes"],
- [ax_pthread_flags="-pthread,-lpthread -pthread -pthreads $ax_pthread_flags"])
-
-# Clang takes -pthread (never supported any other flag), but we'll try with -lpthread first
-
-AS_IF([test "x$ax_pthread_clang" = "xyes"],
- [ax_pthread_flags="-pthread,-lpthread -pthread"])
-
-
-# The presence of a feature test macro requesting re-entrant function
-# definitions is, on some systems, a strong hint that pthreads support is
-# correctly enabled
-
-case $host_os in
- darwin* | hpux* | linux* | osf* | solaris*)
- ax_pthread_check_macro="_REENTRANT"
- ;;
-
- aix*)
- ax_pthread_check_macro="_THREAD_SAFE"
- ;;
-
- *)
- ax_pthread_check_macro="--"
- ;;
-esac
-AS_IF([test "x$ax_pthread_check_macro" = "x--"],
- [ax_pthread_check_cond=0],
- [ax_pthread_check_cond="!defined($ax_pthread_check_macro)"])
-
-
-if test "x$ax_pthread_ok" = "xno"; then
-for ax_pthread_try_flag in $ax_pthread_flags; do
-
- case $ax_pthread_try_flag in
- none)
- AC_MSG_CHECKING([whether pthreads work without any flags])
- ;;
-
- *,*)
- PTHREAD_CFLAGS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\1/"`
- PTHREAD_LIBS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\2/"`
- AC_MSG_CHECKING([whether pthreads work with "$PTHREAD_CFLAGS" and "$PTHREAD_LIBS"])
- ;;
-
- -*)
- AC_MSG_CHECKING([whether pthreads work with $ax_pthread_try_flag])
- PTHREAD_CFLAGS="$ax_pthread_try_flag"
- ;;
-
- pthread-config)
- AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no])
- AS_IF([test "x$ax_pthread_config" = "xno"], [continue])
- PTHREAD_CFLAGS="`pthread-config --cflags`"
- PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
- ;;
-
- *)
- AC_MSG_CHECKING([for the pthreads library -l$ax_pthread_try_flag])
- PTHREAD_LIBS="-l$ax_pthread_try_flag"
- ;;
- esac
-
- ax_pthread_save_CFLAGS="$CFLAGS"
- ax_pthread_save_LIBS="$LIBS"
- CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
- LIBS="$PTHREAD_LIBS $LIBS"
-
- # Check for various functions. We must include pthread.h,
- # since some functions may be macros. (On the Sequent, we
- # need a special flag -Kthread to make this header compile.)
- # We check for pthread_join because it is in -lpthread on IRIX
- # while pthread_create is in libc. We check for pthread_attr_init
- # due to DEC craziness with -lpthreads. We check for
- # pthread_cleanup_push because it is one of the few pthread
- # functions on Solaris that doesn't have a non-functional libc stub.
- # We try pthread_create on general principles.
-
- AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>
-# if $ax_pthread_check_cond
-# error "$ax_pthread_check_macro must be defined"
-# endif
- static void *some_global = NULL;
- static void routine(void *a)
- {
- /* To avoid any unused-parameter or
- unused-but-set-parameter warning. */
- some_global = a;
- }
- static void *start_routine(void *a) { return a; }],
- [pthread_t th; pthread_attr_t attr;
- pthread_create(&th, 0, start_routine, 0);
- pthread_join(th, 0);
- pthread_attr_init(&attr);
- pthread_cleanup_push(routine, 0);
- pthread_cleanup_pop(0) /* ; */])],
- [ax_pthread_ok=yes],
- [])
-
- CFLAGS="$ax_pthread_save_CFLAGS"
- LIBS="$ax_pthread_save_LIBS"
-
- AC_MSG_RESULT([$ax_pthread_ok])
- AS_IF([test "x$ax_pthread_ok" = "xyes"], [break])
-
- PTHREAD_LIBS=""
- PTHREAD_CFLAGS=""
-done
-fi
-
-
-# Clang needs special handling, because older versions handle the -pthread
-# option in a rather... idiosyncratic way
-
-if test "x$ax_pthread_clang" = "xyes"; then
-
- # Clang takes -pthread; it has never supported any other flag
-
- # (Note 1: This will need to be revisited if a system that Clang
- # supports has POSIX threads in a separate library. This tends not
- # to be the way of modern systems, but it's conceivable.)
-
- # (Note 2: On some systems, notably Darwin, -pthread is not needed
- # to get POSIX threads support; the API is always present and
- # active. We could reasonably leave PTHREAD_CFLAGS empty. But
- # -pthread does define _REENTRANT, and while the Darwin headers
- # ignore this macro, third-party headers might not.)
-
- # However, older versions of Clang make a point of warning the user
- # that, in an invocation where only linking and no compilation is
- # taking place, the -pthread option has no effect ("argument unused
- # during compilation"). They expect -pthread to be passed in only
- # when source code is being compiled.
- #
- # Problem is, this is at odds with the way Automake and most other
- # C build frameworks function, which is that the same flags used in
- # compilation (CFLAGS) are also used in linking. Many systems
- # supported by AX_PTHREAD require exactly this for POSIX threads
- # support, and in fact it is often not straightforward to specify a
- # flag that is used only in the compilation phase and not in
- # linking. Such a scenario is extremely rare in practice.
- #
- # Even though use of the -pthread flag in linking would only print
- # a warning, this can be a nuisance for well-run software projects
- # that build with -Werror. So if the active version of Clang has
- # this misfeature, we search for an option to squash it.
-
- AC_CACHE_CHECK([whether Clang needs flag to prevent "argument unused" warning when linking with -pthread],
- [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG],
- [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown
- # Create an alternate version of $ac_link that compiles and
- # links in two steps (.c -> .o, .o -> exe) instead of one
- # (.c -> exe), because the warning occurs only in the second
- # step
- ax_pthread_save_ac_link="$ac_link"
- ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g'
- ax_pthread_link_step=`$as_echo "$ac_link" | sed "$ax_pthread_sed"`
- ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)"
- ax_pthread_save_CFLAGS="$CFLAGS"
- for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do
- AS_IF([test "x$ax_pthread_try" = "xunknown"], [break])
- CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS"
- ac_link="$ax_pthread_save_ac_link"
- AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])],
- [ac_link="$ax_pthread_2step_ac_link"
- AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])],
- [break])
- ])
- done
- ac_link="$ax_pthread_save_ac_link"
- CFLAGS="$ax_pthread_save_CFLAGS"
- AS_IF([test "x$ax_pthread_try" = "x"], [ax_pthread_try=no])
- ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try"
- ])
-
- case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in
- no | unknown) ;;
- *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;;
- esac
-
-fi # $ax_pthread_clang = yes
-
-
-
-# Various other checks:
-if test "x$ax_pthread_ok" = "xyes"; then
- ax_pthread_save_CFLAGS="$CFLAGS"
- ax_pthread_save_LIBS="$LIBS"
- CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
- LIBS="$PTHREAD_LIBS $LIBS"
-
- # Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
- AC_CACHE_CHECK([for joinable pthread attribute],
- [ax_cv_PTHREAD_JOINABLE_ATTR],
- [ax_cv_PTHREAD_JOINABLE_ATTR=unknown
- for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
- AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>],
- [int attr = $ax_pthread_attr; return attr /* ; */])],
- [ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break],
- [])
- done
- ])
- AS_IF([test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \
- test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \
- test "x$ax_pthread_joinable_attr_defined" != "xyes"],
- [AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE],
- [$ax_cv_PTHREAD_JOINABLE_ATTR],
- [Define to necessary symbol if this constant
- uses a non-standard name on your system.])
- ax_pthread_joinable_attr_defined=yes
- ])
-
- AC_CACHE_CHECK([whether more special flags are required for pthreads],
- [ax_cv_PTHREAD_SPECIAL_FLAGS],
- [ax_cv_PTHREAD_SPECIAL_FLAGS=no
- case $host_os in
- solaris*)
- ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS"
- ;;
- esac
- ])
- AS_IF([test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \
- test "x$ax_pthread_special_flags_added" != "xyes"],
- [PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS"
- ax_pthread_special_flags_added=yes])
-
- AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT],
- [ax_cv_PTHREAD_PRIO_INHERIT],
- [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <pthread.h>]],
- [[int i = PTHREAD_PRIO_INHERIT;
- return i;]])],
- [ax_cv_PTHREAD_PRIO_INHERIT=yes],
- [ax_cv_PTHREAD_PRIO_INHERIT=no])
- ])
- AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \
- test "x$ax_pthread_prio_inherit_defined" != "xyes"],
- [AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.])
- ax_pthread_prio_inherit_defined=yes
- ])
-
- CFLAGS="$ax_pthread_save_CFLAGS"
- LIBS="$ax_pthread_save_LIBS"
-
- # More AIX lossage: compile with *_r variant
- if test "x$GCC" != "xyes"; then
- case $host_os in
- aix*)
- AS_CASE(["x/$CC"],
- [x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6],
- [#handle absolute path differently from PATH based program lookup
- AS_CASE(["x$CC"],
- [x/*],
- [AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"])],
- [AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC])])])
- ;;
- esac
- fi
-fi
-
-test -n "$PTHREAD_CC" || PTHREAD_CC="$CC"
-
-AC_SUBST([PTHREAD_LIBS])
-AC_SUBST([PTHREAD_CFLAGS])
-AC_SUBST([PTHREAD_CC])
-
-# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
-if test "x$ax_pthread_ok" = "xyes"; then
- ifelse([$1],,[AC_DEFINE([HAVE_PTHREAD],[1],[Define if you have POSIX threads libraries and header files.])],[$1])
- :
-else
- ax_pthread_ok=no
- $2
-fi
-AC_LANG_POP
-])dnl AX_PTHREAD
diff --git a/m4/stl_hash.m4 b/m4/stl_hash.m4
deleted file mode 100644
index d7def1a..0000000
--- a/m4/stl_hash.m4
+++ /dev/null
@@ -1,71 +0,0 @@
-# We check two things: where the include file is for
-# unordered_map/hash_map (we prefer the first form), and what
-# namespace unordered/hash_map lives in within that include file. We
-# include AC_TRY_COMPILE for all the combinations we've seen in the
-# wild. We define HASH_MAP_H to the location of the header file, and
-# HASH_NAMESPACE to the namespace the class (unordered_map or
-# hash_map) is in.
-
-# This also checks if unordered map exists.
-AC_DEFUN([AC_CXX_STL_HASH],
- [
- AC_MSG_CHECKING(the location of hash_map)
- AC_LANG_SAVE
- AC_LANG_CPLUSPLUS
- ac_cv_cxx_hash_map=""
- # First try unordered_map, but not on gcc's before 4.2 -- I've
- # seen unexplainable unordered_map bugs with -O2 on older gcc's.
- AC_TRY_COMPILE([#if defined(__GNUC__) && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 2))
- # error GCC too old for unordered_map
- #endif
- ],
- [/* no program body necessary */],
- [stl_hash_old_gcc=no],
- [stl_hash_old_gcc=yes])
- for location in unordered_map tr1/unordered_map; do
- for namespace in std std::tr1; do
- if test -z "$ac_cv_cxx_hash_map" -a "$stl_hash_old_gcc" != yes; then
- # Some older gcc's have a buggy tr1, so test a bit of code.
- AC_TRY_COMPILE([#include <$location>],
- [const ${namespace}::unordered_map<int, int> t;
- return t.find(5) == t.end();],
- [ac_cv_cxx_hash_map="<$location>";
- ac_cv_cxx_hash_namespace="$namespace";
- ac_cv_cxx_hash_map_class="unordered_map";])
- fi
- done
- done
- # Now try hash_map
- for location in ext/hash_map hash_map; do
- for namespace in __gnu_cxx "" std stdext; do
- if test -z "$ac_cv_cxx_hash_map"; then
- AC_TRY_COMPILE([#include <$location>],
- [${namespace}::hash_map<int, int> t],
- [ac_cv_cxx_hash_map="<$location>";
- ac_cv_cxx_hash_namespace="$namespace";
- ac_cv_cxx_hash_map_class="hash_map";])
- fi
- done
- done
- ac_cv_cxx_hash_set=`echo "$ac_cv_cxx_hash_map" | sed s/map/set/`;
- ac_cv_cxx_hash_set_class=`echo "$ac_cv_cxx_hash_map_class" | sed s/map/set/`;
- if test -n "$ac_cv_cxx_hash_map"; then
- AC_DEFINE(HAVE_HASH_MAP, 1, [define if the compiler has hash_map])
- AC_DEFINE(HAVE_HASH_SET, 1, [define if the compiler has hash_set])
- AC_DEFINE_UNQUOTED(HASH_MAP_H,$ac_cv_cxx_hash_map,
- [the location of <unordered_map> or <hash_map>])
- AC_DEFINE_UNQUOTED(HASH_SET_H,$ac_cv_cxx_hash_set,
- [the location of <unordered_set> or <hash_set>])
- AC_DEFINE_UNQUOTED(HASH_NAMESPACE,$ac_cv_cxx_hash_namespace,
- [the namespace of hash_map/hash_set])
- AC_DEFINE_UNQUOTED(HASH_MAP_CLASS,$ac_cv_cxx_hash_map_class,
- [the name of <hash_map>])
- AC_DEFINE_UNQUOTED(HASH_SET_CLASS,$ac_cv_cxx_hash_set_class,
- [the name of <hash_set>])
- AC_MSG_RESULT([$ac_cv_cxx_hash_map])
- else
- AC_MSG_RESULT()
- AC_MSG_WARN([could not find an STL hash_map])
- fi
-])
-
diff --git a/maven_install.json b/maven_install.json
index 9c5860a..efb3f03 100644
--- a/maven_install.json
+++ b/maven_install.json
@@ -1,24 +1,251 @@
{
"dependency_tree": {
"__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY": "THERE_IS_NO_DATA_ONLY_ZUUL",
- "__INPUT_ARTIFACTS_HASH": -228414992,
- "__RESOLVED_ARTIFACTS_HASH": -722345565,
+ "__INPUT_ARTIFACTS_HASH": -1875290602,
+ "__RESOLVED_ARTIFACTS_HASH": -1248440885,
"conflict_resolution": {
- "com.google.errorprone:error_prone_annotations:2.3.2": "com.google.errorprone:error_prone_annotations:2.11.0",
- "junit:junit:4.12": "junit:junit:4.13.2"
+ "com.google.errorprone:error_prone_annotations:2.5.1": "com.google.errorprone:error_prone_annotations:2.11.0"
},
"dependencies": [
{
- "coord": "com.google.auto.value:auto-value-annotations:1.7.4",
+ "coord": "com.google.auto.value:auto-value-annotations:1.8.1",
"dependencies": [],
"directDependencies": [],
- "file": "v1/https/repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations/1.7.4/auto-value-annotations-1.7.4.jar",
+ "file": "v1/https/repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations/1.8.1/auto-value-annotations-1.8.1.jar",
"mirror_urls": [
- "https://repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations/1.7.4/auto-value-annotations-1.7.4.jar",
- "https://repo.maven.apache.org/maven2/com/google/auto/value/auto-value-annotations/1.7.4/auto-value-annotations-1.7.4.jar"
+ "https://repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations/1.8.1/auto-value-annotations-1.8.1.jar",
+ "https://repo.maven.apache.org/maven2/com/google/auto/value/auto-value-annotations/1.8.1/auto-value-annotations-1.8.1.jar"
],
- "sha256": "fedd59b0b4986c342f6ab2d182f2a4ee9fceb2c7e2d5bdc4dc764c92394a23d3",
- "url": "https://repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations/1.7.4/auto-value-annotations-1.7.4.jar"
+ "sha256": "37ec09b47d7ed35a99d13927db5c86fc9071f620f943ead5d757144698310852",
+ "url": "https://repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations/1.8.1/auto-value-annotations-1.8.1.jar"
+ },
+ {
+ "coord": "com.google.caliper:caliper-api:1.0-beta-3",
+ "dependencies": [
+ "com.google.guava:guava:31.1-jre",
+ "joda-time:joda-time:2.10.10"
+ ],
+ "directDependencies": [
+ "com.google.guava:guava:31.1-jre",
+ "joda-time:joda-time:2.10.10"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/com/google/caliper/caliper-api/1.0-beta-3/caliper-api-1.0-beta-3.jar",
+ "mirror_urls": [
+ "https://repo1.maven.org/maven2/com/google/caliper/caliper-api/1.0-beta-3/caliper-api-1.0-beta-3.jar",
+ "https://repo.maven.apache.org/maven2/com/google/caliper/caliper-api/1.0-beta-3/caliper-api-1.0-beta-3.jar"
+ ],
+ "sha256": "374f0c6c0c1f8784cb69d885e1dcbb7498c34ca20369e0597264568530642928",
+ "url": "https://repo1.maven.org/maven2/com/google/caliper/caliper-api/1.0-beta-3/caliper-api-1.0-beta-3.jar"
+ },
+ {
+ "coord": "com.google.caliper:caliper-core:1.0-beta-3",
+ "dependencies": [
+ "com.google.auto.value:auto-value-annotations:1.8.1",
+ "com.google.caliper:caliper-api:1.0-beta-3",
+ "com.google.caliper:caliper-util:1.0-beta-3",
+ "com.google.code.gson:gson:2.8.9",
+ "com.google.dagger:dagger:2.22.1",
+ "com.google.guava:guava:31.1-jre",
+ "com.squareup.okhttp:okhttp:2.7.5",
+ "com.squareup.okio:okio:1.6.0",
+ "javax.inject:javax.inject:1",
+ "joda-time:joda-time:2.10.10"
+ ],
+ "directDependencies": [
+ "com.google.auto.value:auto-value-annotations:1.8.1",
+ "com.google.caliper:caliper-api:1.0-beta-3",
+ "com.google.caliper:caliper-util:1.0-beta-3",
+ "com.google.dagger:dagger:2.22.1",
+ "com.google.guava:guava:31.1-jre",
+ "com.squareup.okhttp:okhttp:2.7.5",
+ "joda-time:joda-time:2.10.10"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/com/google/caliper/caliper-core/1.0-beta-3/caliper-core-1.0-beta-3.jar",
+ "mirror_urls": [
+ "https://repo1.maven.org/maven2/com/google/caliper/caliper-core/1.0-beta-3/caliper-core-1.0-beta-3.jar",
+ "https://repo.maven.apache.org/maven2/com/google/caliper/caliper-core/1.0-beta-3/caliper-core-1.0-beta-3.jar"
+ ],
+ "sha256": "514deac8f8b09dd4262733e0a4406a333208c899dc7ea726b03600b9bb94f192",
+ "url": "https://repo1.maven.org/maven2/com/google/caliper/caliper-core/1.0-beta-3/caliper-core-1.0-beta-3.jar"
+ },
+ {
+ "coord": "com.google.caliper:caliper-runner:1.0-beta-3",
+ "dependencies": [
+ "com.google.auto.value:auto-value-annotations:1.8.1",
+ "com.google.caliper:caliper-api:1.0-beta-3",
+ "com.google.caliper:caliper-core:1.0-beta-3",
+ "com.google.caliper:caliper-util:1.0-beta-3",
+ "com.google.code.gson:gson:2.8.9",
+ "com.google.dagger:dagger-producers:2.22.1",
+ "com.google.dagger:dagger:2.22.1",
+ "com.google.guava:guava:31.1-jre",
+ "com.squareup.okhttp:okhttp:2.7.5",
+ "com.squareup.okio:okio:1.6.0",
+ "javax.inject:javax.inject:1",
+ "joda-time:joda-time:2.10.10",
+ "org.checkerframework:checker-compat-qual:2.5.3"
+ ],
+ "directDependencies": [
+ "com.google.caliper:caliper-api:1.0-beta-3",
+ "com.google.caliper:caliper-core:1.0-beta-3",
+ "com.google.caliper:caliper-util:1.0-beta-3",
+ "com.google.dagger:dagger-producers:2.22.1",
+ "com.google.dagger:dagger:2.22.1",
+ "com.google.guava:guava:31.1-jre",
+ "com.squareup.okhttp:okhttp:2.7.5",
+ "joda-time:joda-time:2.10.10"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/com/google/caliper/caliper-runner/1.0-beta-3/caliper-runner-1.0-beta-3.jar",
+ "mirror_urls": [
+ "https://repo1.maven.org/maven2/com/google/caliper/caliper-runner/1.0-beta-3/caliper-runner-1.0-beta-3.jar",
+ "https://repo.maven.apache.org/maven2/com/google/caliper/caliper-runner/1.0-beta-3/caliper-runner-1.0-beta-3.jar"
+ ],
+ "sha256": "3ab58890aa01343361adedf859500d280f67813df0cedfcd165b169533b9b1fa",
+ "url": "https://repo1.maven.org/maven2/com/google/caliper/caliper-runner/1.0-beta-3/caliper-runner-1.0-beta-3.jar"
+ },
+ {
+ "coord": "com.google.caliper:caliper-util:1.0-beta-3",
+ "dependencies": [
+ "com.google.code.gson:gson:2.8.9",
+ "com.google.dagger:dagger:2.22.1",
+ "com.google.guava:guava:31.1-jre",
+ "javax.inject:javax.inject:1",
+ "joda-time:joda-time:2.10.10"
+ ],
+ "directDependencies": [
+ "com.google.code.gson:gson:2.8.9",
+ "com.google.dagger:dagger:2.22.1",
+ "com.google.guava:guava:31.1-jre",
+ "joda-time:joda-time:2.10.10"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/com/google/caliper/caliper-util/1.0-beta-3/caliper-util-1.0-beta-3.jar",
+ "mirror_urls": [
+ "https://repo1.maven.org/maven2/com/google/caliper/caliper-util/1.0-beta-3/caliper-util-1.0-beta-3.jar",
+ "https://repo.maven.apache.org/maven2/com/google/caliper/caliper-util/1.0-beta-3/caliper-util-1.0-beta-3.jar"
+ ],
+ "sha256": "6e9af500c7020450dfdb5003d09501d512d395f431c54c7ee8f79e712463fe66",
+ "url": "https://repo1.maven.org/maven2/com/google/caliper/caliper-util/1.0-beta-3/caliper-util-1.0-beta-3.jar"
+ },
+ {
+ "coord": "com.google.caliper:caliper-worker-jvm:1.0-beta-3",
+ "dependencies": [
+ "com.google.auto.value:auto-value-annotations:1.8.1",
+ "com.google.caliper:caliper-api:1.0-beta-3",
+ "com.google.caliper:caliper-core:1.0-beta-3",
+ "com.google.caliper:caliper-util:1.0-beta-3",
+ "com.google.caliper:caliper-worker:1.0-beta-3",
+ "com.google.code.gson:gson:2.8.9",
+ "com.google.code.java-allocation-instrumenter:java-allocation-instrumenter:3.3.0",
+ "com.google.dagger:dagger:2.22.1",
+ "com.google.guava:guava:31.1-jre",
+ "com.squareup.okhttp:okhttp:2.7.5",
+ "com.squareup.okio:okio:1.6.0",
+ "com.sun.jersey:jersey-client:1.19.4",
+ "com.sun.jersey:jersey-core:1.19.4",
+ "javax.annotation:javax.annotation-api:1.3.2",
+ "javax.inject:javax.inject:1",
+ "javax.ws.rs:jsr311-api:1.1.1",
+ "joda-time:joda-time:2.10.10",
+ "org.ow2.asm:asm-analysis:7.2",
+ "org.ow2.asm:asm-commons:7.2",
+ "org.ow2.asm:asm-tree:7.2",
+ "org.ow2.asm:asm-util:7.2",
+ "org.ow2.asm:asm:9.0"
+ ],
+ "directDependencies": [
+ "com.google.caliper:caliper-core:1.0-beta-3",
+ "com.google.caliper:caliper-worker:1.0-beta-3",
+ "com.google.code.java-allocation-instrumenter:java-allocation-instrumenter:3.3.0",
+ "com.google.dagger:dagger:2.22.1",
+ "com.google.guava:guava:31.1-jre",
+ "com.sun.jersey:jersey-client:1.19.4"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/com/google/caliper/caliper-worker-jvm/1.0-beta-3/caliper-worker-jvm-1.0-beta-3.jar",
+ "mirror_urls": [
+ "https://repo1.maven.org/maven2/com/google/caliper/caliper-worker-jvm/1.0-beta-3/caliper-worker-jvm-1.0-beta-3.jar",
+ "https://repo.maven.apache.org/maven2/com/google/caliper/caliper-worker-jvm/1.0-beta-3/caliper-worker-jvm-1.0-beta-3.jar"
+ ],
+ "sha256": "e14e1ecfdf939c82abdb902105be41ff3f83c18cb968116232015f2662d065a4",
+ "url": "https://repo1.maven.org/maven2/com/google/caliper/caliper-worker-jvm/1.0-beta-3/caliper-worker-jvm-1.0-beta-3.jar"
+ },
+ {
+ "coord": "com.google.caliper:caliper-worker:1.0-beta-3",
+ "dependencies": [
+ "com.google.auto.value:auto-value-annotations:1.8.1",
+ "com.google.caliper:caliper-api:1.0-beta-3",
+ "com.google.caliper:caliper-core:1.0-beta-3",
+ "com.google.caliper:caliper-util:1.0-beta-3",
+ "com.google.code.gson:gson:2.8.9",
+ "com.google.dagger:dagger:2.22.1",
+ "com.google.guava:guava:31.1-jre",
+ "com.squareup.okhttp:okhttp:2.7.5",
+ "com.squareup.okio:okio:1.6.0",
+ "javax.inject:javax.inject:1",
+ "joda-time:joda-time:2.10.10"
+ ],
+ "directDependencies": [
+ "com.google.caliper:caliper-api:1.0-beta-3",
+ "com.google.caliper:caliper-core:1.0-beta-3",
+ "com.google.caliper:caliper-util:1.0-beta-3",
+ "com.google.dagger:dagger:2.22.1",
+ "com.google.guava:guava:31.1-jre",
+ "com.squareup.okhttp:okhttp:2.7.5",
+ "joda-time:joda-time:2.10.10"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/com/google/caliper/caliper-worker/1.0-beta-3/caliper-worker-1.0-beta-3.jar",
+ "mirror_urls": [
+ "https://repo1.maven.org/maven2/com/google/caliper/caliper-worker/1.0-beta-3/caliper-worker-1.0-beta-3.jar",
+ "https://repo.maven.apache.org/maven2/com/google/caliper/caliper-worker/1.0-beta-3/caliper-worker-1.0-beta-3.jar"
+ ],
+ "sha256": "315d8e51df1f60551645a0e3bf2c504d2c79762f688e6f728eb9d1d9cd9a491b",
+ "url": "https://repo1.maven.org/maven2/com/google/caliper/caliper-worker/1.0-beta-3/caliper-worker-1.0-beta-3.jar"
+ },
+ {
+ "coord": "com.google.caliper:caliper:1.0-beta-3",
+ "dependencies": [
+ "com.google.auto.value:auto-value-annotations:1.8.1",
+ "com.google.caliper:caliper-api:1.0-beta-3",
+ "com.google.caliper:caliper-core:1.0-beta-3",
+ "com.google.caliper:caliper-runner:1.0-beta-3",
+ "com.google.caliper:caliper-util:1.0-beta-3",
+ "com.google.caliper:caliper-worker-jvm:1.0-beta-3",
+ "com.google.caliper:caliper-worker:1.0-beta-3",
+ "com.google.code.gson:gson:2.8.9",
+ "com.google.code.java-allocation-instrumenter:java-allocation-instrumenter:3.3.0",
+ "com.google.dagger:dagger-producers:2.22.1",
+ "com.google.dagger:dagger:2.22.1",
+ "com.google.guava:guava:31.1-jre",
+ "com.squareup.okhttp:okhttp:2.7.5",
+ "com.squareup.okio:okio:1.6.0",
+ "com.sun.jersey:jersey-client:1.19.4",
+ "com.sun.jersey:jersey-core:1.19.4",
+ "javax.annotation:javax.annotation-api:1.3.2",
+ "javax.inject:javax.inject:1",
+ "javax.ws.rs:jsr311-api:1.1.1",
+ "joda-time:joda-time:2.10.10",
+ "org.checkerframework:checker-compat-qual:2.5.3",
+ "org.ow2.asm:asm-analysis:7.2",
+ "org.ow2.asm:asm-commons:7.2",
+ "org.ow2.asm:asm-tree:7.2",
+ "org.ow2.asm:asm-util:7.2",
+ "org.ow2.asm:asm:9.0"
+ ],
+ "directDependencies": [
+ "com.google.caliper:caliper-core:1.0-beta-3",
+ "com.google.caliper:caliper-runner:1.0-beta-3",
+ "com.google.caliper:caliper-worker-jvm:1.0-beta-3",
+ "com.google.code.java-allocation-instrumenter:java-allocation-instrumenter:3.3.0",
+ "com.google.dagger:dagger:2.22.1",
+ "com.google.guava:guava:31.1-jre",
+ "com.sun.jersey:jersey-client:1.19.4"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/com/google/caliper/caliper/1.0-beta-3/caliper-1.0-beta-3.jar",
+ "mirror_urls": [
+ "https://repo1.maven.org/maven2/com/google/caliper/caliper/1.0-beta-3/caliper-1.0-beta-3.jar",
+ "https://repo.maven.apache.org/maven2/com/google/caliper/caliper/1.0-beta-3/caliper-1.0-beta-3.jar"
+ ],
+ "sha256": "d54e1bfdbe9359a79e175c217b8d472555cf20da9c5c0a18bdb1ea7db979ed8e",
+ "url": "https://repo1.maven.org/maven2/com/google/caliper/caliper/1.0-beta-3/caliper-1.0-beta-3.jar"
},
{
"coord": "com.google.code.findbugs:jsr305:3.0.2",
@@ -45,6 +272,72 @@
"url": "https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"
},
{
+ "coord": "com.google.code.java-allocation-instrumenter:java-allocation-instrumenter:3.3.0",
+ "dependencies": [
+ "com.google.guava:guava:31.1-jre",
+ "javax.annotation:javax.annotation-api:1.3.2",
+ "org.ow2.asm:asm-analysis:7.2",
+ "org.ow2.asm:asm-commons:7.2",
+ "org.ow2.asm:asm-tree:7.2",
+ "org.ow2.asm:asm-util:7.2",
+ "org.ow2.asm:asm:9.0"
+ ],
+ "directDependencies": [
+ "com.google.guava:guava:31.1-jre",
+ "javax.annotation:javax.annotation-api:1.3.2",
+ "org.ow2.asm:asm-analysis:7.2",
+ "org.ow2.asm:asm-commons:7.2",
+ "org.ow2.asm:asm-tree:7.2",
+ "org.ow2.asm:asm-util:7.2",
+ "org.ow2.asm:asm:9.0"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/com/google/code/java-allocation-instrumenter/java-allocation-instrumenter/3.3.0/java-allocation-instrumenter-3.3.0.jar",
+ "mirror_urls": [
+ "https://repo1.maven.org/maven2/com/google/code/java-allocation-instrumenter/java-allocation-instrumenter/3.3.0/java-allocation-instrumenter-3.3.0.jar",
+ "https://repo.maven.apache.org/maven2/com/google/code/java-allocation-instrumenter/java-allocation-instrumenter/3.3.0/java-allocation-instrumenter-3.3.0.jar"
+ ],
+ "sha256": "1ef5535a8bd41cf3072469f381b9ee6ab28275311a7499f53d6e52adf976fef0",
+ "url": "https://repo1.maven.org/maven2/com/google/code/java-allocation-instrumenter/java-allocation-instrumenter/3.3.0/java-allocation-instrumenter-3.3.0.jar"
+ },
+ {
+ "coord": "com.google.dagger:dagger-producers:2.22.1",
+ "dependencies": [
+ "com.google.dagger:dagger:2.22.1",
+ "com.google.guava:guava:31.1-jre",
+ "javax.inject:javax.inject:1",
+ "org.checkerframework:checker-compat-qual:2.5.3"
+ ],
+ "directDependencies": [
+ "com.google.dagger:dagger:2.22.1",
+ "com.google.guava:guava:31.1-jre",
+ "javax.inject:javax.inject:1",
+ "org.checkerframework:checker-compat-qual:2.5.3"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/com/google/dagger/dagger-producers/2.22.1/dagger-producers-2.22.1.jar",
+ "mirror_urls": [
+ "https://repo1.maven.org/maven2/com/google/dagger/dagger-producers/2.22.1/dagger-producers-2.22.1.jar",
+ "https://repo.maven.apache.org/maven2/com/google/dagger/dagger-producers/2.22.1/dagger-producers-2.22.1.jar"
+ ],
+ "sha256": "f834a0082014213a68ff06a0f048d750178d02196c58b0b15beb367d32b97e35",
+ "url": "https://repo1.maven.org/maven2/com/google/dagger/dagger-producers/2.22.1/dagger-producers-2.22.1.jar"
+ },
+ {
+ "coord": "com.google.dagger:dagger:2.22.1",
+ "dependencies": [
+ "javax.inject:javax.inject:1"
+ ],
+ "directDependencies": [
+ "javax.inject:javax.inject:1"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/com/google/dagger/dagger/2.22.1/dagger-2.22.1.jar",
+ "mirror_urls": [
+ "https://repo1.maven.org/maven2/com/google/dagger/dagger/2.22.1/dagger-2.22.1.jar",
+ "https://repo.maven.apache.org/maven2/com/google/dagger/dagger/2.22.1/dagger-2.22.1.jar"
+ ],
+ "sha256": "329d4340f24c4f5717af016c097e90668bfea2a5376e6aa9964b01cef3fd241a",
+ "url": "https://repo1.maven.org/maven2/com/google/dagger/dagger/2.22.1/dagger-2.22.1.jar"
+ },
+ {
"coord": "com.google.errorprone:error_prone_annotations:2.11.0",
"dependencies": [],
"directDependencies": [],
@@ -150,7 +443,7 @@
{
"coord": "com.google.truth:truth:1.1.2",
"dependencies": [
- "com.google.auto.value:auto-value-annotations:1.7.4",
+ "com.google.auto.value:auto-value-annotations:1.8.1",
"com.google.errorprone:error_prone_annotations:2.11.0",
"com.google.guava:guava:31.1-jre",
"junit:junit:4.13.2",
@@ -158,7 +451,7 @@
"org.ow2.asm:asm:9.0"
],
"directDependencies": [
- "com.google.auto.value:auto-value-annotations:1.7.4",
+ "com.google.auto.value:auto-value-annotations:1.8.1",
"com.google.errorprone:error_prone_annotations:2.11.0",
"com.google.guava:guava:31.1-jre",
"junit:junit:4.13.2",
@@ -174,6 +467,115 @@
"url": "https://repo1.maven.org/maven2/com/google/truth/truth/1.1.2/truth-1.1.2.jar"
},
{
+ "coord": "com.squareup.okhttp:okhttp:2.7.5",
+ "dependencies": [
+ "com.squareup.okio:okio:1.6.0"
+ ],
+ "directDependencies": [
+ "com.squareup.okio:okio:1.6.0"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/com/squareup/okhttp/okhttp/2.7.5/okhttp-2.7.5.jar",
+ "mirror_urls": [
+ "https://repo1.maven.org/maven2/com/squareup/okhttp/okhttp/2.7.5/okhttp-2.7.5.jar",
+ "https://repo.maven.apache.org/maven2/com/squareup/okhttp/okhttp/2.7.5/okhttp-2.7.5.jar"
+ ],
+ "sha256": "88ac9fd1bb51f82bcc664cc1eb9c225c90dc4389d660231b4cc737bebfe7d0aa",
+ "url": "https://repo1.maven.org/maven2/com/squareup/okhttp/okhttp/2.7.5/okhttp-2.7.5.jar"
+ },
+ {
+ "coord": "com.squareup.okio:okio:1.6.0",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/com/squareup/okio/okio/1.6.0/okio-1.6.0.jar",
+ "mirror_urls": [
+ "https://repo1.maven.org/maven2/com/squareup/okio/okio/1.6.0/okio-1.6.0.jar",
+ "https://repo.maven.apache.org/maven2/com/squareup/okio/okio/1.6.0/okio-1.6.0.jar"
+ ],
+ "sha256": "114bdc1f47338a68bcbc95abf2f5cdc72beeec91812f2fcd7b521c1937876266",
+ "url": "https://repo1.maven.org/maven2/com/squareup/okio/okio/1.6.0/okio-1.6.0.jar"
+ },
+ {
+ "coord": "com.sun.jersey:jersey-client:1.19.4",
+ "dependencies": [
+ "com.sun.jersey:jersey-core:1.19.4",
+ "javax.ws.rs:jsr311-api:1.1.1"
+ ],
+ "directDependencies": [
+ "com.sun.jersey:jersey-core:1.19.4"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/com/sun/jersey/jersey-client/1.19.4/jersey-client-1.19.4.jar",
+ "mirror_urls": [
+ "https://repo1.maven.org/maven2/com/sun/jersey/jersey-client/1.19.4/jersey-client-1.19.4.jar",
+ "https://repo.maven.apache.org/maven2/com/sun/jersey/jersey-client/1.19.4/jersey-client-1.19.4.jar"
+ ],
+ "sha256": "639c825c5db580f8115bf49ffc893093526d2ed1079fbc929b6a5fbd0b2eda40",
+ "url": "https://repo1.maven.org/maven2/com/sun/jersey/jersey-client/1.19.4/jersey-client-1.19.4.jar"
+ },
+ {
+ "coord": "com.sun.jersey:jersey-core:1.19.4",
+ "dependencies": [
+ "javax.ws.rs:jsr311-api:1.1.1"
+ ],
+ "directDependencies": [
+ "javax.ws.rs:jsr311-api:1.1.1"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/com/sun/jersey/jersey-core/1.19.4/jersey-core-1.19.4.jar",
+ "mirror_urls": [
+ "https://repo1.maven.org/maven2/com/sun/jersey/jersey-core/1.19.4/jersey-core-1.19.4.jar",
+ "https://repo.maven.apache.org/maven2/com/sun/jersey/jersey-core/1.19.4/jersey-core-1.19.4.jar"
+ ],
+ "sha256": "64b03198e0264849d0fc341857ebcc9c882b1909a2dc35a0972fe7d901b826e5",
+ "url": "https://repo1.maven.org/maven2/com/sun/jersey/jersey-core/1.19.4/jersey-core-1.19.4.jar"
+ },
+ {
+ "coord": "javax.annotation:javax.annotation-api:1.3.2",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar",
+ "mirror_urls": [
+ "https://repo1.maven.org/maven2/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar",
+ "https://repo.maven.apache.org/maven2/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar"
+ ],
+ "sha256": "e04ba5195bcd555dc95650f7cc614d151e4bcd52d29a10b8aa2197f3ab89ab9b",
+ "url": "https://repo1.maven.org/maven2/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar"
+ },
+ {
+ "coord": "javax.inject:javax.inject:1",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/javax/inject/javax.inject/1/javax.inject-1.jar",
+ "mirror_urls": [
+ "https://repo1.maven.org/maven2/javax/inject/javax.inject/1/javax.inject-1.jar",
+ "https://repo.maven.apache.org/maven2/javax/inject/javax.inject/1/javax.inject-1.jar"
+ ],
+ "sha256": "91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff",
+ "url": "https://repo1.maven.org/maven2/javax/inject/javax.inject/1/javax.inject-1.jar"
+ },
+ {
+ "coord": "javax.ws.rs:jsr311-api:1.1.1",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/javax/ws/rs/jsr311-api/1.1.1/jsr311-api-1.1.1.jar",
+ "mirror_urls": [
+ "https://repo1.maven.org/maven2/javax/ws/rs/jsr311-api/1.1.1/jsr311-api-1.1.1.jar",
+ "https://repo.maven.apache.org/maven2/javax/ws/rs/jsr311-api/1.1.1/jsr311-api-1.1.1.jar"
+ ],
+ "sha256": "ab1534b73b5fa055808e6598a5e73b599ccda28c3159c3c0908977809422ee4a",
+ "url": "https://repo1.maven.org/maven2/javax/ws/rs/jsr311-api/1.1.1/jsr311-api-1.1.1.jar"
+ },
+ {
+ "coord": "joda-time:joda-time:2.10.10",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/joda-time/joda-time/2.10.10/joda-time-2.10.10.jar",
+ "mirror_urls": [
+ "https://repo1.maven.org/maven2/joda-time/joda-time/2.10.10/joda-time-2.10.10.jar",
+ "https://repo.maven.apache.org/maven2/joda-time/joda-time/2.10.10/joda-time-2.10.10.jar"
+ ],
+ "sha256": "dd8e7c92185a678d1b7b933f31209b6203c8ffa91e9880475a1be0346b9617e3",
+ "url": "https://repo1.maven.org/maven2/joda-time/joda-time/2.10.10/joda-time-2.10.10.jar"
+ },
+ {
"coord": "junit:junit:4.13.2",
"dependencies": [
"org.hamcrest:hamcrest-core:1.3"
@@ -214,6 +616,18 @@
"url": "https://repo1.maven.org/maven2/net/bytebuddy/byte-buddy/1.12.7/byte-buddy-1.12.7.jar"
},
{
+ "coord": "org.checkerframework:checker-compat-qual:2.5.3",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/org/checkerframework/checker-compat-qual/2.5.3/checker-compat-qual-2.5.3.jar",
+ "mirror_urls": [
+ "https://repo1.maven.org/maven2/org/checkerframework/checker-compat-qual/2.5.3/checker-compat-qual-2.5.3.jar",
+ "https://repo.maven.apache.org/maven2/org/checkerframework/checker-compat-qual/2.5.3/checker-compat-qual-2.5.3.jar"
+ ],
+ "sha256": "d76b9afea61c7c082908023f0cbc1427fab9abd2df915c8b8a3e7a509bccbc6d",
+ "url": "https://repo1.maven.org/maven2/org/checkerframework/checker-compat-qual/2.5.3/checker-compat-qual-2.5.3.jar"
+ },
+ {
"coord": "org.checkerframework:checker-qual:3.12.0",
"dependencies": [],
"directDependencies": [],
@@ -270,6 +684,79 @@
"url": "https://repo1.maven.org/maven2/org/objenesis/objenesis/3.2/objenesis-3.2.jar"
},
{
+ "coord": "org.ow2.asm:asm-analysis:7.2",
+ "dependencies": [
+ "org.ow2.asm:asm-tree:7.2",
+ "org.ow2.asm:asm:9.0"
+ ],
+ "directDependencies": [
+ "org.ow2.asm:asm-tree:7.2"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/org/ow2/asm/asm-analysis/7.2/asm-analysis-7.2.jar",
+ "mirror_urls": [
+ "https://repo1.maven.org/maven2/org/ow2/asm/asm-analysis/7.2/asm-analysis-7.2.jar",
+ "https://repo.maven.apache.org/maven2/org/ow2/asm/asm-analysis/7.2/asm-analysis-7.2.jar"
+ ],
+ "sha256": "be922aae60ff1ff1768e8e6544a38a7f92bd0a6d6b0b9791f94955d1bd453de2",
+ "url": "https://repo1.maven.org/maven2/org/ow2/asm/asm-analysis/7.2/asm-analysis-7.2.jar"
+ },
+ {
+ "coord": "org.ow2.asm:asm-commons:7.2",
+ "dependencies": [
+ "org.ow2.asm:asm-analysis:7.2",
+ "org.ow2.asm:asm-tree:7.2",
+ "org.ow2.asm:asm:9.0"
+ ],
+ "directDependencies": [
+ "org.ow2.asm:asm-analysis:7.2",
+ "org.ow2.asm:asm-tree:7.2",
+ "org.ow2.asm:asm:9.0"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/org/ow2/asm/asm-commons/7.2/asm-commons-7.2.jar",
+ "mirror_urls": [
+ "https://repo1.maven.org/maven2/org/ow2/asm/asm-commons/7.2/asm-commons-7.2.jar",
+ "https://repo.maven.apache.org/maven2/org/ow2/asm/asm-commons/7.2/asm-commons-7.2.jar"
+ ],
+ "sha256": "0e86b8b179c5fb223d1a880a0ff4960b6978223984b94e62e71135f2d8ea3558",
+ "url": "https://repo1.maven.org/maven2/org/ow2/asm/asm-commons/7.2/asm-commons-7.2.jar"
+ },
+ {
+ "coord": "org.ow2.asm:asm-tree:7.2",
+ "dependencies": [
+ "org.ow2.asm:asm:9.0"
+ ],
+ "directDependencies": [
+ "org.ow2.asm:asm:9.0"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/org/ow2/asm/asm-tree/7.2/asm-tree-7.2.jar",
+ "mirror_urls": [
+ "https://repo1.maven.org/maven2/org/ow2/asm/asm-tree/7.2/asm-tree-7.2.jar",
+ "https://repo.maven.apache.org/maven2/org/ow2/asm/asm-tree/7.2/asm-tree-7.2.jar"
+ ],
+ "sha256": "c063f5a67fa03cdc9bd79fd1c2ea6816cc4a19473ecdfbd9e9153b408c6f2656",
+ "url": "https://repo1.maven.org/maven2/org/ow2/asm/asm-tree/7.2/asm-tree-7.2.jar"
+ },
+ {
+ "coord": "org.ow2.asm:asm-util:7.2",
+ "dependencies": [
+ "org.ow2.asm:asm-analysis:7.2",
+ "org.ow2.asm:asm-tree:7.2",
+ "org.ow2.asm:asm:9.0"
+ ],
+ "directDependencies": [
+ "org.ow2.asm:asm-analysis:7.2",
+ "org.ow2.asm:asm-tree:7.2",
+ "org.ow2.asm:asm:9.0"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/org/ow2/asm/asm-util/7.2/asm-util-7.2.jar",
+ "mirror_urls": [
+ "https://repo1.maven.org/maven2/org/ow2/asm/asm-util/7.2/asm-util-7.2.jar",
+ "https://repo.maven.apache.org/maven2/org/ow2/asm/asm-util/7.2/asm-util-7.2.jar"
+ ],
+ "sha256": "6e24913b021ffacfe8e7e053d6e0ccc731941148cfa078d4f1ed3d96904530f8",
+ "url": "https://repo1.maven.org/maven2/org/ow2/asm/asm-util/7.2/asm-util-7.2.jar"
+ },
+ {
"coord": "org.ow2.asm:asm:9.0",
"dependencies": [],
"directDependencies": [],
diff --git a/objectivec/BUILD.bazel b/objectivec/BUILD.bazel
index c18788f..153894f 100644
--- a/objectivec/BUILD.bazel
+++ b/objectivec/BUILD.bazel
@@ -1,5 +1,6 @@
load("@rules_cc//cc:defs.bzl", "objc_library")
load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
+load("//conformance:defs.bzl", "conformance_test")
objc_library(
name = "objectivec",
@@ -90,6 +91,20 @@
visibility = ["//visibility:public"],
)
+################################################################################
+# Tests
+################################################################################
+
+conformance_test(
+ name = "conformance_test",
+ failure_list = "//conformance:failure_list_objc.txt",
+ testee = "//conformance:conformance_objc",
+)
+
+################################################################################
+# Distribution files
+################################################################################
+
pkg_files(
name = "dist_files",
srcs = glob([
diff --git a/objectivec/DevTools/compile_testing_protos.sh b/objectivec/DevTools/compile_testing_protos.sh
index 69c32f9..fb8a853 100755
--- a/objectivec/DevTools/compile_testing_protos.sh
+++ b/objectivec/DevTools/compile_testing_protos.sh
@@ -26,45 +26,15 @@
esac
# -----------------------------------------------------------------------------
-# Reusing a bunch of the protos from the protocolbuffers/protobuf tree, this
-# can include some extras as there is no harm in ensuring work for C++
-# generation.
-
-CORE_PROTO_FILES=(
- src/google/protobuf/any_test.proto
- src/google/protobuf/unittest_arena.proto
- src/google/protobuf/unittest_custom_options.proto
- src/google/protobuf/unittest_enormous_descriptor.proto
- src/google/protobuf/unittest_embed_optimize_for.proto
- src/google/protobuf/unittest_empty.proto
- src/google/protobuf/unittest_import.proto
- src/google/protobuf/unittest_import_lite.proto
- src/google/protobuf/unittest_lite.proto
- src/google/protobuf/unittest_mset.proto
- src/google/protobuf/unittest_mset_wire_format.proto
- src/google/protobuf/unittest_no_generic_services.proto
- src/google/protobuf/unittest_optimize_for.proto
- src/google/protobuf/unittest.proto
- src/google/protobuf/unittest_import_public.proto
- src/google/protobuf/unittest_import_public_lite.proto
- src/google/protobuf/unittest_drop_unknown_fields.proto
- src/google/protobuf/unittest_preserve_unknown_enum.proto
- src/google/protobuf/map_lite_unittest.proto
- src/google/protobuf/map_proto2_unittest.proto
- src/google/protobuf/map_unittest.proto
- # The unittest_custom_options.proto extends the messages in descriptor.proto
- # so we build it in to test extending in general. The library doesn't provide
- # a descriptor as it doesn't use the classes/enums.
- src/google/protobuf/descriptor.proto
-)
-
-# -----------------------------------------------------------------------------
# The objc unittest specific proto files.
OBJC_TEST_PROTO_FILES=(
+ objectivec/Tests/any_test.proto
+ objectivec/Tests/map_proto2_unittest.proto
+ objectivec/Tests/map_unittest.proto
objectivec/Tests/unittest_cycle.proto
- objectivec/Tests/unittest_deprecated.proto
objectivec/Tests/unittest_deprecated_file.proto
+ objectivec/Tests/unittest_deprecated.proto
objectivec/Tests/unittest_extension_chain_a.proto
objectivec/Tests/unittest_extension_chain_b.proto
objectivec/Tests/unittest_extension_chain_c.proto
@@ -72,24 +42,30 @@
objectivec/Tests/unittest_extension_chain_e.proto
objectivec/Tests/unittest_extension_chain_f.proto
objectivec/Tests/unittest_extension_chain_g.proto
- objectivec/Tests/unittest_objc.proto
- objectivec/Tests/unittest_objc_startup.proto
+ objectivec/Tests/unittest_import_public.proto
+ objectivec/Tests/unittest_import.proto
+ objectivec/Tests/unittest_mset.proto
objectivec/Tests/unittest_objc_options.proto
+ objectivec/Tests/unittest_objc_startup.proto
+ objectivec/Tests/unittest_objc.proto
+ objectivec/Tests/unittest_preserve_unknown_enum.proto
objectivec/Tests/unittest_runtime_proto2.proto
objectivec/Tests/unittest_runtime_proto3.proto
+ objectivec/Tests/unittest.proto
)
OBJC_EXTENSIONS=( .pbobjc.h .pbobjc.m )
# -----------------------------------------------------------------------------
# Ensure the output dir exists
-mkdir -p "${OUTPUT_DIR}/google/protobuf"
+mkdir -p "${OUTPUT_DIR}"
# -----------------------------------------------------------------------------
# Move to the top of the protobuf directories and ensure there is a protoc
# binary to use.
cd "${SRCROOT}/.."
-[[ -x src/protoc ]] || \
+readonly PROTOC="bazel-bin/protoc"
+[[ -x "${PROTOC}" ]] || \
die "Could not find the protoc binary; make sure you have built it (objectivec/DevTools/full_mac_build.sh -h)."
# -----------------------------------------------------------------------------
@@ -97,7 +73,7 @@
# Check to if all the output files exist (in case a new one got added).
-for PROTO_FILE in "${CORE_PROTO_FILES[@]}" "${OBJC_TEST_PROTO_FILES[@]}"; do
+for PROTO_FILE in "${OBJC_TEST_PROTO_FILES[@]}"; do
DIR=${PROTO_FILE%/*}
BASE_NAME=${PROTO_FILE##*/}
# Drop the extension
@@ -105,7 +81,7 @@
OBJC_NAME=$(echo "${BASE_NAME}" | awk -F _ '{for(i=1; i<=NF; i++) printf "%s", toupper(substr($i,1,1)) substr($i,2);}')
for EXT in "${OBJC_EXTENSIONS[@]}"; do
- if [[ ! -f "${OUTPUT_DIR}/google/protobuf/${OBJC_NAME}${EXT}" ]]; then
+ if [[ ! -f "${OUTPUT_DIR}/${DIR}/${OBJC_NAME}${EXT}" ]]; then
RUN_PROTOC=yes
fi
done
@@ -118,9 +94,7 @@
# (these patterns catch some extra stuff, but better to over sample than
# under)
readonly NewestInput=$(find \
- src/google/protobuf/*.proto \
- objectivec/Tests/*.proto \
- src/.libs src/*.la src/protoc \
+ objectivec/Tests/*.proto "${PROTOC}" \
objectivec/DevTools/compile_testing_protos.sh \
-type f -print0 \
| xargs -0 stat -f "%m %N" \
@@ -150,28 +124,13 @@
| xargs -0 rm -rf
# -----------------------------------------------------------------------------
-# Helper to invoke protoc
-compile_protos() {
- src/protoc \
- --objc_out="${OUTPUT_DIR}/google/protobuf" \
- --proto_path=src/google/protobuf/ \
- --proto_path=src \
- --experimental_allow_proto3_optional \
- "$@"
-}
-
-# -----------------------------------------------------------------------------
-# Generate most of the proto files that exist in the C++ src tree.
-
-# Note: there is overlap in package.Message names between some of the test
-# files, so they can't be generated all at once. This works because the overlap
-# isn't linked into a single binary.
-for a_proto in "${CORE_PROTO_FILES[@]}" ; do
- compile_protos "${a_proto}"
-done
-
-# -----------------------------------------------------------------------------
# Generate the Objective C specific testing protos.
-compile_protos \
- --proto_path="objectivec/Tests" \
+
+"${PROTOC}" \
+ --objc_out="${OUTPUT_DIR}" \
+ --objc_opt=expected_prefixes_path=objectivec/Tests/expected_prefixes.txt \
+ --objc_opt=prefixes_must_be_registered=yes \
+ --objc_opt=require_prefixes=yes \
+ --proto_path=. \
+ --proto_path=src \
"${OBJC_TEST_PROTO_FILES[@]}"
diff --git a/objectivec/DevTools/full_mac_build.sh b/objectivec/DevTools/full_mac_build.sh
index 0e183f2..95e8e5b 100755
--- a/objectivec/DevTools/full_mac_build.sh
+++ b/objectivec/DevTools/full_mac_build.sh
@@ -8,6 +8,10 @@
# Some base locations.
readonly ScriptDir=$(dirname "$(echo $0 | sed -e "s,^\([^/]\),$(pwd)/\1,")")
readonly ProtoRootDir="${ScriptDir}/../.."
+readonly BazelFlags="-k --announce_rc --test_output=errors --macos_minimum_os=10.9"
+
+# Invoke with BAZEL=bazelisk to use that instead.
+readonly BazelBin="${BAZEL:=bazel}"
printUsage() {
NAME=$(basename "${0}")
@@ -24,13 +28,9 @@
Show this message
-c, --clean
Issue a clean before the normal build.
- -a, --autogen
- Start by rerunning autogen & configure.
-r, --regenerate-descriptors
Run generate_descriptor_proto.sh to regenerate all the checked in
proto sources.
- -j #, --jobs #
- Force the number of parallel jobs (useful for debugging build issues).
--core-only
Skip some of the core protobuf build/checks to shorten the build time.
--skip-xcode
@@ -60,25 +60,7 @@
echo "========================================================================"
}
-# Thanks to libtool, builds can fail in odd ways and since it eats some output
-# it can be hard to spot, so force error output if make exits with a non zero.
-wrapped_make() {
- set +e # Don't stop if the command fails.
- make $*
- MAKE_EXIT_STATUS=$?
- if [ ${MAKE_EXIT_STATUS} -ne 0 ]; then
- echo "Error: 'make $*' exited with status ${MAKE_EXIT_STATUS}"
- exit ${MAKE_EXIT_STATUS}
- fi
- set -e
-}
-
-NUM_MAKE_JOBS=$(/usr/sbin/sysctl -n hw.ncpu)
-if [[ "${NUM_MAKE_JOBS}" -lt 2 ]] ; then
- NUM_MAKE_JOBS=2
-fi
-
-DO_AUTOGEN=no
+BAZEL=bazel
DO_CLEAN=no
REGEN_DESCRIPTORS=no
CORE_ONLY=no
@@ -98,16 +80,9 @@
-c | --clean )
DO_CLEAN=yes
;;
- -a | --autogen )
- DO_AUTOGEN=yes
- ;;
-r | --regenerate-descriptors )
REGEN_DESCRIPTORS=yes
;;
- -j | --jobs )
- shift
- NUM_MAKE_JOBS="${1}"
- ;;
--core-only )
CORE_ONLY=yes
;;
@@ -154,21 +129,9 @@
# Into the proto dir.
cd "${ProtoRootDir}"
-# if no Makefile, force the autogen.
-if [[ ! -f Makefile ]] ; then
- DO_AUTOGEN=yes
-fi
-
-if [[ "${DO_AUTOGEN}" == "yes" ]] ; then
- header "Running autogen & configure"
- ./autogen.sh
- ./configure \
- CPPFLAGS="-mmacosx-version-min=10.9 -Wunused-const-variable -Wunused-function"
-fi
-
if [[ "${DO_CLEAN}" == "yes" ]] ; then
header "Cleaning"
- wrapped_make clean
+ "${BazelBin}" clean
if [[ "${DO_XCODE_IOS_TESTS}" == "yes" ]] ; then
XCODEBUILD_CLEAN_BASE_IOS=(
xcodebuild
@@ -212,26 +175,23 @@
if [[ "${REGEN_DESCRIPTORS}" == "yes" ]] ; then
header "Regenerating the descriptor sources."
- ./generate_descriptor_proto.sh -j "${NUM_MAKE_JOBS}"
+ ./generate_descriptor_proto.sh
fi
if [[ "${CORE_ONLY}" == "yes" ]] ; then
header "Building core Only"
- wrapped_make -j "${NUM_MAKE_JOBS}"
+ "${BazelBin}" build //:protoc //:protobuf //:protobuf_lite $BazelFlags
else
header "Building"
# Can't issue these together, when fully parallel, something sometimes chokes
# at random.
- wrapped_make -j "${NUM_MAKE_JOBS}" all
- wrapped_make -j "${NUM_MAKE_JOBS}" check
+ "${BazelBin}" test //src/... $BazelFlags
# Fire off the conformance tests also.
- cd conformance
- wrapped_make -j "${NUM_MAKE_JOBS}" test_cpp
- cd ..
+ "${BazelBin}" test //objectivec:conformance_test $BazelFlags
fi
# Ensure the WKT sources checked in are current.
-objectivec/generate_well_known_types.sh --check-only -j "${NUM_MAKE_JOBS}"
+BAZEL="${BazelBin}" objectivec/generate_well_known_types.sh --check-only $BazelFlags
header "Checking on the ObjC Runtime Code"
# Some of the kokoro machines don't have python3 yet, so fall back to python if need be.
@@ -264,38 +224,11 @@
# just pick a mix of OS Versions and 32/64 bit.
# NOTE: Different Xcode have different simulated hardware/os support.
case "${XCODE_VERSION}" in
- [6-8].* )
- echo "ERROR: The unittests include Swift code that is now Swift 4.0." 1>&2
- echo "ERROR: Xcode 9.0 or higher is required to build the test suite, but the library works with Xcode 7.x." 1>&2
+ [6-9].* | 1[0-2].* )
+ echo "ERROR: Xcode 13.3.1 or higher is required." 1>&2
exit 11
;;
- 9.[0-2]* )
- XCODEBUILD_TEST_BASE_IOS+=(
- -destination "platform=iOS Simulator,name=iPhone 4s,OS=8.1" # 32bit
- -destination "platform=iOS Simulator,name=iPhone 7,OS=latest" # 64bit
- # 9.0-9.2 all seem to often fail running destinations in parallel
- -disable-concurrent-testing
- )
- ;;
- 9.[3-4]* )
- XCODEBUILD_TEST_BASE_IOS+=(
- # Xcode 9.3 chokes targeting iOS 8.x - http://www.openradar.me/39335367
- -destination "platform=iOS Simulator,name=iPhone 4s,OS=9.0" # 32bit
- -destination "platform=iOS Simulator,name=iPhone 7,OS=latest" # 64bit
- # 9.3 also seems to often fail running destinations in parallel
- -disable-concurrent-testing
- )
- ;;
- 10.*)
- XCODEBUILD_TEST_BASE_IOS+=(
- -destination "platform=iOS Simulator,name=iPhone 4s,OS=8.1" # 32bit
- -destination "platform=iOS Simulator,name=iPhone 7,OS=latest" # 64bit
- # 10.x also seems to often fail running destinations in parallel (with
- # 32bit one include at least)
- -disable-concurrent-destination-testing
- )
- ;;
- 11.* | 12.* | 13.*)
+ 13.* | 14.*)
# Dropped 32bit as Apple doesn't seem support the simulators either.
XCODEBUILD_TEST_BASE_IOS+=(
-destination "platform=iOS Simulator,name=iPhone 8,OS=latest" # 64bit
@@ -332,9 +265,8 @@
XCODEBUILD_TEST_BASE_OSX+=( -quiet )
fi
case "${XCODE_VERSION}" in
- [6-8].* )
- echo "ERROR: The unittests include Swift code that is now Swift 4.0." 1>&2
- echo "ERROR: Xcode 9.0 or higher is required to build the test suite, but the library works with Xcode 7.x." 1>&2
+ [6-9].* | 1[0-2].* )
+ echo "ERROR: Xcode 13.3.1 or higher is required." 1>&2
exit 11
;;
esac
@@ -354,16 +286,11 @@
-scheme ProtocolBuffers
)
case "${XCODE_VERSION}" in
- [6-9].* )
- echo "ERROR: Xcode 10.0 or higher is required to build the test suite." 1>&2
+ [6-9].* | 1[0-2].* )
+ echo "ERROR: Xcode 13.3.1 or higher is required." 1>&2
exit 11
;;
- 10.* | 11.* | 12.*)
- XCODEBUILD_TEST_BASE_TVOS+=(
- -destination "platform=tvOS Simulator,name=Apple TV 4K,OS=latest"
- )
- ;;
- 13.*)
+ 13.* | 14.*)
XCODEBUILD_TEST_BASE_TVOS+=(
-destination "platform=tvOS Simulator,name=Apple TV 4K (2nd generation),OS=latest"
)
@@ -391,9 +318,7 @@
if [[ "${DO_OBJC_CONFORMANCE_TESTS}" == "yes" ]] ; then
header "Running ObjC Conformance Tests"
- cd conformance
- wrapped_make -j "${NUM_MAKE_JOBS}" test_objc
- cd ..
+ "${BazelBin}" test //objectivec:conformance_test $BazelFlags
fi
echo ""
diff --git a/objectivec/DevTools/pddm.py b/objectivec/DevTools/pddm.py
index 60ff089..11925b1 100755
--- a/objectivec/DevTools/pddm.py
+++ b/objectivec/DevTools/pddm.py
@@ -485,14 +485,13 @@
if self._macro_collection:
# Always add a blank line, seems to read better. (If need be, add an
# option to the EXPAND to indicate if this should be done.)
- result.extend([_GENERATED_CODE_LINE, '// clang-format off', ''])
+ result.extend([_GENERATED_CODE_LINE, ''])
macro = line[directive_len:].strip()
try:
expand_result = self._macro_collection.Expand(macro)
# Since expansions are line oriented, strip trailing whitespace
# from the lines.
lines = [x.rstrip() for x in expand_result.split('\n')]
- lines.append('// clang-format on')
result.append('\n'.join(lines))
except PDDMError as e:
raise PDDMError('%s\n...while expanding "%s" from the section'
diff --git a/objectivec/DevTools/pddm_tests.py b/objectivec/DevTools/pddm_tests.py
index d5b88c9..2d9c47f 100755
--- a/objectivec/DevTools/pddm_tests.py
+++ b/objectivec/DevTools/pddm_tests.py
@@ -418,24 +418,18 @@
foo
//%PDDM-EXPAND mumble(abc)
// This block of code is generated, do not edit it directly.
-// clang-format off
abc: doAbc(int abc);
-// clang-format on
//%PDDM-EXPAND-END mumble(abc)
bar
//%PDDM-EXPAND mumble(def)
// This block of code is generated, do not edit it directly.
-// clang-format off
def: doDef(int def);
-// clang-format on
//%PDDM-EXPAND mumble(ghi)
// This block of code is generated, do not edit it directly.
-// clang-format off
ghi: doGhi(int ghi);
-// clang-format on
//%PDDM-EXPAND-END (2 expansions)
baz
//%PDDM-DEFINE mumble(a_)
diff --git a/objectivec/GPBAny.pbobjc.h b/objectivec/GPBAny.pbobjc.h
index 7fb4129..e30acc0 100644
--- a/objectivec/GPBAny.pbobjc.h
+++ b/objectivec/GPBAny.pbobjc.h
@@ -1,6 +1,8 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: google/protobuf/any.proto
+// clang-format off
+
#import "GPBDescriptor.h"
#import "GPBMessage.h"
#import "GPBRootObject.h"
@@ -172,3 +174,5 @@
#pragma clang diagnostic pop
// @@protoc_insertion_point(global_scope)
+
+// clange-format on
diff --git a/objectivec/GPBAny.pbobjc.m b/objectivec/GPBAny.pbobjc.m
index 7632c8c..e838675 100644
--- a/objectivec/GPBAny.pbobjc.m
+++ b/objectivec/GPBAny.pbobjc.m
@@ -1,6 +1,8 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: google/protobuf/any.proto
+// clang-format off
+
#import "GPBProtocolBuffers_RuntimeSupport.h"
#import "GPBAny.pbobjc.h"
@@ -98,3 +100,5 @@
#pragma clang diagnostic pop
// @@protoc_insertion_point(global_scope)
+
+// clange-format on
diff --git a/objectivec/GPBApi.pbobjc.h b/objectivec/GPBApi.pbobjc.h
index 871e908..3cd0821 100644
--- a/objectivec/GPBApi.pbobjc.h
+++ b/objectivec/GPBApi.pbobjc.h
@@ -1,6 +1,8 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: google/protobuf/api.proto
+// clang-format off
+
#import "GPBDescriptor.h"
#import "GPBMessage.h"
#import "GPBRootObject.h"
@@ -74,12 +76,12 @@
/** The methods of this interface, in unspecified order. */
@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBMethod*> *methodsArray;
-/** The number of items in @c methodsArray without causing the array to be created. */
+/** The number of items in @c methodsArray without causing the container to be created. */
@property(nonatomic, readonly) NSUInteger methodsArray_Count;
/** Any metadata attached to the interface. */
@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBOption*> *optionsArray;
-/** The number of items in @c optionsArray without causing the array to be created. */
+/** The number of items in @c optionsArray without causing the container to be created. */
@property(nonatomic, readonly) NSUInteger optionsArray_Count;
/**
@@ -115,7 +117,7 @@
/** Included interfaces. See [Mixin][]. */
@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBMixin*> *mixinsArray;
-/** The number of items in @c mixinsArray without causing the array to be created. */
+/** The number of items in @c mixinsArray without causing the container to be created. */
@property(nonatomic, readonly) NSUInteger mixinsArray_Count;
/** The source syntax of the service. */
@@ -169,7 +171,7 @@
/** Any metadata attached to the method. */
@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBOption*> *optionsArray;
-/** The number of items in @c optionsArray without causing the array to be created. */
+/** The number of items in @c optionsArray without causing the container to be created. */
@property(nonatomic, readonly) NSUInteger optionsArray_Count;
/** The source syntax of this method. */
@@ -296,3 +298,5 @@
#pragma clang diagnostic pop
// @@protoc_insertion_point(global_scope)
+
+// clange-format on
diff --git a/objectivec/GPBApi.pbobjc.m b/objectivec/GPBApi.pbobjc.m
index 7f86a08..88a215e 100644
--- a/objectivec/GPBApi.pbobjc.m
+++ b/objectivec/GPBApi.pbobjc.m
@@ -1,6 +1,8 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: google/protobuf/api.proto
+// clang-format off
+
#import "GPBProtocolBuffers_RuntimeSupport.h"
#import "GPBApi.pbobjc.h"
@@ -352,3 +354,5 @@
#pragma clang diagnostic pop
// @@protoc_insertion_point(global_scope)
+
+// clange-format on
diff --git a/objectivec/GPBArray.h b/objectivec/GPBArray.h
index 5aea75c..4985dbe 100644
--- a/objectivec/GPBArray.h
+++ b/objectivec/GPBArray.h
@@ -34,9 +34,11 @@
NS_ASSUME_NONNULL_BEGIN
+// Disable clang-format for the macros.
+// clang-format off
+
//%PDDM-EXPAND DECLARE_ARRAYS()
// This block of code is generated, do not edit it directly.
-// clang-format off
#pragma mark - Int32
@@ -135,7 +137,8 @@
* **idx**: The index of the current value.
* **stop**: A pointer to a boolean that when set stops the enumeration.
**/
-- (void)enumerateValuesWithBlock:(void (NS_NOESCAPE ^)(int32_t value, NSUInteger idx, BOOL *stop))block;
+- (void)enumerateValuesWithBlock:(void (NS_NOESCAPE ^)(int32_t value, NSUInteger idx,
+ BOOL *stop))block;
/**
* Enumerates the values on this array with the given block.
@@ -147,7 +150,8 @@
* **stop**: A pointer to a boolean that when set stops the enumeration.
**/
- (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts
- usingBlock:(void (NS_NOESCAPE ^)(int32_t value, NSUInteger idx, BOOL *stop))block;
+ usingBlock:(void (NS_NOESCAPE ^)(int32_t value, NSUInteger idx,
+ BOOL *stop))block;
/**
* Adds a value to this array.
@@ -307,7 +311,8 @@
* **idx**: The index of the current value.
* **stop**: A pointer to a boolean that when set stops the enumeration.
**/
-- (void)enumerateValuesWithBlock:(void (NS_NOESCAPE ^)(uint32_t value, NSUInteger idx, BOOL *stop))block;
+- (void)enumerateValuesWithBlock:(void (NS_NOESCAPE ^)(uint32_t value, NSUInteger idx,
+ BOOL *stop))block;
/**
* Enumerates the values on this array with the given block.
@@ -319,7 +324,8 @@
* **stop**: A pointer to a boolean that when set stops the enumeration.
**/
- (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts
- usingBlock:(void (NS_NOESCAPE ^)(uint32_t value, NSUInteger idx, BOOL *stop))block;
+ usingBlock:(void (NS_NOESCAPE ^)(uint32_t value, NSUInteger idx,
+ BOOL *stop))block;
/**
* Adds a value to this array.
@@ -479,7 +485,8 @@
* **idx**: The index of the current value.
* **stop**: A pointer to a boolean that when set stops the enumeration.
**/
-- (void)enumerateValuesWithBlock:(void (NS_NOESCAPE ^)(int64_t value, NSUInteger idx, BOOL *stop))block;
+- (void)enumerateValuesWithBlock:(void (NS_NOESCAPE ^)(int64_t value, NSUInteger idx,
+ BOOL *stop))block;
/**
* Enumerates the values on this array with the given block.
@@ -491,7 +498,8 @@
* **stop**: A pointer to a boolean that when set stops the enumeration.
**/
- (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts
- usingBlock:(void (NS_NOESCAPE ^)(int64_t value, NSUInteger idx, BOOL *stop))block;
+ usingBlock:(void (NS_NOESCAPE ^)(int64_t value, NSUInteger idx,
+ BOOL *stop))block;
/**
* Adds a value to this array.
@@ -651,7 +659,8 @@
* **idx**: The index of the current value.
* **stop**: A pointer to a boolean that when set stops the enumeration.
**/
-- (void)enumerateValuesWithBlock:(void (NS_NOESCAPE ^)(uint64_t value, NSUInteger idx, BOOL *stop))block;
+- (void)enumerateValuesWithBlock:(void (NS_NOESCAPE ^)(uint64_t value, NSUInteger idx,
+ BOOL *stop))block;
/**
* Enumerates the values on this array with the given block.
@@ -663,7 +672,8 @@
* **stop**: A pointer to a boolean that when set stops the enumeration.
**/
- (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts
- usingBlock:(void (NS_NOESCAPE ^)(uint64_t value, NSUInteger idx, BOOL *stop))block;
+ usingBlock:(void (NS_NOESCAPE ^)(uint64_t value, NSUInteger idx,
+ BOOL *stop))block;
/**
* Adds a value to this array.
@@ -823,7 +833,8 @@
* **idx**: The index of the current value.
* **stop**: A pointer to a boolean that when set stops the enumeration.
**/
-- (void)enumerateValuesWithBlock:(void (NS_NOESCAPE ^)(float value, NSUInteger idx, BOOL *stop))block;
+- (void)enumerateValuesWithBlock:(void (NS_NOESCAPE ^)(float value, NSUInteger idx,
+ BOOL *stop))block;
/**
* Enumerates the values on this array with the given block.
@@ -835,7 +846,8 @@
* **stop**: A pointer to a boolean that when set stops the enumeration.
**/
- (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts
- usingBlock:(void (NS_NOESCAPE ^)(float value, NSUInteger idx, BOOL *stop))block;
+ usingBlock:(void (NS_NOESCAPE ^)(float value, NSUInteger idx,
+ BOOL *stop))block;
/**
* Adds a value to this array.
@@ -995,7 +1007,8 @@
* **idx**: The index of the current value.
* **stop**: A pointer to a boolean that when set stops the enumeration.
**/
-- (void)enumerateValuesWithBlock:(void (NS_NOESCAPE ^)(double value, NSUInteger idx, BOOL *stop))block;
+- (void)enumerateValuesWithBlock:(void (NS_NOESCAPE ^)(double value, NSUInteger idx,
+ BOOL *stop))block;
/**
* Enumerates the values on this array with the given block.
@@ -1007,7 +1020,8 @@
* **stop**: A pointer to a boolean that when set stops the enumeration.
**/
- (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts
- usingBlock:(void (NS_NOESCAPE ^)(double value, NSUInteger idx, BOOL *stop))block;
+ usingBlock:(void (NS_NOESCAPE ^)(double value, NSUInteger idx,
+ BOOL *stop))block;
/**
* Adds a value to this array.
@@ -1167,7 +1181,8 @@
* **idx**: The index of the current value.
* **stop**: A pointer to a boolean that when set stops the enumeration.
**/
-- (void)enumerateValuesWithBlock:(void (NS_NOESCAPE ^)(BOOL value, NSUInteger idx, BOOL *stop))block;
+- (void)enumerateValuesWithBlock:(void (NS_NOESCAPE ^)(BOOL value, NSUInteger idx,
+ BOOL *stop))block;
/**
* Enumerates the values on this array with the given block.
@@ -1179,7 +1194,8 @@
* **stop**: A pointer to a boolean that when set stops the enumeration.
**/
- (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts
- usingBlock:(void (NS_NOESCAPE ^)(BOOL value, NSUInteger idx, BOOL *stop))block;
+ usingBlock:(void (NS_NOESCAPE ^)(BOOL value, NSUInteger idx,
+ BOOL *stop))block;
/**
* Adds a value to this array.
@@ -1370,7 +1386,8 @@
* **idx**: The index of the current value.
* **stop**: A pointer to a boolean that when set stops the enumeration.
**/
-- (void)enumerateValuesWithBlock:(void (NS_NOESCAPE ^)(int32_t value, NSUInteger idx, BOOL *stop))block;
+- (void)enumerateValuesWithBlock:(void (NS_NOESCAPE ^)(int32_t value, NSUInteger idx,
+ BOOL *stop))block;
/**
* Enumerates the values on this array with the given block.
@@ -1382,7 +1399,8 @@
* **stop**: A pointer to a boolean that when set stops the enumeration.
**/
- (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts
- usingBlock:(void (NS_NOESCAPE ^)(int32_t value, NSUInteger idx, BOOL *stop))block;
+ usingBlock:(void (NS_NOESCAPE ^)(int32_t value, NSUInteger idx,
+ BOOL *stop))block;
// These methods bypass the validationFunc to provide access to values that were not
// known at the time the binary was compiled.
@@ -1404,7 +1422,8 @@
* **idx**: The index of the current value.
* **stop**: A pointer to a boolean that when set stops the enumeration.
**/
-- (void)enumerateRawValuesWithBlock:(void (NS_NOESCAPE ^)(int32_t value, NSUInteger idx, BOOL *stop))block;
+- (void)enumerateRawValuesWithBlock:(void (NS_NOESCAPE ^)(int32_t value, NSUInteger idx,
+ BOOL *stop))block;
/**
* Enumerates the values on this array with the given block.
@@ -1416,7 +1435,8 @@
* **stop**: A pointer to a boolean that when set stops the enumeration.
**/
- (void)enumerateRawValuesWithOptions:(NSEnumerationOptions)opts
- usingBlock:(void (NS_NOESCAPE ^)(int32_t value, NSUInteger idx, BOOL *stop))block;
+ usingBlock:(void (NS_NOESCAPE ^)(int32_t value, NSUInteger idx,
+ BOOL *stop))block;
// If value is not a valid enumerator as defined by validationFunc, these
// methods will assert in debug, and will log in release and assign the value
@@ -1536,7 +1556,6 @@
@end
-// clang-format on
//%PDDM-EXPAND-END DECLARE_ARRAYS()
NS_ASSUME_NONNULL_END
@@ -1781,7 +1800,8 @@
//% * **idx**: The index of the current value.
//% * **stop**: A pointer to a boolean that when set stops the enumeration.
//% **/
-//%- (void)enumerateRawValuesWithBlock:(void (NS_NOESCAPE ^)(TYPE value, NSUInteger idx, BOOL *stop))block;
+//%- (void)enumerateRawValuesWithBlock:(void (NS_NOESCAPE ^)(TYPE value, NSUInteger idx,
+//% BOOL *stop))block;
//%
//%/**
//% * Enumerates the values on this array with the given block.
@@ -1793,7 +1813,8 @@
//% * **stop**: A pointer to a boolean that when set stops the enumeration.
//% **/
//%- (void)enumerateRawValuesWithOptions:(NSEnumerationOptions)opts
-//% usingBlock:(void (NS_NOESCAPE ^)(TYPE value, NSUInteger idx, BOOL *stop))block;
+//% usingBlock:(void (NS_NOESCAPE ^)(TYPE value, NSUInteger idx,
+//% BOOL *stop))block;
//%
//%// If value is not a valid enumerator as defined by validationFunc, these
//%// methods will assert in debug, and will log in release and assign the value
@@ -1823,7 +1844,8 @@
//% * **idx**: The index of the current value.
//% * **stop**: A pointer to a boolean that when set stops the enumeration.
//% **/
-//%- (void)enumerateValuesWithBlock:(void (NS_NOESCAPE ^)(TYPE value, NSUInteger idx, BOOL *stop))block;
+//%- (void)enumerateValuesWithBlock:(void (NS_NOESCAPE ^)(TYPE value, NSUInteger idx,
+//% BOOL *stop))block;
//%
//%/**
//% * Enumerates the values on this array with the given block.
@@ -1835,7 +1857,8 @@
//% * **stop**: A pointer to a boolean that when set stops the enumeration.
//% **/
//%- (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts
-//% usingBlock:(void (NS_NOESCAPE ^)(TYPE value, NSUInteger idx, BOOL *stop))block;
+//% usingBlock:(void (NS_NOESCAPE ^)(TYPE value, NSUInteger idx,
+//% BOOL *stop))block;
//%PDDM-DEFINE ARRAY_MUTABLE_INTERFACE(NAME, TYPE, HELPER_NAME)
//%/**
@@ -1967,3 +1990,5 @@
//%
//%// No validation applies to these methods.
//%
+
+// clang-format on
diff --git a/objectivec/GPBArray.m b/objectivec/GPBArray.m
index bb9a077..eba7d15 100644
--- a/objectivec/GPBArray.m
+++ b/objectivec/GPBArray.m
@@ -47,6 +47,9 @@
return (value != kGPBUnrecognizedEnumeratorValue);
}
+// Disable clang-format for the macros.
+// clang-format off
+
//%PDDM-DEFINE VALIDATE_RANGE(INDEX, COUNT)
//% if (INDEX >= COUNT) {
//% [NSException raise:NSRangeException
@@ -194,12 +197,12 @@
//% return result;
//%}
//%
-//%- (void)enumerate##ACCESSOR_NAME##ValuesWithBlock:(void (NS_NOESCAPE ^)(TYPE value, NSUInteger idx, BOOL *stop))block {
+//%- (void)enumerate##ACCESSOR_NAME##ValuesWithBlock:(void(NS_NOESCAPE ^)(TYPE value, NSUInteger idx, BOOL *stop))block {
//% [self enumerate##ACCESSOR_NAME##ValuesWithOptions:(NSEnumerationOptions)0 usingBlock:block];
//%}
//%
//%- (void)enumerate##ACCESSOR_NAME##ValuesWithOptions:(NSEnumerationOptions)opts
-//% ACCESSOR_NAME$S usingBlock:(void (NS_NOESCAPE ^)(TYPE value, NSUInteger idx, BOOL *stop))block {
+//% ACCESSOR_NAME$S usingBlock:(void(NS_NOESCAPE ^)(TYPE value, NSUInteger idx, BOOL *stop))block {
//% // NSEnumerationConcurrent isn't currently supported (and Apple's docs say that is ok).
//% BOOL stop = NO;
//% if ((opts & NSEnumerationReverse) == 0) {
@@ -292,10 +295,8 @@
//% _values[idx2] = temp;
//%}
//%
-
//%PDDM-EXPAND ARRAY_INTERFACE_SIMPLE(Int32, int32_t, %d)
// This block of code is generated, do not edit it directly.
-// clang-format off
#pragma mark - Int32
@@ -406,12 +407,12 @@
return result;
}
-- (void)enumerateValuesWithBlock:(void (NS_NOESCAPE ^)(int32_t value, NSUInteger idx, BOOL *stop))block {
+- (void)enumerateValuesWithBlock:(void(NS_NOESCAPE ^)(int32_t value, NSUInteger idx, BOOL *stop))block {
[self enumerateValuesWithOptions:(NSEnumerationOptions)0 usingBlock:block];
}
- (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts
- usingBlock:(void (NS_NOESCAPE ^)(int32_t value, NSUInteger idx, BOOL *stop))block {
+ usingBlock:(void(NS_NOESCAPE ^)(int32_t value, NSUInteger idx, BOOL *stop))block {
// NSEnumerationConcurrent isn't currently supported (and Apple's docs say that is ok).
BOOL stop = NO;
if ((opts & NSEnumerationReverse) == 0) {
@@ -542,10 +543,8 @@
@end
-// clang-format on
//%PDDM-EXPAND ARRAY_INTERFACE_SIMPLE(UInt32, uint32_t, %u)
// This block of code is generated, do not edit it directly.
-// clang-format off
#pragma mark - UInt32
@@ -656,12 +655,12 @@
return result;
}
-- (void)enumerateValuesWithBlock:(void (NS_NOESCAPE ^)(uint32_t value, NSUInteger idx, BOOL *stop))block {
+- (void)enumerateValuesWithBlock:(void(NS_NOESCAPE ^)(uint32_t value, NSUInteger idx, BOOL *stop))block {
[self enumerateValuesWithOptions:(NSEnumerationOptions)0 usingBlock:block];
}
- (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts
- usingBlock:(void (NS_NOESCAPE ^)(uint32_t value, NSUInteger idx, BOOL *stop))block {
+ usingBlock:(void(NS_NOESCAPE ^)(uint32_t value, NSUInteger idx, BOOL *stop))block {
// NSEnumerationConcurrent isn't currently supported (and Apple's docs say that is ok).
BOOL stop = NO;
if ((opts & NSEnumerationReverse) == 0) {
@@ -792,10 +791,8 @@
@end
-// clang-format on
//%PDDM-EXPAND ARRAY_INTERFACE_SIMPLE(Int64, int64_t, %lld)
// This block of code is generated, do not edit it directly.
-// clang-format off
#pragma mark - Int64
@@ -906,12 +903,12 @@
return result;
}
-- (void)enumerateValuesWithBlock:(void (NS_NOESCAPE ^)(int64_t value, NSUInteger idx, BOOL *stop))block {
+- (void)enumerateValuesWithBlock:(void(NS_NOESCAPE ^)(int64_t value, NSUInteger idx, BOOL *stop))block {
[self enumerateValuesWithOptions:(NSEnumerationOptions)0 usingBlock:block];
}
- (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts
- usingBlock:(void (NS_NOESCAPE ^)(int64_t value, NSUInteger idx, BOOL *stop))block {
+ usingBlock:(void(NS_NOESCAPE ^)(int64_t value, NSUInteger idx, BOOL *stop))block {
// NSEnumerationConcurrent isn't currently supported (and Apple's docs say that is ok).
BOOL stop = NO;
if ((opts & NSEnumerationReverse) == 0) {
@@ -1042,10 +1039,8 @@
@end
-// clang-format on
//%PDDM-EXPAND ARRAY_INTERFACE_SIMPLE(UInt64, uint64_t, %llu)
// This block of code is generated, do not edit it directly.
-// clang-format off
#pragma mark - UInt64
@@ -1156,12 +1151,12 @@
return result;
}
-- (void)enumerateValuesWithBlock:(void (NS_NOESCAPE ^)(uint64_t value, NSUInteger idx, BOOL *stop))block {
+- (void)enumerateValuesWithBlock:(void(NS_NOESCAPE ^)(uint64_t value, NSUInteger idx, BOOL *stop))block {
[self enumerateValuesWithOptions:(NSEnumerationOptions)0 usingBlock:block];
}
- (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts
- usingBlock:(void (NS_NOESCAPE ^)(uint64_t value, NSUInteger idx, BOOL *stop))block {
+ usingBlock:(void(NS_NOESCAPE ^)(uint64_t value, NSUInteger idx, BOOL *stop))block {
// NSEnumerationConcurrent isn't currently supported (and Apple's docs say that is ok).
BOOL stop = NO;
if ((opts & NSEnumerationReverse) == 0) {
@@ -1292,10 +1287,8 @@
@end
-// clang-format on
//%PDDM-EXPAND ARRAY_INTERFACE_SIMPLE(Float, float, %f)
// This block of code is generated, do not edit it directly.
-// clang-format off
#pragma mark - Float
@@ -1406,12 +1399,12 @@
return result;
}
-- (void)enumerateValuesWithBlock:(void (NS_NOESCAPE ^)(float value, NSUInteger idx, BOOL *stop))block {
+- (void)enumerateValuesWithBlock:(void(NS_NOESCAPE ^)(float value, NSUInteger idx, BOOL *stop))block {
[self enumerateValuesWithOptions:(NSEnumerationOptions)0 usingBlock:block];
}
- (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts
- usingBlock:(void (NS_NOESCAPE ^)(float value, NSUInteger idx, BOOL *stop))block {
+ usingBlock:(void(NS_NOESCAPE ^)(float value, NSUInteger idx, BOOL *stop))block {
// NSEnumerationConcurrent isn't currently supported (and Apple's docs say that is ok).
BOOL stop = NO;
if ((opts & NSEnumerationReverse) == 0) {
@@ -1542,10 +1535,8 @@
@end
-// clang-format on
//%PDDM-EXPAND ARRAY_INTERFACE_SIMPLE(Double, double, %lf)
// This block of code is generated, do not edit it directly.
-// clang-format off
#pragma mark - Double
@@ -1656,12 +1647,12 @@
return result;
}
-- (void)enumerateValuesWithBlock:(void (NS_NOESCAPE ^)(double value, NSUInteger idx, BOOL *stop))block {
+- (void)enumerateValuesWithBlock:(void(NS_NOESCAPE ^)(double value, NSUInteger idx, BOOL *stop))block {
[self enumerateValuesWithOptions:(NSEnumerationOptions)0 usingBlock:block];
}
- (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts
- usingBlock:(void (NS_NOESCAPE ^)(double value, NSUInteger idx, BOOL *stop))block {
+ usingBlock:(void(NS_NOESCAPE ^)(double value, NSUInteger idx, BOOL *stop))block {
// NSEnumerationConcurrent isn't currently supported (and Apple's docs say that is ok).
BOOL stop = NO;
if ((opts & NSEnumerationReverse) == 0) {
@@ -1792,10 +1783,8 @@
@end
-// clang-format on
//%PDDM-EXPAND ARRAY_INTERFACE_SIMPLE(Bool, BOOL, %d)
// This block of code is generated, do not edit it directly.
-// clang-format off
#pragma mark - Bool
@@ -1906,12 +1895,12 @@
return result;
}
-- (void)enumerateValuesWithBlock:(void (NS_NOESCAPE ^)(BOOL value, NSUInteger idx, BOOL *stop))block {
+- (void)enumerateValuesWithBlock:(void(NS_NOESCAPE ^)(BOOL value, NSUInteger idx, BOOL *stop))block {
[self enumerateValuesWithOptions:(NSEnumerationOptions)0 usingBlock:block];
}
- (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts
- usingBlock:(void (NS_NOESCAPE ^)(BOOL value, NSUInteger idx, BOOL *stop))block {
+ usingBlock:(void(NS_NOESCAPE ^)(BOOL value, NSUInteger idx, BOOL *stop))block {
// NSEnumerationConcurrent isn't currently supported (and Apple's docs say that is ok).
BOOL stop = NO;
if ((opts & NSEnumerationReverse) == 0) {
@@ -2042,9 +2031,10 @@
@end
-// clang-format on
//%PDDM-EXPAND-END (7 expansions)
+// clang-format on
+
#pragma mark - Enum
@implementation GPBEnumArray {
@@ -2066,19 +2056,15 @@
return [[[self alloc] initWithValidationFunction:func] autorelease];
}
-+ (instancetype)arrayWithValidationFunction:(GPBEnumValidationFunc)func
- rawValue:(int32_t)value {
- return [[[self alloc] initWithValidationFunction:func
- rawValues:&value
- count:1] autorelease];
++ (instancetype)arrayWithValidationFunction:(GPBEnumValidationFunc)func rawValue:(int32_t)value {
+ return [[[self alloc] initWithValidationFunction:func rawValues:&value count:1] autorelease];
}
+ (instancetype)arrayWithValueArray:(GPBEnumArray *)array {
- return [[(GPBEnumArray*)[self alloc] initWithValueArray:array] autorelease];
+ return [[(GPBEnumArray *)[self alloc] initWithValueArray:array] autorelease];
}
-+ (instancetype)arrayWithValidationFunction:(GPBEnumValidationFunc)func
- capacity:(NSUInteger)count {
++ (instancetype)arrayWithValidationFunction:(GPBEnumValidationFunc)func capacity:(NSUInteger)count {
return [[[self alloc] initWithValidationFunction:func capacity:count] autorelease];
}
@@ -2101,7 +2087,7 @@
}
- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
- rawValues:(const int32_t [])values
+ rawValues:(const int32_t[])values
count:(NSUInteger)count {
self = [self initWithValidationFunction:func];
if (self) {
@@ -2113,17 +2099,16 @@
_count = count;
} else {
[self release];
- [NSException raise:NSMallocException
- format:@"Failed to allocate %lu bytes",
- (unsigned long)(count * sizeof(int32_t))];
+ [NSException
+ raise:NSMallocException
+ format:@"Failed to allocate %lu bytes", (unsigned long)(count * sizeof(int32_t))];
}
}
}
return self;
}
-- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
- capacity:(NSUInteger)count {
+- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func capacity:(NSUInteger)count {
self = [self initWithValidationFunction:func];
if (self && count) {
[self internalResizeToCapacity:count];
@@ -2132,15 +2117,16 @@
}
- (instancetype)copyWithZone:(NSZone *)zone {
- return [[GPBEnumArray allocWithZone:zone]
- initWithValidationFunction:_validationFunc
- rawValues:_values
- count:_count];
+ return [[GPBEnumArray allocWithZone:zone] initWithValidationFunction:_validationFunc
+ rawValues:_values
+ count:_count];
}
+// Disable clang-format for the macros.
+// clang-format off
+
//%PDDM-EXPAND ARRAY_IMMUTABLE_CORE(Enum, int32_t, Raw, %d)
// This block of code is generated, do not edit it directly.
-// clang-format off
- (void)dealloc {
NSAssert(!_autocreator,
@@ -2180,12 +2166,12 @@
return result;
}
-- (void)enumerateRawValuesWithBlock:(void (NS_NOESCAPE ^)(int32_t value, NSUInteger idx, BOOL *stop))block {
+- (void)enumerateRawValuesWithBlock:(void(NS_NOESCAPE ^)(int32_t value, NSUInteger idx, BOOL *stop))block {
[self enumerateRawValuesWithOptions:(NSEnumerationOptions)0 usingBlock:block];
}
- (void)enumerateRawValuesWithOptions:(NSEnumerationOptions)opts
- usingBlock:(void (NS_NOESCAPE ^)(int32_t value, NSUInteger idx, BOOL *stop))block {
+ usingBlock:(void(NS_NOESCAPE ^)(int32_t value, NSUInteger idx, BOOL *stop))block {
// NSEnumerationConcurrent isn't currently supported (and Apple's docs say that is ok).
BOOL stop = NO;
if ((opts & NSEnumerationReverse) == 0) {
@@ -2200,21 +2186,22 @@
}
}
}
-// clang-format on
//%PDDM-EXPAND-END ARRAY_IMMUTABLE_CORE(Enum, int32_t, Raw, %d)
+// clang-format on
+
- (int32_t)valueAtIndex:(NSUInteger)index {
+ // clang-format off
//%PDDM-EXPAND VALIDATE_RANGE(index, _count)
// This block of code is generated, do not edit it directly.
-// clang-format off
if (index >= _count) {
[NSException raise:NSRangeException
format:@"Index (%lu) beyond bounds (%lu)",
(unsigned long)index, (unsigned long)_count];
}
-// clang-format on
//%PDDM-EXPAND-END VALIDATE_RANGE(index, _count)
+ // clang-format on
int32_t result = _values[index];
if (!_validationFunc(result)) {
result = kGPBUnrecognizedEnumeratorValue;
@@ -2223,26 +2210,28 @@
}
- (int32_t)rawValueAtIndex:(NSUInteger)index {
+ // clang-format off
//%PDDM-EXPAND VALIDATE_RANGE(index, _count)
// This block of code is generated, do not edit it directly.
-// clang-format off
if (index >= _count) {
[NSException raise:NSRangeException
format:@"Index (%lu) beyond bounds (%lu)",
(unsigned long)index, (unsigned long)_count];
}
-// clang-format on
//%PDDM-EXPAND-END VALIDATE_RANGE(index, _count)
+ // clang-format on
return _values[index];
}
-- (void)enumerateValuesWithBlock:(void (NS_NOESCAPE ^)(int32_t value, NSUInteger idx, BOOL *stop))block {
+- (void)enumerateValuesWithBlock:(void(NS_NOESCAPE ^)(int32_t value, NSUInteger idx, BOOL *stop))
+ block {
[self enumerateValuesWithOptions:(NSEnumerationOptions)0 usingBlock:block];
}
- (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts
- usingBlock:(void (NS_NOESCAPE ^)(int32_t value, NSUInteger idx, BOOL *stop))block {
+ usingBlock:(void(NS_NOESCAPE ^)(int32_t value, NSUInteger idx, BOOL *stop))
+ block {
// NSEnumerationConcurrent isn't currently supported (and Apple's docs say that is ok).
BOOL stop = NO;
GPBEnumValidationFunc func = _validationFunc;
@@ -2271,9 +2260,10 @@
}
}
+// clang-format off
+
//%PDDM-EXPAND ARRAY_MUTABLE_CORE(Enum, int32_t, Raw, %d)
// This block of code is generated, do not edit it directly.
-// clang-format off
- (void)internalResizeToCapacity:(NSUInteger)newCapacity {
_values = reallocf(_values, newCapacity * sizeof(int32_t));
@@ -2379,10 +2369,8 @@
_values[idx2] = temp;
}
-// clang-format on
//%PDDM-EXPAND MUTATION_METHODS(Enum, int32_t, , EnumValidationList, EnumValidationOne)
// This block of code is generated, do not edit it directly.
-// clang-format off
- (void)addValue:(int32_t)value {
[self addValues:&value count:1];
@@ -2449,7 +2437,6 @@
}
_values[index] = value;
}
-// clang-format on
//%PDDM-EXPAND-END (2 expansions)
//%PDDM-DEFINE MUTATION_HOOK_EnumValidationList()
@@ -2470,6 +2457,8 @@
//% }
//%
+// clang-format on
+
@end
#pragma mark - NSArray Subclass
@@ -2479,8 +2468,7 @@
}
- (void)dealloc {
- NSAssert(!_autocreator,
- @"%@: Autocreator must be cleared before release, autocreator: %@",
+ NSAssert(!_autocreator, @"%@: Autocreator must be cleared before release, autocreator: %@",
[self class], _autocreator);
[_array release];
[super dealloc];
@@ -2556,17 +2544,17 @@
}
- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state
- objects:(id __unsafe_unretained [])buffer
+ objects:(id __unsafe_unretained[])buffer
count:(NSUInteger)len {
return [_array countByEnumeratingWithState:state objects:buffer count:len];
}
-- (void)enumerateObjectsUsingBlock:(void (NS_NOESCAPE ^)(id obj, NSUInteger idx, BOOL *stop))block {
+- (void)enumerateObjectsUsingBlock:(void(NS_NOESCAPE ^)(id obj, NSUInteger idx, BOOL *stop))block {
[_array enumerateObjectsUsingBlock:block];
}
- (void)enumerateObjectsWithOptions:(NSEnumerationOptions)opts
- usingBlock:(void (NS_NOESCAPE ^)(id obj, NSUInteger idx, BOOL *stop))block {
+ usingBlock:(void(NS_NOESCAPE ^)(id obj, NSUInteger idx, BOOL *stop))block {
[_array enumerateObjectsWithOptions:opts usingBlock:block];
}
diff --git a/objectivec/GPBArray_PackagePrivate.h b/objectivec/GPBArray_PackagePrivate.h
index 07eab89..35a4538 100644
--- a/objectivec/GPBArray_PackagePrivate.h
+++ b/objectivec/GPBArray_PackagePrivate.h
@@ -54,7 +54,6 @@
//%PDDM-EXPAND DECLARE_ARRAY_EXTRAS()
// This block of code is generated, do not edit it directly.
-// clang-format off
#pragma mark - Int32
@@ -120,7 +119,6 @@
}
@end
-// clang-format on
//%PDDM-EXPAND-END DECLARE_ARRAY_EXTRAS()
#pragma mark - NSArray Subclass
diff --git a/objectivec/GPBBootstrap.h b/objectivec/GPBBootstrap.h
index ea5986b..4fbcbab 100644
--- a/objectivec/GPBBootstrap.h
+++ b/objectivec/GPBBootstrap.h
@@ -42,7 +42,7 @@
// Used in the generated code to give sizes to enums. int32_t was chosen based
// on the fact that Protocol Buffers enums are limited to this range.
#if !__has_feature(objc_fixed_enum)
- #error All supported Xcode versions should support objc_fixed_enum.
+#error All supported Xcode versions should support objc_fixed_enum.
#endif
// If the headers are imported into Objective-C++, we can run into an issue
@@ -52,9 +52,11 @@
// providing a local definition. The default case has to use NS_ENUM for the
// magic that is Swift bridging of enums.
#if (defined(__cplusplus) && __cplusplus && __cplusplus < 201103L)
- #define GPB_ENUM(X) enum X : int32_t X; enum X : int32_t
+#define GPB_ENUM(X) \
+ enum X : int32_t X; \
+ enum X : int32_t
#else
- #define GPB_ENUM(X) NS_ENUM(int32_t, X)
+#define GPB_ENUM(X) NS_ENUM(int32_t, X)
#endif
/**
@@ -138,7 +140,6 @@
// - Gets changed when support for the older generated code is dropped.
#define GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION 30001
-
// This is a legacy constant now frozen in time for old generated code. If
// GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION ever gets moved above 30001 then
// this should also change to break code compiled with an old runtime that
diff --git a/objectivec/GPBCodedInputStream.h b/objectivec/GPBCodedInputStream.h
index fbe5009..cbfaaf1 100644
--- a/objectivec/GPBCodedInputStream.h
+++ b/objectivec/GPBCodedInputStream.h
@@ -30,8 +30,9 @@
#import <Foundation/Foundation.h>
+#import "GPBExtensionRegistry.h"
+
@class GPBMessage;
-@class GPBExtensionRegistry;
NS_ASSUME_NONNULL_BEGIN
@@ -184,7 +185,7 @@
* extensions for message.
**/
- (void)readMessage:(GPBMessage *)message
- extensionRegistry:(nullable GPBExtensionRegistry *)extensionRegistry;
+ extensionRegistry:(nullable id<GPBExtensionRegistry>)extensionRegistry;
/**
* Reads and discards a single field, given its tag value.
@@ -220,7 +221,7 @@
/**
* Moves the limit to the given byte offset starting at the current location.
*
- * @exception GPBCodedInputStreamException If the requested bytes exceeed the
+ * @exception GPBCodedInputStreamException If the requested bytes exceed the
* current limit.
*
* @param byteLimit The number of bytes to move the limit, offset to the current
diff --git a/objectivec/GPBCodedInputStream.m b/objectivec/GPBCodedInputStream.m
index c459391..ad5c75e 100644
--- a/objectivec/GPBCodedInputStream.m
+++ b/objectivec/GPBCodedInputStream.m
@@ -36,8 +36,7 @@
#import "GPBUtilities_PackagePrivate.h"
#import "GPBWireFormat.h"
-NSString *const GPBCodedInputStreamException =
- GPBNSStringifySymbol(GPBCodedInputStreamException);
+NSString *const GPBCodedInputStreamException = GPBNSStringifySymbol(GPBCodedInputStreamException);
NSString *const GPBCodedInputStreamUnderlyingErrorKey =
GPBNSStringifySymbol(GPBCodedInputStreamUnderlyingErrorKey);
@@ -55,16 +54,14 @@
static void RaiseException(NSInteger code, NSString *reason) {
NSDictionary *errorInfo = nil;
if ([reason length]) {
- errorInfo = @{ GPBErrorReasonKey: reason };
+ errorInfo = @{GPBErrorReasonKey : reason};
}
NSError *error = [NSError errorWithDomain:GPBCodedInputStreamErrorDomain
code:code
userInfo:errorInfo];
- NSDictionary *exceptionInfo =
- @{ GPBCodedInputStreamUnderlyingErrorKey: error };
- [[NSException exceptionWithName:GPBCodedInputStreamException
- reason:reason
+ NSDictionary *exceptionInfo = @{GPBCodedInputStreamUnderlyingErrorKey : error};
+ [[NSException exceptionWithName:GPBCodedInputStreamException reason:reason
userInfo:exceptionInfo] raise];
}
@@ -105,7 +102,7 @@
static int64_t ReadRawLittleEndian64(GPBCodedInputStreamState *state) {
CheckSize(state, sizeof(int64_t));
// Not using OSReadLittleInt64 because it has undocumented dependency
- // on reads being aligned.
+ // on reads being aligned.
int64_t value;
memcpy(&value, state->bytes + state->bufferPos, sizeof(int64_t));
value = OSSwapLittleToHostInt64(value);
@@ -215,8 +212,7 @@
state->lastTag = ReadRawVarint32(state);
// Tags have to include a valid wireformat.
if (!GPBWireFormatIsValidTag(state->lastTag)) {
- RaiseException(GPBCodedInputStreamErrorInvalidTag,
- @"Invalid wireformat in tag.");
+ RaiseException(GPBCodedInputStreamErrorInvalidTag, @"Invalid wireformat in tag.");
}
// Zero is not a valid field number.
if (GPBWireFormatGetTagFieldNumber(state->lastTag) == 0) {
@@ -226,8 +222,7 @@
return state->lastTag;
}
-NSString *GPBCodedInputStreamReadRetainedString(
- GPBCodedInputStreamState *state) {
+NSString *GPBCodedInputStreamReadRetainedString(GPBCodedInputStreamState *state) {
int32_t size = ReadRawVarint32(state);
NSString *result;
if (size == 0) {
@@ -254,28 +249,24 @@
int32_t size = ReadRawVarint32(state);
if (size < 0) return nil;
CheckSize(state, size);
- NSData *result = [[NSData alloc] initWithBytes:state->bytes + state->bufferPos
- length:size];
+ NSData *result = [[NSData alloc] initWithBytes:state->bytes + state->bufferPos length:size];
state->bufferPos += size;
return result;
}
-NSData *GPBCodedInputStreamReadRetainedBytesNoCopy(
- GPBCodedInputStreamState *state) {
+NSData *GPBCodedInputStreamReadRetainedBytesNoCopy(GPBCodedInputStreamState *state) {
int32_t size = ReadRawVarint32(state);
if (size < 0) return nil;
CheckSize(state, size);
// Cast is safe because freeWhenDone is NO.
- NSData *result = [[NSData alloc]
- initWithBytesNoCopy:(void *)(state->bytes + state->bufferPos)
- length:size
- freeWhenDone:NO];
+ NSData *result = [[NSData alloc] initWithBytesNoCopy:(void *)(state->bytes + state->bufferPos)
+ length:size
+ freeWhenDone:NO];
state->bufferPos += size;
return result;
}
-size_t GPBCodedInputStreamPushLimit(GPBCodedInputStreamState *state,
- size_t byteLimit) {
+size_t GPBCodedInputStreamPushLimit(GPBCodedInputStreamState *state, size_t byteLimit) {
byteLimit += state->bufferPos;
size_t oldLimit = state->currentLimit;
if (byteLimit > oldLimit) {
@@ -285,8 +276,7 @@
return oldLimit;
}
-void GPBCodedInputStreamPopLimit(GPBCodedInputStreamState *state,
- size_t oldLimit) {
+void GPBCodedInputStreamPopLimit(GPBCodedInputStreamState *state, size_t oldLimit) {
state->currentLimit = oldLimit;
}
@@ -295,12 +285,10 @@
}
BOOL GPBCodedInputStreamIsAtEnd(GPBCodedInputStreamState *state) {
- return (state->bufferPos == state->bufferSize) ||
- (state->bufferPos == state->currentLimit);
+ return (state->bufferPos == state->bufferSize) || (state->bufferPos == state->currentLimit);
}
-void GPBCodedInputStreamCheckLastTagWas(GPBCodedInputStreamState *state,
- int32_t value) {
+void GPBCodedInputStreamCheckLastTagWas(GPBCodedInputStreamState *state, int32_t value) {
if (state->lastTag != value) {
RaiseException(GPBCodedInputStreamErrorInvalidTag, @"Unexpected tag read");
}
@@ -360,8 +348,8 @@
case GPBWireFormatStartGroup:
[self skipMessage];
GPBCodedInputStreamCheckLastTagWas(
- &state_, GPBWireFormatMakeTag(GPBWireFormatGetTagFieldNumber(tag),
- GPBWireFormatEndGroup));
+ &state_,
+ GPBWireFormatMakeTag(GPBWireFormatGetTagFieldNumber(tag), GPBWireFormatEndGroup));
return YES;
case GPBWireFormatEndGroup:
return NO;
@@ -434,27 +422,26 @@
- (void)readGroup:(int32_t)fieldNumber
message:(GPBMessage *)message
- extensionRegistry:(GPBExtensionRegistry *)extensionRegistry {
+ extensionRegistry:(id<GPBExtensionRegistry>)extensionRegistry {
CheckRecursionLimit(&state_);
++state_.recursionDepth;
[message mergeFromCodedInputStream:self extensionRegistry:extensionRegistry];
- GPBCodedInputStreamCheckLastTagWas(
- &state_, GPBWireFormatMakeTag(fieldNumber, GPBWireFormatEndGroup));
+ GPBCodedInputStreamCheckLastTagWas(&state_,
+ GPBWireFormatMakeTag(fieldNumber, GPBWireFormatEndGroup));
--state_.recursionDepth;
}
-- (void)readUnknownGroup:(int32_t)fieldNumber
- message:(GPBUnknownFieldSet *)message {
+- (void)readUnknownGroup:(int32_t)fieldNumber message:(GPBUnknownFieldSet *)message {
CheckRecursionLimit(&state_);
++state_.recursionDepth;
[message mergeFromCodedInputStream:self];
- GPBCodedInputStreamCheckLastTagWas(
- &state_, GPBWireFormatMakeTag(fieldNumber, GPBWireFormatEndGroup));
+ GPBCodedInputStreamCheckLastTagWas(&state_,
+ GPBWireFormatMakeTag(fieldNumber, GPBWireFormatEndGroup));
--state_.recursionDepth;
}
- (void)readMessage:(GPBMessage *)message
- extensionRegistry:(GPBExtensionRegistry *)extensionRegistry {
+ extensionRegistry:(id<GPBExtensionRegistry>)extensionRegistry {
CheckRecursionLimit(&state_);
int32_t length = ReadRawVarint32(&state_);
size_t oldLimit = GPBCodedInputStreamPushLimit(&state_, length);
@@ -466,15 +453,14 @@
}
- (void)readMapEntry:(id)mapDictionary
- extensionRegistry:(GPBExtensionRegistry *)extensionRegistry
+ extensionRegistry:(id<GPBExtensionRegistry>)extensionRegistry
field:(GPBFieldDescriptor *)field
parentMessage:(GPBMessage *)parentMessage {
CheckRecursionLimit(&state_);
int32_t length = ReadRawVarint32(&state_);
size_t oldLimit = GPBCodedInputStreamPushLimit(&state_, length);
++state_.recursionDepth;
- GPBDictionaryReadEntry(mapDictionary, self, extensionRegistry, field,
- parentMessage);
+ GPBDictionaryReadEntry(mapDictionary, self, extensionRegistry, field, parentMessage);
GPBCodedInputStreamCheckLastTagWas(&state_, 0);
--state_.recursionDepth;
GPBCodedInputStreamPopLimit(&state_, oldLimit);
diff --git a/objectivec/GPBCodedInputStream_PackagePrivate.h b/objectivec/GPBCodedInputStream_PackagePrivate.h
index 43ec6e7..2dfc902 100644
--- a/objectivec/GPBCodedInputStream_PackagePrivate.h
+++ b/objectivec/GPBCodedInputStream_PackagePrivate.h
@@ -61,16 +61,15 @@
// support for older data.
- (void)readGroup:(int32_t)fieldNumber
message:(GPBMessage *)message
- extensionRegistry:(GPBExtensionRegistry *)extensionRegistry;
+ extensionRegistry:(id<GPBExtensionRegistry>)extensionRegistry;
// Reads a group field value from the stream and merges it into the given
// UnknownFieldSet.
-- (void)readUnknownGroup:(int32_t)fieldNumber
- message:(GPBUnknownFieldSet *)message;
+- (void)readUnknownGroup:(int32_t)fieldNumber message:(GPBUnknownFieldSet *)message;
// Reads a map entry.
- (void)readMapEntry:(id)mapDictionary
- extensionRegistry:(GPBExtensionRegistry *)extensionRegistry
+ extensionRegistry:(id<GPBExtensionRegistry>)extensionRegistry
field:(GPBFieldDescriptor *)field
parentMessage:(GPBMessage *)parentMessage;
@end
@@ -97,16 +96,13 @@
__attribute((ns_returns_retained));
NSData *GPBCodedInputStreamReadRetainedBytes(GPBCodedInputStreamState *state)
__attribute((ns_returns_retained));
-NSData *GPBCodedInputStreamReadRetainedBytesNoCopy(
- GPBCodedInputStreamState *state) __attribute((ns_returns_retained));
+NSData *GPBCodedInputStreamReadRetainedBytesNoCopy(GPBCodedInputStreamState *state)
+ __attribute((ns_returns_retained));
-size_t GPBCodedInputStreamPushLimit(GPBCodedInputStreamState *state,
- size_t byteLimit);
-void GPBCodedInputStreamPopLimit(GPBCodedInputStreamState *state,
- size_t oldLimit);
+size_t GPBCodedInputStreamPushLimit(GPBCodedInputStreamState *state, size_t byteLimit);
+void GPBCodedInputStreamPopLimit(GPBCodedInputStreamState *state, size_t oldLimit);
size_t GPBCodedInputStreamBytesUntilLimit(GPBCodedInputStreamState *state);
BOOL GPBCodedInputStreamIsAtEnd(GPBCodedInputStreamState *state);
-void GPBCodedInputStreamCheckLastTagWas(GPBCodedInputStreamState *state,
- int32_t value);
+void GPBCodedInputStreamCheckLastTagWas(GPBCodedInputStreamState *state, int32_t value);
CF_EXTERN_C_END
diff --git a/objectivec/GPBCodedOutputStream.h b/objectivec/GPBCodedOutputStream.h
index 5dde974..304a24e 100644
--- a/objectivec/GPBCodedOutputStream.h
+++ b/objectivec/GPBCodedOutputStream.h
@@ -171,13 +171,13 @@
* @param offset The offset into the blob to start writing out.
* @param length The number of bytes from the blob to write out.
**/
-- (void)writeRawPtr:(const void *)data
- offset:(size_t)offset
- length:(size_t)length;
+- (void)writeRawPtr:(const void *)data offset:(size_t)offset length:(size_t)length;
+
+// Disable clang-format for the macros.
+// clang-format off
//%PDDM-EXPAND _WRITE_DECLS()
// This block of code is generated, do not edit it directly.
-// clang-format off
/**
* Write a double for the given field number.
@@ -631,9 +631,10 @@
- (void)writeUnknownGroupNoTag:(int32_t)fieldNumber
value:(GPBUnknownFieldSet *)value;
-// clang-format on
//%PDDM-EXPAND-END _WRITE_DECLS()
+// clang-format on
+
/**
Write a MessageSet extension field to the stream. For historical reasons,
the wire format differs from normal fields.
@@ -656,6 +657,9 @@
NS_ASSUME_NONNULL_END
+// Disable clang-format for the macros.
+// clang-format off
+
// Write methods for types that can be in packed arrays.
//%PDDM-DEFINE _WRITE_PACKABLE_DECLS(NAME, ARRAY_TYPE, TYPE)
//%/**
@@ -755,3 +759,5 @@
//%_WRITE_UNPACKABLE_DECLS(Bytes, NSData)
//%_WRITE_GROUP_DECLS(Group, GPBMessage)
//%_WRITE_GROUP_DECLS(UnknownGroup, GPBUnknownFieldSet)
+
+// clang-format on
diff --git a/objectivec/GPBCodedOutputStream.m b/objectivec/GPBCodedOutputStream.m
index 4e2a514..c21e7d2 100644
--- a/objectivec/GPBCodedOutputStream.m
+++ b/objectivec/GPBCodedOutputStream.m
@@ -67,8 +67,7 @@
[NSException raise:GPBCodedOutputStreamException_OutOfSpace format:@""];
}
if (state->position != 0) {
- NSInteger written =
- [state->output write:state->bytes maxLength:state->position];
+ NSInteger written = [state->output write:state->bytes maxLength:state->position];
if (written != (NSInteger)state->position) {
[NSException raise:GPBCodedOutputStreamException_WriteFailed format:@""];
}
@@ -118,27 +117,24 @@
}
}
-static void GPBWriteUInt32(GPBOutputBufferState *state, int32_t fieldNumber,
- uint32_t value) {
+static void GPBWriteUInt32(GPBOutputBufferState *state, int32_t fieldNumber, uint32_t value) {
GPBWriteTagWithFormat(state, fieldNumber, GPBWireFormatVarint);
GPBWriteRawVarint32(state, value);
}
-static void GPBWriteTagWithFormat(GPBOutputBufferState *state,
- uint32_t fieldNumber, GPBWireFormat format) {
+static void GPBWriteTagWithFormat(GPBOutputBufferState *state, uint32_t fieldNumber,
+ GPBWireFormat format) {
GPBWriteRawVarint32(state, GPBWireFormatMakeTag(fieldNumber, format));
}
-static void GPBWriteRawLittleEndian32(GPBOutputBufferState *state,
- int32_t value) {
+static void GPBWriteRawLittleEndian32(GPBOutputBufferState *state, int32_t value) {
GPBWriteRawByte(state, (value)&0xFF);
GPBWriteRawByte(state, (value >> 8) & 0xFF);
GPBWriteRawByte(state, (value >> 16) & 0xFF);
GPBWriteRawByte(state, (value >> 24) & 0xFF);
}
-static void GPBWriteRawLittleEndian64(GPBOutputBufferState *state,
- int64_t value) {
+static void GPBWriteRawLittleEndian64(GPBOutputBufferState *state, int64_t value) {
GPBWriteRawByte(state, (int32_t)(value)&0xFF);
GPBWriteRawByte(state, (int32_t)(value >> 8) & 0xFF);
GPBWriteRawByte(state, (int32_t)(value >> 16) & 0xFF);
@@ -170,8 +166,7 @@
// This initializer isn't exposed, but it is the designated initializer.
// Setting OutputStream and NSData is to control the buffering behavior/size
// of the work, but that is more obvious via the bufferSize: version.
-- (instancetype)initWithOutputStream:(NSOutputStream *)output
- data:(NSMutableData *)data {
+- (instancetype)initWithOutputStream:(NSOutputStream *)output data:(NSMutableData *)data {
if ((self = [super init])) {
buffer_ = [data retain];
state_.bytes = [data mutableBytes];
@@ -184,8 +179,7 @@
+ (instancetype)streamWithOutputStream:(NSOutputStream *)output {
NSMutableData *data = [NSMutableData dataWithLength:PAGE_SIZE];
- return [[[self alloc] initWithOutputStream:output
- data:data] autorelease];
+ return [[[self alloc] initWithOutputStream:output data:data] autorelease];
}
+ (instancetype)streamWithData:(NSMutableData *)data {
@@ -277,8 +271,7 @@
return;
}
- const char *quickString =
- CFStringGetCStringPtr((CFStringRef)value, kCFStringEncodingUTF8);
+ const char *quickString = CFStringGetCStringPtr((CFStringRef)value, kCFStringEncodingUTF8);
// Fast path: Most strings are short, if the buffer already has space,
// add to it directly.
@@ -300,9 +293,8 @@
remainingRange:NULL];
}
if (result) {
- NSAssert2((usedBufferLength == length),
- @"Our UTF8 calc was wrong? %tu vs %zd", usedBufferLength,
- length);
+ NSAssert2((usedBufferLength == length), @"Our UTF8 calc was wrong? %tu vs %zd",
+ usedBufferLength, length);
state_.position += usedBufferLength;
return;
}
@@ -311,9 +303,8 @@
} else {
// Slow path: just get it as data and write it out.
NSData *utf8Data = [value dataUsingEncoding:NSUTF8StringEncoding];
- NSAssert2(([utf8Data length] == length),
- @"Strings UTF8 length was wrong? %tu vs %zd", [utf8Data length],
- length);
+ NSAssert2(([utf8Data length] == length), @"Strings UTF8 length was wrong? %tu vs %zd",
+ [utf8Data length], length);
[self writeRawData:utf8Data];
}
}
@@ -333,14 +324,12 @@
[self writeGroupNoTag:fieldNumber value:value];
}
-- (void)writeUnknownGroupNoTag:(int32_t)fieldNumber
- value:(const GPBUnknownFieldSet *)value {
+- (void)writeUnknownGroupNoTag:(int32_t)fieldNumber value:(const GPBUnknownFieldSet *)value {
[value writeToCodedOutputStream:self];
GPBWriteTagWithFormat(&state_, fieldNumber, GPBWireFormatEndGroup);
}
-- (void)writeUnknownGroup:(int32_t)fieldNumber
- value:(GPBUnknownFieldSet *)value {
+- (void)writeUnknownGroup:(int32_t)fieldNumber value:(GPBUnknownFieldSet *)value {
GPBWriteTagWithFormat(&state_, fieldNumber, GPBWireFormatStartGroup);
[self writeUnknownGroupNoTag:fieldNumber value:value];
}
@@ -418,6 +407,8 @@
GPBWriteRawVarint64(&state_, GPBEncodeZigZag64(value));
}
+// clang-format off
+
//%PDDM-DEFINE WRITE_PACKABLE_DEFNS(NAME, ARRAY_TYPE, TYPE, ACCESSOR_NAME)
//%- (void)write##NAME##Array:(int32_t)fieldNumber
//% NAME$S values:(GPB##ARRAY_TYPE##Array *)values
@@ -425,19 +416,16 @@
//% if (tag != 0) {
//% if (values.count == 0) return;
//% __block size_t dataSize = 0;
-//% [values enumerate##ACCESSOR_NAME##ValuesWithBlock:^(TYPE value, NSUInteger idx, BOOL *stop) {
-//%#pragma unused(idx, stop)
+//% [values enumerate##ACCESSOR_NAME##ValuesWithBlock:^(TYPE value, __unused NSUInteger idx,__unused BOOL *stop) {
//% dataSize += GPBCompute##NAME##SizeNoTag(value);
//% }];
//% GPBWriteRawVarint32(&state_, tag);
//% GPBWriteRawVarint32(&state_, (int32_t)dataSize);
-//% [values enumerate##ACCESSOR_NAME##ValuesWithBlock:^(TYPE value, NSUInteger idx, BOOL *stop) {
-//%#pragma unused(idx, stop)
+//% [values enumerate##ACCESSOR_NAME##ValuesWithBlock:^(TYPE value, __unused NSUInteger idx, __unused BOOL *stop) {
//% [self write##NAME##NoTag:value];
//% }];
//% } else {
-//% [values enumerate##ACCESSOR_NAME##ValuesWithBlock:^(TYPE value, NSUInteger idx, BOOL *stop) {
-//%#pragma unused(idx, stop)
+//% [values enumerate##ACCESSOR_NAME##ValuesWithBlock:^(TYPE value, __unused NSUInteger idx, __unused BOOL *stop) {
//% [self write##NAME:fieldNumber value:value];
//% }];
//% }
@@ -452,7 +440,6 @@
//%
//%PDDM-EXPAND WRITE_PACKABLE_DEFNS(Double, Double, double, )
// This block of code is generated, do not edit it directly.
-// clang-format off
- (void)writeDoubleArray:(int32_t)fieldNumber
values:(GPBDoubleArray *)values
@@ -460,28 +447,23 @@
if (tag != 0) {
if (values.count == 0) return;
__block size_t dataSize = 0;
- [values enumerateValuesWithBlock:^(double value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ [values enumerateValuesWithBlock:^(double value, __unused NSUInteger idx,__unused BOOL *stop) {
dataSize += GPBComputeDoubleSizeNoTag(value);
}];
GPBWriteRawVarint32(&state_, tag);
GPBWriteRawVarint32(&state_, (int32_t)dataSize);
- [values enumerateValuesWithBlock:^(double value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ [values enumerateValuesWithBlock:^(double value, __unused NSUInteger idx, __unused BOOL *stop) {
[self writeDoubleNoTag:value];
}];
} else {
- [values enumerateValuesWithBlock:^(double value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ [values enumerateValuesWithBlock:^(double value, __unused NSUInteger idx, __unused BOOL *stop) {
[self writeDouble:fieldNumber value:value];
}];
}
}
-// clang-format on
//%PDDM-EXPAND WRITE_PACKABLE_DEFNS(Float, Float, float, )
// This block of code is generated, do not edit it directly.
-// clang-format off
- (void)writeFloatArray:(int32_t)fieldNumber
values:(GPBFloatArray *)values
@@ -489,28 +471,23 @@
if (tag != 0) {
if (values.count == 0) return;
__block size_t dataSize = 0;
- [values enumerateValuesWithBlock:^(float value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ [values enumerateValuesWithBlock:^(float value, __unused NSUInteger idx,__unused BOOL *stop) {
dataSize += GPBComputeFloatSizeNoTag(value);
}];
GPBWriteRawVarint32(&state_, tag);
GPBWriteRawVarint32(&state_, (int32_t)dataSize);
- [values enumerateValuesWithBlock:^(float value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ [values enumerateValuesWithBlock:^(float value, __unused NSUInteger idx, __unused BOOL *stop) {
[self writeFloatNoTag:value];
}];
} else {
- [values enumerateValuesWithBlock:^(float value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ [values enumerateValuesWithBlock:^(float value, __unused NSUInteger idx, __unused BOOL *stop) {
[self writeFloat:fieldNumber value:value];
}];
}
}
-// clang-format on
//%PDDM-EXPAND WRITE_PACKABLE_DEFNS(UInt64, UInt64, uint64_t, )
// This block of code is generated, do not edit it directly.
-// clang-format off
- (void)writeUInt64Array:(int32_t)fieldNumber
values:(GPBUInt64Array *)values
@@ -518,28 +495,23 @@
if (tag != 0) {
if (values.count == 0) return;
__block size_t dataSize = 0;
- [values enumerateValuesWithBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ [values enumerateValuesWithBlock:^(uint64_t value, __unused NSUInteger idx,__unused BOOL *stop) {
dataSize += GPBComputeUInt64SizeNoTag(value);
}];
GPBWriteRawVarint32(&state_, tag);
GPBWriteRawVarint32(&state_, (int32_t)dataSize);
- [values enumerateValuesWithBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ [values enumerateValuesWithBlock:^(uint64_t value, __unused NSUInteger idx, __unused BOOL *stop) {
[self writeUInt64NoTag:value];
}];
} else {
- [values enumerateValuesWithBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ [values enumerateValuesWithBlock:^(uint64_t value, __unused NSUInteger idx, __unused BOOL *stop) {
[self writeUInt64:fieldNumber value:value];
}];
}
}
-// clang-format on
//%PDDM-EXPAND WRITE_PACKABLE_DEFNS(Int64, Int64, int64_t, )
// This block of code is generated, do not edit it directly.
-// clang-format off
- (void)writeInt64Array:(int32_t)fieldNumber
values:(GPBInt64Array *)values
@@ -547,28 +519,23 @@
if (tag != 0) {
if (values.count == 0) return;
__block size_t dataSize = 0;
- [values enumerateValuesWithBlock:^(int64_t value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ [values enumerateValuesWithBlock:^(int64_t value, __unused NSUInteger idx,__unused BOOL *stop) {
dataSize += GPBComputeInt64SizeNoTag(value);
}];
GPBWriteRawVarint32(&state_, tag);
GPBWriteRawVarint32(&state_, (int32_t)dataSize);
- [values enumerateValuesWithBlock:^(int64_t value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ [values enumerateValuesWithBlock:^(int64_t value, __unused NSUInteger idx, __unused BOOL *stop) {
[self writeInt64NoTag:value];
}];
} else {
- [values enumerateValuesWithBlock:^(int64_t value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ [values enumerateValuesWithBlock:^(int64_t value, __unused NSUInteger idx, __unused BOOL *stop) {
[self writeInt64:fieldNumber value:value];
}];
}
}
-// clang-format on
//%PDDM-EXPAND WRITE_PACKABLE_DEFNS(Int32, Int32, int32_t, )
// This block of code is generated, do not edit it directly.
-// clang-format off
- (void)writeInt32Array:(int32_t)fieldNumber
values:(GPBInt32Array *)values
@@ -576,28 +543,23 @@
if (tag != 0) {
if (values.count == 0) return;
__block size_t dataSize = 0;
- [values enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ [values enumerateValuesWithBlock:^(int32_t value, __unused NSUInteger idx,__unused BOOL *stop) {
dataSize += GPBComputeInt32SizeNoTag(value);
}];
GPBWriteRawVarint32(&state_, tag);
GPBWriteRawVarint32(&state_, (int32_t)dataSize);
- [values enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ [values enumerateValuesWithBlock:^(int32_t value, __unused NSUInteger idx, __unused BOOL *stop) {
[self writeInt32NoTag:value];
}];
} else {
- [values enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ [values enumerateValuesWithBlock:^(int32_t value, __unused NSUInteger idx, __unused BOOL *stop) {
[self writeInt32:fieldNumber value:value];
}];
}
}
-// clang-format on
//%PDDM-EXPAND WRITE_PACKABLE_DEFNS(UInt32, UInt32, uint32_t, )
// This block of code is generated, do not edit it directly.
-// clang-format off
- (void)writeUInt32Array:(int32_t)fieldNumber
values:(GPBUInt32Array *)values
@@ -605,28 +567,23 @@
if (tag != 0) {
if (values.count == 0) return;
__block size_t dataSize = 0;
- [values enumerateValuesWithBlock:^(uint32_t value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ [values enumerateValuesWithBlock:^(uint32_t value, __unused NSUInteger idx,__unused BOOL *stop) {
dataSize += GPBComputeUInt32SizeNoTag(value);
}];
GPBWriteRawVarint32(&state_, tag);
GPBWriteRawVarint32(&state_, (int32_t)dataSize);
- [values enumerateValuesWithBlock:^(uint32_t value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ [values enumerateValuesWithBlock:^(uint32_t value, __unused NSUInteger idx, __unused BOOL *stop) {
[self writeUInt32NoTag:value];
}];
} else {
- [values enumerateValuesWithBlock:^(uint32_t value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ [values enumerateValuesWithBlock:^(uint32_t value, __unused NSUInteger idx, __unused BOOL *stop) {
[self writeUInt32:fieldNumber value:value];
}];
}
}
-// clang-format on
//%PDDM-EXPAND WRITE_PACKABLE_DEFNS(Fixed64, UInt64, uint64_t, )
// This block of code is generated, do not edit it directly.
-// clang-format off
- (void)writeFixed64Array:(int32_t)fieldNumber
values:(GPBUInt64Array *)values
@@ -634,28 +591,23 @@
if (tag != 0) {
if (values.count == 0) return;
__block size_t dataSize = 0;
- [values enumerateValuesWithBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ [values enumerateValuesWithBlock:^(uint64_t value, __unused NSUInteger idx,__unused BOOL *stop) {
dataSize += GPBComputeFixed64SizeNoTag(value);
}];
GPBWriteRawVarint32(&state_, tag);
GPBWriteRawVarint32(&state_, (int32_t)dataSize);
- [values enumerateValuesWithBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ [values enumerateValuesWithBlock:^(uint64_t value, __unused NSUInteger idx, __unused BOOL *stop) {
[self writeFixed64NoTag:value];
}];
} else {
- [values enumerateValuesWithBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ [values enumerateValuesWithBlock:^(uint64_t value, __unused NSUInteger idx, __unused BOOL *stop) {
[self writeFixed64:fieldNumber value:value];
}];
}
}
-// clang-format on
//%PDDM-EXPAND WRITE_PACKABLE_DEFNS(Fixed32, UInt32, uint32_t, )
// This block of code is generated, do not edit it directly.
-// clang-format off
- (void)writeFixed32Array:(int32_t)fieldNumber
values:(GPBUInt32Array *)values
@@ -663,28 +615,23 @@
if (tag != 0) {
if (values.count == 0) return;
__block size_t dataSize = 0;
- [values enumerateValuesWithBlock:^(uint32_t value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ [values enumerateValuesWithBlock:^(uint32_t value, __unused NSUInteger idx,__unused BOOL *stop) {
dataSize += GPBComputeFixed32SizeNoTag(value);
}];
GPBWriteRawVarint32(&state_, tag);
GPBWriteRawVarint32(&state_, (int32_t)dataSize);
- [values enumerateValuesWithBlock:^(uint32_t value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ [values enumerateValuesWithBlock:^(uint32_t value, __unused NSUInteger idx, __unused BOOL *stop) {
[self writeFixed32NoTag:value];
}];
} else {
- [values enumerateValuesWithBlock:^(uint32_t value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ [values enumerateValuesWithBlock:^(uint32_t value, __unused NSUInteger idx, __unused BOOL *stop) {
[self writeFixed32:fieldNumber value:value];
}];
}
}
-// clang-format on
//%PDDM-EXPAND WRITE_PACKABLE_DEFNS(SInt32, Int32, int32_t, )
// This block of code is generated, do not edit it directly.
-// clang-format off
- (void)writeSInt32Array:(int32_t)fieldNumber
values:(GPBInt32Array *)values
@@ -692,28 +639,23 @@
if (tag != 0) {
if (values.count == 0) return;
__block size_t dataSize = 0;
- [values enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ [values enumerateValuesWithBlock:^(int32_t value, __unused NSUInteger idx,__unused BOOL *stop) {
dataSize += GPBComputeSInt32SizeNoTag(value);
}];
GPBWriteRawVarint32(&state_, tag);
GPBWriteRawVarint32(&state_, (int32_t)dataSize);
- [values enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ [values enumerateValuesWithBlock:^(int32_t value, __unused NSUInteger idx, __unused BOOL *stop) {
[self writeSInt32NoTag:value];
}];
} else {
- [values enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ [values enumerateValuesWithBlock:^(int32_t value, __unused NSUInteger idx, __unused BOOL *stop) {
[self writeSInt32:fieldNumber value:value];
}];
}
}
-// clang-format on
//%PDDM-EXPAND WRITE_PACKABLE_DEFNS(SInt64, Int64, int64_t, )
// This block of code is generated, do not edit it directly.
-// clang-format off
- (void)writeSInt64Array:(int32_t)fieldNumber
values:(GPBInt64Array *)values
@@ -721,28 +663,23 @@
if (tag != 0) {
if (values.count == 0) return;
__block size_t dataSize = 0;
- [values enumerateValuesWithBlock:^(int64_t value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ [values enumerateValuesWithBlock:^(int64_t value, __unused NSUInteger idx,__unused BOOL *stop) {
dataSize += GPBComputeSInt64SizeNoTag(value);
}];
GPBWriteRawVarint32(&state_, tag);
GPBWriteRawVarint32(&state_, (int32_t)dataSize);
- [values enumerateValuesWithBlock:^(int64_t value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ [values enumerateValuesWithBlock:^(int64_t value, __unused NSUInteger idx, __unused BOOL *stop) {
[self writeSInt64NoTag:value];
}];
} else {
- [values enumerateValuesWithBlock:^(int64_t value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ [values enumerateValuesWithBlock:^(int64_t value, __unused NSUInteger idx, __unused BOOL *stop) {
[self writeSInt64:fieldNumber value:value];
}];
}
}
-// clang-format on
//%PDDM-EXPAND WRITE_PACKABLE_DEFNS(SFixed64, Int64, int64_t, )
// This block of code is generated, do not edit it directly.
-// clang-format off
- (void)writeSFixed64Array:(int32_t)fieldNumber
values:(GPBInt64Array *)values
@@ -750,28 +687,23 @@
if (tag != 0) {
if (values.count == 0) return;
__block size_t dataSize = 0;
- [values enumerateValuesWithBlock:^(int64_t value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ [values enumerateValuesWithBlock:^(int64_t value, __unused NSUInteger idx,__unused BOOL *stop) {
dataSize += GPBComputeSFixed64SizeNoTag(value);
}];
GPBWriteRawVarint32(&state_, tag);
GPBWriteRawVarint32(&state_, (int32_t)dataSize);
- [values enumerateValuesWithBlock:^(int64_t value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ [values enumerateValuesWithBlock:^(int64_t value, __unused NSUInteger idx, __unused BOOL *stop) {
[self writeSFixed64NoTag:value];
}];
} else {
- [values enumerateValuesWithBlock:^(int64_t value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ [values enumerateValuesWithBlock:^(int64_t value, __unused NSUInteger idx, __unused BOOL *stop) {
[self writeSFixed64:fieldNumber value:value];
}];
}
}
-// clang-format on
//%PDDM-EXPAND WRITE_PACKABLE_DEFNS(SFixed32, Int32, int32_t, )
// This block of code is generated, do not edit it directly.
-// clang-format off
- (void)writeSFixed32Array:(int32_t)fieldNumber
values:(GPBInt32Array *)values
@@ -779,28 +711,23 @@
if (tag != 0) {
if (values.count == 0) return;
__block size_t dataSize = 0;
- [values enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ [values enumerateValuesWithBlock:^(int32_t value, __unused NSUInteger idx,__unused BOOL *stop) {
dataSize += GPBComputeSFixed32SizeNoTag(value);
}];
GPBWriteRawVarint32(&state_, tag);
GPBWriteRawVarint32(&state_, (int32_t)dataSize);
- [values enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ [values enumerateValuesWithBlock:^(int32_t value, __unused NSUInteger idx, __unused BOOL *stop) {
[self writeSFixed32NoTag:value];
}];
} else {
- [values enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ [values enumerateValuesWithBlock:^(int32_t value, __unused NSUInteger idx, __unused BOOL *stop) {
[self writeSFixed32:fieldNumber value:value];
}];
}
}
-// clang-format on
//%PDDM-EXPAND WRITE_PACKABLE_DEFNS(Bool, Bool, BOOL, )
// This block of code is generated, do not edit it directly.
-// clang-format off
- (void)writeBoolArray:(int32_t)fieldNumber
values:(GPBBoolArray *)values
@@ -808,28 +735,23 @@
if (tag != 0) {
if (values.count == 0) return;
__block size_t dataSize = 0;
- [values enumerateValuesWithBlock:^(BOOL value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ [values enumerateValuesWithBlock:^(BOOL value, __unused NSUInteger idx,__unused BOOL *stop) {
dataSize += GPBComputeBoolSizeNoTag(value);
}];
GPBWriteRawVarint32(&state_, tag);
GPBWriteRawVarint32(&state_, (int32_t)dataSize);
- [values enumerateValuesWithBlock:^(BOOL value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ [values enumerateValuesWithBlock:^(BOOL value, __unused NSUInteger idx, __unused BOOL *stop) {
[self writeBoolNoTag:value];
}];
} else {
- [values enumerateValuesWithBlock:^(BOOL value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ [values enumerateValuesWithBlock:^(BOOL value, __unused NSUInteger idx, __unused BOOL *stop) {
[self writeBool:fieldNumber value:value];
}];
}
}
-// clang-format on
//%PDDM-EXPAND WRITE_PACKABLE_DEFNS(Enum, Enum, int32_t, Raw)
// This block of code is generated, do not edit it directly.
-// clang-format off
- (void)writeEnumArray:(int32_t)fieldNumber
values:(GPBEnumArray *)values
@@ -837,28 +759,23 @@
if (tag != 0) {
if (values.count == 0) return;
__block size_t dataSize = 0;
- [values enumerateRawValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ [values enumerateRawValuesWithBlock:^(int32_t value, __unused NSUInteger idx,__unused BOOL *stop) {
dataSize += GPBComputeEnumSizeNoTag(value);
}];
GPBWriteRawVarint32(&state_, tag);
GPBWriteRawVarint32(&state_, (int32_t)dataSize);
- [values enumerateRawValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ [values enumerateRawValuesWithBlock:^(int32_t value, __unused NSUInteger idx, __unused BOOL *stop) {
[self writeEnumNoTag:value];
}];
} else {
- [values enumerateRawValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ [values enumerateRawValuesWithBlock:^(int32_t value, __unused NSUInteger idx, __unused BOOL *stop) {
[self writeEnum:fieldNumber value:value];
}];
}
}
-// clang-format on
//%PDDM-EXPAND WRITE_UNPACKABLE_DEFNS(String, NSString)
// This block of code is generated, do not edit it directly.
-// clang-format off
- (void)writeStringArray:(int32_t)fieldNumber values:(NSArray *)values {
for (NSString *value in values) {
@@ -866,10 +783,8 @@
}
}
-// clang-format on
//%PDDM-EXPAND WRITE_UNPACKABLE_DEFNS(Message, GPBMessage)
// This block of code is generated, do not edit it directly.
-// clang-format off
- (void)writeMessageArray:(int32_t)fieldNumber values:(NSArray *)values {
for (GPBMessage *value in values) {
@@ -877,10 +792,8 @@
}
}
-// clang-format on
//%PDDM-EXPAND WRITE_UNPACKABLE_DEFNS(Bytes, NSData)
// This block of code is generated, do not edit it directly.
-// clang-format off
- (void)writeBytesArray:(int32_t)fieldNumber values:(NSArray *)values {
for (NSData *value in values) {
@@ -888,10 +801,8 @@
}
}
-// clang-format on
//%PDDM-EXPAND WRITE_UNPACKABLE_DEFNS(Group, GPBMessage)
// This block of code is generated, do not edit it directly.
-// clang-format off
- (void)writeGroupArray:(int32_t)fieldNumber values:(NSArray *)values {
for (GPBMessage *value in values) {
@@ -899,10 +810,8 @@
}
}
-// clang-format on
//%PDDM-EXPAND WRITE_UNPACKABLE_DEFNS(UnknownGroup, GPBUnknownFieldSet)
// This block of code is generated, do not edit it directly.
-// clang-format off
- (void)writeUnknownGroupArray:(int32_t)fieldNumber values:(NSArray *)values {
for (GPBUnknownFieldSet *value in values) {
@@ -910,26 +819,22 @@
}
}
-// clang-format on
//%PDDM-EXPAND-END (19 expansions)
-- (void)writeMessageSetExtension:(int32_t)fieldNumber
- value:(GPBMessage *)value {
- GPBWriteTagWithFormat(&state_, GPBWireFormatMessageSetItem,
- GPBWireFormatStartGroup);
+// clang-format on
+
+- (void)writeMessageSetExtension:(int32_t)fieldNumber value:(GPBMessage *)value {
+ GPBWriteTagWithFormat(&state_, GPBWireFormatMessageSetItem, GPBWireFormatStartGroup);
GPBWriteUInt32(&state_, GPBWireFormatMessageSetTypeId, fieldNumber);
[self writeMessage:GPBWireFormatMessageSetMessage value:value];
- GPBWriteTagWithFormat(&state_, GPBWireFormatMessageSetItem,
- GPBWireFormatEndGroup);
+ GPBWriteTagWithFormat(&state_, GPBWireFormatMessageSetItem, GPBWireFormatEndGroup);
}
- (void)writeRawMessageSetExtension:(int32_t)fieldNumber value:(NSData *)value {
- GPBWriteTagWithFormat(&state_, GPBWireFormatMessageSetItem,
- GPBWireFormatStartGroup);
+ GPBWriteTagWithFormat(&state_, GPBWireFormatMessageSetItem, GPBWireFormatStartGroup);
GPBWriteUInt32(&state_, GPBWireFormatMessageSetTypeId, fieldNumber);
[self writeBytes:GPBWireFormatMessageSetMessage value:value];
- GPBWriteTagWithFormat(&state_, GPBWireFormatMessageSetItem,
- GPBWireFormatEndGroup);
+ GPBWriteTagWithFormat(&state_, GPBWireFormatMessageSetItem, GPBWireFormatEndGroup);
}
- (void)flush {
@@ -946,9 +851,7 @@
[self writeRawPtr:[data bytes] offset:0 length:[data length]];
}
-- (void)writeRawPtr:(const void *)value
- offset:(size_t)offset
- length:(size_t)length {
+- (void)writeRawPtr:(const void *)value offset:(size_t)offset length:(size_t)length {
if (value == nil || length == 0) {
return;
}
@@ -963,8 +866,7 @@
// Write extends past current buffer. Fill the rest of this buffer and
// flush.
size_t bytesWritten = bufferBytesLeft;
- memcpy(state_.bytes + state_.position, ((uint8_t *)value) + offset,
- bytesWritten);
+ memcpy(state_.bytes + state_.position, ((uint8_t *)value) + offset, bytesWritten);
offset += bytesWritten;
length -= bytesWritten;
state_.position = bufferLength;
@@ -1017,23 +919,13 @@
@end
-size_t GPBComputeDoubleSizeNoTag(Float64 value) {
-#pragma unused(value)
- return LITTLE_ENDIAN_64_SIZE;
-}
+size_t GPBComputeDoubleSizeNoTag(__unused Float64 value) { return LITTLE_ENDIAN_64_SIZE; }
-size_t GPBComputeFloatSizeNoTag(Float32 value) {
-#pragma unused(value)
- return LITTLE_ENDIAN_32_SIZE;
-}
+size_t GPBComputeFloatSizeNoTag(__unused Float32 value) { return LITTLE_ENDIAN_32_SIZE; }
-size_t GPBComputeUInt64SizeNoTag(uint64_t value) {
- return GPBComputeRawVarint64Size(value);
-}
+size_t GPBComputeUInt64SizeNoTag(uint64_t value) { return GPBComputeRawVarint64Size(value); }
-size_t GPBComputeInt64SizeNoTag(int64_t value) {
- return GPBComputeRawVarint64Size(value);
-}
+size_t GPBComputeInt64SizeNoTag(int64_t value) { return GPBComputeRawVarint64Size(value); }
size_t GPBComputeInt32SizeNoTag(int32_t value) {
if (value >= 0) {
@@ -1048,33 +940,20 @@
return GPBComputeInt32SizeNoTag((int32_t)value);
}
-size_t GPBComputeFixed64SizeNoTag(uint64_t value) {
-#pragma unused(value)
- return LITTLE_ENDIAN_64_SIZE;
-}
+size_t GPBComputeFixed64SizeNoTag(__unused uint64_t value) { return LITTLE_ENDIAN_64_SIZE; }
-size_t GPBComputeFixed32SizeNoTag(uint32_t value) {
-#pragma unused(value)
- return LITTLE_ENDIAN_32_SIZE;
-}
+size_t GPBComputeFixed32SizeNoTag(__unused uint32_t value) { return LITTLE_ENDIAN_32_SIZE; }
-size_t GPBComputeBoolSizeNoTag(BOOL value) {
-#pragma unused(value)
- return 1;
-}
+size_t GPBComputeBoolSizeNoTag(__unused BOOL value) { return 1; }
size_t GPBComputeStringSizeNoTag(NSString *value) {
NSUInteger length = [value lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
return GPBComputeRawVarint32SizeForInteger(length) + length;
}
-size_t GPBComputeGroupSizeNoTag(GPBMessage *value) {
- return [value serializedSize];
-}
+size_t GPBComputeGroupSizeNoTag(GPBMessage *value) { return [value serializedSize]; }
-size_t GPBComputeUnknownGroupSizeNoTag(GPBUnknownFieldSet *value) {
- return value.serializedSize;
-}
+size_t GPBComputeUnknownGroupSizeNoTag(GPBUnknownFieldSet *value) { return value.serializedSize; }
size_t GPBComputeMessageSizeNoTag(GPBMessage *value) {
size_t size = [value serializedSize];
@@ -1086,23 +965,13 @@
return GPBComputeRawVarint32SizeForInteger(valueLength) + valueLength;
}
-size_t GPBComputeUInt32SizeNoTag(int32_t value) {
- return GPBComputeRawVarint32Size(value);
-}
+size_t GPBComputeUInt32SizeNoTag(int32_t value) { return GPBComputeRawVarint32Size(value); }
-size_t GPBComputeEnumSizeNoTag(int32_t value) {
- return GPBComputeInt32SizeNoTag(value);
-}
+size_t GPBComputeEnumSizeNoTag(int32_t value) { return GPBComputeInt32SizeNoTag(value); }
-size_t GPBComputeSFixed32SizeNoTag(int32_t value) {
-#pragma unused(value)
- return LITTLE_ENDIAN_32_SIZE;
-}
+size_t GPBComputeSFixed32SizeNoTag(__unused int32_t value) { return LITTLE_ENDIAN_32_SIZE; }
-size_t GPBComputeSFixed64SizeNoTag(int64_t value) {
-#pragma unused(value)
- return LITTLE_ENDIAN_64_SIZE;
-}
+size_t GPBComputeSFixed64SizeNoTag(__unused int64_t value) { return LITTLE_ENDIAN_64_SIZE; }
size_t GPBComputeSInt32SizeNoTag(int32_t value) {
return GPBComputeRawVarint32Size(GPBEncodeZigZag32(value));
@@ -1152,10 +1021,8 @@
return GPBComputeTagSize(fieldNumber) * 2 + GPBComputeGroupSizeNoTag(value);
}
-size_t GPBComputeUnknownGroupSize(int32_t fieldNumber,
- GPBUnknownFieldSet *value) {
- return GPBComputeTagSize(fieldNumber) * 2 +
- GPBComputeUnknownGroupSizeNoTag(value);
+size_t GPBComputeUnknownGroupSize(int32_t fieldNumber, GPBUnknownFieldSet *value) {
+ return GPBComputeTagSize(fieldNumber) * 2 + GPBComputeUnknownGroupSizeNoTag(value);
}
size_t GPBComputeMessageSize(int32_t fieldNumber, GPBMessage *value) {
@@ -1187,27 +1054,23 @@
}
size_t GPBComputeSInt64Size(int32_t fieldNumber, int64_t value) {
- return GPBComputeTagSize(fieldNumber) +
- GPBComputeRawVarint64Size(GPBEncodeZigZag64(value));
+ return GPBComputeTagSize(fieldNumber) + GPBComputeRawVarint64Size(GPBEncodeZigZag64(value));
}
-size_t GPBComputeMessageSetExtensionSize(int32_t fieldNumber,
- GPBMessage *value) {
+size_t GPBComputeMessageSetExtensionSize(int32_t fieldNumber, GPBMessage *value) {
return GPBComputeTagSize(GPBWireFormatMessageSetItem) * 2 +
GPBComputeUInt32Size(GPBWireFormatMessageSetTypeId, fieldNumber) +
GPBComputeMessageSize(GPBWireFormatMessageSetMessage, value);
}
-size_t GPBComputeRawMessageSetExtensionSize(int32_t fieldNumber,
- NSData *value) {
+size_t GPBComputeRawMessageSetExtensionSize(int32_t fieldNumber, NSData *value) {
return GPBComputeTagSize(GPBWireFormatMessageSetItem) * 2 +
GPBComputeUInt32Size(GPBWireFormatMessageSetTypeId, fieldNumber) +
GPBComputeBytesSize(GPBWireFormatMessageSetMessage, value);
}
size_t GPBComputeTagSize(int32_t fieldNumber) {
- return GPBComputeRawVarint32Size(
- GPBWireFormatMakeTag(fieldNumber, GPBWireFormatVarint));
+ return GPBComputeRawVarint32Size(GPBWireFormatMakeTag(fieldNumber, GPBWireFormatVarint));
}
size_t GPBComputeWireFormatTagSize(int field_number, GPBDataType dataType) {
diff --git a/objectivec/GPBCodedOutputStream_PackagePrivate.h b/objectivec/GPBCodedOutputStream_PackagePrivate.h
index 2e7bb4c..98e2d95 100644
--- a/objectivec/GPBCodedOutputStream_PackagePrivate.h
+++ b/objectivec/GPBCodedOutputStream_PackagePrivate.h
@@ -34,46 +34,27 @@
CF_EXTERN_C_BEGIN
-size_t GPBComputeDoubleSize(int32_t fieldNumber, double value)
+size_t GPBComputeDoubleSize(int32_t fieldNumber, double value) __attribute__((const));
+size_t GPBComputeFloatSize(int32_t fieldNumber, float value) __attribute__((const));
+size_t GPBComputeUInt64Size(int32_t fieldNumber, uint64_t value) __attribute__((const));
+size_t GPBComputeInt64Size(int32_t fieldNumber, int64_t value) __attribute__((const));
+size_t GPBComputeInt32Size(int32_t fieldNumber, int32_t value) __attribute__((const));
+size_t GPBComputeFixed64Size(int32_t fieldNumber, uint64_t value) __attribute__((const));
+size_t GPBComputeFixed32Size(int32_t fieldNumber, uint32_t value) __attribute__((const));
+size_t GPBComputeBoolSize(int32_t fieldNumber, BOOL value) __attribute__((const));
+size_t GPBComputeStringSize(int32_t fieldNumber, NSString *value) __attribute__((const));
+size_t GPBComputeGroupSize(int32_t fieldNumber, GPBMessage *value) __attribute__((const));
+size_t GPBComputeUnknownGroupSize(int32_t fieldNumber, GPBUnknownFieldSet *value)
__attribute__((const));
-size_t GPBComputeFloatSize(int32_t fieldNumber, float value)
- __attribute__((const));
-size_t GPBComputeUInt64Size(int32_t fieldNumber, uint64_t value)
- __attribute__((const));
-size_t GPBComputeInt64Size(int32_t fieldNumber, int64_t value)
- __attribute__((const));
-size_t GPBComputeInt32Size(int32_t fieldNumber, int32_t value)
- __attribute__((const));
-size_t GPBComputeFixed64Size(int32_t fieldNumber, uint64_t value)
- __attribute__((const));
-size_t GPBComputeFixed32Size(int32_t fieldNumber, uint32_t value)
- __attribute__((const));
-size_t GPBComputeBoolSize(int32_t fieldNumber, BOOL value)
- __attribute__((const));
-size_t GPBComputeStringSize(int32_t fieldNumber, NSString *value)
- __attribute__((const));
-size_t GPBComputeGroupSize(int32_t fieldNumber, GPBMessage *value)
- __attribute__((const));
-size_t GPBComputeUnknownGroupSize(int32_t fieldNumber,
- GPBUnknownFieldSet *value)
- __attribute__((const));
-size_t GPBComputeMessageSize(int32_t fieldNumber, GPBMessage *value)
- __attribute__((const));
-size_t GPBComputeBytesSize(int32_t fieldNumber, NSData *value)
- __attribute__((const));
-size_t GPBComputeUInt32Size(int32_t fieldNumber, uint32_t value)
- __attribute__((const));
-size_t GPBComputeSFixed32Size(int32_t fieldNumber, int32_t value)
- __attribute__((const));
-size_t GPBComputeSFixed64Size(int32_t fieldNumber, int64_t value)
- __attribute__((const));
-size_t GPBComputeSInt32Size(int32_t fieldNumber, int32_t value)
- __attribute__((const));
-size_t GPBComputeSInt64Size(int32_t fieldNumber, int64_t value)
- __attribute__((const));
+size_t GPBComputeMessageSize(int32_t fieldNumber, GPBMessage *value) __attribute__((const));
+size_t GPBComputeBytesSize(int32_t fieldNumber, NSData *value) __attribute__((const));
+size_t GPBComputeUInt32Size(int32_t fieldNumber, uint32_t value) __attribute__((const));
+size_t GPBComputeSFixed32Size(int32_t fieldNumber, int32_t value) __attribute__((const));
+size_t GPBComputeSFixed64Size(int32_t fieldNumber, int64_t value) __attribute__((const));
+size_t GPBComputeSInt32Size(int32_t fieldNumber, int32_t value) __attribute__((const));
+size_t GPBComputeSInt64Size(int32_t fieldNumber, int64_t value) __attribute__((const));
size_t GPBComputeTagSize(int32_t fieldNumber) __attribute__((const));
-size_t GPBComputeWireFormatTagSize(int field_number, GPBDataType dataType)
- __attribute__((const));
+size_t GPBComputeWireFormatTagSize(int field_number, GPBDataType dataType) __attribute__((const));
size_t GPBComputeDoubleSizeNoTag(double value) __attribute__((const));
size_t GPBComputeFloatSizeNoTag(float value) __attribute__((const));
@@ -85,8 +66,7 @@
size_t GPBComputeBoolSizeNoTag(BOOL value) __attribute__((const));
size_t GPBComputeStringSizeNoTag(NSString *value) __attribute__((const));
size_t GPBComputeGroupSizeNoTag(GPBMessage *value) __attribute__((const));
-size_t GPBComputeUnknownGroupSizeNoTag(GPBUnknownFieldSet *value)
- __attribute__((const));
+size_t GPBComputeUnknownGroupSizeNoTag(GPBUnknownFieldSet *value) __attribute__((const));
size_t GPBComputeMessageSizeNoTag(GPBMessage *value) __attribute__((const));
size_t GPBComputeBytesSizeNoTag(NSData *value) __attribute__((const));
size_t GPBComputeUInt32SizeNoTag(int32_t value) __attribute__((const));
@@ -103,8 +83,7 @@
size_t GPBComputeRawVarint64Size(int64_t value) __attribute__((const));
// Note that this will calculate the size of 64 bit values truncated to 32.
-size_t GPBComputeRawVarint32SizeForInteger(NSInteger value)
- __attribute__((const));
+size_t GPBComputeRawVarint32SizeForInteger(NSInteger value) __attribute__((const));
// Compute the number of bytes that would be needed to encode a
// MessageSet extension to the stream. For historical reasons,
@@ -118,8 +97,7 @@
size_t GPBComputeRawMessageSetExtensionSize(int32_t fieldNumber, NSData *value)
__attribute__((const));
-size_t GPBComputeEnumSize(int32_t fieldNumber, int32_t value)
- __attribute__((const));
+size_t GPBComputeEnumSize(int32_t fieldNumber, int32_t value) __attribute__((const));
CF_EXTERN_C_END
diff --git a/objectivec/GPBDescriptor.h b/objectivec/GPBDescriptor.h
index fd66b0e..750eaee 100644
--- a/objectivec/GPBDescriptor.h
+++ b/objectivec/GPBDescriptor.h
@@ -62,14 +62,14 @@
/**
* Describes a proto message.
**/
-@interface GPBDescriptor : NSObject<NSCopying>
+@interface GPBDescriptor : NSObject <NSCopying>
/** Name of the message. */
@property(nonatomic, readonly, copy) NSString *name;
/** Fields declared in the message. */
-@property(nonatomic, readonly, strong, nullable) NSArray<GPBFieldDescriptor*> *fields;
+@property(nonatomic, readonly, strong, nullable) NSArray<GPBFieldDescriptor *> *fields;
/** Oneofs declared in the message. */
-@property(nonatomic, readonly, strong, nullable) NSArray<GPBOneofDescriptor*> *oneofs;
+@property(nonatomic, readonly, strong, nullable) NSArray<GPBOneofDescriptor *> *oneofs;
/** Extension range declared for the message. */
@property(nonatomic, readonly, nullable) const GPBExtensionRange *extensionRanges;
/** Number of extension ranges declared for the message. */
@@ -139,7 +139,7 @@
/** Name of the oneof field. */
@property(nonatomic, readonly) NSString *name;
/** Fields declared in the oneof. */
-@property(nonatomic, readonly) NSArray<GPBFieldDescriptor*> *fields;
+@property(nonatomic, readonly) NSArray<GPBFieldDescriptor *> *fields;
/**
* Gets the field for the given number.
@@ -293,7 +293,7 @@
/**
* Describes a proto extension.
**/
-@interface GPBExtensionDescriptor : NSObject<NSCopying>
+@interface GPBExtensionDescriptor : NSObject <NSCopying>
/** Field number under which the extension is stored. */
@property(nonatomic, readonly) uint32_t fieldNumber;
/** The containing message class, i.e. the class extended by this extension. */
diff --git a/objectivec/GPBDescriptor.m b/objectivec/GPBDescriptor.m
index c29b955..72368ce 100644
--- a/objectivec/GPBDescriptor.m
+++ b/objectivec/GPBDescriptor.m
@@ -32,9 +32,9 @@
#import <objc/runtime.h>
+#import "GPBMessage_PackagePrivate.h"
#import "GPBUtilities_PackagePrivate.h"
#import "GPBWireFormat.h"
-#import "GPBMessage_PackagePrivate.h"
// Direct access is use for speed, to avoid even internally declaring things
// read/write, etc. The warning is enabled in the project to ensure code calling
@@ -48,16 +48,15 @@
static const char kClassNameSuffixKey = 0;
// Utility function to generate selectors on the fly.
-static SEL SelFromStrings(const char *prefix, const char *middle,
- const char *suffix, BOOL takesArg) {
+static SEL SelFromStrings(const char *prefix, const char *middle, const char *suffix,
+ BOOL takesArg) {
if (prefix == NULL && suffix == NULL && !takesArg) {
return sel_getUid(middle);
}
const size_t prefixLen = prefix != NULL ? strlen(prefix) : 0;
const size_t middleLen = strlen(middle);
const size_t suffixLen = suffix != NULL ? strlen(suffix) : 0;
- size_t totalLen =
- prefixLen + middleLen + suffixLen + 1; // include space for null on end.
+ size_t totalLen = prefixLen + middleLen + suffixLen + 1; // include space for null on end.
if (takesArg) {
totalLen += 1;
}
@@ -82,12 +81,10 @@
return result;
}
-static NSArray *NewFieldsArrayForHasIndex(int hasIndex,
- NSArray *allMessageFields)
+static NSArray *NewFieldsArrayForHasIndex(int hasIndex, NSArray *allMessageFields)
__attribute__((ns_returns_retained));
-static NSArray *NewFieldsArrayForHasIndex(int hasIndex,
- NSArray *allMessageFields) {
+static NSArray *NewFieldsArrayForHasIndex(int hasIndex, NSArray *allMessageFields) {
NSMutableArray *result = [[NSMutableArray alloc] init];
for (GPBFieldDescriptor *fieldDesc in allMessageFields) {
if (fieldDesc->description_->hasIndex == hasIndex) {
@@ -111,25 +108,21 @@
@synthesize file = file_;
@synthesize wireFormat = wireFormat_;
-+ (instancetype)
- allocDescriptorForClass:(Class)messageClass
- rootClass:(Class)rootClass
- file:(GPBFileDescriptor *)file
- fields:(void *)fieldDescriptions
- fieldCount:(uint32_t)fieldCount
- storageSize:(uint32_t)storageSize
- flags:(GPBDescriptorInitializationFlags)flags {
++ (instancetype)allocDescriptorForClass:(Class)messageClass
+ rootClass:(Class)rootClass
+ file:(GPBFileDescriptor *)file
+ fields:(void *)fieldDescriptions
+ fieldCount:(uint32_t)fieldCount
+ storageSize:(uint32_t)storageSize
+ flags:(GPBDescriptorInitializationFlags)flags {
// The rootClass is no longer used, but it is passed in to ensure it
// was started up during initialization also.
(void)rootClass;
NSMutableArray *fields = nil;
GPBFileSyntax syntax = file.syntax;
- BOOL fieldsIncludeDefault =
- (flags & GPBDescriptorInitializationFlag_FieldsWithDefault) != 0;
- BOOL usesClassRefs =
- (flags & GPBDescriptorInitializationFlag_UsesClassRefs) != 0;
- BOOL proto3OptionalKnown =
- (flags & GPBDescriptorInitializationFlag_Proto3OptionalKnown) != 0;
+ BOOL fieldsIncludeDefault = (flags & GPBDescriptorInitializationFlag_FieldsWithDefault) != 0;
+ BOOL usesClassRefs = (flags & GPBDescriptorInitializationFlag_UsesClassRefs) != 0;
+ BOOL proto3OptionalKnown = (flags & GPBDescriptorInitializationFlag_Proto3OptionalKnown) != 0;
void *desc;
for (uint32_t i = 0; i < fieldCount; ++i) {
@@ -193,10 +186,9 @@
for (uint32_t i = 0, hasIndex = firstHasIndex; i < count; ++i, --hasIndex) {
const char *name = oneofNames[i];
NSArray *fieldsForOneof = NewFieldsArrayForHasIndex(hasIndex, fields_);
- NSCAssert(fieldsForOneof.count > 0,
- @"No fields for this oneof? (%s:%d)", name, hasIndex);
- GPBOneofDescriptor *oneofDescriptor =
- [[GPBOneofDescriptor alloc] initWithName:name fields:fieldsForOneof];
+ NSCAssert(fieldsForOneof.count > 0, @"No fields for this oneof? (%s:%d)", name, hasIndex);
+ GPBOneofDescriptor *oneofDescriptor = [[GPBOneofDescriptor alloc] initWithName:name
+ fields:fieldsForOneof];
[oneofs addObject:oneofDescriptor];
[oneofDescriptor release];
[fieldsForOneof release];
@@ -210,8 +202,7 @@
NSValue *extraInfoValue = [NSValue valueWithPointer:extraTextFormatInfo];
for (GPBFieldDescriptor *fieldDescriptor in fields_) {
if (fieldDescriptor->description_->flags & GPBFieldTextFormatNameCustom) {
- objc_setAssociatedObject(fieldDescriptor, &kTextFormatExtraValueKey,
- extraInfoValue,
+ objc_setAssociatedObject(fieldDescriptor, &kTextFormatExtraValueKey, extraInfoValue,
OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
}
@@ -224,9 +215,7 @@
}
- (void)setupContainingMessageClass:(Class)messageClass {
- objc_setAssociatedObject(self, &kParentClassValueKey,
- messageClass,
- OBJC_ASSOCIATION_ASSIGN);
+ objc_setAssociatedObject(self, &kParentClassValueKey, messageClass, OBJC_ASSOCIATION_ASSIGN);
}
- (void)setupContainingMessageClassName:(const char *)msgClassName {
@@ -240,9 +229,7 @@
- (void)setupMessageClassNameSuffix:(NSString *)suffix {
if (suffix.length) {
- objc_setAssociatedObject(self, &kClassNameSuffixKey,
- suffix,
- OBJC_ASSOCIATION_RETAIN_NONATOMIC);
+ objc_setAssociatedObject(self, &kClassNameSuffixKey, suffix, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
}
@@ -260,9 +247,7 @@
GPBFileDescriptor *file = self.file;
NSString *objcPrefix = file.objcPrefix;
if (objcPrefix && ![className hasPrefix:objcPrefix]) {
- NSAssert(0,
- @"Class didn't have correct prefix? (%@ - %@)",
- className, objcPrefix);
+ NSAssert(0, @"Class didn't have correct prefix? (%@ - %@)", className, objcPrefix);
return nil;
}
GPBDescriptor *parent = self.containingType;
@@ -274,19 +259,16 @@
NSString *suffix = objc_getAssociatedObject(parent, &kClassNameSuffixKey);
if (suffix) {
if (![parentClassName hasSuffix:suffix]) {
- NSAssert(0,
- @"ParentMessage class didn't have correct suffix? (%@ - %@)",
- className, suffix);
+ NSAssert(0, @"ParentMessage class didn't have correct suffix? (%@ - %@)", className,
+ suffix);
return nil;
}
- parentClassName =
- [parentClassName substringToIndex:(parentClassName.length - suffix.length)];
+ parentClassName = [parentClassName substringToIndex:(parentClassName.length - suffix.length)];
}
NSString *parentPrefix = [parentClassName stringByAppendingString:@"_"];
if (![className hasPrefix:parentPrefix]) {
- NSAssert(0,
- @"Class didn't have the correct parent name prefix? (%@ - %@)",
- parentPrefix, className);
+ NSAssert(0, @"Class didn't have the correct parent name prefix? (%@ - %@)", parentPrefix,
+ className);
return nil;
}
name = [className substringFromIndex:parentPrefix.length];
@@ -298,9 +280,7 @@
NSString *suffix = objc_getAssociatedObject(self, &kClassNameSuffixKey);
if (suffix) {
if (![name hasSuffix:suffix]) {
- NSAssert(0,
- @"Message class didn't have correct suffix? (%@ - %@)",
- name, suffix);
+ NSAssert(0, @"Message class didn't have correct suffix? (%@ - %@)", name, suffix);
return nil;
}
name = [name substringToIndex:(name.length - suffix.length)];
@@ -316,8 +296,7 @@
return result;
}
-- (id)copyWithZone:(NSZone *)zone {
-#pragma unused(zone)
+- (id)copyWithZone:(__unused NSZone *)zone {
return [self retain];
}
@@ -372,8 +351,7 @@
return self;
}
-- (instancetype)initWithPackage:(NSString *)package
- syntax:(GPBFileSyntax)syntax {
+- (instancetype)initWithPackage:(NSString *)package syntax:(GPBFileSyntax)syntax {
self = [super init];
if (self) {
package_ = [package copy];
@@ -414,7 +392,7 @@
}
- (NSString *)name {
- return (NSString * _Nonnull)@(name_);
+ return (NSString *_Nonnull)@(name_);
}
- (GPBFieldDescriptor *)fieldWithNumber:(uint32_t)fieldNumber {
@@ -444,19 +422,17 @@
// Maps are repeated messages on the wire.
format = GPBWireFormatForType(GPBDataTypeMessage, NO);
} else {
- format = GPBWireFormatForType(description->dataType,
- ((description->flags & GPBFieldPacked) != 0));
+ format =
+ GPBWireFormatForType(description->dataType, ((description->flags & GPBFieldPacked) != 0));
}
return GPBWireFormatMakeTag(description->number, format);
}
uint32_t GPBFieldAlternateTag(GPBFieldDescriptor *self) {
GPBMessageFieldDescription *description = self->description_;
- NSCAssert((description->flags & GPBFieldRepeated) != 0,
- @"Only valid on repeated fields");
+ NSCAssert((description->flags & GPBFieldRepeated) != 0, @"Only valid on repeated fields");
GPBWireFormat format =
- GPBWireFormatForType(description->dataType,
- ((description->flags & GPBFieldPacked) == 0));
+ GPBWireFormatForType(description->dataType, ((description->flags & GPBFieldPacked) == 0));
return GPBWireFormatMakeTag(description->number, format);
}
@@ -516,10 +492,8 @@
// - not repeated/map
// - not in a oneof (negative has index)
// - not a message (the flag doesn't make sense for messages)
- BOOL clearOnZero = ((syntax == GPBFileSyntaxProto3) &&
- !isMapOrArray &&
- (coreDesc->hasIndex >= 0) &&
- !isMessage);
+ BOOL clearOnZero = ((syntax == GPBFileSyntaxProto3) && !isMapOrArray &&
+ (coreDesc->hasIndex >= 0) && !isMessage);
if (clearOnZero) {
coreDesc->flags |= GPBFieldClearHasIvarOnZero;
}
@@ -534,8 +508,7 @@
// It is a single field; it gets has/setHas selectors if...
// - not in a oneof (negative has index)
// - not clearing on zero
- if ((coreDesc->hasIndex >= 0) &&
- ((coreDesc->flags & GPBFieldClearHasIvarOnZero) == 0)) {
+ if ((coreDesc->hasIndex >= 0) && ((coreDesc->flags & GPBFieldClearHasIvarOnZero) == 0)) {
hasOrCountSel_ = SelFromStrings("has", coreDesc->name, NULL, NO);
setHasSel_ = SelFromStrings("setHas", coreDesc->name, NULL, YES);
}
@@ -556,11 +529,9 @@
}
} else if (dataType == GPBDataTypeEnum) {
if ((coreDesc->flags & GPBFieldHasEnumDescriptor) != 0) {
- enumHandling_.enumDescriptor_ =
- coreDesc->dataTypeSpecific.enumDescFunc();
+ enumHandling_.enumDescriptor_ = coreDesc->dataTypeSpecific.enumDescFunc();
} else {
- enumHandling_.enumVerifier_ =
- coreDesc->dataTypeSpecific.enumVerifier;
+ enumHandling_.enumVerifier_ = coreDesc->dataTypeSpecific.enumVerifier;
}
}
@@ -576,8 +547,7 @@
memcpy(&length, bytes, sizeof(length));
length = ntohl(length);
bytes += sizeof(length);
- defaultValue_.valueData =
- [[NSData alloc] initWithBytes:bytes length:length];
+ defaultValue_.valueData = [[NSData alloc] initWithBytes:bytes length:length];
}
}
}
@@ -586,8 +556,7 @@
}
- (void)dealloc {
- if (description_->dataType == GPBDataTypeBytes &&
- !(description_->flags & GPBFieldRepeated)) {
+ if (description_->dataType == GPBDataTypeBytes && !(description_->flags & GPBFieldRepeated)) {
[defaultValue_.valueData release];
}
[super dealloc];
@@ -606,7 +575,7 @@
}
- (NSString *)name {
- return (NSString * _Nonnull)@(description_->name);
+ return (NSString *_Nonnull)@(description_->name);
}
- (BOOL)isRequired {
@@ -666,8 +635,7 @@
}
- (BOOL)isValidEnumValue:(int32_t)value {
- NSAssert(description_->dataType == GPBDataTypeEnum,
- @"Field Must be of type GPBDataTypeEnum");
+ NSAssert(description_->dataType == GPBDataTypeEnum, @"Field Must be of type GPBDataTypeEnum");
if (description_->flags & GPBFieldHasEnumDescriptor) {
return enumHandling_.enumDescriptor_.enumVerifier(value);
} else {
@@ -703,15 +671,13 @@
- (NSString *)textFormatName {
if ((description_->flags & GPBFieldTextFormatNameCustom) != 0) {
- NSValue *extraInfoValue =
- objc_getAssociatedObject(self, &kTextFormatExtraValueKey);
+ NSValue *extraInfoValue = objc_getAssociatedObject(self, &kTextFormatExtraValueKey);
// Support can be left out at generation time.
if (!extraInfoValue) {
return nil;
}
const uint8_t *extraTextFormatInfo = [extraInfoValue pointerValue];
- return GPBDecodeTextFormatName(extraTextFormatInfo, GPBFieldNumber(self),
- self.name);
+ return GPBDecodeTextFormatName(extraTextFormatInfo, GPBFieldNumber(self), self.name);
}
// The logic here has to match SetCommonFieldVariables() from
@@ -726,8 +692,7 @@
}
// Remove "Array" from the end for repeated fields.
- if (((description_->flags & GPBFieldRepeated) != 0) &&
- [name hasSuffix:@"Array"]) {
+ if (((description_->flags & GPBFieldRepeated) != 0) && [name hasSuffix:@"Array"]) {
name = [name substringToIndex:(len - 5)];
len = [name length];
}
@@ -739,9 +704,8 @@
if (firstChar >= 'a' && firstChar <= 'z') {
NSString *firstCharString =
[NSString stringWithFormat:@"%C", (unichar)(firstChar - 'a' + 'A')];
- NSString *result =
- [name stringByReplacingCharactersInRange:NSMakeRange(0, 1)
- withString:firstCharString];
+ NSString *result = [name stringByReplacingCharactersInRange:NSMakeRange(0, 1)
+ withString:firstCharString];
return result;
}
return name;
@@ -784,12 +748,11 @@
@synthesize name = name_;
@synthesize enumVerifier = enumVerifier_;
-+ (instancetype)
- allocDescriptorForName:(NSString *)name
- valueNames:(const char *)valueNames
- values:(const int32_t *)values
- count:(uint32_t)valueCount
- enumVerifier:(GPBEnumValidationFunc)enumVerifier {
++ (instancetype)allocDescriptorForName:(NSString *)name
+ valueNames:(const char *)valueNames
+ values:(const int32_t *)values
+ count:(uint32_t)valueCount
+ enumVerifier:(GPBEnumValidationFunc)enumVerifier {
GPBEnumDescriptor *descriptor = [[self alloc] initWithName:name
valueNames:valueNames
values:values
@@ -798,13 +761,12 @@
return descriptor;
}
-+ (instancetype)
- allocDescriptorForName:(NSString *)name
- valueNames:(const char *)valueNames
- values:(const int32_t *)values
- count:(uint32_t)valueCount
- enumVerifier:(GPBEnumValidationFunc)enumVerifier
- extraTextFormatInfo:(const char *)extraTextFormatInfo {
++ (instancetype)allocDescriptorForName:(NSString *)name
+ valueNames:(const char *)valueNames
+ values:(const int32_t *)values
+ count:(uint32_t)valueCount
+ enumVerifier:(GPBEnumValidationFunc)enumVerifier
+ extraTextFormatInfo:(const char *)extraTextFormatInfo {
// Call the common case.
GPBEnumDescriptor *descriptor = [self allocDescriptorForName:name
valueNames:valueNames
@@ -892,27 +854,26 @@
}
- (BOOL)getValue:(int32_t *)outValue forEnumTextFormatName:(NSString *)textFormatName {
- if (nameOffsets_ == NULL) [self calcValueNameOffsets];
- if (nameOffsets_ == NULL) return NO;
+ if (nameOffsets_ == NULL) [self calcValueNameOffsets];
+ if (nameOffsets_ == NULL) return NO;
- for (uint32_t i = 0; i < valueCount_; ++i) {
- NSString *valueTextFormatName = [self getEnumTextFormatNameForIndex:i];
- if ([valueTextFormatName isEqual:textFormatName]) {
- if (outValue) {
- *outValue = values_[i];
- }
- return YES;
- }
+ for (uint32_t i = 0; i < valueCount_; ++i) {
+ NSString *valueTextFormatName = [self getEnumTextFormatNameForIndex:i];
+ if ([valueTextFormatName isEqual:textFormatName]) {
+ if (outValue) {
+ *outValue = values_[i];
+ }
+ return YES;
}
- return NO;
+ }
+ return NO;
}
- (NSString *)textFormatNameForValue:(int32_t)number {
// Find the EnumValue descriptor and its index.
BOOL foundIt = NO;
uint32_t valueDescriptorIndex;
- for (valueDescriptorIndex = 0; valueDescriptorIndex < valueCount_;
- ++valueDescriptorIndex) {
+ for (valueDescriptorIndex = 0; valueDescriptorIndex < valueCount_; ++valueDescriptorIndex) {
if (values_[valueDescriptorIndex] == number) {
foundIt = YES;
break;
@@ -955,8 +916,7 @@
// See if it is in the map of special format handling.
if (extraTextFormatInfo_) {
- result = GPBDecodeTextFormatName(extraTextFormatInfo_,
- (int32_t)index, shortName);
+ result = GPBDecodeTextFormatName(extraTextFormatInfo_, (int32_t)index, shortName);
}
// Logic here needs to match what objectivec_enum.cc does in the proto
// compiler.
@@ -1005,16 +965,14 @@
GPBDataType type = description_->dataType;
if (type == GPBDataTypeBytes) {
// Data stored as a length prefixed c-string in descriptor records.
- const uint8_t *bytes =
- (const uint8_t *)description_->defaultValue.valueData;
+ const uint8_t *bytes = (const uint8_t *)description_->defaultValue.valueData;
if (bytes) {
uint32_t length;
memcpy(&length, bytes, sizeof(length));
// The length is stored in network byte order.
length = ntohl(length);
bytes += sizeof(length);
- defaultValue_.valueData =
- [[NSData alloc] initWithBytes:bytes length:length];
+ defaultValue_.valueData = [[NSData alloc] initWithBytes:bytes length:length];
}
} else if (type == GPBDataTypeMessage || type == GPBDataTypeGroup) {
// The default is looked up in -defaultValue instead since extensions
@@ -1032,21 +990,19 @@
}
- (void)dealloc {
- if ((description_->dataType == GPBDataTypeBytes) &&
- !GPBExtensionIsRepeated(description_)) {
+ if ((description_->dataType == GPBDataTypeBytes) && !GPBExtensionIsRepeated(description_)) {
[defaultValue_.valueData release];
}
[super dealloc];
}
-- (instancetype)copyWithZone:(NSZone *)zone {
-#pragma unused(zone)
+- (instancetype)copyWithZone:(__unused NSZone *)zone {
// Immutable.
return [self retain];
}
- (NSString *)singletonName {
- return (NSString * _Nonnull)@(description_->singletonName);
+ return (NSString *_Nonnull)@(description_->singletonName);
}
- (const char *)singletonNameC {
@@ -1062,15 +1018,12 @@
}
- (GPBWireFormat)wireType {
- return GPBWireFormatForType(description_->dataType,
- GPBExtensionIsPacked(description_));
+ return GPBWireFormatForType(description_->dataType, GPBExtensionIsPacked(description_));
}
- (GPBWireFormat)alternateWireType {
- NSAssert(GPBExtensionIsRepeated(description_),
- @"Only valid on repeated extensions");
- return GPBWireFormatForType(description_->dataType,
- !GPBExtensionIsPacked(description_));
+ NSAssert(GPBExtensionIsRepeated(description_), @"Only valid on repeated extensions");
+ return GPBWireFormatForType(description_->dataType, !GPBExtensionIsPacked(description_));
}
- (BOOL)isRepeated {
@@ -1126,8 +1079,7 @@
return @(defaultValue_.valueUInt64);
case GPBDataTypeBytes:
// Like message fields, the default is zero length data.
- return (defaultValue_.valueData ? defaultValue_.valueData
- : GPBEmptyNSData());
+ return (defaultValue_.valueData ? defaultValue_.valueData : GPBEmptyNSData());
case GPBDataTypeString:
// Like message fields, the default is zero length string.
return (defaultValue_.valueString ? defaultValue_.valueString : @"");
diff --git a/objectivec/GPBDescriptor_PackagePrivate.h b/objectivec/GPBDescriptor_PackagePrivate.h
index 408f8d4..4774d4e 100644
--- a/objectivec/GPBDescriptor_PackagePrivate.h
+++ b/objectivec/GPBDescriptor_PackagePrivate.h
@@ -37,12 +37,12 @@
// Describes attributes of the field.
typedef NS_OPTIONS(uint16_t, GPBFieldFlags) {
- GPBFieldNone = 0,
+ GPBFieldNone = 0,
// These map to standard protobuf concepts.
- GPBFieldRequired = 1 << 0,
- GPBFieldRepeated = 1 << 1,
- GPBFieldPacked = 1 << 2,
- GPBFieldOptional = 1 << 3,
+ GPBFieldRequired = 1 << 0,
+ GPBFieldRepeated = 1 << 1,
+ GPBFieldPacked = 1 << 2,
+ GPBFieldOptional = 1 << 3,
GPBFieldHasDefaultValue = 1 << 4,
// Indicate that the field should "clear" when set to zero value. This is the
@@ -60,19 +60,19 @@
// These bits are used to mark the field as a map and what the key
// type is.
- GPBFieldMapKeyMask = 0xF << 8,
- GPBFieldMapKeyInt32 = 1 << 8,
- GPBFieldMapKeyInt64 = 2 << 8,
- GPBFieldMapKeyUInt32 = 3 << 8,
- GPBFieldMapKeyUInt64 = 4 << 8,
- GPBFieldMapKeySInt32 = 5 << 8,
- GPBFieldMapKeySInt64 = 6 << 8,
- GPBFieldMapKeyFixed32 = 7 << 8,
- GPBFieldMapKeyFixed64 = 8 << 8,
- GPBFieldMapKeySFixed32 = 9 << 8,
+ GPBFieldMapKeyMask = 0xF << 8,
+ GPBFieldMapKeyInt32 = 1 << 8,
+ GPBFieldMapKeyInt64 = 2 << 8,
+ GPBFieldMapKeyUInt32 = 3 << 8,
+ GPBFieldMapKeyUInt64 = 4 << 8,
+ GPBFieldMapKeySInt32 = 5 << 8,
+ GPBFieldMapKeySInt64 = 6 << 8,
+ GPBFieldMapKeyFixed32 = 7 << 8,
+ GPBFieldMapKeyFixed64 = 8 << 8,
+ GPBFieldMapKeySFixed32 = 9 << 8,
GPBFieldMapKeySFixed64 = 10 << 8,
- GPBFieldMapKeyBool = 11 << 8,
- GPBFieldMapKeyString = 12 << 8,
+ GPBFieldMapKeyBool = 11 << 8,
+ GPBFieldMapKeyString = 12 << 8,
};
// NOTE: The structures defined here have their members ordered to minimize
@@ -88,7 +88,7 @@
// kept around right now for backwards compatibility.
// clazz is used iff GPBDescriptorInitializationFlag_UsesClassRefs is set.
char *className; // Name of the class of the message.
- Class clazz; // Class of the message.
+ Class clazz; // Class of the message.
// For enums only: If EnumDescriptors are compiled in, it will be that,
// otherwise it will be the verifier.
GPBEnumDescriptorFunc enumDescFunc;
@@ -120,10 +120,10 @@
// Describes attributes of the extension.
typedef NS_OPTIONS(uint8_t, GPBExtensionOptions) {
- GPBExtensionNone = 0,
+ GPBExtensionNone = 0,
// These map to standard protobuf concepts.
- GPBExtensionRepeated = 1 << 0,
- GPBExtensionPacked = 1 << 1,
+ GPBExtensionRepeated = 1 << 0,
+ GPBExtensionPacked = 1 << 1,
GPBExtensionSetWireFormat = 1 << 2,
};
@@ -132,10 +132,10 @@
GPBGenericValue defaultValue;
const char *singletonName;
// Before 3.12, `extendedClass` was just a `const char *`. Thanks to nested
- // initialization (https://en.cppreference.com/w/c/language/struct_initialization#Nested_initialization)
- // old generated code with `.extendedClass = GPBStringifySymbol(Something)`
- // still works; and the current generator can use `extendedClass.clazz`, to
- // pass a Class reference.
+ // initialization
+ // (https://en.cppreference.com/w/c/language/struct_initialization#Nested_initialization) old
+ // generated code with `.extendedClass = GPBStringifySymbol(Something)` still works; and the
+ // current generator can use `extendedClass.clazz`, to pass a Class reference.
union {
const char *name;
Class clazz;
@@ -150,9 +150,9 @@
union {
const char *messageOrGroupClassName;
union {
- const char *name;
- Class clazz;
- } messageOrGroupClass;
+ const char *name;
+ Class clazz;
+ } messageOrGroupClass;
};
GPBEnumDescriptorFunc enumDescriptorFunc;
int32_t fieldNumber;
@@ -161,14 +161,14 @@
} GPBExtensionDescription;
typedef NS_OPTIONS(uint32_t, GPBDescriptorInitializationFlags) {
- GPBDescriptorInitializationFlag_None = 0,
+ GPBDescriptorInitializationFlag_None = 0,
GPBDescriptorInitializationFlag_FieldsWithDefault = 1 << 0,
- GPBDescriptorInitializationFlag_WireFormat = 1 << 1,
+ GPBDescriptorInitializationFlag_WireFormat = 1 << 1,
// This is used as a stopgap as we move from using class names to class
// references. The runtime needs to support both until we allow a
// breaking change in the runtime.
- GPBDescriptorInitializationFlag_UsesClassRefs = 1 << 2,
+ GPBDescriptorInitializationFlag_UsesClassRefs = 1 << 2,
// This flag is used to indicate that the generated sources already contain
// the `GPBFieldClearHasIvarOnZero` flag and it doesn't have to be computed
@@ -185,14 +185,13 @@
}
// fieldDescriptions have to be long lived, they are held as raw pointers.
-+ (instancetype)
- allocDescriptorForClass:(Class)messageClass
- rootClass:(Class)rootClass
- file:(GPBFileDescriptor *)file
- fields:(void *)fieldDescriptions
- fieldCount:(uint32_t)fieldCount
- storageSize:(uint32_t)storageSize
- flags:(GPBDescriptorInitializationFlags)flags;
++ (instancetype)allocDescriptorForClass:(Class)messageClass
+ rootClass:(Class)rootClass
+ file:(GPBFileDescriptor *)file
+ fields:(void *)fieldDescriptions
+ fieldCount:(uint32_t)fieldCount
+ storageSize:(uint32_t)storageSize
+ flags:(GPBDescriptorInitializationFlags)flags;
- (instancetype)initWithClass:(Class)messageClass
file:(GPBFileDescriptor *)file
@@ -220,8 +219,7 @@
- (instancetype)initWithPackage:(NSString *)package
objcPrefix:(NSString *)objcPrefix
syntax:(GPBFileSyntax)syntax;
-- (instancetype)initWithPackage:(NSString *)package
- syntax:(GPBFileSyntax)syntax;
+- (instancetype)initWithPackage:(NSString *)package syntax:(GPBFileSyntax)syntax;
@end
@interface GPBOneofDescriptor () {
@@ -258,19 +256,17 @@
@interface GPBEnumDescriptor ()
// valueNames, values and extraTextFormatInfo have to be long lived, they are
// held as raw pointers.
-+ (instancetype)
- allocDescriptorForName:(NSString *)name
- valueNames:(const char *)valueNames
- values:(const int32_t *)values
- count:(uint32_t)valueCount
- enumVerifier:(GPBEnumValidationFunc)enumVerifier;
-+ (instancetype)
- allocDescriptorForName:(NSString *)name
- valueNames:(const char *)valueNames
- values:(const int32_t *)values
- count:(uint32_t)valueCount
- enumVerifier:(GPBEnumValidationFunc)enumVerifier
- extraTextFormatInfo:(const char *)extraTextFormatInfo;
++ (instancetype)allocDescriptorForName:(NSString *)name
+ valueNames:(const char *)valueNames
+ values:(const int32_t *)values
+ count:(uint32_t)valueCount
+ enumVerifier:(GPBEnumValidationFunc)enumVerifier;
++ (instancetype)allocDescriptorForName:(NSString *)name
+ valueNames:(const char *)valueNames
+ values:(const int32_t *)values
+ count:(uint32_t)valueCount
+ enumVerifier:(GPBEnumValidationFunc)enumVerifier
+ extraTextFormatInfo:(const char *)extraTextFormatInfo;
- (instancetype)initWithName:(NSString *)name
valueNames:(const char *)valueNames
@@ -309,8 +305,7 @@
#pragma clang diagnostic ignored "-Wdirect-ivar-access"
GPB_INLINE BOOL GPBFieldIsMapOrArray(GPBFieldDescriptor *field) {
- return (field->description_->flags &
- (GPBFieldRepeated | GPBFieldMapKeyMask)) != 0;
+ return (field->description_->flags & (GPBFieldRepeated | GPBFieldMapKeyMask)) != 0;
}
GPB_INLINE GPBDataType GPBGetFieldDataType(GPBFieldDescriptor *field) {
@@ -353,22 +348,13 @@
// Helper for compile time assets.
#ifndef GPBInternalCompileAssert
- #if __has_feature(c_static_assert) || __has_extension(c_static_assert)
- #define GPBInternalCompileAssert(test, msg) _Static_assert((test), #msg)
- #else
- // Pre-Xcode 7 support.
- #define GPBInternalCompileAssertSymbolInner(line, msg) GPBInternalCompileAssert ## line ## __ ## msg
- #define GPBInternalCompileAssertSymbol(line, msg) GPBInternalCompileAssertSymbolInner(line, msg)
- #define GPBInternalCompileAssert(test, msg) \
- typedef char GPBInternalCompileAssertSymbol(__LINE__, msg) [ ((test) ? 1 : -1) ]
- #endif // __has_feature(c_static_assert) || __has_extension(c_static_assert)
-#endif // GPBInternalCompileAssert
+#define GPBInternalCompileAssert(test, msg) _Static_assert((test), #msg)
+#endif // GPBInternalCompileAssert
// Sanity check that there isn't padding between the field description
// structures with and without a default.
GPBInternalCompileAssert(sizeof(GPBMessageFieldDescriptionWithDefault) ==
- (sizeof(GPBGenericValue) +
- sizeof(GPBMessageFieldDescription)),
+ (sizeof(GPBGenericValue) + sizeof(GPBMessageFieldDescription)),
DescriptionsWithDefault_different_size_than_expected);
CF_EXTERN_C_END
diff --git a/objectivec/GPBDictionary.h b/objectivec/GPBDictionary.h
index 28d880d..90440e3 100644
--- a/objectivec/GPBDictionary.h
+++ b/objectivec/GPBDictionary.h
@@ -43,9 +43,11 @@
NS_ASSUME_NONNULL_BEGIN
+// Disable clang-format for the macros.
+// clang-format off
+
//%PDDM-EXPAND DECLARE_DICTIONARIES()
// This block of code is generated, do not edit it directly.
-// clang-format off
#pragma mark - UInt32 -> UInt32
@@ -5479,7 +5481,6 @@
@end
-// clang-format on
//%PDDM-EXPAND-END DECLARE_DICTIONARIES()
NS_ASSUME_NONNULL_END
@@ -5770,3 +5771,5 @@
//% **/
//%- (void)setRawValue:(VALUE_TYPE)rawValue forKey:(KEY_TYPE##KisP$S##KisP)key;
//%
+
+// clang-format on
diff --git a/objectivec/GPBDictionary.m b/objectivec/GPBDictionary.m
index 187a970..1d71307 100644
--- a/objectivec/GPBDictionary.m
+++ b/objectivec/GPBDictionary.m
@@ -51,18 +51,6 @@
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdirect-ivar-access"
-// Used to include code only visible to specific versions of the static
-// analyzer. Useful for wrapping code that only exists to silence the analyzer.
-// Determine the values you want to use for BEGIN_APPLE_BUILD_VERSION,
-// END_APPLE_BUILD_VERSION using:
-// xcrun clang -dM -E -x c /dev/null | grep __apple_build_version__
-// Example usage:
-// #if GPB_STATIC_ANALYZER_ONLY(5621, 5623) ... #endif
-#define GPB_STATIC_ANALYZER_ONLY(BEGIN_APPLE_BUILD_VERSION, END_APPLE_BUILD_VERSION) \
- (defined(__clang_analyzer__) && \
- (__apple_build_version__ >= BEGIN_APPLE_BUILD_VERSION && \
- __apple_build_version__ <= END_APPLE_BUILD_VERSION))
-
enum {
kMapKeyFieldNumber = 1,
kMapValueFieldNumber = 2,
@@ -73,6 +61,9 @@
return (value != kGPBUnrecognizedEnumeratorValue);
}
+// Disable clang-format for the macros.
+// clang-format off
+
//%PDDM-DEFINE SERIALIZE_SUPPORT_2_TYPE(VALUE_NAME, VALUE_TYPE, GPBDATATYPE_NAME1, GPBDATATYPE_NAME2)
//%static size_t ComputeDict##VALUE_NAME##FieldSize(VALUE_TYPE value, uint32_t fieldNum, GPBDataType dataType) {
//% if (dataType == GPBDataType##GPBDATATYPE_NAME1) {
@@ -122,15 +113,13 @@
//%}
//%
//%PDDM-DEFINE SIMPLE_SERIALIZE_SUPPORT(VALUE_NAME, VALUE_TYPE, VisP)
-//%static size_t ComputeDict##VALUE_NAME##FieldSize(VALUE_TYPE VisP##value, uint32_t fieldNum, GPBDataType dataType) {
+//%static size_t ComputeDict##VALUE_NAME##FieldSize(VALUE_TYPE VisP##value, uint32_t fieldNum, __unused GPBDataType dataType) {
//% NSCAssert(dataType == GPBDataType##VALUE_NAME, @"bad type: %d", dataType);
-//% #pragma unused(dataType) // For when asserts are off in release.
//% return GPBCompute##VALUE_NAME##Size(fieldNum, value);
//%}
//%
-//%static void WriteDict##VALUE_NAME##Field(GPBCodedOutputStream *stream, VALUE_TYPE VisP##value, uint32_t fieldNum, GPBDataType dataType) {
+//%static void WriteDict##VALUE_NAME##Field(GPBCodedOutputStream *stream, VALUE_TYPE VisP##value, uint32_t fieldNum, __unused GPBDataType dataType) {
//% NSCAssert(dataType == GPBDataType##VALUE_NAME, @"bad type: %d", dataType);
-//% #pragma unused(dataType) // For when asserts are off in release.
//% [stream write##VALUE_NAME##:fieldNum value:value];
//%}
//%
@@ -147,7 +136,6 @@
//%SERIALIZE_SUPPORT_3_TYPE(Object, id, Message, String, Bytes)
//%PDDM-EXPAND SERIALIZE_SUPPORT_HELPERS()
// This block of code is generated, do not edit it directly.
-// clang-format off
static size_t ComputeDictInt32FieldSize(int32_t value, uint32_t fieldNum, GPBDataType dataType) {
if (dataType == GPBDataTypeInt32) {
@@ -241,63 +229,53 @@
}
}
-static size_t ComputeDictBoolFieldSize(BOOL value, uint32_t fieldNum, GPBDataType dataType) {
+static size_t ComputeDictBoolFieldSize(BOOL value, uint32_t fieldNum, __unused GPBDataType dataType) {
NSCAssert(dataType == GPBDataTypeBool, @"bad type: %d", dataType);
- #pragma unused(dataType) // For when asserts are off in release.
return GPBComputeBoolSize(fieldNum, value);
}
-static void WriteDictBoolField(GPBCodedOutputStream *stream, BOOL value, uint32_t fieldNum, GPBDataType dataType) {
+static void WriteDictBoolField(GPBCodedOutputStream *stream, BOOL value, uint32_t fieldNum, __unused GPBDataType dataType) {
NSCAssert(dataType == GPBDataTypeBool, @"bad type: %d", dataType);
- #pragma unused(dataType) // For when asserts are off in release.
[stream writeBool:fieldNum value:value];
}
-static size_t ComputeDictEnumFieldSize(int32_t value, uint32_t fieldNum, GPBDataType dataType) {
+static size_t ComputeDictEnumFieldSize(int32_t value, uint32_t fieldNum, __unused GPBDataType dataType) {
NSCAssert(dataType == GPBDataTypeEnum, @"bad type: %d", dataType);
- #pragma unused(dataType) // For when asserts are off in release.
return GPBComputeEnumSize(fieldNum, value);
}
-static void WriteDictEnumField(GPBCodedOutputStream *stream, int32_t value, uint32_t fieldNum, GPBDataType dataType) {
+static void WriteDictEnumField(GPBCodedOutputStream *stream, int32_t value, uint32_t fieldNum, __unused GPBDataType dataType) {
NSCAssert(dataType == GPBDataTypeEnum, @"bad type: %d", dataType);
- #pragma unused(dataType) // For when asserts are off in release.
[stream writeEnum:fieldNum value:value];
}
-static size_t ComputeDictFloatFieldSize(float value, uint32_t fieldNum, GPBDataType dataType) {
+static size_t ComputeDictFloatFieldSize(float value, uint32_t fieldNum, __unused GPBDataType dataType) {
NSCAssert(dataType == GPBDataTypeFloat, @"bad type: %d", dataType);
- #pragma unused(dataType) // For when asserts are off in release.
return GPBComputeFloatSize(fieldNum, value);
}
-static void WriteDictFloatField(GPBCodedOutputStream *stream, float value, uint32_t fieldNum, GPBDataType dataType) {
+static void WriteDictFloatField(GPBCodedOutputStream *stream, float value, uint32_t fieldNum, __unused GPBDataType dataType) {
NSCAssert(dataType == GPBDataTypeFloat, @"bad type: %d", dataType);
- #pragma unused(dataType) // For when asserts are off in release.
[stream writeFloat:fieldNum value:value];
}
-static size_t ComputeDictDoubleFieldSize(double value, uint32_t fieldNum, GPBDataType dataType) {
+static size_t ComputeDictDoubleFieldSize(double value, uint32_t fieldNum, __unused GPBDataType dataType) {
NSCAssert(dataType == GPBDataTypeDouble, @"bad type: %d", dataType);
- #pragma unused(dataType) // For when asserts are off in release.
return GPBComputeDoubleSize(fieldNum, value);
}
-static void WriteDictDoubleField(GPBCodedOutputStream *stream, double value, uint32_t fieldNum, GPBDataType dataType) {
+static void WriteDictDoubleField(GPBCodedOutputStream *stream, double value, uint32_t fieldNum, __unused GPBDataType dataType) {
NSCAssert(dataType == GPBDataTypeDouble, @"bad type: %d", dataType);
- #pragma unused(dataType) // For when asserts are off in release.
[stream writeDouble:fieldNum value:value];
}
-static size_t ComputeDictStringFieldSize(NSString *value, uint32_t fieldNum, GPBDataType dataType) {
+static size_t ComputeDictStringFieldSize(NSString *value, uint32_t fieldNum, __unused GPBDataType dataType) {
NSCAssert(dataType == GPBDataTypeString, @"bad type: %d", dataType);
- #pragma unused(dataType) // For when asserts are off in release.
return GPBComputeStringSize(fieldNum, value);
}
-static void WriteDictStringField(GPBCodedOutputStream *stream, NSString *value, uint32_t fieldNum, GPBDataType dataType) {
+static void WriteDictStringField(GPBCodedOutputStream *stream, NSString *value, uint32_t fieldNum, __unused GPBDataType dataType) {
NSCAssert(dataType == GPBDataTypeString, @"bad type: %d", dataType);
- #pragma unused(dataType) // For when asserts are off in release.
[stream writeString:fieldNum value:value];
}
@@ -326,9 +304,10 @@
}
}
-// clang-format on
//%PDDM-EXPAND-END SERIALIZE_SUPPORT_HELPERS()
+// clang-format on
+
size_t GPBDictionaryComputeSizeInternalHelper(NSDictionary *dict, GPBFieldDescriptor *field) {
GPBDataType mapValueType = GPBGetFieldDataType(field);
size_t result = 0;
@@ -346,8 +325,7 @@
}
void GPBDictionaryWriteToStreamInternalHelper(GPBCodedOutputStream *outputStream,
- NSDictionary *dict,
- GPBFieldDescriptor *field) {
+ NSDictionary *dict, GPBFieldDescriptor *field) {
NSCAssert(field.mapKeyDataType == GPBDataTypeString, @"Unexpected key type");
GPBDataType mapValueType = GPBGetFieldDataType(field);
uint32_t tag = GPBWireFormatMakeTag(GPBFieldNumber(field), GPBWireFormatLengthDelimited);
@@ -368,10 +346,10 @@
}
}
-BOOL GPBDictionaryIsInitializedInternalHelper(NSDictionary *dict, GPBFieldDescriptor *field) {
+BOOL GPBDictionaryIsInitializedInternalHelper(NSDictionary *dict,
+ __unused GPBFieldDescriptor *field) {
NSCAssert(field.mapKeyDataType == GPBDataTypeString, @"Unexpected key type");
NSCAssert(GPBGetFieldDataType(field) == GPBDataTypeMessage, @"Unexpected value type");
- #pragma unused(field) // For when asserts are off in release.
GPBMessage *msg;
NSEnumerator *objects = [dict objectEnumerator];
while ((msg = [objects nextObject])) {
@@ -383,11 +361,8 @@
}
// Note: if the type is an object, it the retain pass back to the caller.
-static void ReadValue(GPBCodedInputStream *stream,
- GPBGenericValue *valueToFill,
- GPBDataType type,
- GPBExtensionRegistry *registry,
- GPBFieldDescriptor *field) {
+static void ReadValue(GPBCodedInputStream *stream, GPBGenericValue *valueToFill, GPBDataType type,
+ id<GPBExtensionRegistry> registry, GPBFieldDescriptor *field) {
switch (type) {
case GPBDataTypeBool:
valueToFill->valueBool = GPBCodedInputStreamReadBool(&stream->state_);
@@ -452,10 +427,8 @@
}
}
-void GPBDictionaryReadEntry(id mapDictionary,
- GPBCodedInputStream *stream,
- GPBExtensionRegistry *registry,
- GPBFieldDescriptor *field,
+void GPBDictionaryReadEntry(id mapDictionary, GPBCodedInputStream *stream,
+ id<GPBExtensionRegistry> registry, GPBFieldDescriptor *field,
GPBMessage *parentMessage) {
GPBDataType keyDataType = field.mapKeyDataType;
GPBDataType valueDataType = GPBGetFieldDataType(field);
@@ -469,8 +442,7 @@
}
GPBCodedInputStreamState *state = &stream->state_;
- uint32_t keyTag =
- GPBWireFormatMakeTag(kMapKeyFieldNumber, GPBWireFormatForType(keyDataType, NO));
+ uint32_t keyTag = GPBWireFormatMakeTag(kMapKeyFieldNumber, GPBWireFormatForType(keyDataType, NO));
uint32_t valueTag =
GPBWireFormatMakeTag(kMapValueFieldNumber, GPBWireFormatForType(valueDataType, NO));
@@ -485,7 +457,7 @@
// zero signals EOF / limit reached
break;
} else { // Unknown
- if (![stream skipField:tag]){
+ if (![stream skipField:tag]) {
hitError = YES;
break;
}
@@ -525,22 +497,8 @@
}
if ((keyDataType == GPBDataTypeString) && GPBDataTypeIsObject(valueDataType)) {
-#if GPB_STATIC_ANALYZER_ONLY(6020053, 7000181)
- // Limited to Xcode 6.4 - 7.2, are known to fail here. The upper end can
- // be raised as needed for new Xcodes.
- //
- // This is only needed on a "shallow" analyze; on a "deep" analyze, the
- // existing code path gets this correct. In shallow, the analyzer decides
- // GPBDataTypeIsObject(valueDataType) is both false and true on a single
- // path through this function, allowing nil to be used for the
- // setObject:forKey:.
- if (value.valueString == nil) {
- value.valueString = [@"" retain];
- }
-#endif
// mapDictionary is an NSMutableDictionary
- [(NSMutableDictionary *)mapDictionary setObject:value.valueString
- forKey:key.valueString];
+ [(NSMutableDictionary *)mapDictionary setObject:value.valueString forKey:key.valueString];
} else {
if (valueDataType == GPBDataTypeEnum) {
if (GPBHasPreservingUnknownEnumSemantics([parentMessage descriptor].file.syntax) ||
@@ -570,6 +528,9 @@
// Macros for the common basic cases.
//
+// Disable clang-format for the macros.
+// clang-format off
+
//%PDDM-DEFINE DICTIONARY_IMPL_FOR_POD_KEY(KEY_NAME, KEY_TYPE)
//%DICTIONARY_POD_IMPL_FOR_KEY(KEY_NAME, KEY_TYPE, , POD)
//%DICTIONARY_POD_KEY_TO_OBJECT_IMPL(KEY_NAME, KEY_TYPE, Object, id)
@@ -627,8 +588,7 @@
//% return self;
//%}
//%
-//%- (instancetype)initWithCapacity:(NSUInteger)numItems {
-//% #pragma unused(numItems)
+//%- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
//% return [self initWith##VNAME##s:NULL forKeys:NULL count:0];
//%}
//%
@@ -693,8 +653,7 @@
//%}
//%
//%- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
-//% capacity:(NSUInteger)numItems {
-//% #pragma unused(numItems)
+//% capacity:(__unused NSUInteger)numItems {
//% return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0];
//%}
//%
@@ -860,8 +819,7 @@
//%}
//%
//%- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
-//% [self enumerateKeysAnd##ACCESSOR_NAME##VNAME##sUsingBlock:^(KEY_TYPE KisP##key, VALUE_TYPE VNAME_VAR, BOOL *stop) {
-//% #pragma unused(stop)
+//% [self enumerateKeysAnd##ACCESSOR_NAME##VNAME##sUsingBlock:^(KEY_TYPE KisP##key, VALUE_TYPE VNAME_VAR, __unused BOOL *stop) {
//% block(TEXT_FORMAT_OBJ##KEY_NAME(key), TEXT_FORMAT_OBJ##VALUE_NAME(VNAME_VAR));
//% }];
//%}
@@ -915,8 +873,7 @@
//%
//%BOOL_DICT_INITS_##HELPER(VALUE_NAME, VALUE_TYPE)
//%
-//%- (instancetype)initWithCapacity:(NSUInteger)numItems {
-//% #pragma unused(numItems)
+//%- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
//% return [self initWith##VNAME##s:NULL forKeys:NULL count:0];
//%}
//%
@@ -1429,7 +1386,6 @@
//%PDDM-EXPAND DICTIONARY_IMPL_FOR_POD_KEY(UInt32, uint32_t)
// This block of code is generated, do not edit it directly.
-// clang-format off
#pragma mark - UInt32 -> UInt32
@@ -1467,8 +1423,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithUInt32s:NULL forKeys:NULL count:0];
}
@@ -1574,8 +1529,7 @@
}
- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
- [self enumerateKeysAndUInt32sUsingBlock:^(uint32_t key, uint32_t value, BOOL *stop) {
- #pragma unused(stop)
+ [self enumerateKeysAndUInt32sUsingBlock:^(uint32_t key, uint32_t value, __unused BOOL *stop) {
block([NSString stringWithFormat:@"%u", key], [NSString stringWithFormat:@"%u", value]);
}];
}
@@ -1650,8 +1604,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithInt32s:NULL forKeys:NULL count:0];
}
@@ -1757,8 +1710,7 @@
}
- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
- [self enumerateKeysAndInt32sUsingBlock:^(uint32_t key, int32_t value, BOOL *stop) {
- #pragma unused(stop)
+ [self enumerateKeysAndInt32sUsingBlock:^(uint32_t key, int32_t value, __unused BOOL *stop) {
block([NSString stringWithFormat:@"%u", key], [NSString stringWithFormat:@"%d", value]);
}];
}
@@ -1833,8 +1785,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithUInt64s:NULL forKeys:NULL count:0];
}
@@ -1940,8 +1891,7 @@
}
- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
- [self enumerateKeysAndUInt64sUsingBlock:^(uint32_t key, uint64_t value, BOOL *stop) {
- #pragma unused(stop)
+ [self enumerateKeysAndUInt64sUsingBlock:^(uint32_t key, uint64_t value, __unused BOOL *stop) {
block([NSString stringWithFormat:@"%u", key], [NSString stringWithFormat:@"%llu", value]);
}];
}
@@ -2016,8 +1966,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithInt64s:NULL forKeys:NULL count:0];
}
@@ -2123,8 +2072,7 @@
}
- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
- [self enumerateKeysAndInt64sUsingBlock:^(uint32_t key, int64_t value, BOOL *stop) {
- #pragma unused(stop)
+ [self enumerateKeysAndInt64sUsingBlock:^(uint32_t key, int64_t value, __unused BOOL *stop) {
block([NSString stringWithFormat:@"%u", key], [NSString stringWithFormat:@"%lld", value]);
}];
}
@@ -2199,8 +2147,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithBools:NULL forKeys:NULL count:0];
}
@@ -2306,8 +2253,7 @@
}
- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
- [self enumerateKeysAndBoolsUsingBlock:^(uint32_t key, BOOL value, BOOL *stop) {
- #pragma unused(stop)
+ [self enumerateKeysAndBoolsUsingBlock:^(uint32_t key, BOOL value, __unused BOOL *stop) {
block([NSString stringWithFormat:@"%u", key], (value ? @"true" : @"false"));
}];
}
@@ -2382,8 +2328,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithFloats:NULL forKeys:NULL count:0];
}
@@ -2489,8 +2434,7 @@
}
- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
- [self enumerateKeysAndFloatsUsingBlock:^(uint32_t key, float value, BOOL *stop) {
- #pragma unused(stop)
+ [self enumerateKeysAndFloatsUsingBlock:^(uint32_t key, float value, __unused BOOL *stop) {
block([NSString stringWithFormat:@"%u", key], [NSString stringWithFormat:@"%.*g", FLT_DIG, value]);
}];
}
@@ -2565,8 +2509,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithDoubles:NULL forKeys:NULL count:0];
}
@@ -2672,8 +2615,7 @@
}
- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
- [self enumerateKeysAndDoublesUsingBlock:^(uint32_t key, double value, BOOL *stop) {
- #pragma unused(stop)
+ [self enumerateKeysAndDoublesUsingBlock:^(uint32_t key, double value, __unused BOOL *stop) {
block([NSString stringWithFormat:@"%u", key], [NSString stringWithFormat:@"%.*lg", DBL_DIG, value]);
}];
}
@@ -2761,8 +2703,7 @@
}
- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
- capacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+ capacity:(__unused NSUInteger)numItems {
return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0];
}
@@ -2880,8 +2821,7 @@
}
- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
- [self enumerateKeysAndRawValuesUsingBlock:^(uint32_t key, int32_t value, BOOL *stop) {
- #pragma unused(stop)
+ [self enumerateKeysAndRawValuesUsingBlock:^(uint32_t key, int32_t value, __unused BOOL *stop) {
block([NSString stringWithFormat:@"%u", key], @(value));
}];
}
@@ -3004,8 +2944,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithObjects:NULL forKeys:NULL count:0];
}
@@ -3135,8 +3074,7 @@
}
- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
- [self enumerateKeysAndObjectsUsingBlock:^(uint32_t key, id object, BOOL *stop) {
- #pragma unused(stop)
+ [self enumerateKeysAndObjectsUsingBlock:^(uint32_t key, id object, __unused BOOL *stop) {
block([NSString stringWithFormat:@"%u", key], object);
}];
}
@@ -3176,10 +3114,8 @@
@end
-// clang-format on
//%PDDM-EXPAND DICTIONARY_IMPL_FOR_POD_KEY(Int32, int32_t)
// This block of code is generated, do not edit it directly.
-// clang-format off
#pragma mark - Int32 -> UInt32
@@ -3217,8 +3153,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithUInt32s:NULL forKeys:NULL count:0];
}
@@ -3324,8 +3259,7 @@
}
- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
- [self enumerateKeysAndUInt32sUsingBlock:^(int32_t key, uint32_t value, BOOL *stop) {
- #pragma unused(stop)
+ [self enumerateKeysAndUInt32sUsingBlock:^(int32_t key, uint32_t value, __unused BOOL *stop) {
block([NSString stringWithFormat:@"%d", key], [NSString stringWithFormat:@"%u", value]);
}];
}
@@ -3400,8 +3334,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithInt32s:NULL forKeys:NULL count:0];
}
@@ -3507,8 +3440,7 @@
}
- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
- [self enumerateKeysAndInt32sUsingBlock:^(int32_t key, int32_t value, BOOL *stop) {
- #pragma unused(stop)
+ [self enumerateKeysAndInt32sUsingBlock:^(int32_t key, int32_t value, __unused BOOL *stop) {
block([NSString stringWithFormat:@"%d", key], [NSString stringWithFormat:@"%d", value]);
}];
}
@@ -3583,8 +3515,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithUInt64s:NULL forKeys:NULL count:0];
}
@@ -3690,8 +3621,7 @@
}
- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
- [self enumerateKeysAndUInt64sUsingBlock:^(int32_t key, uint64_t value, BOOL *stop) {
- #pragma unused(stop)
+ [self enumerateKeysAndUInt64sUsingBlock:^(int32_t key, uint64_t value, __unused BOOL *stop) {
block([NSString stringWithFormat:@"%d", key], [NSString stringWithFormat:@"%llu", value]);
}];
}
@@ -3766,8 +3696,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithInt64s:NULL forKeys:NULL count:0];
}
@@ -3873,8 +3802,7 @@
}
- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
- [self enumerateKeysAndInt64sUsingBlock:^(int32_t key, int64_t value, BOOL *stop) {
- #pragma unused(stop)
+ [self enumerateKeysAndInt64sUsingBlock:^(int32_t key, int64_t value, __unused BOOL *stop) {
block([NSString stringWithFormat:@"%d", key], [NSString stringWithFormat:@"%lld", value]);
}];
}
@@ -3949,8 +3877,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithBools:NULL forKeys:NULL count:0];
}
@@ -4056,8 +3983,7 @@
}
- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
- [self enumerateKeysAndBoolsUsingBlock:^(int32_t key, BOOL value, BOOL *stop) {
- #pragma unused(stop)
+ [self enumerateKeysAndBoolsUsingBlock:^(int32_t key, BOOL value, __unused BOOL *stop) {
block([NSString stringWithFormat:@"%d", key], (value ? @"true" : @"false"));
}];
}
@@ -4132,8 +4058,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithFloats:NULL forKeys:NULL count:0];
}
@@ -4239,8 +4164,7 @@
}
- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
- [self enumerateKeysAndFloatsUsingBlock:^(int32_t key, float value, BOOL *stop) {
- #pragma unused(stop)
+ [self enumerateKeysAndFloatsUsingBlock:^(int32_t key, float value, __unused BOOL *stop) {
block([NSString stringWithFormat:@"%d", key], [NSString stringWithFormat:@"%.*g", FLT_DIG, value]);
}];
}
@@ -4315,8 +4239,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithDoubles:NULL forKeys:NULL count:0];
}
@@ -4422,8 +4345,7 @@
}
- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
- [self enumerateKeysAndDoublesUsingBlock:^(int32_t key, double value, BOOL *stop) {
- #pragma unused(stop)
+ [self enumerateKeysAndDoublesUsingBlock:^(int32_t key, double value, __unused BOOL *stop) {
block([NSString stringWithFormat:@"%d", key], [NSString stringWithFormat:@"%.*lg", DBL_DIG, value]);
}];
}
@@ -4511,8 +4433,7 @@
}
- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
- capacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+ capacity:(__unused NSUInteger)numItems {
return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0];
}
@@ -4630,8 +4551,7 @@
}
- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
- [self enumerateKeysAndRawValuesUsingBlock:^(int32_t key, int32_t value, BOOL *stop) {
- #pragma unused(stop)
+ [self enumerateKeysAndRawValuesUsingBlock:^(int32_t key, int32_t value, __unused BOOL *stop) {
block([NSString stringWithFormat:@"%d", key], @(value));
}];
}
@@ -4754,8 +4674,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithObjects:NULL forKeys:NULL count:0];
}
@@ -4885,8 +4804,7 @@
}
- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
- [self enumerateKeysAndObjectsUsingBlock:^(int32_t key, id object, BOOL *stop) {
- #pragma unused(stop)
+ [self enumerateKeysAndObjectsUsingBlock:^(int32_t key, id object, __unused BOOL *stop) {
block([NSString stringWithFormat:@"%d", key], object);
}];
}
@@ -4926,10 +4844,8 @@
@end
-// clang-format on
//%PDDM-EXPAND DICTIONARY_IMPL_FOR_POD_KEY(UInt64, uint64_t)
// This block of code is generated, do not edit it directly.
-// clang-format off
#pragma mark - UInt64 -> UInt32
@@ -4967,8 +4883,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithUInt32s:NULL forKeys:NULL count:0];
}
@@ -5074,8 +4989,7 @@
}
- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
- [self enumerateKeysAndUInt32sUsingBlock:^(uint64_t key, uint32_t value, BOOL *stop) {
- #pragma unused(stop)
+ [self enumerateKeysAndUInt32sUsingBlock:^(uint64_t key, uint32_t value, __unused BOOL *stop) {
block([NSString stringWithFormat:@"%llu", key], [NSString stringWithFormat:@"%u", value]);
}];
}
@@ -5150,8 +5064,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithInt32s:NULL forKeys:NULL count:0];
}
@@ -5257,8 +5170,7 @@
}
- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
- [self enumerateKeysAndInt32sUsingBlock:^(uint64_t key, int32_t value, BOOL *stop) {
- #pragma unused(stop)
+ [self enumerateKeysAndInt32sUsingBlock:^(uint64_t key, int32_t value, __unused BOOL *stop) {
block([NSString stringWithFormat:@"%llu", key], [NSString stringWithFormat:@"%d", value]);
}];
}
@@ -5333,8 +5245,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithUInt64s:NULL forKeys:NULL count:0];
}
@@ -5440,8 +5351,7 @@
}
- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
- [self enumerateKeysAndUInt64sUsingBlock:^(uint64_t key, uint64_t value, BOOL *stop) {
- #pragma unused(stop)
+ [self enumerateKeysAndUInt64sUsingBlock:^(uint64_t key, uint64_t value, __unused BOOL *stop) {
block([NSString stringWithFormat:@"%llu", key], [NSString stringWithFormat:@"%llu", value]);
}];
}
@@ -5516,8 +5426,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithInt64s:NULL forKeys:NULL count:0];
}
@@ -5623,8 +5532,7 @@
}
- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
- [self enumerateKeysAndInt64sUsingBlock:^(uint64_t key, int64_t value, BOOL *stop) {
- #pragma unused(stop)
+ [self enumerateKeysAndInt64sUsingBlock:^(uint64_t key, int64_t value, __unused BOOL *stop) {
block([NSString stringWithFormat:@"%llu", key], [NSString stringWithFormat:@"%lld", value]);
}];
}
@@ -5699,8 +5607,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithBools:NULL forKeys:NULL count:0];
}
@@ -5806,8 +5713,7 @@
}
- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
- [self enumerateKeysAndBoolsUsingBlock:^(uint64_t key, BOOL value, BOOL *stop) {
- #pragma unused(stop)
+ [self enumerateKeysAndBoolsUsingBlock:^(uint64_t key, BOOL value, __unused BOOL *stop) {
block([NSString stringWithFormat:@"%llu", key], (value ? @"true" : @"false"));
}];
}
@@ -5882,8 +5788,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithFloats:NULL forKeys:NULL count:0];
}
@@ -5989,8 +5894,7 @@
}
- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
- [self enumerateKeysAndFloatsUsingBlock:^(uint64_t key, float value, BOOL *stop) {
- #pragma unused(stop)
+ [self enumerateKeysAndFloatsUsingBlock:^(uint64_t key, float value, __unused BOOL *stop) {
block([NSString stringWithFormat:@"%llu", key], [NSString stringWithFormat:@"%.*g", FLT_DIG, value]);
}];
}
@@ -6065,8 +5969,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithDoubles:NULL forKeys:NULL count:0];
}
@@ -6172,8 +6075,7 @@
}
- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
- [self enumerateKeysAndDoublesUsingBlock:^(uint64_t key, double value, BOOL *stop) {
- #pragma unused(stop)
+ [self enumerateKeysAndDoublesUsingBlock:^(uint64_t key, double value, __unused BOOL *stop) {
block([NSString stringWithFormat:@"%llu", key], [NSString stringWithFormat:@"%.*lg", DBL_DIG, value]);
}];
}
@@ -6261,8 +6163,7 @@
}
- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
- capacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+ capacity:(__unused NSUInteger)numItems {
return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0];
}
@@ -6380,8 +6281,7 @@
}
- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
- [self enumerateKeysAndRawValuesUsingBlock:^(uint64_t key, int32_t value, BOOL *stop) {
- #pragma unused(stop)
+ [self enumerateKeysAndRawValuesUsingBlock:^(uint64_t key, int32_t value, __unused BOOL *stop) {
block([NSString stringWithFormat:@"%llu", key], @(value));
}];
}
@@ -6504,8 +6404,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithObjects:NULL forKeys:NULL count:0];
}
@@ -6635,8 +6534,7 @@
}
- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
- [self enumerateKeysAndObjectsUsingBlock:^(uint64_t key, id object, BOOL *stop) {
- #pragma unused(stop)
+ [self enumerateKeysAndObjectsUsingBlock:^(uint64_t key, id object, __unused BOOL *stop) {
block([NSString stringWithFormat:@"%llu", key], object);
}];
}
@@ -6676,10 +6574,8 @@
@end
-// clang-format on
//%PDDM-EXPAND DICTIONARY_IMPL_FOR_POD_KEY(Int64, int64_t)
// This block of code is generated, do not edit it directly.
-// clang-format off
#pragma mark - Int64 -> UInt32
@@ -6717,8 +6613,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithUInt32s:NULL forKeys:NULL count:0];
}
@@ -6824,8 +6719,7 @@
}
- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
- [self enumerateKeysAndUInt32sUsingBlock:^(int64_t key, uint32_t value, BOOL *stop) {
- #pragma unused(stop)
+ [self enumerateKeysAndUInt32sUsingBlock:^(int64_t key, uint32_t value, __unused BOOL *stop) {
block([NSString stringWithFormat:@"%lld", key], [NSString stringWithFormat:@"%u", value]);
}];
}
@@ -6900,8 +6794,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithInt32s:NULL forKeys:NULL count:0];
}
@@ -7007,8 +6900,7 @@
}
- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
- [self enumerateKeysAndInt32sUsingBlock:^(int64_t key, int32_t value, BOOL *stop) {
- #pragma unused(stop)
+ [self enumerateKeysAndInt32sUsingBlock:^(int64_t key, int32_t value, __unused BOOL *stop) {
block([NSString stringWithFormat:@"%lld", key], [NSString stringWithFormat:@"%d", value]);
}];
}
@@ -7083,8 +6975,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithUInt64s:NULL forKeys:NULL count:0];
}
@@ -7190,8 +7081,7 @@
}
- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
- [self enumerateKeysAndUInt64sUsingBlock:^(int64_t key, uint64_t value, BOOL *stop) {
- #pragma unused(stop)
+ [self enumerateKeysAndUInt64sUsingBlock:^(int64_t key, uint64_t value, __unused BOOL *stop) {
block([NSString stringWithFormat:@"%lld", key], [NSString stringWithFormat:@"%llu", value]);
}];
}
@@ -7266,8 +7156,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithInt64s:NULL forKeys:NULL count:0];
}
@@ -7373,8 +7262,7 @@
}
- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
- [self enumerateKeysAndInt64sUsingBlock:^(int64_t key, int64_t value, BOOL *stop) {
- #pragma unused(stop)
+ [self enumerateKeysAndInt64sUsingBlock:^(int64_t key, int64_t value, __unused BOOL *stop) {
block([NSString stringWithFormat:@"%lld", key], [NSString stringWithFormat:@"%lld", value]);
}];
}
@@ -7449,8 +7337,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithBools:NULL forKeys:NULL count:0];
}
@@ -7556,8 +7443,7 @@
}
- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
- [self enumerateKeysAndBoolsUsingBlock:^(int64_t key, BOOL value, BOOL *stop) {
- #pragma unused(stop)
+ [self enumerateKeysAndBoolsUsingBlock:^(int64_t key, BOOL value, __unused BOOL *stop) {
block([NSString stringWithFormat:@"%lld", key], (value ? @"true" : @"false"));
}];
}
@@ -7632,8 +7518,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithFloats:NULL forKeys:NULL count:0];
}
@@ -7739,8 +7624,7 @@
}
- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
- [self enumerateKeysAndFloatsUsingBlock:^(int64_t key, float value, BOOL *stop) {
- #pragma unused(stop)
+ [self enumerateKeysAndFloatsUsingBlock:^(int64_t key, float value, __unused BOOL *stop) {
block([NSString stringWithFormat:@"%lld", key], [NSString stringWithFormat:@"%.*g", FLT_DIG, value]);
}];
}
@@ -7815,8 +7699,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithDoubles:NULL forKeys:NULL count:0];
}
@@ -7922,8 +7805,7 @@
}
- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
- [self enumerateKeysAndDoublesUsingBlock:^(int64_t key, double value, BOOL *stop) {
- #pragma unused(stop)
+ [self enumerateKeysAndDoublesUsingBlock:^(int64_t key, double value, __unused BOOL *stop) {
block([NSString stringWithFormat:@"%lld", key], [NSString stringWithFormat:@"%.*lg", DBL_DIG, value]);
}];
}
@@ -8011,8 +7893,7 @@
}
- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
- capacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+ capacity:(__unused NSUInteger)numItems {
return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0];
}
@@ -8130,8 +8011,7 @@
}
- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
- [self enumerateKeysAndRawValuesUsingBlock:^(int64_t key, int32_t value, BOOL *stop) {
- #pragma unused(stop)
+ [self enumerateKeysAndRawValuesUsingBlock:^(int64_t key, int32_t value, __unused BOOL *stop) {
block([NSString stringWithFormat:@"%lld", key], @(value));
}];
}
@@ -8254,8 +8134,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithObjects:NULL forKeys:NULL count:0];
}
@@ -8385,8 +8264,7 @@
}
- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
- [self enumerateKeysAndObjectsUsingBlock:^(int64_t key, id object, BOOL *stop) {
- #pragma unused(stop)
+ [self enumerateKeysAndObjectsUsingBlock:^(int64_t key, id object, __unused BOOL *stop) {
block([NSString stringWithFormat:@"%lld", key], object);
}];
}
@@ -8426,10 +8304,8 @@
@end
-// clang-format on
//%PDDM-EXPAND DICTIONARY_POD_IMPL_FOR_KEY(String, NSString, *, OBJECT)
// This block of code is generated, do not edit it directly.
-// clang-format off
#pragma mark - String -> UInt32
@@ -8471,8 +8347,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithUInt32s:NULL forKeys:NULL count:0];
}
@@ -8578,8 +8453,7 @@
}
- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
- [self enumerateKeysAndUInt32sUsingBlock:^(NSString *key, uint32_t value, BOOL *stop) {
- #pragma unused(stop)
+ [self enumerateKeysAndUInt32sUsingBlock:^(NSString *key, uint32_t value, __unused BOOL *stop) {
block(key, [NSString stringWithFormat:@"%u", value]);
}];
}
@@ -8662,8 +8536,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithInt32s:NULL forKeys:NULL count:0];
}
@@ -8769,8 +8642,7 @@
}
- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
- [self enumerateKeysAndInt32sUsingBlock:^(NSString *key, int32_t value, BOOL *stop) {
- #pragma unused(stop)
+ [self enumerateKeysAndInt32sUsingBlock:^(NSString *key, int32_t value, __unused BOOL *stop) {
block(key, [NSString stringWithFormat:@"%d", value]);
}];
}
@@ -8853,8 +8725,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithUInt64s:NULL forKeys:NULL count:0];
}
@@ -8960,8 +8831,7 @@
}
- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
- [self enumerateKeysAndUInt64sUsingBlock:^(NSString *key, uint64_t value, BOOL *stop) {
- #pragma unused(stop)
+ [self enumerateKeysAndUInt64sUsingBlock:^(NSString *key, uint64_t value, __unused BOOL *stop) {
block(key, [NSString stringWithFormat:@"%llu", value]);
}];
}
@@ -9044,8 +8914,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithInt64s:NULL forKeys:NULL count:0];
}
@@ -9151,8 +9020,7 @@
}
- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
- [self enumerateKeysAndInt64sUsingBlock:^(NSString *key, int64_t value, BOOL *stop) {
- #pragma unused(stop)
+ [self enumerateKeysAndInt64sUsingBlock:^(NSString *key, int64_t value, __unused BOOL *stop) {
block(key, [NSString stringWithFormat:@"%lld", value]);
}];
}
@@ -9235,8 +9103,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithBools:NULL forKeys:NULL count:0];
}
@@ -9342,8 +9209,7 @@
}
- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
- [self enumerateKeysAndBoolsUsingBlock:^(NSString *key, BOOL value, BOOL *stop) {
- #pragma unused(stop)
+ [self enumerateKeysAndBoolsUsingBlock:^(NSString *key, BOOL value, __unused BOOL *stop) {
block(key, (value ? @"true" : @"false"));
}];
}
@@ -9426,8 +9292,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithFloats:NULL forKeys:NULL count:0];
}
@@ -9533,8 +9398,7 @@
}
- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
- [self enumerateKeysAndFloatsUsingBlock:^(NSString *key, float value, BOOL *stop) {
- #pragma unused(stop)
+ [self enumerateKeysAndFloatsUsingBlock:^(NSString *key, float value, __unused BOOL *stop) {
block(key, [NSString stringWithFormat:@"%.*g", FLT_DIG, value]);
}];
}
@@ -9617,8 +9481,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithDoubles:NULL forKeys:NULL count:0];
}
@@ -9724,8 +9587,7 @@
}
- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
- [self enumerateKeysAndDoublesUsingBlock:^(NSString *key, double value, BOOL *stop) {
- #pragma unused(stop)
+ [self enumerateKeysAndDoublesUsingBlock:^(NSString *key, double value, __unused BOOL *stop) {
block(key, [NSString stringWithFormat:@"%.*lg", DBL_DIG, value]);
}];
}
@@ -9821,8 +9683,7 @@
}
- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
- capacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+ capacity:(__unused NSUInteger)numItems {
return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0];
}
@@ -9940,8 +9801,7 @@
}
- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
- [self enumerateKeysAndRawValuesUsingBlock:^(NSString *key, int32_t value, BOOL *stop) {
- #pragma unused(stop)
+ [self enumerateKeysAndRawValuesUsingBlock:^(NSString *key, int32_t value, __unused BOOL *stop) {
block(key, @(value));
}];
}
@@ -10032,13 +9892,11 @@
@end
-// clang-format on
//%PDDM-EXPAND-END (5 expansions)
//%PDDM-EXPAND DICTIONARY_BOOL_KEY_TO_POD_IMPL(UInt32, uint32_t)
// This block of code is generated, do not edit it directly.
-// clang-format off
#pragma mark - Bool -> UInt32
@@ -10081,8 +9939,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithUInt32s:NULL forKeys:NULL count:0];
}
@@ -10246,10 +10103,8 @@
@end
-// clang-format on
//%PDDM-EXPAND DICTIONARY_BOOL_KEY_TO_POD_IMPL(Int32, int32_t)
// This block of code is generated, do not edit it directly.
-// clang-format off
#pragma mark - Bool -> Int32
@@ -10292,8 +10147,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithInt32s:NULL forKeys:NULL count:0];
}
@@ -10457,10 +10311,8 @@
@end
-// clang-format on
//%PDDM-EXPAND DICTIONARY_BOOL_KEY_TO_POD_IMPL(UInt64, uint64_t)
// This block of code is generated, do not edit it directly.
-// clang-format off
#pragma mark - Bool -> UInt64
@@ -10503,8 +10355,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithUInt64s:NULL forKeys:NULL count:0];
}
@@ -10668,10 +10519,8 @@
@end
-// clang-format on
//%PDDM-EXPAND DICTIONARY_BOOL_KEY_TO_POD_IMPL(Int64, int64_t)
// This block of code is generated, do not edit it directly.
-// clang-format off
#pragma mark - Bool -> Int64
@@ -10714,8 +10563,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithInt64s:NULL forKeys:NULL count:0];
}
@@ -10879,10 +10727,8 @@
@end
-// clang-format on
//%PDDM-EXPAND DICTIONARY_BOOL_KEY_TO_POD_IMPL(Bool, BOOL)
// This block of code is generated, do not edit it directly.
-// clang-format off
#pragma mark - Bool -> Bool
@@ -10925,8 +10771,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithBools:NULL forKeys:NULL count:0];
}
@@ -11090,10 +10935,8 @@
@end
-// clang-format on
//%PDDM-EXPAND DICTIONARY_BOOL_KEY_TO_POD_IMPL(Float, float)
// This block of code is generated, do not edit it directly.
-// clang-format off
#pragma mark - Bool -> Float
@@ -11136,8 +10979,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithFloats:NULL forKeys:NULL count:0];
}
@@ -11301,10 +11143,8 @@
@end
-// clang-format on
//%PDDM-EXPAND DICTIONARY_BOOL_KEY_TO_POD_IMPL(Double, double)
// This block of code is generated, do not edit it directly.
-// clang-format off
#pragma mark - Bool -> Double
@@ -11347,8 +11187,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithDoubles:NULL forKeys:NULL count:0];
}
@@ -11512,10 +11351,8 @@
@end
-// clang-format on
//%PDDM-EXPAND DICTIONARY_BOOL_KEY_TO_OBJECT_IMPL(Object, id)
// This block of code is generated, do not edit it directly.
-// clang-format off
#pragma mark - Bool -> Object
@@ -11557,8 +11394,7 @@
return self;
}
-- (instancetype)initWithCapacity:(NSUInteger)numItems {
- #pragma unused(numItems)
+- (instancetype)initWithCapacity:(__unused NSUInteger)numItems {
return [self initWithObjects:NULL forKeys:NULL count:0];
}
@@ -11744,9 +11580,10 @@
@end
-// clang-format on
//%PDDM-EXPAND-END (8 expansions)
+// clang-format on
+
#pragma mark - Bool -> Enum
@implementation GPBBoolEnumDictionary {
@@ -11767,8 +11604,8 @@
}
- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
- rawValues:(const int32_t [])rawValues
- forKeys:(const BOOL [])keys
+ rawValues:(const int32_t[])rawValues
+ forKeys:(const BOOL[])keys
count:(NSUInteger)count {
self = [super init];
if (self) {
@@ -11801,15 +11638,13 @@
}
- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func
- capacity:(NSUInteger)numItems {
-#pragma unused(numItems)
+ capacity:(__unused NSUInteger)numItems {
return [self initWithValidationFunction:func rawValues:NULL forKeys:NULL count:0];
}
#if !defined(NS_BLOCK_ASSERTIONS)
- (void)dealloc {
- NSAssert(!_autocreator,
- @"%@: Autocreator must be cleared before release, autocreator: %@",
+ NSAssert(!_autocreator, @"%@: Autocreator must be cleared before release, autocreator: %@",
[self class], _autocreator);
[super dealloc];
}
@@ -11858,7 +11693,7 @@
return (_valueSet[0] ? 1 : 0) + (_valueSet[1] ? 1 : 0);
}
-- (BOOL)getEnum:(int32_t*)value forKey:(BOOL)key {
+- (BOOL)getEnum:(int32_t *)value forKey:(BOOL)key {
int idx = (key ? 1 : 0);
if (_valueSet[idx]) {
if (value) {
@@ -11873,7 +11708,7 @@
return NO;
}
-- (BOOL)getRawValue:(int32_t*)rawValue forKey:(BOOL)key {
+- (BOOL)getRawValue:(int32_t *)rawValue forKey:(BOOL)key {
int idx = (key ? 1 : 0);
if (_valueSet[idx]) {
if (rawValue) {
@@ -11884,8 +11719,8 @@
return NO;
}
-- (void)enumerateKeysAndRawValuesUsingBlock:
- (void (NS_NOESCAPE ^)(BOOL key, int32_t value, BOOL *stop))block {
+- (void)enumerateKeysAndRawValuesUsingBlock:(void(NS_NOESCAPE ^)(BOOL key, int32_t value,
+ BOOL *stop))block {
BOOL stop = NO;
if (_valueSet[0]) {
block(NO, _values[0], &stop);
@@ -11895,8 +11730,8 @@
}
}
-- (void)enumerateKeysAndEnumsUsingBlock:
- (void (NS_NOESCAPE ^)(BOOL key, int32_t rawValue, BOOL *stop))block {
+- (void)enumerateKeysAndEnumsUsingBlock:(void(NS_NOESCAPE ^)(BOOL key, int32_t rawValue,
+ BOOL *stop))block {
BOOL stop = NO;
GPBEnumValidationFunc func = _validationFunc;
int32_t validatedValue;
@@ -11916,9 +11751,10 @@
}
}
+// clang-format off
+
//%PDDM-EXPAND SERIAL_DATA_FOR_ENTRY_POD_Enum(Bool)
// This block of code is generated, do not edit it directly.
-// clang-format off
- (NSData *)serializedDataForUnknownValue:(int32_t)value
forKey:(GPBGenericValue *)key
@@ -11933,9 +11769,10 @@
return data;
}
-// clang-format on
//%PDDM-EXPAND-END SERIAL_DATA_FOR_ENTRY_POD_Enum(Bool)
+// clang-format on
+
- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field {
GPBDataType valueDataType = GPBGetFieldDataType(field);
NSUInteger count = 0;
@@ -11972,7 +11809,7 @@
}
}
-- (void)enumerateForTextFormat:(void (NS_NOESCAPE ^)(id keyObj, id valueObj))block {
+- (void)enumerateForTextFormat:(void(NS_NOESCAPE ^)(id keyObj, id valueObj))block {
if (_valueSet[0]) {
block(@"false", @(_values[0]));
}
@@ -11981,8 +11818,7 @@
}
}
-- (void)setGPBGenericValue:(GPBGenericValue *)value
- forGPBGenericValueKey:(GPBGenericValue *)key {
+- (void)setGPBGenericValue:(GPBGenericValue *)value forGPBGenericValueKey:(GPBGenericValue *)key {
int idx = (key->valueBool ? 1 : 0);
_values[idx] = value->valueInt32;
_valueSet[idx] = YES;
@@ -12005,8 +11841,7 @@
- (void)setEnum:(int32_t)value forKey:(BOOL)key {
if (!_validationFunc(value)) {
[NSException raise:NSInvalidArgumentException
- format:@"GPBBoolEnumDictionary: Attempt to set an unknown enum value (%d)",
- value];
+ format:@"GPBBoolEnumDictionary: Attempt to set an unknown enum value (%d)", value];
}
int idx = (key ? 1 : 0);
_values[idx] = value;
@@ -12043,8 +11878,7 @@
}
- (void)dealloc {
- NSAssert(!_autocreator,
- @"%@: Autocreator must be cleared before release, autocreator: %@",
+ NSAssert(!_autocreator, @"%@: Autocreator must be cleared before release, autocreator: %@",
[self class], _autocreator);
[_dictionary release];
[super dealloc];
@@ -12052,14 +11886,12 @@
#pragma mark Required NSDictionary overrides
-- (instancetype)initWithObjects:(const id [])objects
- forKeys:(const id<NSCopying> [])keys
+- (instancetype)initWithObjects:(const id[])objects
+ forKeys:(const id<NSCopying>[])keys
count:(NSUInteger)count {
self = [super init];
if (self) {
- _dictionary = [[NSMutableDictionary alloc] initWithObjects:objects
- forKeys:keys
- count:count];
+ _dictionary = [[NSMutableDictionary alloc] initWithObjects:objects forKeys:keys count:count];
}
return self;
}
@@ -12132,16 +11964,12 @@
}
}
-- (void)enumerateKeysAndObjectsUsingBlock:(void (NS_NOESCAPE ^)(id key,
- id obj,
- BOOL *stop))block {
+- (void)enumerateKeysAndObjectsUsingBlock:(void(NS_NOESCAPE ^)(id key, id obj, BOOL *stop))block {
[_dictionary enumerateKeysAndObjectsUsingBlock:block];
}
- (void)enumerateKeysAndObjectsWithOptions:(NSEnumerationOptions)opts
- usingBlock:(void (NS_NOESCAPE ^)(id key,
- id obj,
- BOOL *stop))block {
+ usingBlock:(void(NS_NOESCAPE ^)(id key, id obj, BOOL *stop))block {
[_dictionary enumerateKeysAndObjectsWithOptions:opts usingBlock:block];
}
diff --git a/objectivec/GPBDictionary_PackagePrivate.h b/objectivec/GPBDictionary_PackagePrivate.h
index 15e4283..3735fa5 100644
--- a/objectivec/GPBDictionary_PackagePrivate.h
+++ b/objectivec/GPBDictionary_PackagePrivate.h
@@ -34,18 +34,20 @@
@class GPBCodedInputStream;
@class GPBCodedOutputStream;
-@class GPBExtensionRegistry;
+@protocol GPBExtensionRegistry;
@class GPBFieldDescriptor;
@protocol GPBDictionaryInternalsProtocol
- (size_t)computeSerializedSizeAsField:(GPBFieldDescriptor *)field;
- (void)writeToCodedOutputStream:(GPBCodedOutputStream *)outputStream
asField:(GPBFieldDescriptor *)field;
-- (void)setGPBGenericValue:(GPBGenericValue *)value
- forGPBGenericValueKey:(GPBGenericValue *)key;
+- (void)setGPBGenericValue:(GPBGenericValue *)value forGPBGenericValueKey:(GPBGenericValue *)key;
- (void)enumerateForTextFormat:(void (^)(id keyObj, id valueObj))block;
@end
+// Disable clang-format for the macros.
+// clang-format off
+
//%PDDM-DEFINE DICTIONARY_PRIV_INTERFACES_FOR_POD_KEY(KEY_NAME)
//%DICTIONARY_POD_PRIV_INTERFACES_FOR_KEY(KEY_NAME)
//%DICTIONARY_PRIVATE_INTERFACES(KEY_NAME, Object, Object)
@@ -82,7 +84,6 @@
//%PDDM-EXPAND DICTIONARY_PRIV_INTERFACES_FOR_POD_KEY(UInt32)
// This block of code is generated, do not edit it directly.
-// clang-format off
@interface GPBUInt32UInt32Dictionary () <GPBDictionaryInternalsProtocol> {
@package
@@ -144,10 +145,8 @@
__attribute__((ns_returns_retained));
@end
-// clang-format on
//%PDDM-EXPAND DICTIONARY_PRIV_INTERFACES_FOR_POD_KEY(Int32)
// This block of code is generated, do not edit it directly.
-// clang-format off
@interface GPBInt32UInt32Dictionary () <GPBDictionaryInternalsProtocol> {
@package
@@ -209,10 +208,8 @@
__attribute__((ns_returns_retained));
@end
-// clang-format on
//%PDDM-EXPAND DICTIONARY_PRIV_INTERFACES_FOR_POD_KEY(UInt64)
// This block of code is generated, do not edit it directly.
-// clang-format off
@interface GPBUInt64UInt32Dictionary () <GPBDictionaryInternalsProtocol> {
@package
@@ -274,10 +271,8 @@
__attribute__((ns_returns_retained));
@end
-// clang-format on
//%PDDM-EXPAND DICTIONARY_PRIV_INTERFACES_FOR_POD_KEY(Int64)
// This block of code is generated, do not edit it directly.
-// clang-format off
@interface GPBInt64UInt32Dictionary () <GPBDictionaryInternalsProtocol> {
@package
@@ -339,10 +334,8 @@
__attribute__((ns_returns_retained));
@end
-// clang-format on
//%PDDM-EXPAND DICTIONARY_PRIV_INTERFACES_FOR_POD_KEY(Bool)
// This block of code is generated, do not edit it directly.
-// clang-format off
@interface GPBBoolUInt32Dictionary () <GPBDictionaryInternalsProtocol> {
@package
@@ -404,10 +397,8 @@
__attribute__((ns_returns_retained));
@end
-// clang-format on
//%PDDM-EXPAND DICTIONARY_POD_PRIV_INTERFACES_FOR_KEY(String)
// This block of code is generated, do not edit it directly.
-// clang-format off
@interface GPBStringUInt32Dictionary () <GPBDictionaryInternalsProtocol> {
@package
@@ -460,13 +451,14 @@
keyDataType:(GPBDataType)keyDataType;
@end
-// clang-format on
//%PDDM-EXPAND-END (6 expansions)
+// clang-format on
+
#pragma mark - NSDictionary Subclass
@interface GPBAutocreatedDictionary : NSMutableDictionary {
- @package
+ @package
GPB_UNSAFE_UNRETAINED GPBMessage *_autocreator;
}
@end
@@ -477,24 +469,20 @@
// Helper to compute size when an NSDictionary is used for the map instead
// of a custom type.
-size_t GPBDictionaryComputeSizeInternalHelper(NSDictionary *dict,
- GPBFieldDescriptor *field);
+size_t GPBDictionaryComputeSizeInternalHelper(NSDictionary *dict, GPBFieldDescriptor *field);
// Helper to write out when an NSDictionary is used for the map instead
// of a custom type.
-void GPBDictionaryWriteToStreamInternalHelper(
- GPBCodedOutputStream *outputStream, NSDictionary *dict,
- GPBFieldDescriptor *field);
+void GPBDictionaryWriteToStreamInternalHelper(GPBCodedOutputStream *outputStream,
+ NSDictionary *dict, GPBFieldDescriptor *field);
// Helper to check message initialization when an NSDictionary is used for
// the map instead of a custom type.
-BOOL GPBDictionaryIsInitializedInternalHelper(NSDictionary *dict,
- GPBFieldDescriptor *field);
+BOOL GPBDictionaryIsInitializedInternalHelper(NSDictionary *dict, GPBFieldDescriptor *field);
// Helper to read a map instead.
void GPBDictionaryReadEntry(id mapDictionary, GPBCodedInputStream *stream,
- GPBExtensionRegistry *registry,
- GPBFieldDescriptor *field,
+ id<GPBExtensionRegistry> registry, GPBFieldDescriptor *field,
GPBMessage *parentMessage);
CF_EXTERN_C_END
diff --git a/objectivec/GPBDuration.pbobjc.h b/objectivec/GPBDuration.pbobjc.h
index d6236b0..fda9b47 100644
--- a/objectivec/GPBDuration.pbobjc.h
+++ b/objectivec/GPBDuration.pbobjc.h
@@ -1,6 +1,8 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: google/protobuf/duration.proto
+// clang-format off
+
#import "GPBDescriptor.h"
#import "GPBMessage.h"
#import "GPBRootObject.h"
@@ -131,3 +133,5 @@
#pragma clang diagnostic pop
// @@protoc_insertion_point(global_scope)
+
+// clange-format on
diff --git a/objectivec/GPBDuration.pbobjc.m b/objectivec/GPBDuration.pbobjc.m
index 11ba5e5..bc61092 100644
--- a/objectivec/GPBDuration.pbobjc.m
+++ b/objectivec/GPBDuration.pbobjc.m
@@ -1,6 +1,8 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: google/protobuf/duration.proto
+// clang-format off
+
#import "GPBProtocolBuffers_RuntimeSupport.h"
#import "GPBDuration.pbobjc.h"
@@ -93,3 +95,5 @@
#pragma clang diagnostic pop
// @@protoc_insertion_point(global_scope)
+
+// clange-format on
diff --git a/objectivec/GPBEmpty.pbobjc.h b/objectivec/GPBEmpty.pbobjc.h
index 5878223..26ef9a6 100644
--- a/objectivec/GPBEmpty.pbobjc.h
+++ b/objectivec/GPBEmpty.pbobjc.h
@@ -1,6 +1,8 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: google/protobuf/empty.proto
+// clang-format off
+
#import "GPBDescriptor.h"
#import "GPBMessage.h"
#import "GPBRootObject.h"
@@ -58,3 +60,5 @@
#pragma clang diagnostic pop
// @@protoc_insertion_point(global_scope)
+
+// clange-format on
diff --git a/objectivec/GPBEmpty.pbobjc.m b/objectivec/GPBEmpty.pbobjc.m
index 8aefddb..49f7030 100644
--- a/objectivec/GPBEmpty.pbobjc.m
+++ b/objectivec/GPBEmpty.pbobjc.m
@@ -1,6 +1,8 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: google/protobuf/empty.proto
+// clang-format off
+
#import "GPBProtocolBuffers_RuntimeSupport.h"
#import "GPBEmpty.pbobjc.h"
@@ -69,3 +71,5 @@
#pragma clang diagnostic pop
// @@protoc_insertion_point(global_scope)
+
+// clange-format on
diff --git a/objectivec/GPBExtensionInternals.h b/objectivec/GPBExtensionInternals.h
index 2b980ae..af2aba6 100644
--- a/objectivec/GPBExtensionInternals.h
+++ b/objectivec/GPBExtensionInternals.h
@@ -34,17 +34,14 @@
@class GPBCodedInputStream;
@class GPBCodedOutputStream;
-@class GPBExtensionRegistry;
+@protocol GPBExtensionRegistry;
-void GPBExtensionMergeFromInputStream(GPBExtensionDescriptor *extension,
- BOOL isPackedOnStream,
+void GPBExtensionMergeFromInputStream(GPBExtensionDescriptor *extension, BOOL isPackedOnStream,
GPBCodedInputStream *input,
- GPBExtensionRegistry *extensionRegistry,
+ id<GPBExtensionRegistry> extensionRegistry,
GPBMessage *message);
-size_t GPBComputeExtensionSerializedSizeIncludingTag(
- GPBExtensionDescriptor *extension, id value);
+size_t GPBComputeExtensionSerializedSizeIncludingTag(GPBExtensionDescriptor *extension, id value);
-void GPBWriteExtensionValueToOutputStream(GPBExtensionDescriptor *extension,
- id value,
+void GPBWriteExtensionValueToOutputStream(GPBExtensionDescriptor *extension, id value,
GPBCodedOutputStream *output);
diff --git a/objectivec/GPBExtensionInternals.m b/objectivec/GPBExtensionInternals.m
index bacec57..dbfa100 100644
--- a/objectivec/GPBExtensionInternals.m
+++ b/objectivec/GPBExtensionInternals.m
@@ -40,7 +40,7 @@
static id NewSingleValueFromInputStream(GPBExtensionDescriptor *extension,
GPBCodedInputStream *input,
- GPBExtensionRegistry *extensionRegistry,
+ id<GPBExtensionRegistry> extensionRegistry,
GPBMessage *existingValue)
__attribute__((ns_returns_retained));
@@ -65,11 +65,11 @@
}
static size_t ComputePBSerializedSizeNoTagOfObject(GPBDataType dataType, id object) {
-#define FIELD_CASE(TYPE, ACCESSOR) \
- case GPBDataType##TYPE: \
+#define FIELD_CASE(TYPE, ACCESSOR) \
+ case GPBDataType##TYPE: \
return GPBCompute##TYPE##SizeNoTag([(NSNumber *)object ACCESSOR]);
-#define FIELD_CASE2(TYPE) \
- case GPBDataType##TYPE: \
+#define FIELD_CASE2(TYPE) \
+ case GPBDataType##TYPE: \
return GPBCompute##TYPE##SizeNoTag(object);
switch (dataType) {
FIELD_CASE(Bool, boolValue)
@@ -95,14 +95,13 @@
#undef FIELD_CASE2
}
-static size_t ComputeSerializedSizeIncludingTagOfObject(
- GPBExtensionDescription *description, id object) {
-#define FIELD_CASE(TYPE, ACCESSOR) \
- case GPBDataType##TYPE: \
- return GPBCompute##TYPE##Size(description->fieldNumber, \
- [(NSNumber *)object ACCESSOR]);
-#define FIELD_CASE2(TYPE) \
- case GPBDataType##TYPE: \
+static size_t ComputeSerializedSizeIncludingTagOfObject(GPBExtensionDescription *description,
+ id object) {
+#define FIELD_CASE(TYPE, ACCESSOR) \
+ case GPBDataType##TYPE: \
+ return GPBCompute##TYPE##Size(description->fieldNumber, [(NSNumber *)object ACCESSOR]);
+#define FIELD_CASE2(TYPE) \
+ case GPBDataType##TYPE: \
return GPBCompute##TYPE##Size(description->fieldNumber, object);
switch (description->dataType) {
FIELD_CASE(Bool, boolValue)
@@ -124,8 +123,7 @@
FIELD_CASE2(Group)
case GPBDataTypeMessage:
if (GPBExtensionIsWireFormat(description)) {
- return GPBComputeMessageSetExtensionSize(description->fieldNumber,
- object);
+ return GPBComputeMessageSetExtensionSize(description->fieldNumber, object);
} else {
return GPBComputeMessageSize(description->fieldNumber, object);
}
@@ -134,8 +132,8 @@
#undef FIELD_CASE2
}
-static size_t ComputeSerializedSizeIncludingTagOfArray(
- GPBExtensionDescription *description, NSArray *values) {
+static size_t ComputeSerializedSizeIncludingTagOfArray(GPBExtensionDescription *description,
+ NSArray *values) {
if (GPBExtensionIsPacked(description)) {
size_t size = 0;
size_t typeSize = DataTypeSize(description->dataType);
@@ -143,8 +141,7 @@
size = values.count * typeSize;
} else {
for (id value in values) {
- size +=
- ComputePBSerializedSizeNoTagOfObject(description->dataType, value);
+ size += ComputePBSerializedSizeNoTagOfObject(description->dataType, value);
}
}
return size + GPBComputeTagSize(description->fieldNumber) +
@@ -158,13 +155,12 @@
}
}
-static void WriteObjectIncludingTagToCodedOutputStream(
- id object, GPBExtensionDescription *description,
- GPBCodedOutputStream *output) {
-#define FIELD_CASE(TYPE, ACCESSOR) \
- case GPBDataType##TYPE: \
- [output write##TYPE:description->fieldNumber \
- value:[(NSNumber *)object ACCESSOR]]; \
+static void WriteObjectIncludingTagToCodedOutputStream(id object,
+ GPBExtensionDescription *description,
+ GPBCodedOutputStream *output) {
+#define FIELD_CASE(TYPE, ACCESSOR) \
+ case GPBDataType##TYPE: \
+ [output write##TYPE:description->fieldNumber value:[(NSNumber *)object ACCESSOR]]; \
return;
#define FIELD_CASE2(TYPE) \
case GPBDataType##TYPE: \
@@ -200,9 +196,8 @@
#undef FIELD_CASE2
}
-static void WriteObjectNoTagToCodedOutputStream(
- id object, GPBExtensionDescription *description,
- GPBCodedOutputStream *output) {
+static void WriteObjectNoTagToCodedOutputStream(id object, GPBExtensionDescription *description,
+ GPBCodedOutputStream *output) {
#define FIELD_CASE(TYPE, ACCESSOR) \
case GPBDataType##TYPE: \
[output write##TYPE##NoTag:[(NSNumber *)object ACCESSOR]]; \
@@ -237,20 +232,18 @@
#undef FIELD_CASE2
}
-static void WriteArrayIncludingTagsToCodedOutputStream(
- NSArray *values, GPBExtensionDescription *description,
- GPBCodedOutputStream *output) {
+static void WriteArrayIncludingTagsToCodedOutputStream(NSArray *values,
+ GPBExtensionDescription *description,
+ GPBCodedOutputStream *output) {
if (GPBExtensionIsPacked(description)) {
- [output writeTag:description->fieldNumber
- format:GPBWireFormatLengthDelimited];
+ [output writeTag:description->fieldNumber format:GPBWireFormatLengthDelimited];
size_t dataSize = 0;
size_t typeSize = DataTypeSize(description->dataType);
if (typeSize != 0) {
dataSize = values.count * typeSize;
} else {
for (id value in values) {
- dataSize +=
- ComputePBSerializedSizeNoTagOfObject(description->dataType, value);
+ dataSize += ComputePBSerializedSizeNoTagOfObject(description->dataType, value);
}
}
[output writeRawVarintSizeTAs32:dataSize];
@@ -270,23 +263,18 @@
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdirect-ivar-access"
-void GPBExtensionMergeFromInputStream(GPBExtensionDescriptor *extension,
- BOOL isPackedOnStream,
+void GPBExtensionMergeFromInputStream(GPBExtensionDescriptor *extension, BOOL isPackedOnStream,
GPBCodedInputStream *input,
- GPBExtensionRegistry *extensionRegistry,
+ id<GPBExtensionRegistry> extensionRegistry,
GPBMessage *message) {
GPBExtensionDescription *description = extension->description_;
GPBCodedInputStreamState *state = &input->state_;
if (isPackedOnStream) {
- NSCAssert(GPBExtensionIsRepeated(description),
- @"How was it packed if it isn't repeated?");
+ NSCAssert(GPBExtensionIsRepeated(description), @"How was it packed if it isn't repeated?");
int32_t length = GPBCodedInputStreamReadInt32(state);
size_t limit = GPBCodedInputStreamPushLimit(state, length);
while (GPBCodedInputStreamBytesUntilLimit(state) > 0) {
- id value = NewSingleValueFromInputStream(extension,
- input,
- extensionRegistry,
- nil);
+ id value = NewSingleValueFromInputStream(extension, input, extensionRegistry, nil);
[message addExtension:extension value:value];
[value release];
}
@@ -297,10 +285,7 @@
if (!isRepeated && GPBDataTypeIsMessage(description->dataType)) {
existingValue = [message getExistingExtension:extension];
}
- id value = NewSingleValueFromInputStream(extension,
- input,
- extensionRegistry,
- existingValue);
+ id value = NewSingleValueFromInputStream(extension, input, extensionRegistry, existingValue);
if (isRepeated) {
[message addExtension:extension value:value];
} else {
@@ -310,8 +295,7 @@
}
}
-void GPBWriteExtensionValueToOutputStream(GPBExtensionDescriptor *extension,
- id value,
+void GPBWriteExtensionValueToOutputStream(GPBExtensionDescriptor *extension, id value,
GPBCodedOutputStream *output) {
GPBExtensionDescription *description = extension->description_;
if (GPBExtensionIsRepeated(description)) {
@@ -321,8 +305,7 @@
}
}
-size_t GPBComputeExtensionSerializedSizeIncludingTag(
- GPBExtensionDescriptor *extension, id value) {
+size_t GPBComputeExtensionSerializedSizeIncludingTag(GPBExtensionDescriptor *extension, id value) {
GPBExtensionDescription *description = extension->description_;
if (GPBExtensionIsRepeated(description)) {
return ComputeSerializedSizeIncludingTagOfArray(description, value);
@@ -334,27 +317,43 @@
// Note that this returns a retained value intentionally.
static id NewSingleValueFromInputStream(GPBExtensionDescriptor *extension,
GPBCodedInputStream *input,
- GPBExtensionRegistry *extensionRegistry,
+ id<GPBExtensionRegistry> extensionRegistry,
GPBMessage *existingValue) {
GPBExtensionDescription *description = extension->description_;
GPBCodedInputStreamState *state = &input->state_;
switch (description->dataType) {
- case GPBDataTypeBool: return [[NSNumber alloc] initWithBool:GPBCodedInputStreamReadBool(state)];
- case GPBDataTypeFixed32: return [[NSNumber alloc] initWithUnsignedInt:GPBCodedInputStreamReadFixed32(state)];
- case GPBDataTypeSFixed32: return [[NSNumber alloc] initWithInt:GPBCodedInputStreamReadSFixed32(state)];
- case GPBDataTypeFloat: return [[NSNumber alloc] initWithFloat:GPBCodedInputStreamReadFloat(state)];
- case GPBDataTypeFixed64: return [[NSNumber alloc] initWithUnsignedLongLong:GPBCodedInputStreamReadFixed64(state)];
- case GPBDataTypeSFixed64: return [[NSNumber alloc] initWithLongLong:GPBCodedInputStreamReadSFixed64(state)];
- case GPBDataTypeDouble: return [[NSNumber alloc] initWithDouble:GPBCodedInputStreamReadDouble(state)];
- case GPBDataTypeInt32: return [[NSNumber alloc] initWithInt:GPBCodedInputStreamReadInt32(state)];
- case GPBDataTypeInt64: return [[NSNumber alloc] initWithLongLong:GPBCodedInputStreamReadInt64(state)];
- case GPBDataTypeSInt32: return [[NSNumber alloc] initWithInt:GPBCodedInputStreamReadSInt32(state)];
- case GPBDataTypeSInt64: return [[NSNumber alloc] initWithLongLong:GPBCodedInputStreamReadSInt64(state)];
- case GPBDataTypeUInt32: return [[NSNumber alloc] initWithUnsignedInt:GPBCodedInputStreamReadUInt32(state)];
- case GPBDataTypeUInt64: return [[NSNumber alloc] initWithUnsignedLongLong:GPBCodedInputStreamReadUInt64(state)];
- case GPBDataTypeBytes: return GPBCodedInputStreamReadRetainedBytes(state);
- case GPBDataTypeString: return GPBCodedInputStreamReadRetainedString(state);
- case GPBDataTypeEnum: return [[NSNumber alloc] initWithInt:GPBCodedInputStreamReadEnum(state)];
+ case GPBDataTypeBool:
+ return [[NSNumber alloc] initWithBool:GPBCodedInputStreamReadBool(state)];
+ case GPBDataTypeFixed32:
+ return [[NSNumber alloc] initWithUnsignedInt:GPBCodedInputStreamReadFixed32(state)];
+ case GPBDataTypeSFixed32:
+ return [[NSNumber alloc] initWithInt:GPBCodedInputStreamReadSFixed32(state)];
+ case GPBDataTypeFloat:
+ return [[NSNumber alloc] initWithFloat:GPBCodedInputStreamReadFloat(state)];
+ case GPBDataTypeFixed64:
+ return [[NSNumber alloc] initWithUnsignedLongLong:GPBCodedInputStreamReadFixed64(state)];
+ case GPBDataTypeSFixed64:
+ return [[NSNumber alloc] initWithLongLong:GPBCodedInputStreamReadSFixed64(state)];
+ case GPBDataTypeDouble:
+ return [[NSNumber alloc] initWithDouble:GPBCodedInputStreamReadDouble(state)];
+ case GPBDataTypeInt32:
+ return [[NSNumber alloc] initWithInt:GPBCodedInputStreamReadInt32(state)];
+ case GPBDataTypeInt64:
+ return [[NSNumber alloc] initWithLongLong:GPBCodedInputStreamReadInt64(state)];
+ case GPBDataTypeSInt32:
+ return [[NSNumber alloc] initWithInt:GPBCodedInputStreamReadSInt32(state)];
+ case GPBDataTypeSInt64:
+ return [[NSNumber alloc] initWithLongLong:GPBCodedInputStreamReadSInt64(state)];
+ case GPBDataTypeUInt32:
+ return [[NSNumber alloc] initWithUnsignedInt:GPBCodedInputStreamReadUInt32(state)];
+ case GPBDataTypeUInt64:
+ return [[NSNumber alloc] initWithUnsignedLongLong:GPBCodedInputStreamReadUInt64(state)];
+ case GPBDataTypeBytes:
+ return GPBCodedInputStreamReadRetainedBytes(state);
+ case GPBDataTypeString:
+ return GPBCodedInputStreamReadRetainedString(state);
+ case GPBDataTypeEnum:
+ return [[NSNumber alloc] initWithInt:GPBCodedInputStreamReadEnum(state)];
case GPBDataTypeGroup:
case GPBDataTypeMessage: {
GPBMessage *message;
@@ -367,15 +366,14 @@
if (description->dataType == GPBDataTypeGroup) {
[input readGroup:description->fieldNumber
- message:message
+ message:message
extensionRegistry:extensionRegistry];
} else {
// description->dataType == GPBDataTypeMessage
if (GPBExtensionIsWireFormat(description)) {
// For MessageSet fields the message length will have already been
// read.
- [message mergeFromCodedInputStream:input
- extensionRegistry:extensionRegistry];
+ [message mergeFromCodedInputStream:input extensionRegistry:extensionRegistry];
} else {
[input readMessage:message extensionRegistry:extensionRegistry];
}
diff --git a/objectivec/GPBExtensionRegistry.h b/objectivec/GPBExtensionRegistry.h
index d79632d..2c1270b 100644
--- a/objectivec/GPBExtensionRegistry.h
+++ b/objectivec/GPBExtensionRegistry.h
@@ -41,6 +41,24 @@
* GPBExtensionRegistry in which you have registered any extensions that you
* want to be able to parse. Otherwise, those extensions will just be treated
* like unknown fields.
+ **/
+@protocol GPBExtensionRegistry <NSObject>
+
+/**
+ * Looks for the extension registered for the given field number on a given
+ * GPBDescriptor.
+ *
+ * @param descriptor The descriptor to look for a registered extension on.
+ * @param fieldNumber The field number of the extension to look for.
+ *
+ * @return The registered GPBExtensionDescriptor or nil if none was found.
+ **/
+- (nullable GPBExtensionDescriptor *)extensionForDescriptor:(GPBDescriptor *)descriptor
+ fieldNumber:(NSInteger)fieldNumber;
+@end
+
+/**
+ * A concrete implementation of `GPBExtensionRegistry`.
*
* The *Root classes provide `+extensionRegistry` for the extensions defined
* in a given file *and* all files it imports. You can also create a
@@ -54,7 +72,7 @@
* MyMessage *msg = [MyMessage parseData:data extensionRegistry:registry error:&parseError];
* ```
**/
-@interface GPBExtensionRegistry : NSObject<NSCopying>
+@interface GPBExtensionRegistry : NSObject <NSCopying, GPBExtensionRegistry>
/**
* Adds the given GPBExtensionDescriptor to this registry.
@@ -70,18 +88,6 @@
**/
- (void)addExtensions:(GPBExtensionRegistry *)registry;
-/**
- * Looks for the extension registered for the given field number on a given
- * GPBDescriptor.
- *
- * @param descriptor The descriptor to look for a registered extension on.
- * @param fieldNumber The field number of the extension to look for.
- *
- * @return The registered GPBExtensionDescriptor or nil if none was found.
- **/
-- (nullable GPBExtensionDescriptor *)extensionForDescriptor:(GPBDescriptor *)descriptor
- fieldNumber:(NSInteger)fieldNumber;
-
@end
NS_ASSUME_NONNULL_END
diff --git a/objectivec/GPBExtensionRegistry.m b/objectivec/GPBExtensionRegistry.m
index e3ff7c4..04f1bca 100644
--- a/objectivec/GPBExtensionRegistry.m
+++ b/objectivec/GPBExtensionRegistry.m
@@ -40,8 +40,8 @@
- (instancetype)init {
if ((self = [super init])) {
// The keys are ObjC classes, so straight up ptr comparisons are fine.
- mutableClassMap_ = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, NULL,
- &kCFTypeDictionaryValueCallBacks);
+ mutableClassMap_ =
+ CFDictionaryCreateMutable(kCFAllocatorDefault, 0, NULL, &kCFTypeDictionaryValueCallBacks);
}
return self;
}
@@ -69,13 +69,13 @@
}
Class containingMessageClass = extension.containingMessageClass;
- CFMutableDictionaryRef extensionMap = (CFMutableDictionaryRef)
- CFDictionaryGetValue(mutableClassMap_, containingMessageClass);
+ CFMutableDictionaryRef extensionMap =
+ (CFMutableDictionaryRef)CFDictionaryGetValue(mutableClassMap_, containingMessageClass);
if (extensionMap == nil) {
// Use a custom dictionary here because the keys are numbers and conversion
// back and forth from NSNumber isn't worth the cost.
- extensionMap = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, NULL,
- &kCFTypeDictionaryValueCallBacks);
+ extensionMap =
+ CFDictionaryCreateMutable(kCFAllocatorDefault, 0, NULL, &kCFTypeDictionaryValueCallBacks);
CFDictionarySetValue(mutableClassMap_, containingMessageClass, extensionMap);
CFRelease(extensionMap);
}
@@ -87,13 +87,11 @@
- (GPBExtensionDescriptor *)extensionForDescriptor:(GPBDescriptor *)descriptor
fieldNumber:(NSInteger)fieldNumber {
Class messageClass = descriptor.messageClass;
- CFMutableDictionaryRef extensionMap = (CFMutableDictionaryRef)
- CFDictionaryGetValue(mutableClassMap_, messageClass);
+ CFMutableDictionaryRef extensionMap =
+ (CFMutableDictionaryRef)CFDictionaryGetValue(mutableClassMap_, messageClass);
ssize_t key = fieldNumber;
GPBExtensionDescriptor *result =
- (extensionMap
- ? CFDictionaryGetValue(extensionMap, (const void *)key)
- : nil);
+ (extensionMap ? CFDictionaryGetValue(extensionMap, (const void *)key) : nil);
return result;
}
@@ -107,8 +105,8 @@
Class containingMessageClass = key;
CFMutableDictionaryRef otherExtensionMap = (CFMutableDictionaryRef)value;
- CFMutableDictionaryRef extensionMap = (CFMutableDictionaryRef)
- CFDictionaryGetValue(mutableClassMap, containingMessageClass);
+ CFMutableDictionaryRef extensionMap =
+ (CFMutableDictionaryRef)CFDictionaryGetValue(mutableClassMap, containingMessageClass);
if (extensionMap == nil) {
extensionMap = CFDictionaryCreateMutableCopy(kCFAllocatorDefault, 0, otherExtensionMap);
CFDictionarySetValue(mutableClassMap, containingMessageClass, extensionMap);
diff --git a/objectivec/GPBFieldMask.pbobjc.h b/objectivec/GPBFieldMask.pbobjc.h
index c4667b4..87898ad 100644
--- a/objectivec/GPBFieldMask.pbobjc.h
+++ b/objectivec/GPBFieldMask.pbobjc.h
@@ -1,6 +1,8 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: google/protobuf/field_mask.proto
+// clang-format off
+
#import "GPBDescriptor.h"
#import "GPBMessage.h"
#import "GPBRootObject.h"
@@ -247,7 +249,7 @@
/** The set of field mask paths. */
@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<NSString*> *pathsArray;
-/** The number of items in @c pathsArray without causing the array to be created. */
+/** The number of items in @c pathsArray without causing the container to be created. */
@property(nonatomic, readonly) NSUInteger pathsArray_Count;
@end
@@ -259,3 +261,5 @@
#pragma clang diagnostic pop
// @@protoc_insertion_point(global_scope)
+
+// clange-format on
diff --git a/objectivec/GPBFieldMask.pbobjc.m b/objectivec/GPBFieldMask.pbobjc.m
index ab25d3f..f820fd8 100644
--- a/objectivec/GPBFieldMask.pbobjc.m
+++ b/objectivec/GPBFieldMask.pbobjc.m
@@ -1,6 +1,8 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: google/protobuf/field_mask.proto
+// clang-format off
+
#import "GPBProtocolBuffers_RuntimeSupport.h"
#import "GPBFieldMask.pbobjc.h"
@@ -82,3 +84,5 @@
#pragma clang diagnostic pop
// @@protoc_insertion_point(global_scope)
+
+// clange-format on
diff --git a/objectivec/GPBMessage.h b/objectivec/GPBMessage.h
index 01253a4..76602b1 100644
--- a/objectivec/GPBMessage.h
+++ b/objectivec/GPBMessage.h
@@ -31,12 +31,12 @@
#import <Foundation/Foundation.h>
#import "GPBBootstrap.h"
+#import "GPBExtensionRegistry.h"
@class GPBDescriptor;
@class GPBCodedInputStream;
@class GPBCodedOutputStream;
@class GPBExtensionDescriptor;
-@class GPBExtensionRegistry;
@class GPBFieldDescriptor;
@class GPBUnknownFieldSet;
@@ -80,7 +80,7 @@
* @c +parseFromData:extensionRegistry:error: to provide an extension
* registry.
**/
-@interface GPBMessage : NSObject<NSSecureCoding, NSCopying>
+@interface GPBMessage : NSObject <NSSecureCoding, NSCopying>
// If you add an instance method/property to this class that may conflict with
// fields declared in protos, you need to update objective_helpers.cc. The main
@@ -147,7 +147,7 @@
* @return A new instance of the generated class.
**/
+ (nullable instancetype)parseFromData:(NSData *)data
- extensionRegistry:(nullable GPBExtensionRegistry *)extensionRegistry
+ extensionRegistry:(nullable id<GPBExtensionRegistry>)extensionRegistry
error:(NSError **)errorPtr;
/**
@@ -171,7 +171,7 @@
**/
+ (nullable instancetype)parseFromCodedInputStream:(GPBCodedInputStream *)input
extensionRegistry:
- (nullable GPBExtensionRegistry *)extensionRegistry
+ (nullable id<GPBExtensionRegistry>)extensionRegistry
error:(NSError **)errorPtr;
/**
@@ -196,7 +196,7 @@
**/
+ (nullable instancetype)parseDelimitedFromCodedInputStream:(GPBCodedInputStream *)input
extensionRegistry:
- (nullable GPBExtensionRegistry *)extensionRegistry
+ (nullable id<GPBExtensionRegistry>)extensionRegistry
error:(NSError **)errorPtr;
/**
@@ -239,7 +239,7 @@
* @return An initialized instance of the generated class.
**/
- (nullable instancetype)initWithData:(NSData *)data
- extensionRegistry:(nullable GPBExtensionRegistry *)extensionRegistry
+ extensionRegistry:(nullable id<GPBExtensionRegistry>)extensionRegistry
error:(NSError **)errorPtr;
/**
@@ -264,7 +264,7 @@
**/
- (nullable instancetype)initWithCodedInputStream:(GPBCodedInputStream *)input
extensionRegistry:
- (nullable GPBExtensionRegistry *)extensionRegistry
+ (nullable id<GPBExtensionRegistry>)extensionRegistry
error:(NSError **)errorPtr;
/**
@@ -278,7 +278,7 @@
* unsuccessful.
**/
- (void)mergeFromData:(NSData *)data
- extensionRegistry:(nullable GPBExtensionRegistry *)extensionRegistry;
+ extensionRegistry:(nullable id<GPBExtensionRegistry>)extensionRegistry;
/**
* Merges the fields from another message (of the same type) into this
@@ -427,8 +427,7 @@
* @param extension The extension descriptor under which to set the value.
* @param value The value to be set as the extension.
**/
-- (void)setExtension:(GPBExtensionDescriptor *)extension
- value:(nullable id)value;
+- (void)setExtension:(GPBExtensionDescriptor *)extension value:(nullable id)value;
/**
* Adds the given value to the extension for this message. This only applies
@@ -449,9 +448,7 @@
* @param index The index of the extension to be replaced.
* @param value The value to be replaced in the repeated extension.
**/
-- (void)setExtension:(GPBExtensionDescriptor *)extension
- index:(NSUInteger)index
- value:(id)value;
+- (void)setExtension:(GPBExtensionDescriptor *)extension index:(NSUInteger)index value:(id)value;
/**
* Clears the given extension for this message.
diff --git a/objectivec/GPBMessage.m b/objectivec/GPBMessage.m
index ee94dee..528149f 100644
--- a/objectivec/GPBMessage.m
+++ b/objectivec/GPBMessage.m
@@ -30,8 +30,8 @@
#import "GPBMessage_PackagePrivate.h"
-#import <objc/runtime.h>
#import <objc/message.h>
+#import <objc/runtime.h>
#import <stdatomic.h>
#import "GPBArray_PackagePrivate.h"
@@ -51,8 +51,7 @@
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdirect-ivar-access"
-NSString *const GPBMessageErrorDomain =
- GPBNSStringifySymbol(GPBMessageErrorDomain);
+NSString *const GPBMessageErrorDomain = GPBNSStringifySymbol(GPBMessageErrorDomain);
NSString *const GPBErrorReasonKey = @"Reason";
@@ -97,27 +96,20 @@
}
@end
-static id CreateArrayForField(GPBFieldDescriptor *field,
- GPBMessage *autocreator)
+static id CreateArrayForField(GPBFieldDescriptor *field, GPBMessage *autocreator)
__attribute__((ns_returns_retained));
-static id GetOrCreateArrayIvarWithField(GPBMessage *self,
- GPBFieldDescriptor *field);
+static id GetOrCreateArrayIvarWithField(GPBMessage *self, GPBFieldDescriptor *field);
static id GetArrayIvarWithField(GPBMessage *self, GPBFieldDescriptor *field);
-static id CreateMapForField(GPBFieldDescriptor *field,
- GPBMessage *autocreator)
+static id CreateMapForField(GPBFieldDescriptor *field, GPBMessage *autocreator)
__attribute__((ns_returns_retained));
-static id GetOrCreateMapIvarWithField(GPBMessage *self,
- GPBFieldDescriptor *field);
+static id GetOrCreateMapIvarWithField(GPBMessage *self, GPBFieldDescriptor *field);
static id GetMapIvarWithField(GPBMessage *self, GPBFieldDescriptor *field);
-static NSMutableDictionary *CloneExtensionMap(NSDictionary *extensionMap,
- NSZone *zone)
+static NSMutableDictionary *CloneExtensionMap(NSDictionary *extensionMap, NSZone *zone)
__attribute__((ns_returns_retained));
#ifdef DEBUG
static NSError *MessageError(NSInteger code, NSDictionary *userInfo) {
- return [NSError errorWithDomain:GPBMessageErrorDomain
- code:code
- userInfo:userInfo];
+ return [NSError errorWithDomain:GPBMessageErrorDomain code:code userInfo:userInfo];
}
#endif
@@ -133,7 +125,7 @@
NSString *reason = exception.reason;
NSDictionary *userInfo = nil;
if ([reason length]) {
- userInfo = @{ GPBErrorReasonKey : reason };
+ userInfo = @{GPBErrorReasonKey : reason};
}
error = [NSError errorWithDomain:GPBMessageErrorDomain
@@ -143,24 +135,20 @@
return error;
}
-static void CheckExtension(GPBMessage *self,
- GPBExtensionDescriptor *extension) {
+static void CheckExtension(GPBMessage *self, GPBExtensionDescriptor *extension) {
if (![self isKindOfClass:extension.containingMessageClass]) {
- [NSException
- raise:NSInvalidArgumentException
- format:@"Extension %@ used on wrong class (%@ instead of %@)",
- extension.singletonName,
- [self class], extension.containingMessageClass];
+ [NSException raise:NSInvalidArgumentException
+ format:@"Extension %@ used on wrong class (%@ instead of %@)",
+ extension.singletonName, [self class], extension.containingMessageClass];
}
}
-static NSMutableDictionary *CloneExtensionMap(NSDictionary *extensionMap,
- NSZone *zone) {
+static NSMutableDictionary *CloneExtensionMap(NSDictionary *extensionMap, NSZone *zone) {
if (extensionMap.count == 0) {
return nil;
}
- NSMutableDictionary *result = [[NSMutableDictionary allocWithZone:zone]
- initWithCapacity:extensionMap.count];
+ NSMutableDictionary *result =
+ [[NSMutableDictionary allocWithZone:zone] initWithCapacity:extensionMap.count];
for (GPBExtensionDescriptor *extension in extensionMap) {
id value = [extensionMap objectForKey:extension];
@@ -168,8 +156,7 @@
if (extension.repeated) {
if (isMessageExtension) {
- NSMutableArray *list =
- [[NSMutableArray alloc] initWithCapacity:[value count]];
+ NSMutableArray *list = [[NSMutableArray alloc] initWithCapacity:[value count]];
for (GPBMessage *listValue in value) {
GPBMessage *copiedValue = [listValue copyWithZone:zone];
[list addObject:copiedValue];
@@ -196,8 +183,7 @@
return result;
}
-static id CreateArrayForField(GPBFieldDescriptor *field,
- GPBMessage *autocreator) {
+static id CreateArrayForField(GPBFieldDescriptor *field, GPBMessage *autocreator) {
id result;
GPBDataType fieldDataType = GPBGetFieldDataType(field);
switch (fieldDataType) {
@@ -230,8 +216,7 @@
break;
case GPBDataTypeEnum:
- result = [[GPBEnumArray alloc]
- initWithValidationFunction:field.enumDescriptor.enumVerifier];
+ result = [[GPBEnumArray alloc] initWithValidationFunction:field.enumDescriptor.enumVerifier];
break;
case GPBDataTypeBytes:
@@ -249,7 +234,7 @@
if (autocreator) {
if (GPBDataTypeIsObject(fieldDataType)) {
GPBAutocreatedArray *autoArray = result;
- autoArray->_autocreator = autocreator;
+ autoArray->_autocreator = autocreator;
} else {
GPBInt32Array *gpbArray = result;
gpbArray->_autocreator = autocreator;
@@ -259,8 +244,7 @@
return result;
}
-static id CreateMapForField(GPBFieldDescriptor *field,
- GPBMessage *autocreator) {
+static id CreateMapForField(GPBFieldDescriptor *field, GPBMessage *autocreator) {
id result;
GPBDataType keyDataType = field.mapKeyDataType;
GPBDataType valueDataType = GPBGetFieldDataType(field);
@@ -545,10 +529,9 @@
}
if (autocreator) {
- if ((keyDataType == GPBDataTypeString) &&
- GPBDataTypeIsObject(valueDataType)) {
+ if ((keyDataType == GPBDataTypeString) && GPBDataTypeIsObject(valueDataType)) {
GPBAutocreatedDictionary *autoDict = result;
- autoDict->_autocreator = autocreator;
+ autoDict->_autocreator = autocreator;
} else {
GPBInt32Int32Dictionary *gpbDict = result;
gpbDict->_autocreator = autocreator;
@@ -570,8 +553,7 @@
// repeated/map field parsed into the autorelease pool which is both a memory
// and performance hit.
-static id GetOrCreateArrayIvarWithField(GPBMessage *self,
- GPBFieldDescriptor *field) {
+static id GetOrCreateArrayIvarWithField(GPBMessage *self, GPBFieldDescriptor *field) {
id array = GPBGetObjectIvarWithFieldNoAutocreate(self, field);
if (!array) {
// No lock needed, this is called from places expecting to mutate
@@ -611,8 +593,7 @@
return expected;
}
-static id GetOrCreateMapIvarWithField(GPBMessage *self,
- GPBFieldDescriptor *field) {
+static id GetOrCreateMapIvarWithField(GPBMessage *self, GPBFieldDescriptor *field) {
id dict = GPBGetObjectIvarWithFieldNoAutocreate(self, field);
if (!dict) {
// No lock needed, this is called from places expecting to mutate
@@ -641,8 +622,7 @@
}
// Some other thread set it, release the one created and return what got set.
- if ((field.mapKeyDataType == GPBDataTypeString) &&
- GPBFieldDataTypeIsObject(field)) {
+ if ((field.mapKeyDataType == GPBDataTypeString) && GPBFieldDataTypeIsObject(field)) {
GPBAutocreatedDictionary *autoDict = autocreated;
autoDict->_autocreator = nil;
} else {
@@ -655,8 +635,7 @@
#endif // !defined(__clang_analyzer__)
-GPBMessage *GPBCreateMessageWithAutocreator(Class msgClass,
- GPBMessage *autocreator,
+GPBMessage *GPBCreateMessageWithAutocreator(Class msgClass, GPBMessage *autocreator,
GPBFieldDescriptor *field) {
GPBMessage *message = [[msgClass alloc] init];
message->autocreator_ = autocreator;
@@ -664,13 +643,12 @@
return message;
}
-static GPBMessage *CreateMessageWithAutocreatorForExtension(
- Class msgClass, GPBMessage *autocreator, GPBExtensionDescriptor *extension)
+static GPBMessage *CreateMessageWithAutocreatorForExtension(Class msgClass, GPBMessage *autocreator,
+ GPBExtensionDescriptor *extension)
__attribute__((ns_returns_retained));
-static GPBMessage *CreateMessageWithAutocreatorForExtension(
- Class msgClass, GPBMessage *autocreator,
- GPBExtensionDescriptor *extension) {
+static GPBMessage *CreateMessageWithAutocreatorForExtension(Class msgClass, GPBMessage *autocreator,
+ GPBExtensionDescriptor *extension) {
GPBMessage *message = [[msgClass alloc] init];
message->autocreator_ = autocreator;
message->autocreatorExtension_ = [extension retain];
@@ -689,8 +667,7 @@
// This will recursively make all parent messages visible until it reaches a
// super-creator that's visible.
if (self->autocreatorField_) {
- GPBSetObjectIvarWithFieldPrivate(self->autocreator_,
- self->autocreatorField_, self);
+ GPBSetObjectIvarWithFieldPrivate(self->autocreator_, self->autocreatorField_, self);
} else {
[self->autocreator_ setExtension:self->autocreatorExtension_ value:self];
}
@@ -726,8 +703,7 @@
if (field.fieldType == GPBFieldTypeMap) {
id curDict = GPBGetObjectIvarWithFieldNoAutocreate(self, field);
if (curDict == dictionary) {
- if ((field.mapKeyDataType == GPBDataTypeString) &&
- GPBFieldDataTypeIsObject(field)) {
+ if ((field.mapKeyDataType == GPBDataTypeString) && GPBFieldDataTypeIsObject(field)) {
GPBAutocreatedDictionary *autoDict = dictionary;
autoDict->_autocreator = nil;
} else {
@@ -751,18 +727,15 @@
// Either the autocreator must have its "has" flag set to YES, or it must be
// NO and not equal to ourselves.
BOOL autocreatorHas =
- (self->autocreatorField_
- ? GPBGetHasIvarField(self->autocreator_, self->autocreatorField_)
- : [self->autocreator_ hasExtension:self->autocreatorExtension_]);
+ (self->autocreatorField_ ? GPBGetHasIvarField(self->autocreator_, self->autocreatorField_)
+ : [self->autocreator_ hasExtension:self->autocreatorExtension_]);
GPBMessage *autocreatorFieldValue =
(self->autocreatorField_
- ? GPBGetObjectIvarWithFieldNoAutocreate(self->autocreator_,
- self->autocreatorField_)
+ ? GPBGetObjectIvarWithFieldNoAutocreate(self->autocreator_, self->autocreatorField_)
: [self->autocreator_->autocreatedExtensionMap_
objectForKey:self->autocreatorExtension_]);
NSCAssert(autocreatorHas || autocreatorFieldValue != self,
- @"Cannot clear autocreator because it still refers to self, self: %@.",
- self);
+ @"Cannot clear autocreator because it still refers to self, self: %@.", self);
#endif // DEBUG && !defined(NS_BLOCK_ASSERTIONS)
@@ -788,10 +761,12 @@
dispatch_release(worker);
}
#if defined(__clang_analyzer__)
- // The Xcode 9.2 (and 9.3 beta) static analyzer thinks worker is leaked
- // (doesn't seem to know about atomic_compare_exchange_strong); so just
- // for the analyzer, let it think worker is also released in this case.
- else { dispatch_release(worker); }
+ // The static analyzer thinks worker is leaked (doesn't seem to know about
+ // atomic_compare_exchange_strong); so just for the analyzer, let it think
+ // worker is also released in this case.
+ else {
+ dispatch_release(worker);
+ }
#endif
}
@@ -848,9 +823,8 @@
if (!descriptor) {
// Use a dummy file that marks it as proto2 syntax so when used generically
// it supports unknowns/etc.
- fileDescriptor =
- [[GPBFileDescriptor alloc] initWithPackage:@"internal"
- syntax:GPBFileSyntaxProto2];
+ fileDescriptor = [[GPBFileDescriptor alloc] initWithPackage:@"internal"
+ syntax:GPBFileSyntaxProto2];
descriptor = [GPBDescriptor allocDescriptorForClass:[GPBMessage class]
rootClass:Nil
@@ -869,8 +843,8 @@
- (instancetype)init {
if ((self = [super init])) {
- messageStorage_ = (GPBMessage_StoragePtr)(
- ((uint8_t *)self) + class_getInstanceSize([self class]));
+ messageStorage_ =
+ (GPBMessage_StoragePtr)(((uint8_t *)self) + class_getInstanceSize([self class]));
}
return self;
@@ -881,7 +855,7 @@
}
- (instancetype)initWithData:(NSData *)data
- extensionRegistry:(GPBExtensionRegistry *)extensionRegistry
+ extensionRegistry:(id<GPBExtensionRegistry>)extensionRegistry
error:(NSError **)errorPtr {
if ((self = [self init])) {
@try {
@@ -889,8 +863,7 @@
if (errorPtr) {
*errorPtr = nil;
}
- }
- @catch (NSException *exception) {
+ } @catch (NSException *exception) {
[self release];
self = nil;
if (errorPtr) {
@@ -911,8 +884,7 @@
}
- (instancetype)initWithCodedInputStream:(GPBCodedInputStream *)input
- extensionRegistry:
- (GPBExtensionRegistry *)extensionRegistry
+ extensionRegistry:(id<GPBExtensionRegistry>)extensionRegistry
error:(NSError **)errorPtr {
if ((self = [self init])) {
@try {
@@ -920,8 +892,7 @@
if (errorPtr) {
*errorPtr = nil;
}
- }
- @catch (NSException *exception) {
+ } @catch (NSException *exception) {
[self release];
self = nil;
if (errorPtr) {
@@ -979,13 +950,11 @@
if (field.mapKeyDataType == GPBDataTypeString) {
// Map is an NSDictionary.
NSDictionary *existingDict = value;
- NSMutableDictionary *newDict = [[NSMutableDictionary alloc]
- initWithCapacity:existingDict.count];
+ NSMutableDictionary *newDict =
+ [[NSMutableDictionary alloc] initWithCapacity:existingDict.count];
newValue = newDict;
- [existingDict enumerateKeysAndObjectsUsingBlock:^(NSString *key,
- GPBMessage *msg,
- BOOL *stop) {
-#pragma unused(stop)
+ [existingDict enumerateKeysAndObjectsUsingBlock:^(NSString *key, GPBMessage *msg,
+ __unused BOOL *stop) {
GPBMessage *copiedMsg = [msg copyWithZone:zone];
[newDict setObject:copiedMsg forKey:key];
[copiedMsg release];
@@ -1008,8 +977,7 @@
newValue = [value copyWithZone:zone];
}
} else {
- if ((field.mapKeyDataType == GPBDataTypeString) &&
- GPBFieldDataTypeIsObject(field)) {
+ if ((field.mapKeyDataType == GPBDataTypeString) && GPBFieldDataTypeIsObject(field)) {
// NSDictionary
newValue = [value mutableCopyWithZone:zone];
} else {
@@ -1041,8 +1009,7 @@
id *typePtr = (id *)&storage[field->description_->offset];
*typePtr = NULL;
}
- } else if (GPBFieldDataTypeIsObject(field) &&
- GPBGetHasIvarField(self, field)) {
+ } else if (GPBFieldDataTypeIsObject(field) && GPBGetHasIvarField(self, field)) {
// A set string/data value (message picked off above), copy it.
id value = GPBGetObjectIvarWithFieldNoAutocreate(self, field);
id newValue = [value copyWithZone:zone];
@@ -1093,8 +1060,7 @@
}
}
} else {
- if ((field.mapKeyDataType == GPBDataTypeString) &&
- GPBFieldDataTypeIsObject(field)) {
+ if ((field.mapKeyDataType == GPBDataTypeString) && GPBFieldDataTypeIsObject(field)) {
if ([arrayOrMap isKindOfClass:[GPBAutocreatedDictionary class]]) {
GPBAutocreatedDictionary *autoDict = arrayOrMap;
if (autoDict->_autocreator == self) {
@@ -1115,8 +1081,7 @@
GPBClearAutocreatedMessageIvarWithField(self, field);
GPBMessage *value = GPBGetObjectIvarWithFieldNoAutocreate(self, field);
[value release];
- } else if (GPBFieldDataTypeIsObject(field) &&
- GPBGetHasIvarField(self, field)) {
+ } else if (GPBFieldDataTypeIsObject(field) && GPBGetHasIvarField(self, field)) {
id value = GPBGetObjectIvarWithField(self, field);
[value release];
}
@@ -1168,8 +1133,7 @@
return NO;
}
} else {
- NSAssert(field.isOptional,
- @"%@: Single message field %@ not required or optional?",
+ NSAssert(field.isOptional, @"%@: Single message field %@ not required or optional?",
[self class], field.name);
if (GPBGetHasIvarField(self, field)) {
GPBMessage *message = GPBGetMessageMessageField(self, field);
@@ -1187,15 +1151,13 @@
}
} else { // fieldType == GPBFieldTypeMap
if (field.mapKeyDataType == GPBDataTypeString) {
- NSDictionary *map =
- GPBGetObjectIvarWithFieldNoAutocreate(self, field);
+ NSDictionary *map = GPBGetObjectIvarWithFieldNoAutocreate(self, field);
if (map && !GPBDictionaryIsInitializedInternalHelper(map, field)) {
return NO;
}
} else {
// Real type is GPB*ObjectDictionary, exact type doesn't matter.
- GPBInt32ObjectDictionary *map =
- GPBGetObjectIvarWithFieldNoAutocreate(self, field);
+ GPBInt32ObjectDictionary *map = GPBGetObjectIvarWithFieldNoAutocreate(self, field);
if (map && ![map isInitialized]) {
return NO;
}
@@ -1206,9 +1168,7 @@
__block BOOL result = YES;
[extensionMap_
- enumerateKeysAndObjectsUsingBlock:^(GPBExtensionDescriptor *extension,
- id obj,
- BOOL *stop) {
+ enumerateKeysAndObjectsUsingBlock:^(GPBExtensionDescriptor *extension, id obj, BOOL *stop) {
if (GPBExtensionIsMessage(extension)) {
if (extension.isRepeated) {
for (GPBMessage *msg in obj) {
@@ -1241,18 +1201,15 @@
}
#endif
NSMutableData *data = [NSMutableData dataWithLength:[self serializedSize]];
- GPBCodedOutputStream *stream =
- [[GPBCodedOutputStream alloc] initWithData:data];
+ GPBCodedOutputStream *stream = [[GPBCodedOutputStream alloc] initWithData:data];
@try {
[self writeToCodedOutputStream:stream];
- }
- @catch (NSException *exception) {
+ } @catch (NSException *exception) {
// This really shouldn't happen. The only way writeToCodedOutputStream:
// could throw is if something in the library has a bug and the
// serializedSize was wrong.
#ifdef DEBUG
- NSLog(@"%@: Internal exception while building message data: %@",
- [self class], exception);
+ NSLog(@"%@: Internal exception while building message data: %@", [self class], exception);
#endif
data = nil;
}
@@ -1263,20 +1220,17 @@
- (NSData *)delimitedData {
size_t serializedSize = [self serializedSize];
size_t varintSize = GPBComputeRawVarint32SizeForInteger(serializedSize);
- NSMutableData *data =
- [NSMutableData dataWithLength:(serializedSize + varintSize)];
- GPBCodedOutputStream *stream =
- [[GPBCodedOutputStream alloc] initWithData:data];
+ NSMutableData *data = [NSMutableData dataWithLength:(serializedSize + varintSize)];
+ GPBCodedOutputStream *stream = [[GPBCodedOutputStream alloc] initWithData:data];
@try {
[self writeDelimitedToCodedOutputStream:stream];
- }
- @catch (NSException *exception) {
+ } @catch (NSException *exception) {
// This really shouldn't happen. The only way writeToCodedOutputStream:
// could throw is if something in the library has a bug and the
// serializedSize was wrong.
#ifdef DEBUG
- NSLog(@"%@: Internal exception while building message delimitedData: %@",
- [self class], exception);
+ NSLog(@"%@: Internal exception while building message delimitedData: %@", [self class],
+ exception);
#endif
// If it happens, truncate.
data.length = 0;
@@ -1286,8 +1240,7 @@
}
- (void)writeToOutputStream:(NSOutputStream *)output {
- GPBCodedOutputStream *stream =
- [[GPBCodedOutputStream alloc] initWithOutputStream:output];
+ GPBCodedOutputStream *stream = [[GPBCodedOutputStream alloc] initWithOutputStream:output];
[self writeToCodedOutputStream:stream];
[stream release];
}
@@ -1322,8 +1275,7 @@
}
- (void)writeDelimitedToOutputStream:(NSOutputStream *)output {
- GPBCodedOutputStream *codedOutput =
- [[GPBCodedOutputStream alloc] initWithOutputStream:output];
+ GPBCodedOutputStream *codedOutput = [[GPBCodedOutputStream alloc] initWithOutputStream:output];
[self writeDelimitedToCodedOutputStream:codedOutput];
[codedOutput release];
}
@@ -1333,8 +1285,7 @@
[self writeToCodedOutputStream:output];
}
-- (void)writeField:(GPBFieldDescriptor *)field
- toCodedOutputStream:(GPBCodedOutputStream *)output {
+- (void)writeField:(GPBFieldDescriptor *)field toCodedOutputStream:(GPBCodedOutputStream *)output {
GPBFieldType fieldType = field.fieldType;
if (fieldType == GPBFieldTypeSingle) {
BOOL has = GPBGetHasIvarField(self, field);
@@ -1344,6 +1295,9 @@
}
uint32_t fieldNumber = GPBFieldNumber(field);
+ switch (GPBGetFieldDataType(field)) {
+ // clang-format off
+
//%PDDM-DEFINE FIELD_CASE(TYPE, REAL_TYPE)
//%FIELD_CASE_FULL(TYPE, REAL_TYPE, REAL_TYPE)
//%PDDM-DEFINE FIELD_CASE_FULL(TYPE, REAL_TYPE, ARRAY_TYPE)
@@ -1386,12 +1340,8 @@
//% }
//% break;
//%
-
- switch (GPBGetFieldDataType(field)) {
-
//%PDDM-EXPAND FIELD_CASE(Bool, Bool)
// This block of code is generated, do not edit it directly.
-// clang-format off
case GPBDataTypeBool:
if (fieldType == GPBFieldTypeRepeated) {
@@ -1410,10 +1360,8 @@
}
break;
-// clang-format on
//%PDDM-EXPAND FIELD_CASE(Fixed32, UInt32)
// This block of code is generated, do not edit it directly.
-// clang-format off
case GPBDataTypeFixed32:
if (fieldType == GPBFieldTypeRepeated) {
@@ -1432,10 +1380,8 @@
}
break;
-// clang-format on
//%PDDM-EXPAND FIELD_CASE(SFixed32, Int32)
// This block of code is generated, do not edit it directly.
-// clang-format off
case GPBDataTypeSFixed32:
if (fieldType == GPBFieldTypeRepeated) {
@@ -1454,10 +1400,8 @@
}
break;
-// clang-format on
//%PDDM-EXPAND FIELD_CASE(Float, Float)
// This block of code is generated, do not edit it directly.
-// clang-format off
case GPBDataTypeFloat:
if (fieldType == GPBFieldTypeRepeated) {
@@ -1476,10 +1420,8 @@
}
break;
-// clang-format on
//%PDDM-EXPAND FIELD_CASE(Fixed64, UInt64)
// This block of code is generated, do not edit it directly.
-// clang-format off
case GPBDataTypeFixed64:
if (fieldType == GPBFieldTypeRepeated) {
@@ -1498,10 +1440,8 @@
}
break;
-// clang-format on
//%PDDM-EXPAND FIELD_CASE(SFixed64, Int64)
// This block of code is generated, do not edit it directly.
-// clang-format off
case GPBDataTypeSFixed64:
if (fieldType == GPBFieldTypeRepeated) {
@@ -1520,10 +1460,8 @@
}
break;
-// clang-format on
//%PDDM-EXPAND FIELD_CASE(Double, Double)
// This block of code is generated, do not edit it directly.
-// clang-format off
case GPBDataTypeDouble:
if (fieldType == GPBFieldTypeRepeated) {
@@ -1542,10 +1480,8 @@
}
break;
-// clang-format on
//%PDDM-EXPAND FIELD_CASE(Int32, Int32)
// This block of code is generated, do not edit it directly.
-// clang-format off
case GPBDataTypeInt32:
if (fieldType == GPBFieldTypeRepeated) {
@@ -1564,10 +1500,8 @@
}
break;
-// clang-format on
//%PDDM-EXPAND FIELD_CASE(Int64, Int64)
// This block of code is generated, do not edit it directly.
-// clang-format off
case GPBDataTypeInt64:
if (fieldType == GPBFieldTypeRepeated) {
@@ -1586,10 +1520,8 @@
}
break;
-// clang-format on
//%PDDM-EXPAND FIELD_CASE(SInt32, Int32)
// This block of code is generated, do not edit it directly.
-// clang-format off
case GPBDataTypeSInt32:
if (fieldType == GPBFieldTypeRepeated) {
@@ -1608,10 +1540,8 @@
}
break;
-// clang-format on
//%PDDM-EXPAND FIELD_CASE(SInt64, Int64)
// This block of code is generated, do not edit it directly.
-// clang-format off
case GPBDataTypeSInt64:
if (fieldType == GPBFieldTypeRepeated) {
@@ -1630,10 +1560,8 @@
}
break;
-// clang-format on
//%PDDM-EXPAND FIELD_CASE(UInt32, UInt32)
// This block of code is generated, do not edit it directly.
-// clang-format off
case GPBDataTypeUInt32:
if (fieldType == GPBFieldTypeRepeated) {
@@ -1652,10 +1580,8 @@
}
break;
-// clang-format on
//%PDDM-EXPAND FIELD_CASE(UInt64, UInt64)
// This block of code is generated, do not edit it directly.
-// clang-format off
case GPBDataTypeUInt64:
if (fieldType == GPBFieldTypeRepeated) {
@@ -1674,10 +1600,8 @@
}
break;
-// clang-format on
//%PDDM-EXPAND FIELD_CASE_FULL(Enum, Int32, Enum)
// This block of code is generated, do not edit it directly.
-// clang-format off
case GPBDataTypeEnum:
if (fieldType == GPBFieldTypeRepeated) {
@@ -1696,10 +1620,8 @@
}
break;
-// clang-format on
//%PDDM-EXPAND FIELD_CASE2(Bytes)
// This block of code is generated, do not edit it directly.
-// clang-format off
case GPBDataTypeBytes:
if (fieldType == GPBFieldTypeRepeated) {
@@ -1722,10 +1644,8 @@
}
break;
-// clang-format on
//%PDDM-EXPAND FIELD_CASE2(String)
// This block of code is generated, do not edit it directly.
-// clang-format off
case GPBDataTypeString:
if (fieldType == GPBFieldTypeRepeated) {
@@ -1748,10 +1668,8 @@
}
break;
-// clang-format on
//%PDDM-EXPAND FIELD_CASE2(Message)
// This block of code is generated, do not edit it directly.
-// clang-format off
case GPBDataTypeMessage:
if (fieldType == GPBFieldTypeRepeated) {
@@ -1774,10 +1692,8 @@
}
break;
-// clang-format on
//%PDDM-EXPAND FIELD_CASE2(Group)
// This block of code is generated, do not edit it directly.
-// clang-format off
case GPBDataTypeGroup:
if (fieldType == GPBFieldTypeRepeated) {
@@ -1800,8 +1716,9 @@
}
break;
-// clang-format on
//%PDDM-EXPAND-END (18 expansions)
+
+// clang-format off
}
}
@@ -1973,7 +1890,7 @@
#pragma mark - mergeFrom
- (void)mergeFromData:(NSData *)data
- extensionRegistry:(GPBExtensionRegistry *)extensionRegistry {
+ extensionRegistry:(id<GPBExtensionRegistry>)extensionRegistry {
GPBCodedInputStream *input = [[GPBCodedInputStream alloc] initWithData:data];
[self mergeFromCodedInputStream:input extensionRegistry:extensionRegistry];
[input checkLastTagWas:0];
@@ -1983,7 +1900,7 @@
#pragma mark - mergeDelimitedFrom
- (void)mergeDelimitedFromCodedInputStream:(GPBCodedInputStream *)input
- extensionRegistry:(GPBExtensionRegistry *)extensionRegistry {
+ extensionRegistry:(id<GPBExtensionRegistry>)extensionRegistry {
GPBCodedInputStreamState *state = &input->state_;
if (GPBCodedInputStreamIsAtEnd(state)) {
return;
@@ -2003,7 +1920,7 @@
}
+ (instancetype)parseFromData:(NSData *)data
- extensionRegistry:(GPBExtensionRegistry *)extensionRegistry
+ extensionRegistry:(id<GPBExtensionRegistry>)extensionRegistry
error:(NSError **)errorPtr {
return [[[self alloc] initWithData:data
extensionRegistry:extensionRegistry
@@ -2011,7 +1928,7 @@
}
+ (instancetype)parseFromCodedInputStream:(GPBCodedInputStream *)input
- extensionRegistry:(GPBExtensionRegistry *)extensionRegistry
+ extensionRegistry:(id<GPBExtensionRegistry>)extensionRegistry
error:(NSError **)errorPtr {
return
[[[self alloc] initWithCodedInputStream:input
@@ -2023,7 +1940,7 @@
+ (instancetype)parseDelimitedFromCodedInputStream:(GPBCodedInputStream *)input
extensionRegistry:
- (GPBExtensionRegistry *)extensionRegistry
+ (id<GPBExtensionRegistry>)extensionRegistry
error:(NSError **)errorPtr {
GPBMessage *message = [[[self alloc] init] autorelease];
@try {
@@ -2065,7 +1982,7 @@
}
- (void)parseMessageSet:(GPBCodedInputStream *)input
- extensionRegistry:(GPBExtensionRegistry *)extensionRegistry {
+ extensionRegistry:(id<GPBExtensionRegistry>)extensionRegistry {
uint32_t typeId = 0;
NSData *rawBytes = nil;
GPBExtensionDescriptor *extension = nil;
@@ -2117,7 +2034,7 @@
}
- (BOOL)parseUnknownField:(GPBCodedInputStream *)input
- extensionRegistry:(GPBExtensionRegistry *)extensionRegistry
+ extensionRegistry:(id<GPBExtensionRegistry>)extensionRegistry
tag:(uint32_t)tag {
GPBWireFormat wireType = GPBWireFormatGetTagWireType(tag);
int32_t fieldNumber = GPBWireFormatGetTagFieldNumber(tag);
@@ -2170,7 +2087,7 @@
static void MergeSingleFieldFromCodedInputStream(
GPBMessage *self, GPBFieldDescriptor *field, GPBFileSyntax syntax,
- GPBCodedInputStream *input, GPBExtensionRegistry *extensionRegistry) {
+ GPBCodedInputStream *input, id<GPBExtensionRegistry>extensionRegistry) {
GPBDataType fieldDataType = GPBGetFieldDataType(field);
switch (fieldDataType) {
#define CASE_SINGLE_POD(NAME, TYPE, FUNC_TYPE) \
@@ -2306,7 +2223,7 @@
static void MergeRepeatedNotPackedFieldFromCodedInputStream(
GPBMessage *self, GPBFieldDescriptor *field, GPBFileSyntax syntax,
- GPBCodedInputStream *input, GPBExtensionRegistry *extensionRegistry) {
+ GPBCodedInputStream *input, id<GPBExtensionRegistry>extensionRegistry) {
GPBCodedInputStreamState *state = &input->state_;
id genericArray = GetOrCreateArrayIvarWithField(self, field);
switch (GPBGetFieldDataType(field)) {
@@ -2371,7 +2288,7 @@
}
- (void)mergeFromCodedInputStream:(GPBCodedInputStream *)input
- extensionRegistry:(GPBExtensionRegistry *)extensionRegistry {
+ extensionRegistry:(id<GPBExtensionRegistry>)extensionRegistry {
GPBDescriptor *descriptor = [self descriptor];
GPBFileSyntax syntax = descriptor.file.syntax;
GPBCodedInputStreamState *state = &input->state_;
@@ -2991,8 +2908,7 @@
#define CASE_REPEATED_POD_EXTRA(NAME, TYPE, ARRAY_TYPE, ARRAY_ACCESSOR_NAME) \
case GPBDataType##NAME: { \
GPB##ARRAY_TYPE##Array *array = genericArray; \
- [array enumerate##ARRAY_ACCESSOR_NAME##ValuesWithBlock:^(TYPE value, NSUInteger idx, BOOL *stop) { \
- _Pragma("unused(idx, stop)"); \
+ [array enumerate##ARRAY_ACCESSOR_NAME##ValuesWithBlock:^(TYPE value, __unused NSUInteger idx, __unused BOOL *stop) { \
dataSize += GPBCompute##NAME##SizeNoTag(value); \
}]; \
break; \
diff --git a/objectivec/GPBMessage_PackagePrivate.h b/objectivec/GPBMessage_PackagePrivate.h
index ca10983..70b47a5 100644
--- a/objectivec/GPBMessage_PackagePrivate.h
+++ b/objectivec/GPBMessage_PackagePrivate.h
@@ -78,13 +78,12 @@
// or zero for EOF.
// NOTE: This will throw if there is an error while parsing.
- (void)mergeFromCodedInputStream:(GPBCodedInputStream *)input
- extensionRegistry:(GPBExtensionRegistry *)extensionRegistry;
+ extensionRegistry:(id<GPBExtensionRegistry>)extensionRegistry;
// Parses the next delimited message of this type from the input and merges it
// with this message.
- (void)mergeDelimitedFromCodedInputStream:(GPBCodedInputStream *)input
- extensionRegistry:
- (GPBExtensionRegistry *)extensionRegistry;
+ extensionRegistry:(id<GPBExtensionRegistry>)extensionRegistry;
- (void)addUnknownMapEntry:(int32_t)fieldNum value:(NSData *)data;
@@ -92,14 +91,12 @@
CF_EXTERN_C_BEGIN
-
// Call this before using the readOnlySemaphore_. This ensures it is created only once.
void GPBPrepareReadOnlySemaphore(GPBMessage *self);
// Returns a new instance that was automatically created by |autocreator| for
// its field |field|.
-GPBMessage *GPBCreateMessageWithAutocreator(Class msgClass,
- GPBMessage *autocreator,
+GPBMessage *GPBCreateMessageWithAutocreator(Class msgClass, GPBMessage *autocreator,
GPBFieldDescriptor *field)
__attribute__((ns_returns_retained));
diff --git a/objectivec/GPBProtocolBuffers.h b/objectivec/GPBProtocolBuffers.h
index 619c082..e5f4713 100644
--- a/objectivec/GPBProtocolBuffers.h
+++ b/objectivec/GPBProtocolBuffers.h
@@ -28,7 +28,9 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+// clang-format off
#import "GPBBootstrap.h"
+// clang-format on
#import "GPBArray.h"
#import "GPBCodedInputStream.h"
diff --git a/objectivec/GPBProtocolBuffers.m b/objectivec/GPBProtocolBuffers.m
index 0545ae9..c2833c5 100644
--- a/objectivec/GPBProtocolBuffers.m
+++ b/objectivec/GPBProtocolBuffers.m
@@ -31,7 +31,6 @@
// If you want to build protocol buffers in your own project without adding the
// project dependency, you can just add this file.
-
// This warning seems to treat code differently when it is #imported than when
// it is inline in the file. GPBDictionary.m compiles cleanly in other targets,
// but when #imported here it triggers a bunch of warnings that don't make
diff --git a/objectivec/GPBProtocolBuffers_RuntimeSupport.h b/objectivec/GPBProtocolBuffers_RuntimeSupport.h
index 04dde62..804a68a 100644
--- a/objectivec/GPBProtocolBuffers_RuntimeSupport.h
+++ b/objectivec/GPBProtocolBuffers_RuntimeSupport.h
@@ -31,7 +31,9 @@
// This header is meant to only be used by the generated source, it should not
// be included in code using protocol buffers.
+// clang-format off
#import "GPBBootstrap.h"
+// clang-format on
#import "GPBDescriptor_PackagePrivate.h"
#import "GPBExtensionInternals.h"
diff --git a/objectivec/GPBRootObject.m b/objectivec/GPBRootObject.m
index bad2f9a..08adfcf 100644
--- a/objectivec/GPBRootObject.m
+++ b/objectivec/GPBRootObject.m
@@ -73,26 +73,19 @@
// to worry about deallocation. All of the items are added to it at
// startup, and so the keys don't need to be retained/released.
// Keys are NULL terminated char *.
-static const void *GPBRootExtensionKeyRetain(CFAllocatorRef allocator,
- const void *value) {
-#pragma unused(allocator)
+static const void *GPBRootExtensionKeyRetain(__unused CFAllocatorRef allocator, const void *value) {
return value;
}
-static void GPBRootExtensionKeyRelease(CFAllocatorRef allocator,
- const void *value) {
-#pragma unused(allocator)
-#pragma unused(value)
-}
+static void GPBRootExtensionKeyRelease(__unused CFAllocatorRef allocator,
+ __unused const void *value) {}
static CFStringRef GPBRootExtensionCopyKeyDescription(const void *value) {
const char *key = (const char *)value;
- return CFStringCreateWithCString(kCFAllocatorDefault, key,
- kCFStringEncodingUTF8);
+ return CFStringCreateWithCString(kCFAllocatorDefault, key, kCFStringEncodingUTF8);
}
-static Boolean GPBRootExtensionKeyEqual(const void *value1,
- const void *value2) {
+static Boolean GPBRootExtensionKeyEqual(const void *value1, const void *value2) {
const char *key1 = (const char *)value1;
const char *key2 = (const char *)value2;
return strcmp(key1, key2) == 0;
@@ -117,17 +110,16 @@
if (!gExtensionSingletonDictionary) {
gExtensionSingletonDictionarySemaphore = dispatch_semaphore_create(1);
CFDictionaryKeyCallBacks keyCallBacks = {
- // See description above for reason for using custom dictionary.
- 0,
- GPBRootExtensionKeyRetain,
- GPBRootExtensionKeyRelease,
- GPBRootExtensionCopyKeyDescription,
- GPBRootExtensionKeyEqual,
- GPBRootExtensionKeyHash,
+ // See description above for reason for using custom dictionary.
+ 0,
+ GPBRootExtensionKeyRetain,
+ GPBRootExtensionKeyRelease,
+ GPBRootExtensionCopyKeyDescription,
+ GPBRootExtensionKeyEqual,
+ GPBRootExtensionKeyHash,
};
- gExtensionSingletonDictionary =
- CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &keyCallBacks,
- &kCFTypeDictionaryValueCallBacks);
+ gExtensionSingletonDictionary = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &keyCallBacks,
+ &kCFTypeDictionaryValueCallBacks);
gDefaultExtensionRegistry = [[GPBExtensionRegistry alloc] init];
}
@@ -147,8 +139,7 @@
+ (void)globallyRegisterExtension:(GPBExtensionDescriptor *)field {
const char *key = [field singletonNameC];
- dispatch_semaphore_wait(gExtensionSingletonDictionarySemaphore,
- DISPATCH_TIME_FOREVER);
+ dispatch_semaphore_wait(gExtensionSingletonDictionarySemaphore, DISPATCH_TIME_FOREVER);
CFDictionarySetValue(gExtensionSingletonDictionary, key, field);
dispatch_semaphore_signal(gExtensionSingletonDictionarySemaphore);
}
@@ -189,8 +180,7 @@
// initialized and Message classes ensure their Root was also initialized.
NSAssert(gExtensionSingletonDictionary, @"Startup order broken!");
- dispatch_semaphore_wait(gExtensionSingletonDictionarySemaphore,
- DISPATCH_TIME_FOREVER);
+ dispatch_semaphore_wait(gExtensionSingletonDictionarySemaphore, DISPATCH_TIME_FOREVER);
id extension = (id)CFDictionaryGetValue(gExtensionSingletonDictionary, key);
// We can't remove the key from the dictionary here (as an optimization),
// two threads could have gone into +resolveClassMethod: for the same method,
@@ -212,11 +202,9 @@
// file.
id extension = ExtensionForName(self, sel);
if (extension != nil) {
- const char *encoding =
- GPBMessageEncodingForSelector(@selector(getClassValue), NO);
+ const char *encoding = GPBMessageEncodingForSelector(@selector(getClassValue), NO);
Class metaClass = objc_getMetaClass(class_getName(self));
- IMP imp = imp_implementationWithBlock(^(id obj) {
-#pragma unused(obj)
+ IMP imp = imp_implementationWithBlock(^(__unused id obj) {
return extension;
});
BOOL methodAdded = class_addMethod(metaClass, sel, imp, encoding);
@@ -234,7 +222,6 @@
return NO;
}
-
+ (BOOL)resolveClassMethod:(SEL)sel {
if (GPBResolveExtensionClassMethod(self, sel)) {
return YES;
diff --git a/objectivec/GPBSourceContext.pbobjc.h b/objectivec/GPBSourceContext.pbobjc.h
index b17fec0..e747dc0 100644
--- a/objectivec/GPBSourceContext.pbobjc.h
+++ b/objectivec/GPBSourceContext.pbobjc.h
@@ -1,6 +1,8 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: google/protobuf/source_context.proto
+// clang-format off
+
#import "GPBDescriptor.h"
#import "GPBMessage.h"
#import "GPBRootObject.h"
@@ -63,3 +65,5 @@
#pragma clang diagnostic pop
// @@protoc_insertion_point(global_scope)
+
+// clange-format on
diff --git a/objectivec/GPBSourceContext.pbobjc.m b/objectivec/GPBSourceContext.pbobjc.m
index 376d442..094f323 100644
--- a/objectivec/GPBSourceContext.pbobjc.m
+++ b/objectivec/GPBSourceContext.pbobjc.m
@@ -1,6 +1,8 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: google/protobuf/source_context.proto
+// clang-format off
+
#import "GPBProtocolBuffers_RuntimeSupport.h"
#import "GPBSourceContext.pbobjc.h"
@@ -82,3 +84,5 @@
#pragma clang diagnostic pop
// @@protoc_insertion_point(global_scope)
+
+// clange-format on
diff --git a/objectivec/GPBStruct.pbobjc.h b/objectivec/GPBStruct.pbobjc.h
index dd6ab28..eaa531e 100644
--- a/objectivec/GPBStruct.pbobjc.h
+++ b/objectivec/GPBStruct.pbobjc.h
@@ -1,6 +1,8 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: google/protobuf/struct.proto
+// clang-format off
+
#import "GPBDescriptor.h"
#import "GPBMessage.h"
#import "GPBRootObject.h"
@@ -87,7 +89,7 @@
/** Unordered map of dynamically typed values. */
@property(nonatomic, readwrite, strong, null_resettable) NSMutableDictionary<NSString*, GPBValue*> *fields;
-/** The number of items in @c fields without causing the array to be created. */
+/** The number of items in @c fields without causing the container to be created. */
@property(nonatomic, readonly) NSUInteger fields_Count;
@end
@@ -178,7 +180,7 @@
/** Repeated field of dynamically typed values. */
@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBValue*> *valuesArray;
-/** The number of items in @c valuesArray without causing the array to be created. */
+/** The number of items in @c valuesArray without causing the container to be created. */
@property(nonatomic, readonly) NSUInteger valuesArray_Count;
@end
@@ -190,3 +192,5 @@
#pragma clang diagnostic pop
// @@protoc_insertion_point(global_scope)
+
+// clange-format on
diff --git a/objectivec/GPBStruct.pbobjc.m b/objectivec/GPBStruct.pbobjc.m
index 726cfb8..3707178 100644
--- a/objectivec/GPBStruct.pbobjc.m
+++ b/objectivec/GPBStruct.pbobjc.m
@@ -1,6 +1,8 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: google/protobuf/struct.proto
+// clang-format off
+
#import "GPBProtocolBuffers_RuntimeSupport.h"
#import "GPBStruct.pbobjc.h"
@@ -295,3 +297,5 @@
#pragma clang diagnostic pop
// @@protoc_insertion_point(global_scope)
+
+// clange-format on
diff --git a/objectivec/GPBTimestamp.pbobjc.h b/objectivec/GPBTimestamp.pbobjc.h
index 8203383..6d6a930 100644
--- a/objectivec/GPBTimestamp.pbobjc.h
+++ b/objectivec/GPBTimestamp.pbobjc.h
@@ -1,6 +1,8 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: google/protobuf/timestamp.proto
+// clang-format off
+
#import "GPBDescriptor.h"
#import "GPBMessage.h"
#import "GPBRootObject.h"
@@ -162,3 +164,5 @@
#pragma clang diagnostic pop
// @@protoc_insertion_point(global_scope)
+
+// clange-format on
diff --git a/objectivec/GPBTimestamp.pbobjc.m b/objectivec/GPBTimestamp.pbobjc.m
index 72d348f..1792ecb 100644
--- a/objectivec/GPBTimestamp.pbobjc.m
+++ b/objectivec/GPBTimestamp.pbobjc.m
@@ -1,6 +1,8 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: google/protobuf/timestamp.proto
+// clang-format off
+
#import "GPBProtocolBuffers_RuntimeSupport.h"
#import "GPBTimestamp.pbobjc.h"
@@ -93,3 +95,5 @@
#pragma clang diagnostic pop
// @@protoc_insertion_point(global_scope)
+
+// clange-format on
diff --git a/objectivec/GPBType.pbobjc.h b/objectivec/GPBType.pbobjc.h
index b023050..ef9b74b 100644
--- a/objectivec/GPBType.pbobjc.h
+++ b/objectivec/GPBType.pbobjc.h
@@ -1,6 +1,8 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: google/protobuf/type.proto
+// clang-format off
+
#import "GPBDescriptor.h"
#import "GPBMessage.h"
#import "GPBRootObject.h"
@@ -195,17 +197,17 @@
/** The list of fields. */
@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBField*> *fieldsArray;
-/** The number of items in @c fieldsArray without causing the array to be created. */
+/** The number of items in @c fieldsArray without causing the container to be created. */
@property(nonatomic, readonly) NSUInteger fieldsArray_Count;
/** The list of types appearing in `oneof` definitions in this type. */
@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<NSString*> *oneofsArray;
-/** The number of items in @c oneofsArray without causing the array to be created. */
+/** The number of items in @c oneofsArray without causing the container to be created. */
@property(nonatomic, readonly) NSUInteger oneofsArray_Count;
/** The protocol buffer options. */
@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBOption*> *optionsArray;
-/** The number of items in @c optionsArray without causing the array to be created. */
+/** The number of items in @c optionsArray without causing the container to be created. */
@property(nonatomic, readonly) NSUInteger optionsArray_Count;
/** The source context. */
@@ -279,7 +281,7 @@
/** The protocol buffer options. */
@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBOption*> *optionsArray;
-/** The number of items in @c optionsArray without causing the array to be created. */
+/** The number of items in @c optionsArray without causing the container to be created. */
@property(nonatomic, readonly) NSUInteger optionsArray_Count;
/** The field JSON name. */
@@ -334,12 +336,12 @@
/** Enum value definitions. */
@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBEnumValue*> *enumvalueArray;
-/** The number of items in @c enumvalueArray without causing the array to be created. */
+/** The number of items in @c enumvalueArray without causing the container to be created. */
@property(nonatomic, readonly) NSUInteger enumvalueArray_Count;
/** Protocol buffer options. */
@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBOption*> *optionsArray;
-/** The number of items in @c optionsArray without causing the array to be created. */
+/** The number of items in @c optionsArray without causing the container to be created. */
@property(nonatomic, readonly) NSUInteger optionsArray_Count;
/** The source context. */
@@ -385,7 +387,7 @@
/** Protocol buffer options. */
@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBOption*> *optionsArray;
-/** The number of items in @c optionsArray without causing the array to be created. */
+/** The number of items in @c optionsArray without causing the container to be created. */
@property(nonatomic, readonly) NSUInteger optionsArray_Count;
@end
@@ -430,3 +432,5 @@
#pragma clang diagnostic pop
// @@protoc_insertion_point(global_scope)
+
+// clange-format on
diff --git a/objectivec/GPBType.pbobjc.m b/objectivec/GPBType.pbobjc.m
index f5fc1ef..5c8c73e 100644
--- a/objectivec/GPBType.pbobjc.m
+++ b/objectivec/GPBType.pbobjc.m
@@ -1,6 +1,8 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: google/protobuf/type.proto
+// clang-format off
+
#import "GPBProtocolBuffers_RuntimeSupport.h"
#import "GPBType.pbobjc.h"
@@ -707,3 +709,5 @@
#pragma clang diagnostic pop
// @@protoc_insertion_point(global_scope)
+
+// clange-format on
diff --git a/objectivec/GPBUnknownField.h b/objectivec/GPBUnknownField.h
index 5b96023..a188990 100644
--- a/objectivec/GPBUnknownField.h
+++ b/objectivec/GPBUnknownField.h
@@ -40,7 +40,7 @@
* Store an unknown field. These are used in conjunction with
* GPBUnknownFieldSet.
**/
-@interface GPBUnknownField : NSObject<NSCopying>
+@interface GPBUnknownField : NSObject <NSCopying>
/** Initialize a field with the given number. */
- (instancetype)initWithNumber:(int32_t)number;
@@ -58,10 +58,10 @@
@property(nonatomic, readonly, strong) GPBUInt64Array *fixed64List;
/** An array of data values for this field. */
-@property(nonatomic, readonly, strong) NSArray<NSData*> *lengthDelimitedList;
+@property(nonatomic, readonly, strong) NSArray<NSData *> *lengthDelimitedList;
/** An array of groups of values for this field. */
-@property(nonatomic, readonly, strong) NSArray<GPBUnknownFieldSet*> *groupList;
+@property(nonatomic, readonly, strong) NSArray<GPBUnknownFieldSet *> *groupList;
/**
* Add a value to the varintList.
diff --git a/objectivec/GPBUnknownField.m b/objectivec/GPBUnknownField.m
index 7fa8cad..62cfb22 100644
--- a/objectivec/GPBUnknownField.m
+++ b/objectivec/GPBUnknownField.m
@@ -40,8 +40,8 @@
GPBUInt64Array *mutableVarintList_;
GPBUInt32Array *mutableFixed32List_;
GPBUInt64Array *mutableFixed64List_;
- NSMutableArray<NSData*> *mutableLengthDelimitedList_;
- NSMutableArray<GPBUnknownFieldSet*> *mutableGroupList_;
+ NSMutableArray<NSData *> *mutableLengthDelimitedList_;
+ NSMutableArray<GPBUnknownFieldSet *> *mutableGroupList_;
}
@synthesize number = number_;
@@ -75,16 +75,14 @@
#pragma clang diagnostic ignored "-Wdirect-ivar-access"
- (id)copyWithZone:(NSZone *)zone {
- GPBUnknownField *result =
- [[GPBUnknownField allocWithZone:zone] initWithNumber:number_];
+ GPBUnknownField *result = [[GPBUnknownField allocWithZone:zone] initWithNumber:number_];
result->mutableFixed32List_ = [mutableFixed32List_ copyWithZone:zone];
result->mutableFixed64List_ = [mutableFixed64List_ copyWithZone:zone];
- result->mutableLengthDelimitedList_ =
- [mutableLengthDelimitedList_ mutableCopyWithZone:zone];
+ result->mutableLengthDelimitedList_ = [mutableLengthDelimitedList_ mutableCopyWithZone:zone];
result->mutableVarintList_ = [mutableVarintList_ copyWithZone:zone];
if (mutableGroupList_.count) {
- result->mutableGroupList_ = [[NSMutableArray allocWithZone:zone]
- initWithCapacity:mutableGroupList_.count];
+ result->mutableGroupList_ =
+ [[NSMutableArray allocWithZone:zone] initWithCapacity:mutableGroupList_.count];
for (GPBUnknownFieldSet *group in mutableGroupList_) {
GPBUnknownFieldSet *copied = [group copyWithZone:zone];
[result->mutableGroupList_ addObject:copied];
@@ -99,26 +97,21 @@
if (![object isKindOfClass:[GPBUnknownField class]]) return NO;
GPBUnknownField *field = (GPBUnknownField *)object;
if (number_ != field->number_) return NO;
- BOOL equalVarint =
- (mutableVarintList_.count == 0 && field->mutableVarintList_.count == 0) ||
- [mutableVarintList_ isEqual:field->mutableVarintList_];
+ BOOL equalVarint = (mutableVarintList_.count == 0 && field->mutableVarintList_.count == 0) ||
+ [mutableVarintList_ isEqual:field->mutableVarintList_];
if (!equalVarint) return NO;
- BOOL equalFixed32 = (mutableFixed32List_.count == 0 &&
- field->mutableFixed32List_.count == 0) ||
+ BOOL equalFixed32 = (mutableFixed32List_.count == 0 && field->mutableFixed32List_.count == 0) ||
[mutableFixed32List_ isEqual:field->mutableFixed32List_];
if (!equalFixed32) return NO;
- BOOL equalFixed64 = (mutableFixed64List_.count == 0 &&
- field->mutableFixed64List_.count == 0) ||
+ BOOL equalFixed64 = (mutableFixed64List_.count == 0 && field->mutableFixed64List_.count == 0) ||
[mutableFixed64List_ isEqual:field->mutableFixed64List_];
if (!equalFixed64) return NO;
BOOL equalLDList =
- (mutableLengthDelimitedList_.count == 0 &&
- field->mutableLengthDelimitedList_.count == 0) ||
+ (mutableLengthDelimitedList_.count == 0 && field->mutableLengthDelimitedList_.count == 0) ||
[mutableLengthDelimitedList_ isEqual:field->mutableLengthDelimitedList_];
if (!equalLDList) return NO;
- BOOL equalGroupList =
- (mutableGroupList_.count == 0 && field->mutableGroupList_.count == 0) ||
- [mutableGroupList_ isEqual:field->mutableGroupList_];
+ BOOL equalGroupList = (mutableGroupList_.count == 0 && field->mutableGroupList_.count == 0) ||
+ [mutableGroupList_ isEqual:field->mutableGroupList_];
if (!equalGroupList) return NO;
return YES;
}
@@ -161,20 +154,17 @@
__block size_t result = 0;
int32_t number = number_;
[mutableVarintList_
- enumerateValuesWithBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ enumerateValuesWithBlock:^(uint64_t value, __unused NSUInteger idx, __unused BOOL *stop) {
result += GPBComputeUInt64Size(number, value);
}];
[mutableFixed32List_
- enumerateValuesWithBlock:^(uint32_t value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ enumerateValuesWithBlock:^(uint32_t value, __unused NSUInteger idx, __unused BOOL *stop) {
result += GPBComputeFixed32Size(number, value);
}];
[mutableFixed64List_
- enumerateValuesWithBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ enumerateValuesWithBlock:^(uint64_t value, __unused NSUInteger idx, __unused BOOL *stop) {
result += GPBComputeFixed64Size(number, value);
}];
@@ -205,23 +195,19 @@
- (NSString *)description {
NSMutableString *description =
- [NSMutableString stringWithFormat:@"<%@ %p>: Field: %d {\n",
- [self class], self, number_];
+ [NSMutableString stringWithFormat:@"<%@ %p>: Field: %d {\n", [self class], self, number_];
[mutableVarintList_
- enumerateValuesWithBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ enumerateValuesWithBlock:^(uint64_t value, __unused NSUInteger idx, __unused BOOL *stop) {
[description appendFormat:@"\t%llu\n", value];
}];
[mutableFixed32List_
- enumerateValuesWithBlock:^(uint32_t value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ enumerateValuesWithBlock:^(uint32_t value, __unused NSUInteger idx, __unused BOOL *stop) {
[description appendFormat:@"\t%u\n", value];
}];
[mutableFixed64List_
- enumerateValuesWithBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) {
-#pragma unused(idx, stop)
+ enumerateValuesWithBlock:^(uint64_t value, __unused NSUInteger idx, __unused BOOL *stop) {
[description appendFormat:@"\t%llu\n", value];
}];
@@ -269,16 +255,14 @@
if (mutableLengthDelimitedList_ == nil) {
mutableLengthDelimitedList_ = [otherLengthDelimitedList mutableCopy];
} else {
- [mutableLengthDelimitedList_
- addObjectsFromArray:otherLengthDelimitedList];
+ [mutableLengthDelimitedList_ addObjectsFromArray:otherLengthDelimitedList];
}
}
NSArray *otherGroupList = other.groupList;
if (otherGroupList.count > 0) {
if (mutableGroupList_ == nil) {
- mutableGroupList_ =
- [[NSMutableArray alloc] initWithCapacity:otherGroupList.count];
+ mutableGroupList_ = [[NSMutableArray alloc] initWithCapacity:otherGroupList.count];
}
// Make our own mutable copies.
for (GPBUnknownFieldSet *group in otherGroupList) {
@@ -299,8 +283,7 @@
- (void)addFixed32:(uint32_t)value {
if (mutableFixed32List_ == nil) {
- mutableFixed32List_ =
- [[GPBUInt32Array alloc] initWithValues:&value count:1];
+ mutableFixed32List_ = [[GPBUInt32Array alloc] initWithValues:&value count:1];
} else {
[mutableFixed32List_ addValue:value];
}
@@ -308,8 +291,7 @@
- (void)addFixed64:(uint64_t)value {
if (mutableFixed64List_ == nil) {
- mutableFixed64List_ =
- [[GPBUInt64Array alloc] initWithValues:&value count:1];
+ mutableFixed64List_ = [[GPBUInt64Array alloc] initWithValues:&value count:1];
} else {
[mutableFixed64List_ addValue:value];
}
@@ -317,8 +299,7 @@
- (void)addLengthDelimited:(NSData *)value {
if (mutableLengthDelimitedList_ == nil) {
- mutableLengthDelimitedList_ =
- [[NSMutableArray alloc] initWithObjects:&value count:1];
+ mutableLengthDelimitedList_ = [[NSMutableArray alloc] initWithObjects:&value count:1];
} else {
[mutableLengthDelimitedList_ addObject:value];
}
diff --git a/objectivec/GPBUnknownFieldSet.h b/objectivec/GPBUnknownFieldSet.h
index 1b5f24f..aed5b52 100644
--- a/objectivec/GPBUnknownFieldSet.h
+++ b/objectivec/GPBUnknownFieldSet.h
@@ -40,7 +40,7 @@
* applies for files declared with the "proto2" syntax. Files declared with the
* "proto3" syntax discard the unknown values.
**/
-@interface GPBUnknownFieldSet : NSObject<NSCopying>
+@interface GPBUnknownFieldSet : NSObject <NSCopying>
/**
* Tests to see if the given field number has a value.
diff --git a/objectivec/GPBUnknownFieldSet.m b/objectivec/GPBUnknownFieldSet.m
index a7335f0..dcd4b44 100644
--- a/objectivec/GPBUnknownFieldSet.m
+++ b/objectivec/GPBUnknownFieldSet.m
@@ -40,8 +40,7 @@
static void checkNumber(int32_t number) {
if (number == 0) {
- [NSException raise:NSInvalidArgumentException
- format:@"Zero is not a valid field number."];
+ [NSException raise:NSInvalidArgumentException format:@"Zero is not a valid field number."];
}
}
@@ -50,8 +49,7 @@
CFMutableDictionaryRef fields_;
}
-static void CopyWorker(const void *key, const void *value, void *context) {
-#pragma unused(key)
+static void CopyWorker(__unused const void *key, const void *value, void *context) {
GPBUnknownField *field = value;
GPBUnknownFieldSet *result = context;
@@ -111,8 +109,7 @@
- (GPBUnknownField *)getField:(int32_t)number {
ssize_t key = number;
- GPBUnknownField *result =
- fields_ ? CFDictionaryGetValue(fields_, (void *)key) : nil;
+ GPBUnknownField *result = fields_ ? CFDictionaryGetValue(fields_, (void *)key) : nil;
return result;
}
@@ -125,8 +122,7 @@
size_t count = CFDictionaryGetCount(fields_);
ssize_t keys[count];
GPBUnknownField *values[count];
- CFDictionaryGetKeysAndValues(fields_, (const void **)keys,
- (const void **)values);
+ CFDictionaryGetKeysAndValues(fields_, (const void **)keys, (const void **)values);
struct GPBFieldPair {
ssize_t key;
GPBUnknownField *value;
@@ -135,12 +131,11 @@
pairs[i].key = keys[i];
pairs[i].value = values[i];
};
- qsort_b(pairs, count, sizeof(struct GPBFieldPair),
- ^(const void *first, const void *second) {
- const struct GPBFieldPair *a = first;
- const struct GPBFieldPair *b = second;
- return (a->key > b->key) ? 1 : ((a->key == b->key) ? 0 : -1);
- });
+ qsort_b(pairs, count, sizeof(struct GPBFieldPair), ^(const void *first, const void *second) {
+ const struct GPBFieldPair *a = first;
+ const struct GPBFieldPair *b = second;
+ return (a->key > b->key) ? 1 : ((a->key == b->key) ? 0 : -1);
+ });
for (size_t i = 0; i < count; ++i) {
values[i] = pairs[i].value;
};
@@ -154,8 +149,7 @@
size_t count = CFDictionaryGetCount(fields_);
ssize_t keys[count];
GPBUnknownField *values[count];
- CFDictionaryGetKeysAndValues(fields_, (const void **)keys,
- (const void **)values);
+ CFDictionaryGetKeysAndValues(fields_, (const void **)keys, (const void **)values);
if (count > 1) {
struct GPBFieldPair {
ssize_t key;
@@ -166,12 +160,11 @@
pairs[i].key = keys[i];
pairs[i].value = values[i];
};
- qsort_b(pairs, count, sizeof(struct GPBFieldPair),
- ^(const void *first, const void *second) {
- const struct GPBFieldPair *a = first;
- const struct GPBFieldPair *b = second;
- return (a->key > b->key) ? 1 : ((a->key == b->key) ? 0 : -1);
- });
+ qsort_b(pairs, count, sizeof(struct GPBFieldPair), ^(const void *first, const void *second) {
+ const struct GPBFieldPair *a = first;
+ const struct GPBFieldPair *b = second;
+ return (a->key > b->key) ? 1 : ((a->key == b->key) ? 0 : -1);
+ });
for (size_t i = 0; i < count; ++i) {
GPBUnknownField *value = pairs[i].value;
[value writeToOutput:output];
@@ -182,17 +175,16 @@
}
- (NSString *)description {
- NSMutableString *description = [NSMutableString
- stringWithFormat:@"<%@ %p>: TextFormat: {\n", [self class], self];
+ NSMutableString *description =
+ [NSMutableString stringWithFormat:@"<%@ %p>: TextFormat: {\n", [self class], self];
NSString *textFormat = GPBTextFormatForUnknownFieldSet(self, @" ");
[description appendString:textFormat];
[description appendString:@"}"];
return description;
}
-static void GPBUnknownFieldSetSerializedSize(const void *key, const void *value,
+static void GPBUnknownFieldSetSerializedSize(__unused const void *key, const void *value,
void *context) {
-#pragma unused(key)
GPBUnknownField *field = value;
size_t *result = context;
*result += [field serializedSize];
@@ -201,16 +193,13 @@
- (size_t)serializedSize {
size_t result = 0;
if (fields_) {
- CFDictionaryApplyFunction(fields_, GPBUnknownFieldSetSerializedSize,
- &result);
+ CFDictionaryApplyFunction(fields_, GPBUnknownFieldSetSerializedSize, &result);
}
return result;
}
-static void GPBUnknownFieldSetWriteAsMessageSetTo(const void *key,
- const void *value,
+static void GPBUnknownFieldSetWriteAsMessageSetTo(__unused const void *key, const void *value,
void *context) {
-#pragma unused(key)
GPBUnknownField *field = value;
GPBCodedOutputStream *output = context;
[field writeAsMessageSetExtensionToOutput:output];
@@ -218,15 +207,12 @@
- (void)writeAsMessageSetTo:(GPBCodedOutputStream *)output {
if (fields_) {
- CFDictionaryApplyFunction(fields_, GPBUnknownFieldSetWriteAsMessageSetTo,
- output);
+ CFDictionaryApplyFunction(fields_, GPBUnknownFieldSetWriteAsMessageSetTo, output);
}
}
-static void GPBUnknownFieldSetSerializedSizeAsMessageSet(const void *key,
- const void *value,
- void *context) {
-#pragma unused(key)
+static void GPBUnknownFieldSetSerializedSizeAsMessageSet(__unused const void *key,
+ const void *value, void *context) {
GPBUnknownField *field = value;
size_t *result = context;
*result += [field serializedSizeAsMessageSetExtension];
@@ -235,16 +221,14 @@
- (size_t)serializedSizeAsMessageSet {
size_t result = 0;
if (fields_) {
- CFDictionaryApplyFunction(
- fields_, GPBUnknownFieldSetSerializedSizeAsMessageSet, &result);
+ CFDictionaryApplyFunction(fields_, GPBUnknownFieldSetSerializedSizeAsMessageSet, &result);
}
return result;
}
- (NSData *)data {
NSMutableData *data = [NSMutableData dataWithLength:self.serializedSize];
- GPBCodedOutputStream *output =
- [[GPBCodedOutputStream alloc] initWithData:data];
+ GPBCodedOutputStream *output = [[GPBCodedOutputStream alloc] initWithData:data];
[self writeToCodedOutputStream:output];
[output release];
return data;
@@ -260,8 +244,8 @@
if (!fields_) {
// Use a custom dictionary here because the keys are numbers and conversion
// back and forth from NSNumber isn't worth the cost.
- fields_ = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, NULL,
- &kCFTypeDictionaryValueCallBacks);
+ fields_ =
+ CFDictionaryCreateMutable(kCFAllocatorDefault, 0, NULL, &kCFTypeDictionaryValueCallBacks);
}
ssize_t key = number;
CFDictionarySetValue(fields_, (const void *)key, field);
@@ -269,8 +253,7 @@
- (GPBUnknownField *)mutableFieldForNumber:(int32_t)number create:(BOOL)create {
ssize_t key = number;
- GPBUnknownField *existing =
- fields_ ? CFDictionaryGetValue(fields_, (const void *)key) : nil;
+ GPBUnknownField *existing = fields_ ? CFDictionaryGetValue(fields_, (const void *)key) : nil;
if (!existing && create) {
existing = [[GPBUnknownField alloc] initWithNumber:number];
// This retains existing.
@@ -280,10 +263,8 @@
return existing;
}
-static void GPBUnknownFieldSetMergeUnknownFields(const void *key,
- const void *value,
+static void GPBUnknownFieldSetMergeUnknownFields(__unused const void *key, const void *value,
void *context) {
-#pragma unused(key)
GPBUnknownField *field = value;
GPBUnknownFieldSet *self = context;
@@ -304,8 +285,7 @@
- (void)mergeUnknownFields:(GPBUnknownFieldSet *)other {
if (other && other->fields_) {
- CFDictionaryApplyFunction(other->fields_,
- GPBUnknownFieldSetMergeUnknownFields, self);
+ CFDictionaryApplyFunction(other->fields_, GPBUnknownFieldSetMergeUnknownFields, self);
}
}
@@ -362,8 +342,7 @@
}
- (void)mergeMessageSetMessage:(int32_t)number data:(NSData *)messageData {
- [[self mutableFieldForNumber:number create:YES]
- addLengthDelimited:messageData];
+ [[self mutableFieldForNumber:number create:YES] addLengthDelimited:messageData];
}
- (void)addUnknownMapEntry:(int32_t)fieldNum value:(NSData *)data {
diff --git a/objectivec/GPBUtilities.h b/objectivec/GPBUtilities.h
index 75759b2..e49ada5 100644
--- a/objectivec/GPBUtilities.h
+++ b/objectivec/GPBUtilities.h
@@ -50,8 +50,7 @@
*
* @return An NSString with the TextFormat of the message.
**/
-NSString *GPBTextFormatForMessage(GPBMessage *message,
- NSString * __nullable lineIndent);
+NSString *GPBTextFormatForMessage(GPBMessage *message, NSString *__nullable lineIndent);
/**
* Generates a string that should be a valid "TextFormat" for the C++ version
@@ -63,8 +62,8 @@
*
* @return An NSString with the TextFormat of the unknown field set.
**/
-NSString *GPBTextFormatForUnknownFieldSet(GPBUnknownFieldSet * __nullable unknownSet,
- NSString * __nullable lineIndent);
+NSString *GPBTextFormatForUnknownFieldSet(GPBUnknownFieldSet *__nullable unknownSet,
+ NSString *__nullable lineIndent);
/**
* Checks if the given field number is set on a message.
@@ -102,9 +101,11 @@
**/
void GPBClearOneof(GPBMessage *self, GPBOneofDescriptor *oneof);
+// Disable clang-format for the macros.
+// clang-format off
+
//%PDDM-EXPAND GPB_ACCESSORS()
// This block of code is generated, do not edit it directly.
-// clang-format off
//
@@ -395,9 +396,10 @@
GPBFieldDescriptor *field,
id dictionary);
-// clang-format on
//%PDDM-EXPAND-END GPB_ACCESSORS()
+// clang-format on
+
/**
* Returns an empty NSData to assign to byte fields when you wish to assign them
* to empty. Prevents allocating a lot of little [NSData data] objects.
@@ -413,6 +415,8 @@
CF_EXTERN_C_END
+// Disable clang-format for the macros.
+// clang-format off
//%PDDM-DEFINE GPB_ACCESSORS()
//%
@@ -549,3 +553,5 @@
//% **/
//%void GPBSetMessage##NAME##Field(GPBMessage *self, GPBFieldDescriptor *field, TYPE TisP##value);
//%
+
+// clang-format on
diff --git a/objectivec/GPBUtilities.m b/objectivec/GPBUtilities.m
index b72d0e2..5c8ee04 100644
--- a/objectivec/GPBUtilities.m
+++ b/objectivec/GPBUtilities.m
@@ -45,28 +45,24 @@
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdirect-ivar-access"
-static void AppendTextFormatForMessage(GPBMessage *message,
- NSMutableString *toStr,
+static void AppendTextFormatForMessage(GPBMessage *message, NSMutableString *toStr,
NSString *lineIndent);
// Are two datatypes the same basic type representation (ex Int32 and SInt32).
// Marked unused because currently only called from asserts/debug.
-static BOOL DataTypesEquivalent(GPBDataType type1,
- GPBDataType type2) __attribute__ ((unused));
+static BOOL DataTypesEquivalent(GPBDataType type1, GPBDataType type2) __attribute__((unused));
// Basic type representation for a type (ex: for SInt32 it is Int32).
// Marked unused because currently only called from asserts/debug.
-static GPBDataType BaseDataType(GPBDataType type) __attribute__ ((unused));
+static GPBDataType BaseDataType(GPBDataType type) __attribute__((unused));
// String name for a data type.
// Marked unused because currently only called from asserts/debug.
-static NSString *TypeToString(GPBDataType dataType) __attribute__ ((unused));
+static NSString *TypeToString(GPBDataType dataType) __attribute__((unused));
// Helper for clearing oneofs.
-static void GPBMaybeClearOneofPrivate(GPBMessage *self,
- GPBOneofDescriptor *oneof,
- int32_t oneofHasIndex,
- uint32_t fieldNumberNotToClear);
+static void GPBMaybeClearOneofPrivate(GPBMessage *self, GPBOneofDescriptor *oneof,
+ int32_t oneofHasIndex, uint32_t fieldNumberNotToClear);
NSData *GPBEmptyNSData(void) {
static dispatch_once_t onceToken;
@@ -118,52 +114,53 @@
id rawFieldMap = GPBGetObjectIvarWithFieldNoAutocreate(msg, field);
switch (field.mapKeyDataType) {
case GPBDataTypeBool:
- [(GPBBoolObjectDictionary*)rawFieldMap enumerateKeysAndObjectsUsingBlock:^(
- BOOL key, id _Nonnull object, BOOL * _Nonnull stop) {
- #pragma unused(key, stop)
- [todo addObject:object];
- }];
+ [(GPBBoolObjectDictionary *)rawFieldMap
+ enumerateKeysAndObjectsUsingBlock:^(__unused BOOL key, id _Nonnull object,
+ __unused BOOL *_Nonnull stop) {
+ [todo addObject:object];
+ }];
break;
case GPBDataTypeFixed32:
case GPBDataTypeUInt32:
- [(GPBUInt32ObjectDictionary*)rawFieldMap enumerateKeysAndObjectsUsingBlock:^(
- uint32_t key, id _Nonnull object, BOOL * _Nonnull stop) {
- #pragma unused(key, stop)
- [todo addObject:object];
- }];
+ [(GPBUInt32ObjectDictionary *)rawFieldMap
+ enumerateKeysAndObjectsUsingBlock:^(__unused uint32_t key, id _Nonnull object,
+ __unused BOOL *_Nonnull stop) {
+ [todo addObject:object];
+ }];
break;
case GPBDataTypeInt32:
case GPBDataTypeSFixed32:
case GPBDataTypeSInt32:
- [(GPBInt32ObjectDictionary*)rawFieldMap enumerateKeysAndObjectsUsingBlock:^(
- int32_t key, id _Nonnull object, BOOL * _Nonnull stop) {
- #pragma unused(key, stop)
- [todo addObject:object];
- }];
+ [(GPBInt32ObjectDictionary *)rawFieldMap
+ enumerateKeysAndObjectsUsingBlock:^(__unused int32_t key, id _Nonnull object,
+ __unused BOOL *_Nonnull stop) {
+ [todo addObject:object];
+ }];
break;
case GPBDataTypeFixed64:
case GPBDataTypeUInt64:
- [(GPBUInt64ObjectDictionary*)rawFieldMap enumerateKeysAndObjectsUsingBlock:^(
- uint64_t key, id _Nonnull object, BOOL * _Nonnull stop) {
- #pragma unused(key, stop)
- [todo addObject:object];
- }];
+ [(GPBUInt64ObjectDictionary *)rawFieldMap
+ enumerateKeysAndObjectsUsingBlock:^(__unused uint64_t key, id _Nonnull object,
+ __unused BOOL *_Nonnull stop) {
+ [todo addObject:object];
+ }];
break;
case GPBDataTypeInt64:
case GPBDataTypeSFixed64:
case GPBDataTypeSInt64:
- [(GPBInt64ObjectDictionary*)rawFieldMap enumerateKeysAndObjectsUsingBlock:^(
- int64_t key, id _Nonnull object, BOOL * _Nonnull stop) {
- #pragma unused(key, stop)
- [todo addObject:object];
- }];
+ [(GPBInt64ObjectDictionary *)rawFieldMap
+ enumerateKeysAndObjectsUsingBlock:^(__unused int64_t key, id _Nonnull object,
+ __unused BOOL *_Nonnull stop) {
+ [todo addObject:object];
+ }];
break;
case GPBDataTypeString:
- [(NSDictionary*)rawFieldMap enumerateKeysAndObjectsUsingBlock:^(
- NSString * _Nonnull key, GPBMessage * _Nonnull obj, BOOL * _Nonnull stop) {
- #pragma unused(key, stop)
- [todo addObject:obj];
- }];
+ [(NSDictionary *)rawFieldMap
+ enumerateKeysAndObjectsUsingBlock:^(__unused NSString *_Nonnull key,
+ GPBMessage *_Nonnull obj,
+ __unused BOOL *_Nonnull stop) {
+ [todo addObject:obj];
+ }];
break;
case GPBDataTypeFloat:
case GPBDataTypeDouble:
@@ -175,8 +172,8 @@
}
break;
} // switch(field.mapKeyDataType)
- } // switch(field.fieldType)
- } // for(fields)
+ } // switch(field.fieldType)
+ } // for(fields)
// Handle any extensions holding messages.
for (GPBExtensionDescriptor *extension in [msg extensionsCurrentlySet]) {
@@ -195,7 +192,6 @@
} // while(todo.count)
}
-
// -- About Version Checks --
// There's actually 3 places these checks all come into play:
// 1. When the generated source is compile into .o files, the header check
@@ -228,8 +224,7 @@
format:@"Proto generation source compiled against runtime"
@" version %d, but this version of the runtime only"
@" supports back to %d!",
- objcRuntimeVersion,
- GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION];
+ objcRuntimeVersion, GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION];
}
}
@@ -288,18 +283,16 @@
}
void GPBClearOneof(GPBMessage *self, GPBOneofDescriptor *oneof) {
- #if defined(DEBUG) && DEBUG
- NSCAssert([[self descriptor] oneofWithName:oneof.name] == oneof,
- @"OneofDescriptor %@ doesn't appear to be for %@ messages.",
- oneof.name, [self class]);
- #endif
+#if defined(DEBUG) && DEBUG
+ NSCAssert([[self descriptor] oneofWithName:oneof.name] == oneof,
+ @"OneofDescriptor %@ doesn't appear to be for %@ messages.", oneof.name, [self class]);
+#endif
GPBFieldDescriptor *firstField = oneof->fields_[0];
GPBMaybeClearOneofPrivate(self, oneof, firstField->description_->hasIndex, 0);
}
BOOL GPBGetHasIvar(GPBMessage *self, int32_t idx, uint32_t fieldNumber) {
- NSCAssert(self->messageStorage_ != NULL,
- @"%@: All messages should have storage (from init)",
+ NSCAssert(self->messageStorage_ != NULL, @"%@: All messages should have storage (from init)",
[self class]);
if (idx < 0) {
NSCAssert(fieldNumber != 0, @"Invalid field number.");
@@ -309,21 +302,18 @@
NSCAssert(idx != GPBNoHasBit, @"Invalid has bit.");
uint32_t byteIndex = idx / 32;
uint32_t bitMask = (1U << (idx % 32));
- BOOL hasIvar =
- (self->messageStorage_->_has_storage_[byteIndex] & bitMask) ? YES : NO;
+ BOOL hasIvar = (self->messageStorage_->_has_storage_[byteIndex] & bitMask) ? YES : NO;
return hasIvar;
}
}
uint32_t GPBGetHasOneof(GPBMessage *self, int32_t idx) {
- NSCAssert(idx < 0, @"%@: invalid index (%d) for oneof.",
- [self class], idx);
+ NSCAssert(idx < 0, @"%@: invalid index (%d) for oneof.", [self class], idx);
uint32_t result = self->messageStorage_->_has_storage_[-idx];
return result;
}
-void GPBSetHasIvar(GPBMessage *self, int32_t idx, uint32_t fieldNumber,
- BOOL value) {
+void GPBSetHasIvar(GPBMessage *self, int32_t idx, uint32_t fieldNumber, BOOL value) {
if (idx < 0) {
NSCAssert(fieldNumber != 0, @"Invalid field number.");
uint32_t *has_storage = self->messageStorage_->_has_storage_;
@@ -341,10 +331,8 @@
}
}
-static void GPBMaybeClearOneofPrivate(GPBMessage *self,
- GPBOneofDescriptor *oneof,
- int32_t oneofHasIndex,
- uint32_t fieldNumberNotToClear) {
+static void GPBMaybeClearOneofPrivate(GPBMessage *self, GPBOneofDescriptor *oneof,
+ int32_t oneofHasIndex, uint32_t fieldNumberNotToClear) {
uint32_t fieldNumberSet = GPBGetHasOneof(self, oneofHasIndex);
if ((fieldNumberSet == fieldNumberNotToClear) || (fieldNumberSet == 0)) {
// Do nothing/nothing set in the oneof.
@@ -354,9 +342,8 @@
// Like GPBClearMessageField(), free the memory if an objecttype is set,
// pod types don't need to do anything.
GPBFieldDescriptor *fieldSet = [oneof fieldWithNumber:fieldNumberSet];
- NSCAssert(fieldSet,
- @"%@: oneof set to something (%u) not in the oneof?",
- [self class], fieldNumberSet);
+ NSCAssert(fieldSet, @"%@: oneof set to something (%u) not in the oneof?", [self class],
+ fieldNumberSet);
if (fieldSet && GPBFieldStoresObject(fieldSet)) {
uint8_t *storage = (uint8_t *)self->messageStorage_;
id *typePtr = (id *)&storage[fieldSet->description_->offset];
@@ -371,6 +358,8 @@
#pragma mark - IVar accessors
+// clang-format off
+
//%PDDM-DEFINE IVAR_POD_ACCESSORS_DEFN(NAME, TYPE)
//%TYPE GPBGetMessage##NAME##Field(GPBMessage *self,
//% TYPE$S NAME$S GPBFieldDescriptor *field) {
@@ -501,11 +490,12 @@
//%}
//%
+// clang-format on
+
// Object types are handled slightly differently, they need to be released
// and retained.
-void GPBClearAutocreatedMessageIvarWithField(GPBMessage *self,
- GPBFieldDescriptor *field) {
+void GPBClearAutocreatedMessageIvarWithField(GPBMessage *self, GPBFieldDescriptor *field) {
if (GPBGetHasIvarField(self, field)) {
return;
}
@@ -518,14 +508,12 @@
}
// This exists only for bridging some aliased types, nothing else should use it.
-static void GPBSetObjectIvarWithField(GPBMessage *self,
- GPBFieldDescriptor *field, id value) {
+static void GPBSetObjectIvarWithField(GPBMessage *self, GPBFieldDescriptor *field, id value) {
if (self == nil || field == nil) return;
GPBSetRetainedObjectIvarWithFieldPrivate(self, field, [value retain]);
}
-static void GPBSetCopyObjectIvarWithField(GPBMessage *self,
- GPBFieldDescriptor *field, id value);
+static void GPBSetCopyObjectIvarWithField(GPBMessage *self, GPBFieldDescriptor *field, id value);
// GPBSetCopyObjectIvarWithField is blocked from the analyzer because it flags
// a leak for the -copy even though GPBSetRetainedObjectIvarWithFieldPrivate
@@ -533,23 +521,19 @@
// with the -retain in GPBSetObjectIvarWithField.
#if !defined(__clang_analyzer__)
// This exists only for bridging some aliased types, nothing else should use it.
-static void GPBSetCopyObjectIvarWithField(GPBMessage *self,
- GPBFieldDescriptor *field, id value) {
+static void GPBSetCopyObjectIvarWithField(GPBMessage *self, GPBFieldDescriptor *field, id value) {
if (self == nil || field == nil) return;
GPBSetRetainedObjectIvarWithFieldPrivate(self, field, [value copy]);
}
#endif // !defined(__clang_analyzer__)
-void GPBSetObjectIvarWithFieldPrivate(GPBMessage *self,
- GPBFieldDescriptor *field, id value) {
+void GPBSetObjectIvarWithFieldPrivate(GPBMessage *self, GPBFieldDescriptor *field, id value) {
GPBSetRetainedObjectIvarWithFieldPrivate(self, field, [value retain]);
}
-void GPBSetRetainedObjectIvarWithFieldPrivate(GPBMessage *self,
- GPBFieldDescriptor *field,
+void GPBSetRetainedObjectIvarWithFieldPrivate(GPBMessage *self, GPBFieldDescriptor *field,
id value) {
- NSCAssert(self->messageStorage_ != NULL,
- @"%@: All messages should have storage (from init)",
+ NSCAssert(self->messageStorage_ != NULL, @"%@: All messages should have storage (from init)",
[self class]);
#if defined(__clang_analyzer__)
if (self->messageStorage_ == NULL) return;
@@ -558,8 +542,7 @@
BOOL isMapOrArray = GPBFieldIsMapOrArray(field);
BOOL fieldIsMessage = GPBDataTypeIsMessage(fieldType);
#if defined(DEBUG) && DEBUG
- if (value == nil && !isMapOrArray && !fieldIsMessage &&
- field.hasDefaultValue) {
+ if (value == nil && !isMapOrArray && !fieldIsMessage && field.hasDefaultValue) {
// Setting a message to nil is an obvious way to "clear" the value
// as there is no way to set a non-empty default value for messages.
//
@@ -580,8 +563,8 @@
@"empty, or call '%@.%@ = NO' to reset it to it's default value of "
@"'%@'. Defaulting to resetting default value.",
className, propName, className, propName,
- (fieldType == GPBDataTypeString) ? @"@\"\"" : @"GPBEmptyNSData()",
- className, hasSel, field.defaultValue.valueString);
+ (fieldType == GPBDataTypeString) ? @"@\"\"" : @"GPBEmptyNSData()", className, hasSel,
+ field.defaultValue.valueString);
// Note: valueString, depending on the type, it could easily be
// valueData/valueMessage.
}
@@ -598,8 +581,7 @@
BOOL setHasValue = (value != nil);
// If the field should clear on a "zero" value, then check if the string/data
// was zero length, and clear instead.
- if (((fieldDesc->flags & GPBFieldClearHasIvarOnZero) != 0) &&
- ([value length] == 0)) {
+ if (((fieldDesc->flags & GPBFieldClearHasIvarOnZero) != 0) && ([value length] == 0)) {
setHasValue = NO;
// The value passed in was retained, it must be released since we
// aren't saving anything in the field.
@@ -633,10 +615,9 @@
gpbArray->_autocreator = nil;
}
}
- } else { // GPBFieldTypeMap
+ } else { // GPBFieldTypeMap
// If the old map was autocreated by us, then clear it.
- if ((field.mapKeyDataType == GPBDataTypeString) &&
- GPBDataTypeIsObject(fieldType)) {
+ if ((field.mapKeyDataType == GPBDataTypeString) && GPBDataTypeIsObject(fieldType)) {
if ([oldValue isKindOfClass:[GPBAutocreatedDictionary class]]) {
GPBAutocreatedDictionary *autoDict = oldValue;
if (autoDict->_autocreator == self) {
@@ -664,8 +645,7 @@
GPBBecomeVisibleToAutocreator(self);
}
-id GPBGetObjectIvarWithFieldNoAutocreate(GPBMessage *self,
- GPBFieldDescriptor *field) {
+id GPBGetObjectIvarWithFieldNoAutocreate(GPBMessage *self, GPBFieldDescriptor *field) {
if (self->messageStorage_ == nil) {
return nil;
}
@@ -676,80 +656,68 @@
// Only exists for public api, no core code should use this.
int32_t GPBGetMessageEnumField(GPBMessage *self, GPBFieldDescriptor *field) {
- #if defined(DEBUG) && DEBUG
- NSCAssert([[self descriptor] fieldWithNumber:field.number] == field,
- @"FieldDescriptor %@ doesn't appear to be for %@ messages.",
- field.name, [self class]);
- NSCAssert(GPBGetFieldDataType(field) == GPBDataTypeEnum,
- @"Attempting to get value of type Enum from field %@ "
- @"of %@ which is of type %@.",
- [self class], field.name,
- TypeToString(GPBGetFieldDataType(field)));
- #endif
+#if defined(DEBUG) && DEBUG
+ NSCAssert([[self descriptor] fieldWithNumber:field.number] == field,
+ @"FieldDescriptor %@ doesn't appear to be for %@ messages.", field.name, [self class]);
+ NSCAssert(GPBGetFieldDataType(field) == GPBDataTypeEnum,
+ @"Attempting to get value of type Enum from field %@ "
+ @"of %@ which is of type %@.",
+ [self class], field.name, TypeToString(GPBGetFieldDataType(field)));
+#endif
int32_t result = GPBGetMessageInt32Field(self, field);
// If this is presevering unknown enums, make sure the value is valid before
// returning it.
GPBFileSyntax syntax = [self descriptor].file.syntax;
- if (GPBHasPreservingUnknownEnumSemantics(syntax) &&
- ![field isValidEnumValue:result]) {
+ if (GPBHasPreservingUnknownEnumSemantics(syntax) && ![field isValidEnumValue:result]) {
result = kGPBUnrecognizedEnumeratorValue;
}
return result;
}
// Only exists for public api, no core code should use this.
-void GPBSetMessageEnumField(GPBMessage *self, GPBFieldDescriptor *field,
- int32_t value) {
- #if defined(DEBUG) && DEBUG
- NSCAssert([[self descriptor] fieldWithNumber:field.number] == field,
- @"FieldDescriptor %@ doesn't appear to be for %@ messages.",
- field.name, [self class]);
- NSCAssert(GPBGetFieldDataType(field) == GPBDataTypeEnum,
- @"Attempting to set field %@ of %@ which is of type %@ with "
- @"value of type Enum.",
- [self class], field.name,
- TypeToString(GPBGetFieldDataType(field)));
- #endif
+void GPBSetMessageEnumField(GPBMessage *self, GPBFieldDescriptor *field, int32_t value) {
+#if defined(DEBUG) && DEBUG
+ NSCAssert([[self descriptor] fieldWithNumber:field.number] == field,
+ @"FieldDescriptor %@ doesn't appear to be for %@ messages.", field.name, [self class]);
+ NSCAssert(GPBGetFieldDataType(field) == GPBDataTypeEnum,
+ @"Attempting to set field %@ of %@ which is of type %@ with "
+ @"value of type Enum.",
+ [self class], field.name, TypeToString(GPBGetFieldDataType(field)));
+#endif
GPBSetEnumIvarWithFieldPrivate(self, field, value);
}
-void GPBSetEnumIvarWithFieldPrivate(GPBMessage *self,
- GPBFieldDescriptor *field, int32_t value) {
+void GPBSetEnumIvarWithFieldPrivate(GPBMessage *self, GPBFieldDescriptor *field, int32_t value) {
// Don't allow in unknown values. Proto3 can use the Raw method.
if (![field isValidEnumValue:value]) {
[NSException raise:NSInvalidArgumentException
- format:@"%@.%@: Attempt to set an unknown enum value (%d)",
- [self class], field.name, value];
+ format:@"%@.%@: Attempt to set an unknown enum value (%d)", [self class],
+ field.name, value];
}
GPBSetInt32IvarWithFieldPrivate(self, field, value);
}
// Only exists for public api, no core code should use this.
-int32_t GPBGetMessageRawEnumField(GPBMessage *self,
- GPBFieldDescriptor *field) {
+int32_t GPBGetMessageRawEnumField(GPBMessage *self, GPBFieldDescriptor *field) {
int32_t result = GPBGetMessageInt32Field(self, field);
return result;
}
// Only exists for public api, no core code should use this.
-void GPBSetMessageRawEnumField(GPBMessage *self, GPBFieldDescriptor *field,
- int32_t value) {
+void GPBSetMessageRawEnumField(GPBMessage *self, GPBFieldDescriptor *field, int32_t value) {
GPBSetInt32IvarWithFieldPrivate(self, field, value);
}
-BOOL GPBGetMessageBoolField(GPBMessage *self,
- GPBFieldDescriptor *field) {
+BOOL GPBGetMessageBoolField(GPBMessage *self, GPBFieldDescriptor *field) {
#if defined(DEBUG) && DEBUG
NSCAssert([[self descriptor] fieldWithNumber:field.number] == field,
- @"FieldDescriptor %@ doesn't appear to be for %@ messages.",
- field.name, [self class]);
+ @"FieldDescriptor %@ doesn't appear to be for %@ messages.", field.name, [self class]);
NSCAssert(DataTypesEquivalent(GPBGetFieldDataType(field), GPBDataTypeBool),
@"Attempting to get value of type bool from field %@ "
@"of %@ which is of type %@.",
- [self class], field.name,
- TypeToString(GPBGetFieldDataType(field)));
+ [self class], field.name, TypeToString(GPBGetFieldDataType(field)));
#endif
if (GPBGetHasIvarField(self, field)) {
// Bools are stored in the has bits to avoid needing explicit space in the
@@ -764,26 +732,20 @@
}
// Only exists for public api, no core code should use this.
-void GPBSetMessageBoolField(GPBMessage *self,
- GPBFieldDescriptor *field,
- BOOL value) {
+void GPBSetMessageBoolField(GPBMessage *self, GPBFieldDescriptor *field, BOOL value) {
if (self == nil || field == nil) return;
- #if defined(DEBUG) && DEBUG
- NSCAssert([[self descriptor] fieldWithNumber:field.number] == field,
- @"FieldDescriptor %@ doesn't appear to be for %@ messages.",
- field.name, [self class]);
- NSCAssert(DataTypesEquivalent(GPBGetFieldDataType(field), GPBDataTypeBool),
- @"Attempting to set field %@ of %@ which is of type %@ with "
- @"value of type bool.",
- [self class], field.name,
- TypeToString(GPBGetFieldDataType(field)));
- #endif
+#if defined(DEBUG) && DEBUG
+ NSCAssert([[self descriptor] fieldWithNumber:field.number] == field,
+ @"FieldDescriptor %@ doesn't appear to be for %@ messages.", field.name, [self class]);
+ NSCAssert(DataTypesEquivalent(GPBGetFieldDataType(field), GPBDataTypeBool),
+ @"Attempting to set field %@ of %@ which is of type %@ with "
+ @"value of type bool.",
+ [self class], field.name, TypeToString(GPBGetFieldDataType(field)));
+#endif
GPBSetBoolIvarWithFieldPrivate(self, field, value);
}
-void GPBSetBoolIvarWithFieldPrivate(GPBMessage *self,
- GPBFieldDescriptor *field,
- BOOL value) {
+void GPBSetBoolIvarWithFieldPrivate(GPBMessage *self, GPBFieldDescriptor *field, BOOL value) {
GPBMessageFieldDescription *fieldDesc = field->description_;
GPBOneofDescriptor *oneof = field->containingOneof_;
if (oneof) {
@@ -798,15 +760,15 @@
// If the value is zero, then we only count the field as "set" if the field
// shouldn't auto clear on zero.
- BOOL hasValue = ((value != (BOOL)0)
- || ((fieldDesc->flags & GPBFieldClearHasIvarOnZero) == 0));
+ BOOL hasValue = ((value != (BOOL)0) || ((fieldDesc->flags & GPBFieldClearHasIvarOnZero) == 0));
GPBSetHasIvar(self, fieldDesc->hasIndex, fieldDesc->number, hasValue);
GPBBecomeVisibleToAutocreator(self);
}
+// clang-format off
+
//%PDDM-EXPAND IVAR_POD_ACCESSORS_DEFN(Int32, int32_t)
// This block of code is generated, do not edit it directly.
-// clang-format off
int32_t GPBGetMessageInt32Field(GPBMessage *self,
GPBFieldDescriptor *field) {
@@ -876,10 +838,8 @@
GPBBecomeVisibleToAutocreator(self);
}
-// clang-format on
//%PDDM-EXPAND IVAR_POD_ACCESSORS_DEFN(UInt32, uint32_t)
// This block of code is generated, do not edit it directly.
-// clang-format off
uint32_t GPBGetMessageUInt32Field(GPBMessage *self,
GPBFieldDescriptor *field) {
@@ -949,10 +909,8 @@
GPBBecomeVisibleToAutocreator(self);
}
-// clang-format on
//%PDDM-EXPAND IVAR_POD_ACCESSORS_DEFN(Int64, int64_t)
// This block of code is generated, do not edit it directly.
-// clang-format off
int64_t GPBGetMessageInt64Field(GPBMessage *self,
GPBFieldDescriptor *field) {
@@ -1022,10 +980,8 @@
GPBBecomeVisibleToAutocreator(self);
}
-// clang-format on
//%PDDM-EXPAND IVAR_POD_ACCESSORS_DEFN(UInt64, uint64_t)
// This block of code is generated, do not edit it directly.
-// clang-format off
uint64_t GPBGetMessageUInt64Field(GPBMessage *self,
GPBFieldDescriptor *field) {
@@ -1095,10 +1051,8 @@
GPBBecomeVisibleToAutocreator(self);
}
-// clang-format on
//%PDDM-EXPAND IVAR_POD_ACCESSORS_DEFN(Float, float)
// This block of code is generated, do not edit it directly.
-// clang-format off
float GPBGetMessageFloatField(GPBMessage *self,
GPBFieldDescriptor *field) {
@@ -1168,10 +1122,8 @@
GPBBecomeVisibleToAutocreator(self);
}
-// clang-format on
//%PDDM-EXPAND IVAR_POD_ACCESSORS_DEFN(Double, double)
// This block of code is generated, do not edit it directly.
-// clang-format off
double GPBGetMessageDoubleField(GPBMessage *self,
GPBFieldDescriptor *field) {
@@ -1241,14 +1193,12 @@
GPBBecomeVisibleToAutocreator(self);
}
-// clang-format on
//%PDDM-EXPAND-END (6 expansions)
// Aliases are function calls that are virtually the same.
//%PDDM-EXPAND IVAR_ALIAS_DEFN_COPY_OBJECT(String, NSString)
// This block of code is generated, do not edit it directly.
-// clang-format off
// Only exists for public api, no core code should use this.
NSString *GPBGetMessageStringField(GPBMessage *self,
@@ -1279,10 +1229,8 @@
GPBSetCopyObjectIvarWithField(self, field, (id)value);
}
-// clang-format on
//%PDDM-EXPAND IVAR_ALIAS_DEFN_COPY_OBJECT(Bytes, NSData)
// This block of code is generated, do not edit it directly.
-// clang-format off
// Only exists for public api, no core code should use this.
NSData *GPBGetMessageBytesField(GPBMessage *self,
@@ -1313,10 +1261,8 @@
GPBSetCopyObjectIvarWithField(self, field, (id)value);
}
-// clang-format on
//%PDDM-EXPAND IVAR_ALIAS_DEFN_OBJECT(Message, GPBMessage)
// This block of code is generated, do not edit it directly.
-// clang-format off
// Only exists for public api, no core code should use this.
GPBMessage *GPBGetMessageMessageField(GPBMessage *self,
@@ -1347,10 +1293,8 @@
GPBSetObjectIvarWithField(self, field, (id)value);
}
-// clang-format on
//%PDDM-EXPAND IVAR_ALIAS_DEFN_OBJECT(Group, GPBMessage)
// This block of code is generated, do not edit it directly.
-// clang-format off
// Only exists for public api, no core code should use this.
GPBMessage *GPBGetMessageGroupField(GPBMessage *self,
@@ -1381,9 +1325,10 @@
GPBSetObjectIvarWithField(self, field, (id)value);
}
-// clang-format on
//%PDDM-EXPAND-END (4 expansions)
+// clang-format on
+
// GPBGetMessageRepeatedField is defined in GPBMessage.m
// Only exists for public api, no core code should use this.
@@ -1391,8 +1336,7 @@
#if defined(DEBUG) && DEBUG
if (field.fieldType != GPBFieldTypeRepeated) {
[NSException raise:NSInvalidArgumentException
- format:@"%@.%@ is not a repeated field.",
- [self class], field.name];
+ format:@"%@.%@ is not a repeated field.", [self class], field.name];
}
Class expectedClass = Nil;
switch (GPBGetFieldDataType(field)) {
@@ -1435,8 +1379,8 @@
}
if (array && ![array isKindOfClass:expectedClass]) {
[NSException raise:NSInvalidArgumentException
- format:@"%@.%@: Expected %@ object, got %@.",
- [self class], field.name, expectedClass, [array class]];
+ format:@"%@.%@: Expected %@ object, got %@.", [self class], field.name,
+ expectedClass, [array class]];
}
#endif
GPBSetObjectIvarWithField(self, field, array);
@@ -1468,7 +1412,7 @@
case GPBDataTypeBytes:
case GPBDataTypeString:
return type;
- }
+ }
}
static BOOL DataTypesEquivalent(GPBDataType type1, GPBDataType type2) {
@@ -1510,13 +1454,11 @@
// GPBGetMessageMapField is defined in GPBMessage.m
// Only exists for public api, no core code should use this.
-void GPBSetMessageMapField(GPBMessage *self, GPBFieldDescriptor *field,
- id dictionary) {
+void GPBSetMessageMapField(GPBMessage *self, GPBFieldDescriptor *field, id dictionary) {
#if defined(DEBUG) && DEBUG
if (field.fieldType != GPBFieldTypeMap) {
[NSException raise:NSInvalidArgumentException
- format:@"%@.%@ is not a map<> field.",
- [self class], field.name];
+ format:@"%@.%@ is not a map<> field.", [self class], field.name];
}
if (dictionary) {
GPBDataType keyDataType = field.mapKeyDataType;
@@ -1527,20 +1469,17 @@
keyStr = @"String";
}
Class expectedClass = Nil;
- if ((keyDataType == GPBDataTypeString) &&
- GPBDataTypeIsObject(valueDataType)) {
+ if ((keyDataType == GPBDataTypeString) && GPBDataTypeIsObject(valueDataType)) {
expectedClass = [NSMutableDictionary class];
} else {
- NSString *className =
- [NSString stringWithFormat:@"GPB%@%@Dictionary", keyStr, valueStr];
+ NSString *className = [NSString stringWithFormat:@"GPB%@%@Dictionary", keyStr, valueStr];
expectedClass = NSClassFromString(className);
NSCAssert(expectedClass, @"Missing a class (%@)?", expectedClass);
}
if (![dictionary isKindOfClass:expectedClass]) {
[NSException raise:NSInvalidArgumentException
- format:@"%@.%@: Expected %@ object, got %@.",
- [self class], field.name, expectedClass,
- [dictionary class]];
+ format:@"%@.%@: Expected %@ object, got %@.", [self class], field.name,
+ expectedClass, [dictionary class]];
}
}
#endif
@@ -1550,13 +1489,12 @@
#pragma mark - Misc Dynamic Runtime Utils
const char *GPBMessageEncodingForSelector(SEL selector, BOOL instanceSel) {
- Protocol *protocol =
- objc_getProtocol(GPBStringifySymbol(GPBMessageSignatureProtocol));
+ Protocol *protocol = objc_getProtocol(GPBStringifySymbol(GPBMessageSignatureProtocol));
NSCAssert(protocol, @"Missing GPBMessageSignatureProtocol");
struct objc_method_description description =
protocol_getMethodDescription(protocol, selector, NO, instanceSel);
- NSCAssert(description.name != Nil && description.types != nil,
- @"Missing method for selector %@", NSStringFromSelector(selector));
+ NSCAssert(description.name != Nil && description.types != nil, @"Missing method for selector %@",
+ NSStringFromSelector(selector));
return description.types;
}
@@ -1568,19 +1506,30 @@
for (NSUInteger i = 0; i < len; ++i) {
unichar aChar = [toPrint characterAtIndex:i];
switch (aChar) {
- case '\n': [destStr appendString:@"\\n"]; break;
- case '\r': [destStr appendString:@"\\r"]; break;
- case '\t': [destStr appendString:@"\\t"]; break;
- case '\"': [destStr appendString:@"\\\""]; break;
- case '\'': [destStr appendString:@"\\\'"]; break;
- case '\\': [destStr appendString:@"\\\\"]; break;
+ case '\n':
+ [destStr appendString:@"\\n"];
+ break;
+ case '\r':
+ [destStr appendString:@"\\r"];
+ break;
+ case '\t':
+ [destStr appendString:@"\\t"];
+ break;
+ case '\"':
+ [destStr appendString:@"\\\""];
+ break;
+ case '\'':
+ [destStr appendString:@"\\\'"];
+ break;
+ case '\\':
+ [destStr appendString:@"\\\\"];
+ break;
default:
// This differs slightly from the C++ code in that the C++ doesn't
// generate UTF8; it looks at the string in UTF8, but escapes every
// byte > 0x7E.
if (aChar < 0x20) {
- [destStr appendFormat:@"\\%d%d%d",
- (aChar / 64), ((aChar % 64) / 8), (aChar % 8)];
+ [destStr appendFormat:@"\\%d%d%d", (aChar / 64), ((aChar % 64) / 8), (aChar % 8)];
} else {
[destStr appendFormat:@"%C", aChar];
}
@@ -1596,12 +1545,24 @@
[destStr appendString:@"\""];
for (const char *srcEnd = src + srcLen; src < srcEnd; src++) {
switch (*src) {
- case '\n': [destStr appendString:@"\\n"]; break;
- case '\r': [destStr appendString:@"\\r"]; break;
- case '\t': [destStr appendString:@"\\t"]; break;
- case '\"': [destStr appendString:@"\\\""]; break;
- case '\'': [destStr appendString:@"\\\'"]; break;
- case '\\': [destStr appendString:@"\\\\"]; break;
+ case '\n':
+ [destStr appendString:@"\\n"];
+ break;
+ case '\r':
+ [destStr appendString:@"\\r"];
+ break;
+ case '\t':
+ [destStr appendString:@"\\t"];
+ break;
+ case '\"':
+ [destStr appendString:@"\\\""];
+ break;
+ case '\'':
+ [destStr appendString:@"\\\'"];
+ break;
+ case '\\':
+ [destStr appendString:@"\\\\"];
+ break;
default:
if (isprint(*src)) {
[destStr appendFormat:@"%c", *src];
@@ -1617,31 +1578,28 @@
[destStr appendString:@"\""];
}
-static void AppendTextFormatForMapMessageField(
- id map, GPBFieldDescriptor *field, NSMutableString *toStr,
- NSString *lineIndent, NSString *fieldName, NSString *lineEnding) {
+static void AppendTextFormatForMapMessageField(id map, GPBFieldDescriptor *field,
+ NSMutableString *toStr, NSString *lineIndent,
+ NSString *fieldName, NSString *lineEnding) {
GPBDataType keyDataType = field.mapKeyDataType;
GPBDataType valueDataType = GPBGetFieldDataType(field);
BOOL isMessageValue = GPBDataTypeIsMessage(valueDataType);
NSString *msgStartFirst =
[NSString stringWithFormat:@"%@%@ {%@\n", lineIndent, fieldName, lineEnding];
- NSString *msgStart =
- [NSString stringWithFormat:@"%@%@ {\n", lineIndent, fieldName];
+ NSString *msgStart = [NSString stringWithFormat:@"%@%@ {\n", lineIndent, fieldName];
NSString *msgEnd = [NSString stringWithFormat:@"%@}\n", lineIndent];
NSString *keyLine = [NSString stringWithFormat:@"%@ key: ", lineIndent];
- NSString *valueLine = [NSString stringWithFormat:@"%@ value%s ", lineIndent,
- (isMessageValue ? "" : ":")];
+ NSString *valueLine =
+ [NSString stringWithFormat:@"%@ value%s ", lineIndent, (isMessageValue ? "" : ":")];
__block BOOL isFirst = YES;
- if ((keyDataType == GPBDataTypeString) &&
- GPBDataTypeIsObject(valueDataType)) {
+ if ((keyDataType == GPBDataTypeString) && GPBDataTypeIsObject(valueDataType)) {
// map is an NSDictionary.
NSDictionary *dict = map;
- [dict enumerateKeysAndObjectsUsingBlock:^(NSString *key, id value, BOOL *stop) {
- #pragma unused(stop)
+ [dict enumerateKeysAndObjectsUsingBlock:^(NSString *key, id value, __unused BOOL *stop) {
[toStr appendString:(isFirst ? msgStartFirst : msgStart)];
isFirst = NO;
@@ -1741,10 +1699,8 @@
}
}
-static void AppendTextFormatForMessageField(GPBMessage *message,
- GPBFieldDescriptor *field,
- NSMutableString *toStr,
- NSString *lineIndent) {
+static void AppendTextFormatForMessageField(GPBMessage *message, GPBFieldDescriptor *field,
+ NSMutableString *toStr, NSString *lineIndent) {
id arrayOrMap;
NSUInteger count;
GPBFieldType fieldType = field.fieldType;
@@ -1792,8 +1748,7 @@
}
if (fieldType == GPBFieldTypeMap) {
- AppendTextFormatForMapMessageField(arrayOrMap, field, toStr, lineIndent,
- fieldName, lineEnding);
+ AppendTextFormatForMapMessageField(arrayOrMap, field, toStr, lineIndent, fieldName, lineEnding);
return;
}
@@ -1804,8 +1759,7 @@
BOOL isMessageField = GPBDataTypeIsMessage(fieldDataType);
for (NSUInteger j = 0; j < count; ++j) {
// Start the line.
- [toStr appendFormat:@"%@%@%s ", lineIndent, fieldName,
- (isMessageField ? "" : ":")];
+ [toStr appendFormat:@"%@%@%s ", lineIndent, fieldName, (isMessageField ? "" : ":")];
// The value.
switch (fieldDataType) {
@@ -1871,9 +1825,8 @@
case GPBDataTypeGroup:
case GPBDataTypeMessage: {
- GPBMessage *v =
- (isRepeated ? [(NSArray *)array objectAtIndex:j]
- : GPBGetObjectIvarWithField(message, field));
+ GPBMessage *v = (isRepeated ? [(NSArray *)array objectAtIndex:j]
+ : GPBGetObjectIvarWithField(message, field));
[toStr appendFormat:@"{%@\n", lineEnding];
NSString *subIndent = [lineIndent stringByAppendingString:@" "];
AppendTextFormatForMessage(v, toStr, subIndent);
@@ -1890,11 +1843,9 @@
} // for(count)
}
-static void AppendTextFormatForMessageExtensionRange(GPBMessage *message,
- NSArray *activeExtensions,
+static void AppendTextFormatForMessageExtensionRange(GPBMessage *message, NSArray *activeExtensions,
GPBExtensionRange range,
- NSMutableString *toStr,
- NSString *lineIndent) {
+ NSMutableString *toStr, NSString *lineIndent) {
uint32_t start = range.start;
uint32_t end = range.end;
for (GPBExtensionDescriptor *extension in activeExtensions) {
@@ -1963,8 +1914,7 @@
#undef FIELD_CASE
case GPBDataTypeBool:
- [toStr appendString:([(NSNumber *)curValue boolValue] ? @"true"
- : @"false")];
+ [toStr appendString:([(NSNumber *)curValue boolValue] ? @"true" : @"false")];
break;
case GPBDataTypeString:
@@ -1995,32 +1945,29 @@
} // for..in(activeExtensions)
}
-static void AppendTextFormatForMessage(GPBMessage *message,
- NSMutableString *toStr,
+static void AppendTextFormatForMessage(GPBMessage *message, NSMutableString *toStr,
NSString *lineIndent) {
GPBDescriptor *descriptor = [message descriptor];
NSArray *fieldsArray = descriptor->fields_;
NSUInteger fieldCount = fieldsArray.count;
const GPBExtensionRange *extensionRanges = descriptor.extensionRanges;
NSUInteger extensionRangesCount = descriptor.extensionRangesCount;
- NSArray *activeExtensions = [[message extensionsCurrentlySet]
- sortedArrayUsingSelector:@selector(compareByFieldNumber:)];
+ NSArray *activeExtensions =
+ [[message extensionsCurrentlySet] sortedArrayUsingSelector:@selector(compareByFieldNumber:)];
for (NSUInteger i = 0, j = 0; i < fieldCount || j < extensionRangesCount;) {
if (i == fieldCount) {
- AppendTextFormatForMessageExtensionRange(
- message, activeExtensions, extensionRanges[j++], toStr, lineIndent);
+ AppendTextFormatForMessageExtensionRange(message, activeExtensions, extensionRanges[j++],
+ toStr, lineIndent);
} else if (j == extensionRangesCount ||
GPBFieldNumber(fieldsArray[i]) < extensionRanges[j].start) {
- AppendTextFormatForMessageField(message, fieldsArray[i++], toStr,
- lineIndent);
+ AppendTextFormatForMessageField(message, fieldsArray[i++], toStr, lineIndent);
} else {
- AppendTextFormatForMessageExtensionRange(
- message, activeExtensions, extensionRanges[j++], toStr, lineIndent);
+ AppendTextFormatForMessageExtensionRange(message, activeExtensions, extensionRanges[j++],
+ toStr, lineIndent);
}
}
- NSString *unknownFieldsStr =
- GPBTextFormatForUnknownFieldSet(message.unknownFields, lineIndent);
+ NSString *unknownFieldsStr = GPBTextFormatForUnknownFieldSet(message.unknownFields, lineIndent);
if ([unknownFieldsStr length] > 0) {
[toStr appendFormat:@"%@# --- Unknown fields ---\n", lineIndent];
[toStr appendString:unknownFieldsStr];
@@ -2036,8 +1983,7 @@
return buildString;
}
-NSString *GPBTextFormatForUnknownFieldSet(GPBUnknownFieldSet *unknownSet,
- NSString *lineIndent) {
+NSString *GPBTextFormatForUnknownFieldSet(GPBUnknownFieldSet *unknownSet, NSString *lineIndent) {
if (unknownSet == nil) return @"";
if (lineIndent == nil) lineIndent = @"";
@@ -2045,17 +1991,15 @@
for (GPBUnknownField *field in [unknownSet sortedFields]) {
int32_t fieldNumber = [field number];
-#define PRINT_LOOP(PROPNAME, CTYPE, FORMAT) \
- [field.PROPNAME \
- enumerateValuesWithBlock:^(CTYPE value, NSUInteger idx, BOOL * stop) { \
- _Pragma("unused(idx, stop)"); \
- [result \
- appendFormat:@"%@%d: " #FORMAT "\n", lineIndent, fieldNumber, value]; \
+#define PRINT_LOOP(PROPNAME, CTYPE, FORMAT) \
+ [field.PROPNAME \
+ enumerateValuesWithBlock:^(CTYPE value, __unused NSUInteger idx, __unused BOOL * stop) { \
+ [result appendFormat:@"%@%d: " FORMAT "\n", lineIndent, fieldNumber, value]; \
}];
- PRINT_LOOP(varintList, uint64_t, %llu);
- PRINT_LOOP(fixed32List, uint32_t, 0x%X);
- PRINT_LOOP(fixed64List, uint64_t, 0x%llX);
+ PRINT_LOOP(varintList, uint64_t, "%llu");
+ PRINT_LOOP(fixed32List, uint32_t, "0x%X");
+ PRINT_LOOP(fixed64List, uint64_t, "0x%llX");
#undef PRINT_LOOP
@@ -2070,8 +2014,7 @@
for (GPBUnknownFieldSet *subUnknownSet in field.groupList) {
[result appendFormat:@"%@%d: {\n", lineIndent, fieldNumber];
NSString *subIndent = [lineIndent stringByAppendingString:@" "];
- NSString *subUnknownSetStr =
- GPBTextFormatForUnknownFieldSet(subUnknownSet, subIndent);
+ NSString *subUnknownSetStr = GPBTextFormatForUnknownFieldSet(subUnknownSet, subIndent);
[result appendString:subUnknownSetStr];
[result appendFormat:@"%@}\n", lineIndent];
}
@@ -2114,8 +2057,7 @@
return result;
}
}
- [NSException raise:NSParseErrorException
- format:@"Unable to read varint32"];
+ [NSException raise:NSParseErrorException format:@"Unable to read varint32"];
}
}
}
@@ -2123,8 +2065,7 @@
return result;
}
-NSString *GPBDecodeTextFormatName(const uint8_t *decodeData, int32_t key,
- NSString *inputStr) {
+NSString *GPBDecodeTextFormatName(const uint8_t *decodeData, int32_t key, NSString *inputStr) {
// decodData form:
// varint32: num entries
// for each entry:
@@ -2182,15 +2123,14 @@
return result;
}
- NSMutableString *result =
- [NSMutableString stringWithCapacity:[inputStr length]];
+ NSMutableString *result = [NSMutableString stringWithCapacity:[inputStr length]];
- const uint8_t kAddUnderscore = 0b10000000;
- const uint8_t kOpMask = 0b01100000;
+ const uint8_t kAddUnderscore = 0b10000000;
+ const uint8_t kOpMask = 0b01100000;
// const uint8_t kOpAsIs = 0b00000000;
- const uint8_t kOpFirstUpper = 0b01000000;
- const uint8_t kOpFirstLower = 0b00100000;
- const uint8_t kOpAllUpper = 0b01100000;
+ const uint8_t kOpFirstUpper = 0b01000000;
+ const uint8_t kOpFirstLower = 0b00100000;
+ const uint8_t kOpAllUpper = 0b01100000;
const uint8_t kSegmentLenMask = 0b00011111;
NSInteger i = 0;
@@ -2233,26 +2173,21 @@
#pragma mark Legacy methods old generated code calls
// Shim from the older generated code into the runtime.
-void GPBSetInt32IvarWithFieldInternal(GPBMessage *self,
- GPBFieldDescriptor *field,
- int32_t value,
- GPBFileSyntax syntax) {
-#pragma unused(syntax)
+void GPBSetInt32IvarWithFieldInternal(GPBMessage *self, GPBFieldDescriptor *field, int32_t value,
+ __unused GPBFileSyntax syntax) {
GPBSetMessageInt32Field(self, field, value);
}
-void GPBMaybeClearOneof(GPBMessage *self, GPBOneofDescriptor *oneof,
- int32_t oneofHasIndex, uint32_t fieldNumberNotToClear) {
-#pragma unused(fieldNumberNotToClear)
- #if defined(DEBUG) && DEBUG
- NSCAssert([[self descriptor] oneofWithName:oneof.name] == oneof,
- @"OneofDescriptor %@ doesn't appear to be for %@ messages.",
- oneof.name, [self class]);
- GPBFieldDescriptor *firstField = oneof->fields_[0];
- NSCAssert(firstField->description_->hasIndex == oneofHasIndex,
- @"Internal error, oneofHasIndex (%d) doesn't match (%d).",
- firstField->description_->hasIndex, oneofHasIndex);
- #endif
+void GPBMaybeClearOneof(GPBMessage *self, GPBOneofDescriptor *oneof, int32_t oneofHasIndex,
+ __unused uint32_t fieldNumberNotToClear) {
+#if defined(DEBUG) && DEBUG
+ NSCAssert([[self descriptor] oneofWithName:oneof.name] == oneof,
+ @"OneofDescriptor %@ doesn't appear to be for %@ messages.", oneof.name, [self class]);
+ GPBFieldDescriptor *firstField __unused = oneof->fields_[0];
+ NSCAssert(firstField->description_->hasIndex == oneofHasIndex,
+ @"Internal error, oneofHasIndex (%d) doesn't match (%d).",
+ firstField->description_->hasIndex, oneofHasIndex);
+#endif
GPBMaybeClearOneofPrivate(self, oneof, oneofHasIndex, 0);
}
diff --git a/objectivec/GPBUtilities_PackagePrivate.h b/objectivec/GPBUtilities_PackagePrivate.h
index 3d3d734..f04ed83 100644
--- a/objectivec/GPBUtilities_PackagePrivate.h
+++ b/objectivec/GPBUtilities_PackagePrivate.h
@@ -40,17 +40,15 @@
#define GPBStringify(S) #S
#define GPBStringifySymbol(S) GPBStringify(S)
-#define GPBNSStringify(S) @#S
+#define GPBNSStringify(S) @ #S
#define GPBNSStringifySymbol(S) GPBNSStringify(S)
// Macros for generating a Class from a class name. These are used in
// the generated GPB descriptor classes wherever an Objective C class
// reference is needed for a generated class.
#define GPBObjCClassSymbol(name) OBJC_CLASS_$_##name
-#define GPBObjCClass(name) \
- ((__bridge Class)&(GPBObjCClassSymbol(name)))
-#define GPBObjCClassDeclaration(name) \
- extern const GPBObjcClass_t GPBObjCClassSymbol(name)
+#define GPBObjCClass(name) ((__bridge Class) & (GPBObjCClassSymbol(name)))
+#define GPBObjCClassDeclaration(name) extern const GPBObjcClass_t GPBObjCClassSymbol(name)
// Constant to internally mark when there is no has bit.
#define GPBNoHasBit INT32_MAX
@@ -120,7 +118,7 @@
// negative values must be sign-extended to 64 bits to be varint encoded,
// thus always taking 10 bytes on the wire.)
GPB_INLINE int32_t GPBDecodeZigZag32(uint32_t n) {
- return (int32_t)(GPBLogicalRightShift32((int32_t)n, 1) ^ -((int32_t)(n) & 1));
+ return (int32_t)(GPBLogicalRightShift32((int32_t)n, 1) ^ -((int32_t)(n)&1));
}
// Decode a ZigZag-encoded 64-bit value. ZigZag encodes signed integers
@@ -128,7 +126,7 @@
// negative values must be sign-extended to 64 bits to be varint encoded,
// thus always taking 10 bytes on the wire.)
GPB_INLINE int64_t GPBDecodeZigZag64(uint64_t n) {
- return (int64_t)(GPBLogicalRightShift64((int64_t)n, 1) ^ -((int64_t)(n) & 1));
+ return (int64_t)(GPBLogicalRightShift64((int64_t)n, 1) ^ -((int64_t)(n)&1));
}
// Encode a ZigZag-encoded 32-bit value. ZigZag encodes signed integers
@@ -197,102 +195,84 @@
}
BOOL GPBGetHasIvar(GPBMessage *self, int32_t index, uint32_t fieldNumber);
-void GPBSetHasIvar(GPBMessage *self, int32_t idx, uint32_t fieldNumber,
- BOOL value);
+void GPBSetHasIvar(GPBMessage *self, int32_t idx, uint32_t fieldNumber, BOOL value);
uint32_t GPBGetHasOneof(GPBMessage *self, int32_t index);
-GPB_INLINE BOOL
-GPBGetHasIvarField(GPBMessage *self, GPBFieldDescriptor *field) {
+GPB_INLINE BOOL GPBGetHasIvarField(GPBMessage *self, GPBFieldDescriptor *field) {
GPBMessageFieldDescription *fieldDesc = field->description_;
return GPBGetHasIvar(self, fieldDesc->hasIndex, fieldDesc->number);
}
#pragma clang diagnostic pop
+// Disable clang-format for the macros.
+// clang-format off
+
//%PDDM-DEFINE GPB_IVAR_SET_DECL(NAME, TYPE)
//%void GPBSet##NAME##IvarWithFieldPrivate(GPBMessage *self,
//% NAME$S GPBFieldDescriptor *field,
//% NAME$S TYPE value);
//%PDDM-EXPAND GPB_IVAR_SET_DECL(Bool, BOOL)
// This block of code is generated, do not edit it directly.
-// clang-format off
void GPBSetBoolIvarWithFieldPrivate(GPBMessage *self,
GPBFieldDescriptor *field,
BOOL value);
-// clang-format on
//%PDDM-EXPAND GPB_IVAR_SET_DECL(Int32, int32_t)
// This block of code is generated, do not edit it directly.
-// clang-format off
void GPBSetInt32IvarWithFieldPrivate(GPBMessage *self,
GPBFieldDescriptor *field,
int32_t value);
-// clang-format on
//%PDDM-EXPAND GPB_IVAR_SET_DECL(UInt32, uint32_t)
// This block of code is generated, do not edit it directly.
-// clang-format off
void GPBSetUInt32IvarWithFieldPrivate(GPBMessage *self,
GPBFieldDescriptor *field,
uint32_t value);
-// clang-format on
//%PDDM-EXPAND GPB_IVAR_SET_DECL(Int64, int64_t)
// This block of code is generated, do not edit it directly.
-// clang-format off
void GPBSetInt64IvarWithFieldPrivate(GPBMessage *self,
GPBFieldDescriptor *field,
int64_t value);
-// clang-format on
//%PDDM-EXPAND GPB_IVAR_SET_DECL(UInt64, uint64_t)
// This block of code is generated, do not edit it directly.
-// clang-format off
void GPBSetUInt64IvarWithFieldPrivate(GPBMessage *self,
GPBFieldDescriptor *field,
uint64_t value);
-// clang-format on
//%PDDM-EXPAND GPB_IVAR_SET_DECL(Float, float)
// This block of code is generated, do not edit it directly.
-// clang-format off
void GPBSetFloatIvarWithFieldPrivate(GPBMessage *self,
GPBFieldDescriptor *field,
float value);
-// clang-format on
//%PDDM-EXPAND GPB_IVAR_SET_DECL(Double, double)
// This block of code is generated, do not edit it directly.
-// clang-format off
void GPBSetDoubleIvarWithFieldPrivate(GPBMessage *self,
GPBFieldDescriptor *field,
double value);
-// clang-format on
//%PDDM-EXPAND-END (7 expansions)
-void GPBSetEnumIvarWithFieldPrivate(GPBMessage *self,
- GPBFieldDescriptor *field,
- int32_t value);
+// clang-format on
+
+void GPBSetEnumIvarWithFieldPrivate(GPBMessage *self, GPBFieldDescriptor *field, int32_t value);
id GPBGetObjectIvarWithField(GPBMessage *self, GPBFieldDescriptor *field);
-void GPBSetObjectIvarWithFieldPrivate(GPBMessage *self,
- GPBFieldDescriptor *field, id value);
-void GPBSetRetainedObjectIvarWithFieldPrivate(GPBMessage *self,
- GPBFieldDescriptor *field,
- id __attribute__((ns_consumed))
- value);
+void GPBSetObjectIvarWithFieldPrivate(GPBMessage *self, GPBFieldDescriptor *field, id value);
+void GPBSetRetainedObjectIvarWithFieldPrivate(GPBMessage *self, GPBFieldDescriptor *field,
+ id __attribute__((ns_consumed)) value);
// GPBGetObjectIvarWithField will automatically create the field (message) if
// it doesn't exist. GPBGetObjectIvarWithFieldNoAutocreate will return nil.
-id GPBGetObjectIvarWithFieldNoAutocreate(GPBMessage *self,
- GPBFieldDescriptor *field);
+id GPBGetObjectIvarWithFieldNoAutocreate(GPBMessage *self, GPBFieldDescriptor *field);
// Clears and releases the autocreated message ivar, if it's autocreated. If
// it's not set as autocreated, this method does nothing.
-void GPBClearAutocreatedMessageIvarWithField(GPBMessage *self,
- GPBFieldDescriptor *field);
+void GPBClearAutocreatedMessageIvarWithField(GPBMessage *self, GPBFieldDescriptor *field);
// Returns an Objective C encoding for |selector|. |instanceSel| should be
// YES if it's an instance selector (as opposed to a class selector).
@@ -302,17 +282,13 @@
// Helper for text format name encoding.
// decodeData is the data describing the special decodes.
// key and inputString are the input that needs decoding.
-NSString *GPBDecodeTextFormatName(const uint8_t *decodeData, int32_t key,
- NSString *inputString);
-
+NSString *GPBDecodeTextFormatName(const uint8_t *decodeData, int32_t key, NSString *inputString);
// Shims from the older generated code into the runtime.
-void GPBSetInt32IvarWithFieldInternal(GPBMessage *self,
- GPBFieldDescriptor *field,
- int32_t value,
+void GPBSetInt32IvarWithFieldInternal(GPBMessage *self, GPBFieldDescriptor *field, int32_t value,
GPBFileSyntax syntax);
-void GPBMaybeClearOneof(GPBMessage *self, GPBOneofDescriptor *oneof,
- int32_t oneofHasIndex, uint32_t fieldNumberNotToClear);
+void GPBMaybeClearOneof(GPBMessage *self, GPBOneofDescriptor *oneof, int32_t oneofHasIndex,
+ uint32_t fieldNumberNotToClear);
// A series of selectors that are used solely to get @encoding values
// for them by the dynamic protobuf runtime code. See
diff --git a/objectivec/GPBWellKnownTypes.h b/objectivec/GPBWellKnownTypes.h
index 80d9db0..765ad24 100644
--- a/objectivec/GPBWellKnownTypes.h
+++ b/objectivec/GPBWellKnownTypes.h
@@ -141,8 +141,7 @@
*
* @return A newly configured GPBAny with the given message, or nil on failure.
*/
-+ (nullable instancetype)anyWithMessage:(nonnull GPBMessage *)message
- error:(NSError **)errorPtr;
++ (nullable instancetype)anyWithMessage:(nonnull GPBMessage *)message error:(NSError **)errorPtr;
/**
* Convenience method to create a GPBAny containing the serialized message.
@@ -168,8 +167,7 @@
*
* @return A newly configured GPBAny with the given message, or nil on failure.
*/
-- (nullable instancetype)initWithMessage:(nonnull GPBMessage *)message
- error:(NSError **)errorPtr;
+- (nullable instancetype)initWithMessage:(nonnull GPBMessage *)message error:(NSError **)errorPtr;
/**
* Initializes a GPBAny to contain the serialized message.
@@ -195,8 +193,7 @@
*
* @return Whether the packing was successful or not.
*/
-- (BOOL)packWithMessage:(nonnull GPBMessage *)message
- error:(NSError **)errorPtr;
+- (BOOL)packWithMessage:(nonnull GPBMessage *)message error:(NSError **)errorPtr;
/**
* Packs the serialized message into this GPBAny.
@@ -225,8 +222,7 @@
* @return An instance of the given class populated with the contained data, or
* nil on failure.
*/
-- (nullable GPBMessage *)unpackMessageClass:(Class)messageClass
- error:(NSError **)errorPtr;
+- (nullable GPBMessage *)unpackMessageClass:(Class)messageClass error:(NSError **)errorPtr;
@end
diff --git a/objectivec/GPBWellKnownTypes.m b/objectivec/GPBWellKnownTypes.m
index 2808afe..90e82d3 100644
--- a/objectivec/GPBWellKnownTypes.m
+++ b/objectivec/GPBWellKnownTypes.m
@@ -36,18 +36,15 @@
#import "GPBUtilities_PackagePrivate.h"
-NSString *const GPBWellKnownTypesErrorDomain =
- GPBNSStringifySymbol(GPBWellKnownTypesErrorDomain);
+NSString *const GPBWellKnownTypesErrorDomain = GPBNSStringifySymbol(GPBWellKnownTypesErrorDomain);
static NSString *kTypePrefixGoogleApisCom = @"type.googleapis.com/";
-static NSTimeInterval TimeIntervalFromSecondsAndNanos(int64_t seconds,
- int32_t nanos) {
+static NSTimeInterval TimeIntervalFromSecondsAndNanos(int64_t seconds, int32_t nanos) {
return seconds + (NSTimeInterval)nanos / 1e9;
}
-static int32_t SecondsAndNanosFromTimeInterval(NSTimeInterval time,
- int64_t *outSeconds,
+static int32_t SecondsAndNanosFromTimeInterval(NSTimeInterval time, int64_t *outSeconds,
BOOL nanosMustBePositive) {
NSTimeInterval seconds;
NSTimeInterval nanos = modf(time, &seconds);
@@ -79,8 +76,7 @@
static NSString *ParseTypeFromURL(NSString *typeURLString) {
NSRange range = [typeURLString rangeOfString:@"/" options:NSBackwardsSearch];
- if ((range.location == NSNotFound) ||
- (NSMaxRange(range) == typeURLString.length)) {
+ if ((range.location == NSNotFound) || (NSMaxRange(range) == typeURLString.length)) {
return nil;
}
NSString *result = [typeURLString substringFromIndex:range.location + 1];
@@ -98,8 +94,7 @@
- (instancetype)initWithTimeIntervalSince1970:(NSTimeInterval)timeIntervalSince1970 {
if ((self = [super init])) {
int64_t seconds;
- int32_t nanos = SecondsAndNanosFromTimeInterval(
- timeIntervalSince1970, &seconds, YES);
+ int32_t nanos = SecondsAndNanosFromTimeInterval(timeIntervalSince1970, &seconds, YES);
self.seconds = seconds;
self.nanos = nanos;
}
@@ -120,8 +115,7 @@
- (void)setTimeIntervalSince1970:(NSTimeInterval)timeIntervalSince1970 {
int64_t seconds;
- int32_t nanos =
- SecondsAndNanosFromTimeInterval(timeIntervalSince1970, &seconds, YES);
+ int32_t nanos = SecondsAndNanosFromTimeInterval(timeIntervalSince1970, &seconds, YES);
self.seconds = seconds;
self.nanos = nanos;
}
@@ -135,8 +129,7 @@
- (instancetype)initWithTimeInterval:(NSTimeInterval)timeInterval {
if ((self = [super init])) {
int64_t seconds;
- int32_t nanos = SecondsAndNanosFromTimeInterval(
- timeInterval, &seconds, NO);
+ int32_t nanos = SecondsAndNanosFromTimeInterval(timeInterval, &seconds, NO);
self.seconds = seconds;
self.nanos = nanos;
}
@@ -153,8 +146,7 @@
- (void)setTimeInterval:(NSTimeInterval)timeInterval {
int64_t seconds;
- int32_t nanos =
- SecondsAndNanosFromTimeInterval(timeInterval, &seconds, NO);
+ int32_t nanos = SecondsAndNanosFromTimeInterval(timeInterval, &seconds, NO);
self.seconds = seconds;
self.nanos = nanos;
}
@@ -173,26 +165,19 @@
@implementation GPBAny (GBPWellKnownTypes)
-+ (instancetype)anyWithMessage:(GPBMessage *)message
- error:(NSError **)errorPtr {
- return [self anyWithMessage:message
- typeURLPrefix:kTypePrefixGoogleApisCom
- error:errorPtr];
++ (instancetype)anyWithMessage:(GPBMessage *)message error:(NSError **)errorPtr {
+ return [self anyWithMessage:message typeURLPrefix:kTypePrefixGoogleApisCom error:errorPtr];
}
+ (instancetype)anyWithMessage:(GPBMessage *)message
typeURLPrefix:(NSString *)typeURLPrefix
error:(NSError **)errorPtr {
- return [[[self alloc] initWithMessage:message
- typeURLPrefix:typeURLPrefix
+ return [[[self alloc] initWithMessage:message typeURLPrefix:typeURLPrefix
error:errorPtr] autorelease];
}
-- (instancetype)initWithMessage:(GPBMessage *)message
- error:(NSError **)errorPtr {
- return [self initWithMessage:message
- typeURLPrefix:kTypePrefixGoogleApisCom
- error:errorPtr];
+- (instancetype)initWithMessage:(GPBMessage *)message error:(NSError **)errorPtr {
+ return [self initWithMessage:message typeURLPrefix:kTypePrefixGoogleApisCom error:errorPtr];
}
- (instancetype)initWithMessage:(GPBMessage *)message
@@ -200,9 +185,7 @@
error:(NSError **)errorPtr {
self = [self init];
if (self) {
- if (![self packWithMessage:message
- typeURLPrefix:typeURLPrefix
- error:errorPtr]) {
+ if (![self packWithMessage:message typeURLPrefix:typeURLPrefix error:errorPtr]) {
[self release];
self = nil;
}
@@ -210,11 +193,8 @@
return self;
}
-- (BOOL)packWithMessage:(GPBMessage *)message
- error:(NSError **)errorPtr {
- return [self packWithMessage:message
- typeURLPrefix:kTypePrefixGoogleApisCom
- error:errorPtr];
+- (BOOL)packWithMessage:(GPBMessage *)message error:(NSError **)errorPtr {
+ return [self packWithMessage:message typeURLPrefix:kTypePrefixGoogleApisCom error:errorPtr];
}
- (BOOL)packWithMessage:(GPBMessage *)message
@@ -223,10 +203,9 @@
NSString *fullName = [message descriptor].fullName;
if (fullName.length == 0) {
if (errorPtr) {
- *errorPtr =
- [NSError errorWithDomain:GPBWellKnownTypesErrorDomain
- code:GPBWellKnownTypesErrorCodeFailedToComputeTypeURL
- userInfo:nil];
+ *errorPtr = [NSError errorWithDomain:GPBWellKnownTypesErrorDomain
+ code:GPBWellKnownTypesErrorCodeFailedToComputeTypeURL
+ userInfo:nil];
}
return NO;
}
@@ -238,15 +217,13 @@
return YES;
}
-- (GPBMessage *)unpackMessageClass:(Class)messageClass
- error:(NSError **)errorPtr {
+- (GPBMessage *)unpackMessageClass:(Class)messageClass error:(NSError **)errorPtr {
NSString *fullName = [messageClass descriptor].fullName;
if (fullName.length == 0) {
if (errorPtr) {
- *errorPtr =
- [NSError errorWithDomain:GPBWellKnownTypesErrorDomain
- code:GPBWellKnownTypesErrorCodeFailedToComputeTypeURL
- userInfo:nil];
+ *errorPtr = [NSError errorWithDomain:GPBWellKnownTypesErrorDomain
+ code:GPBWellKnownTypesErrorCodeFailedToComputeTypeURL
+ userInfo:nil];
}
return nil;
}
@@ -254,10 +231,9 @@
NSString *expectedFullName = ParseTypeFromURL(self.typeURL);
if ((expectedFullName == nil) || ![expectedFullName isEqual:fullName]) {
if (errorPtr) {
- *errorPtr =
- [NSError errorWithDomain:GPBWellKnownTypesErrorDomain
- code:GPBWellKnownTypesErrorCodeTypeURLMismatch
- userInfo:nil];
+ *errorPtr = [NSError errorWithDomain:GPBWellKnownTypesErrorDomain
+ code:GPBWellKnownTypesErrorCodeTypeURLMismatch
+ userInfo:nil];
}
return nil;
}
@@ -265,8 +241,7 @@
// Any is proto3, which means no extensions, so this assumes anything put
// within an any also won't need extensions. A second helper could be added
// if needed.
- return [messageClass parseFromData:self.value
- error:errorPtr];
+ return [messageClass parseFromData:self.value error:errorPtr];
}
@end
diff --git a/objectivec/GPBWrappers.pbobjc.h b/objectivec/GPBWrappers.pbobjc.h
index e6741ae..11b052a 100644
--- a/objectivec/GPBWrappers.pbobjc.h
+++ b/objectivec/GPBWrappers.pbobjc.h
@@ -1,6 +1,8 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: google/protobuf/wrappers.proto
+// clang-format off
+
#import "GPBDescriptor.h"
#import "GPBMessage.h"
#import "GPBRootObject.h"
@@ -205,3 +207,5 @@
#pragma clang diagnostic pop
// @@protoc_insertion_point(global_scope)
+
+// clange-format on
diff --git a/objectivec/GPBWrappers.pbobjc.m b/objectivec/GPBWrappers.pbobjc.m
index b02a071..45ee1a3 100644
--- a/objectivec/GPBWrappers.pbobjc.m
+++ b/objectivec/GPBWrappers.pbobjc.m
@@ -1,6 +1,8 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: google/protobuf/wrappers.proto
+// clang-format off
+
#import "GPBProtocolBuffers_RuntimeSupport.h"
#import "GPBWrappers.pbobjc.h"
@@ -441,3 +443,5 @@
#pragma clang diagnostic pop
// @@protoc_insertion_point(global_scope)
+
+// clange-format on
diff --git a/objectivec/ProtocolBuffers_OSX.xcodeproj/project.pbxproj b/objectivec/ProtocolBuffers_OSX.xcodeproj/project.pbxproj
index 365fdc3..5f3ffa0 100644
--- a/objectivec/ProtocolBuffers_OSX.xcodeproj/project.pbxproj
+++ b/objectivec/ProtocolBuffers_OSX.xcodeproj/project.pbxproj
@@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
- objectVersion = 47;
+ objectVersion = 55;
objects = {
/* Begin PBXBuildFile section */
@@ -26,7 +26,7 @@
8B8B615D17DF7056002EE618 /* GPBARCUnittestProtos.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B8B615C17DF7056002EE618 /* GPBARCUnittestProtos.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; };
8B96157414C8C38C00A2AC0B /* GPBDescriptor.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B96157314C8C38C00A2AC0B /* GPBDescriptor.m */; };
8BBEA4A9147C727D00C4ADB7 /* GPBCodedInputStreamTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7461B69B0F94FDF800A0C422 /* GPBCodedInputStreamTests.m */; };
- 8BBEA4AA147C727D00C4ADB7 /* GPBCodedOuputStreamTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7461B69D0F94FDF800A0C422 /* GPBCodedOuputStreamTests.m */; };
+ 8BBEA4AA147C727D00C4ADB7 /* GPBCodedOutputStreamTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7461B69D0F94FDF800A0C422 /* GPBCodedOutputStreamTests.m */; };
8BBEA4AC147C727D00C4ADB7 /* GPBMessageTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7461B6A30F94FDF800A0C422 /* GPBMessageTests.m */; };
8BBEA4B0147C727D00C4ADB7 /* GPBTestUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 7461B6AC0F94FDF800A0C422 /* GPBTestUtilities.m */; };
8BBEA4B6147C727D00C4ADB7 /* GPBUnknownFieldSetTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 7461B6B80F94FDF900A0C422 /* GPBUnknownFieldSetTest.m */; };
@@ -61,8 +61,6 @@
F40EE4BF206BF8B90071091A /* GPBCompileTest21.m in Sources */ = {isa = PBXBuildFile; fileRef = F40EE486206BF8AF0071091A /* GPBCompileTest21.m */; };
F40EE4C0206BF8B90071091A /* GPBCompileTest22.m in Sources */ = {isa = PBXBuildFile; fileRef = F40EE48A206BF8B00071091A /* GPBCompileTest22.m */; };
F40EE4C1206BF8B90071091A /* GPBCompileTest23.m in Sources */ = {isa = PBXBuildFile; fileRef = F40EE487206BF8B00071091A /* GPBCompileTest23.m */; };
- F40EE50B206C06640071091A /* GPBCompileTest24.m in Sources */ = {isa = PBXBuildFile; fileRef = F40EE508206C06440071091A /* GPBCompileTest24.m */; };
- F40EE50C206C06640071091A /* GPBCompileTest25.m in Sources */ = {isa = PBXBuildFile; fileRef = F40EE507206C06440071091A /* GPBCompileTest25.m */; };
F41C175D1833D3310064ED4D /* GPBPerfTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F41C175C1833D3310064ED4D /* GPBPerfTests.m */; };
F4353D1D1AB8822D005A6198 /* GPBDescriptorTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F4353D1C1AB8822D005A6198 /* GPBDescriptorTests.m */; };
F4353D231ABB1537005A6198 /* GPBDictionary.m in Sources */ = {isa = PBXBuildFile; fileRef = F4353D211ABB1537005A6198 /* GPBDictionary.m */; };
@@ -141,7 +139,7 @@
7461B4E80F94F99000A0C422 /* GPBWireFormat.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBWireFormat.m; sourceTree = "<group>"; };
7461B52E0F94FAF800A0C422 /* libProtocolBuffers.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libProtocolBuffers.a; sourceTree = BUILT_PRODUCTS_DIR; };
7461B69B0F94FDF800A0C422 /* GPBCodedInputStreamTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBCodedInputStreamTests.m; sourceTree = "<group>"; };
- 7461B69D0F94FDF800A0C422 /* GPBCodedOuputStreamTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBCodedOuputStreamTests.m; sourceTree = "<group>"; };
+ 7461B69D0F94FDF800A0C422 /* GPBCodedOutputStreamTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBCodedOutputStreamTests.m; sourceTree = "<group>"; };
7461B6A30F94FDF800A0C422 /* GPBMessageTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBMessageTests.m; sourceTree = "<group>"; };
7461B6AB0F94FDF800A0C422 /* GPBTestUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GPBTestUtilities.h; sourceTree = "<group>"; };
7461B6AC0F94FDF800A0C422 /* GPBTestUtilities.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBTestUtilities.m; sourceTree = "<group>"; };
@@ -161,21 +159,11 @@
8B42494D1A92A16600BC1EC6 /* timestamp.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = timestamp.proto; path = ../src/google/protobuf/timestamp.proto; sourceTree = "<group>"; };
8B79657814992E3E002FFBFC /* GPBRootObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GPBRootObject.h; sourceTree = "<group>"; };
8B79657914992E3E002FFBFC /* GPBRootObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBRootObject.m; sourceTree = "<group>"; };
- 8B7E6A7414893DBA00F8884A /* unittest_custom_options.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = unittest_custom_options.proto; path = ../../src/google/protobuf/unittest_custom_options.proto; sourceTree = "<group>"; };
- 8B7E6A7514893DBA00F8884A /* unittest_embed_optimize_for.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = unittest_embed_optimize_for.proto; path = ../../src/google/protobuf/unittest_embed_optimize_for.proto; sourceTree = "<group>"; };
- 8B7E6A7614893DBA00F8884A /* unittest_empty.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = unittest_empty.proto; path = ../../src/google/protobuf/unittest_empty.proto; sourceTree = "<group>"; };
- 8B7E6A7814893DBB00F8884A /* unittest_import.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = unittest_import.proto; path = ../../src/google/protobuf/unittest_import.proto; sourceTree = "<group>"; };
- 8B7E6A7B14893DBC00F8884A /* unittest_mset.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = unittest_mset.proto; path = ../../src/google/protobuf/unittest_mset.proto; sourceTree = "<group>"; };
- 8B7E6A7C14893DBC00F8884A /* unittest_no_generic_services.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = unittest_no_generic_services.proto; path = ../../src/google/protobuf/unittest_no_generic_services.proto; sourceTree = "<group>"; };
- 8B7E6A7D14893DBC00F8884A /* unittest_optimize_for.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = unittest_optimize_for.proto; path = ../../src/google/protobuf/unittest_optimize_for.proto; sourceTree = "<group>"; };
- 8B7E6A7E14893DBC00F8884A /* unittest.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = unittest.proto; path = ../../src/google/protobuf/unittest.proto; sourceTree = "<group>"; };
8B8B615C17DF7056002EE618 /* GPBARCUnittestProtos.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBARCUnittestProtos.m; sourceTree = "<group>"; };
8B96157214C8B06000A2AC0B /* GPBDescriptor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GPBDescriptor.h; sourceTree = "<group>"; };
8B96157314C8C38C00A2AC0B /* GPBDescriptor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBDescriptor.m; sourceTree = "<group>"; };
- 8BBD9DB016DD1DC8008E1EC1 /* unittest_lite.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = unittest_lite.proto; path = ../../src/google/protobuf/unittest_lite.proto; sourceTree = "<group>"; };
8BBEA4A6147C727100C4ADB7 /* UnitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = UnitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
8BCF338814ED799900BC5317 /* GPBProtocolBuffers.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GPBProtocolBuffers.m; sourceTree = "<group>"; };
- 8BD3981D14BE54220081D629 /* unittest_enormous_descriptor.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = unittest_enormous_descriptor.proto; path = ../../src/google/protobuf/unittest_enormous_descriptor.proto; sourceTree = "<group>"; };
8BD3981E14BE59D70081D629 /* GPBUnittestProtos.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBUnittestProtos.m; sourceTree = "<group>"; };
8BEB5AE01498033E0078BF9D /* GPBRuntimeTypes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GPBRuntimeTypes.h; sourceTree = "<group>"; };
8BFF9D1923AD582200E63E32 /* GPBMessageTests+ClassNames.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "GPBMessageTests+ClassNames.m"; sourceTree = "<group>"; };
@@ -205,8 +193,6 @@
F40EE491206BF8B10071091A /* GPBCompileTest03.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBCompileTest03.m; sourceTree = "<group>"; };
F40EE492206BF8B10071091A /* GPBCompileTest06.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBCompileTest06.m; sourceTree = "<group>"; };
F40EE493206BF8B20071091A /* GPBCompileTest11.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBCompileTest11.m; sourceTree = "<group>"; };
- F40EE507206C06440071091A /* GPBCompileTest25.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBCompileTest25.m; sourceTree = "<group>"; };
- F40EE508206C06440071091A /* GPBCompileTest24.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBCompileTest24.m; sourceTree = "<group>"; };
F41C175C1833D3310064ED4D /* GPBPerfTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBPerfTests.m; sourceTree = "<group>"; };
F4353D1C1AB8822D005A6198 /* GPBDescriptorTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBDescriptorTests.m; sourceTree = "<group>"; };
F4353D201ABB1537005A6198 /* GPBDictionary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GPBDictionary.h; sourceTree = "<group>"; };
@@ -229,6 +215,23 @@
F4487C7E1AAF62CD00531423 /* GPBMessageTests+Serialization.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "GPBMessageTests+Serialization.m"; sourceTree = "<group>"; };
F4487C821AAF6AB300531423 /* GPBMessageTests+Merge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "GPBMessageTests+Merge.m"; sourceTree = "<group>"; };
F44929001C866B1900C2548A /* GPBCodedOutputStream_PackagePrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GPBCodedOutputStream_PackagePrivate.h; sourceTree = "<group>"; };
+ F44FEABE28B5465900EC57B3 /* unittest_deprecated_file.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = unittest_deprecated_file.proto; sourceTree = "<group>"; };
+ F44FEABF28B5465900EC57B3 /* unittest_mset.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = unittest_mset.proto; sourceTree = "<group>"; };
+ F44FEAC028B5465900EC57B3 /* unittest_import.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = unittest_import.proto; sourceTree = "<group>"; };
+ F44FEAC228B5465900EC57B3 /* unittest.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = unittest.proto; sourceTree = "<group>"; };
+ F44FEAC428B5465900EC57B3 /* unittest_preserve_unknown_enum.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = unittest_preserve_unknown_enum.proto; sourceTree = "<group>"; };
+ F44FEAC528B5465900EC57B3 /* any_test.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = any_test.proto; sourceTree = "<group>"; };
+ F44FEAC628B5465900EC57B3 /* unittest_import_public.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = unittest_import_public.proto; sourceTree = "<group>"; };
+ F44FEAC728B5465900EC57B3 /* map_unittest.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = map_unittest.proto; sourceTree = "<group>"; };
+ F44FEAC828B5465900EC57B3 /* unittest_extension_chain_g.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = unittest_extension_chain_g.proto; sourceTree = "<group>"; };
+ F44FEAC928B5465900EC57B3 /* unittest_extension_chain_e.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = unittest_extension_chain_e.proto; sourceTree = "<group>"; };
+ F44FEACA28B5465900EC57B3 /* unittest_extension_chain_d.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = unittest_extension_chain_d.proto; sourceTree = "<group>"; };
+ F44FEACB28B5465900EC57B3 /* unittest_extension_chain_a.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = unittest_extension_chain_a.proto; sourceTree = "<group>"; };
+ F44FEACC28B5465900EC57B3 /* unittest_extension_chain_c.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = unittest_extension_chain_c.proto; sourceTree = "<group>"; };
+ F44FEACD28B5465900EC57B3 /* unittest_deprecated.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = unittest_deprecated.proto; sourceTree = "<group>"; };
+ F44FEACE28B5465A00EC57B3 /* unittest_extension_chain_b.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = unittest_extension_chain_b.proto; sourceTree = "<group>"; };
+ F44FEACF28B5465A00EC57B3 /* map_proto2_unittest.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = map_proto2_unittest.proto; sourceTree = "<group>"; };
+ F44FEAD028B5465A00EC57B3 /* unittest_extension_chain_f.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = unittest_extension_chain_f.proto; sourceTree = "<group>"; };
F451D3F51A8AAE8700B8A22C /* GPBProtocolBuffers_RuntimeSupport.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GPBProtocolBuffers_RuntimeSupport.h; sourceTree = "<group>"; };
F4584D7E1ECCB38900803AB6 /* GPBExtensionRegistryTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBExtensionRegistryTest.m; sourceTree = "<group>"; };
F45C69CB16DFD08D0081955B /* GPBExtensionInternals.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBExtensionInternals.m; sourceTree = "<group>"; };
@@ -442,12 +445,13 @@
7461B6940F94FDDD00A0C422 /* Tests */ = {
isa = PBXGroup;
children = (
+ F44FEAC528B5465900EC57B3 /* any_test.proto */,
8B210CCD159383D60032D72D /* golden_message */,
8B210CCF159386920032D72D /* golden_packed_fields_message */,
8B8B615C17DF7056002EE618 /* GPBARCUnittestProtos.m */,
F401DC321A8E5C0200FCC765 /* GPBArrayTests.m */,
7461B69B0F94FDF800A0C422 /* GPBCodedInputStreamTests.m */,
- 7461B69D0F94FDF800A0C422 /* GPBCodedOuputStreamTests.m */,
+ 7461B69D0F94FDF800A0C422 /* GPBCodedOutputStreamTests.m */,
F40EE488206BF8B00071091A /* GPBCompileTest01.m */,
F40EE481206BF8AE0071091A /* GPBCompileTest02.m */,
F40EE491206BF8B10071091A /* GPBCompileTest03.m */,
@@ -471,8 +475,6 @@
F40EE486206BF8AF0071091A /* GPBCompileTest21.m */,
F40EE48A206BF8B00071091A /* GPBCompileTest22.m */,
F40EE487206BF8B00071091A /* GPBCompileTest23.m */,
- F40EE508206C06440071091A /* GPBCompileTest24.m */,
- F40EE507206C06440071091A /* GPBCompileTest25.m */,
5102DABB1891A052002037B6 /* GPBConcurrencyTests.m */,
F4353D1C1AB8822D005A6198 /* GPBDescriptorTests.m */,
F4C4B9E21E1D974F00D3B61D /* GPBDictionaryTests.m */,
@@ -485,9 +487,9 @@
F4353D321AC06F10005A6198 /* GPBDictionaryTests+UInt64.m */,
F4584D7E1ECCB38900803AB6 /* GPBExtensionRegistryTest.m */,
7461B6A30F94FDF800A0C422 /* GPBMessageTests.m */,
+ 8BFF9D1923AD582200E63E32 /* GPBMessageTests+ClassNames.m */,
F4487C821AAF6AB300531423 /* GPBMessageTests+Merge.m */,
F4487C741AADF7F500531423 /* GPBMessageTests+Runtime.m */,
- 8BFF9D1923AD582200E63E32 /* GPBMessageTests+ClassNames.m */,
F4487C7E1AAF62CD00531423 /* GPBMessageTests+Serialization.m */,
F4B51B1D1BBC610700744318 /* GPBObjectiveCPlusPlusTest.mm */,
F41C175C1833D3310064ED4D /* GPBPerfTests.m */,
@@ -500,25 +502,31 @@
7461B6BA0F94FDF900A0C422 /* GPBUtilitiesTests.m */,
8B4248DB1A92933A00BC1EC6 /* GPBWellKnownTypesTest.m */,
7461B6BC0F94FDF900A0C422 /* GPBWireFormatTests.m */,
+ F44FEACF28B5465A00EC57B3 /* map_proto2_unittest.proto */,
+ F44FEAC728B5465900EC57B3 /* map_unittest.proto */,
F4F53F89219CC4F2001EABF4 /* text_format_extensions_unittest_data.txt */,
F45E57C61AE6DC6A000B7D99 /* text_format_map_unittest_data.txt */,
F43C88CF191D77FC009E917D /* text_format_unittest_data.txt */,
- 8B7E6A7414893DBA00F8884A /* unittest_custom_options.proto */,
F4AC9E1D1A8BEB3500BD6E83 /* unittest_cycle.proto */,
- 8B7E6A7514893DBA00F8884A /* unittest_embed_optimize_for.proto */,
- 8B7E6A7614893DBA00F8884A /* unittest_empty.proto */,
- 8BD3981D14BE54220081D629 /* unittest_enormous_descriptor.proto */,
- 8B7E6A7814893DBB00F8884A /* unittest_import.proto */,
- 8BBD9DB016DD1DC8008E1EC1 /* unittest_lite.proto */,
- 8B7E6A7B14893DBC00F8884A /* unittest_mset.proto */,
- 8B7E6A7C14893DBC00F8884A /* unittest_no_generic_services.proto */,
+ F44FEABE28B5465900EC57B3 /* unittest_deprecated_file.proto */,
+ F44FEACD28B5465900EC57B3 /* unittest_deprecated.proto */,
+ F44FEACB28B5465900EC57B3 /* unittest_extension_chain_a.proto */,
+ F44FEACE28B5465A00EC57B3 /* unittest_extension_chain_b.proto */,
+ F44FEACC28B5465900EC57B3 /* unittest_extension_chain_c.proto */,
+ F44FEACA28B5465900EC57B3 /* unittest_extension_chain_d.proto */,
+ F44FEAC928B5465900EC57B3 /* unittest_extension_chain_e.proto */,
+ F44FEAD028B5465A00EC57B3 /* unittest_extension_chain_f.proto */,
+ F44FEAC828B5465900EC57B3 /* unittest_extension_chain_g.proto */,
+ F44FEAC628B5465900EC57B3 /* unittest_import_public.proto */,
+ F44FEAC028B5465900EC57B3 /* unittest_import.proto */,
+ F44FEABF28B5465900EC57B3 /* unittest_mset.proto */,
8B35468421A616F6000BD30D /* unittest_objc_options.proto */,
F4CF31701B162ED800BD9B06 /* unittest_objc_startup.proto */,
8B09AAF614B663A7007B4184 /* unittest_objc.proto */,
- 8B7E6A7D14893DBC00F8884A /* unittest_optimize_for.proto */,
+ F44FEAC428B5465900EC57B3 /* unittest_preserve_unknown_enum.proto */,
F4487C781AADFB3100531423 /* unittest_runtime_proto2.proto */,
F4487C791AADFB3200531423 /* unittest_runtime_proto3.proto */,
- 8B7E6A7E14893DBC00F8884A /* unittest.proto */,
+ F44FEAC228B5465900EC57B3 /* unittest.proto */,
8B4248B91A8C256900BC1EC6 /* UnitTests-Bridging-Header.h */,
7401C1A90F950347006D8281 /* UnitTests-Info.plist */,
);
@@ -655,7 +663,7 @@
};
};
buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "ProtocolBuffers_OSX" */;
- compatibilityVersion = "Xcode 6.3";
+ compatibilityVersion = "Xcode 13.0";
developmentRegion = English;
hasScannedForEncodings = 1;
knownRegions = (
@@ -744,7 +752,6 @@
buildActionMask = 2147483647;
files = (
8BBEA4A9147C727D00C4ADB7 /* GPBCodedInputStreamTests.m in Sources */,
- F40EE50B206C06640071091A /* GPBCompileTest24.m in Sources */,
F40EE4BE206BF8B90071091A /* GPBCompileTest20.m in Sources */,
F401DC331A8E5C0200FCC765 /* GPBArrayTests.m in Sources */,
F40EE4B4206BF8B90071091A /* GPBCompileTest10.m in Sources */,
@@ -753,7 +760,7 @@
F40EE4B2206BF8B90071091A /* GPBCompileTest08.m in Sources */,
F40EE4BB206BF8B90071091A /* GPBCompileTest17.m in Sources */,
F4353D391AC06F10005A6198 /* GPBDictionaryTests+UInt64.m in Sources */,
- 8BBEA4AA147C727D00C4ADB7 /* GPBCodedOuputStreamTests.m in Sources */,
+ 8BBEA4AA147C727D00C4ADB7 /* GPBCodedOutputStreamTests.m in Sources */,
F40EE4C1206BF8B90071091A /* GPBCompileTest23.m in Sources */,
8BBEA4AC147C727D00C4ADB7 /* GPBMessageTests.m in Sources */,
F4B51B1E1BBC610700744318 /* GPBObjectiveCPlusPlusTest.mm in Sources */,
@@ -772,7 +779,6 @@
F4F8D8831D789FD9002CE128 /* GPBUnittestProtos2.m in Sources */,
F4353D1D1AB8822D005A6198 /* GPBDescriptorTests.m in Sources */,
8B4248BB1A8C256A00BC1EC6 /* GPBSwiftTests.swift in Sources */,
- F40EE50C206C06640071091A /* GPBCompileTest25.m in Sources */,
F4584D821ECCB52A00803AB6 /* GPBExtensionRegistryTest.m in Sources */,
8BFF9D1A23AD582300E63E32 /* GPBMessageTests+ClassNames.m in Sources */,
5102DABC1891A073002037B6 /* GPBConcurrencyTests.m in Sources */,
@@ -851,14 +857,21 @@
CLANG_ENABLE_OBJC_WEAK = YES;
COMBINE_HIDPI_IMAGES = YES;
INFOPLIST_FILE = "Tests/UnitTests-Info.plist";
- LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ "@loader_path/../Frameworks",
+ );
OTHER_LDFLAGS = "-ObjC";
PRODUCT_BUNDLE_IDENTIFIER = "com.yourcompany.${PRODUCT_NAME:identifier}";
PRODUCT_NAME = UnitTests;
SWIFT_OBJC_BRIDGING_HEADER = "Tests/UnitTests-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 4.0;
- USER_HEADER_SEARCH_PATHS = "${PROJECT_DERIVED_FILE_DIR}/protos $(SRCROOT)";
+ USER_HEADER_SEARCH_PATHS = (
+ "${PROJECT_DERIVED_FILE_DIR}/protos",
+ "$(SRCROOT)",
+ );
WARNING_CFLAGS = (
"$(inherited)",
"-Wno-documentation-unknown-command",
@@ -875,13 +888,20 @@
CLANG_ENABLE_OBJC_WEAK = YES;
COMBINE_HIDPI_IMAGES = YES;
INFOPLIST_FILE = "Tests/UnitTests-Info.plist";
- LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ "@loader_path/../Frameworks",
+ );
OTHER_LDFLAGS = "-ObjC";
PRODUCT_BUNDLE_IDENTIFIER = "com.yourcompany.${PRODUCT_NAME:identifier}";
PRODUCT_NAME = UnitTests;
SWIFT_OBJC_BRIDGING_HEADER = "Tests/UnitTests-Bridging-Header.h";
SWIFT_VERSION = 4.0;
- USER_HEADER_SEARCH_PATHS = "${PROJECT_DERIVED_FILE_DIR}/protos $(SRCROOT)";
+ USER_HEADER_SEARCH_PATHS = (
+ "${PROJECT_DERIVED_FILE_DIR}/protos",
+ "$(SRCROOT)",
+ );
WARNING_CFLAGS = (
"$(inherited)",
"-Wno-documentation-unknown-command",
@@ -946,7 +966,7 @@
GCC_WARN_UNUSED_PARAMETER = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
GENERATE_PROFILING_CODE = NO;
- MACOSX_DEPLOYMENT_TARGET = 10.9;
+ MACOSX_DEPLOYMENT_TARGET = 10.12;
ONLY_ACTIVE_ARCH = YES;
RUN_CLANG_STATIC_ANALYZER = YES;
SDKROOT = macosx;
@@ -1015,10 +1035,11 @@
GCC_WARN_UNUSED_PARAMETER = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
GENERATE_PROFILING_CODE = NO;
- MACOSX_DEPLOYMENT_TARGET = 10.9;
+ MACOSX_DEPLOYMENT_TARGET = 10.12;
RUN_CLANG_STATIC_ANALYZER = YES;
SDKROOT = macosx;
- SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
+ SWIFT_COMPILATION_MODE = wholemodule;
+ SWIFT_OPTIMIZATION_LEVEL = "-O";
USE_HEADERMAP = NO;
WARNING_CFLAGS = (
"-Wdocumentation-unknown-command",
diff --git a/objectivec/ProtocolBuffers_iOS.xcodeproj/project.pbxproj b/objectivec/ProtocolBuffers_iOS.xcodeproj/project.pbxproj
index 03e0580..4b4f083 100644
--- a/objectivec/ProtocolBuffers_iOS.xcodeproj/project.pbxproj
+++ b/objectivec/ProtocolBuffers_iOS.xcodeproj/project.pbxproj
@@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
- objectVersion = 47;
+ objectVersion = 55;
objects = {
/* Begin PBXBuildFile section */
@@ -27,7 +27,7 @@
8B96157414C8C38C00A2AC0B /* GPBDescriptor.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B96157314C8C38C00A2AC0B /* GPBDescriptor.m */; };
8B9A5EEC18330A0F00A9D33B /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B9A5E9F1831913D00A9D33B /* UIKit.framework */; };
8BBEA4A9147C727D00C4ADB7 /* GPBCodedInputStreamTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7461B69B0F94FDF800A0C422 /* GPBCodedInputStreamTests.m */; };
- 8BBEA4AA147C727D00C4ADB7 /* GPBCodedOuputStreamTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7461B69D0F94FDF800A0C422 /* GPBCodedOuputStreamTests.m */; };
+ 8BBEA4AA147C727D00C4ADB7 /* GPBCodedOutputStreamTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7461B69D0F94FDF800A0C422 /* GPBCodedOutputStreamTests.m */; };
8BBEA4AC147C727D00C4ADB7 /* GPBMessageTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7461B6A30F94FDF800A0C422 /* GPBMessageTests.m */; };
8BBEA4B0147C727D00C4ADB7 /* GPBTestUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 7461B6AC0F94FDF800A0C422 /* GPBTestUtilities.m */; };
8BBEA4B6147C727D00C4ADB7 /* GPBUnknownFieldSetTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 7461B6B80F94FDF900A0C422 /* GPBUnknownFieldSetTest.m */; };
@@ -61,8 +61,6 @@
F40EE504206BF91E0071091A /* GPBCompileTest21.m in Sources */ = {isa = PBXBuildFile; fileRef = F40EE4CB206BF9170071091A /* GPBCompileTest21.m */; };
F40EE505206BF91E0071091A /* GPBCompileTest22.m in Sources */ = {isa = PBXBuildFile; fileRef = F40EE4CF206BF9170071091A /* GPBCompileTest22.m */; };
F40EE506206BF91E0071091A /* GPBCompileTest23.m in Sources */ = {isa = PBXBuildFile; fileRef = F40EE4CC206BF9170071091A /* GPBCompileTest23.m */; };
- F40EE511206C068D0071091A /* GPBCompileTest24.m in Sources */ = {isa = PBXBuildFile; fileRef = F40EE50E206C06880071091A /* GPBCompileTest24.m */; };
- F40EE512206C068D0071091A /* GPBCompileTest25.m in Sources */ = {isa = PBXBuildFile; fileRef = F40EE50D206C06880071091A /* GPBCompileTest25.m */; };
F41C175D1833D3310064ED4D /* GPBPerfTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F41C175C1833D3310064ED4D /* GPBPerfTests.m */; };
F4353D1F1AB88243005A6198 /* GPBDescriptorTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F4353D1E1AB88243005A6198 /* GPBDescriptorTests.m */; };
F4353D271ABB156F005A6198 /* GPBDictionary.m in Sources */ = {isa = PBXBuildFile; fileRef = F4353D251ABB156F005A6198 /* GPBDictionary.m */; };
@@ -142,7 +140,7 @@
7461B4E80F94F99000A0C422 /* GPBWireFormat.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBWireFormat.m; sourceTree = "<group>"; };
7461B52E0F94FAF800A0C422 /* libProtocolBuffers.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libProtocolBuffers.a; sourceTree = BUILT_PRODUCTS_DIR; };
7461B69B0F94FDF800A0C422 /* GPBCodedInputStreamTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBCodedInputStreamTests.m; sourceTree = "<group>"; };
- 7461B69D0F94FDF800A0C422 /* GPBCodedOuputStreamTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBCodedOuputStreamTests.m; sourceTree = "<group>"; };
+ 7461B69D0F94FDF800A0C422 /* GPBCodedOutputStreamTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBCodedOutputStreamTests.m; sourceTree = "<group>"; };
7461B6A30F94FDF800A0C422 /* GPBMessageTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBMessageTests.m; sourceTree = "<group>"; };
7461B6AB0F94FDF800A0C422 /* GPBTestUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GPBTestUtilities.h; sourceTree = "<group>"; };
7461B6AC0F94FDF800A0C422 /* GPBTestUtilities.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBTestUtilities.m; sourceTree = "<group>"; };
@@ -162,23 +160,13 @@
8B42494A1A92A0BA00BC1EC6 /* duration.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = duration.proto; path = ../src/google/protobuf/duration.proto; sourceTree = "<group>"; };
8B79657814992E3E002FFBFC /* GPBRootObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GPBRootObject.h; sourceTree = "<group>"; };
8B79657914992E3E002FFBFC /* GPBRootObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBRootObject.m; sourceTree = "<group>"; };
- 8B7E6A7414893DBA00F8884A /* unittest_custom_options.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = unittest_custom_options.proto; path = ../../src/google/protobuf/unittest_custom_options.proto; sourceTree = "<group>"; };
- 8B7E6A7514893DBA00F8884A /* unittest_embed_optimize_for.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = unittest_embed_optimize_for.proto; path = ../../src/google/protobuf/unittest_embed_optimize_for.proto; sourceTree = "<group>"; };
- 8B7E6A7614893DBA00F8884A /* unittest_empty.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = unittest_empty.proto; path = ../../src/google/protobuf/unittest_empty.proto; sourceTree = "<group>"; };
- 8B7E6A7814893DBB00F8884A /* unittest_import.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = unittest_import.proto; path = ../../src/google/protobuf/unittest_import.proto; sourceTree = "<group>"; };
- 8B7E6A7B14893DBC00F8884A /* unittest_mset.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = unittest_mset.proto; path = ../../src/google/protobuf/unittest_mset.proto; sourceTree = "<group>"; };
- 8B7E6A7C14893DBC00F8884A /* unittest_no_generic_services.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = unittest_no_generic_services.proto; path = ../../src/google/protobuf/unittest_no_generic_services.proto; sourceTree = "<group>"; };
- 8B7E6A7D14893DBC00F8884A /* unittest_optimize_for.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = unittest_optimize_for.proto; path = ../../src/google/protobuf/unittest_optimize_for.proto; sourceTree = "<group>"; };
- 8B7E6A7E14893DBC00F8884A /* unittest.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = unittest.proto; path = ../../src/google/protobuf/unittest.proto; sourceTree = "<group>"; };
8B8B615C17DF7056002EE618 /* GPBARCUnittestProtos.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBARCUnittestProtos.m; sourceTree = "<group>"; };
8B96157214C8B06000A2AC0B /* GPBDescriptor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GPBDescriptor.h; sourceTree = "<group>"; };
8B96157314C8C38C00A2AC0B /* GPBDescriptor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBDescriptor.m; sourceTree = "<group>"; };
8B9742421A8AAA7800DCE92C /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
8B9A5E9F1831913D00A9D33B /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
- 8BBD9DB016DD1DC8008E1EC1 /* unittest_lite.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = unittest_lite.proto; path = ../../src/google/protobuf/unittest_lite.proto; sourceTree = "<group>"; };
8BBEA4A6147C727100C4ADB7 /* UnitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = UnitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
8BCF338814ED799900BC5317 /* GPBProtocolBuffers.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GPBProtocolBuffers.m; sourceTree = "<group>"; };
- 8BD3981D14BE54220081D629 /* unittest_enormous_descriptor.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = unittest_enormous_descriptor.proto; path = ../../src/google/protobuf/unittest_enormous_descriptor.proto; sourceTree = "<group>"; };
8BD3981E14BE59D70081D629 /* GPBUnittestProtos.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBUnittestProtos.m; sourceTree = "<group>"; };
8BEB5AE01498033E0078BF9D /* GPBRuntimeTypes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GPBRuntimeTypes.h; sourceTree = "<group>"; };
8BFF9D1B23AD593B00E63E32 /* GPBMessageTests+ClassNames.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "GPBMessageTests+ClassNames.m"; sourceTree = "<group>"; };
@@ -206,8 +194,6 @@
F40EE4D6206BF9190071091A /* GPBCompileTest03.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBCompileTest03.m; sourceTree = "<group>"; };
F40EE4D7206BF9190071091A /* GPBCompileTest06.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBCompileTest06.m; sourceTree = "<group>"; };
F40EE4D8206BF9190071091A /* GPBCompileTest11.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBCompileTest11.m; sourceTree = "<group>"; };
- F40EE50D206C06880071091A /* GPBCompileTest25.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBCompileTest25.m; sourceTree = "<group>"; };
- F40EE50E206C06880071091A /* GPBCompileTest24.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBCompileTest24.m; sourceTree = "<group>"; };
F41C175C1833D3310064ED4D /* GPBPerfTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBPerfTests.m; sourceTree = "<group>"; };
F4353D1E1AB88243005A6198 /* GPBDescriptorTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBDescriptorTests.m; sourceTree = "<group>"; };
F4353D241ABB156F005A6198 /* GPBDictionary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GPBDictionary.h; sourceTree = "<group>"; };
@@ -232,6 +218,23 @@
F4487C801AAF62FC00531423 /* GPBMessageTests+Serialization.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "GPBMessageTests+Serialization.m"; sourceTree = "<group>"; };
F4487C841AAF6AC500531423 /* GPBMessageTests+Merge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "GPBMessageTests+Merge.m"; sourceTree = "<group>"; };
F44929021C866B3B00C2548A /* GPBCodedOutputStream_PackagePrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GPBCodedOutputStream_PackagePrivate.h; sourceTree = "<group>"; };
+ F44FEAD128B546E200EC57B3 /* unittest_preserve_unknown_enum.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = unittest_preserve_unknown_enum.proto; sourceTree = "<group>"; };
+ F44FEAD228B546E200EC57B3 /* map_proto2_unittest.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = map_proto2_unittest.proto; sourceTree = "<group>"; };
+ F44FEAD328B546E200EC57B3 /* map_unittest.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = map_unittest.proto; sourceTree = "<group>"; };
+ F44FEAD428B546E200EC57B3 /* unittest_extension_chain_a.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = unittest_extension_chain_a.proto; sourceTree = "<group>"; };
+ F44FEAD528B546E300EC57B3 /* unittest_extension_chain_d.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = unittest_extension_chain_d.proto; sourceTree = "<group>"; };
+ F44FEAD628B546E300EC57B3 /* unittest_deprecated.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = unittest_deprecated.proto; sourceTree = "<group>"; };
+ F44FEAD728B546E300EC57B3 /* any_test.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = any_test.proto; sourceTree = "<group>"; };
+ F44FEAD828B546E300EC57B3 /* unittest_extension_chain_b.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = unittest_extension_chain_b.proto; sourceTree = "<group>"; };
+ F44FEADB28B546E300EC57B3 /* unittest_import.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = unittest_import.proto; sourceTree = "<group>"; };
+ F44FEADC28B546E300EC57B3 /* unittest_mset.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = unittest_mset.proto; sourceTree = "<group>"; };
+ F44FEADD28B546E300EC57B3 /* unittest.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = unittest.proto; sourceTree = "<group>"; };
+ F44FEADE28B546E300EC57B3 /* unittest_extension_chain_f.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = unittest_extension_chain_f.proto; sourceTree = "<group>"; };
+ F44FEADF28B546E300EC57B3 /* unittest_deprecated_file.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = unittest_deprecated_file.proto; sourceTree = "<group>"; };
+ F44FEAE028B546E300EC57B3 /* unittest_import_public.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = unittest_import_public.proto; sourceTree = "<group>"; };
+ F44FEAE128B546E300EC57B3 /* unittest_extension_chain_g.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = unittest_extension_chain_g.proto; sourceTree = "<group>"; };
+ F44FEAE228B546E300EC57B3 /* unittest_extension_chain_c.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = unittest_extension_chain_c.proto; sourceTree = "<group>"; };
+ F44FEAE328B546E300EC57B3 /* unittest_extension_chain_e.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = unittest_extension_chain_e.proto; sourceTree = "<group>"; };
F451D3F61A8AAEA600B8A22C /* GPBProtocolBuffers_RuntimeSupport.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GPBProtocolBuffers_RuntimeSupport.h; sourceTree = "<group>"; };
F4584D801ECCB39E00803AB6 /* GPBExtensionRegistryTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPBExtensionRegistryTest.m; path = Tests/GPBExtensionRegistryTest.m; sourceTree = SOURCE_ROOT; };
F45C69CB16DFD08D0081955B /* GPBExtensionInternals.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBExtensionInternals.m; sourceTree = "<group>"; };
@@ -448,12 +451,13 @@
7461B6940F94FDDD00A0C422 /* Tests */ = {
isa = PBXGroup;
children = (
+ F44FEAD728B546E300EC57B3 /* any_test.proto */,
8B210CCD159383D60032D72D /* golden_message */,
8B210CCF159386920032D72D /* golden_packed_fields_message */,
8B8B615C17DF7056002EE618 /* GPBARCUnittestProtos.m */,
F401DC341A8E5C6F00FCC765 /* GPBArrayTests.m */,
7461B69B0F94FDF800A0C422 /* GPBCodedInputStreamTests.m */,
- 7461B69D0F94FDF800A0C422 /* GPBCodedOuputStreamTests.m */,
+ 7461B69D0F94FDF800A0C422 /* GPBCodedOutputStreamTests.m */,
F40EE4CD206BF9170071091A /* GPBCompileTest01.m */,
F40EE4C6206BF9170071091A /* GPBCompileTest02.m */,
F40EE4D6206BF9190071091A /* GPBCompileTest03.m */,
@@ -477,8 +481,6 @@
F40EE4CB206BF9170071091A /* GPBCompileTest21.m */,
F40EE4CF206BF9170071091A /* GPBCompileTest22.m */,
F40EE4CC206BF9170071091A /* GPBCompileTest23.m */,
- F40EE50E206C06880071091A /* GPBCompileTest24.m */,
- F40EE50D206C06880071091A /* GPBCompileTest25.m */,
5102DABB1891A052002037B6 /* GPBConcurrencyTests.m */,
F4353D1E1AB88243005A6198 /* GPBDescriptorTests.m */,
F4C4B9E51E1D97BB00D3B61D /* GPBDictionaryTests.m */,
@@ -491,9 +493,9 @@
F4353D401AC06F31005A6198 /* GPBDictionaryTests+UInt64.m */,
F4584D801ECCB39E00803AB6 /* GPBExtensionRegistryTest.m */,
7461B6A30F94FDF800A0C422 /* GPBMessageTests.m */,
+ 8BFF9D1B23AD593B00E63E32 /* GPBMessageTests+ClassNames.m */,
F4487C841AAF6AC500531423 /* GPBMessageTests+Merge.m */,
F4487C761AADF84900531423 /* GPBMessageTests+Runtime.m */,
- 8BFF9D1B23AD593B00E63E32 /* GPBMessageTests+ClassNames.m */,
F4487C801AAF62FC00531423 /* GPBMessageTests+Serialization.m */,
F4B51B1B1BBC5C7100744318 /* GPBObjectiveCPlusPlusTest.mm */,
F41C175C1833D3310064ED4D /* GPBPerfTests.m */,
@@ -506,25 +508,31 @@
7461B6BA0F94FDF900A0C422 /* GPBUtilitiesTests.m */,
8B4248E51A929C9900BC1EC6 /* GPBWellKnownTypesTest.m */,
7461B6BC0F94FDF900A0C422 /* GPBWireFormatTests.m */,
+ F44FEAD228B546E200EC57B3 /* map_proto2_unittest.proto */,
+ F44FEAD328B546E200EC57B3 /* map_unittest.proto */,
F4F53F8B219CC5DF001EABF4 /* text_format_extensions_unittest_data.txt */,
F45E57C81AE6DC98000B7D99 /* text_format_map_unittest_data.txt */,
F43C88CF191D77FC009E917D /* text_format_unittest_data.txt */,
- 8B7E6A7414893DBA00F8884A /* unittest_custom_options.proto */,
F4AC9E1C1A8BEB1000BD6E83 /* unittest_cycle.proto */,
- 8B7E6A7514893DBA00F8884A /* unittest_embed_optimize_for.proto */,
- 8B7E6A7614893DBA00F8884A /* unittest_empty.proto */,
- 8BD3981D14BE54220081D629 /* unittest_enormous_descriptor.proto */,
- 8B7E6A7814893DBB00F8884A /* unittest_import.proto */,
- 8BBD9DB016DD1DC8008E1EC1 /* unittest_lite.proto */,
- 8B7E6A7B14893DBC00F8884A /* unittest_mset.proto */,
- 8B7E6A7C14893DBC00F8884A /* unittest_no_generic_services.proto */,
+ F44FEADF28B546E300EC57B3 /* unittest_deprecated_file.proto */,
+ F44FEAD628B546E300EC57B3 /* unittest_deprecated.proto */,
+ F44FEAD428B546E200EC57B3 /* unittest_extension_chain_a.proto */,
+ F44FEAD828B546E300EC57B3 /* unittest_extension_chain_b.proto */,
+ F44FEAE228B546E300EC57B3 /* unittest_extension_chain_c.proto */,
+ F44FEAD528B546E300EC57B3 /* unittest_extension_chain_d.proto */,
+ F44FEAE328B546E300EC57B3 /* unittest_extension_chain_e.proto */,
+ F44FEADE28B546E300EC57B3 /* unittest_extension_chain_f.proto */,
+ F44FEAE128B546E300EC57B3 /* unittest_extension_chain_g.proto */,
+ F44FEAE028B546E300EC57B3 /* unittest_import_public.proto */,
+ F44FEADB28B546E300EC57B3 /* unittest_import.proto */,
+ F44FEADC28B546E300EC57B3 /* unittest_mset.proto */,
8B35468621A61EB2000BD30D /* unittest_objc_options.proto */,
F4CF31711B162EF500BD9B06 /* unittest_objc_startup.proto */,
8B09AAF614B663A7007B4184 /* unittest_objc.proto */,
- 8B7E6A7D14893DBC00F8884A /* unittest_optimize_for.proto */,
+ F44FEAD128B546E200EC57B3 /* unittest_preserve_unknown_enum.proto */,
F4487C7A1AADFB5500531423 /* unittest_runtime_proto2.proto */,
F4487C7B1AADFB5500531423 /* unittest_runtime_proto3.proto */,
- 8B7E6A7E14893DBC00F8884A /* unittest.proto */,
+ F44FEADD28B546E300EC57B3 /* unittest.proto */,
8B4248B21A8BD96D00BC1EC6 /* UnitTests-Bridging-Header.h */,
7401C1A90F950347006D8281 /* UnitTests-Info.plist */,
);
@@ -662,7 +670,7 @@
};
};
buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "ProtocolBuffers_iOS" */;
- compatibilityVersion = "Xcode 6.3";
+ compatibilityVersion = "Xcode 13.0";
developmentRegion = English;
hasScannedForEncodings = 1;
knownRegions = (
@@ -751,7 +759,6 @@
buildActionMask = 2147483647;
files = (
8BBEA4A9147C727D00C4ADB7 /* GPBCodedInputStreamTests.m in Sources */,
- F40EE511206C068D0071091A /* GPBCompileTest24.m in Sources */,
F40EE503206BF91E0071091A /* GPBCompileTest20.m in Sources */,
F401DC351A8E5C6F00FCC765 /* GPBArrayTests.m in Sources */,
F40EE4F9206BF91E0071091A /* GPBCompileTest10.m in Sources */,
@@ -760,7 +767,7 @@
F40EE4F7206BF91E0071091A /* GPBCompileTest08.m in Sources */,
F40EE500206BF91E0071091A /* GPBCompileTest17.m in Sources */,
F4353D471AC06F31005A6198 /* GPBDictionaryTests+UInt64.m in Sources */,
- 8BBEA4AA147C727D00C4ADB7 /* GPBCodedOuputStreamTests.m in Sources */,
+ 8BBEA4AA147C727D00C4ADB7 /* GPBCodedOutputStreamTests.m in Sources */,
F40EE506206BF91E0071091A /* GPBCompileTest23.m in Sources */,
8BBEA4AC147C727D00C4ADB7 /* GPBMessageTests.m in Sources */,
F4487C811AAF62FC00531423 /* GPBMessageTests+Serialization.m in Sources */,
@@ -779,7 +786,6 @@
F4F8D8861D78A193002CE128 /* GPBUnittestProtos2.m in Sources */,
F4B51B1C1BBC5C7100744318 /* GPBObjectiveCPlusPlusTest.mm in Sources */,
8B4248B41A8BD96E00BC1EC6 /* GPBSwiftTests.swift in Sources */,
- F40EE512206C068D0071091A /* GPBCompileTest25.m in Sources */,
F4584D831ECCB53600803AB6 /* GPBExtensionRegistryTest.m in Sources */,
8BFF9D1C23AD593C00E63E32 /* GPBMessageTests+ClassNames.m in Sources */,
5102DABC1891A073002037B6 /* GPBConcurrencyTests.m in Sources */,
@@ -863,7 +869,11 @@
"$(inherited)",
);
INFOPLIST_FILE = "Tests/UnitTests-Info.plist";
- LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@loader_path/Frameworks",
+ );
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"\"$(DEVELOPER_DIR)/usr/lib\"",
@@ -874,7 +884,10 @@
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 4.0;
TARGETED_DEVICE_FAMILY = "1,2";
- USER_HEADER_SEARCH_PATHS = "${PROJECT_DERIVED_FILE_DIR}/protos $(SRCROOT)";
+ USER_HEADER_SEARCH_PATHS = (
+ "${PROJECT_DERIVED_FILE_DIR}/protos",
+ "$(SRCROOT)",
+ );
WARNING_CFLAGS = (
"$(inherited)",
"-Wno-documentation-unknown-command",
@@ -894,7 +907,11 @@
"$(inherited)",
);
INFOPLIST_FILE = "Tests/UnitTests-Info.plist";
- LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@loader_path/Frameworks",
+ );
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"\"$(DEVELOPER_DIR)/usr/lib\"",
@@ -904,7 +921,10 @@
SWIFT_OBJC_BRIDGING_HEADER = "Tests/UnitTests-Bridging-Header.h";
SWIFT_VERSION = 4.0;
TARGETED_DEVICE_FAMILY = "1,2";
- USER_HEADER_SEARCH_PATHS = "${PROJECT_DERIVED_FILE_DIR}/protos $(SRCROOT)";
+ USER_HEADER_SEARCH_PATHS = (
+ "${PROJECT_DERIVED_FILE_DIR}/protos",
+ "$(SRCROOT)",
+ );
WARNING_CFLAGS = (
"$(inherited)",
"-Wno-documentation-unknown-command",
@@ -970,7 +990,7 @@
GCC_WARN_UNUSED_PARAMETER = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
GENERATE_PROFILING_CODE = NO;
- IPHONEOS_DEPLOYMENT_TARGET = 9.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 10.0;
ONLY_ACTIVE_ARCH = YES;
RUN_CLANG_STATIC_ANALYZER = YES;
SDKROOT = iphoneos;
@@ -1039,10 +1059,11 @@
GCC_WARN_UNUSED_PARAMETER = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
GENERATE_PROFILING_CODE = NO;
- IPHONEOS_DEPLOYMENT_TARGET = 9.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 10.0;
RUN_CLANG_STATIC_ANALYZER = YES;
SDKROOT = iphoneos;
- SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
+ SWIFT_COMPILATION_MODE = wholemodule;
+ SWIFT_OPTIMIZATION_LEVEL = "-O";
WARNING_CFLAGS = (
"-Wdocumentation-unknown-command",
"-Wundef",
diff --git a/objectivec/ProtocolBuffers_tvOS.xcodeproj/project.pbxproj b/objectivec/ProtocolBuffers_tvOS.xcodeproj/project.pbxproj
index c7a8d85..3b535ba 100644
--- a/objectivec/ProtocolBuffers_tvOS.xcodeproj/project.pbxproj
+++ b/objectivec/ProtocolBuffers_tvOS.xcodeproj/project.pbxproj
@@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
- objectVersion = 47;
+ objectVersion = 55;
objects = {
/* Begin PBXBuildFile section */
@@ -27,7 +27,7 @@
8B96157414C8C38C00A2AC0B /* GPBDescriptor.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B96157314C8C38C00A2AC0B /* GPBDescriptor.m */; };
8B9A5EEC18330A0F00A9D33B /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B9A5E9F1831913D00A9D33B /* UIKit.framework */; };
8BBEA4A9147C727D00C4ADB7 /* GPBCodedInputStreamTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7461B69B0F94FDF800A0C422 /* GPBCodedInputStreamTests.m */; };
- 8BBEA4AA147C727D00C4ADB7 /* GPBCodedOuputStreamTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7461B69D0F94FDF800A0C422 /* GPBCodedOuputStreamTests.m */; };
+ 8BBEA4AA147C727D00C4ADB7 /* GPBCodedOutputStreamTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7461B69D0F94FDF800A0C422 /* GPBCodedOutputStreamTests.m */; };
8BBEA4AC147C727D00C4ADB7 /* GPBMessageTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7461B6A30F94FDF800A0C422 /* GPBMessageTests.m */; };
8BBEA4B0147C727D00C4ADB7 /* GPBTestUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 7461B6AC0F94FDF800A0C422 /* GPBTestUtilities.m */; };
8BBEA4B6147C727D00C4ADB7 /* GPBUnknownFieldSetTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 7461B6B80F94FDF900A0C422 /* GPBUnknownFieldSetTest.m */; };
@@ -61,8 +61,6 @@
F40EE504206BF91E0071091A /* GPBCompileTest21.m in Sources */ = {isa = PBXBuildFile; fileRef = F40EE4CB206BF9170071091A /* GPBCompileTest21.m */; };
F40EE505206BF91E0071091A /* GPBCompileTest22.m in Sources */ = {isa = PBXBuildFile; fileRef = F40EE4CF206BF9170071091A /* GPBCompileTest22.m */; };
F40EE506206BF91E0071091A /* GPBCompileTest23.m in Sources */ = {isa = PBXBuildFile; fileRef = F40EE4CC206BF9170071091A /* GPBCompileTest23.m */; };
- F40EE511206C068D0071091A /* GPBCompileTest24.m in Sources */ = {isa = PBXBuildFile; fileRef = F40EE50E206C06880071091A /* GPBCompileTest24.m */; };
- F40EE512206C068D0071091A /* GPBCompileTest25.m in Sources */ = {isa = PBXBuildFile; fileRef = F40EE50D206C06880071091A /* GPBCompileTest25.m */; };
F41C175D1833D3310064ED4D /* GPBPerfTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F41C175C1833D3310064ED4D /* GPBPerfTests.m */; };
F4353D1F1AB88243005A6198 /* GPBDescriptorTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F4353D1E1AB88243005A6198 /* GPBDescriptorTests.m */; };
F4353D271ABB156F005A6198 /* GPBDictionary.m in Sources */ = {isa = PBXBuildFile; fileRef = F4353D251ABB156F005A6198 /* GPBDictionary.m */; };
@@ -142,7 +140,7 @@
7461B4E80F94F99000A0C422 /* GPBWireFormat.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBWireFormat.m; sourceTree = "<group>"; };
7461B52E0F94FAF800A0C422 /* libProtocolBuffers.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libProtocolBuffers.a; sourceTree = BUILT_PRODUCTS_DIR; };
7461B69B0F94FDF800A0C422 /* GPBCodedInputStreamTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBCodedInputStreamTests.m; sourceTree = "<group>"; };
- 7461B69D0F94FDF800A0C422 /* GPBCodedOuputStreamTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBCodedOuputStreamTests.m; sourceTree = "<group>"; };
+ 7461B69D0F94FDF800A0C422 /* GPBCodedOutputStreamTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBCodedOutputStreamTests.m; sourceTree = "<group>"; };
7461B6A30F94FDF800A0C422 /* GPBMessageTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBMessageTests.m; sourceTree = "<group>"; };
7461B6AB0F94FDF800A0C422 /* GPBTestUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GPBTestUtilities.h; sourceTree = "<group>"; };
7461B6AC0F94FDF800A0C422 /* GPBTestUtilities.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBTestUtilities.m; sourceTree = "<group>"; };
@@ -162,23 +160,13 @@
8B42494A1A92A0BA00BC1EC6 /* duration.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = duration.proto; path = ../src/google/protobuf/duration.proto; sourceTree = "<group>"; };
8B79657814992E3E002FFBFC /* GPBRootObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GPBRootObject.h; sourceTree = "<group>"; };
8B79657914992E3E002FFBFC /* GPBRootObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBRootObject.m; sourceTree = "<group>"; };
- 8B7E6A7414893DBA00F8884A /* unittest_custom_options.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = unittest_custom_options.proto; path = ../../src/google/protobuf/unittest_custom_options.proto; sourceTree = "<group>"; };
- 8B7E6A7514893DBA00F8884A /* unittest_embed_optimize_for.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = unittest_embed_optimize_for.proto; path = ../../src/google/protobuf/unittest_embed_optimize_for.proto; sourceTree = "<group>"; };
- 8B7E6A7614893DBA00F8884A /* unittest_empty.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = unittest_empty.proto; path = ../../src/google/protobuf/unittest_empty.proto; sourceTree = "<group>"; };
- 8B7E6A7814893DBB00F8884A /* unittest_import.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = unittest_import.proto; path = ../../src/google/protobuf/unittest_import.proto; sourceTree = "<group>"; };
- 8B7E6A7B14893DBC00F8884A /* unittest_mset.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = unittest_mset.proto; path = ../../src/google/protobuf/unittest_mset.proto; sourceTree = "<group>"; };
- 8B7E6A7C14893DBC00F8884A /* unittest_no_generic_services.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = unittest_no_generic_services.proto; path = ../../src/google/protobuf/unittest_no_generic_services.proto; sourceTree = "<group>"; };
- 8B7E6A7D14893DBC00F8884A /* unittest_optimize_for.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = unittest_optimize_for.proto; path = ../../src/google/protobuf/unittest_optimize_for.proto; sourceTree = "<group>"; };
- 8B7E6A7E14893DBC00F8884A /* unittest.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = unittest.proto; path = ../../src/google/protobuf/unittest.proto; sourceTree = "<group>"; };
8B8B615C17DF7056002EE618 /* GPBARCUnittestProtos.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBARCUnittestProtos.m; sourceTree = "<group>"; };
8B96157214C8B06000A2AC0B /* GPBDescriptor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GPBDescriptor.h; sourceTree = "<group>"; };
8B96157314C8C38C00A2AC0B /* GPBDescriptor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBDescriptor.m; sourceTree = "<group>"; };
8B9742421A8AAA7800DCE92C /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
8B9A5E9F1831913D00A9D33B /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
- 8BBD9DB016DD1DC8008E1EC1 /* unittest_lite.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = unittest_lite.proto; path = ../../src/google/protobuf/unittest_lite.proto; sourceTree = "<group>"; };
8BBEA4A6147C727100C4ADB7 /* UnitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = UnitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
8BCF338814ED799900BC5317 /* GPBProtocolBuffers.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GPBProtocolBuffers.m; sourceTree = "<group>"; };
- 8BD3981D14BE54220081D629 /* unittest_enormous_descriptor.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = unittest_enormous_descriptor.proto; path = ../../src/google/protobuf/unittest_enormous_descriptor.proto; sourceTree = "<group>"; };
8BD3981E14BE59D70081D629 /* GPBUnittestProtos.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBUnittestProtos.m; sourceTree = "<group>"; };
8BEB5AE01498033E0078BF9D /* GPBRuntimeTypes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GPBRuntimeTypes.h; sourceTree = "<group>"; };
8BFF9D1D23AD599400E63E32 /* GPBMessageTests+ClassNames.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "GPBMessageTests+ClassNames.m"; sourceTree = "<group>"; };
@@ -206,8 +194,6 @@
F40EE4D6206BF9190071091A /* GPBCompileTest03.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBCompileTest03.m; sourceTree = "<group>"; };
F40EE4D7206BF9190071091A /* GPBCompileTest06.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBCompileTest06.m; sourceTree = "<group>"; };
F40EE4D8206BF9190071091A /* GPBCompileTest11.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBCompileTest11.m; sourceTree = "<group>"; };
- F40EE50D206C06880071091A /* GPBCompileTest25.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBCompileTest25.m; sourceTree = "<group>"; };
- F40EE50E206C06880071091A /* GPBCompileTest24.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBCompileTest24.m; sourceTree = "<group>"; };
F41C175C1833D3310064ED4D /* GPBPerfTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBPerfTests.m; sourceTree = "<group>"; };
F4353D1E1AB88243005A6198 /* GPBDescriptorTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBDescriptorTests.m; sourceTree = "<group>"; };
F4353D241ABB156F005A6198 /* GPBDictionary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GPBDictionary.h; sourceTree = "<group>"; };
@@ -232,6 +218,23 @@
F4487C801AAF62FC00531423 /* GPBMessageTests+Serialization.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "GPBMessageTests+Serialization.m"; sourceTree = "<group>"; };
F4487C841AAF6AC500531423 /* GPBMessageTests+Merge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "GPBMessageTests+Merge.m"; sourceTree = "<group>"; };
F44929021C866B3B00C2548A /* GPBCodedOutputStream_PackagePrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GPBCodedOutputStream_PackagePrivate.h; sourceTree = "<group>"; };
+ F44FEAE528B5471300EC57B3 /* unittest_extension_chain_a.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = unittest_extension_chain_a.proto; sourceTree = "<group>"; };
+ F44FEAE728B5471300EC57B3 /* unittest_extension_chain_c.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = unittest_extension_chain_c.proto; sourceTree = "<group>"; };
+ F44FEAE828B5471300EC57B3 /* unittest_extension_chain_g.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = unittest_extension_chain_g.proto; sourceTree = "<group>"; };
+ F44FEAE928B5471300EC57B3 /* unittest_import.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = unittest_import.proto; sourceTree = "<group>"; };
+ F44FEAEA28B5471300EC57B3 /* unittest_deprecated_file.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = unittest_deprecated_file.proto; sourceTree = "<group>"; };
+ F44FEAEB28B5471300EC57B3 /* unittest_import_public.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = unittest_import_public.proto; sourceTree = "<group>"; };
+ F44FEAEC28B5471300EC57B3 /* unittest_extension_chain_f.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = unittest_extension_chain_f.proto; sourceTree = "<group>"; };
+ F44FEAED28B5471300EC57B3 /* unittest_deprecated.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = unittest_deprecated.proto; sourceTree = "<group>"; };
+ F44FEAEE28B5471300EC57B3 /* unittest.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = unittest.proto; sourceTree = "<group>"; };
+ F44FEAEF28B5471300EC57B3 /* any_test.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = any_test.proto; sourceTree = "<group>"; };
+ F44FEAF028B5471300EC57B3 /* unittest_extension_chain_b.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = unittest_extension_chain_b.proto; sourceTree = "<group>"; };
+ F44FEAF128B5471300EC57B3 /* unittest_mset.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = unittest_mset.proto; sourceTree = "<group>"; };
+ F44FEAF228B5471300EC57B3 /* unittest_preserve_unknown_enum.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = unittest_preserve_unknown_enum.proto; sourceTree = "<group>"; };
+ F44FEAF328B5471300EC57B3 /* unittest_extension_chain_d.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = unittest_extension_chain_d.proto; sourceTree = "<group>"; };
+ F44FEAF428B5471300EC57B3 /* unittest_extension_chain_e.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = unittest_extension_chain_e.proto; sourceTree = "<group>"; };
+ F44FEAF528B5472700EC57B3 /* map_proto2_unittest.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = map_proto2_unittest.proto; sourceTree = "<group>"; };
+ F44FEAF628B5472700EC57B3 /* map_unittest.proto */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.protobuf; path = map_unittest.proto; sourceTree = "<group>"; };
F451D3F61A8AAEA600B8A22C /* GPBProtocolBuffers_RuntimeSupport.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GPBProtocolBuffers_RuntimeSupport.h; sourceTree = "<group>"; };
F4584D801ECCB39E00803AB6 /* GPBExtensionRegistryTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPBExtensionRegistryTest.m; path = Tests/GPBExtensionRegistryTest.m; sourceTree = SOURCE_ROOT; };
F45C69CB16DFD08D0081955B /* GPBExtensionInternals.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBExtensionInternals.m; sourceTree = "<group>"; };
@@ -448,12 +451,13 @@
7461B6940F94FDDD00A0C422 /* Tests */ = {
isa = PBXGroup;
children = (
+ F44FEAEF28B5471300EC57B3 /* any_test.proto */,
8B210CCD159383D60032D72D /* golden_message */,
8B210CCF159386920032D72D /* golden_packed_fields_message */,
8B8B615C17DF7056002EE618 /* GPBARCUnittestProtos.m */,
F401DC341A8E5C6F00FCC765 /* GPBArrayTests.m */,
7461B69B0F94FDF800A0C422 /* GPBCodedInputStreamTests.m */,
- 7461B69D0F94FDF800A0C422 /* GPBCodedOuputStreamTests.m */,
+ 7461B69D0F94FDF800A0C422 /* GPBCodedOutputStreamTests.m */,
F40EE4CD206BF9170071091A /* GPBCompileTest01.m */,
F40EE4C6206BF9170071091A /* GPBCompileTest02.m */,
F40EE4D6206BF9190071091A /* GPBCompileTest03.m */,
@@ -477,8 +481,6 @@
F40EE4CB206BF9170071091A /* GPBCompileTest21.m */,
F40EE4CF206BF9170071091A /* GPBCompileTest22.m */,
F40EE4CC206BF9170071091A /* GPBCompileTest23.m */,
- F40EE50E206C06880071091A /* GPBCompileTest24.m */,
- F40EE50D206C06880071091A /* GPBCompileTest25.m */,
5102DABB1891A052002037B6 /* GPBConcurrencyTests.m */,
F4353D1E1AB88243005A6198 /* GPBDescriptorTests.m */,
F4C4B9E51E1D97BB00D3B61D /* GPBDictionaryTests.m */,
@@ -491,9 +493,9 @@
F4353D401AC06F31005A6198 /* GPBDictionaryTests+UInt64.m */,
F4584D801ECCB39E00803AB6 /* GPBExtensionRegistryTest.m */,
7461B6A30F94FDF800A0C422 /* GPBMessageTests.m */,
+ 8BFF9D1D23AD599400E63E32 /* GPBMessageTests+ClassNames.m */,
F4487C841AAF6AC500531423 /* GPBMessageTests+Merge.m */,
F4487C761AADF84900531423 /* GPBMessageTests+Runtime.m */,
- 8BFF9D1D23AD599400E63E32 /* GPBMessageTests+ClassNames.m */,
F4487C801AAF62FC00531423 /* GPBMessageTests+Serialization.m */,
F4B51B1B1BBC5C7100744318 /* GPBObjectiveCPlusPlusTest.mm */,
F41C175C1833D3310064ED4D /* GPBPerfTests.m */,
@@ -506,25 +508,31 @@
7461B6BA0F94FDF900A0C422 /* GPBUtilitiesTests.m */,
8B4248E51A929C9900BC1EC6 /* GPBWellKnownTypesTest.m */,
7461B6BC0F94FDF900A0C422 /* GPBWireFormatTests.m */,
+ F44FEAF528B5472700EC57B3 /* map_proto2_unittest.proto */,
+ F44FEAF628B5472700EC57B3 /* map_unittest.proto */,
F4F53F8B219CC5DF001EABF4 /* text_format_extensions_unittest_data.txt */,
F45E57C81AE6DC98000B7D99 /* text_format_map_unittest_data.txt */,
F43C88CF191D77FC009E917D /* text_format_unittest_data.txt */,
- 8B7E6A7414893DBA00F8884A /* unittest_custom_options.proto */,
F4AC9E1C1A8BEB1000BD6E83 /* unittest_cycle.proto */,
- 8B7E6A7514893DBA00F8884A /* unittest_embed_optimize_for.proto */,
- 8B7E6A7614893DBA00F8884A /* unittest_empty.proto */,
- 8BD3981D14BE54220081D629 /* unittest_enormous_descriptor.proto */,
- 8B7E6A7814893DBB00F8884A /* unittest_import.proto */,
- 8BBD9DB016DD1DC8008E1EC1 /* unittest_lite.proto */,
- 8B7E6A7B14893DBC00F8884A /* unittest_mset.proto */,
- 8B7E6A7C14893DBC00F8884A /* unittest_no_generic_services.proto */,
+ F44FEAEA28B5471300EC57B3 /* unittest_deprecated_file.proto */,
+ F44FEAED28B5471300EC57B3 /* unittest_deprecated.proto */,
+ F44FEAE528B5471300EC57B3 /* unittest_extension_chain_a.proto */,
+ F44FEAF028B5471300EC57B3 /* unittest_extension_chain_b.proto */,
+ F44FEAE728B5471300EC57B3 /* unittest_extension_chain_c.proto */,
+ F44FEAF328B5471300EC57B3 /* unittest_extension_chain_d.proto */,
+ F44FEAF428B5471300EC57B3 /* unittest_extension_chain_e.proto */,
+ F44FEAEC28B5471300EC57B3 /* unittest_extension_chain_f.proto */,
+ F44FEAE828B5471300EC57B3 /* unittest_extension_chain_g.proto */,
+ F44FEAEB28B5471300EC57B3 /* unittest_import_public.proto */,
+ F44FEAE928B5471300EC57B3 /* unittest_import.proto */,
+ F44FEAF128B5471300EC57B3 /* unittest_mset.proto */,
8B35468621A61EB2000BD30D /* unittest_objc_options.proto */,
F4CF31711B162EF500BD9B06 /* unittest_objc_startup.proto */,
8B09AAF614B663A7007B4184 /* unittest_objc.proto */,
- 8B7E6A7D14893DBC00F8884A /* unittest_optimize_for.proto */,
+ F44FEAF228B5471300EC57B3 /* unittest_preserve_unknown_enum.proto */,
F4487C7A1AADFB5500531423 /* unittest_runtime_proto2.proto */,
F4487C7B1AADFB5500531423 /* unittest_runtime_proto3.proto */,
- 8B7E6A7E14893DBC00F8884A /* unittest.proto */,
+ F44FEAEE28B5471300EC57B3 /* unittest.proto */,
8B4248B21A8BD96D00BC1EC6 /* UnitTests-Bridging-Header.h */,
7401C1A90F950347006D8281 /* UnitTests-Info.plist */,
);
@@ -662,7 +670,7 @@
};
};
buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "ProtocolBuffers_tvOS" */;
- compatibilityVersion = "Xcode 6.3";
+ compatibilityVersion = "Xcode 13.0";
developmentRegion = English;
hasScannedForEncodings = 1;
knownRegions = (
@@ -751,7 +759,6 @@
buildActionMask = 2147483647;
files = (
8BBEA4A9147C727D00C4ADB7 /* GPBCodedInputStreamTests.m in Sources */,
- F40EE511206C068D0071091A /* GPBCompileTest24.m in Sources */,
F40EE503206BF91E0071091A /* GPBCompileTest20.m in Sources */,
F401DC351A8E5C6F00FCC765 /* GPBArrayTests.m in Sources */,
F40EE4F9206BF91E0071091A /* GPBCompileTest10.m in Sources */,
@@ -760,7 +767,7 @@
F40EE4F7206BF91E0071091A /* GPBCompileTest08.m in Sources */,
F40EE500206BF91E0071091A /* GPBCompileTest17.m in Sources */,
F4353D471AC06F31005A6198 /* GPBDictionaryTests+UInt64.m in Sources */,
- 8BBEA4AA147C727D00C4ADB7 /* GPBCodedOuputStreamTests.m in Sources */,
+ 8BBEA4AA147C727D00C4ADB7 /* GPBCodedOutputStreamTests.m in Sources */,
F40EE506206BF91E0071091A /* GPBCompileTest23.m in Sources */,
8BBEA4AC147C727D00C4ADB7 /* GPBMessageTests.m in Sources */,
F4487C811AAF62FC00531423 /* GPBMessageTests+Serialization.m in Sources */,
@@ -779,7 +786,6 @@
F4F8D8861D78A193002CE128 /* GPBUnittestProtos2.m in Sources */,
F4B51B1C1BBC5C7100744318 /* GPBObjectiveCPlusPlusTest.mm in Sources */,
8B4248B41A8BD96E00BC1EC6 /* GPBSwiftTests.swift in Sources */,
- F40EE512206C068D0071091A /* GPBCompileTest25.m in Sources */,
F4584D831ECCB53600803AB6 /* GPBExtensionRegistryTest.m in Sources */,
8BFF9D1E23AD599400E63E32 /* GPBMessageTests+ClassNames.m in Sources */,
5102DABC1891A073002037B6 /* GPBConcurrencyTests.m in Sources */,
@@ -859,7 +865,11 @@
"$(inherited)",
);
INFOPLIST_FILE = "Tests/UnitTests-Info.plist";
- LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@loader_path/Frameworks",
+ );
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"\"$(DEVELOPER_DIR)/usr/lib\"",
@@ -869,7 +879,10 @@
SWIFT_OBJC_BRIDGING_HEADER = "Tests/UnitTests-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 4.0;
- USER_HEADER_SEARCH_PATHS = "${PROJECT_DERIVED_FILE_DIR}/protos $(SRCROOT)";
+ USER_HEADER_SEARCH_PATHS = (
+ "${PROJECT_DERIVED_FILE_DIR}/protos",
+ "$(SRCROOT)",
+ );
WARNING_CFLAGS = (
"$(inherited)",
"-Wno-documentation-unknown-command",
@@ -889,7 +902,11 @@
"$(inherited)",
);
INFOPLIST_FILE = "Tests/UnitTests-Info.plist";
- LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@loader_path/Frameworks",
+ );
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"\"$(DEVELOPER_DIR)/usr/lib\"",
@@ -898,7 +915,10 @@
PRODUCT_NAME = UnitTests;
SWIFT_OBJC_BRIDGING_HEADER = "Tests/UnitTests-Bridging-Header.h";
SWIFT_VERSION = 4.0;
- USER_HEADER_SEARCH_PATHS = "${PROJECT_DERIVED_FILE_DIR}/protos $(SRCROOT)";
+ USER_HEADER_SEARCH_PATHS = (
+ "${PROJECT_DERIVED_FILE_DIR}/protos",
+ "$(SRCROOT)",
+ );
WARNING_CFLAGS = (
"$(inherited)",
"-Wno-documentation-unknown-command",
@@ -967,7 +987,7 @@
ONLY_ACTIVE_ARCH = YES;
RUN_CLANG_STATIC_ANALYZER = YES;
SDKROOT = appletvos;
- TVOS_DEPLOYMENT_TARGET = 9.0;
+ TVOS_DEPLOYMENT_TARGET = 12.0;
WARNING_CFLAGS = (
"-Wdocumentation-unknown-command",
"-Wundef",
@@ -1035,8 +1055,9 @@
GENERATE_PROFILING_CODE = NO;
RUN_CLANG_STATIC_ANALYZER = YES;
SDKROOT = appletvos;
- SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
- TVOS_DEPLOYMENT_TARGET = 9.0;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ SWIFT_OPTIMIZATION_LEVEL = "-O";
+ TVOS_DEPLOYMENT_TARGET = 12.0;
WARNING_CFLAGS = (
"-Wdocumentation-unknown-command",
"-Wundef",
diff --git a/objectivec/README.md b/objectivec/README.md
index a0fcd19..95f561c 100644
--- a/objectivec/README.md
+++ b/objectivec/README.md
@@ -11,7 +11,7 @@
The Objective C implementation requires:
- Objective C 2.0 Runtime (32bit & 64bit iOS, 64bit OS X).
-- Xcode 10.3 (or later).
+- Xcode 13.3.1 (or later).
- The library code does *not* use ARC (for performance reasons), but it all can
be called from ARC code.
@@ -25,7 +25,7 @@
$ objectivec/DevTools/full_mac_build.sh
-This will generate the `src/protoc` binary.
+This will generate the `protoc` binary.
Building
--------
@@ -200,12 +200,13 @@
entry can be made as "no_package:PATH=prefix", where PATH is the
path for the .proto file.
- * `use_package_as_prefix` and `proto_package_prefix_exceptions_path`: The
- `value` for `use_package_as_prefix` can be `yes` or `no`, and indicates
- if a prefix should be derived from the proto package for all the symbols
- for files that don't have the `objc_class_prefix` file option (mentioned
- above). This helps ensure the symbols are more unique and means there is
- less chance of ObjC class name collisions.
+ * `use_package_as_prefix`, `package_as_prefix_forced_prefix` and
+ `proto_package_prefix_exceptions_path`: The `value` for
+ `use_package_as_prefix` can be `yes` or `no`, and indicates if a prefix
+ should be derived from the proto package for all the symbols for files that
+ don't have the `objc_class_prefix` file option (mentioned above). This helps
+ ensure the symbols are more unique and means there is less chance of ObjC
+ class name collisions.
To help in migrating code to using this support,
`proto_package_prefix_exceptions_path` can be used to provide the path
@@ -213,10 +214,16 @@
if prefixed with `#`). These package won't get the derived prefix, allowing
migrations to the behavior one proto package at a time across a code base.
+ `package_as_prefix_forced_prefix` can be used to provide a value that will
+ be used before all prefixes derived from the packages to help group all of
+ these types with a common prefix. Thus it only makes sense to use it when
+ `use_package_as_prefix` is also enabled. For example, setting this to
+ "XYZ\_" and generating a file with the package "something" defining
+ "MyMessage", would have Objective-C class be `XYZ_Something_MyMessage`.
+
`use_package_as_prefix` currently defaults to `no` (existing behavior), but
- in the future (as a breaking change), that is likely to change since it
- helps prepare folks before they end up using a lot of protos and getting a
- lot of collisions.
+ that could change in the future as it helps avoid collisions when more
+ protos get added to the build. Note that this would be a breaking change.
* `headers_use_forward_declarations`: The `value` for this can be `yes` or
`no`, and indicates if the generated headers use forward declarations for
diff --git a/objectivec/Tests/GPBARCUnittestProtos.m b/objectivec/Tests/GPBARCUnittestProtos.m
index 29f6ccf..fa23692 100644
--- a/objectivec/Tests/GPBARCUnittestProtos.m
+++ b/objectivec/Tests/GPBARCUnittestProtos.m
@@ -34,30 +34,16 @@
// Makes sure all the generated headers compile with ARC on.
-// The unittest_custom_options.proto extends the messages in descriptor.proto
-// so we build it in to test extending in general. The library doesn't provide
-// a descriptor as it doesn't use the classes/enums.
-#import "google/protobuf/Descriptor.pbobjc.h"
-
-#import "google/protobuf/Unittest.pbobjc.h"
-#import "google/protobuf/UnittestCustomOptions.pbobjc.h"
-#import "google/protobuf/UnittestCycle.pbobjc.h"
-#import "google/protobuf/UnittestDeprecated.pbobjc.h"
-#import "google/protobuf/UnittestDeprecatedFile.pbobjc.h"
-#import "google/protobuf/UnittestDropUnknownFields.pbobjc.h"
-#import "google/protobuf/UnittestEmbedOptimizeFor.pbobjc.h"
-#import "google/protobuf/UnittestEmpty.pbobjc.h"
-#import "google/protobuf/UnittestEnormousDescriptor.pbobjc.h"
-#import "google/protobuf/UnittestImport.pbobjc.h"
-#import "google/protobuf/UnittestImportLite.pbobjc.h"
-#import "google/protobuf/UnittestImportPublic.pbobjc.h"
-#import "google/protobuf/UnittestImportPublicLite.pbobjc.h"
-#import "google/protobuf/UnittestLite.pbobjc.h"
-#import "google/protobuf/UnittestMset.pbobjc.h"
-#import "google/protobuf/UnittestNoGenericServices.pbobjc.h"
-#import "google/protobuf/UnittestObjc.pbobjc.h"
-#import "google/protobuf/UnittestObjcStartup.pbobjc.h"
-#import "google/protobuf/UnittestOptimizeFor.pbobjc.h"
-#import "google/protobuf/UnittestPreserveUnknownEnum.pbobjc.h"
-#import "google/protobuf/UnittestRuntimeProto2.pbobjc.h"
-#import "google/protobuf/UnittestRuntimeProto3.pbobjc.h"
+#import "objectivec/Tests/Unittest.pbobjc.h"
+#import "objectivec/Tests/UnittestCycle.pbobjc.h"
+#import "objectivec/Tests/UnittestDeprecated.pbobjc.h"
+#import "objectivec/Tests/UnittestDeprecatedFile.pbobjc.h"
+#import "objectivec/Tests/UnittestImport.pbobjc.h"
+#import "objectivec/Tests/UnittestImportPublic.pbobjc.h"
+#import "objectivec/Tests/UnittestMset.pbobjc.h"
+#import "objectivec/Tests/UnittestObjc.pbobjc.h"
+#import "objectivec/Tests/UnittestObjcOptions.pbobjc.h"
+#import "objectivec/Tests/UnittestObjcStartup.pbobjc.h"
+#import "objectivec/Tests/UnittestPreserveUnknownEnum.pbobjc.h"
+#import "objectivec/Tests/UnittestRuntimeProto2.pbobjc.h"
+#import "objectivec/Tests/UnittestRuntimeProto3.pbobjc.h"
diff --git a/objectivec/Tests/GPBArrayTests.m b/objectivec/Tests/GPBArrayTests.m
index 9b004bc..efb512e 100644
--- a/objectivec/Tests/GPBArrayTests.m
+++ b/objectivec/Tests/GPBArrayTests.m
@@ -40,8 +40,7 @@
@interface GPBEnumArray (TestingTweak)
+ (instancetype)arrayWithValue:(int32_t)value;
+ (instancetype)arrayWithCapacity:(NSUInteger)count;
-- (instancetype)initWithValues:(const int32_t [])values
- count:(NSUInteger)count;
+- (instancetype)initWithValues:(const int32_t[])values count:(NSUInteger)count;
@end
static BOOL TestingEnum_IsValidValue(int32_t value) {
@@ -77,16 +76,16 @@
return [[[self alloc] initWithValidationFunction:TestingEnum_IsValidValue
capacity:count] autorelease];
}
-- (instancetype)initWithValues:(const int32_t [])values
- count:(NSUInteger)count {
- return [self initWithValidationFunction:TestingEnum_IsValidValue
- rawValues:values
- count:count];
+- (instancetype)initWithValues:(const int32_t[])values count:(NSUInteger)count {
+ return [self initWithValidationFunction:TestingEnum_IsValidValue rawValues:values count:count];
}
@end
#pragma mark - PDDM Macros
+// Disable clang-format for the macros.
+// clang-format off
+
//%PDDM-DEFINE ARRAY_TESTS(NAME, TYPE, VAL1, VAL2, VAL3, VAL4)
//%ARRAY_TESTS2(NAME, TYPE, VAL1, VAL2, VAL3, VAL4, )
//%PDDM-DEFINE ARRAY_TESTS2(NAME, TYPE, VAL1, VAL2, VAL3, VAL4, HELPER)
@@ -102,13 +101,11 @@
//% XCTAssertNotNil(array);
//% XCTAssertEqual(array.count, 0U);
//% XCTAssertThrowsSpecificNamed([array valueAtIndex:0], NSException, NSRangeException);
-//% [array enumerateValuesWithBlock:^(TYPE value, NSUInteger idx, BOOL *stop) {
-//% #pragma unused(value, idx, stop)
+//% [array enumerateValuesWithBlock:^(__unused TYPE value, __unused NSUInteger idx, __unused BOOL *stop) {
//% XCTFail(@"Shouldn't get here!");
//% }];
//% [array enumerateValuesWithOptions:NSEnumerationReverse
-//% usingBlock:^(TYPE value, NSUInteger idx, BOOL *stop) {
-//% #pragma unused(value, idx, stop)
+//% usingBlock:^(__unused TYPE value, __unused NSUInteger idx, __unused BOOL *stop) {
//% XCTFail(@"Shouldn't get here!");
//% }];
//% [array release];
@@ -433,7 +430,6 @@
//%
//%PDDM-EXPAND ARRAY_TESTS(Int32, int32_t, 1, 2, 3, 4)
// This block of code is generated, do not edit it directly.
-// clang-format off
#pragma mark - Int32
@@ -447,13 +443,11 @@
XCTAssertNotNil(array);
XCTAssertEqual(array.count, 0U);
XCTAssertThrowsSpecificNamed([array valueAtIndex:0], NSException, NSRangeException);
- [array enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
- #pragma unused(value, idx, stop)
+ [array enumerateValuesWithBlock:^(__unused int32_t value, __unused NSUInteger idx, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[array enumerateValuesWithOptions:NSEnumerationReverse
- usingBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
- #pragma unused(value, idx, stop)
+ usingBlock:^(__unused int32_t value, __unused NSUInteger idx, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[array release];
@@ -776,10 +770,8 @@
@end
-// clang-format on
//%PDDM-EXPAND ARRAY_TESTS(UInt32, uint32_t, 11U, 12U, 13U, 14U)
// This block of code is generated, do not edit it directly.
-// clang-format off
#pragma mark - UInt32
@@ -793,13 +785,11 @@
XCTAssertNotNil(array);
XCTAssertEqual(array.count, 0U);
XCTAssertThrowsSpecificNamed([array valueAtIndex:0], NSException, NSRangeException);
- [array enumerateValuesWithBlock:^(uint32_t value, NSUInteger idx, BOOL *stop) {
- #pragma unused(value, idx, stop)
+ [array enumerateValuesWithBlock:^(__unused uint32_t value, __unused NSUInteger idx, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[array enumerateValuesWithOptions:NSEnumerationReverse
- usingBlock:^(uint32_t value, NSUInteger idx, BOOL *stop) {
- #pragma unused(value, idx, stop)
+ usingBlock:^(__unused uint32_t value, __unused NSUInteger idx, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[array release];
@@ -1122,10 +1112,8 @@
@end
-// clang-format on
//%PDDM-EXPAND ARRAY_TESTS(Int64, int64_t, 31LL, 32LL, 33LL, 34LL)
// This block of code is generated, do not edit it directly.
-// clang-format off
#pragma mark - Int64
@@ -1139,13 +1127,11 @@
XCTAssertNotNil(array);
XCTAssertEqual(array.count, 0U);
XCTAssertThrowsSpecificNamed([array valueAtIndex:0], NSException, NSRangeException);
- [array enumerateValuesWithBlock:^(int64_t value, NSUInteger idx, BOOL *stop) {
- #pragma unused(value, idx, stop)
+ [array enumerateValuesWithBlock:^(__unused int64_t value, __unused NSUInteger idx, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[array enumerateValuesWithOptions:NSEnumerationReverse
- usingBlock:^(int64_t value, NSUInteger idx, BOOL *stop) {
- #pragma unused(value, idx, stop)
+ usingBlock:^(__unused int64_t value, __unused NSUInteger idx, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[array release];
@@ -1468,10 +1454,8 @@
@end
-// clang-format on
//%PDDM-EXPAND ARRAY_TESTS(UInt64, uint64_t, 41ULL, 42ULL, 43ULL, 44ULL)
// This block of code is generated, do not edit it directly.
-// clang-format off
#pragma mark - UInt64
@@ -1485,13 +1469,11 @@
XCTAssertNotNil(array);
XCTAssertEqual(array.count, 0U);
XCTAssertThrowsSpecificNamed([array valueAtIndex:0], NSException, NSRangeException);
- [array enumerateValuesWithBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) {
- #pragma unused(value, idx, stop)
+ [array enumerateValuesWithBlock:^(__unused uint64_t value, __unused NSUInteger idx, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[array enumerateValuesWithOptions:NSEnumerationReverse
- usingBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) {
- #pragma unused(value, idx, stop)
+ usingBlock:^(__unused uint64_t value, __unused NSUInteger idx, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[array release];
@@ -1814,10 +1796,8 @@
@end
-// clang-format on
//%PDDM-EXPAND ARRAY_TESTS(Float, float, 51.f, 52.f, 53.f, 54.f)
// This block of code is generated, do not edit it directly.
-// clang-format off
#pragma mark - Float
@@ -1831,13 +1811,11 @@
XCTAssertNotNil(array);
XCTAssertEqual(array.count, 0U);
XCTAssertThrowsSpecificNamed([array valueAtIndex:0], NSException, NSRangeException);
- [array enumerateValuesWithBlock:^(float value, NSUInteger idx, BOOL *stop) {
- #pragma unused(value, idx, stop)
+ [array enumerateValuesWithBlock:^(__unused float value, __unused NSUInteger idx, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[array enumerateValuesWithOptions:NSEnumerationReverse
- usingBlock:^(float value, NSUInteger idx, BOOL *stop) {
- #pragma unused(value, idx, stop)
+ usingBlock:^(__unused float value, __unused NSUInteger idx, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[array release];
@@ -2160,10 +2138,8 @@
@end
-// clang-format on
//%PDDM-EXPAND ARRAY_TESTS(Double, double, 61., 62., 63., 64.)
// This block of code is generated, do not edit it directly.
-// clang-format off
#pragma mark - Double
@@ -2177,13 +2153,11 @@
XCTAssertNotNil(array);
XCTAssertEqual(array.count, 0U);
XCTAssertThrowsSpecificNamed([array valueAtIndex:0], NSException, NSRangeException);
- [array enumerateValuesWithBlock:^(double value, NSUInteger idx, BOOL *stop) {
- #pragma unused(value, idx, stop)
+ [array enumerateValuesWithBlock:^(__unused double value, __unused NSUInteger idx, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[array enumerateValuesWithOptions:NSEnumerationReverse
- usingBlock:^(double value, NSUInteger idx, BOOL *stop) {
- #pragma unused(value, idx, stop)
+ usingBlock:^(__unused double value, __unused NSUInteger idx, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[array release];
@@ -2506,10 +2480,8 @@
@end
-// clang-format on
//%PDDM-EXPAND ARRAY_TESTS(Bool, BOOL, TRUE, TRUE, FALSE, FALSE)
// This block of code is generated, do not edit it directly.
-// clang-format off
#pragma mark - Bool
@@ -2523,13 +2495,11 @@
XCTAssertNotNil(array);
XCTAssertEqual(array.count, 0U);
XCTAssertThrowsSpecificNamed([array valueAtIndex:0], NSException, NSRangeException);
- [array enumerateValuesWithBlock:^(BOOL value, NSUInteger idx, BOOL *stop) {
- #pragma unused(value, idx, stop)
+ [array enumerateValuesWithBlock:^(__unused BOOL value, __unused NSUInteger idx, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[array enumerateValuesWithOptions:NSEnumerationReverse
- usingBlock:^(BOOL value, NSUInteger idx, BOOL *stop) {
- #pragma unused(value, idx, stop)
+ usingBlock:^(__unused BOOL value, __unused NSUInteger idx, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[array release];
@@ -2852,10 +2822,8 @@
@end
-// clang-format on
//%PDDM-EXPAND ARRAY_TESTS2(Enum, int32_t, 71, 72, 73, 74, Raw)
// This block of code is generated, do not edit it directly.
-// clang-format off
#pragma mark - Enum
@@ -2869,13 +2837,11 @@
XCTAssertNotNil(array);
XCTAssertEqual(array.count, 0U);
XCTAssertThrowsSpecificNamed([array valueAtIndex:0], NSException, NSRangeException);
- [array enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
- #pragma unused(value, idx, stop)
+ [array enumerateValuesWithBlock:^(__unused int32_t value, __unused NSUInteger idx, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[array enumerateValuesWithOptions:NSEnumerationReverse
- usingBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
- #pragma unused(value, idx, stop)
+ usingBlock:^(__unused int32_t value, __unused NSUInteger idx, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[array release];
@@ -3198,9 +3164,10 @@
@end
-// clang-format on
//%PDDM-EXPAND-END (8 expansions)
+// clang-format on
+
#pragma mark - Non macro-based Enum tests
// These are hand written tests to cover the verification and raw methods.
@@ -3211,15 +3178,13 @@
@implementation GPBEnumArrayCustomTests
- (void)testRawBasics {
- static const int32_t kValues[] = { 71, 272, 73, 374 };
- static const int32_t kValuesFiltered[] = {
- 71, kGPBUnrecognizedEnumeratorValue, 73, kGPBUnrecognizedEnumeratorValue
- };
+ static const int32_t kValues[] = {71, 272, 73, 374};
+ static const int32_t kValuesFiltered[] = {71, kGPBUnrecognizedEnumeratorValue, 73,
+ kGPBUnrecognizedEnumeratorValue};
XCTAssertEqual(GPBARRAYSIZE(kValues), GPBARRAYSIZE(kValuesFiltered));
- GPBEnumArray *array =
- [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue
- rawValues:kValues
- count:GPBARRAYSIZE(kValues)];
+ GPBEnumArray *array = [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue
+ rawValues:kValues
+ count:GPBARRAYSIZE(kValues)];
XCTAssertNotNil(array);
XCTAssertEqual(array.count, 4U);
GPBEnumValidationFunc func = TestingEnum_IsValidValue;
@@ -3248,19 +3213,19 @@
idx2 = 0;
[array enumerateRawValuesWithOptions:NSEnumerationReverse
usingBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
- XCTAssertEqual(idx, (3 - idx2));
- XCTAssertEqual(value, kValues[idx]);
- XCTAssertNotEqual(stop, NULL);
- ++idx2;
- }];
+ XCTAssertEqual(idx, (3 - idx2));
+ XCTAssertEqual(value, kValues[idx]);
+ XCTAssertNotEqual(stop, NULL);
+ ++idx2;
+ }];
idx2 = 0;
[array enumerateValuesWithOptions:NSEnumerationReverse
usingBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
- XCTAssertEqual(idx, (3 - idx2));
- XCTAssertEqual(value, kValuesFiltered[idx]);
- XCTAssertNotEqual(stop, NULL);
- ++idx2;
- }];
+ XCTAssertEqual(idx, (3 - idx2));
+ XCTAssertEqual(value, kValuesFiltered[idx]);
+ XCTAssertNotEqual(stop, NULL);
+ ++idx2;
+ }];
// Stopping the enumeration.
idx2 = 0;
[array enumerateRawValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
@@ -3275,38 +3240,35 @@
idx2 = 0;
[array enumerateRawValuesWithOptions:NSEnumerationReverse
usingBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
- XCTAssertEqual(idx, (3 - idx2));
- XCTAssertEqual(value, kValues[idx]);
- XCTAssertNotEqual(stop, NULL);
- if (idx2 == 1) *stop = YES;
- XCTAssertNotEqual(idx, 1U);
- XCTAssertNotEqual(idx, 0U);
- ++idx2;
- }];
+ XCTAssertEqual(idx, (3 - idx2));
+ XCTAssertEqual(value, kValues[idx]);
+ XCTAssertNotEqual(stop, NULL);
+ if (idx2 == 1) *stop = YES;
+ XCTAssertNotEqual(idx, 1U);
+ XCTAssertNotEqual(idx, 0U);
+ ++idx2;
+ }];
[array release];
}
- (void)testEquality {
- const int32_t kValues1[] = { 71, 72, 173 }; // With unknown value
- const int32_t kValues2[] = { 71, 74, 173 }; // With unknown value
- const int32_t kValues3[] = { 71, 72, 173, 74 }; // With unknown value
- GPBEnumArray *array1 =
- [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue
- rawValues:kValues1
- count:GPBARRAYSIZE(kValues1)];
+ const int32_t kValues1[] = {71, 72, 173}; // With unknown value
+ const int32_t kValues2[] = {71, 74, 173}; // With unknown value
+ const int32_t kValues3[] = {71, 72, 173, 74}; // With unknown value
+ GPBEnumArray *array1 = [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue
+ rawValues:kValues1
+ count:GPBARRAYSIZE(kValues1)];
XCTAssertNotNil(array1);
GPBEnumArray *array1prime =
[[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue2
rawValues:kValues1
count:GPBARRAYSIZE(kValues1)];
XCTAssertNotNil(array1prime);
- GPBEnumArray *array2 =
- [[GPBEnumArray alloc] initWithValues:kValues2
- count:GPBARRAYSIZE(kValues2)];
+ GPBEnumArray *array2 = [[GPBEnumArray alloc] initWithValues:kValues2
+ count:GPBARRAYSIZE(kValues2)];
XCTAssertNotNil(array2);
- GPBEnumArray *array3 =
- [[GPBEnumArray alloc] initWithValues:kValues3
- count:GPBARRAYSIZE(kValues3)];
+ GPBEnumArray *array3 = [[GPBEnumArray alloc] initWithValues:kValues3
+ count:GPBARRAYSIZE(kValues3)];
XCTAssertNotNil(array3);
// 1/1Prime should be different objects, but equal.
@@ -3329,13 +3291,11 @@
}
- (void)testCopy {
- const int32_t kValues[] = { 71, 72 };
- GPBEnumArray *array =
- [[GPBEnumArray alloc] initWithValues:kValues
- count:GPBARRAYSIZE(kValues)];
+ const int32_t kValues[] = {71, 72};
+ GPBEnumArray *array = [[GPBEnumArray alloc] initWithValues:kValues count:GPBARRAYSIZE(kValues)];
XCTAssertNotNil(array);
- [array addRawValue:1000]; // Unknown
+ [array addRawValue:1000]; // Unknown
XCTAssertEqual(array.count, 3U);
XCTAssertEqual([array rawValueAtIndex:0], 71);
XCTAssertEqual([array rawValueAtIndex:1], 72);
@@ -3360,11 +3320,10 @@
}
- (void)testArrayFromArray {
- const int32_t kValues[] = { 71, 172, 173, 74 }; // Unknowns
- GPBEnumArray *array =
- [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue
- rawValues:kValues
- count:GPBARRAYSIZE(kValues)];
+ const int32_t kValues[] = {71, 172, 173, 74}; // Unknowns
+ GPBEnumArray *array = [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue
+ rawValues:kValues
+ count:GPBARRAYSIZE(kValues)];
XCTAssertNotNil(array);
GPBEnumArray *array2 = [GPBEnumArray arrayWithValueArray:array];
@@ -3378,38 +3337,34 @@
}
- (void)testUnknownAdds {
- GPBEnumArray *array =
- [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue];
+ GPBEnumArray *array = [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue];
XCTAssertNotNil(array);
- XCTAssertThrowsSpecificNamed([array addValue:172],
- NSException, NSInvalidArgumentException);
+ XCTAssertThrowsSpecificNamed([array addValue:172], NSException, NSInvalidArgumentException);
XCTAssertEqual(array.count, 0U);
- const int32_t kValues1[] = { 172, 173 }; // Unknown
- XCTAssertThrowsSpecificNamed([array addValues:kValues1 count:GPBARRAYSIZE(kValues1)],
- NSException, NSInvalidArgumentException);
+ const int32_t kValues1[] = {172, 173}; // Unknown
+ XCTAssertThrowsSpecificNamed([array addValues:kValues1 count:GPBARRAYSIZE(kValues1)], NSException,
+ NSInvalidArgumentException);
XCTAssertEqual(array.count, 0U);
[array release];
}
- (void)testRawAdds {
- GPBEnumArray *array =
- [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue];
+ GPBEnumArray *array = [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue];
XCTAssertNotNil(array);
XCTAssertEqual(array.count, 0U);
[array addRawValue:71]; // Valid
XCTAssertEqual(array.count, 1U);
- const int32_t kValues1[] = { 172, 173 }; // Unknown
+ const int32_t kValues1[] = {172, 173}; // Unknown
[array addRawValues:kValues1 count:GPBARRAYSIZE(kValues1)];
XCTAssertEqual(array.count, 3U);
- const int32_t kValues2[] = { 74, 71 };
- GPBEnumArray *array2 =
- [[GPBEnumArray alloc] initWithValues:kValues2
- count:GPBARRAYSIZE(kValues2)];
+ const int32_t kValues2[] = {74, 71};
+ GPBEnumArray *array2 = [[GPBEnumArray alloc] initWithValues:kValues2
+ count:GPBARRAYSIZE(kValues2)];
XCTAssertNotNil(array2);
[array addRawValuesFromArray:array2];
XCTAssertEqual(array.count, 5U);
@@ -3425,37 +3380,35 @@
}
- (void)testUnknownInserts {
- const int32_t kValues[] = { 71, 72, 73 };
- GPBEnumArray *array =
- [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue
- rawValues:kValues
- count:GPBARRAYSIZE(kValues)];
+ const int32_t kValues[] = {71, 72, 73};
+ GPBEnumArray *array = [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue
+ rawValues:kValues
+ count:GPBARRAYSIZE(kValues)];
XCTAssertNotNil(array);
XCTAssertEqual(array.count, 3U);
// First
- XCTAssertThrowsSpecificNamed([array insertValue:174 atIndex:0],
- NSException, NSInvalidArgumentException);
+ XCTAssertThrowsSpecificNamed([array insertValue:174 atIndex:0], NSException,
+ NSInvalidArgumentException);
XCTAssertEqual(array.count, 3U);
// Middle
- XCTAssertThrowsSpecificNamed([array insertValue:274 atIndex:1],
- NSException, NSInvalidArgumentException);
+ XCTAssertThrowsSpecificNamed([array insertValue:274 atIndex:1], NSException,
+ NSInvalidArgumentException);
XCTAssertEqual(array.count, 3U);
// End
- XCTAssertThrowsSpecificNamed([array insertValue:374 atIndex:3],
- NSException, NSInvalidArgumentException);
+ XCTAssertThrowsSpecificNamed([array insertValue:374 atIndex:3], NSException,
+ NSInvalidArgumentException);
XCTAssertEqual(array.count, 3U);
[array release];
}
- (void)testRawInsert {
- const int32_t kValues[] = { 71, 72, 73 };
- GPBEnumArray *array =
- [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue
- rawValues:kValues
- count:GPBARRAYSIZE(kValues)];
+ const int32_t kValues[] = {71, 72, 73};
+ GPBEnumArray *array = [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue
+ rawValues:kValues
+ count:GPBARRAYSIZE(kValues)];
XCTAssertNotNil(array);
XCTAssertEqual(array.count, 3U);
@@ -3472,8 +3425,7 @@
XCTAssertEqual(array.count, 6U);
// Too far.
- XCTAssertThrowsSpecificNamed([array insertRawValue:74 atIndex:7],
- NSException, NSRangeException);
+ XCTAssertThrowsSpecificNamed([array insertRawValue:74 atIndex:7], NSException, NSRangeException);
XCTAssertEqual([array rawValueAtIndex:0], 174);
XCTAssertEqual([array valueAtIndex:0], kGPBUnrecognizedEnumeratorValue);
@@ -3488,17 +3440,16 @@
}
- (void)testUnknownInplaceMutation {
- const int32_t kValues[] = { 71, 72, 73, 74 };
- GPBEnumArray *array =
- [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue
- rawValues:kValues
- count:GPBARRAYSIZE(kValues)];
+ const int32_t kValues[] = {71, 72, 73, 74};
+ GPBEnumArray *array = [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue
+ rawValues:kValues
+ count:GPBARRAYSIZE(kValues)];
XCTAssertNotNil(array);
- XCTAssertThrowsSpecificNamed([array replaceValueAtIndex:1 withValue:172],
- NSException, NSInvalidArgumentException);
- XCTAssertThrowsSpecificNamed([array replaceValueAtIndex:3 withValue:274],
- NSException, NSInvalidArgumentException);
+ XCTAssertThrowsSpecificNamed([array replaceValueAtIndex:1 withValue:172], NSException,
+ NSInvalidArgumentException);
+ XCTAssertThrowsSpecificNamed([array replaceValueAtIndex:3 withValue:274], NSException,
+ NSInvalidArgumentException);
XCTAssertEqual(array.count, 4U);
XCTAssertEqual([array valueAtIndex:0], 71);
XCTAssertEqual([array valueAtIndex:1], 72);
@@ -3507,13 +3458,11 @@
[array release];
}
-
- (void)testRawInplaceMutation {
- const int32_t kValues[] = { 71, 72, 73, 74 };
- GPBEnumArray *array =
- [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue
- rawValues:kValues
- count:GPBARRAYSIZE(kValues)];
+ const int32_t kValues[] = {71, 72, 73, 74};
+ GPBEnumArray *array = [[GPBEnumArray alloc] initWithValidationFunction:TestingEnum_IsValidValue
+ rawValues:kValues
+ count:GPBARRAYSIZE(kValues)];
XCTAssertNotNil(array);
[array replaceValueAtIndex:1 withRawValue:172]; // Unknown
@@ -3526,16 +3475,14 @@
XCTAssertEqual([array rawValueAtIndex:3], 274);
XCTAssertEqual([array valueAtIndex:3], kGPBUnrecognizedEnumeratorValue);
- XCTAssertThrowsSpecificNamed([array replaceValueAtIndex:4 withRawValue:74],
- NSException, NSRangeException);
+ XCTAssertThrowsSpecificNamed([array replaceValueAtIndex:4 withRawValue:74], NSException,
+ NSRangeException);
[array release];
}
- (void)testRawInternalResizing {
- const int32_t kValues[] = { 71, 172, 173, 74 }; // Unknown
- GPBEnumArray *array =
- [[GPBEnumArray alloc] initWithValues:kValues
- count:GPBARRAYSIZE(kValues)];
+ const int32_t kValues[] = {71, 172, 173, 74}; // Unknown
+ GPBEnumArray *array = [[GPBEnumArray alloc] initWithValues:kValues count:GPBARRAYSIZE(kValues)];
XCTAssertNotNil(array);
// Add/remove to trigger the intneral buffer to grow/shrink.
@@ -3611,13 +3558,13 @@
GPBAutocreatedArray *array = [[GPBAutocreatedArray alloc] init];
NSArray *cpy = [array copy];
- XCTAssertTrue(cpy != array); // Ptr compare
+ XCTAssertTrue(cpy != array); // Ptr compare
XCTAssertTrue([cpy isKindOfClass:[NSArray class]]);
XCTAssertFalse([cpy isKindOfClass:[GPBAutocreatedArray class]]);
XCTAssertEqual(cpy.count, (NSUInteger)0);
NSArray *cpy2 = [array copy];
- XCTAssertTrue(cpy2 != array); // Ptr compare
+ XCTAssertTrue(cpy2 != array); // Ptr compare
// Can't compare cpy and cpy2 because NSArray has a singleton empty
// array it uses, so the ptrs are the same.
XCTAssertTrue([cpy2 isKindOfClass:[NSArray class]]);
@@ -3633,14 +3580,14 @@
GPBAutocreatedArray *array = [[GPBAutocreatedArray alloc] init];
NSMutableArray *cpy = [array mutableCopy];
- XCTAssertTrue(cpy != array); // Ptr compare
+ XCTAssertTrue(cpy != array); // Ptr compare
XCTAssertTrue([cpy isKindOfClass:[NSMutableArray class]]);
XCTAssertFalse([cpy isKindOfClass:[GPBAutocreatedArray class]]);
XCTAssertEqual(cpy.count, (NSUInteger)0);
NSMutableArray *cpy2 = [array mutableCopy];
- XCTAssertTrue(cpy2 != array); // Ptr compare
- XCTAssertTrue(cpy2 != cpy); // Ptr compare
+ XCTAssertTrue(cpy2 != array); // Ptr compare
+ XCTAssertTrue(cpy2 != cpy); // Ptr compare
XCTAssertTrue([cpy2 isKindOfClass:[NSMutableArray class]]);
XCTAssertFalse([cpy2 isKindOfClass:[GPBAutocreatedArray class]]);
XCTAssertEqual(cpy2.count, (NSUInteger)0);
@@ -3656,7 +3603,7 @@
[array addObject:@"bar"];
NSArray *cpy = [array copy];
- XCTAssertTrue(cpy != array); // Ptr compare
+ XCTAssertTrue(cpy != array); // Ptr compare
XCTAssertTrue([cpy isKindOfClass:[NSArray class]]);
XCTAssertFalse([cpy isKindOfClass:[GPBAutocreatedArray class]]);
XCTAssertEqual(cpy.count, (NSUInteger)2);
@@ -3664,8 +3611,8 @@
XCTAssertEqualObjects(cpy[1], @"bar");
NSArray *cpy2 = [array copy];
- XCTAssertTrue(cpy2 != array); // Ptr compare
- XCTAssertTrue(cpy2 != cpy); // Ptr compare
+ XCTAssertTrue(cpy2 != array); // Ptr compare
+ XCTAssertTrue(cpy2 != cpy); // Ptr compare
XCTAssertTrue([cpy2 isKindOfClass:[NSArray class]]);
XCTAssertFalse([cpy2 isKindOfClass:[GPBAutocreatedArray class]]);
XCTAssertEqual(cpy2.count, (NSUInteger)2);
@@ -3683,7 +3630,7 @@
[array addObject:@"bar"];
NSMutableArray *cpy = [array mutableCopy];
- XCTAssertTrue(cpy != array); // Ptr compare
+ XCTAssertTrue(cpy != array); // Ptr compare
XCTAssertTrue([cpy isKindOfClass:[NSArray class]]);
XCTAssertFalse([cpy isKindOfClass:[GPBAutocreatedArray class]]);
XCTAssertEqual(cpy.count, (NSUInteger)2);
@@ -3691,8 +3638,8 @@
XCTAssertEqualObjects(cpy[1], @"bar");
NSMutableArray *cpy2 = [array mutableCopy];
- XCTAssertTrue(cpy2 != array); // Ptr compare
- XCTAssertTrue(cpy2 != cpy); // Ptr compare
+ XCTAssertTrue(cpy2 != array); // Ptr compare
+ XCTAssertTrue(cpy2 != cpy); // Ptr compare
XCTAssertTrue([cpy2 isKindOfClass:[NSArray class]]);
XCTAssertFalse([cpy2 isKindOfClass:[GPBAutocreatedArray class]]);
XCTAssertEqual(cpy2.count, (NSUInteger)2);
diff --git a/objectivec/Tests/GPBCodedInputStreamTests.m b/objectivec/Tests/GPBCodedInputStreamTests.m
index 6cd5a1f..0504062 100644
--- a/objectivec/Tests/GPBCodedInputStreamTests.m
+++ b/objectivec/Tests/GPBCodedInputStreamTests.m
@@ -34,7 +34,7 @@
#import "GPBCodedOutputStream.h"
#import "GPBUnknownFieldSet_PackagePrivate.h"
#import "GPBUtilities_PackagePrivate.h"
-#import "google/protobuf/Unittest.pbobjc.h"
+#import "objectivec/Tests/Unittest.pbobjc.h"
@interface CodedInputStreamTests : GPBTestCase
@end
@@ -82,8 +82,10 @@
[self assertReadZigZag64:bytes(0xFE, 0xFF, 0xFF, 0xFF, 0x0F) value:(int32_t)0x7FFFFFFF];
[self assertReadZigZag64:bytes(0xFF, 0xFF, 0xFF, 0xFF, 0x0F) value:(int32_t)0x80000000];
- [self assertReadZigZag64:bytes(0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01) value:0x7FFFFFFFFFFFFFFFL];
- [self assertReadZigZag64:bytes(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01) value:0x8000000000000000L];
+ [self assertReadZigZag64:bytes(0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01)
+ value:0x7FFFFFFFFFFFFFFFL];
+ [self assertReadZigZag64:bytes(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01)
+ value:0x8000000000000000L];
}
- (void)assertReadVarint:(NSData*)data value:(int64_t)value {
@@ -201,30 +203,25 @@
value:(0x22 << 0) | (0x22 << 7) | (0x22 << 14) | (0x74 << 21)];
// 2961488830
[self assertReadVarint:bytes(0xbe, 0xf7, 0x92, 0x84, 0x0b)
- value:(0x3e << 0) | (0x77 << 7) | (0x12 << 14) |
- (0x04 << 21) | (0x0bLL << 28)];
+ value:(0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) | (0x0bLL << 28)];
// 64-bit
// 7256456126
[self assertReadVarint:bytes(0xbe, 0xf7, 0x92, 0x84, 0x1b)
- value:(0x3e << 0) | (0x77 << 7) | (0x12 << 14) |
- (0x04 << 21) | (0x1bLL << 28)];
+ value:(0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) | (0x1bLL << 28)];
// 41256202580718336
[self assertReadVarint:bytes(0x80, 0xe6, 0xeb, 0x9c, 0xc3, 0xc9, 0xa4, 0x49)
- value:(0x00 << 0) | (0x66 << 7) | (0x6b << 14) |
- (0x1c << 21) | (0x43LL << 28) | (0x49LL << 35) |
- (0x24LL << 42) | (0x49LL << 49)];
+ value:(0x00 << 0) | (0x66 << 7) | (0x6b << 14) | (0x1c << 21) | (0x43LL << 28) |
+ (0x49LL << 35) | (0x24LL << 42) | (0x49LL << 49)];
// 11964378330978735131
- [self
- assertReadVarint:bytes(0x9b, 0xa8, 0xf9, 0xc2, 0xbb, 0xd6, 0x80, 0x85,
- 0xa6, 0x01)
- value:(0x1b << 0) | (0x28 << 7) | (0x79 << 14) | (0x42 << 21) |
- (0x3bLL << 28) | (0x56LL << 35) | (0x00LL << 42) |
- (0x05LL << 49) | (0x26LL << 56) | (0x01ULL << 63)];
+ [self assertReadVarint:bytes(0x9b, 0xa8, 0xf9, 0xc2, 0xbb, 0xd6, 0x80, 0x85, 0xa6, 0x01)
+ value:(0x1b << 0) | (0x28 << 7) | (0x79 << 14) | (0x42 << 21) | (0x3bLL << 28) |
+ (0x56LL << 35) | (0x00LL << 42) | (0x05LL << 49) | (0x26LL << 56) |
+ (0x01ULL << 63)];
// Failures
- [self assertReadVarintFailure:bytes(0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
- 0x80, 0x80, 0x80, 0x00)];
+ [self assertReadVarintFailure:bytes(0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+ 0x00)];
[self assertReadVarintFailure:bytes(0x80)];
}
@@ -268,16 +265,12 @@
}
- (void)testReadLittleEndian {
- [self assertReadLittleEndian32:bytes(0x78, 0x56, 0x34, 0x12)
- value:0x12345678];
- [self assertReadLittleEndian32:bytes(0xf0, 0xde, 0xbc, 0x9a)
- value:0x9abcdef0];
+ [self assertReadLittleEndian32:bytes(0x78, 0x56, 0x34, 0x12) value:0x12345678];
+ [self assertReadLittleEndian32:bytes(0xf0, 0xde, 0xbc, 0x9a) value:0x9abcdef0];
- [self assertReadLittleEndian64:bytes(0xf0, 0xde, 0xbc, 0x9a, 0x78, 0x56, 0x34,
- 0x12)
+ [self assertReadLittleEndian64:bytes(0xf0, 0xde, 0xbc, 0x9a, 0x78, 0x56, 0x34, 0x12)
value:0x123456789abcdef0LL];
- [self assertReadLittleEndian64:bytes(0x78, 0x56, 0x34, 0x12, 0xf0, 0xde, 0xbc,
- 0x9a)
+ [self assertReadLittleEndian64:bytes(0x78, 0x56, 0x34, 0x12, 0xf0, 0xde, 0xbc, 0x9a)
value:0x9abcdef012345678LL];
}
@@ -287,8 +280,7 @@
NSData* rawBytes = message.data;
XCTAssertEqual(message.serializedSize, (size_t)rawBytes.length);
- TestAllTypes* message2 =
- [TestAllTypes parseFromData:rawBytes extensionRegistry:nil error:NULL];
+ TestAllTypes* message2 = [TestAllTypes parseFromData:rawBytes extensionRegistry:nil error:NULL];
[self assertAllFieldsSet:message2 repeatedCount:kGPBDefaultRepeatCount];
}
@@ -300,8 +292,7 @@
// skipField() to skip each field on the other. Expect the same tags.
GPBCodedInputStream* input1 = [GPBCodedInputStream streamWithData:rawBytes];
GPBCodedInputStream* input2 = [GPBCodedInputStream streamWithData:rawBytes];
- GPBUnknownFieldSet* unknownFields =
- [[[GPBUnknownFieldSet alloc] init] autorelease];
+ GPBUnknownFieldSet* unknownFields = [[[GPBUnknownFieldSet alloc] init] autorelease];
while (YES) {
int32_t tag = [input1 readTag];
@@ -329,10 +320,9 @@
// Serialize and parse it. Make sure to parse from an InputStream, not
// directly from a ByteString, so that CodedInputStream uses buffered
// reading.
- NSData *messageData = message.data;
+ NSData* messageData = message.data;
XCTAssertNotNil(messageData);
- GPBCodedInputStream* stream =
- [GPBCodedInputStream streamWithData:messageData];
+ GPBCodedInputStream* stream = [GPBCodedInputStream streamWithData:messageData];
TestAllTypes* message2 = [TestAllTypes parseFromCodedInputStream:stream
extensionRegistry:nil
error:NULL];
@@ -350,8 +340,7 @@
- (void)testReadMaliciouslyLargeBlob {
NSOutputStream* rawOutput = [NSOutputStream outputStreamToMemory];
- GPBCodedOutputStream* output =
- [GPBCodedOutputStream streamWithOutputStream:rawOutput];
+ GPBCodedOutputStream* output = [GPBCodedOutputStream streamWithOutputStream:rawOutput];
int32_t tag = GPBWireFormatMakeTag(1, GPBWireFormatLengthDelimited);
[output writeRawVarint32:tag];
@@ -360,8 +349,7 @@
[output writeRawData:[NSData dataWithBytes:bytes length:32]];
[output flush];
- NSData* data =
- [rawOutput propertyForKey:NSStreamDataWrittenToMemoryStreamKey];
+ NSData* data = [rawOutput propertyForKey:NSStreamDataWrittenToMemoryStreamKey];
GPBCodedInputStream* input =
[GPBCodedInputStream streamWithData:[NSMutableData dataWithData:data]];
XCTAssertEqual(tag, [input readTag]);
@@ -370,23 +358,21 @@
}
- (void)testReadEmptyString {
- NSData *data = bytes(0x00);
+ NSData* data = bytes(0x00);
GPBCodedInputStream* input = [GPBCodedInputStream streamWithData:data];
XCTAssertEqualObjects(@"", [input readString]);
}
- (void)testInvalidGroupEndTagThrows {
- NSData *data = bytes(0x0B, 0x1A, 0x02, 0x4B, 0x50, 0x14);
+ NSData* data = bytes(0x0B, 0x1A, 0x02, 0x4B, 0x50, 0x14);
GPBCodedInputStream* input = [GPBCodedInputStream streamWithData:data];
- XCTAssertThrowsSpecificNamed([input skipMessage],
- NSException,
- GPBCodedInputStreamException,
+ XCTAssertThrowsSpecificNamed([input skipMessage], NSException, GPBCodedInputStreamException,
@"should throw a GPBCodedInputStreamException exception ");
}
- (void)testBytesWithNegativeSize {
- NSData *data = bytes(0xFF, 0xFF, 0xFF, 0xFF, 0x0F);
- GPBCodedInputStream *input = [GPBCodedInputStream streamWithData:data];
+ NSData* data = bytes(0xFF, 0xFF, 0xFF, 0xFF, 0x0F);
+ GPBCodedInputStream* input = [GPBCodedInputStream streamWithData:data];
XCTAssertNil([input readBytes]);
}
@@ -396,11 +382,10 @@
// again, it will help validate that class' handing of bad utf8.
- (void)testReadMalformedString {
NSOutputStream* rawOutput = [NSOutputStream outputStreamToMemory];
- GPBCodedOutputStream* output =
- [GPBCodedOutputStream streamWithOutputStream:rawOutput];
+ GPBCodedOutputStream* output = [GPBCodedOutputStream streamWithOutputStream:rawOutput];
- int32_t tag = GPBWireFormatMakeTag(TestAllTypes_FieldNumber_DefaultString,
- GPBWireFormatLengthDelimited);
+ int32_t tag =
+ GPBWireFormatMakeTag(TestAllTypes_FieldNumber_DefaultString, GPBWireFormatLengthDelimited);
[output writeRawVarint32:tag];
[output writeRawVarint32:5];
// Create an invalid utf-8 byte array.
@@ -408,10 +393,9 @@
[output writeRawData:[NSData dataWithBytes:bytes length:sizeof(bytes)]];
[output flush];
- NSData *data =
- [rawOutput propertyForKey:NSStreamDataWrittenToMemoryStreamKey];
+ NSData* data = [rawOutput propertyForKey:NSStreamDataWrittenToMemoryStreamKey];
GPBCodedInputStream* input = [GPBCodedInputStream streamWithData:data];
- NSError *error = nil;
+ NSError* error = nil;
TestAllTypes* message = [TestAllTypes parseFromCodedInputStream:input
extensionRegistry:nil
error:&error];
@@ -425,27 +409,25 @@
// correctly. (Again, this is inpart in case a custom string class is ever
// used again.)
const char* strs[] = {
- "\xEF\xBB\xBF String with BOM",
- "String with \xEF\xBB\xBF in middle",
- "String with end bom \xEF\xBB\xBF",
- "\xEF\xBB\xBF\xe2\x99\xa1", // BOM White Heart
- "\xEF\xBB\xBF\xEF\xBB\xBF String with Two BOM",
+ "\xEF\xBB\xBF String with BOM",
+ "String with \xEF\xBB\xBF in middle",
+ "String with end bom \xEF\xBB\xBF",
+ "\xEF\xBB\xBF\xe2\x99\xa1", // BOM White Heart
+ "\xEF\xBB\xBF\xEF\xBB\xBF String with Two BOM",
};
for (size_t i = 0; i < GPBARRAYSIZE(strs); ++i) {
NSOutputStream* rawOutput = [NSOutputStream outputStreamToMemory];
- GPBCodedOutputStream* output =
- [GPBCodedOutputStream streamWithOutputStream:rawOutput];
+ GPBCodedOutputStream* output = [GPBCodedOutputStream streamWithOutputStream:rawOutput];
- int32_t tag = GPBWireFormatMakeTag(TestAllTypes_FieldNumber_DefaultString,
- GPBWireFormatLengthDelimited);
+ int32_t tag =
+ GPBWireFormatMakeTag(TestAllTypes_FieldNumber_DefaultString, GPBWireFormatLengthDelimited);
[output writeRawVarint32:tag];
size_t length = strlen(strs[i]);
[output writeRawVarint32:(int32_t)length];
[output writeRawData:[NSData dataWithBytes:strs[i] length:length]];
[output flush];
- NSData* data =
- [rawOutput propertyForKey:NSStreamDataWrittenToMemoryStreamKey];
+ NSData* data = [rawOutput propertyForKey:NSStreamDataWrittenToMemoryStreamKey];
GPBCodedInputStream* input = [GPBCodedInputStream streamWithData:data];
TestAllTypes* message = [TestAllTypes parseFromCodedInputStream:input
extensionRegistry:nil
diff --git a/objectivec/Tests/GPBCodedOuputStreamTests.m b/objectivec/Tests/GPBCodedOutputStreamTests.m
similarity index 70%
rename from objectivec/Tests/GPBCodedOuputStreamTests.m
rename to objectivec/Tests/GPBCodedOutputStreamTests.m
index a9934ac..a619cae 100644
--- a/objectivec/Tests/GPBCodedOuputStreamTests.m
+++ b/objectivec/Tests/GPBCodedOutputStreamTests.m
@@ -30,26 +30,23 @@
#import "GPBTestUtilities.h"
-#import "GPBCodedOutputStream_PackagePrivate.h"
#import "GPBCodedInputStream.h"
+#import "GPBCodedOutputStream_PackagePrivate.h"
#import "GPBUtilities_PackagePrivate.h"
-#import "google/protobuf/Unittest.pbobjc.h"
+#import "objectivec/Tests/Unittest.pbobjc.h"
@interface GPBCodedOutputStream (InternalMethods)
// Declared in the .m file, expose for testing.
-- (instancetype)initWithOutputStream:(NSOutputStream *)output
- data:(NSMutableData *)data;
+- (instancetype)initWithOutputStream:(NSOutputStream*)output data:(NSMutableData*)data;
@end
@interface GPBCodedOutputStream (Helper)
-+ (instancetype)streamWithOutputStream:(NSOutputStream *)output
- bufferSize:(size_t)bufferSize;
++ (instancetype)streamWithOutputStream:(NSOutputStream*)output bufferSize:(size_t)bufferSize;
@end
@implementation GPBCodedOutputStream (Helper)
-+ (instancetype)streamWithOutputStream:(NSOutputStream *)output
- bufferSize:(size_t)bufferSize {
- NSMutableData *data = [NSMutableData dataWithLength:bufferSize];
++ (instancetype)streamWithOutputStream:(NSOutputStream*)output bufferSize:(size_t)bufferSize {
+ NSMutableData* data = [NSMutableData dataWithLength:bufferSize];
return [[[self alloc] initWithOutputStream:output data:data] autorelease];
}
@end
@@ -81,20 +78,17 @@
- (void)assertWriteLittleEndian32:(NSData*)data value:(int32_t)value {
NSOutputStream* rawOutput = [NSOutputStream outputStreamToMemory];
- GPBCodedOutputStream* output =
- [GPBCodedOutputStream streamWithOutputStream:rawOutput];
+ GPBCodedOutputStream* output = [GPBCodedOutputStream streamWithOutputStream:rawOutput];
[output writeRawLittleEndian32:(int32_t)value];
[output flush];
- NSData* actual =
- [rawOutput propertyForKey:NSStreamDataWrittenToMemoryStreamKey];
+ NSData* actual = [rawOutput propertyForKey:NSStreamDataWrittenToMemoryStreamKey];
XCTAssertEqualObjects(data, actual);
// Try different block sizes.
for (int blockSize = 1; blockSize <= 16; blockSize *= 2) {
rawOutput = [NSOutputStream outputStreamToMemory];
- output = [GPBCodedOutputStream streamWithOutputStream:rawOutput
- bufferSize:blockSize];
+ output = [GPBCodedOutputStream streamWithOutputStream:rawOutput bufferSize:blockSize];
[output writeRawLittleEndian32:(int32_t)value];
[output flush];
@@ -105,20 +99,17 @@
- (void)assertWriteLittleEndian64:(NSData*)data value:(int64_t)value {
NSOutputStream* rawOutput = [NSOutputStream outputStreamToMemory];
- GPBCodedOutputStream* output =
- [GPBCodedOutputStream streamWithOutputStream:rawOutput];
+ GPBCodedOutputStream* output = [GPBCodedOutputStream streamWithOutputStream:rawOutput];
[output writeRawLittleEndian64:value];
[output flush];
- NSData* actual =
- [rawOutput propertyForKey:NSStreamDataWrittenToMemoryStreamKey];
+ NSData* actual = [rawOutput propertyForKey:NSStreamDataWrittenToMemoryStreamKey];
XCTAssertEqualObjects(data, actual);
// Try different block sizes.
for (int blockSize = 1; blockSize <= 16; blockSize *= 2) {
rawOutput = [NSOutputStream outputStreamToMemory];
- output = [GPBCodedOutputStream streamWithOutputStream:rawOutput
- bufferSize:blockSize];
+ output = [GPBCodedOutputStream streamWithOutputStream:rawOutput bufferSize:blockSize];
[output writeRawLittleEndian64:value];
[output flush];
@@ -131,29 +122,24 @@
// Only do 32-bit write if the value fits in 32 bits.
if (GPBLogicalRightShift64(value, 32) == 0) {
NSOutputStream* rawOutput = [NSOutputStream outputStreamToMemory];
- GPBCodedOutputStream* output =
- [GPBCodedOutputStream streamWithOutputStream:rawOutput];
+ GPBCodedOutputStream* output = [GPBCodedOutputStream streamWithOutputStream:rawOutput];
[output writeRawVarint32:(int32_t)value];
[output flush];
- NSData* actual =
- [rawOutput propertyForKey:NSStreamDataWrittenToMemoryStreamKey];
+ NSData* actual = [rawOutput propertyForKey:NSStreamDataWrittenToMemoryStreamKey];
XCTAssertEqualObjects(data, actual);
// Also try computing size.
- XCTAssertEqual(GPBComputeRawVarint32Size((int32_t)value),
- (size_t)data.length);
+ XCTAssertEqual(GPBComputeRawVarint32Size((int32_t)value), (size_t)data.length);
}
{
NSOutputStream* rawOutput = [NSOutputStream outputStreamToMemory];
- GPBCodedOutputStream* output =
- [GPBCodedOutputStream streamWithOutputStream:rawOutput];
+ GPBCodedOutputStream* output = [GPBCodedOutputStream streamWithOutputStream:rawOutput];
[output writeRawVarint64:value];
[output flush];
- NSData* actual =
- [rawOutput propertyForKey:NSStreamDataWrittenToMemoryStreamKey];
+ NSData* actual = [rawOutput propertyForKey:NSStreamDataWrittenToMemoryStreamKey];
XCTAssertEqualObjects(data, actual);
// Also try computing size.
@@ -165,52 +151,45 @@
// Only do 32-bit write if the value fits in 32 bits.
if (GPBLogicalRightShift64(value, 32) == 0) {
NSOutputStream* rawOutput = [NSOutputStream outputStreamToMemory];
- GPBCodedOutputStream* output =
- [GPBCodedOutputStream streamWithOutputStream:rawOutput
- bufferSize:blockSize];
+ GPBCodedOutputStream* output = [GPBCodedOutputStream streamWithOutputStream:rawOutput
+ bufferSize:blockSize];
[output writeRawVarint32:(int32_t)value];
[output flush];
- NSData* actual =
- [rawOutput propertyForKey:NSStreamDataWrittenToMemoryStreamKey];
+ NSData* actual = [rawOutput propertyForKey:NSStreamDataWrittenToMemoryStreamKey];
XCTAssertEqualObjects(data, actual);
}
{
NSOutputStream* rawOutput = [NSOutputStream outputStreamToMemory];
- GPBCodedOutputStream* output =
- [GPBCodedOutputStream streamWithOutputStream:rawOutput
- bufferSize:blockSize];
+ GPBCodedOutputStream* output = [GPBCodedOutputStream streamWithOutputStream:rawOutput
+ bufferSize:blockSize];
[output writeRawVarint64:value];
[output flush];
- NSData* actual =
- [rawOutput propertyForKey:NSStreamDataWrittenToMemoryStreamKey];
+ NSData* actual = [rawOutput propertyForKey:NSStreamDataWrittenToMemoryStreamKey];
XCTAssertEqualObjects(data, actual);
}
}
}
- (void)assertWriteStringNoTag:(NSData*)data
- value:(NSString *)value
- context:(NSString *)contextMessage {
+ value:(NSString*)value
+ context:(NSString*)contextMessage {
NSOutputStream* rawOutput = [NSOutputStream outputStreamToMemory];
- GPBCodedOutputStream* output =
- [GPBCodedOutputStream streamWithOutputStream:rawOutput];
+ GPBCodedOutputStream* output = [GPBCodedOutputStream streamWithOutputStream:rawOutput];
[output writeStringNoTag:value];
[output flush];
- NSData* actual =
- [rawOutput propertyForKey:NSStreamDataWrittenToMemoryStreamKey];
+ NSData* actual = [rawOutput propertyForKey:NSStreamDataWrittenToMemoryStreamKey];
XCTAssertEqualObjects(data, actual, @"%@", contextMessage);
// Try different block sizes.
for (int blockSize = 1; blockSize <= 16; blockSize *= 2) {
rawOutput = [NSOutputStream outputStreamToMemory];
- output = [GPBCodedOutputStream streamWithOutputStream:rawOutput
- bufferSize:blockSize];
+ output = [GPBCodedOutputStream streamWithOutputStream:rawOutput bufferSize:blockSize];
[output writeStringNoTag:value];
[output flush];
@@ -243,51 +222,41 @@
// 1887747006 (no sign bit)
[self assertWriteVarint:bytes(0xbe, 0xf7, 0x92, 0x84, 0x07)
- value:(0x3e << 0) | (0x77 << 7) | (0x12 << 14) |
- (0x04 << 21) | (0x07LL << 28)];
+ value:(0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) | (0x07LL << 28)];
// 2961488830 (sign bit)
[self assertWriteVarint:bytes(0xbe, 0xf7, 0x92, 0x84, 0x0b)
- value:(0x3e << 0) | (0x77 << 7) | (0x12 << 14) |
- (0x04 << 21) | (0x0bLL << 28)];
+ value:(0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) | (0x0bLL << 28)];
}
- (void)testWriteVarint6 {
// 64-bit
// 7256456126
[self assertWriteVarint:bytes(0xbe, 0xf7, 0x92, 0x84, 0x1b)
- value:(0x3e << 0) | (0x77 << 7) | (0x12 << 14) |
- (0x04 << 21) | (0x1bLL << 28)];
+ value:(0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) | (0x1bLL << 28)];
}
- (void)testWriteVarint7 {
// 41256202580718336
[self assertWriteVarint:bytes(0x80, 0xe6, 0xeb, 0x9c, 0xc3, 0xc9, 0xa4, 0x49)
- value:(0x00 << 0) | (0x66 << 7) | (0x6b << 14) |
- (0x1c << 21) | (0x43LL << 28) | (0x49LL << 35) |
- (0x24LL << 42) | (0x49LL << 49)];
+ value:(0x00 << 0) | (0x66 << 7) | (0x6b << 14) | (0x1c << 21) | (0x43LL << 28) |
+ (0x49LL << 35) | (0x24LL << 42) | (0x49LL << 49)];
}
- (void)testWriteVarint8 {
// 11964378330978735131
- [self assertWriteVarint:bytes(0x9b, 0xa8, 0xf9, 0xc2, 0xbb, 0xd6, 0x80, 0x85,
- 0xa6, 0x01)
- value:(0x1b << 0) | (0x28 << 7) | (0x79 << 14) |
- (0x42 << 21) | (0x3bLL << 28) | (0x56LL << 35) |
- (0x00LL << 42) | (0x05LL << 49) | (0x26LL << 56) |
+ [self assertWriteVarint:bytes(0x9b, 0xa8, 0xf9, 0xc2, 0xbb, 0xd6, 0x80, 0x85, 0xa6, 0x01)
+ value:(0x1b << 0) | (0x28 << 7) | (0x79 << 14) | (0x42 << 21) | (0x3bLL << 28) |
+ (0x56LL << 35) | (0x00LL << 42) | (0x05LL << 49) | (0x26LL << 56) |
(0x01ULL << 63)];
}
- (void)testWriteLittleEndian {
- [self assertWriteLittleEndian32:bytes(0x78, 0x56, 0x34, 0x12)
- value:0x12345678];
- [self assertWriteLittleEndian32:bytes(0xf0, 0xde, 0xbc, 0x9a)
- value:0x9abcdef0];
+ [self assertWriteLittleEndian32:bytes(0x78, 0x56, 0x34, 0x12) value:0x12345678];
+ [self assertWriteLittleEndian32:bytes(0xf0, 0xde, 0xbc, 0x9a) value:0x9abcdef0];
- [self assertWriteLittleEndian64:bytes(0xf0, 0xde, 0xbc, 0x9a, 0x78, 0x56,
- 0x34, 0x12)
+ [self assertWriteLittleEndian64:bytes(0xf0, 0xde, 0xbc, 0x9a, 0x78, 0x56, 0x34, 0x12)
value:0x123456789abcdef0LL];
- [self assertWriteLittleEndian64:bytes(0x78, 0x56, 0x34, 0x12, 0xf0, 0xde,
- 0xbc, 0x9a)
+ [self assertWriteLittleEndian64:bytes(0x78, 0x56, 0x34, 0x12, 0xf0, 0xde, 0xbc, 0x9a)
value:0x9abcdef012345678LL];
}
@@ -305,18 +274,12 @@
XCTAssertEqual(1ULL, GPBEncodeZigZag64(-1));
XCTAssertEqual(2ULL, GPBEncodeZigZag64(1));
XCTAssertEqual(3ULL, GPBEncodeZigZag64(-2));
- XCTAssertEqual(0x000000007FFFFFFEULL,
- GPBEncodeZigZag64(0x000000003FFFFFFFLL));
- XCTAssertEqual(0x000000007FFFFFFFULL,
- GPBEncodeZigZag64(0xFFFFFFFFC0000000LL));
- XCTAssertEqual(0x00000000FFFFFFFEULL,
- GPBEncodeZigZag64(0x000000007FFFFFFFLL));
- XCTAssertEqual(0x00000000FFFFFFFFULL,
- GPBEncodeZigZag64(0xFFFFFFFF80000000LL));
- XCTAssertEqual(0xFFFFFFFFFFFFFFFEULL,
- GPBEncodeZigZag64(0x7FFFFFFFFFFFFFFFLL));
- XCTAssertEqual(0xFFFFFFFFFFFFFFFFULL,
- GPBEncodeZigZag64(0x8000000000000000LL));
+ XCTAssertEqual(0x000000007FFFFFFEULL, GPBEncodeZigZag64(0x000000003FFFFFFFLL));
+ XCTAssertEqual(0x000000007FFFFFFFULL, GPBEncodeZigZag64(0xFFFFFFFFC0000000LL));
+ XCTAssertEqual(0x00000000FFFFFFFEULL, GPBEncodeZigZag64(0x000000007FFFFFFFLL));
+ XCTAssertEqual(0x00000000FFFFFFFFULL, GPBEncodeZigZag64(0xFFFFFFFF80000000LL));
+ XCTAssertEqual(0xFFFFFFFFFFFFFFFEULL, GPBEncodeZigZag64(0x7FFFFFFFFFFFFFFFLL));
+ XCTAssertEqual(0xFFFFFFFFFFFFFFFFULL, GPBEncodeZigZag64(0x8000000000000000LL));
// Some easier-to-verify round-trip tests. The inputs (other than 0, 1, -1)
// were chosen semi-randomly via keyboard bashing.
@@ -332,10 +295,8 @@
XCTAssertEqual(14927ULL, GPBEncodeZigZag64(GPBDecodeZigZag64(14927)));
XCTAssertEqual(-3612ULL, GPBEncodeZigZag64(GPBDecodeZigZag64(-3612)));
- XCTAssertEqual(856912304801416ULL,
- GPBEncodeZigZag64(GPBDecodeZigZag64(856912304801416LL)));
- XCTAssertEqual(-75123905439571256ULL,
- GPBEncodeZigZag64(GPBDecodeZigZag64(-75123905439571256LL)));
+ XCTAssertEqual(856912304801416ULL, GPBEncodeZigZag64(GPBDecodeZigZag64(856912304801416LL)));
+ XCTAssertEqual(-75123905439571256ULL, GPBEncodeZigZag64(GPBDecodeZigZag64(-75123905439571256LL)));
}
- (void)testWriteWholeMessage {
@@ -344,21 +305,18 @@
TestAllTypes* message = [self allSetRepeatedCount:2];
NSData* rawBytes = message.data;
- NSData* goldenData =
- [self getDataFileNamed:@"golden_message" dataToWrite:rawBytes];
+ NSData* goldenData = [self getDataFileNamed:@"golden_message" dataToWrite:rawBytes];
XCTAssertEqualObjects(rawBytes, goldenData);
// Try different block sizes.
for (int blockSize = 1; blockSize < 256; blockSize *= 2) {
NSOutputStream* rawOutput = [NSOutputStream outputStreamToMemory];
- GPBCodedOutputStream* output =
- [GPBCodedOutputStream streamWithOutputStream:rawOutput
- bufferSize:blockSize];
+ GPBCodedOutputStream* output = [GPBCodedOutputStream streamWithOutputStream:rawOutput
+ bufferSize:blockSize];
[message writeToCodedOutputStream:output];
[output flush];
- NSData* actual =
- [rawOutput propertyForKey:NSStreamDataWrittenToMemoryStreamKey];
+ NSData* actual = [rawOutput propertyForKey:NSStreamDataWrittenToMemoryStreamKey];
XCTAssertEqualObjects(rawBytes, actual);
}
@@ -366,8 +324,7 @@
// that was generated with 2.
TestAllExtensions* extensions = [self allExtensionsSetRepeatedCount:2];
rawBytes = extensions.data;
- goldenData = [self getDataFileNamed:@"golden_packed_fields_message"
- dataToWrite:rawBytes];
+ goldenData = [self getDataFileNamed:@"golden_packed_fields_message" dataToWrite:rawBytes];
XCTAssertEqualObjects(rawBytes, goldenData);
}
@@ -380,11 +337,10 @@
char zeroTest[] = "\0Test\0String";
// Note: there is a \0 at the end of this since it is a c-string.
- NSString *asNSString = [[NSString alloc] initWithBytes:zeroTest
+ NSString* asNSString = [[NSString alloc] initWithBytes:zeroTest
length:sizeof(zeroTest)
encoding:NSUTF8StringEncoding];
- const char *cString =
- CFStringGetCStringPtr((CFStringRef)asNSString, kCFStringEncodingUTF8);
+ const char* cString = CFStringGetCStringPtr((CFStringRef)asNSString, kCFStringEncodingUTF8);
XCTAssertTrue(cString != NULL);
// Again, if the above assert fails, then it means NSString no longer exposes
// the raw utf8 storage of a string created from utf8 input, so the code using
@@ -392,8 +348,7 @@
// a different code path); but the optimizations for when
// CFStringGetCStringPtr does work could possibly go away.
- XCTAssertEqual(sizeof(zeroTest),
- [asNSString lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);
+ XCTAssertEqual(sizeof(zeroTest), [asNSString lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);
XCTAssertTrue(0 == memcmp(cString, zeroTest, sizeof(zeroTest)));
[asNSString release];
}
@@ -405,25 +360,25 @@
// strings built via the NSString apis. So this round trips them to ensure
// they are acting as expected.
- NSArray<NSString *> *strs = @[
+ NSArray<NSString*>* strs = @[
@"\0at start",
@"in\0middle",
@"at end\0",
];
int i = 0;
- for (NSString *str in strs) {
- NSData *asUTF8 = [str dataUsingEncoding:NSUTF8StringEncoding];
- NSMutableData *expected = [NSMutableData data];
+ for (NSString* str in strs) {
+ NSData* asUTF8 = [str dataUsingEncoding:NSUTF8StringEncoding];
+ NSMutableData* expected = [NSMutableData data];
uint8_t lengthByte = (uint8_t)asUTF8.length;
[expected appendBytes:&lengthByte length:1];
[expected appendData:asUTF8];
- NSString *context = [NSString stringWithFormat:@"Loop %d - Literal", i];
+ NSString* context = [NSString stringWithFormat:@"Loop %d - Literal", i];
[self assertWriteStringNoTag:expected value:str context:context];
// Force a new string to be built which gets a different class from the
// NSString class cluster than the literal did.
- NSString *str2 = [NSString stringWithFormat:@"%@", str];
+ NSString* str2 = [NSString stringWithFormat:@"%@", str];
context = [NSString stringWithFormat:@"Loop %d - Built", i];
[self assertWriteStringNoTag:expected value:str2 context:context];
@@ -432,11 +387,11 @@
}
- (void)testThatItThrowsWhenWriteRawPtrFails {
- NSOutputStream *output = [NSOutputStream outputStreamToMemory];
- GPBCodedOutputStream *codedOutput =
+ NSOutputStream* output = [NSOutputStream outputStreamToMemory];
+ GPBCodedOutputStream* codedOutput =
[GPBCodedOutputStream streamWithOutputStream:output bufferSize:0]; // Skip buffering.
[output close]; // Close the output stream to force failure on write.
- const char *cString = "raw";
+ const char* cString = "raw";
XCTAssertThrowsSpecificNamed([codedOutput writeRawPtr:cString offset:0 length:strlen(cString)],
NSException, GPBCodedOutputStreamException_WriteFailed);
}
diff --git a/objectivec/Tests/GPBCompileTest01.m b/objectivec/Tests/GPBCompileTest01.m
index c8bc433..c8a6e6b 100644
--- a/objectivec/Tests/GPBCompileTest01.m
+++ b/objectivec/Tests/GPBCompileTest01.m
@@ -28,13 +28,11 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
// This is a test including a single public header to ensure things build.
// It helps test that imports are complete/ordered correctly.
#import "GPBArray.h"
-
// Something in the body of this file so the compiler/linker won't complain
// about an empty .o file.
__attribute__((visibility("default"))) char dummy_symbol_1 = 0;
diff --git a/objectivec/Tests/GPBCompileTest02.m b/objectivec/Tests/GPBCompileTest02.m
index c44e201..77e4589 100644
--- a/objectivec/Tests/GPBCompileTest02.m
+++ b/objectivec/Tests/GPBCompileTest02.m
@@ -28,13 +28,11 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
// This is a test including a single public header to ensure things build.
// It helps test that imports are complete/ordered correctly.
#import "GPBCodedInputStream.h"
-
// Something in the body of this file so the compiler/linker won't complain
// about an empty .o file.
__attribute__((visibility("default"))) char dummy_symbol_2 = 0;
diff --git a/objectivec/Tests/GPBCompileTest03.m b/objectivec/Tests/GPBCompileTest03.m
index 41994f9..f4945a7 100644
--- a/objectivec/Tests/GPBCompileTest03.m
+++ b/objectivec/Tests/GPBCompileTest03.m
@@ -28,13 +28,11 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
// This is a test including a single public header to ensure things build.
// It helps test that imports are complete/ordered correctly.
#import "GPBCodedOutputStream.h"
-
// Something in the body of this file so the compiler/linker won't complain
// about an empty .o file.
__attribute__((visibility("default"))) char dummy_symbol_3 = 0;
diff --git a/objectivec/Tests/GPBCompileTest04.m b/objectivec/Tests/GPBCompileTest04.m
index c31498f..da69c1d 100644
--- a/objectivec/Tests/GPBCompileTest04.m
+++ b/objectivec/Tests/GPBCompileTest04.m
@@ -28,13 +28,11 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
// This is a test including a single public header to ensure things build.
// It helps test that imports are complete/ordered correctly.
#import "GPBDescriptor.h"
-
// Something in the body of this file so the compiler/linker won't complain
// about an empty .o file.
__attribute__((visibility("default"))) char dummy_symbol_4 = 0;
diff --git a/objectivec/Tests/GPBCompileTest05.m b/objectivec/Tests/GPBCompileTest05.m
index adb7225..e4665ea 100644
--- a/objectivec/Tests/GPBCompileTest05.m
+++ b/objectivec/Tests/GPBCompileTest05.m
@@ -28,13 +28,11 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
// This is a test including a single public header to ensure things build.
// It helps test that imports are complete/ordered correctly.
#import "GPBDictionary.h"
-
// Something in the body of this file so the compiler/linker won't complain
// about an empty .o file.
__attribute__((visibility("default"))) char dummy_symbol_5 = 0;
diff --git a/objectivec/Tests/GPBCompileTest06.m b/objectivec/Tests/GPBCompileTest06.m
index b7505b0..c197b56 100644
--- a/objectivec/Tests/GPBCompileTest06.m
+++ b/objectivec/Tests/GPBCompileTest06.m
@@ -28,13 +28,11 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
// This is a test including a single public header to ensure things build.
// It helps test that imports are complete/ordered correctly.
#import "GPBExtensionRegistry.h"
-
// Something in the body of this file so the compiler/linker won't complain
// about an empty .o file.
__attribute__((visibility("default"))) char dummy_symbol_6 = 0;
diff --git a/objectivec/Tests/GPBCompileTest07.m b/objectivec/Tests/GPBCompileTest07.m
index 939bb70..83f7a8f 100644
--- a/objectivec/Tests/GPBCompileTest07.m
+++ b/objectivec/Tests/GPBCompileTest07.m
@@ -28,13 +28,11 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
// This is a test including a single public header to ensure things build.
// It helps test that imports are complete/ordered correctly.
#import "GPBMessage.h"
-
// Something in the body of this file so the compiler/linker won't complain
// about an empty .o file.
__attribute__((visibility("default"))) char dummy_symbol_7 = 0;
diff --git a/objectivec/Tests/GPBCompileTest08.m b/objectivec/Tests/GPBCompileTest08.m
index a84f38c..48246f8 100644
--- a/objectivec/Tests/GPBCompileTest08.m
+++ b/objectivec/Tests/GPBCompileTest08.m
@@ -28,13 +28,11 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
// This is a test including a single public header to ensure things build.
// It helps test that imports are complete/ordered correctly.
#import "GPBRootObject.h"
-
// Something in the body of this file so the compiler/linker won't complain
// about an empty .o file.
__attribute__((visibility("default"))) char dummy_symbol_8 = 0;
diff --git a/objectivec/Tests/GPBCompileTest09.m b/objectivec/Tests/GPBCompileTest09.m
index f8ccb4a..d1d8cdf 100644
--- a/objectivec/Tests/GPBCompileTest09.m
+++ b/objectivec/Tests/GPBCompileTest09.m
@@ -28,13 +28,11 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
// This is a test including a single public header to ensure things build.
// It helps test that imports are complete/ordered correctly.
#import "GPBUnknownField.h"
-
// Something in the body of this file so the compiler/linker won't complain
// about an empty .o file.
__attribute__((visibility("default"))) char dummy_symbol_9 = 0;
diff --git a/objectivec/Tests/GPBCompileTest10.m b/objectivec/Tests/GPBCompileTest10.m
index d831867..31f610d 100644
--- a/objectivec/Tests/GPBCompileTest10.m
+++ b/objectivec/Tests/GPBCompileTest10.m
@@ -28,13 +28,11 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
// This is a test including a single public header to ensure things build.
// It helps test that imports are complete/ordered correctly.
#import "GPBUnknownFieldSet.h"
-
// Something in the body of this file so the compiler/linker won't complain
// about an empty .o file.
__attribute__((visibility("default"))) char dummy_symbol_10 = 0;
diff --git a/objectivec/Tests/GPBCompileTest11.m b/objectivec/Tests/GPBCompileTest11.m
index 9f2c6b1..2f51ec9 100644
--- a/objectivec/Tests/GPBCompileTest11.m
+++ b/objectivec/Tests/GPBCompileTest11.m
@@ -28,13 +28,11 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
// This is a test including a single public header to ensure things build.
// It helps test that imports are complete/ordered correctly.
#import "GPBUtilities.h"
-
// Something in the body of this file so the compiler/linker won't complain
// about an empty .o file.
__attribute__((visibility("default"))) char dummy_symbol_11 = 0;
diff --git a/objectivec/Tests/GPBCompileTest12.m b/objectivec/Tests/GPBCompileTest12.m
index 3aa29b3..9892bcf 100644
--- a/objectivec/Tests/GPBCompileTest12.m
+++ b/objectivec/Tests/GPBCompileTest12.m
@@ -28,13 +28,11 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
// This is a test including a single public header to ensure things build.
// It helps test that imports are complete/ordered correctly.
#import "GPBWellKnownTypes.h"
-
// Something in the body of this file so the compiler/linker won't complain
// about an empty .o file.
__attribute__((visibility("default"))) char dummy_symbol_12 = 0;
diff --git a/objectivec/Tests/GPBCompileTest13.m b/objectivec/Tests/GPBCompileTest13.m
index fef2af5..d5168ae 100644
--- a/objectivec/Tests/GPBCompileTest13.m
+++ b/objectivec/Tests/GPBCompileTest13.m
@@ -28,13 +28,11 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
// This is a test including a single public header to ensure things build.
// It helps test that imports are complete/ordered correctly.
#import "GPBWireFormat.h"
-
// Something in the body of this file so the compiler/linker won't complain
// about an empty .o file.
__attribute__((visibility("default"))) char dummy_symbol_13 = 0;
diff --git a/objectivec/Tests/GPBCompileTest14.m b/objectivec/Tests/GPBCompileTest14.m
index 1e64b71..cd59f6f 100644
--- a/objectivec/Tests/GPBCompileTest14.m
+++ b/objectivec/Tests/GPBCompileTest14.m
@@ -28,13 +28,11 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
// This is a test including a single public header to ensure things build.
// It helps test that imports are complete/ordered correctly.
#import "GPBAny.pbobjc.h"
-
// Something in the body of this file so the compiler/linker won't complain
// about an empty .o file.
__attribute__((visibility("default"))) char dummy_symbol_14 = 0;
diff --git a/objectivec/Tests/GPBCompileTest15.m b/objectivec/Tests/GPBCompileTest15.m
index 2eaedb2..ad9a3f8 100644
--- a/objectivec/Tests/GPBCompileTest15.m
+++ b/objectivec/Tests/GPBCompileTest15.m
@@ -28,13 +28,11 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
// This is a test including a single public header to ensure things build.
// It helps test that imports are complete/ordered correctly.
#import "GPBApi.pbobjc.h"
-
// Something in the body of this file so the compiler/linker won't complain
// about an empty .o file.
__attribute__((visibility("default"))) char dummy_symbol_15 = 0;
diff --git a/objectivec/Tests/GPBCompileTest16.m b/objectivec/Tests/GPBCompileTest16.m
index 25af89e..c5b532e 100644
--- a/objectivec/Tests/GPBCompileTest16.m
+++ b/objectivec/Tests/GPBCompileTest16.m
@@ -28,13 +28,11 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
// This is a test including a single public header to ensure things build.
// It helps test that imports are complete/ordered correctly.
#import "GPBDuration.pbobjc.h"
-
// Something in the body of this file so the compiler/linker won't complain
// about an empty .o file.
__attribute__((visibility("default"))) char dummy_symbol_16 = 0;
diff --git a/objectivec/Tests/GPBCompileTest17.m b/objectivec/Tests/GPBCompileTest17.m
index c719ad3..02988e6 100644
--- a/objectivec/Tests/GPBCompileTest17.m
+++ b/objectivec/Tests/GPBCompileTest17.m
@@ -28,13 +28,11 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
// This is a test including a single public header to ensure things build.
// It helps test that imports are complete/ordered correctly.
#import "GPBEmpty.pbobjc.h"
-
// Something in the body of this file so the compiler/linker won't complain
// about an empty .o file.
__attribute__((visibility("default"))) char dummy_symbol_17 = 0;
diff --git a/objectivec/Tests/GPBCompileTest18.m b/objectivec/Tests/GPBCompileTest18.m
index a02b259..a652c61 100644
--- a/objectivec/Tests/GPBCompileTest18.m
+++ b/objectivec/Tests/GPBCompileTest18.m
@@ -28,13 +28,11 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
// This is a test including a single public header to ensure things build.
// It helps test that imports are complete/ordered correctly.
#import "GPBFieldMask.pbobjc.h"
-
// Something in the body of this file so the compiler/linker won't complain
// about an empty .o file.
__attribute__((visibility("default"))) char dummy_symbol_18 = 0;
diff --git a/objectivec/Tests/GPBCompileTest19.m b/objectivec/Tests/GPBCompileTest19.m
index b447284..7ea31a8 100644
--- a/objectivec/Tests/GPBCompileTest19.m
+++ b/objectivec/Tests/GPBCompileTest19.m
@@ -28,13 +28,11 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
// This is a test including a single public header to ensure things build.
// It helps test that imports are complete/ordered correctly.
#import "GPBSourceContext.pbobjc.h"
-
// Something in the body of this file so the compiler/linker won't complain
// about an empty .o file.
__attribute__((visibility("default"))) char dummy_symbol_19 = 0;
diff --git a/objectivec/Tests/GPBCompileTest20.m b/objectivec/Tests/GPBCompileTest20.m
index 120ef55..d79ceea 100644
--- a/objectivec/Tests/GPBCompileTest20.m
+++ b/objectivec/Tests/GPBCompileTest20.m
@@ -28,13 +28,11 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
// This is a test including a single public header to ensure things build.
// It helps test that imports are complete/ordered correctly.
#import "GPBStruct.pbobjc.h"
-
// Something in the body of this file so the compiler/linker won't complain
// about an empty .o file.
__attribute__((visibility("default"))) char dummy_symbol_20 = 0;
diff --git a/objectivec/Tests/GPBCompileTest21.m b/objectivec/Tests/GPBCompileTest21.m
index 766d890..0a273da 100644
--- a/objectivec/Tests/GPBCompileTest21.m
+++ b/objectivec/Tests/GPBCompileTest21.m
@@ -28,13 +28,11 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
// This is a test including a single public header to ensure things build.
// It helps test that imports are complete/ordered correctly.
#import "GPBTimestamp.pbobjc.h"
-
// Something in the body of this file so the compiler/linker won't complain
// about an empty .o file.
__attribute__((visibility("default"))) char dummy_symbol_21 = 0;
diff --git a/objectivec/Tests/GPBCompileTest22.m b/objectivec/Tests/GPBCompileTest22.m
index 6d0955b..05cd01c 100644
--- a/objectivec/Tests/GPBCompileTest22.m
+++ b/objectivec/Tests/GPBCompileTest22.m
@@ -28,13 +28,11 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
// This is a test including a single public header to ensure things build.
// It helps test that imports are complete/ordered correctly.
#import "GPBType.pbobjc.h"
-
// Something in the body of this file so the compiler/linker won't complain
// about an empty .o file.
__attribute__((visibility("default"))) char dummy_symbol_22 = 0;
diff --git a/objectivec/Tests/GPBCompileTest23.m b/objectivec/Tests/GPBCompileTest23.m
index 22f2db6..ec29f3a 100644
--- a/objectivec/Tests/GPBCompileTest23.m
+++ b/objectivec/Tests/GPBCompileTest23.m
@@ -28,13 +28,11 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
// This is a test including a single public header to ensure things build.
// It helps test that imports are complete/ordered correctly.
#import "GPBWrappers.pbobjc.h"
-
// Something in the body of this file so the compiler/linker won't complain
// about an empty .o file.
__attribute__((visibility("default"))) char dummy_symbol_23 = 0;
diff --git a/objectivec/Tests/GPBConcurrencyTests.m b/objectivec/Tests/GPBConcurrencyTests.m
index daf75e7..4ea62f9 100644
--- a/objectivec/Tests/GPBConcurrencyTests.m
+++ b/objectivec/Tests/GPBConcurrencyTests.m
@@ -30,8 +30,8 @@
#import "GPBTestUtilities.h"
-#import "google/protobuf/Unittest.pbobjc.h"
-#import "google/protobuf/UnittestObjc.pbobjc.h"
+#import "objectivec/Tests/Unittest.pbobjc.h"
+#import "objectivec/Tests/UnittestObjc.pbobjc.h"
static const int kNumThreads = 100;
static const int kNumMessages = 100;
@@ -49,8 +49,7 @@
- (NSArray *)createThreadsWithSelector:(SEL)selector object:(id)object {
NSMutableArray *array = [NSMutableArray array];
for (NSUInteger i = 0; i < kNumThreads; i++) {
- NSThread *thread =
- [[NSThread alloc] initWithTarget:self selector:selector object:object];
+ NSThread *thread = [[NSThread alloc] initWithTarget:self selector:selector object:object];
[array addObject:thread];
[thread release];
}
@@ -88,9 +87,8 @@
- (void)testConcurrentReadOfUnsetMessageField {
NSArray *messages = [self createMessagesWithType:[TestAllTypes class]];
- NSArray *threads =
- [self createThreadsWithSelector:@selector(readForeignMessage:)
- object:messages];
+ NSArray *threads = [self createThreadsWithSelector:@selector(readForeignMessage:)
+ object:messages];
[self startThreads:threads];
[self joinThreads:threads];
for (TestAllTypes *message in messages) {
@@ -108,9 +106,7 @@
- (void)testConcurrentReadOfUnsetRepeatedIntField {
NSArray *messages = [self createMessagesWithType:[TestAllTypes class]];
- NSArray *threads =
- [self createThreadsWithSelector:@selector(readRepeatedInt32:)
- object:messages];
+ NSArray *threads = [self createThreadsWithSelector:@selector(readRepeatedInt32:) object:messages];
[self startThreads:threads];
[self joinThreads:threads];
for (TestAllTypes *message in messages) {
@@ -128,9 +124,8 @@
- (void)testConcurrentReadOfUnsetRepeatedStringField {
NSArray *messages = [self createMessagesWithType:[TestAllTypes class]];
- NSArray *threads =
- [self createThreadsWithSelector:@selector(readRepeatedString:)
- object:messages];
+ NSArray *threads = [self createThreadsWithSelector:@selector(readRepeatedString:)
+ object:messages];
[self startThreads:threads];
[self joinThreads:threads];
for (TestAllTypes *message in messages) {
@@ -147,11 +142,8 @@
}
- (void)testConcurrentReadOfUnsetInt32Int32MapField {
- NSArray *messages =
- [self createMessagesWithType:[TestRecursiveMessageWithRepeatedField class]];
- NSArray *threads =
- [self createThreadsWithSelector:@selector(readInt32Int32Map:)
- object:messages];
+ NSArray *messages = [self createMessagesWithType:[TestRecursiveMessageWithRepeatedField class]];
+ NSArray *threads = [self createThreadsWithSelector:@selector(readInt32Int32Map:) object:messages];
[self startThreads:threads];
[self joinThreads:threads];
for (TestRecursiveMessageWithRepeatedField *message in messages) {
@@ -168,11 +160,9 @@
}
- (void)testConcurrentReadOfUnsetStringStringMapField {
- NSArray *messages =
- [self createMessagesWithType:[TestRecursiveMessageWithRepeatedField class]];
- NSArray *threads =
- [self createThreadsWithSelector:@selector(readStringStringMap:)
- object:messages];
+ NSArray *messages = [self createMessagesWithType:[TestRecursiveMessageWithRepeatedField class]];
+ NSArray *threads = [self createThreadsWithSelector:@selector(readStringStringMap:)
+ object:messages];
[self startThreads:threads];
[self joinThreads:threads];
for (TestRecursiveMessageWithRepeatedField *message in messages) {
@@ -196,8 +186,7 @@
NSArray *threads = [self createThreadsWithSelector:sel object:messages];
[self startThreads:threads];
[self joinThreads:threads];
- GPBExtensionDescriptor *extension =
- [UnittestRoot optionalForeignMessageExtension];
+ GPBExtensionDescriptor *extension = [UnittestRoot optionalForeignMessageExtension];
for (TestAllExtensions *message in messages) {
XCTAssertFalse([message hasExtension:extension]);
}
diff --git a/objectivec/Tests/GPBDescriptorTests.m b/objectivec/Tests/GPBDescriptorTests.m
index b1ff544..e528be4 100644
--- a/objectivec/Tests/GPBDescriptorTests.m
+++ b/objectivec/Tests/GPBDescriptorTests.m
@@ -33,9 +33,9 @@
#import <objc/runtime.h>
#import "GPBDescriptor_PackagePrivate.h"
-#import "google/protobuf/Unittest.pbobjc.h"
-#import "google/protobuf/UnittestObjc.pbobjc.h"
-#import "google/protobuf/Descriptor.pbobjc.h"
+#import "objectivec/Tests/Unittest.pbobjc.h"
+#import "objectivec/Tests/UnittestObjc.pbobjc.h"
+#import "objectivec/Tests/UnittestObjcOptions.pbobjc.h"
@interface DescriptorTests : GPBTestCase
@end
@@ -52,37 +52,36 @@
- (void)testDescriptor_fullName {
GPBDescriptor *testAllTypesDesc = [TestAllTypes descriptor];
- XCTAssertEqualObjects(testAllTypesDesc.fullName, @"protobuf_unittest.TestAllTypes");
+ XCTAssertEqualObjects(testAllTypesDesc.fullName, @"objc.protobuf.tests.TestAllTypes");
GPBDescriptor *nestedMessageDesc = [TestAllTypes_NestedMessage descriptor];
- XCTAssertEqualObjects(nestedMessageDesc.fullName, @"protobuf_unittest.TestAllTypes.NestedMessage");
+ XCTAssertEqualObjects(nestedMessageDesc.fullName,
+ @"objc.protobuf.tests.TestAllTypes.NestedMessage");
// Prefixes removed.
- GPBDescriptor *descDesc = [GPBDescriptorProto descriptor];
- XCTAssertEqualObjects(descDesc.fullName, @"google.protobuf.DescriptorProto");
- GPBDescriptor *descExtRngDesc = [GPBDescriptorProto_ExtensionRange descriptor];
- XCTAssertEqualObjects(descExtRngDesc.fullName, @"google.protobuf.DescriptorProto.ExtensionRange");
+ GPBDescriptor *descDesc = [GPBTESTPrefixedParentMessage descriptor];
+ XCTAssertEqualObjects(descDesc.fullName, @"objc.protobuf.tests.options.PrefixedParentMessage");
+ GPBDescriptor *descExtRngDesc = [GPBTESTPrefixedParentMessage_Child descriptor];
+ XCTAssertEqualObjects(descExtRngDesc.fullName,
+ @"objc.protobuf.tests.options.PrefixedParentMessage.Child");
// Things that get "_Class" added.
GPBDescriptor *pointDesc = [Point_Class descriptor];
- XCTAssertEqualObjects(pointDesc.fullName, @"protobuf_unittest.Point");
+ XCTAssertEqualObjects(pointDesc.fullName, @"objc.protobuf.tests.Point");
GPBDescriptor *pointRectDesc = [Point_Rect descriptor];
- XCTAssertEqualObjects(pointRectDesc.fullName, @"protobuf_unittest.Point.Rect");
+ XCTAssertEqualObjects(pointRectDesc.fullName, @"objc.protobuf.tests.Point.Rect");
}
- (void)testFieldDescriptor {
GPBDescriptor *descriptor = [TestAllTypes descriptor];
// Nested Enum
- GPBFieldDescriptor *fieldDescriptorWithName =
- [descriptor fieldWithName:@"optionalNestedEnum"];
+ GPBFieldDescriptor *fieldDescriptorWithName = [descriptor fieldWithName:@"optionalNestedEnum"];
XCTAssertNotNil(fieldDescriptorWithName);
- GPBFieldDescriptor *fieldDescriptorWithNumber =
- [descriptor fieldWithNumber:21];
+ GPBFieldDescriptor *fieldDescriptorWithNumber = [descriptor fieldWithNumber:21];
XCTAssertNotNil(fieldDescriptorWithNumber);
XCTAssertEqual(fieldDescriptorWithName, fieldDescriptorWithNumber);
XCTAssertNotNil(fieldDescriptorWithNumber.enumDescriptor);
- XCTAssertEqualObjects(fieldDescriptorWithNumber.enumDescriptor.name,
- @"TestAllTypes_NestedEnum");
+ XCTAssertEqualObjects(fieldDescriptorWithNumber.enumDescriptor.name, @"TestAllTypes_NestedEnum");
XCTAssertEqual(fieldDescriptorWithName.number, fieldDescriptorWithNumber.number);
XCTAssertEqual(fieldDescriptorWithName.dataType, GPBDataTypeEnum);
@@ -93,8 +92,7 @@
XCTAssertNotNil(fieldDescriptorWithNumber);
XCTAssertEqual(fieldDescriptorWithName, fieldDescriptorWithNumber);
XCTAssertNotNil(fieldDescriptorWithNumber.enumDescriptor);
- XCTAssertEqualObjects(fieldDescriptorWithNumber.enumDescriptor.name,
- @"ForeignEnum");
+ XCTAssertEqualObjects(fieldDescriptorWithNumber.enumDescriptor.name, @"ForeignEnum");
XCTAssertEqual(fieldDescriptorWithName.number, fieldDescriptorWithNumber.number);
XCTAssertEqual(fieldDescriptorWithName.dataType, GPBDataTypeEnum);
@@ -105,8 +103,7 @@
XCTAssertNotNil(fieldDescriptorWithNumber);
XCTAssertEqual(fieldDescriptorWithName, fieldDescriptorWithNumber);
XCTAssertNotNil(fieldDescriptorWithNumber.enumDescriptor);
- XCTAssertEqualObjects(fieldDescriptorWithNumber.enumDescriptor.name,
- @"ImportEnum");
+ XCTAssertEqualObjects(fieldDescriptorWithNumber.enumDescriptor.name, @"ImportEnum");
XCTAssertEqual(fieldDescriptorWithName.number, fieldDescriptorWithNumber.number);
XCTAssertEqual(fieldDescriptorWithName.dataType, GPBDataTypeEnum);
@@ -121,8 +118,7 @@
XCTAssertEqual(fieldDescriptorWithName.dataType, GPBDataTypeMessage);
// Foreign Message
- fieldDescriptorWithName =
- [descriptor fieldWithName:@"optionalForeignMessage"];
+ fieldDescriptorWithName = [descriptor fieldWithName:@"optionalForeignMessage"];
XCTAssertNotNil(fieldDescriptorWithName);
fieldDescriptorWithNumber = [descriptor fieldWithNumber:19];
XCTAssertNotNil(fieldDescriptorWithNumber);
@@ -152,22 +148,18 @@
NSString *enumName = [descriptor enumNameForValue:1];
XCTAssertNotNil(enumName);
int32_t value;
- XCTAssertTrue(
- [descriptor getValue:&value forEnumName:@"TestAllTypes_NestedEnum_Foo"]);
- XCTAssertTrue(
- [descriptor getValue:NULL forEnumName:@"TestAllTypes_NestedEnum_Foo"]);
+ XCTAssertTrue([descriptor getValue:&value forEnumName:@"TestAllTypes_NestedEnum_Foo"]);
+ XCTAssertTrue([descriptor getValue:NULL forEnumName:@"TestAllTypes_NestedEnum_Foo"]);
XCTAssertEqual(value, TestAllTypes_NestedEnum_Foo);
enumName = [descriptor enumNameForValue:2];
XCTAssertNotNil(enumName);
- XCTAssertTrue(
- [descriptor getValue:&value forEnumName:@"TestAllTypes_NestedEnum_Bar"]);
+ XCTAssertTrue([descriptor getValue:&value forEnumName:@"TestAllTypes_NestedEnum_Bar"]);
XCTAssertEqual(value, TestAllTypes_NestedEnum_Bar);
enumName = [descriptor enumNameForValue:3];
XCTAssertNotNil(enumName);
- XCTAssertTrue(
- [descriptor getValue:&value forEnumName:@"TestAllTypes_NestedEnum_Baz"]);
+ XCTAssertTrue([descriptor getValue:&value forEnumName:@"TestAllTypes_NestedEnum_Baz"]);
XCTAssertEqual(value, TestAllTypes_NestedEnum_Baz);
// TextFormat
@@ -182,10 +174,8 @@
XCTAssertNil(enumName);
XCTAssertFalse([descriptor getValue:&value forEnumName:@"Unknown"]);
XCTAssertFalse([descriptor getValue:NULL forEnumName:@"Unknown"]);
- XCTAssertFalse([descriptor getValue:&value
- forEnumName:@"TestAllTypes_NestedEnum_Unknown"]);
- XCTAssertFalse([descriptor getValue:NULL
- forEnumName:@"TestAllTypes_NestedEnum_Unknown"]);
+ XCTAssertFalse([descriptor getValue:&value forEnumName:@"TestAllTypes_NestedEnum_Unknown"]);
+ XCTAssertFalse([descriptor getValue:NULL forEnumName:@"TestAllTypes_NestedEnum_Unknown"]);
XCTAssertFalse([descriptor getValue:NULL forEnumTextFormatName:@"Unknown"]);
XCTAssertFalse([descriptor getValue:&value forEnumTextFormatName:@"Unknown"]);
}
@@ -194,17 +184,13 @@
GPBEnumDescriptor *descriptor = TestAllTypes_NestedEnum_EnumDescriptor();
XCTAssertEqual(descriptor.enumNameCount, 4U);
- XCTAssertEqualObjects([descriptor getEnumNameForIndex:0],
- @"TestAllTypes_NestedEnum_Foo");
+ XCTAssertEqualObjects([descriptor getEnumNameForIndex:0], @"TestAllTypes_NestedEnum_Foo");
XCTAssertEqualObjects([descriptor getEnumTextFormatNameForIndex:0], @"FOO");
- XCTAssertEqualObjects([descriptor getEnumNameForIndex:1],
- @"TestAllTypes_NestedEnum_Bar");
+ XCTAssertEqualObjects([descriptor getEnumNameForIndex:1], @"TestAllTypes_NestedEnum_Bar");
XCTAssertEqualObjects([descriptor getEnumTextFormatNameForIndex:1], @"BAR");
- XCTAssertEqualObjects([descriptor getEnumNameForIndex:2],
- @"TestAllTypes_NestedEnum_Baz");
+ XCTAssertEqualObjects([descriptor getEnumNameForIndex:2], @"TestAllTypes_NestedEnum_Baz");
XCTAssertEqualObjects([descriptor getEnumTextFormatNameForIndex:2], @"BAZ");
- XCTAssertEqualObjects([descriptor getEnumNameForIndex:3],
- @"TestAllTypes_NestedEnum_Neg");
+ XCTAssertEqualObjects([descriptor getEnumNameForIndex:3], @"TestAllTypes_NestedEnum_Neg");
XCTAssertEqualObjects([descriptor getEnumTextFormatNameForIndex:3], @"NEG");
}
@@ -286,8 +272,7 @@
- (void)testEnumValueValidator {
GPBDescriptor *descriptor = [TestAllTypes descriptor];
- GPBFieldDescriptor *fieldDescriptor =
- [descriptor fieldWithName:@"optionalNestedEnum"];
+ GPBFieldDescriptor *fieldDescriptor = [descriptor fieldWithName:@"optionalNestedEnum"];
// Valid values
XCTAssertTrue([fieldDescriptor isValidEnumValue:1]);
@@ -325,12 +310,10 @@
// Pointer comparisons against lookups from message.
- XCTAssertEqual([oneofFoo fieldWithNumber:TestOneof2_FieldNumber_FooString],
- fooStringField);
+ XCTAssertEqual([oneofFoo fieldWithNumber:TestOneof2_FieldNumber_FooString], fooStringField);
XCTAssertEqual([oneofFoo fieldWithName:@"fooString"], fooStringField);
- XCTAssertEqual([oneofBar fieldWithNumber:TestOneof2_FieldNumber_BarString],
- barStringField);
+ XCTAssertEqual([oneofBar fieldWithNumber:TestOneof2_FieldNumber_BarString], barStringField);
XCTAssertEqual([oneofBar fieldWithName:@"barString"], barStringField);
// Unknown oneof not found.
@@ -354,8 +337,7 @@
// (pointer comparisons)
XCTAssertEqual(fooStringField.containingOneof, oneofFoo);
XCTAssertEqual(barStringField.containingOneof, oneofBar);
- GPBFieldDescriptor *bazString =
- [descriptor fieldWithNumber:TestOneof2_FieldNumber_BazString];
+ GPBFieldDescriptor *bazString = [descriptor fieldWithNumber:TestOneof2_FieldNumber_BazString];
XCTAssertNotNil(bazString);
XCTAssertNil(bazString.containingOneof);
}
diff --git a/objectivec/Tests/GPBDictionaryTests+Bool.m b/objectivec/Tests/GPBDictionaryTests+Bool.m
index 4c02144..37f7eb3 100644
--- a/objectivec/Tests/GPBDictionaryTests+Bool.m
+++ b/objectivec/Tests/GPBDictionaryTests+Bool.m
@@ -34,7 +34,10 @@
#import "GPBDictionary.h"
#import "GPBTestUtilities.h"
-#import "google/protobuf/UnittestRuntimeProto2.pbobjc.h"
+#import "objectivec/Tests/UnittestRuntimeProto2.pbobjc.h"
+
+// Disable clang-format for the macros.
+// clang-format off
// Pull in the macros (using an external file because expanding all tests
// in a single file makes a file that is failing to work with within Xcode.
@@ -42,7 +45,6 @@
//%PDDM-EXPAND BOOL_TESTS_FOR_POD_VALUE(UInt32, uint32_t, 100U, 101U)
// This block of code is generated, do not edit it directly.
-// clang-format off
#pragma mark - Bool -> UInt32
@@ -56,8 +58,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getUInt32:NULL forKey:YES]);
- [dict enumerateKeysAndUInt32sUsingBlock:^(BOOL aKey, uint32_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndUInt32sUsingBlock:^(__unused BOOL aKey, __unused uint32_t aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -123,8 +124,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndUInt32sUsingBlock:^(BOOL aKey, uint32_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndUInt32sUsingBlock:^(__unused BOOL aKey, __unused uint32_t aValue, BOOL *stop) {
if (idx == 0) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -346,10 +346,8 @@
@end
-// clang-format on
//%PDDM-EXPAND BOOL_TESTS_FOR_POD_VALUE(Int32, int32_t, 200, 201)
// This block of code is generated, do not edit it directly.
-// clang-format off
#pragma mark - Bool -> Int32
@@ -363,8 +361,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getInt32:NULL forKey:YES]);
- [dict enumerateKeysAndInt32sUsingBlock:^(BOOL aKey, int32_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndInt32sUsingBlock:^(__unused BOOL aKey, __unused int32_t aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -430,8 +427,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndInt32sUsingBlock:^(BOOL aKey, int32_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndInt32sUsingBlock:^(__unused BOOL aKey, __unused int32_t aValue, BOOL *stop) {
if (idx == 0) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -653,10 +649,8 @@
@end
-// clang-format on
//%PDDM-EXPAND BOOL_TESTS_FOR_POD_VALUE(UInt64, uint64_t, 300U, 301U)
// This block of code is generated, do not edit it directly.
-// clang-format off
#pragma mark - Bool -> UInt64
@@ -670,8 +664,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getUInt64:NULL forKey:YES]);
- [dict enumerateKeysAndUInt64sUsingBlock:^(BOOL aKey, uint64_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndUInt64sUsingBlock:^(__unused BOOL aKey, __unused uint64_t aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -737,8 +730,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndUInt64sUsingBlock:^(BOOL aKey, uint64_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndUInt64sUsingBlock:^(__unused BOOL aKey, __unused uint64_t aValue, BOOL *stop) {
if (idx == 0) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -960,10 +952,8 @@
@end
-// clang-format on
//%PDDM-EXPAND BOOL_TESTS_FOR_POD_VALUE(Int64, int64_t, 400, 401)
// This block of code is generated, do not edit it directly.
-// clang-format off
#pragma mark - Bool -> Int64
@@ -977,8 +967,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getInt64:NULL forKey:YES]);
- [dict enumerateKeysAndInt64sUsingBlock:^(BOOL aKey, int64_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndInt64sUsingBlock:^(__unused BOOL aKey, __unused int64_t aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -1044,8 +1033,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndInt64sUsingBlock:^(BOOL aKey, int64_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndInt64sUsingBlock:^(__unused BOOL aKey, __unused int64_t aValue, BOOL *stop) {
if (idx == 0) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -1267,10 +1255,8 @@
@end
-// clang-format on
//%PDDM-EXPAND BOOL_TESTS_FOR_POD_VALUE(Bool, BOOL, NO, YES)
// This block of code is generated, do not edit it directly.
-// clang-format off
#pragma mark - Bool -> Bool
@@ -1284,8 +1270,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getBool:NULL forKey:YES]);
- [dict enumerateKeysAndBoolsUsingBlock:^(BOOL aKey, BOOL aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndBoolsUsingBlock:^(__unused BOOL aKey, __unused BOOL aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -1351,8 +1336,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndBoolsUsingBlock:^(BOOL aKey, BOOL aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndBoolsUsingBlock:^(__unused BOOL aKey, __unused BOOL aValue, BOOL *stop) {
if (idx == 0) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -1574,10 +1558,8 @@
@end
-// clang-format on
//%PDDM-EXPAND BOOL_TESTS_FOR_POD_VALUE(Float, float, 500.f, 501.f)
// This block of code is generated, do not edit it directly.
-// clang-format off
#pragma mark - Bool -> Float
@@ -1591,8 +1573,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getFloat:NULL forKey:YES]);
- [dict enumerateKeysAndFloatsUsingBlock:^(BOOL aKey, float aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndFloatsUsingBlock:^(__unused BOOL aKey, __unused float aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -1658,8 +1639,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndFloatsUsingBlock:^(BOOL aKey, float aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndFloatsUsingBlock:^(__unused BOOL aKey, __unused float aValue, BOOL *stop) {
if (idx == 0) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -1881,10 +1861,8 @@
@end
-// clang-format on
//%PDDM-EXPAND BOOL_TESTS_FOR_POD_VALUE(Double, double, 600., 601.)
// This block of code is generated, do not edit it directly.
-// clang-format off
#pragma mark - Bool -> Double
@@ -1898,8 +1876,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getDouble:NULL forKey:YES]);
- [dict enumerateKeysAndDoublesUsingBlock:^(BOOL aKey, double aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndDoublesUsingBlock:^(__unused BOOL aKey, __unused double aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -1965,8 +1942,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndDoublesUsingBlock:^(BOOL aKey, double aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndDoublesUsingBlock:^(__unused BOOL aKey, __unused double aValue, BOOL *stop) {
if (idx == 0) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -2188,10 +2164,8 @@
@end
-// clang-format on
//%PDDM-EXPAND TESTS_FOR_BOOL_KEY_OBJECT_VALUE(Object, NSString*, @"abc", @"def")
// This block of code is generated, do not edit it directly.
-// clang-format off
#pragma mark - Bool -> Object
@@ -2205,8 +2179,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertNil([dict objectForKey:YES]);
- [dict enumerateKeysAndObjectsUsingBlock:^(BOOL aKey, NSString* aObject, BOOL *stop) {
- #pragma unused(aKey, aObject, stop)
+ [dict enumerateKeysAndObjectsUsingBlock:^(__unused BOOL aKey, __unused NSString* aObject, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -2264,8 +2237,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndObjectsUsingBlock:^(BOOL aKey, NSString* aObject, BOOL *stop) {
- #pragma unused(aKey, aObject)
+ [dict enumerateKeysAndObjectsUsingBlock:^(__unused BOOL aKey, __unused NSString* aObject, BOOL *stop) {
if (idx == 0) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -2460,7 +2432,6 @@
@end
-// clang-format on
//%PDDM-EXPAND-END (8 expansions)
diff --git a/objectivec/Tests/GPBDictionaryTests+Int32.m b/objectivec/Tests/GPBDictionaryTests+Int32.m
index 8dafaac..f08e213 100644
--- a/objectivec/Tests/GPBDictionaryTests+Int32.m
+++ b/objectivec/Tests/GPBDictionaryTests+Int32.m
@@ -34,7 +34,10 @@
#import "GPBDictionary.h"
#import "GPBTestUtilities.h"
-#import "google/protobuf/UnittestRuntimeProto2.pbobjc.h"
+#import "objectivec/Tests/UnittestRuntimeProto2.pbobjc.h"
+
+// Disable clang-format for the macros.
+// clang-format off
// Pull in the macros (using an external file because expanding all tests
// in a single file makes a file that is failing to work with within Xcode.
@@ -42,7 +45,6 @@
//%PDDM-EXPAND TEST_FOR_POD_KEY(Int32, int32_t, 11, 12, 13, 14)
// This block of code is generated, do not edit it directly.
-// clang-format off
// To let the testing macros work, add some extra methods to simplify things.
@interface GPBInt32EnumDictionary (TestingTweak)
@@ -87,8 +89,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getUInt32:NULL forKey:11]);
- [dict enumerateKeysAndUInt32sUsingBlock:^(int32_t aKey, uint32_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndUInt32sUsingBlock:^(__unused int32_t aKey, __unused uint32_t aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -158,8 +159,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndUInt32sUsingBlock:^(int32_t aKey, uint32_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndUInt32sUsingBlock:^(__unused int32_t aKey, __unused uint32_t aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -448,8 +448,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getInt32:NULL forKey:11]);
- [dict enumerateKeysAndInt32sUsingBlock:^(int32_t aKey, int32_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndInt32sUsingBlock:^(__unused int32_t aKey, __unused int32_t aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -519,8 +518,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndInt32sUsingBlock:^(int32_t aKey, int32_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndInt32sUsingBlock:^(__unused int32_t aKey, __unused int32_t aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -809,8 +807,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getUInt64:NULL forKey:11]);
- [dict enumerateKeysAndUInt64sUsingBlock:^(int32_t aKey, uint64_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndUInt64sUsingBlock:^(__unused int32_t aKey, __unused uint64_t aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -880,8 +877,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndUInt64sUsingBlock:^(int32_t aKey, uint64_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndUInt64sUsingBlock:^(__unused int32_t aKey, __unused uint64_t aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -1170,8 +1166,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getInt64:NULL forKey:11]);
- [dict enumerateKeysAndInt64sUsingBlock:^(int32_t aKey, int64_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndInt64sUsingBlock:^(__unused int32_t aKey, __unused int64_t aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -1241,8 +1236,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndInt64sUsingBlock:^(int32_t aKey, int64_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndInt64sUsingBlock:^(__unused int32_t aKey, __unused int64_t aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -1531,8 +1525,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getBool:NULL forKey:11]);
- [dict enumerateKeysAndBoolsUsingBlock:^(int32_t aKey, BOOL aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndBoolsUsingBlock:^(__unused int32_t aKey, __unused BOOL aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -1602,8 +1595,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndBoolsUsingBlock:^(int32_t aKey, BOOL aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndBoolsUsingBlock:^(__unused int32_t aKey, __unused BOOL aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -1892,8 +1884,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getFloat:NULL forKey:11]);
- [dict enumerateKeysAndFloatsUsingBlock:^(int32_t aKey, float aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndFloatsUsingBlock:^(__unused int32_t aKey, __unused float aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -1963,8 +1954,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndFloatsUsingBlock:^(int32_t aKey, float aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndFloatsUsingBlock:^(__unused int32_t aKey, __unused float aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -2253,8 +2243,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getDouble:NULL forKey:11]);
- [dict enumerateKeysAndDoublesUsingBlock:^(int32_t aKey, double aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndDoublesUsingBlock:^(__unused int32_t aKey, __unused double aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -2324,8 +2313,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndDoublesUsingBlock:^(int32_t aKey, double aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndDoublesUsingBlock:^(__unused int32_t aKey, __unused double aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -2614,8 +2602,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getEnum:NULL forKey:11]);
- [dict enumerateKeysAndEnumsUsingBlock:^(int32_t aKey, int32_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndEnumsUsingBlock:^(__unused int32_t aKey, __unused int32_t aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -2685,8 +2672,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndEnumsUsingBlock:^(int32_t aKey, int32_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndEnumsUsingBlock:^(__unused int32_t aKey, __unused int32_t aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -3043,8 +3029,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndRawValuesUsingBlock:^(int32_t aKey, int32_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndRawValuesUsingBlock:^(__unused int32_t aKey, __unused int32_t aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -3393,8 +3378,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertNil([dict objectForKey:11]);
- [dict enumerateKeysAndObjectsUsingBlock:^(int32_t aKey, NSString* aObject, BOOL *stop) {
- #pragma unused(aKey, aObject, stop)
+ [dict enumerateKeysAndObjectsUsingBlock:^(__unused int32_t aKey, __unused NSString* aObject, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -3454,8 +3438,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndObjectsUsingBlock:^(int32_t aKey, NSString* aObject, BOOL *stop) {
- #pragma unused(aKey, aObject)
+ [dict enumerateKeysAndObjectsUsingBlock:^(__unused int32_t aKey, __unused NSString* aObject, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -3673,6 +3656,5 @@
@end
-// clang-format on
//%PDDM-EXPAND-END TEST_FOR_POD_KEY(Int32, int32_t, 11, 12, 13, 14)
diff --git a/objectivec/Tests/GPBDictionaryTests+Int64.m b/objectivec/Tests/GPBDictionaryTests+Int64.m
index a603356..c052e1c 100644
--- a/objectivec/Tests/GPBDictionaryTests+Int64.m
+++ b/objectivec/Tests/GPBDictionaryTests+Int64.m
@@ -34,7 +34,10 @@
#import "GPBDictionary.h"
#import "GPBTestUtilities.h"
-#import "google/protobuf/UnittestRuntimeProto2.pbobjc.h"
+#import "objectivec/Tests/UnittestRuntimeProto2.pbobjc.h"
+
+// Disable clang-format for the macros.
+// clang-format off
// Pull in the macros (using an external file because expanding all tests
// in a single file makes a file that is failing to work with within Xcode.
@@ -42,7 +45,6 @@
//%PDDM-EXPAND TEST_FOR_POD_KEY(Int64, int64_t, 21LL, 22LL, 23LL, 24LL)
// This block of code is generated, do not edit it directly.
-// clang-format off
// To let the testing macros work, add some extra methods to simplify things.
@interface GPBInt64EnumDictionary (TestingTweak)
@@ -87,8 +89,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getUInt32:NULL forKey:21LL]);
- [dict enumerateKeysAndUInt32sUsingBlock:^(int64_t aKey, uint32_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndUInt32sUsingBlock:^(__unused int64_t aKey, __unused uint32_t aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -158,8 +159,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndUInt32sUsingBlock:^(int64_t aKey, uint32_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndUInt32sUsingBlock:^(__unused int64_t aKey, __unused uint32_t aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -448,8 +448,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getInt32:NULL forKey:21LL]);
- [dict enumerateKeysAndInt32sUsingBlock:^(int64_t aKey, int32_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndInt32sUsingBlock:^(__unused int64_t aKey, __unused int32_t aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -519,8 +518,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndInt32sUsingBlock:^(int64_t aKey, int32_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndInt32sUsingBlock:^(__unused int64_t aKey, __unused int32_t aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -809,8 +807,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getUInt64:NULL forKey:21LL]);
- [dict enumerateKeysAndUInt64sUsingBlock:^(int64_t aKey, uint64_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndUInt64sUsingBlock:^(__unused int64_t aKey, __unused uint64_t aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -880,8 +877,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndUInt64sUsingBlock:^(int64_t aKey, uint64_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndUInt64sUsingBlock:^(__unused int64_t aKey, __unused uint64_t aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -1170,8 +1166,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getInt64:NULL forKey:21LL]);
- [dict enumerateKeysAndInt64sUsingBlock:^(int64_t aKey, int64_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndInt64sUsingBlock:^(__unused int64_t aKey, __unused int64_t aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -1241,8 +1236,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndInt64sUsingBlock:^(int64_t aKey, int64_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndInt64sUsingBlock:^(__unused int64_t aKey, __unused int64_t aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -1531,8 +1525,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getBool:NULL forKey:21LL]);
- [dict enumerateKeysAndBoolsUsingBlock:^(int64_t aKey, BOOL aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndBoolsUsingBlock:^(__unused int64_t aKey, __unused BOOL aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -1602,8 +1595,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndBoolsUsingBlock:^(int64_t aKey, BOOL aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndBoolsUsingBlock:^(__unused int64_t aKey, __unused BOOL aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -1892,8 +1884,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getFloat:NULL forKey:21LL]);
- [dict enumerateKeysAndFloatsUsingBlock:^(int64_t aKey, float aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndFloatsUsingBlock:^(__unused int64_t aKey, __unused float aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -1963,8 +1954,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndFloatsUsingBlock:^(int64_t aKey, float aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndFloatsUsingBlock:^(__unused int64_t aKey, __unused float aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -2253,8 +2243,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getDouble:NULL forKey:21LL]);
- [dict enumerateKeysAndDoublesUsingBlock:^(int64_t aKey, double aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndDoublesUsingBlock:^(__unused int64_t aKey, __unused double aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -2324,8 +2313,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndDoublesUsingBlock:^(int64_t aKey, double aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndDoublesUsingBlock:^(__unused int64_t aKey, __unused double aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -2614,8 +2602,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getEnum:NULL forKey:21LL]);
- [dict enumerateKeysAndEnumsUsingBlock:^(int64_t aKey, int32_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndEnumsUsingBlock:^(__unused int64_t aKey, __unused int32_t aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -2685,8 +2672,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndEnumsUsingBlock:^(int64_t aKey, int32_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndEnumsUsingBlock:^(__unused int64_t aKey, __unused int32_t aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -3043,8 +3029,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndRawValuesUsingBlock:^(int64_t aKey, int32_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndRawValuesUsingBlock:^(__unused int64_t aKey, __unused int32_t aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -3393,8 +3378,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertNil([dict objectForKey:21LL]);
- [dict enumerateKeysAndObjectsUsingBlock:^(int64_t aKey, NSString* aObject, BOOL *stop) {
- #pragma unused(aKey, aObject, stop)
+ [dict enumerateKeysAndObjectsUsingBlock:^(__unused int64_t aKey, __unused NSString* aObject, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -3454,8 +3438,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndObjectsUsingBlock:^(int64_t aKey, NSString* aObject, BOOL *stop) {
- #pragma unused(aKey, aObject)
+ [dict enumerateKeysAndObjectsUsingBlock:^(__unused int64_t aKey, __unused NSString* aObject, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -3673,6 +3656,5 @@
@end
-// clang-format on
//%PDDM-EXPAND-END TEST_FOR_POD_KEY(Int64, int64_t, 21LL, 22LL, 23LL, 24LL)
diff --git a/objectivec/Tests/GPBDictionaryTests+String.m b/objectivec/Tests/GPBDictionaryTests+String.m
index 8ad1cea..6c5d7b3 100644
--- a/objectivec/Tests/GPBDictionaryTests+String.m
+++ b/objectivec/Tests/GPBDictionaryTests+String.m
@@ -34,15 +34,17 @@
#import "GPBDictionary.h"
#import "GPBTestUtilities.h"
-#import "google/protobuf/UnittestRuntimeProto2.pbobjc.h"
+#import "objectivec/Tests/UnittestRuntimeProto2.pbobjc.h"
+
+// Disable clang-format for the macros.
+// clang-format off
// Pull in the macros (using an external file because expanding all tests
// in a single file makes a file that is failing to work with within Xcode.
//%PDDM-IMPORT-DEFINES GPBDictionaryTests.pddm
-//%PDDM-EXPAND TESTS_FOR_POD_VALUES(String, NSString, *, Objects, @"foo", @"bar", @"baz", @"mumble")
+//%PDDM-EXPAND TESTS_FOR_POD_VALUES(String,NSString,*,Objects,@"foo",@"bar",@"baz",@"mumble")
// This block of code is generated, do not edit it directly.
-// clang-format off
// To let the testing macros work, add some extra methods to simplify things.
@interface GPBStringEnumDictionary (TestingTweak)
@@ -87,8 +89,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getUInt32:NULL forKey:@"foo"]);
- [dict enumerateKeysAndUInt32sUsingBlock:^(NSString *aKey, uint32_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndUInt32sUsingBlock:^(__unused NSString *aKey, __unused uint32_t aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -158,8 +159,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndUInt32sUsingBlock:^(NSString *aKey, uint32_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndUInt32sUsingBlock:^(__unused NSString *aKey, __unused uint32_t aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -448,8 +448,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getInt32:NULL forKey:@"foo"]);
- [dict enumerateKeysAndInt32sUsingBlock:^(NSString *aKey, int32_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndInt32sUsingBlock:^(__unused NSString *aKey, __unused int32_t aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -519,8 +518,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndInt32sUsingBlock:^(NSString *aKey, int32_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndInt32sUsingBlock:^(__unused NSString *aKey, __unused int32_t aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -809,8 +807,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getUInt64:NULL forKey:@"foo"]);
- [dict enumerateKeysAndUInt64sUsingBlock:^(NSString *aKey, uint64_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndUInt64sUsingBlock:^(__unused NSString *aKey, __unused uint64_t aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -880,8 +877,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndUInt64sUsingBlock:^(NSString *aKey, uint64_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndUInt64sUsingBlock:^(__unused NSString *aKey, __unused uint64_t aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -1170,8 +1166,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getInt64:NULL forKey:@"foo"]);
- [dict enumerateKeysAndInt64sUsingBlock:^(NSString *aKey, int64_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndInt64sUsingBlock:^(__unused NSString *aKey, __unused int64_t aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -1241,8 +1236,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndInt64sUsingBlock:^(NSString *aKey, int64_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndInt64sUsingBlock:^(__unused NSString *aKey, __unused int64_t aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -1531,8 +1525,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getBool:NULL forKey:@"foo"]);
- [dict enumerateKeysAndBoolsUsingBlock:^(NSString *aKey, BOOL aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndBoolsUsingBlock:^(__unused NSString *aKey, __unused BOOL aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -1602,8 +1595,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndBoolsUsingBlock:^(NSString *aKey, BOOL aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndBoolsUsingBlock:^(__unused NSString *aKey, __unused BOOL aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -1892,8 +1884,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getFloat:NULL forKey:@"foo"]);
- [dict enumerateKeysAndFloatsUsingBlock:^(NSString *aKey, float aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndFloatsUsingBlock:^(__unused NSString *aKey, __unused float aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -1963,8 +1954,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndFloatsUsingBlock:^(NSString *aKey, float aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndFloatsUsingBlock:^(__unused NSString *aKey, __unused float aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -2253,8 +2243,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getDouble:NULL forKey:@"foo"]);
- [dict enumerateKeysAndDoublesUsingBlock:^(NSString *aKey, double aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndDoublesUsingBlock:^(__unused NSString *aKey, __unused double aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -2324,8 +2313,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndDoublesUsingBlock:^(NSString *aKey, double aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndDoublesUsingBlock:^(__unused NSString *aKey, __unused double aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -2614,8 +2602,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getEnum:NULL forKey:@"foo"]);
- [dict enumerateKeysAndEnumsUsingBlock:^(NSString *aKey, int32_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndEnumsUsingBlock:^(__unused NSString *aKey, __unused int32_t aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -2685,8 +2672,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndEnumsUsingBlock:^(NSString *aKey, int32_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndEnumsUsingBlock:^(__unused NSString *aKey, __unused int32_t aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -3043,8 +3029,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndRawValuesUsingBlock:^(NSString *aKey, int32_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndRawValuesUsingBlock:^(__unused NSString *aKey, __unused int32_t aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -3381,6 +3366,4 @@
@end
-// clang-format on
-//%PDDM-EXPAND-END TESTS_FOR_POD_VALUES(String, NSString, *, Objects, @"foo", @"bar", @"baz", @"mumble")
-
+//%PDDM-EXPAND-END TESTS_FOR_POD_VALUES(String,NSString,*,Objects,@"foo",@"bar",@"baz",@"mumble")
diff --git a/objectivec/Tests/GPBDictionaryTests+UInt32.m b/objectivec/Tests/GPBDictionaryTests+UInt32.m
index f607538..854d49b 100644
--- a/objectivec/Tests/GPBDictionaryTests+UInt32.m
+++ b/objectivec/Tests/GPBDictionaryTests+UInt32.m
@@ -34,7 +34,10 @@
#import "GPBDictionary.h"
#import "GPBTestUtilities.h"
-#import "google/protobuf/UnittestRuntimeProto2.pbobjc.h"
+#import "objectivec/Tests/UnittestRuntimeProto2.pbobjc.h"
+
+// Disable clang-format for the macros.
+// clang-format off
// Pull in the macros (using an external file because expanding all tests
// in a single file makes a file that is failing to work with within Xcode.
@@ -42,7 +45,6 @@
//%PDDM-EXPAND TEST_FOR_POD_KEY(UInt32, uint32_t, 1U, 2U, 3U, 4U)
// This block of code is generated, do not edit it directly.
-// clang-format off
// To let the testing macros work, add some extra methods to simplify things.
@interface GPBUInt32EnumDictionary (TestingTweak)
@@ -87,8 +89,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getUInt32:NULL forKey:1U]);
- [dict enumerateKeysAndUInt32sUsingBlock:^(uint32_t aKey, uint32_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndUInt32sUsingBlock:^(__unused uint32_t aKey, __unused uint32_t aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -158,8 +159,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndUInt32sUsingBlock:^(uint32_t aKey, uint32_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndUInt32sUsingBlock:^(__unused uint32_t aKey, __unused uint32_t aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -448,8 +448,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getInt32:NULL forKey:1U]);
- [dict enumerateKeysAndInt32sUsingBlock:^(uint32_t aKey, int32_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndInt32sUsingBlock:^(__unused uint32_t aKey, __unused int32_t aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -519,8 +518,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndInt32sUsingBlock:^(uint32_t aKey, int32_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndInt32sUsingBlock:^(__unused uint32_t aKey, __unused int32_t aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -809,8 +807,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getUInt64:NULL forKey:1U]);
- [dict enumerateKeysAndUInt64sUsingBlock:^(uint32_t aKey, uint64_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndUInt64sUsingBlock:^(__unused uint32_t aKey, __unused uint64_t aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -880,8 +877,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndUInt64sUsingBlock:^(uint32_t aKey, uint64_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndUInt64sUsingBlock:^(__unused uint32_t aKey, __unused uint64_t aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -1170,8 +1166,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getInt64:NULL forKey:1U]);
- [dict enumerateKeysAndInt64sUsingBlock:^(uint32_t aKey, int64_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndInt64sUsingBlock:^(__unused uint32_t aKey, __unused int64_t aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -1241,8 +1236,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndInt64sUsingBlock:^(uint32_t aKey, int64_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndInt64sUsingBlock:^(__unused uint32_t aKey, __unused int64_t aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -1531,8 +1525,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getBool:NULL forKey:1U]);
- [dict enumerateKeysAndBoolsUsingBlock:^(uint32_t aKey, BOOL aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndBoolsUsingBlock:^(__unused uint32_t aKey, __unused BOOL aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -1602,8 +1595,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndBoolsUsingBlock:^(uint32_t aKey, BOOL aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndBoolsUsingBlock:^(__unused uint32_t aKey, __unused BOOL aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -1892,8 +1884,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getFloat:NULL forKey:1U]);
- [dict enumerateKeysAndFloatsUsingBlock:^(uint32_t aKey, float aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndFloatsUsingBlock:^(__unused uint32_t aKey, __unused float aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -1963,8 +1954,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndFloatsUsingBlock:^(uint32_t aKey, float aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndFloatsUsingBlock:^(__unused uint32_t aKey, __unused float aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -2253,8 +2243,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getDouble:NULL forKey:1U]);
- [dict enumerateKeysAndDoublesUsingBlock:^(uint32_t aKey, double aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndDoublesUsingBlock:^(__unused uint32_t aKey, __unused double aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -2324,8 +2313,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndDoublesUsingBlock:^(uint32_t aKey, double aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndDoublesUsingBlock:^(__unused uint32_t aKey, __unused double aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -2614,8 +2602,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getEnum:NULL forKey:1U]);
- [dict enumerateKeysAndEnumsUsingBlock:^(uint32_t aKey, int32_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndEnumsUsingBlock:^(__unused uint32_t aKey, __unused int32_t aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -2685,8 +2672,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndEnumsUsingBlock:^(uint32_t aKey, int32_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndEnumsUsingBlock:^(__unused uint32_t aKey, __unused int32_t aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -3043,8 +3029,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndRawValuesUsingBlock:^(uint32_t aKey, int32_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndRawValuesUsingBlock:^(__unused uint32_t aKey, __unused int32_t aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -3393,8 +3378,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertNil([dict objectForKey:1U]);
- [dict enumerateKeysAndObjectsUsingBlock:^(uint32_t aKey, NSString* aObject, BOOL *stop) {
- #pragma unused(aKey, aObject, stop)
+ [dict enumerateKeysAndObjectsUsingBlock:^(__unused uint32_t aKey, __unused NSString* aObject, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -3454,8 +3438,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndObjectsUsingBlock:^(uint32_t aKey, NSString* aObject, BOOL *stop) {
- #pragma unused(aKey, aObject)
+ [dict enumerateKeysAndObjectsUsingBlock:^(__unused uint32_t aKey, __unused NSString* aObject, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -3673,6 +3656,5 @@
@end
-// clang-format on
//%PDDM-EXPAND-END TEST_FOR_POD_KEY(UInt32, uint32_t, 1U, 2U, 3U, 4U)
diff --git a/objectivec/Tests/GPBDictionaryTests+UInt64.m b/objectivec/Tests/GPBDictionaryTests+UInt64.m
index b5dd91e..fe7d4fc 100644
--- a/objectivec/Tests/GPBDictionaryTests+UInt64.m
+++ b/objectivec/Tests/GPBDictionaryTests+UInt64.m
@@ -34,7 +34,10 @@
#import "GPBDictionary.h"
#import "GPBTestUtilities.h"
-#import "google/protobuf/UnittestRuntimeProto2.pbobjc.h"
+#import "objectivec/Tests/UnittestRuntimeProto2.pbobjc.h"
+
+// Disable clang-format for the macros.
+// clang-format off
// Pull in the macros (using an external file because expanding all tests
// in a single file makes a file that is failing to work with within Xcode.
@@ -42,7 +45,6 @@
//%PDDM-EXPAND TEST_FOR_POD_KEY(UInt64, uint64_t, 31ULL, 32ULL, 33ULL, 34ULL)
// This block of code is generated, do not edit it directly.
-// clang-format off
// To let the testing macros work, add some extra methods to simplify things.
@interface GPBUInt64EnumDictionary (TestingTweak)
@@ -87,8 +89,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getUInt32:NULL forKey:31ULL]);
- [dict enumerateKeysAndUInt32sUsingBlock:^(uint64_t aKey, uint32_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndUInt32sUsingBlock:^(__unused uint64_t aKey, __unused uint32_t aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -158,8 +159,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndUInt32sUsingBlock:^(uint64_t aKey, uint32_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndUInt32sUsingBlock:^(__unused uint64_t aKey, __unused uint32_t aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -448,8 +448,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getInt32:NULL forKey:31ULL]);
- [dict enumerateKeysAndInt32sUsingBlock:^(uint64_t aKey, int32_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndInt32sUsingBlock:^(__unused uint64_t aKey, __unused int32_t aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -519,8 +518,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndInt32sUsingBlock:^(uint64_t aKey, int32_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndInt32sUsingBlock:^(__unused uint64_t aKey, __unused int32_t aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -809,8 +807,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getUInt64:NULL forKey:31ULL]);
- [dict enumerateKeysAndUInt64sUsingBlock:^(uint64_t aKey, uint64_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndUInt64sUsingBlock:^(__unused uint64_t aKey, __unused uint64_t aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -880,8 +877,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndUInt64sUsingBlock:^(uint64_t aKey, uint64_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndUInt64sUsingBlock:^(__unused uint64_t aKey, __unused uint64_t aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -1170,8 +1166,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getInt64:NULL forKey:31ULL]);
- [dict enumerateKeysAndInt64sUsingBlock:^(uint64_t aKey, int64_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndInt64sUsingBlock:^(__unused uint64_t aKey, __unused int64_t aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -1241,8 +1236,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndInt64sUsingBlock:^(uint64_t aKey, int64_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndInt64sUsingBlock:^(__unused uint64_t aKey, __unused int64_t aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -1531,8 +1525,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getBool:NULL forKey:31ULL]);
- [dict enumerateKeysAndBoolsUsingBlock:^(uint64_t aKey, BOOL aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndBoolsUsingBlock:^(__unused uint64_t aKey, __unused BOOL aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -1602,8 +1595,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndBoolsUsingBlock:^(uint64_t aKey, BOOL aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndBoolsUsingBlock:^(__unused uint64_t aKey, __unused BOOL aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -1892,8 +1884,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getFloat:NULL forKey:31ULL]);
- [dict enumerateKeysAndFloatsUsingBlock:^(uint64_t aKey, float aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndFloatsUsingBlock:^(__unused uint64_t aKey, __unused float aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -1963,8 +1954,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndFloatsUsingBlock:^(uint64_t aKey, float aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndFloatsUsingBlock:^(__unused uint64_t aKey, __unused float aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -2253,8 +2243,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getDouble:NULL forKey:31ULL]);
- [dict enumerateKeysAndDoublesUsingBlock:^(uint64_t aKey, double aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndDoublesUsingBlock:^(__unused uint64_t aKey, __unused double aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -2324,8 +2313,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndDoublesUsingBlock:^(uint64_t aKey, double aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndDoublesUsingBlock:^(__unused uint64_t aKey, __unused double aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -2614,8 +2602,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertFalse([dict getEnum:NULL forKey:31ULL]);
- [dict enumerateKeysAndEnumsUsingBlock:^(uint64_t aKey, int32_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue, stop)
+ [dict enumerateKeysAndEnumsUsingBlock:^(__unused uint64_t aKey, __unused int32_t aValue, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -2685,8 +2672,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndEnumsUsingBlock:^(uint64_t aKey, int32_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndEnumsUsingBlock:^(__unused uint64_t aKey, __unused int32_t aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -3043,8 +3029,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndRawValuesUsingBlock:^(uint64_t aKey, int32_t aValue, BOOL *stop) {
- #pragma unused(aKey, aValue)
+ [dict enumerateKeysAndRawValuesUsingBlock:^(__unused uint64_t aKey, __unused int32_t aValue, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -3393,8 +3378,7 @@
XCTAssertNotNil(dict);
XCTAssertEqual(dict.count, 0U);
XCTAssertNil([dict objectForKey:31ULL]);
- [dict enumerateKeysAndObjectsUsingBlock:^(uint64_t aKey, NSString* aObject, BOOL *stop) {
- #pragma unused(aKey, aObject, stop)
+ [dict enumerateKeysAndObjectsUsingBlock:^(__unused uint64_t aKey, __unused NSString* aObject, __unused BOOL *stop) {
XCTFail(@"Shouldn't get here!");
}];
[dict release];
@@ -3454,8 +3438,7 @@
// Stopping the enumeration.
idx = 0;
- [dict enumerateKeysAndObjectsUsingBlock:^(uint64_t aKey, NSString* aObject, BOOL *stop) {
- #pragma unused(aKey, aObject)
+ [dict enumerateKeysAndObjectsUsingBlock:^(__unused uint64_t aKey, __unused NSString* aObject, BOOL *stop) {
if (idx == 1) *stop = YES;
XCTAssertNotEqual(idx, 2U);
++idx;
@@ -3673,5 +3656,4 @@
@end
-// clang-format on
//%PDDM-EXPAND-END TEST_FOR_POD_KEY(UInt64, uint64_t, 31ULL, 32ULL, 33ULL, 34ULL)
diff --git a/objectivec/Tests/GPBDictionaryTests.m b/objectivec/Tests/GPBDictionaryTests.m
index 52b4b32..e5670d8 100644
--- a/objectivec/Tests/GPBDictionaryTests.m
+++ b/objectivec/Tests/GPBDictionaryTests.m
@@ -56,17 +56,17 @@
XCTAssertTrue([dict isEqual:@{}]);
XCTAssertTrue([dict isEqualToDictionary:@{}]);
- XCTAssertFalse([dict isEqual:@{ @"foo" : @"bar" }]);
- XCTAssertFalse([dict isEqualToDictionary:@{ @"foo" : @"bar" }]);
+ XCTAssertFalse([dict isEqual:@{@"foo" : @"bar"}]);
+ XCTAssertFalse([dict isEqualToDictionary:@{@"foo" : @"bar"}]);
[dict setObject:@"bar" forKey:@"foo"];
XCTAssertFalse([dict isEqual:@{}]);
XCTAssertFalse([dict isEqualToDictionary:@{}]);
- XCTAssertTrue([dict isEqual:@{ @"foo" : @"bar" }]);
- XCTAssertTrue([dict isEqualToDictionary:@{ @"foo" : @"bar" }]);
- XCTAssertFalse([dict isEqual:@{ @"bar" : @"baz" }]);
- XCTAssertFalse([dict isEqualToDictionary:@{ @"bar" : @"baz" }]);
+ XCTAssertTrue([dict isEqual:@{@"foo" : @"bar"}]);
+ XCTAssertTrue([dict isEqualToDictionary:@{@"foo" : @"bar"}]);
+ XCTAssertFalse([dict isEqual:@{@"bar" : @"baz"}]);
+ XCTAssertFalse([dict isEqualToDictionary:@{@"bar" : @"baz"}]);
GPBAutocreatedDictionary *dict2 = [[GPBAutocreatedDictionary alloc] init];
@@ -90,14 +90,14 @@
GPBAutocreatedDictionary *dict = [[GPBAutocreatedDictionary alloc] init];
NSDictionary *cpy = [dict copy];
- XCTAssertTrue(cpy != dict); // Ptr compare
+ XCTAssertTrue(cpy != dict); // Ptr compare
XCTAssertTrue([cpy isKindOfClass:[NSDictionary class]]);
XCTAssertFalse([cpy isKindOfClass:[GPBAutocreatedDictionary class]]);
XCTAssertEqual(cpy.count, (NSUInteger)0);
NSDictionary *cpy2 = [dict copy];
- XCTAssertTrue(cpy2 != dict); // Ptr compare
- XCTAssertTrue(cpy2 != cpy); // Ptr compare
+ XCTAssertTrue(cpy2 != dict); // Ptr compare
+ XCTAssertTrue(cpy2 != cpy); // Ptr compare
XCTAssertTrue([cpy2 isKindOfClass:[NSDictionary class]]);
XCTAssertFalse([cpy2 isKindOfClass:[GPBAutocreatedDictionary class]]);
XCTAssertEqual(cpy2.count, (NSUInteger)0);
@@ -111,14 +111,14 @@
GPBAutocreatedDictionary *dict = [[GPBAutocreatedDictionary alloc] init];
NSMutableDictionary *cpy = [dict mutableCopy];
- XCTAssertTrue(cpy != dict); // Ptr compare
+ XCTAssertTrue(cpy != dict); // Ptr compare
XCTAssertTrue([cpy isKindOfClass:[NSMutableDictionary class]]);
XCTAssertFalse([cpy isKindOfClass:[GPBAutocreatedDictionary class]]);
XCTAssertEqual(cpy.count, (NSUInteger)0);
NSMutableDictionary *cpy2 = [dict mutableCopy];
- XCTAssertTrue(cpy2 != dict); // Ptr compare
- XCTAssertTrue(cpy2 != cpy); // Ptr compare
+ XCTAssertTrue(cpy2 != dict); // Ptr compare
+ XCTAssertTrue(cpy2 != cpy); // Ptr compare
XCTAssertTrue([cpy2 isKindOfClass:[NSMutableDictionary class]]);
XCTAssertFalse([cpy2 isKindOfClass:[GPBAutocreatedDictionary class]]);
XCTAssertEqual(cpy2.count, (NSUInteger)0);
@@ -134,7 +134,7 @@
dict[@"baz"] = @"mumble";
NSDictionary *cpy = [dict copy];
- XCTAssertTrue(cpy != dict); // Ptr compare
+ XCTAssertTrue(cpy != dict); // Ptr compare
XCTAssertTrue([cpy isKindOfClass:[NSDictionary class]]);
XCTAssertFalse([cpy isKindOfClass:[GPBAutocreatedDictionary class]]);
XCTAssertEqual(cpy.count, (NSUInteger)2);
@@ -142,8 +142,8 @@
XCTAssertEqualObjects(cpy[@"baz"], @"mumble");
NSDictionary *cpy2 = [dict copy];
- XCTAssertTrue(cpy2 != dict); // Ptr compare
- XCTAssertTrue(cpy2 != cpy); // Ptr compare
+ XCTAssertTrue(cpy2 != dict); // Ptr compare
+ XCTAssertTrue(cpy2 != cpy); // Ptr compare
XCTAssertTrue([cpy2 isKindOfClass:[NSDictionary class]]);
XCTAssertFalse([cpy2 isKindOfClass:[GPBAutocreatedDictionary class]]);
XCTAssertEqual(cpy2.count, (NSUInteger)2);
@@ -161,7 +161,7 @@
dict[@"baz"] = @"mumble";
NSMutableDictionary *cpy = [dict mutableCopy];
- XCTAssertTrue(cpy != dict); // Ptr compare
+ XCTAssertTrue(cpy != dict); // Ptr compare
XCTAssertTrue([cpy isKindOfClass:[NSMutableDictionary class]]);
XCTAssertFalse([cpy isKindOfClass:[GPBAutocreatedDictionary class]]);
XCTAssertEqual(cpy.count, (NSUInteger)2);
@@ -169,8 +169,8 @@
XCTAssertEqualObjects(cpy[@"baz"], @"mumble");
NSMutableDictionary *cpy2 = [dict mutableCopy];
- XCTAssertTrue(cpy2 != dict); // Ptr compare
- XCTAssertTrue(cpy2 != cpy); // Ptr compare
+ XCTAssertTrue(cpy2 != dict); // Ptr compare
+ XCTAssertTrue(cpy2 != cpy); // Ptr compare
XCTAssertTrue([cpy2 isKindOfClass:[NSMutableDictionary class]]);
XCTAssertFalse([cpy2 isKindOfClass:[GPBAutocreatedDictionary class]]);
XCTAssertEqual(cpy2.count, (NSUInteger)2);
diff --git a/objectivec/Tests/GPBDictionaryTests.pddm b/objectivec/Tests/GPBDictionaryTests.pddm
index 17f12c2..11c08ec 100644
--- a/objectivec/Tests/GPBDictionaryTests.pddm
+++ b/objectivec/Tests/GPBDictionaryTests.pddm
@@ -70,8 +70,7 @@
//% XCTAssertNotNil(dict);
//% XCTAssertEqual(dict.count, 0U);
//%VALUE_NOT_FOUND##VHELPER(VALUE_NAME, dict, KEY1)
-//% [dict enumerateKeysAnd##VALUE_NAME$u##sUsingBlock:^(KEY_TYPE KisP##aKey, VALUE_TYPE a##VNAME$u, BOOL *stop) {
-//% #pragma unused(aKey, a##VNAME$u, stop)
+//% [dict enumerateKeysAnd##VALUE_NAME$u##sUsingBlock:^(__unused KEY_TYPE KisP##aKey, __unused VALUE_TYPE a##VNAME$u, __unused BOOL *stop) {
//% XCTFail(@"Shouldn't get here!");
//% }];
//% [dict release];
@@ -131,8 +130,7 @@
//%
//% // Stopping the enumeration.
//% idx = 0;
-//% [dict enumerateKeysAnd##VALUE_NAME$u##sUsingBlock:^(KEY_TYPE KisP##aKey, VALUE_TYPE a##VNAME$u, BOOL *stop) {
-//% #pragma unused(aKey, a##VNAME$u)
+//% [dict enumerateKeysAnd##VALUE_NAME$u##sUsingBlock:^(__unused KEY_TYPE KisP##aKey, __unused VALUE_TYPE a##VNAME$u, BOOL *stop) {
//% if (idx == 1) *stop = YES;
//% XCTAssertNotEqual(idx, 2U);
//% ++idx;
@@ -425,8 +423,7 @@
//%
//% // Stopping the enumeration.
//% idx = 0;
-//% [dict enumerateKeysAndRawValuesUsingBlock:^(KEY_TYPE KisP##aKey, VALUE_TYPE aValue, BOOL *stop) {
-//% #pragma unused(aKey, aValue)
+//% [dict enumerateKeysAndRawValuesUsingBlock:^(__unused KEY_TYPE KisP##aKey, __unused VALUE_TYPE aValue, BOOL *stop) {
//% if (idx == 1) *stop = YES;
//% XCTAssertNotEqual(idx, 2U);
//% ++idx;
@@ -790,8 +787,7 @@
//% XCTAssertNotNil(dict);
//% XCTAssertEqual(dict.count, 0U);
//%VALUE_NOT_FOUND##VHELPER(VALUE_NAME, dict, KEY1)
-//% [dict enumerateKeysAnd##VALUE_NAME##sUsingBlock:^(KEY_TYPE KisP##aKey, VALUE_TYPE a##VNAME$u##, BOOL *stop) {
-//% #pragma unused(aKey, a##VNAME$u##, stop)
+//% [dict enumerateKeysAnd##VALUE_NAME##sUsingBlock:^(__unused KEY_TYPE KisP##aKey, __unused VALUE_TYPE a##VNAME$u##, __unused BOOL *stop) {
//% XCTFail(@"Shouldn't get here!");
//% }];
//% [dict release];
@@ -849,8 +845,7 @@
//%
//% // Stopping the enumeration.
//% idx = 0;
-//% [dict enumerateKeysAnd##VALUE_NAME$u##sUsingBlock:^(KEY_TYPE KisP##aKey, VALUE_TYPE a##VNAME$u##, BOOL *stop) {
-//% #pragma unused(aKey, a##VNAME$u)
+//% [dict enumerateKeysAnd##VALUE_NAME$u##sUsingBlock:^(__unused KEY_TYPE KisP##aKey, __unused VALUE_TYPE a##VNAME$u##, BOOL *stop) {
//% if (idx == 0) *stop = YES;
//% XCTAssertNotEqual(idx, 2U);
//% ++idx;
diff --git a/objectivec/Tests/GPBExtensionRegistryTest.m b/objectivec/Tests/GPBExtensionRegistryTest.m
index b116882..bdd237b 100644
--- a/objectivec/Tests/GPBExtensionRegistryTest.m
+++ b/objectivec/Tests/GPBExtensionRegistryTest.m
@@ -31,7 +31,7 @@
#import "GPBTestUtilities.h"
#import "GPBExtensionRegistry.h"
-#import "google/protobuf/Unittest.pbobjc.h"
+#import "objectivec/Tests/Unittest.pbobjc.h"
@interface GPBExtensionRegistryTest : GPBTestCase
@end
@@ -42,20 +42,17 @@
GPBExtensionRegistry *reg = [[[GPBExtensionRegistry alloc] init] autorelease];
XCTAssertNotNil(reg);
- XCTAssertNil([reg extensionForDescriptor:[TestAllExtensions descriptor]
- fieldNumber:1]);
- XCTAssertNil([reg extensionForDescriptor:[TestAllTypes descriptor]
- fieldNumber:1]);
+ XCTAssertNil([reg extensionForDescriptor:[TestAllExtensions descriptor] fieldNumber:1]);
+ XCTAssertNil([reg extensionForDescriptor:[TestAllTypes descriptor] fieldNumber:1]);
[reg addExtension:[UnittestRoot optionalInt32Extension]];
[reg addExtension:[UnittestRoot packedInt64Extension]];
XCTAssertTrue([reg extensionForDescriptor:[TestAllExtensions descriptor] fieldNumber:1] ==
- [UnittestRoot optionalInt32Extension]); // ptr equality
- XCTAssertNil([reg extensionForDescriptor:[TestAllTypes descriptor]
- fieldNumber:1]);
+ [UnittestRoot optionalInt32Extension]); // ptr equality
+ XCTAssertNil([reg extensionForDescriptor:[TestAllTypes descriptor] fieldNumber:1]);
XCTAssertTrue([reg extensionForDescriptor:[TestPackedExtensions descriptor] fieldNumber:91] ==
- [UnittestRoot packedInt64Extension]); // ptr equality
+ [UnittestRoot packedInt64Extension]); // ptr equality
}
- (void)testCopy {
@@ -66,9 +63,9 @@
XCTAssertNotNil(reg2);
XCTAssertTrue([reg1 extensionForDescriptor:[TestAllExtensions descriptor] fieldNumber:1] ==
- [UnittestRoot optionalInt32Extension]); // ptr equality
+ [UnittestRoot optionalInt32Extension]); // ptr equality
XCTAssertTrue([reg2 extensionForDescriptor:[TestAllExtensions descriptor] fieldNumber:1] ==
- [UnittestRoot optionalInt32Extension]); // ptr equality
+ [UnittestRoot optionalInt32Extension]); // ptr equality
// Message class that had registered extension(s) at the -copy time.
@@ -76,11 +73,11 @@
[reg2 addExtension:[UnittestRoot optionalStringExtension]];
XCTAssertTrue([reg1 extensionForDescriptor:[TestAllExtensions descriptor] fieldNumber:13] ==
- [UnittestRoot optionalBoolExtension]); // ptr equality
+ [UnittestRoot optionalBoolExtension]); // ptr equality
XCTAssertNil([reg1 extensionForDescriptor:[TestAllExtensions descriptor] fieldNumber:14]);
XCTAssertNil([reg2 extensionForDescriptor:[TestAllExtensions descriptor] fieldNumber:13]);
XCTAssertTrue([reg2 extensionForDescriptor:[TestAllExtensions descriptor] fieldNumber:14] ==
- [UnittestRoot optionalStringExtension]); // ptr equality
+ [UnittestRoot optionalStringExtension]); // ptr equality
// Message class that did not have any registered extensions at the -copy time.
@@ -88,12 +85,11 @@
[reg2 addExtension:[UnittestRoot packedSint32Extension]];
XCTAssertTrue([reg1 extensionForDescriptor:[TestPackedExtensions descriptor] fieldNumber:91] ==
- [UnittestRoot packedInt64Extension]); // ptr equality
+ [UnittestRoot packedInt64Extension]); // ptr equality
XCTAssertNil([reg1 extensionForDescriptor:[TestPackedExtensions descriptor] fieldNumber:94]);
XCTAssertNil([reg2 extensionForDescriptor:[TestPackedExtensions descriptor] fieldNumber:91]);
XCTAssertTrue([reg2 extensionForDescriptor:[TestPackedExtensions descriptor] fieldNumber:94] ==
- [UnittestRoot packedSint32Extension]); // ptr equality
-
+ [UnittestRoot packedSint32Extension]); // ptr equality
}
- (void)testAddExtensions {
@@ -102,13 +98,12 @@
GPBExtensionRegistry *reg2 = [[[GPBExtensionRegistry alloc] init] autorelease];
- XCTAssertNil([reg2 extensionForDescriptor:[TestAllExtensions descriptor]
- fieldNumber:1]);
+ XCTAssertNil([reg2 extensionForDescriptor:[TestAllExtensions descriptor] fieldNumber:1]);
[reg2 addExtensions:reg1];
XCTAssertTrue([reg2 extensionForDescriptor:[TestAllExtensions descriptor] fieldNumber:1] ==
- [UnittestRoot optionalInt32Extension]); // ptr equality
+ [UnittestRoot optionalInt32Extension]); // ptr equality
// Confirm adding to the first doesn't add to the second.
@@ -116,9 +111,9 @@
[reg1 addExtension:[UnittestRoot packedInt64Extension]];
XCTAssertTrue([reg1 extensionForDescriptor:[TestAllExtensions descriptor] fieldNumber:13] ==
- [UnittestRoot optionalBoolExtension]); // ptr equality
+ [UnittestRoot optionalBoolExtension]); // ptr equality
XCTAssertTrue([reg1 extensionForDescriptor:[TestPackedExtensions descriptor] fieldNumber:91] ==
- [UnittestRoot packedInt64Extension]); // ptr equality
+ [UnittestRoot packedInt64Extension]); // ptr equality
XCTAssertNil([reg2 extensionForDescriptor:[TestAllExtensions descriptor] fieldNumber:13]);
XCTAssertNil([reg2 extensionForDescriptor:[TestPackedExtensions descriptor] fieldNumber:91]);
@@ -130,9 +125,9 @@
XCTAssertNil([reg1 extensionForDescriptor:[TestAllExtensions descriptor] fieldNumber:14]);
XCTAssertNil([reg1 extensionForDescriptor:[TestPackedExtensions descriptor] fieldNumber:94]);
XCTAssertTrue([reg2 extensionForDescriptor:[TestAllExtensions descriptor] fieldNumber:14] ==
- [UnittestRoot optionalStringExtension]); // ptr equality
+ [UnittestRoot optionalStringExtension]); // ptr equality
XCTAssertTrue([reg2 extensionForDescriptor:[TestPackedExtensions descriptor] fieldNumber:94] ==
- [UnittestRoot packedSint32Extension]); // ptr equality
+ [UnittestRoot packedSint32Extension]); // ptr equality
}
@end
diff --git a/objectivec/Tests/GPBMessageTests+ClassNames.m b/objectivec/Tests/GPBMessageTests+ClassNames.m
index b5a5c51..1b656d0 100644
--- a/objectivec/Tests/GPBMessageTests+ClassNames.m
+++ b/objectivec/Tests/GPBMessageTests+ClassNames.m
@@ -62,15 +62,15 @@
static GPBDescriptor *descriptor = nil;
if (!descriptor) {
static GPBMessageFieldDescription fields[] = {
- {
- .name = "foo",
- .dataTypeSpecific.className = "NSString",
- .number = 1,
- .hasIndex = 0,
- .offset = (uint32_t)offsetof(MessageLackingClazz_storage_, foo),
- .flags = (GPBFieldFlags)(GPBFieldOptional),
- .dataType = GPBDataTypeMessage,
- },
+ {
+ .name = "foo",
+ .dataTypeSpecific.className = "NSString",
+ .number = 1,
+ .hasIndex = 0,
+ .offset = (uint32_t)offsetof(MessageLackingClazz_storage_, foo),
+ .flags = (GPBFieldFlags)(GPBFieldOptional),
+ .dataType = GPBDataTypeMessage,
+ },
};
GPBFileDescriptor *desc =
[[[GPBFileDescriptor alloc] initWithPackage:@"test"
@@ -78,14 +78,14 @@
syntax:GPBFileSyntaxProto3] autorelease];
// GPBDescriptorInitializationFlag_UsesClassRefs intentionally not set here
- descriptor =
- [GPBDescriptor allocDescriptorForClass:[MessageLackingClazz class]
- rootClass:[MessageLackingClazzRoot class]
- file:desc
- fields:fields
- fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
- storageSize:sizeof(MessageLackingClazz_storage_)
- flags:GPBDescriptorInitializationFlag_None];
+ descriptor = [GPBDescriptor
+ allocDescriptorForClass:[MessageLackingClazz class]
+ rootClass:[MessageLackingClazzRoot class]
+ file:desc
+ fields:fields
+ fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
+ storageSize:sizeof(MessageLackingClazz_storage_)
+ flags:GPBDescriptorInitializationFlag_None];
[descriptor setupContainingMessageClassName:"MessageLackingClazz"];
}
return descriptor;
@@ -94,24 +94,24 @@
@implementation MessageLackingClazzRoot
-+ (GPBExtensionRegistry*)extensionRegistry {
++ (GPBExtensionRegistry *)extensionRegistry {
// This is called by +initialize so there is no need to worry
// about thread safety and initialization of registry.
- static GPBExtensionRegistry* registry = nil;
+ static GPBExtensionRegistry *registry = nil;
if (!registry) {
registry = [[GPBExtensionRegistry alloc] init];
static GPBExtensionDescription descriptions[] = {
- {
- .defaultValue.valueMessage = NULL,
- .singletonName = "MessageLackingClazzRoot_ext1",
- .extendedClass.name = "MessageLackingClazz",
- .messageOrGroupClass.name = "MessageLackingClazz",
- .enumDescriptorFunc = NULL,
- .fieldNumber = 1,
- .dataType = GPBDataTypeMessage,
- // GPBExtensionUsesClazz Intentionally not set
- .options = 0,
- },
+ {
+ .defaultValue.valueMessage = NULL,
+ .singletonName = "MessageLackingClazzRoot_ext1",
+ .extendedClass.name = "MessageLackingClazz",
+ .messageOrGroupClass.name = "MessageLackingClazz",
+ .enumDescriptorFunc = NULL,
+ .fieldNumber = 1,
+ .dataType = GPBDataTypeMessage,
+ // GPBExtensionUsesClazz Intentionally not set
+ .options = 0,
+ },
};
for (size_t i = 0; i < sizeof(descriptions) / sizeof(descriptions[0]); ++i) {
// Intentionall using `-initWithExtensionDescription:` and not `
diff --git a/objectivec/Tests/GPBMessageTests+Merge.m b/objectivec/Tests/GPBMessageTests+Merge.m
index f895542..a853419 100644
--- a/objectivec/Tests/GPBMessageTests+Merge.m
+++ b/objectivec/Tests/GPBMessageTests+Merge.m
@@ -34,11 +34,11 @@
#import "GPBMessage.h"
-#import "google/protobuf/MapUnittest.pbobjc.h"
-#import "google/protobuf/Unittest.pbobjc.h"
-#import "google/protobuf/UnittestPreserveUnknownEnum.pbobjc.h"
-#import "google/protobuf/UnittestRuntimeProto2.pbobjc.h"
-#import "google/protobuf/UnittestRuntimeProto3.pbobjc.h"
+#import "objectivec/Tests/MapUnittest.pbobjc.h"
+#import "objectivec/Tests/Unittest.pbobjc.h"
+#import "objectivec/Tests/UnittestPreserveUnknownEnum.pbobjc.h"
+#import "objectivec/Tests/UnittestRuntimeProto2.pbobjc.h"
+#import "objectivec/Tests/UnittestRuntimeProto3.pbobjc.h"
@interface MessageMergeTests : GPBTestCase
@end
@@ -197,9 +197,8 @@
// Known value.
src.e = UnknownEnumsMyEnum_Bar;
- src.repeatedEArray =
- [GPBEnumArray arrayWithValidationFunction:UnknownEnumsMyEnum_IsValidValue
- rawValue:UnknownEnumsMyEnum_Bar];
+ src.repeatedEArray = [GPBEnumArray arrayWithValidationFunction:UnknownEnumsMyEnum_IsValidValue
+ rawValue:UnknownEnumsMyEnum_Bar];
src.repeatedPackedEArray =
[GPBEnumArray arrayWithValidationFunction:UnknownEnumsMyEnum_IsValidValue
rawValue:UnknownEnumsMyEnum_Bar];
@@ -211,8 +210,7 @@
XCTAssertEqual(dst.repeatedEArray.count, 1U);
XCTAssertEqual([dst.repeatedEArray valueAtIndex:0], UnknownEnumsMyEnum_Bar);
XCTAssertEqual(dst.repeatedPackedEArray.count, 1U);
- XCTAssertEqual([dst.repeatedPackedEArray valueAtIndex:0],
- UnknownEnumsMyEnum_Bar);
+ XCTAssertEqual([dst.repeatedPackedEArray valueAtIndex:0], UnknownEnumsMyEnum_Bar);
XCTAssertEqual(dst.oneofE1, UnknownEnumsMyEnum_Bar);
// Unknown value.
@@ -220,9 +218,8 @@
const int32_t kUnknownValue = 666;
SetUnknownEnumsMyMessage_E_RawValue(src, kUnknownValue);
- src.repeatedEArray =
- [GPBEnumArray arrayWithValidationFunction:UnknownEnumsMyEnum_IsValidValue
- rawValue:kUnknownValue];
+ src.repeatedEArray = [GPBEnumArray arrayWithValidationFunction:UnknownEnumsMyEnum_IsValidValue
+ rawValue:kUnknownValue];
src.repeatedPackedEArray =
[GPBEnumArray arrayWithValidationFunction:UnknownEnumsMyEnum_IsValidValue
rawValue:kUnknownValue];
@@ -238,13 +235,11 @@
UnknownEnumsMyEnum_GPBUnrecognizedEnumeratorValue);
XCTAssertEqual([dst.repeatedEArray rawValueAtIndex:1], kUnknownValue);
XCTAssertEqual(dst.repeatedPackedEArray.count, 2U);
- XCTAssertEqual([dst.repeatedPackedEArray valueAtIndex:0],
- UnknownEnumsMyEnum_Bar);
+ XCTAssertEqual([dst.repeatedPackedEArray valueAtIndex:0], UnknownEnumsMyEnum_Bar);
XCTAssertEqual([dst.repeatedPackedEArray valueAtIndex:1],
UnknownEnumsMyEnum_GPBUnrecognizedEnumeratorValue);
XCTAssertEqual([dst.repeatedPackedEArray rawValueAtIndex:1], kUnknownValue);
- XCTAssertEqual(dst.oneofE1,
- UnknownEnumsMyEnum_GPBUnrecognizedEnumeratorValue);
+ XCTAssertEqual(dst.oneofE1, UnknownEnumsMyEnum_GPBUnrecognizedEnumeratorValue);
XCTAssertEqual(UnknownEnumsMyMessage_OneofE1_RawValue(dst), kUnknownValue);
}
@@ -258,6 +253,9 @@
dst.oneofEnum = Message2_Enum_Bar;
+ // Disable clang-format for the macros.
+ // clang-format off
+
//%PDDM-DEFINE MERGE2_TEST(SET_NAME, SET_VALUE, CLEARED_NAME, CLEARED_DEFAULT)
//% src.oneof##SET_NAME = SET_VALUE;
//% [dst mergeFrom:src];
@@ -267,7 +265,6 @@
//%
//%PDDM-EXPAND MERGE2_TEST(Int32, 10, Enum, Message2_Enum_Baz)
// This block of code is generated, do not edit it directly.
-// clang-format off
src.oneofInt32 = 10;
[dst mergeFrom:src];
@@ -275,10 +272,8 @@
XCTAssertEqual(dst.oneofInt32, 10);
XCTAssertEqual(dst.oneofEnum, Message2_Enum_Baz);
-// clang-format on
//%PDDM-EXPAND MERGE2_TEST(Int64, 11, Int32, 100)
// This block of code is generated, do not edit it directly.
-// clang-format off
src.oneofInt64 = 11;
[dst mergeFrom:src];
@@ -286,10 +281,8 @@
XCTAssertEqual(dst.oneofInt64, 11);
XCTAssertEqual(dst.oneofInt32, 100);
-// clang-format on
//%PDDM-EXPAND MERGE2_TEST(Uint32, 12U, Int64, 101)
// This block of code is generated, do not edit it directly.
-// clang-format off
src.oneofUint32 = 12U;
[dst mergeFrom:src];
@@ -297,10 +290,8 @@
XCTAssertEqual(dst.oneofUint32, 12U);
XCTAssertEqual(dst.oneofInt64, 101);
-// clang-format on
//%PDDM-EXPAND MERGE2_TEST(Uint64, 13U, Uint32, 102U)
// This block of code is generated, do not edit it directly.
-// clang-format off
src.oneofUint64 = 13U;
[dst mergeFrom:src];
@@ -308,10 +299,8 @@
XCTAssertEqual(dst.oneofUint64, 13U);
XCTAssertEqual(dst.oneofUint32, 102U);
-// clang-format on
//%PDDM-EXPAND MERGE2_TEST(Sint32, 14, Uint64, 103U)
// This block of code is generated, do not edit it directly.
-// clang-format off
src.oneofSint32 = 14;
[dst mergeFrom:src];
@@ -319,10 +308,8 @@
XCTAssertEqual(dst.oneofSint32, 14);
XCTAssertEqual(dst.oneofUint64, 103U);
-// clang-format on
//%PDDM-EXPAND MERGE2_TEST(Sint64, 15, Sint32, 104)
// This block of code is generated, do not edit it directly.
-// clang-format off
src.oneofSint64 = 15;
[dst mergeFrom:src];
@@ -330,10 +317,8 @@
XCTAssertEqual(dst.oneofSint64, 15);
XCTAssertEqual(dst.oneofSint32, 104);
-// clang-format on
//%PDDM-EXPAND MERGE2_TEST(Fixed32, 16U, Sint64, 105)
// This block of code is generated, do not edit it directly.
-// clang-format off
src.oneofFixed32 = 16U;
[dst mergeFrom:src];
@@ -341,10 +326,8 @@
XCTAssertEqual(dst.oneofFixed32, 16U);
XCTAssertEqual(dst.oneofSint64, 105);
-// clang-format on
//%PDDM-EXPAND MERGE2_TEST(Fixed64, 17U, Fixed32, 106U)
// This block of code is generated, do not edit it directly.
-// clang-format off
src.oneofFixed64 = 17U;
[dst mergeFrom:src];
@@ -352,10 +335,8 @@
XCTAssertEqual(dst.oneofFixed64, 17U);
XCTAssertEqual(dst.oneofFixed32, 106U);
-// clang-format on
//%PDDM-EXPAND MERGE2_TEST(Sfixed32, 18, Fixed64, 107U)
// This block of code is generated, do not edit it directly.
-// clang-format off
src.oneofSfixed32 = 18;
[dst mergeFrom:src];
@@ -363,10 +344,8 @@
XCTAssertEqual(dst.oneofSfixed32, 18);
XCTAssertEqual(dst.oneofFixed64, 107U);
-// clang-format on
//%PDDM-EXPAND MERGE2_TEST(Sfixed64, 19, Sfixed32, 108)
// This block of code is generated, do not edit it directly.
-// clang-format off
src.oneofSfixed64 = 19;
[dst mergeFrom:src];
@@ -374,10 +353,8 @@
XCTAssertEqual(dst.oneofSfixed64, 19);
XCTAssertEqual(dst.oneofSfixed32, 108);
-// clang-format on
//%PDDM-EXPAND MERGE2_TEST(Float, 20.0f, Sfixed64, 109)
// This block of code is generated, do not edit it directly.
-// clang-format off
src.oneofFloat = 20.0f;
[dst mergeFrom:src];
@@ -385,10 +362,8 @@
XCTAssertEqual(dst.oneofFloat, 20.0f);
XCTAssertEqual(dst.oneofSfixed64, 109);
-// clang-format on
//%PDDM-EXPAND MERGE2_TEST(Double, 21.0, Float, 110.0f)
// This block of code is generated, do not edit it directly.
-// clang-format off
src.oneofDouble = 21.0;
[dst mergeFrom:src];
@@ -396,10 +371,8 @@
XCTAssertEqual(dst.oneofDouble, 21.0);
XCTAssertEqual(dst.oneofFloat, 110.0f);
-// clang-format on
//%PDDM-EXPAND MERGE2_TEST(Bool, NO, Double, 111.0)
// This block of code is generated, do not edit it directly.
-// clang-format off
src.oneofBool = NO;
[dst mergeFrom:src];
@@ -407,10 +380,8 @@
XCTAssertEqual(dst.oneofBool, NO);
XCTAssertEqual(dst.oneofDouble, 111.0);
-// clang-format on
//%PDDM-EXPAND MERGE2_TEST(Enum, Message2_Enum_Bar, Bool, YES)
// This block of code is generated, do not edit it directly.
-// clang-format off
src.oneofEnum = Message2_Enum_Bar;
[dst mergeFrom:src];
@@ -418,9 +389,10 @@
XCTAssertEqual(dst.oneofEnum, Message2_Enum_Bar);
XCTAssertEqual(dst.oneofBool, YES);
-// clang-format on
//%PDDM-EXPAND-END (14 expansions)
+ // clang-format on
+
NSString *oneofStringDefault = @"string";
NSData *oneofBytesDefault = [@"data" dataUsingEncoding:NSUTF8StringEncoding];
@@ -433,8 +405,7 @@
src.oneofBytes = [@"bar" dataUsingEncoding:NSUTF8StringEncoding];
[dst mergeFrom:src];
XCTAssertEqual(dst.oOneOfCase, Message2_O_OneOfCase_OneofBytes);
- XCTAssertEqualObjects(dst.oneofBytes,
- [@"bar" dataUsingEncoding:NSUTF8StringEncoding]);
+ XCTAssertEqualObjects(dst.oneofBytes, [@"bar" dataUsingEncoding:NSUTF8StringEncoding]);
XCTAssertEqualObjects(dst.oneofString, oneofStringDefault);
Message2_OneofGroup *group = [Message2_OneofGroup message];
@@ -506,6 +477,9 @@
dst.oneofEnum = Message3_Enum_Bar;
+ // Disable clang-format for the macros.
+ // clang-format off
+
//%PDDM-DEFINE MERGE3_TEST(SET_NAME, SET_VALUE, CLEARED_NAME, CLEARED_DEFAULT)
//% src.oneof##SET_NAME = SET_VALUE;
//% [dst mergeFrom:src];
@@ -515,7 +489,6 @@
//%
//%PDDM-EXPAND MERGE3_TEST(Int32, 10, Enum, Message3_Enum_Foo)
// This block of code is generated, do not edit it directly.
-// clang-format off
src.oneofInt32 = 10;
[dst mergeFrom:src];
@@ -523,10 +496,8 @@
XCTAssertEqual(dst.oneofInt32, 10);
XCTAssertEqual(dst.oneofEnum, Message3_Enum_Foo);
-// clang-format on
//%PDDM-EXPAND MERGE3_TEST(Int64, 11, Int32, 0)
// This block of code is generated, do not edit it directly.
-// clang-format off
src.oneofInt64 = 11;
[dst mergeFrom:src];
@@ -534,10 +505,8 @@
XCTAssertEqual(dst.oneofInt64, 11);
XCTAssertEqual(dst.oneofInt32, 0);
-// clang-format on
//%PDDM-EXPAND MERGE3_TEST(Uint32, 12U, Int64, 0)
// This block of code is generated, do not edit it directly.
-// clang-format off
src.oneofUint32 = 12U;
[dst mergeFrom:src];
@@ -545,10 +514,8 @@
XCTAssertEqual(dst.oneofUint32, 12U);
XCTAssertEqual(dst.oneofInt64, 0);
-// clang-format on
//%PDDM-EXPAND MERGE3_TEST(Uint64, 13U, Uint32, 0U)
// This block of code is generated, do not edit it directly.
-// clang-format off
src.oneofUint64 = 13U;
[dst mergeFrom:src];
@@ -556,10 +523,8 @@
XCTAssertEqual(dst.oneofUint64, 13U);
XCTAssertEqual(dst.oneofUint32, 0U);
-// clang-format on
//%PDDM-EXPAND MERGE3_TEST(Sint32, 14, Uint64, 0U)
// This block of code is generated, do not edit it directly.
-// clang-format off
src.oneofSint32 = 14;
[dst mergeFrom:src];
@@ -567,10 +532,8 @@
XCTAssertEqual(dst.oneofSint32, 14);
XCTAssertEqual(dst.oneofUint64, 0U);
-// clang-format on
//%PDDM-EXPAND MERGE3_TEST(Sint64, 15, Sint32, 0)
// This block of code is generated, do not edit it directly.
-// clang-format off
src.oneofSint64 = 15;
[dst mergeFrom:src];
@@ -578,10 +541,8 @@
XCTAssertEqual(dst.oneofSint64, 15);
XCTAssertEqual(dst.oneofSint32, 0);
-// clang-format on
//%PDDM-EXPAND MERGE3_TEST(Fixed32, 16U, Sint64, 0)
// This block of code is generated, do not edit it directly.
-// clang-format off
src.oneofFixed32 = 16U;
[dst mergeFrom:src];
@@ -589,10 +550,8 @@
XCTAssertEqual(dst.oneofFixed32, 16U);
XCTAssertEqual(dst.oneofSint64, 0);
-// clang-format on
//%PDDM-EXPAND MERGE3_TEST(Fixed64, 17U, Fixed32, 0U)
// This block of code is generated, do not edit it directly.
-// clang-format off
src.oneofFixed64 = 17U;
[dst mergeFrom:src];
@@ -600,10 +559,8 @@
XCTAssertEqual(dst.oneofFixed64, 17U);
XCTAssertEqual(dst.oneofFixed32, 0U);
-// clang-format on
//%PDDM-EXPAND MERGE3_TEST(Sfixed32, 18, Fixed64, 0U)
// This block of code is generated, do not edit it directly.
-// clang-format off
src.oneofSfixed32 = 18;
[dst mergeFrom:src];
@@ -611,10 +568,8 @@
XCTAssertEqual(dst.oneofSfixed32, 18);
XCTAssertEqual(dst.oneofFixed64, 0U);
-// clang-format on
//%PDDM-EXPAND MERGE3_TEST(Sfixed64, 19, Sfixed32, 0)
// This block of code is generated, do not edit it directly.
-// clang-format off
src.oneofSfixed64 = 19;
[dst mergeFrom:src];
@@ -622,10 +577,8 @@
XCTAssertEqual(dst.oneofSfixed64, 19);
XCTAssertEqual(dst.oneofSfixed32, 0);
-// clang-format on
//%PDDM-EXPAND MERGE3_TEST(Float, 20.0f, Sfixed64, 0)
// This block of code is generated, do not edit it directly.
-// clang-format off
src.oneofFloat = 20.0f;
[dst mergeFrom:src];
@@ -633,10 +586,8 @@
XCTAssertEqual(dst.oneofFloat, 20.0f);
XCTAssertEqual(dst.oneofSfixed64, 0);
-// clang-format on
//%PDDM-EXPAND MERGE3_TEST(Double, 21.0, Float, 0.0f)
// This block of code is generated, do not edit it directly.
-// clang-format off
src.oneofDouble = 21.0;
[dst mergeFrom:src];
@@ -644,10 +595,8 @@
XCTAssertEqual(dst.oneofDouble, 21.0);
XCTAssertEqual(dst.oneofFloat, 0.0f);
-// clang-format on
//%PDDM-EXPAND MERGE3_TEST(Bool, YES, Double, 0.0)
// This block of code is generated, do not edit it directly.
-// clang-format off
src.oneofBool = YES;
[dst mergeFrom:src];
@@ -655,10 +604,8 @@
XCTAssertEqual(dst.oneofBool, YES);
XCTAssertEqual(dst.oneofDouble, 0.0);
-// clang-format on
//%PDDM-EXPAND MERGE3_TEST(Enum, Message3_Enum_Bar, Bool, NO)
// This block of code is generated, do not edit it directly.
-// clang-format off
src.oneofEnum = Message3_Enum_Bar;
[dst mergeFrom:src];
@@ -666,9 +613,10 @@
XCTAssertEqual(dst.oneofEnum, Message3_Enum_Bar);
XCTAssertEqual(dst.oneofBool, NO);
-// clang-format on
//%PDDM-EXPAND-END (14 expansions)
+ // clang-format on
+
NSString *oneofStringDefault = @"";
NSData *oneofBytesDefault = [NSData data];
@@ -681,11 +629,9 @@
src.oneofBytes = [@"bar" dataUsingEncoding:NSUTF8StringEncoding];
[dst mergeFrom:src];
XCTAssertEqual(dst.oOneOfCase, Message3_O_OneOfCase_OneofBytes);
- XCTAssertEqualObjects(dst.oneofBytes,
- [@"bar" dataUsingEncoding:NSUTF8StringEncoding]);
+ XCTAssertEqualObjects(dst.oneofBytes, [@"bar" dataUsingEncoding:NSUTF8StringEncoding]);
XCTAssertEqualObjects(dst.oneofString, oneofStringDefault);
-
Message3 *subMessage = [Message3 message];
subMessage.optionalInt32 = 777;
src.oneofMessage = subMessage;
diff --git a/objectivec/Tests/GPBMessageTests+Runtime.m b/objectivec/Tests/GPBMessageTests+Runtime.m
index baad082..3bcfae0 100644
--- a/objectivec/Tests/GPBMessageTests+Runtime.m
+++ b/objectivec/Tests/GPBMessageTests+Runtime.m
@@ -34,12 +34,12 @@
#import "GPBMessage.h"
-#import "google/protobuf/MapUnittest.pbobjc.h"
-#import "google/protobuf/Unittest.pbobjc.h"
-#import "google/protobuf/UnittestCycle.pbobjc.h"
-#import "google/protobuf/UnittestObjcStartup.pbobjc.h"
-#import "google/protobuf/UnittestRuntimeProto2.pbobjc.h"
-#import "google/protobuf/UnittestRuntimeProto3.pbobjc.h"
+#import "objectivec/Tests/MapUnittest.pbobjc.h"
+#import "objectivec/Tests/Unittest.pbobjc.h"
+#import "objectivec/Tests/UnittestCycle.pbobjc.h"
+#import "objectivec/Tests/UnittestObjcStartup.pbobjc.h"
+#import "objectivec/Tests/UnittestRuntimeProto2.pbobjc.h"
+#import "objectivec/Tests/UnittestRuntimeProto3.pbobjc.h"
@interface MessageRuntimeTests : GPBTestCase
@end
@@ -98,14 +98,10 @@
for (NSString *name in names) {
// build the selector, i.e. - hasOptionalInt32/setHasOptionalInt32:
- SEL hasSel = NSSelectorFromString(
- [NSString stringWithFormat:@"hasOptional%@", name]);
- SEL setHasSel = NSSelectorFromString(
- [NSString stringWithFormat:@"setHasOptional%@:", name]);
- XCTAssertTrue([Message2 instancesRespondToSelector:hasSel], @"field: %@",
- name);
- XCTAssertTrue([Message2 instancesRespondToSelector:setHasSel], @"field: %@",
- name);
+ SEL hasSel = NSSelectorFromString([NSString stringWithFormat:@"hasOptional%@", name]);
+ SEL setHasSel = NSSelectorFromString([NSString stringWithFormat:@"setHasOptional%@:", name]);
+ XCTAssertTrue([Message2 instancesRespondToSelector:hasSel], @"field: %@", name);
+ XCTAssertTrue([Message2 instancesRespondToSelector:setHasSel], @"field: %@", name);
}
// Repeated fields
@@ -114,33 +110,24 @@
for (NSString *name in names) {
// build the selector, i.e. - hasRepeatedInt32Array/setHasRepeatedInt32Array:
- SEL hasSel = NSSelectorFromString(
- [NSString stringWithFormat:@"hasRepeated%@Array", name]);
- SEL setHasSel = NSSelectorFromString(
- [NSString stringWithFormat:@"setHasRepeated%@Array:", name]);
- XCTAssertFalse([Message2 instancesRespondToSelector:hasSel], @"field: %@",
- name);
- XCTAssertFalse([Message2 instancesRespondToSelector:setHasSel],
- @"field: %@", name);
+ SEL hasSel = NSSelectorFromString([NSString stringWithFormat:@"hasRepeated%@Array", name]);
+ SEL setHasSel =
+ NSSelectorFromString([NSString stringWithFormat:@"setHasRepeated%@Array:", name]);
+ XCTAssertFalse([Message2 instancesRespondToSelector:hasSel], @"field: %@", name);
+ XCTAssertFalse([Message2 instancesRespondToSelector:setHasSel], @"field: %@", name);
// build the selector, i.e. - repeatedInt32Array_Count
- SEL countSel = NSSelectorFromString(
- [NSString stringWithFormat:@"repeated%@Array_Count", name]);
- XCTAssertTrue([Message2 instancesRespondToSelector:countSel], @"field: %@",
- name);
+ SEL countSel = NSSelectorFromString([NSString stringWithFormat:@"repeated%@Array_Count", name]);
+ XCTAssertTrue([Message2 instancesRespondToSelector:countSel], @"field: %@", name);
}
// OneOf fields - no has*/setHas*
for (NSString *name in names) {
// build the selector, i.e. - hasOneofInt32/setHasOneofInt32:
- SEL hasSel =
- NSSelectorFromString([NSString stringWithFormat:@"hasOneof%@", name]);
- SEL setHasSel = NSSelectorFromString(
- [NSString stringWithFormat:@"setHasOneof%@:", name]);
- XCTAssertFalse([Message2 instancesRespondToSelector:hasSel], @"field: %@",
- name);
- XCTAssertFalse([Message2 instancesRespondToSelector:setHasSel],
- @"field: %@", name);
+ SEL hasSel = NSSelectorFromString([NSString stringWithFormat:@"hasOneof%@", name]);
+ SEL setHasSel = NSSelectorFromString([NSString stringWithFormat:@"setHasOneof%@:", name]);
+ XCTAssertFalse([Message2 instancesRespondToSelector:hasSel], @"field: %@", name);
+ XCTAssertFalse([Message2 instancesRespondToSelector:setHasSel], @"field: %@", name);
}
// map<> fields
@@ -148,44 +135,23 @@
// - *Count
NSArray *mapNames = @[
- @"Int32Int32",
- @"Int64Int64",
- @"Uint32Uint32",
- @"Uint64Uint64",
- @"Sint32Sint32",
- @"Sint64Sint64",
- @"Fixed32Fixed32",
- @"Fixed64Fixed64",
- @"Sfixed32Sfixed32",
- @"Sfixed64Sfixed64",
- @"Int32Float",
- @"Int32Double",
- @"BoolBool",
- @"StringString",
- @"StringBytes",
- @"StringMessage",
- @"Int32Bytes",
- @"Int32Enum",
- @"Int32Message",
+ @"Int32Int32", @"Int64Int64", @"Uint32Uint32", @"Uint64Uint64",
+ @"Sint32Sint32", @"Sint64Sint64", @"Fixed32Fixed32", @"Fixed64Fixed64",
+ @"Sfixed32Sfixed32", @"Sfixed64Sfixed64", @"Int32Float", @"Int32Double",
+ @"BoolBool", @"StringString", @"StringBytes", @"StringMessage",
+ @"Int32Bytes", @"Int32Enum", @"Int32Message",
];
for (NSString *name in mapNames) {
// build the selector, i.e. - hasMapInt32Int32/setHasMapInt32Int32:
- SEL hasSel = NSSelectorFromString(
- [NSString stringWithFormat:@"hasMap%@", name]);
- SEL setHasSel = NSSelectorFromString(
- [NSString stringWithFormat:@"setHasMap%@:", name]);
- XCTAssertFalse([Message2 instancesRespondToSelector:hasSel], @"field: %@",
- name);
- XCTAssertFalse([Message2 instancesRespondToSelector:setHasSel],
- @"field: %@", name);
+ SEL hasSel = NSSelectorFromString([NSString stringWithFormat:@"hasMap%@", name]);
+ SEL setHasSel = NSSelectorFromString([NSString stringWithFormat:@"setHasMap%@:", name]);
+ XCTAssertFalse([Message2 instancesRespondToSelector:hasSel], @"field: %@", name);
+ XCTAssertFalse([Message2 instancesRespondToSelector:setHasSel], @"field: %@", name);
// build the selector, i.e. - mapInt32Int32Count
- SEL countSel = NSSelectorFromString(
- [NSString stringWithFormat:@"map%@_Count", name]);
- XCTAssertTrue([Message2 instancesRespondToSelector:countSel], @"field: %@",
- name);
+ SEL countSel = NSSelectorFromString([NSString stringWithFormat:@"map%@_Count", name]);
+ XCTAssertTrue([Message2 instancesRespondToSelector:countSel], @"field: %@", name);
}
-
}
- (void)testProto3HasMethodSupport {
@@ -217,21 +183,15 @@
for (NSString *name in names) {
// build the selector, i.e. - hasOptionalInt32/setHasOptionalInt32:
- SEL hasSel = NSSelectorFromString(
- [NSString stringWithFormat:@"hasOptional%@", name]);
- SEL setHasSel = NSSelectorFromString(
- [NSString stringWithFormat:@"setHasOptional%@:", name]);
+ SEL hasSel = NSSelectorFromString([NSString stringWithFormat:@"hasOptional%@", name]);
+ SEL setHasSel = NSSelectorFromString([NSString stringWithFormat:@"setHasOptional%@:", name]);
if ([name isEqual:@"Message"]) {
// Sub messages/groups are the exception.
- XCTAssertTrue([Message3 instancesRespondToSelector:hasSel], @"field: %@",
- name);
- XCTAssertTrue([Message3 instancesRespondToSelector:setHasSel],
- @"field: %@", name);
+ XCTAssertTrue([Message3 instancesRespondToSelector:hasSel], @"field: %@", name);
+ XCTAssertTrue([Message3 instancesRespondToSelector:setHasSel], @"field: %@", name);
} else {
- XCTAssertFalse([Message3 instancesRespondToSelector:hasSel], @"field: %@",
- name);
- XCTAssertFalse([Message3 instancesRespondToSelector:setHasSel],
- @"field: %@", name);
+ XCTAssertFalse([Message3 instancesRespondToSelector:hasSel], @"field: %@", name);
+ XCTAssertFalse([Message3 instancesRespondToSelector:setHasSel], @"field: %@", name);
}
}
@@ -241,33 +201,24 @@
for (NSString *name in names) {
// build the selector, i.e. - hasRepeatedInt32Array/setHasRepeatedInt32Array:
- SEL hasSel = NSSelectorFromString(
- [NSString stringWithFormat:@"hasRepeated%@Array", name]);
- SEL setHasSel = NSSelectorFromString(
- [NSString stringWithFormat:@"setHasRepeated%@Array:", name]);
- XCTAssertFalse([Message3 instancesRespondToSelector:hasSel], @"field: %@",
- name);
- XCTAssertFalse([Message3 instancesRespondToSelector:setHasSel],
- @"field: %@", name);
+ SEL hasSel = NSSelectorFromString([NSString stringWithFormat:@"hasRepeated%@Array", name]);
+ SEL setHasSel =
+ NSSelectorFromString([NSString stringWithFormat:@"setHasRepeated%@Array:", name]);
+ XCTAssertFalse([Message3 instancesRespondToSelector:hasSel], @"field: %@", name);
+ XCTAssertFalse([Message3 instancesRespondToSelector:setHasSel], @"field: %@", name);
// build the selector, i.e. - repeatedInt32Array_Count
- SEL countSel = NSSelectorFromString(
- [NSString stringWithFormat:@"repeated%@Array_Count", name]);
- XCTAssertTrue([Message3 instancesRespondToSelector:countSel], @"field: %@",
- name);
+ SEL countSel = NSSelectorFromString([NSString stringWithFormat:@"repeated%@Array_Count", name]);
+ XCTAssertTrue([Message3 instancesRespondToSelector:countSel], @"field: %@", name);
}
// OneOf fields - no has*/setHas*
for (NSString *name in names) {
// build the selector, i.e. - hasOneofInt32/setHasOneofInt32:
- SEL hasSel =
- NSSelectorFromString([NSString stringWithFormat:@"hasOneof%@", name]);
- SEL setHasSel = NSSelectorFromString(
- [NSString stringWithFormat:@"setHasOneof%@:", name]);
- XCTAssertFalse([Message3 instancesRespondToSelector:hasSel], @"field: %@",
- name);
- XCTAssertFalse([Message3 instancesRespondToSelector:setHasSel],
- @"field: %@", name);
+ SEL hasSel = NSSelectorFromString([NSString stringWithFormat:@"hasOneof%@", name]);
+ SEL setHasSel = NSSelectorFromString([NSString stringWithFormat:@"setHasOneof%@:", name]);
+ XCTAssertFalse([Message3 instancesRespondToSelector:hasSel], @"field: %@", name);
+ XCTAssertFalse([Message3 instancesRespondToSelector:setHasSel], @"field: %@", name);
}
// Single Optional fields
@@ -277,14 +228,10 @@
for (NSString *name in names) {
// build the selector, i.e. - hasOptionalInt32/setHasOptionalInt32:
- SEL hasSel = NSSelectorFromString(
- [NSString stringWithFormat:@"hasOptional%@", name]);
- SEL setHasSel = NSSelectorFromString(
- [NSString stringWithFormat:@"setHasOptional%@:", name]);
- XCTAssertTrue([Message3Optional instancesRespondToSelector:hasSel], @"field: %@",
- name);
- XCTAssertTrue([Message3Optional instancesRespondToSelector:setHasSel],
- @"field: %@", name);
+ SEL hasSel = NSSelectorFromString([NSString stringWithFormat:@"hasOptional%@", name]);
+ SEL setHasSel = NSSelectorFromString([NSString stringWithFormat:@"setHasOptional%@:", name]);
+ XCTAssertTrue([Message3Optional instancesRespondToSelector:hasSel], @"field: %@", name);
+ XCTAssertTrue([Message3Optional instancesRespondToSelector:setHasSel], @"field: %@", name);
}
// map<> fields
@@ -292,42 +239,22 @@
// - *Count
NSArray *mapNames = @[
- @"Int32Int32",
- @"Int64Int64",
- @"Uint32Uint32",
- @"Uint64Uint64",
- @"Sint32Sint32",
- @"Sint64Sint64",
- @"Fixed32Fixed32",
- @"Fixed64Fixed64",
- @"Sfixed32Sfixed32",
- @"Sfixed64Sfixed64",
- @"Int32Float",
- @"Int32Double",
- @"BoolBool",
- @"StringString",
- @"StringBytes",
- @"StringMessage",
- @"Int32Bytes",
- @"Int32Enum",
- @"Int32Message",
+ @"Int32Int32", @"Int64Int64", @"Uint32Uint32", @"Uint64Uint64",
+ @"Sint32Sint32", @"Sint64Sint64", @"Fixed32Fixed32", @"Fixed64Fixed64",
+ @"Sfixed32Sfixed32", @"Sfixed64Sfixed64", @"Int32Float", @"Int32Double",
+ @"BoolBool", @"StringString", @"StringBytes", @"StringMessage",
+ @"Int32Bytes", @"Int32Enum", @"Int32Message",
];
for (NSString *name in mapNames) {
// build the selector, i.e. - hasMapInt32Int32/setHasMapInt32Int32:
- SEL hasSel = NSSelectorFromString(
- [NSString stringWithFormat:@"hasMap%@", name]);
- SEL setHasSel = NSSelectorFromString(
- [NSString stringWithFormat:@"setHasMap%@:", name]);
- XCTAssertFalse([Message3 instancesRespondToSelector:hasSel], @"field: %@",
- name);
- XCTAssertFalse([Message3 instancesRespondToSelector:setHasSel],
- @"field: %@", name);
+ SEL hasSel = NSSelectorFromString([NSString stringWithFormat:@"hasMap%@", name]);
+ SEL setHasSel = NSSelectorFromString([NSString stringWithFormat:@"setHasMap%@:", name]);
+ XCTAssertFalse([Message3 instancesRespondToSelector:hasSel], @"field: %@", name);
+ XCTAssertFalse([Message3 instancesRespondToSelector:setHasSel], @"field: %@", name);
// build the selector, i.e. - mapInt32Int32Count
- SEL countSel = NSSelectorFromString(
- [NSString stringWithFormat:@"map%@_Count", name]);
- XCTAssertTrue([Message3 instancesRespondToSelector:countSel], @"field: %@",
- name);
+ SEL countSel = NSSelectorFromString([NSString stringWithFormat:@"map%@_Count", name]);
+ XCTAssertTrue([Message3 instancesRespondToSelector:countSel], @"field: %@", name);
}
}
@@ -337,6 +264,9 @@
// being true.
//
+ // Disable clang-format for the macros.
+ // clang-format off
+
//%PDDM-DEFINE PROTO2_TEST_HAS_FIELD(FIELD, NON_ZERO_VALUE, ZERO_VALUE)
//% { // optional##FIELD :: NON_ZERO_VALUE
//% Message2 *msg = [[Message2 alloc] init];
@@ -399,7 +329,6 @@
//%PROTO2_TEST_CLEAR_FIELD_WITH_NIL(Message, [Message2 message])
//%PDDM-EXPAND PROTO2_TEST_HAS_FIELDS()
// This block of code is generated, do not edit it directly.
-// clang-format off
{ // optionalInt32 :: 1
Message2 *msg = [[Message2 alloc] init];
@@ -753,8 +682,9 @@
[msg release];
}
-// clang-format on
//%PDDM-EXPAND-END PROTO2_TEST_HAS_FIELDS()
+
+ // clang-format on
}
- (void)testProto3SingleFieldHasBehavior {
@@ -763,6 +693,9 @@
// being true. When set to the default, shouldn't be true.
//
+ // Disable clang-format for the macros.
+ // clang-format off
+
//%PDDM-DEFINE PROTO3_TEST_HAS_FIELD(FIELD, NON_ZERO_VALUE, ZERO_VALUE)
//% { // optional##FIELD
//% Message3 *msg = [[Message3 alloc] init];
@@ -815,7 +748,6 @@
//%PROTO3_TEST_CLEAR_FIELD_WITH_NIL(Message, [Message3 message])
//%PDDM-EXPAND PROTO3_TEST_HAS_FIELDS()
// This block of code is generated, do not edit it directly.
-// clang-format off
{ // optionalInt32
Message3 *msg = [[Message3 alloc] init];
@@ -1015,8 +947,9 @@
[msg release];
}
-// clang-format on
//%PDDM-EXPAND-END PROTO3_TEST_HAS_FIELDS()
+
+ // clang-format on
}
- (void)testProto3SingleOptionalFieldHasBehavior {
@@ -1024,6 +957,9 @@
// Setting to any value including the default (0) should result in true.
//
+ // Disable clang-format for the macros.
+ // clang-format off
+
//%PDDM-DEFINE PROTO3_TEST_OPTIONAL_HAS_FIELD(FIELD, NON_ZERO_VALUE, ZERO_VALUE)
//% { // optional##FIELD
//% Message3Optional *msg = [[Message3Optional alloc] init];
@@ -1060,7 +996,6 @@
//%PROTO3_TEST_OPTIONAL_HAS_FIELD(Enum, Message3Optional_Enum_Bar, Message3Optional_Enum_Foo)
//%PDDM-EXPAND PROTO3_TEST_OPTIONAL_HAS_FIELDS()
// This block of code is generated, do not edit it directly.
-// clang-format off
{ // optionalInt32
Message3Optional *msg = [[Message3Optional alloc] init];
@@ -1258,8 +1193,9 @@
[msg release];
}
-// clang-format on
//%PDDM-EXPAND-END PROTO3_TEST_OPTIONAL_HAS_FIELDS()
+
+ // clang-format on
}
- (void)testAccessingProto2UnknownEnumValues {
@@ -1268,13 +1204,11 @@
// Set it to something non zero, try and confirm it doesn't change.
msg.optionalEnum = Message2_Enum_Bar;
- XCTAssertThrowsSpecificNamed(msg.optionalEnum = 666, NSException,
- NSInvalidArgumentException);
+ XCTAssertThrowsSpecificNamed(msg.optionalEnum = 666, NSException, NSInvalidArgumentException);
XCTAssertEqual(msg.optionalEnum, Message2_Enum_Bar);
msg.oneofEnum = Message2_Enum_Bar;
- XCTAssertThrowsSpecificNamed(msg.oneofEnum = 666, NSException,
- NSInvalidArgumentException);
+ XCTAssertThrowsSpecificNamed(msg.oneofEnum = 666, NSException, NSInvalidArgumentException);
XCTAssertEqual(msg.oneofEnum, Message2_Enum_Bar);
[msg release];
@@ -1286,20 +1220,17 @@
// Set it to something non zero, try and confirm it doesn't change.
msg.optionalEnum = Message3_Enum_Bar;
- XCTAssertThrowsSpecificNamed(msg.optionalEnum = 666, NSException,
- NSInvalidArgumentException);
+ XCTAssertThrowsSpecificNamed(msg.optionalEnum = 666, NSException, NSInvalidArgumentException);
XCTAssertEqual(msg.optionalEnum, Message3_Enum_Bar);
msg.oneofEnum = Message3_Enum_Bar;
- XCTAssertThrowsSpecificNamed(msg.oneofEnum = 666, NSException,
- NSInvalidArgumentException);
+ XCTAssertThrowsSpecificNamed(msg.oneofEnum = 666, NSException, NSInvalidArgumentException);
XCTAssertEqual(msg.oneofEnum, Message3_Enum_Bar);
// Set via raw api to confirm it works.
SetMessage3_OptionalEnum_RawValue(msg, 666);
- XCTAssertEqual(msg.optionalEnum,
- Message3_Enum_GPBUnrecognizedEnumeratorValue);
+ XCTAssertEqual(msg.optionalEnum, Message3_Enum_GPBUnrecognizedEnumeratorValue);
XCTAssertEqual(Message3_OptionalEnum_RawValue(msg), 666);
SetMessage3_OneofEnum_RawValue(msg, 666);
@@ -1663,8 +1594,7 @@
XCTAssertEqual(msg.oneofDouble, 111.0);
XCTAssertEqual(msg.oneofBool, YES);
XCTAssertEqualObjects(msg.oneofString, oneofStringDefault);
- XCTAssertEqualObjects(msg.oneofBytes,
- [@"bar" dataUsingEncoding:NSUTF8StringEncoding]);
+ XCTAssertEqualObjects(msg.oneofBytes, [@"bar" dataUsingEncoding:NSUTF8StringEncoding]);
XCTAssertNotNil(msg.oneofGroup);
XCTAssertNotNil(msg.oneofMessage);
XCTAssertEqual(msg.oneofEnum, Message2_Enum_Baz);
@@ -1747,24 +1677,15 @@
msg = [[Message2 alloc] init];
int32_t values[] = {
- Message2_O_OneOfCase_OneofInt32,
- Message2_O_OneOfCase_OneofInt64,
- Message2_O_OneOfCase_OneofUint32,
- Message2_O_OneOfCase_OneofUint64,
- Message2_O_OneOfCase_OneofSint32,
- Message2_O_OneOfCase_OneofSint64,
- Message2_O_OneOfCase_OneofFixed32,
- Message2_O_OneOfCase_OneofFixed64,
- Message2_O_OneOfCase_OneofSfixed32,
- Message2_O_OneOfCase_OneofSfixed64,
- Message2_O_OneOfCase_OneofFloat,
- Message2_O_OneOfCase_OneofDouble,
- Message2_O_OneOfCase_OneofBool,
- Message2_O_OneOfCase_OneofString,
- Message2_O_OneOfCase_OneofBytes,
- Message2_O_OneOfCase_OneofGroup,
- Message2_O_OneOfCase_OneofMessage,
- Message2_O_OneOfCase_OneofEnum,
+ Message2_O_OneOfCase_OneofInt32, Message2_O_OneOfCase_OneofInt64,
+ Message2_O_OneOfCase_OneofUint32, Message2_O_OneOfCase_OneofUint64,
+ Message2_O_OneOfCase_OneofSint32, Message2_O_OneOfCase_OneofSint64,
+ Message2_O_OneOfCase_OneofFixed32, Message2_O_OneOfCase_OneofFixed64,
+ Message2_O_OneOfCase_OneofSfixed32, Message2_O_OneOfCase_OneofSfixed64,
+ Message2_O_OneOfCase_OneofFloat, Message2_O_OneOfCase_OneofDouble,
+ Message2_O_OneOfCase_OneofBool, Message2_O_OneOfCase_OneofString,
+ Message2_O_OneOfCase_OneofBytes, Message2_O_OneOfCase_OneofGroup,
+ Message2_O_OneOfCase_OneofMessage, Message2_O_OneOfCase_OneofEnum,
};
for (size_t i = 0; i < GPBARRAYSIZE(values); ++i) {
@@ -1832,8 +1753,7 @@
// No need to check the value was set, the above tests did that.
Message2_ClearOOneOfCase(msg);
// Nothing in the case.
- XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_GPBUnsetOneOfCase,
- "Loop: %zd", i);
+ XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_GPBUnsetOneOfCase, "Loop: %zd", i);
// Confirm everything is back to defaults after a clear.
XCTAssertEqual(msg.oneofInt32, 100, "Loop: %zd", i);
XCTAssertEqual(msg.oneofInt64, 101, "Loop: %zd", i);
@@ -2201,8 +2121,7 @@
XCTAssertEqual(msg.oneofDouble, 0.0);
XCTAssertEqual(msg.oneofBool, NO);
XCTAssertEqualObjects(msg.oneofString, oneofStringDefault);
- XCTAssertEqualObjects(msg.oneofBytes,
- [@"bar" dataUsingEncoding:NSUTF8StringEncoding]);
+ XCTAssertEqualObjects(msg.oneofBytes, [@"bar" dataUsingEncoding:NSUTF8StringEncoding]);
XCTAssertNotNil(msg.oneofMessage);
XCTAssertEqual(msg.oneofEnum, Message3_Enum_Foo);
XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofBytes);
@@ -2257,23 +2176,15 @@
msg = [[Message3 alloc] init];
int32_t values[] = {
- Message3_O_OneOfCase_OneofInt32,
- Message3_O_OneOfCase_OneofInt64,
- Message3_O_OneOfCase_OneofUint32,
- Message3_O_OneOfCase_OneofUint64,
- Message3_O_OneOfCase_OneofSint32,
- Message3_O_OneOfCase_OneofSint64,
- Message3_O_OneOfCase_OneofFixed32,
- Message3_O_OneOfCase_OneofFixed64,
- Message3_O_OneOfCase_OneofSfixed32,
- Message3_O_OneOfCase_OneofSfixed64,
- Message3_O_OneOfCase_OneofFloat,
- Message3_O_OneOfCase_OneofDouble,
- Message3_O_OneOfCase_OneofBool,
- Message3_O_OneOfCase_OneofString,
- Message3_O_OneOfCase_OneofBytes,
- Message3_O_OneOfCase_OneofMessage,
- Message3_O_OneOfCase_OneofEnum,
+ Message3_O_OneOfCase_OneofInt32, Message3_O_OneOfCase_OneofInt64,
+ Message3_O_OneOfCase_OneofUint32, Message3_O_OneOfCase_OneofUint64,
+ Message3_O_OneOfCase_OneofSint32, Message3_O_OneOfCase_OneofSint64,
+ Message3_O_OneOfCase_OneofFixed32, Message3_O_OneOfCase_OneofFixed64,
+ Message3_O_OneOfCase_OneofSfixed32, Message3_O_OneOfCase_OneofSfixed64,
+ Message3_O_OneOfCase_OneofFloat, Message3_O_OneOfCase_OneofDouble,
+ Message3_O_OneOfCase_OneofBool, Message3_O_OneOfCase_OneofString,
+ Message3_O_OneOfCase_OneofBytes, Message3_O_OneOfCase_OneofMessage,
+ Message3_O_OneOfCase_OneofEnum,
};
for (size_t i = 0; i < GPBARRAYSIZE(values); ++i) {
@@ -2338,8 +2249,7 @@
// No need to check the value was set, the above tests did that.
Message3_ClearOOneOfCase(msg);
// Nothing in the case.
- XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_GPBUnsetOneOfCase,
- "Loop: %zd", i);
+ XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_GPBUnsetOneOfCase, "Loop: %zd", i);
// Confirm everything is back to defaults after a clear.
XCTAssertEqual(msg.oneofInt32, 0, "Loop: %zd", i);
XCTAssertEqual(msg.oneofInt64, 0, "Loop: %zd", i);
@@ -2366,7 +2276,6 @@
}
- (void)testProto2OneofSetToDefault {
-
// proto3 doesn't normally write out zero (default) fields, but if they are
// in a oneof it does. proto2 doesn't have this special behavior, but we
// still confirm setting to the explicit default does set the case to be
@@ -2378,24 +2287,24 @@
Message2 *msg = [[Message2 alloc] init];
int32_t values[] = {
- Message2_O_OneOfCase_OneofInt32,
- Message2_O_OneOfCase_OneofInt64,
- Message2_O_OneOfCase_OneofUint32,
- Message2_O_OneOfCase_OneofUint64,
- Message2_O_OneOfCase_OneofSint32,
- Message2_O_OneOfCase_OneofSint64,
- Message2_O_OneOfCase_OneofFixed32,
- Message2_O_OneOfCase_OneofFixed64,
- Message2_O_OneOfCase_OneofSfixed32,
- Message2_O_OneOfCase_OneofSfixed64,
- Message2_O_OneOfCase_OneofFloat,
- Message2_O_OneOfCase_OneofDouble,
- Message2_O_OneOfCase_OneofBool,
- Message2_O_OneOfCase_OneofString,
- Message2_O_OneOfCase_OneofBytes,
- // Skip group
- // Skip message
- Message2_O_OneOfCase_OneofEnum,
+ Message2_O_OneOfCase_OneofInt32,
+ Message2_O_OneOfCase_OneofInt64,
+ Message2_O_OneOfCase_OneofUint32,
+ Message2_O_OneOfCase_OneofUint64,
+ Message2_O_OneOfCase_OneofSint32,
+ Message2_O_OneOfCase_OneofSint64,
+ Message2_O_OneOfCase_OneofFixed32,
+ Message2_O_OneOfCase_OneofFixed64,
+ Message2_O_OneOfCase_OneofSfixed32,
+ Message2_O_OneOfCase_OneofSfixed64,
+ Message2_O_OneOfCase_OneofFloat,
+ Message2_O_OneOfCase_OneofDouble,
+ Message2_O_OneOfCase_OneofBool,
+ Message2_O_OneOfCase_OneofString,
+ Message2_O_OneOfCase_OneofBytes,
+ // Skip group
+ // Skip message
+ Message2_O_OneOfCase_OneofEnum,
};
for (size_t i = 0; i < GPBARRAYSIZE(values); ++i) {
@@ -2496,7 +2405,6 @@
}
- (void)testProto3OneofSetToZero {
-
// Normally setting a proto3 field to the zero value should result in it being
// reset/cleared. But in a oneof, it still gets recorded so it can go out
// over the wire and the other side can see what was set in the oneof.
@@ -2507,23 +2415,15 @@
Message3 *msg = [[Message3 alloc] init];
int32_t values[] = {
- Message3_O_OneOfCase_OneofInt32,
- Message3_O_OneOfCase_OneofInt64,
- Message3_O_OneOfCase_OneofUint32,
- Message3_O_OneOfCase_OneofUint64,
- Message3_O_OneOfCase_OneofSint32,
- Message3_O_OneOfCase_OneofSint64,
- Message3_O_OneOfCase_OneofFixed32,
- Message3_O_OneOfCase_OneofFixed64,
- Message3_O_OneOfCase_OneofSfixed32,
- Message3_O_OneOfCase_OneofSfixed64,
- Message3_O_OneOfCase_OneofFloat,
- Message3_O_OneOfCase_OneofDouble,
- Message3_O_OneOfCase_OneofBool,
- Message3_O_OneOfCase_OneofString,
- Message3_O_OneOfCase_OneofBytes,
- Message3_O_OneOfCase_OneofMessage,
- Message3_O_OneOfCase_OneofEnum,
+ Message3_O_OneOfCase_OneofInt32, Message3_O_OneOfCase_OneofInt64,
+ Message3_O_OneOfCase_OneofUint32, Message3_O_OneOfCase_OneofUint64,
+ Message3_O_OneOfCase_OneofSint32, Message3_O_OneOfCase_OneofSint64,
+ Message3_O_OneOfCase_OneofFixed32, Message3_O_OneOfCase_OneofFixed64,
+ Message3_O_OneOfCase_OneofSfixed32, Message3_O_OneOfCase_OneofSfixed64,
+ Message3_O_OneOfCase_OneofFloat, Message3_O_OneOfCase_OneofDouble,
+ Message3_O_OneOfCase_OneofBool, Message3_O_OneOfCase_OneofString,
+ Message3_O_OneOfCase_OneofBytes, Message3_O_OneOfCase_OneofMessage,
+ Message3_O_OneOfCase_OneofEnum,
};
for (size_t i = 0; i < GPBARRAYSIZE(values); ++i) {
@@ -2654,27 +2554,19 @@
XCTAssertNotEqual(msg1.repeatedStringArray, msg2.repeatedStringArray);
XCTAssertNotEqual(msg1.repeatedBytesArray, msg2.repeatedBytesArray);
XCTAssertNotEqual(msg1.repeatedGroupArray, msg2.repeatedGroupArray);
- XCTAssertNotEqual(msg1.repeatedNestedMessageArray,
- msg2.repeatedNestedMessageArray);
- XCTAssertNotEqual(msg1.repeatedForeignMessageArray,
- msg2.repeatedForeignMessageArray);
- XCTAssertNotEqual(msg1.repeatedImportMessageArray,
- msg2.repeatedImportMessageArray);
+ XCTAssertNotEqual(msg1.repeatedNestedMessageArray, msg2.repeatedNestedMessageArray);
+ XCTAssertNotEqual(msg1.repeatedForeignMessageArray, msg2.repeatedForeignMessageArray);
+ XCTAssertNotEqual(msg1.repeatedImportMessageArray, msg2.repeatedImportMessageArray);
XCTAssertNotEqual(msg1.repeatedNestedEnumArray, msg2.repeatedNestedEnumArray);
- XCTAssertNotEqual(msg1.repeatedForeignEnumArray,
- msg2.repeatedForeignEnumArray);
+ XCTAssertNotEqual(msg1.repeatedForeignEnumArray, msg2.repeatedForeignEnumArray);
XCTAssertNotEqual(msg1.repeatedImportEnumArray, msg2.repeatedImportEnumArray);
- XCTAssertNotEqual(msg1.repeatedStringPieceArray,
- msg2.repeatedStringPieceArray);
+ XCTAssertNotEqual(msg1.repeatedStringPieceArray, msg2.repeatedStringPieceArray);
XCTAssertNotEqual(msg1.repeatedCordArray, msg2.repeatedCordArray);
for (int i = 0; i < repeatCount; i++) {
- XCTAssertNotEqual(msg1.repeatedNestedMessageArray[i],
- msg2.repeatedNestedMessageArray[i]);
- XCTAssertNotEqual(msg1.repeatedForeignMessageArray[i],
- msg2.repeatedForeignMessageArray[i]);
- XCTAssertNotEqual(msg1.repeatedImportMessageArray[i],
- msg2.repeatedImportMessageArray[i]);
+ XCTAssertNotEqual(msg1.repeatedNestedMessageArray[i], msg2.repeatedNestedMessageArray[i]);
+ XCTAssertNotEqual(msg1.repeatedForeignMessageArray[i], msg2.repeatedForeignMessageArray[i]);
+ XCTAssertNotEqual(msg1.repeatedImportMessageArray[i], msg2.repeatedImportMessageArray[i]);
}
}
@@ -2708,8 +2600,7 @@
// Ensure the messages are unique per map.
[msg1.mapInt32ForeignMessage
- enumerateKeysAndObjectsUsingBlock:^(int32_t key, id value, BOOL *stop) {
-#pragma unused(stop)
+ enumerateKeysAndObjectsUsingBlock:^(int32_t key, id value, __unused BOOL *stop) {
ForeignMessage *subMsg2 = [msg2.mapInt32ForeignMessage objectForKey:key];
XCTAssertNotEqual(value, subMsg2); // Ptr compare, new object.
}];
@@ -2720,7 +2611,7 @@
GPBFieldDescriptor *fieldDescriptor = [[message descriptor] fieldWithName:@"repeatedStringArray"];
XCTAssertNotNil(fieldDescriptor);
NSMutableArray *fieldArray = GPBGetMessageRepeatedField(message, fieldDescriptor);
- XCTAssertNotNil(fieldArray); // Should have autocreated.
+ XCTAssertNotNil(fieldArray); // Should have autocreated.
XCTAssertTrue(fieldArray == message.repeatedStringArray); // Same pointer
}
@@ -2740,7 +2631,7 @@
GPBFieldDescriptor *fieldDescriptor = [[message descriptor] fieldWithName:@"mapStringString"];
XCTAssertNotNil(fieldDescriptor);
NSMutableDictionary *fieldMap = GPBGetMessageMapField(message, fieldDescriptor);
- XCTAssertNotNil(fieldMap); // Should have autocreated.
+ XCTAssertNotNil(fieldMap); // Should have autocreated.
XCTAssertTrue(fieldMap == message.mapStringString); // Same pointer
}
diff --git a/objectivec/Tests/GPBMessageTests+Serialization.m b/objectivec/Tests/GPBMessageTests+Serialization.m
index bb63ec3..3c2381c 100644
--- a/objectivec/Tests/GPBMessageTests+Serialization.m
+++ b/objectivec/Tests/GPBMessageTests+Serialization.m
@@ -34,13 +34,12 @@
#import "GPBMessage.h"
-#import "google/protobuf/MapProto2Unittest.pbobjc.h"
-#import "google/protobuf/MapUnittest.pbobjc.h"
-#import "google/protobuf/Unittest.pbobjc.h"
-#import "google/protobuf/UnittestDropUnknownFields.pbobjc.h"
-#import "google/protobuf/UnittestPreserveUnknownEnum.pbobjc.h"
-#import "google/protobuf/UnittestRuntimeProto2.pbobjc.h"
-#import "google/protobuf/UnittestRuntimeProto3.pbobjc.h"
+#import "objectivec/Tests/MapProto2Unittest.pbobjc.h"
+#import "objectivec/Tests/MapUnittest.pbobjc.h"
+#import "objectivec/Tests/Unittest.pbobjc.h"
+#import "objectivec/Tests/UnittestPreserveUnknownEnum.pbobjc.h"
+#import "objectivec/Tests/UnittestRuntimeProto2.pbobjc.h"
+#import "objectivec/Tests/UnittestRuntimeProto3.pbobjc.h"
@interface MessageSerializationTests : GPBTestCase
@end
@@ -114,6 +113,9 @@
// Proto3 optionals should be just like proto2, zero values also get serialized.
//
+ // Disable clang-format for the macros.
+ // clang-format off
+
//%PDDM-DEFINE PROTO3_TEST_SERIALIZE_OPTIONAL_FIELD(FIELD, ZERO_VALUE, EXPECTED_LEN)
//% { // optional##FIELD
//% Message3Optional *msg = [[Message3Optional alloc] init];
@@ -154,7 +156,6 @@
//%PROTO3_TEST_SERIALIZE_OPTIONAL_FIELD(Enum, Message3Optional_Enum_Foo, 3)
//%PDDM-EXPAND PROTO3_TEST_SERIALIZE_OPTIONAL_FIELDS()
// This block of code is generated, do not edit it directly.
-// clang-format off
{ // optionalInt32
Message3Optional *msg = [[Message3Optional alloc] init];
@@ -416,17 +417,17 @@
[msg release];
}
-// clang-format on
//%PDDM-EXPAND-END PROTO3_TEST_SERIALIZE_OPTIONAL_FIELDS()
+
+ // clang-format on
}
- (void)testProto2UnknownEnumToUnknownField {
Message3 *orig = [[Message3 alloc] init];
orig.optionalEnum = Message3_Enum_Extra3;
- orig.repeatedEnumArray =
- [GPBEnumArray arrayWithValidationFunction:Message3_Enum_IsValidValue
- rawValue:Message3_Enum_Extra3];
+ orig.repeatedEnumArray = [GPBEnumArray arrayWithValidationFunction:Message3_Enum_IsValidValue
+ rawValue:Message3_Enum_Extra3];
orig.oneofEnum = Message3_Enum_Extra3;
NSData *data = [orig data];
@@ -445,15 +446,12 @@
XCTAssertEqual([unknownFields countOfFields], 3U);
XCTAssertTrue([unknownFields hasField:Message2_FieldNumber_OptionalEnum]);
- XCTAssertTrue(
- [unknownFields hasField:Message2_FieldNumber_RepeatedEnumArray]);
+ XCTAssertTrue([unknownFields hasField:Message2_FieldNumber_RepeatedEnumArray]);
XCTAssertTrue([unknownFields hasField:Message2_FieldNumber_OneofEnum]);
- GPBUnknownField *field =
- [unknownFields getField:Message2_FieldNumber_OptionalEnum];
+ GPBUnknownField *field = [unknownFields getField:Message2_FieldNumber_OptionalEnum];
XCTAssertEqual(field.varintList.count, 1U);
- XCTAssertEqual([field.varintList valueAtIndex:0],
- (uint64_t)Message3_Enum_Extra3);
+ XCTAssertEqual([field.varintList valueAtIndex:0], (uint64_t)Message3_Enum_Extra3);
field = [unknownFields getField:Message2_FieldNumber_RepeatedEnumArray];
XCTAssertEqual(field.varintList.count, 1U);
@@ -461,36 +459,32 @@
field = [unknownFields getField:Message2_FieldNumber_OneofEnum];
XCTAssertEqual(field.varintList.count, 1U);
- XCTAssertEqual([field.varintList valueAtIndex:0],
- (uint64_t)Message3_Enum_Extra3);
+ XCTAssertEqual([field.varintList valueAtIndex:0], (uint64_t)Message3_Enum_Extra3);
[msg release];
[orig release];
}
- (void)testProto3UnknownEnumPreserving {
- UnknownEnumsMyMessagePlusExtra *orig =
- [UnknownEnumsMyMessagePlusExtra message];
+ UnknownEnumsMyMessagePlusExtra *orig = [UnknownEnumsMyMessagePlusExtra message];
orig.e = UnknownEnumsMyEnumPlusExtra_EExtra;
- orig.repeatedEArray = [GPBEnumArray
- arrayWithValidationFunction:UnknownEnumsMyEnumPlusExtra_IsValidValue
- rawValue:UnknownEnumsMyEnumPlusExtra_EExtra];
- orig.repeatedPackedEArray = [GPBEnumArray
- arrayWithValidationFunction:UnknownEnumsMyEnumPlusExtra_IsValidValue
- rawValue:UnknownEnumsMyEnumPlusExtra_EExtra];
+ orig.repeatedEArray =
+ [GPBEnumArray arrayWithValidationFunction:UnknownEnumsMyEnumPlusExtra_IsValidValue
+ rawValue:UnknownEnumsMyEnumPlusExtra_EExtra];
+ orig.repeatedPackedEArray =
+ [GPBEnumArray arrayWithValidationFunction:UnknownEnumsMyEnumPlusExtra_IsValidValue
+ rawValue:UnknownEnumsMyEnumPlusExtra_EExtra];
orig.oneofE1 = UnknownEnumsMyEnumPlusExtra_EExtra;
// Everything should be there via raw values.
NSData *data = [orig data];
XCTAssertNotNil(data);
- UnknownEnumsMyMessage *msg =
- [UnknownEnumsMyMessage parseFromData:data error:NULL];
+ UnknownEnumsMyMessage *msg = [UnknownEnumsMyMessage parseFromData:data error:NULL];
XCTAssertEqual(msg.e, UnknownEnumsMyEnum_GPBUnrecognizedEnumeratorValue);
- XCTAssertEqual(UnknownEnumsMyMessage_E_RawValue(msg),
- UnknownEnumsMyEnumPlusExtra_EExtra);
+ XCTAssertEqual(UnknownEnumsMyMessage_E_RawValue(msg), UnknownEnumsMyEnumPlusExtra_EExtra);
XCTAssertEqual(msg.repeatedEArray.count, 1U);
XCTAssertEqual([msg.repeatedEArray valueAtIndex:0],
UnknownEnumsMyEnum_GPBUnrecognizedEnumeratorValue);
@@ -501,10 +495,8 @@
UnknownEnumsMyEnum_GPBUnrecognizedEnumeratorValue);
XCTAssertEqual([msg.repeatedPackedEArray rawValueAtIndex:0],
(UnknownEnumsMyEnum)UnknownEnumsMyEnumPlusExtra_EExtra);
- XCTAssertEqual(msg.oneofE1,
- UnknownEnumsMyEnum_GPBUnrecognizedEnumeratorValue);
- XCTAssertEqual(UnknownEnumsMyMessage_OneofE1_RawValue(msg),
- UnknownEnumsMyEnumPlusExtra_EExtra);
+ XCTAssertEqual(msg.oneofE1, UnknownEnumsMyEnum_GPBUnrecognizedEnumeratorValue);
+ XCTAssertEqual(UnknownEnumsMyMessage_OneofE1_RawValue(msg), UnknownEnumsMyEnumPlusExtra_EExtra);
// Everything should go out and come back.
@@ -513,14 +505,15 @@
XCTAssertEqual(orig.e, UnknownEnumsMyEnumPlusExtra_EExtra);
XCTAssertEqual(orig.repeatedEArray.count, 1U);
- XCTAssertEqual([orig.repeatedEArray valueAtIndex:0],
- UnknownEnumsMyEnumPlusExtra_EExtra);
+ XCTAssertEqual([orig.repeatedEArray valueAtIndex:0], UnknownEnumsMyEnumPlusExtra_EExtra);
XCTAssertEqual(orig.repeatedPackedEArray.count, 1U);
- XCTAssertEqual([orig.repeatedPackedEArray valueAtIndex:0],
- UnknownEnumsMyEnumPlusExtra_EExtra);
+ XCTAssertEqual([orig.repeatedPackedEArray valueAtIndex:0], UnknownEnumsMyEnumPlusExtra_EExtra);
XCTAssertEqual(orig.oneofE1, UnknownEnumsMyEnumPlusExtra_EExtra);
}
+// Disable clang-format for the macros.
+// clang-format off
+
//%PDDM-DEFINE TEST_ROUNDTRIP_ONEOF(MESSAGE, FIELD, VALUE)
//%TEST_ROUNDTRIP_ONEOF_ADV(MESSAGE, FIELD, VALUE, )
//%PDDM-DEFINE TEST_ROUNDTRIP_ONEOF_ADV(MESSAGE, FIELD, VALUE, EQ_SUFFIX)
@@ -584,7 +577,6 @@
//%
//%PDDM-EXPAND TEST_ROUNDTRIP_ONEOFS(2, NO)
// This block of code is generated, do not edit it directly.
-// clang-format off
- (void)testProto2RoundTripOneof {
@@ -815,10 +807,8 @@
[subMessage release];
}
-// clang-format on
//%PDDM-EXPAND TEST_ROUNDTRIP_ONEOFS(3, YES)
// This block of code is generated, do not edit it directly.
-// clang-format off
- (void)testProto3RoundTripOneof {
@@ -1035,9 +1025,10 @@
[subMessage release];
}
-// clang-format on
//%PDDM-EXPAND-END (2 expansions)
+// clang-format on
+
- (void)testPackedUnpackedMessageParsing {
// packed is optional, a repeated field should parse when packed or unpacked.
@@ -1054,15 +1045,13 @@
@"Data should differ (packed vs unpacked) use");
NSError *error = nil;
- TestPackedTypes *packedParse =
- [TestPackedTypes parseFromData:unpackedData error:&error];
+ TestPackedTypes *packedParse = [TestPackedTypes parseFromData:unpackedData error:&error];
XCTAssertNotNil(packedParse);
XCTAssertNil(error);
XCTAssertEqualObjects(packedParse, packedOrig);
error = nil;
- TestUnpackedTypes *unpackedParsed =
- [TestUnpackedTypes parseFromData:packedData error:&error];
+ TestUnpackedTypes *unpackedParsed = [TestUnpackedTypes parseFromData:packedData error:&error];
XCTAssertNotNil(unpackedParsed);
XCTAssertNil(error);
XCTAssertEqualObjects(unpackedParsed, unpackedOrig);
@@ -1119,8 +1108,7 @@
XCTAssertEqualObjects(fieldsData, extsData);
NSError *error = nil;
- TestPackedTypes *fieldsParse =
- [TestPackedTypes parseFromData:extsData error:&error];
+ TestPackedTypes *fieldsParse = [TestPackedTypes parseFromData:extsData error:&error];
XCTAssertNotNil(fieldsParse);
XCTAssertNil(error);
XCTAssertEqualObjects(fieldsParse, fieldsOrig);
@@ -1150,8 +1138,7 @@
XCTAssertNotNil(extsData);
XCTAssertEqualObjects(fieldsData, extsData);
- TestUnpackedTypes *fieldsParse =
- [TestUnpackedTypes parseFromData:extsData error:NULL];
+ TestUnpackedTypes *fieldsParse = [TestUnpackedTypes parseFromData:extsData error:NULL];
XCTAssertNotNil(fieldsParse);
XCTAssertEqualObjects(fieldsParse, fieldsOrig);
@@ -1164,11 +1151,9 @@
}
- (void)testErrorSubsectionInvalidLimit {
- NSData *data = DataFromCStr(
- "\x0A\x08\x0A\x07\x12\x04\x72\x02\x4B\x50\x12\x04\x72\x02\x4B\x50");
+ NSData *data = DataFromCStr("\x0A\x08\x0A\x07\x12\x04\x72\x02\x4B\x50\x12\x04\x72\x02\x4B\x50");
NSError *error = nil;
- NestedTestAllTypes *msg = [NestedTestAllTypes parseFromData:data
- error:&error];
+ NestedTestAllTypes *msg = [NestedTestAllTypes parseFromData:data error:&error];
XCTAssertNil(msg);
XCTAssertNotNil(error);
XCTAssertEqualObjects(error.domain, GPBCodedInputStreamErrorDomain);
@@ -1178,8 +1163,7 @@
- (void)testErrorSubsectionLimitReached {
NSData *data = DataFromCStr("\x0A\x06\x12\x03\x72\x02\x4B\x50");
NSError *error = nil;
- NestedTestAllTypes *msg = [NestedTestAllTypes parseFromData:data
- error:&error];
+ NestedTestAllTypes *msg = [NestedTestAllTypes parseFromData:data error:&error];
XCTAssertNil(msg);
XCTAssertNotNil(error);
XCTAssertEqualObjects(error.domain, GPBCodedInputStreamErrorDomain);
@@ -1209,8 +1193,7 @@
- (void)testErrorInvalidSize {
NSData *data = DataFromCStr("\x72\x03\x4B\x50");
NSError *error = nil;
- NestedTestAllTypes *msg = [NestedTestAllTypes parseFromData:data
- error:&error];
+ NestedTestAllTypes *msg = [NestedTestAllTypes parseFromData:data error:&error];
XCTAssertNil(msg);
XCTAssertNotNil(error);
XCTAssertEqualObjects(error.domain, GPBCodedInputStreamErrorDomain);
@@ -1220,8 +1203,7 @@
- (void)testErrorInvalidTag {
NSData *data = DataFromCStr("\x0F");
NSError *error = nil;
- NestedTestAllTypes *msg = [NestedTestAllTypes parseFromData:data
- error:&error];
+ NestedTestAllTypes *msg = [NestedTestAllTypes parseFromData:data error:&error];
XCTAssertNil(msg);
XCTAssertNotNil(error);
XCTAssertEqualObjects(error.domain, GPBCodedInputStreamErrorDomain);
@@ -1231,12 +1213,7 @@
- (void)testZeroFieldNum {
// These are ConformanceTestSuite::TestIllegalTags.
- const char *tests[] = {
- "\1DEADBEEF",
- "\2\1\1",
- "\3\4",
- "\5DEAD"
- };
+ const char *tests[] = {"\1DEADBEEF", "\2\1\1", "\3\4", "\5DEAD"};
for (size_t i = 0; i < GPBARRAYSIZE(tests); ++i) {
NSData *data = DataFromCStr(tests[i]);
@@ -1264,27 +1241,25 @@
}
- (void)testErrorRecursionDepthReached {
- NSData *data = DataFromCStr(
- "\x0A\xF2\x01\x0A\xEF\x01\x0A\xEC\x01\x0A\xE9\x01\x0A\xE6\x01"
- "\x0A\xE3\x01\x0A\xE0\x01\x0A\xDD\x01\x0A\xDA\x01\x0A\xD7\x01"
- "\x0A\xD4\x01\x0A\xD1\x01\x0A\xCE\x01\x0A\xCB\x01\x0A\xC8\x01"
- "\x0A\xC5\x01\x0A\xC2\x01\x0A\xBF\x01\x0A\xBC\x01\x0A\xB9\x01"
- "\x0A\xB6\x01\x0A\xB3\x01\x0A\xB0\x01\x0A\xAD\x01\x0A\xAA\x01"
- "\x0A\xA7\x01\x0A\xA4\x01\x0A\xA1\x01\x0A\x9E\x01\x0A\x9B\x01"
- "\x0A\x98\x01\x0A\x95\x01\x0A\x92\x01\x0A\x8F\x01\x0A\x8C\x01"
- "\x0A\x89\x01\x0A\x86\x01\x0A\x83\x01\x0A\x80\x01\x0A\x7E"
- "\x0A\x7C\x0A\x7A\x0A\x78\x0A\x76\x0A\x74\x0A\x72\x0A\x70"
- "\x0A\x6E\x0A\x6C\x0A\x6A\x0A\x68\x0A\x66\x0A\x64\x0A\x62"
- "\x0A\x60\x0A\x5E\x0A\x5C\x0A\x5A\x0A\x58\x0A\x56\x0A\x54"
- "\x0A\x52\x0A\x50\x0A\x4E\x0A\x4C\x0A\x4A\x0A\x48\x0A\x46"
- "\x0A\x44\x0A\x42\x0A\x40\x0A\x3E\x0A\x3C\x0A\x3A\x0A\x38"
- "\x0A\x36\x0A\x34\x0A\x32\x0A\x30\x0A\x2E\x0A\x2C\x0A\x2A"
- "\x0A\x28\x0A\x26\x0A\x24\x0A\x22\x0A\x20\x0A\x1E\x0A\x1C"
- "\x0A\x1A\x0A\x18\x0A\x16\x0A\x14\x0A\x12\x0A\x10\x0A\x0E"
- "\x0A\x0C\x0A\x0A\x0A\x08\x0A\x06\x12\x04\x72\x02\x4B\x50");
+ NSData *data = DataFromCStr("\x0A\xF2\x01\x0A\xEF\x01\x0A\xEC\x01\x0A\xE9\x01\x0A\xE6\x01"
+ "\x0A\xE3\x01\x0A\xE0\x01\x0A\xDD\x01\x0A\xDA\x01\x0A\xD7\x01"
+ "\x0A\xD4\x01\x0A\xD1\x01\x0A\xCE\x01\x0A\xCB\x01\x0A\xC8\x01"
+ "\x0A\xC5\x01\x0A\xC2\x01\x0A\xBF\x01\x0A\xBC\x01\x0A\xB9\x01"
+ "\x0A\xB6\x01\x0A\xB3\x01\x0A\xB0\x01\x0A\xAD\x01\x0A\xAA\x01"
+ "\x0A\xA7\x01\x0A\xA4\x01\x0A\xA1\x01\x0A\x9E\x01\x0A\x9B\x01"
+ "\x0A\x98\x01\x0A\x95\x01\x0A\x92\x01\x0A\x8F\x01\x0A\x8C\x01"
+ "\x0A\x89\x01\x0A\x86\x01\x0A\x83\x01\x0A\x80\x01\x0A\x7E"
+ "\x0A\x7C\x0A\x7A\x0A\x78\x0A\x76\x0A\x74\x0A\x72\x0A\x70"
+ "\x0A\x6E\x0A\x6C\x0A\x6A\x0A\x68\x0A\x66\x0A\x64\x0A\x62"
+ "\x0A\x60\x0A\x5E\x0A\x5C\x0A\x5A\x0A\x58\x0A\x56\x0A\x54"
+ "\x0A\x52\x0A\x50\x0A\x4E\x0A\x4C\x0A\x4A\x0A\x48\x0A\x46"
+ "\x0A\x44\x0A\x42\x0A\x40\x0A\x3E\x0A\x3C\x0A\x3A\x0A\x38"
+ "\x0A\x36\x0A\x34\x0A\x32\x0A\x30\x0A\x2E\x0A\x2C\x0A\x2A"
+ "\x0A\x28\x0A\x26\x0A\x24\x0A\x22\x0A\x20\x0A\x1E\x0A\x1C"
+ "\x0A\x1A\x0A\x18\x0A\x16\x0A\x14\x0A\x12\x0A\x10\x0A\x0E"
+ "\x0A\x0C\x0A\x0A\x0A\x08\x0A\x06\x12\x04\x72\x02\x4B\x50");
NSError *error = nil;
- NestedTestAllTypes *msg = [NestedTestAllTypes parseFromData:data
- error:&error];
+ NestedTestAllTypes *msg = [NestedTestAllTypes parseFromData:data error:&error];
XCTAssertNil(msg);
XCTAssertNotNil(error);
XCTAssertEqualObjects(error.domain, GPBCodedInputStreamErrorDomain);
@@ -1295,9 +1270,7 @@
NSData *data = DataFromCStr("\xFF\xFF\xFF\xFF\x0F");
GPBCodedInputStream *input = [GPBCodedInputStream streamWithData:data];
NSError *error;
- [GPBMessage parseDelimitedFromCodedInputStream:input
- extensionRegistry:nil
- error:&error];
+ [GPBMessage parseDelimitedFromCodedInputStream:input extensionRegistry:nil error:&error];
XCTAssertNil(error);
}
@@ -1433,10 +1406,8 @@
initWithValidationFunction:Proto2MapEnumPlusExtra_IsValidValue] autorelease];
orig.unknownMapField = [[[GPBInt32EnumDictionary alloc]
initWithValidationFunction:Proto2MapEnumPlusExtra_IsValidValue] autorelease];
- [orig.knownMapField setEnum:Proto2MapEnumPlusExtra_EProto2MapEnumFoo
- forKey:0];
- [orig.unknownMapField setEnum:Proto2MapEnumPlusExtra_EProto2MapEnumExtra
- forKey:0];
+ [orig.knownMapField setEnum:Proto2MapEnumPlusExtra_EProto2MapEnumFoo forKey:0];
+ [orig.unknownMapField setEnum:Proto2MapEnumPlusExtra_EProto2MapEnumExtra forKey:0];
NSData *data = [orig data];
XCTAssertNotNil(data);
@@ -1448,8 +1419,7 @@
XCTAssertEqual(msg1.unknownFields.countOfFields, 1U);
data = [msg1 data];
- TestEnumMapPlusExtra *msg2 =
- [TestEnumMapPlusExtra parseFromData:data error:NULL];
+ TestEnumMapPlusExtra *msg2 = [TestEnumMapPlusExtra parseFromData:data error:NULL];
val = -1;
XCTAssertEqual(msg2.knownMapField.count, 1U);
XCTAssertTrue([msg2.knownMapField getEnum:&val forKey:0]);
diff --git a/objectivec/Tests/GPBMessageTests.m b/objectivec/Tests/GPBMessageTests.m
index b2c75ba..83b8d11 100644
--- a/objectivec/Tests/GPBMessageTests.m
+++ b/objectivec/Tests/GPBMessageTests.m
@@ -36,12 +36,12 @@
#import "GPBDescriptor.h"
#import "GPBDictionary_PackagePrivate.h"
#import "GPBMessage_PackagePrivate.h"
-#import "GPBUnknownField_PackagePrivate.h"
#import "GPBUnknownFieldSet_PackagePrivate.h"
-#import "google/protobuf/Unittest.pbobjc.h"
-#import "google/protobuf/UnittestObjc.pbobjc.h"
-#import "google/protobuf/UnittestObjcOptions.pbobjc.h"
-#import "google/protobuf/UnittestImport.pbobjc.h"
+#import "GPBUnknownField_PackagePrivate.h"
+#import "objectivec/Tests/Unittest.pbobjc.h"
+#import "objectivec/Tests/UnittestImport.pbobjc.h"
+#import "objectivec/Tests/UnittestObjc.pbobjc.h"
+#import "objectivec/Tests/UnittestObjcOptions.pbobjc.h"
// Helper class to test KVO.
@interface GPBKVOTestObserver : NSObject {
@@ -49,7 +49,7 @@
NSString *keyPath_;
}
-@property (nonatomic) BOOL didObserve;
+@property(nonatomic) BOOL didObserve;
- (id)initWithObservee:(id)observee keyPath:(NSString *)keyPath;
@end
@@ -74,13 +74,9 @@
}
- (void)observeValueForKeyPath:(NSString *)keyPath
- ofObject:(id)object
- change:(NSDictionary *)change
- context:(void *)context
-{
-#pragma unused(object)
-#pragma unused(change)
-#pragma unused(context)
+ ofObject:(__unused id)object
+ change:(__unused NSDictionary *)change
+ context:(__unused void *)context {
if ([keyPath isEqualToString:keyPath_]) {
self.didObserve = YES;
}
@@ -156,12 +152,9 @@
[message setExtension:[UnittestRoot optionalStringExtension] value:@"foo"];
ForeignMessage *foreignMessage = [ForeignMessage message];
foreignMessage.c = 4;
- [message setExtension:[UnittestRoot optionalForeignMessageExtension]
- value:foreignMessage];
- TestAllTypes_NestedMessage *nestedMessage =
- [TestAllTypes_NestedMessage message];
- [message setExtension:[UnittestRoot optionalNestedMessageExtension]
- value:nestedMessage];
+ [message setExtension:[UnittestRoot optionalForeignMessageExtension] value:foreignMessage];
+ TestAllTypes_NestedMessage *nestedMessage = [TestAllTypes_NestedMessage message];
+ [message setExtension:[UnittestRoot optionalNestedMessageExtension] value:nestedMessage];
return message;
}
@@ -170,13 +163,10 @@
[message setExtension:[UnittestRoot optionalInt64Extension] value:@6];
[message setExtension:[UnittestRoot optionalStringExtension] value:@"bar"];
ForeignMessage *foreignMessage = [ForeignMessage message];
- [message setExtension:[UnittestRoot optionalForeignMessageExtension]
- value:foreignMessage];
- TestAllTypes_NestedMessage *nestedMessage =
- [TestAllTypes_NestedMessage message];
+ [message setExtension:[UnittestRoot optionalForeignMessageExtension] value:foreignMessage];
+ TestAllTypes_NestedMessage *nestedMessage = [TestAllTypes_NestedMessage message];
nestedMessage.bb = 7;
- [message setExtension:[UnittestRoot optionalNestedMessageExtension]
- value:nestedMessage];
+ [message setExtension:[UnittestRoot optionalNestedMessageExtension] value:nestedMessage];
return message;
}
@@ -187,13 +177,10 @@
[message setExtension:[UnittestRoot optionalStringExtension] value:@"bar"];
ForeignMessage *foreignMessage = [ForeignMessage message];
foreignMessage.c = 4;
- [message setExtension:[UnittestRoot optionalForeignMessageExtension]
- value:foreignMessage];
- TestAllTypes_NestedMessage *nestedMessage =
- [TestAllTypes_NestedMessage message];
+ [message setExtension:[UnittestRoot optionalForeignMessageExtension] value:foreignMessage];
+ TestAllTypes_NestedMessage *nestedMessage = [TestAllTypes_NestedMessage message];
nestedMessage.bb = 7;
- [message setExtension:[UnittestRoot optionalNestedMessageExtension]
- value:nestedMessage];
+ [message setExtension:[UnittestRoot optionalNestedMessageExtension] value:nestedMessage];
return message;
}
@@ -211,11 +198,9 @@
result = [[self.mergeDestinationWithoutForeignMessageIvar copy] autorelease];
[result mergeFrom:self.mergeSource];
resultData = [result data];
- mergeResultData =
- [self.mergeResultForDestinationWithoutForeignMessageIvar data];
+ mergeResultData = [self.mergeResultForDestinationWithoutForeignMessageIvar data];
XCTAssertEqualObjects(resultData, mergeResultData);
- XCTAssertEqualObjects(
- result, self.mergeResultForDestinationWithoutForeignMessageIvar);
+ XCTAssertEqualObjects(result, self.mergeResultForDestinationWithoutForeignMessageIvar);
// Test when destination is empty.
// The result must is same as the source.
@@ -239,8 +224,7 @@
result = [self mergeExtensionsDestination];
NSData *data = [[self mergeExtensionsSource] data];
XCTAssertNotNil(data);
- [result mergeFromData:data
- extensionRegistry:[UnittestRoot extensionRegistry]];
+ [result mergeFromData:data extensionRegistry:[UnittestRoot extensionRegistry]];
resultData = [result data];
XCTAssertEqualObjects(resultData, mergeResultData);
XCTAssertEqualObjects(result, [self mergeExtensionsResult]);
@@ -306,16 +290,13 @@
[message setExtension:[TestRequired single] value:[TestRequired message]];
XCTAssertFalse(message.initialized);
- [message setExtension:[TestRequired single]
- value:self.testRequiredInitialized];
+ [message setExtension:[TestRequired single] value:self.testRequiredInitialized];
XCTAssertTrue(message.initialized);
[message addExtension:[TestRequired multi] value:[TestRequired message]];
XCTAssertFalse(message.initialized);
- [message setExtension:[TestRequired multi]
- index:0
- value:self.testRequiredInitialized];
+ [message setExtension:[TestRequired multi] index:0 value:self.testRequiredInitialized];
XCTAssertTrue(message.initialized);
}
@@ -367,8 +348,7 @@
- (void)testParseUninitialized {
NSError *error = nil;
- TestRequired *msg =
- [TestRequired parseFromData:GPBEmptyNSData() error:&error];
+ TestRequired *msg = [TestRequired parseFromData:GPBEmptyNSData() error:&error];
// In DEBUG, the parse will fail, but in non DEBUG, it passes because
// the check isn't done (for speed).
#ifdef DEBUG
@@ -388,8 +368,7 @@
- (void)testCoding {
GPBMessage *original = [self mergeResult];
- NSData *data =
- [NSKeyedArchiver archivedDataWithRootObject:original];
+ NSData *data = [NSKeyedArchiver archivedDataWithRootObject:original];
id unarchivedObject = [NSKeyedUnarchiver unarchiveObjectWithData:data];
XCTAssertEqualObjects(unarchivedObject, original);
@@ -411,8 +390,7 @@
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
[unarchiver setRequiresSecureCoding:YES];
- id unarchivedObject = [unarchiver decodeObjectOfClass:[GPBMessage class]
- forKey:key];
+ id unarchivedObject = [unarchiver decodeObjectOfClass:[GPBMessage class] forKey:key];
[unarchiver finishDecoding];
XCTAssertEqualObjects(unarchivedObject, original);
@@ -485,9 +463,7 @@
- (void)testKVOBasic {
TestAllTypes *message = [TestAllTypes message];
GPBKVOTestObserver *observer =
- [[[GPBKVOTestObserver alloc] initWithObservee:message
- keyPath:@"optionalString"]
- autorelease];
+ [[[GPBKVOTestObserver alloc] initWithObservee:message keyPath:@"optionalString"] autorelease];
XCTAssertFalse(observer.didObserve);
message.defaultString = @"Hello";
XCTAssertFalse(observer.didObserve);
@@ -499,12 +475,10 @@
TestAllTypes *message = [TestAllTypes message];
GPBKVOTestObserver *autocreateObserver =
[[[GPBKVOTestObserver alloc] initWithObservee:message
- keyPath:@"optionalImportMessage"]
- autorelease];
- GPBKVOTestObserver *innerFieldObserver =
- [[[GPBKVOTestObserver alloc] initWithObservee:message
- keyPath:@"optionalImportMessage.d"]
- autorelease];
+ keyPath:@"optionalImportMessage"] autorelease];
+ GPBKVOTestObserver *innerFieldObserver =
+ [[[GPBKVOTestObserver alloc] initWithObservee:message
+ keyPath:@"optionalImportMessage.d"] autorelease];
XCTAssertFalse(autocreateObserver.didObserve);
XCTAssertFalse(innerFieldObserver.didObserve);
@@ -536,10 +510,8 @@
TestAllTypes *message = [TestAllTypes message];
[self setAllFields:message repeatedCount:kGPBDefaultRepeatCount];
- GPBUnknownFieldSet *unknownFields =
- [[[GPBUnknownFieldSet alloc] init] autorelease];
- GPBUnknownField *field =
- [[[GPBUnknownField alloc] initWithNumber:2] autorelease];
+ GPBUnknownFieldSet *unknownFields = [[[GPBUnknownFieldSet alloc] init] autorelease];
+ GPBUnknownField *field = [[[GPBUnknownField alloc] initWithNumber:2] autorelease];
[field addVarint:2];
[unknownFields addField:field];
field = [[[GPBUnknownField alloc] initWithNumber:3] autorelease];
@@ -567,8 +539,7 @@
TestAllTypes *message = [TestAllTypes message];
GPBDescriptor *descriptor = [[message class] descriptor];
XCTAssertNotNil(descriptor);
- GPBFieldDescriptor *fieldDescriptor =
- [descriptor fieldWithName:@"defaultInt32"];
+ GPBFieldDescriptor *fieldDescriptor = [descriptor fieldWithName:@"defaultInt32"];
XCTAssertNotNil(fieldDescriptor);
GPBGenericValue defaultValue = [fieldDescriptor defaultValue];
[message setDefaultInt32:defaultValue.valueInt32];
@@ -679,8 +650,7 @@
TestAllTypes *message = [TestAllTypes message];
[self setAllFields:message repeatedCount:kGPBDefaultRepeatCount];
[self modifyRepeatedFields:message];
- [self assertRepeatedFieldsModified:message
- repeatedCount:kGPBDefaultRepeatCount];
+ [self assertRepeatedFieldsModified:message repeatedCount:kGPBDefaultRepeatCount];
}
- (void)testClear {
@@ -712,19 +682,16 @@
GPBMessage *message2 = [TestAllExtensions message];
[message2 addExtension:[UnittestRoot repeatedInt32Extension] value:@1];
- XCTAssertEqual(
- [[message2 getExtension:[UnittestRoot repeatedInt32Extension]] count],
- (NSUInteger)1);
+ XCTAssertEqual([[message2 getExtension:[UnittestRoot repeatedInt32Extension]] count],
+ (NSUInteger)1);
[message2 clearExtension:[UnittestRoot repeatedInt32Extension]];
- XCTAssertEqual(
- [[message2 getExtension:[UnittestRoot repeatedInt32Extension]] count],
- (NSUInteger)0);
+ XCTAssertEqual([[message2 getExtension:[UnittestRoot repeatedInt32Extension]] count],
+ (NSUInteger)0);
// Clearing an unset extension field shouldn't make the target message
// visible.
GPBMessage *message3 = [TestAllExtensions message];
- GPBMessage *extension_msg =
- [message3 getExtension:[UnittestObjcRoot recursiveExtension]];
+ GPBMessage *extension_msg = [message3 getExtension:[UnittestObjcRoot recursiveExtension]];
XCTAssertFalse([message3 hasExtension:[UnittestObjcRoot recursiveExtension]]);
[extension_msg clearExtension:[UnittestRoot optionalInt32Extension]];
XCTAssertFalse([message3 hasExtension:[UnittestObjcRoot recursiveExtension]]);
@@ -745,15 +712,11 @@
// They should auto create something when fetched.
TestAllTypes_OptionalGroup *optionalGroup = [message.optionalGroup retain];
- TestAllTypes_NestedMessage *optionalNestedMessage =
- [message.optionalNestedMessage retain];
- ForeignMessage *optionalForeignMessage =
- [message.optionalForeignMessage retain];
+ TestAllTypes_NestedMessage *optionalNestedMessage = [message.optionalNestedMessage retain];
+ ForeignMessage *optionalForeignMessage = [message.optionalForeignMessage retain];
ImportMessage *optionalImportMessage = [message.optionalImportMessage retain];
- PublicImportMessage *optionalPublicImportMessage =
- [message.optionalPublicImportMessage retain];
- TestAllTypes_NestedMessage *optionalLazyMessage =
- [message.optionalLazyMessage retain];
+ PublicImportMessage *optionalPublicImportMessage = [message.optionalPublicImportMessage retain];
+ TestAllTypes_NestedMessage *optionalLazyMessage = [message.optionalLazyMessage retain];
XCTAssertNotNil(optionalGroup);
XCTAssertNotNil(optionalNestedMessage);
@@ -779,8 +742,7 @@
XCTAssertEqual(message.optionalNestedMessage, optionalNestedMessage);
XCTAssertEqual(message.optionalForeignMessage, optionalForeignMessage);
XCTAssertEqual(message.optionalImportMessage, optionalImportMessage);
- XCTAssertEqual(message.optionalPublicImportMessage,
- optionalPublicImportMessage);
+ XCTAssertEqual(message.optionalPublicImportMessage, optionalPublicImportMessage);
XCTAssertEqual(message.optionalLazyMessage, optionalLazyMessage);
// And the default objects for a second message should be distinct (again,
@@ -793,8 +755,7 @@
XCTAssertNotEqual(message2.optionalNestedMessage, optionalNestedMessage);
XCTAssertNotEqual(message2.optionalForeignMessage, optionalForeignMessage);
XCTAssertNotEqual(message2.optionalImportMessage, optionalImportMessage);
- XCTAssertNotEqual(message2.optionalPublicImportMessage,
- optionalPublicImportMessage);
+ XCTAssertNotEqual(message2.optionalPublicImportMessage, optionalPublicImportMessage);
XCTAssertNotEqual(message2.optionalLazyMessage, optionalLazyMessage);
// Setting the values to nil will clear the has flag, and on next access you
@@ -819,8 +780,7 @@
XCTAssertNotEqual(message.optionalNestedMessage, optionalNestedMessage);
XCTAssertNotEqual(message.optionalForeignMessage, optionalForeignMessage);
XCTAssertNotEqual(message.optionalImportMessage, optionalImportMessage);
- XCTAssertNotEqual(message.optionalPublicImportMessage,
- optionalPublicImportMessage);
+ XCTAssertNotEqual(message.optionalPublicImportMessage, optionalPublicImportMessage);
XCTAssertNotEqual(message.optionalLazyMessage, optionalLazyMessage);
[optionalGroup release];
@@ -853,8 +813,7 @@
XCTAssertFalse([message2 hasOptionalNestedMessage]);
// Intentionally doing a pointer comparison.
- XCTAssertNotEqual(message.optionalNestedMessage,
- message2.optionalNestedMessage);
+ XCTAssertNotEqual(message.optionalNestedMessage, message2.optionalNestedMessage);
}
- (void)testClearAutocreatedSubmessage {
@@ -880,10 +839,9 @@
ForeignMessage *subMessage;
@autoreleasepool {
TestAllTypes *message2 = [TestAllTypes message];
- subMessage = message2.optionalForeignMessage; // Autocreated
+ subMessage = message2.optionalForeignMessage; // Autocreated
message.optionalForeignMessage = subMessage;
- XCTAssertTrue(GPBWasMessageAutocreatedBy(message.optionalForeignMessage,
- message2));
+ XCTAssertTrue(GPBWasMessageAutocreatedBy(message.optionalForeignMessage, message2));
}
// Should be the same object, and should still be live.
@@ -1019,8 +977,7 @@
// Setting autocreated submessage to another value should cause the old one to
// lose its creator.
TestAllTypes *message = [TestAllTypes message];
- TestAllTypes_NestedMessage *nestedMessage =
- [message.optionalNestedMessage retain];
+ TestAllTypes_NestedMessage *nestedMessage = [message.optionalNestedMessage retain];
message.optionalNestedMessage = [TestAllTypes_NestedMessage message];
XCTAssertTrue([message hasOptionalNestedMessage]);
@@ -1039,8 +996,7 @@
XCTAssertNil(message.optionalNestedMessage.unknownFields);
XCTAssertFalse([message hasOptionalNestedMessage]);
- GPBUnknownFieldSet *unknownFields =
- [[[GPBUnknownFieldSet alloc] init] autorelease];
+ GPBUnknownFieldSet *unknownFields = [[[GPBUnknownFieldSet alloc] init] autorelease];
message.optionalNestedMessage.unknownFields = unknownFields;
XCTAssertTrue([message hasOptionalNestedMessage]);
@@ -1089,10 +1045,8 @@
- (void)testDefaultingArrays {
// Basic tests for default creation of arrays in a message.
- TestRecursiveMessageWithRepeatedField *message =
- [TestRecursiveMessageWithRepeatedField message];
- TestRecursiveMessageWithRepeatedField *message2 =
- [TestRecursiveMessageWithRepeatedField message];
+ TestRecursiveMessageWithRepeatedField *message = [TestRecursiveMessageWithRepeatedField message];
+ TestRecursiveMessageWithRepeatedField *message2 = [TestRecursiveMessageWithRepeatedField message];
// Simply accessing the array should not make any fields visible.
XCTAssertNotNil(message.a.a.iArray);
@@ -1159,11 +1113,9 @@
XCTAssertNotNil(message.repeatedStringArray);
TestAllTypes *message4 = [[message3 copy] autorelease];
XCTAssertNotEqual(message3.repeatedInt32Array, message4.repeatedInt32Array);
- XCTAssertEqualObjects(message3.repeatedInt32Array,
- message4.repeatedInt32Array);
+ XCTAssertEqualObjects(message3.repeatedInt32Array, message4.repeatedInt32Array);
XCTAssertNotEqual(message3.repeatedStringArray, message4.repeatedStringArray);
- XCTAssertEqualObjects(message3.repeatedStringArray,
- message4.repeatedStringArray);
+ XCTAssertEqualObjects(message3.repeatedStringArray, message4.repeatedStringArray);
}
- (void)testAutocreatedArrayRetain {
@@ -1176,18 +1128,13 @@
message.repeatedStringArray = message2.repeatedStringArray;
// Pointer conparision
XCTAssertEqual(message.repeatedInt32Array->_autocreator, message2);
- XCTAssertTrue([message.repeatedStringArray
- isKindOfClass:[GPBAutocreatedArray class]]);
- XCTAssertEqual(
- ((GPBAutocreatedArray *)message.repeatedStringArray)->_autocreator,
- message2);
+ XCTAssertTrue([message.repeatedStringArray isKindOfClass:[GPBAutocreatedArray class]]);
+ XCTAssertEqual(((GPBAutocreatedArray *)message.repeatedStringArray)->_autocreator, message2);
}
XCTAssertNil(message.repeatedInt32Array->_autocreator);
- XCTAssertTrue(
- [message.repeatedStringArray isKindOfClass:[GPBAutocreatedArray class]]);
- XCTAssertNil(
- ((GPBAutocreatedArray *)message.repeatedStringArray)->_autocreator);
+ XCTAssertTrue([message.repeatedStringArray isKindOfClass:[GPBAutocreatedArray class]]);
+ XCTAssertNil(((GPBAutocreatedArray *)message.repeatedStringArray)->_autocreator);
}
- (void)testSetNilAutocreatedArray {
@@ -1245,8 +1192,7 @@
XCTAssertNotNil(message.a);
XCTAssertNotNil(message.a.strArray);
XCTAssertFalse([message hasA]);
- GPBAutocreatedArray *strArray =
- (GPBAutocreatedArray *)[message.a.strArray retain];
+ GPBAutocreatedArray *strArray = (GPBAutocreatedArray *)[message.a.strArray retain];
XCTAssertTrue([strArray isKindOfClass:[GPBAutocreatedArray class]]);
XCTAssertEqual(strArray->_autocreator, message.a); // Pointer comparison
message.a.strArray = [NSMutableArray arrayWithObject:@"foo"];
@@ -1286,8 +1232,7 @@
- (void)testAutocreatedArrayRemoveAllValues {
// Calling removeAllValues on autocreated array should not cause it to be
// visible.
- TestRecursiveMessageWithRepeatedField *message =
- [TestRecursiveMessageWithRepeatedField message];
+ TestRecursiveMessageWithRepeatedField *message = [TestRecursiveMessageWithRepeatedField message];
[message.a.iArray removeAll];
XCTAssertFalse([message hasA]);
[message.a.strArray removeAllObjects];
@@ -1296,10 +1241,8 @@
- (void)testDefaultingMaps {
// Basic tests for default creation of maps in a message.
- TestRecursiveMessageWithRepeatedField *message =
- [TestRecursiveMessageWithRepeatedField message];
- TestRecursiveMessageWithRepeatedField *message2 =
- [TestRecursiveMessageWithRepeatedField message];
+ TestRecursiveMessageWithRepeatedField *message = [TestRecursiveMessageWithRepeatedField message];
+ TestRecursiveMessageWithRepeatedField *message2 = [TestRecursiveMessageWithRepeatedField message];
// Simply accessing the map should not make any fields visible.
XCTAssertNotNil(message.a.a.iToI);
@@ -1349,28 +1292,23 @@
- (void)testAutocreatedMapCopy {
// Copy should not copy autocreated maps.
- TestRecursiveMessageWithRepeatedField *message =
- [TestRecursiveMessageWithRepeatedField message];
+ TestRecursiveMessageWithRepeatedField *message = [TestRecursiveMessageWithRepeatedField message];
XCTAssertNotNil(message.strToStr);
XCTAssertNotNil(message.iToI);
- TestRecursiveMessageWithRepeatedField *message2 =
- [[message copy] autorelease];
+ TestRecursiveMessageWithRepeatedField *message2 = [[message copy] autorelease];
// Pointer conparisions.
XCTAssertNotEqual(message.strToStr, message2.strToStr);
XCTAssertNotEqual(message.iToI, message2.iToI);
// Mutable copy should copy empty arrays that were explicitly set (end up
// with different objects that are equal).
- TestRecursiveMessageWithRepeatedField *message3 =
- [TestRecursiveMessageWithRepeatedField message];
+ TestRecursiveMessageWithRepeatedField *message3 = [TestRecursiveMessageWithRepeatedField message];
message3.iToI = [[[GPBInt32Int32Dictionary alloc] init] autorelease];
[message3.iToI setInt32:10 forKey:20];
- message3.strToStr =
- [NSMutableDictionary dictionaryWithObject:@"abc" forKey:@"123"];
+ message3.strToStr = [NSMutableDictionary dictionaryWithObject:@"abc" forKey:@"123"];
XCTAssertNotNil(message.iToI);
XCTAssertNotNil(message.iToI);
- TestRecursiveMessageWithRepeatedField *message4 =
- [[message3 copy] autorelease];
+ TestRecursiveMessageWithRepeatedField *message4 = [[message3 copy] autorelease];
XCTAssertNotEqual(message3.iToI, message4.iToI);
XCTAssertEqualObjects(message3.iToI, message4.iToI);
XCTAssertNotEqual(message3.strToStr, message4.strToStr);
@@ -1379,8 +1317,7 @@
- (void)testAutocreatedMapRetain {
// Should be able to retain autocreated map while the creator is dealloced.
- TestRecursiveMessageWithRepeatedField *message =
- [TestRecursiveMessageWithRepeatedField message];
+ TestRecursiveMessageWithRepeatedField *message = [TestRecursiveMessageWithRepeatedField message];
@autoreleasepool {
TestRecursiveMessageWithRepeatedField *message2 =
@@ -1389,27 +1326,20 @@
message.strToStr = message2.strToStr;
// Pointer conparision
XCTAssertEqual(message.iToI->_autocreator, message2);
- XCTAssertTrue([message.strToStr
- isKindOfClass:[GPBAutocreatedDictionary class]]);
- XCTAssertEqual(
- ((GPBAutocreatedDictionary *)message.strToStr)->_autocreator,
- message2);
+ XCTAssertTrue([message.strToStr isKindOfClass:[GPBAutocreatedDictionary class]]);
+ XCTAssertEqual(((GPBAutocreatedDictionary *)message.strToStr)->_autocreator, message2);
}
XCTAssertNil(message.iToI->_autocreator);
- XCTAssertTrue(
- [message.strToStr isKindOfClass:[GPBAutocreatedDictionary class]]);
- XCTAssertNil(
- ((GPBAutocreatedDictionary *)message.strToStr)->_autocreator);
+ XCTAssertTrue([message.strToStr isKindOfClass:[GPBAutocreatedDictionary class]]);
+ XCTAssertNil(((GPBAutocreatedDictionary *)message.strToStr)->_autocreator);
}
- (void)testSetNilAutocreatedMap {
// Setting map to nil should cause it to lose its delegate.
- TestRecursiveMessageWithRepeatedField *message =
- [TestRecursiveMessageWithRepeatedField message];
+ TestRecursiveMessageWithRepeatedField *message = [TestRecursiveMessageWithRepeatedField message];
GPBInt32Int32Dictionary *iToI = [message.iToI retain];
- GPBAutocreatedDictionary *strToStr =
- (GPBAutocreatedDictionary *)[message.strToStr retain];
+ GPBAutocreatedDictionary *strToStr = (GPBAutocreatedDictionary *)[message.strToStr retain];
XCTAssertTrue([strToStr isKindOfClass:[GPBAutocreatedDictionary class]]);
XCTAssertEqual(iToI->_autocreator, message);
XCTAssertEqual(strToStr->_autocreator, message);
@@ -1426,15 +1356,13 @@
// an autocreated one or a straight NSDictionary.
// The real test here is that nothing crashes while doing the work.
- TestRecursiveMessageWithRepeatedField *message =
- [TestRecursiveMessageWithRepeatedField message];
+ TestRecursiveMessageWithRepeatedField *message = [TestRecursiveMessageWithRepeatedField message];
message.strToStr[@"foo"] = @"bar";
XCTAssertEqual(message.strToStr_Count, (NSUInteger)1);
message.strToStr =
[NSMutableDictionary dictionaryWithObjectsAndKeys:@"bar", @"key1", @"baz", @"key2", nil];
XCTAssertEqual(message.strToStr_Count, (NSUInteger)2);
- message.strToStr =
- [NSMutableDictionary dictionaryWithObject:@"baz" forKey:@"mumble"];
+ message.strToStr = [NSMutableDictionary dictionaryWithObject:@"baz" forKey:@"mumble"];
XCTAssertEqual(message.strToStr_Count, (NSUInteger)1);
}
@@ -1463,12 +1391,10 @@
XCTAssertNotNil(message.a);
XCTAssertNotNil(message.a.strToStr);
XCTAssertFalse([message hasA]);
- GPBAutocreatedDictionary *strToStr =
- (GPBAutocreatedDictionary *)[message.a.strToStr retain];
+ GPBAutocreatedDictionary *strToStr = (GPBAutocreatedDictionary *)[message.a.strToStr retain];
XCTAssertTrue([strToStr isKindOfClass:[GPBAutocreatedDictionary class]]);
XCTAssertEqual(strToStr->_autocreator, message.a); // Pointer comparison
- message.a.strToStr =
- [NSMutableDictionary dictionaryWithObject:@"abc" forKey:@"def"];
+ message.a.strToStr = [NSMutableDictionary dictionaryWithObject:@"abc" forKey:@"def"];
XCTAssertTrue([message hasA]);
XCTAssertNotEqual(message.a.strToStr, strToStr); // Pointer comparison
XCTAssertNil(strToStr->_autocreator);
@@ -1504,8 +1430,7 @@
- (void)testAutocreatedMapRemoveAllValues {
// Calling removeAll on autocreated map should not cause it to be visible.
- TestRecursiveMessageWithRepeatedField *message =
- [TestRecursiveMessageWithRepeatedField message];
+ TestRecursiveMessageWithRepeatedField *message = [TestRecursiveMessageWithRepeatedField message];
[message.a.iToI removeAll];
XCTAssertFalse([message hasA]);
[message.a.strToStr removeAllObjects];
@@ -1522,8 +1447,7 @@
TestAllExtensions *message = [TestAllExtensions message];
[self setAllExtensions:message repeatedCount:kGPBDefaultRepeatCount];
[self modifyRepeatedExtensions:message];
- [self assertRepeatedExtensionsModified:message
- repeatedCount:kGPBDefaultRepeatCount];
+ [self assertRepeatedExtensionsModified:message repeatedCount:kGPBDefaultRepeatCount];
}
- (void)testExtensionDefaults {
@@ -1564,16 +1488,11 @@
XCTAssertFalse([message hasExtension:[UnittestRoot optionalGroupExtension]]);
XCTAssertFalse([message hasExtension:[UnittestRoot optionalGroupExtension]]);
- XCTAssertFalse(
- [message hasExtension:[UnittestRoot optionalNestedMessageExtension]]);
- XCTAssertFalse(
- [message hasExtension:[UnittestRoot optionalForeignMessageExtension]]);
- XCTAssertFalse(
- [message hasExtension:[UnittestRoot optionalImportMessageExtension]]);
- XCTAssertFalse([message
- hasExtension:[UnittestRoot optionalPublicImportMessageExtension]]);
- XCTAssertFalse(
- [message hasExtension:[UnittestRoot optionalLazyMessageExtension]]);
+ XCTAssertFalse([message hasExtension:[UnittestRoot optionalNestedMessageExtension]]);
+ XCTAssertFalse([message hasExtension:[UnittestRoot optionalForeignMessageExtension]]);
+ XCTAssertFalse([message hasExtension:[UnittestRoot optionalImportMessageExtension]]);
+ XCTAssertFalse([message hasExtension:[UnittestRoot optionalPublicImportMessageExtension]]);
+ XCTAssertFalse([message hasExtension:[UnittestRoot optionalLazyMessageExtension]]);
// They should auto create something when fetched.
@@ -1585,8 +1504,8 @@
[message getExtension:[UnittestRoot optionalForeignMessageExtension]];
ImportMessage *optionalImportMessage =
[message getExtension:[UnittestRoot optionalImportMessageExtension]];
- PublicImportMessage *optionalPublicImportMessage = [message
- getExtension:[UnittestRoot optionalPublicImportMessageExtension]];
+ PublicImportMessage *optionalPublicImportMessage =
+ [message getExtension:[UnittestRoot optionalPublicImportMessageExtension]];
TestAllTypes_NestedMessage *optionalLazyMessage =
[message getExtension:[UnittestRoot optionalLazyMessageExtension]];
@@ -1611,23 +1530,17 @@
// And they set that value back in to the message since the value created was
// mutable (so a second fetch should give the same object).
- XCTAssertEqual([message getExtension:[UnittestRoot optionalGroupExtension]],
- optionalGroup);
- XCTAssertEqual(
- [message getExtension:[UnittestRoot optionalNestedMessageExtension]],
- optionalNestedMessage);
- XCTAssertEqual(
- [message getExtension:[UnittestRoot optionalForeignMessageExtension]],
- optionalForeignMessage);
- XCTAssertEqual(
- [message getExtension:[UnittestRoot optionalImportMessageExtension]],
- optionalImportMessage);
- XCTAssertEqual(
- [message getExtension:[UnittestRoot optionalPublicImportMessageExtension]],
- optionalPublicImportMessage);
- XCTAssertEqual(
- [message getExtension:[UnittestRoot optionalLazyMessageExtension]],
- optionalLazyMessage);
+ XCTAssertEqual([message getExtension:[UnittestRoot optionalGroupExtension]], optionalGroup);
+ XCTAssertEqual([message getExtension:[UnittestRoot optionalNestedMessageExtension]],
+ optionalNestedMessage);
+ XCTAssertEqual([message getExtension:[UnittestRoot optionalForeignMessageExtension]],
+ optionalForeignMessage);
+ XCTAssertEqual([message getExtension:[UnittestRoot optionalImportMessageExtension]],
+ optionalImportMessage);
+ XCTAssertEqual([message getExtension:[UnittestRoot optionalPublicImportMessageExtension]],
+ optionalPublicImportMessage);
+ XCTAssertEqual([message getExtension:[UnittestRoot optionalLazyMessageExtension]],
+ optionalLazyMessage);
// And the default objects for a second message should be distinct (again,
// since they are mutable, each needs their own copy).
@@ -1635,70 +1548,47 @@
TestAllExtensions *message2 = [TestAllExtensions message];
// Intentionally doing a pointer comparison.
- XCTAssertNotEqual(
- [message2 getExtension:[UnittestRoot optionalGroupExtension]],
- optionalGroup);
- XCTAssertNotEqual(
- [message2 getExtension:[UnittestRoot optionalNestedMessageExtension]],
- optionalNestedMessage);
- XCTAssertNotEqual(
- [message2 getExtension:[UnittestRoot optionalForeignMessageExtension]],
- optionalForeignMessage);
- XCTAssertNotEqual(
- [message2 getExtension:[UnittestRoot optionalImportMessageExtension]],
- optionalImportMessage);
- XCTAssertNotEqual(
- [message2 getExtension:[UnittestRoot optionalPublicImportMessageExtension]],
- optionalPublicImportMessage);
- XCTAssertNotEqual(
- [message2 getExtension:[UnittestRoot optionalLazyMessageExtension]],
- optionalLazyMessage);
+ XCTAssertNotEqual([message2 getExtension:[UnittestRoot optionalGroupExtension]], optionalGroup);
+ XCTAssertNotEqual([message2 getExtension:[UnittestRoot optionalNestedMessageExtension]],
+ optionalNestedMessage);
+ XCTAssertNotEqual([message2 getExtension:[UnittestRoot optionalForeignMessageExtension]],
+ optionalForeignMessage);
+ XCTAssertNotEqual([message2 getExtension:[UnittestRoot optionalImportMessageExtension]],
+ optionalImportMessage);
+ XCTAssertNotEqual([message2 getExtension:[UnittestRoot optionalPublicImportMessageExtension]],
+ optionalPublicImportMessage);
+ XCTAssertNotEqual([message2 getExtension:[UnittestRoot optionalLazyMessageExtension]],
+ optionalLazyMessage);
// Clear values, and on next access you get back new submessages.
[message setExtension:[UnittestRoot optionalGroupExtension] value:nil];
[message setExtension:[UnittestRoot optionalGroupExtension] value:nil];
- [message setExtension:[UnittestRoot optionalNestedMessageExtension]
- value:nil];
- [message setExtension:[UnittestRoot optionalForeignMessageExtension]
- value:nil];
- [message setExtension:[UnittestRoot optionalImportMessageExtension]
- value:nil];
- [message setExtension:[UnittestRoot optionalPublicImportMessageExtension]
- value:nil];
+ [message setExtension:[UnittestRoot optionalNestedMessageExtension] value:nil];
+ [message setExtension:[UnittestRoot optionalForeignMessageExtension] value:nil];
+ [message setExtension:[UnittestRoot optionalImportMessageExtension] value:nil];
+ [message setExtension:[UnittestRoot optionalPublicImportMessageExtension] value:nil];
[message setExtension:[UnittestRoot optionalLazyMessageExtension] value:nil];
XCTAssertFalse([message hasExtension:[UnittestRoot optionalGroupExtension]]);
XCTAssertFalse([message hasExtension:[UnittestRoot optionalGroupExtension]]);
- XCTAssertFalse(
- [message hasExtension:[UnittestRoot optionalNestedMessageExtension]]);
- XCTAssertFalse(
- [message hasExtension:[UnittestRoot optionalForeignMessageExtension]]);
- XCTAssertFalse(
- [message hasExtension:[UnittestRoot optionalImportMessageExtension]]);
- XCTAssertFalse([message
- hasExtension:[UnittestRoot optionalPublicImportMessageExtension]]);
- XCTAssertFalse(
- [message hasExtension:[UnittestRoot optionalLazyMessageExtension]]);
+ XCTAssertFalse([message hasExtension:[UnittestRoot optionalNestedMessageExtension]]);
+ XCTAssertFalse([message hasExtension:[UnittestRoot optionalForeignMessageExtension]]);
+ XCTAssertFalse([message hasExtension:[UnittestRoot optionalImportMessageExtension]]);
+ XCTAssertFalse([message hasExtension:[UnittestRoot optionalPublicImportMessageExtension]]);
+ XCTAssertFalse([message hasExtension:[UnittestRoot optionalLazyMessageExtension]]);
- XCTAssertEqual([message getExtension:[UnittestRoot optionalGroupExtension]],
- optionalGroup);
- XCTAssertEqual(
- [message getExtension:[UnittestRoot optionalNestedMessageExtension]],
- optionalNestedMessage);
- XCTAssertEqual(
- [message getExtension:[UnittestRoot optionalForeignMessageExtension]],
- optionalForeignMessage);
- XCTAssertEqual(
- [message getExtension:[UnittestRoot optionalImportMessageExtension]],
- optionalImportMessage);
- XCTAssertEqual(
- [message
- getExtension:[UnittestRoot optionalPublicImportMessageExtension]],
- optionalPublicImportMessage);
- XCTAssertEqual(
- [message getExtension:[UnittestRoot optionalLazyMessageExtension]],
- optionalLazyMessage);
+ XCTAssertEqual([message getExtension:[UnittestRoot optionalGroupExtension]], optionalGroup);
+ XCTAssertEqual([message getExtension:[UnittestRoot optionalNestedMessageExtension]],
+ optionalNestedMessage);
+ XCTAssertEqual([message getExtension:[UnittestRoot optionalForeignMessageExtension]],
+ optionalForeignMessage);
+ XCTAssertEqual([message getExtension:[UnittestRoot optionalImportMessageExtension]],
+ optionalImportMessage);
+ XCTAssertEqual([message getExtension:[UnittestRoot optionalPublicImportMessageExtension]],
+ optionalPublicImportMessage);
+ XCTAssertEqual([message getExtension:[UnittestRoot optionalLazyMessageExtension]],
+ optionalLazyMessage);
}
- (void)testMultiplePointersToAutocreatedExtension {
@@ -1708,13 +1598,11 @@
TestAllExtensions *message2 = [TestAllExtensions message];
GPBExtensionDescriptor *extension = [UnittestRoot optionalGroupExtension];
[message setExtension:extension value:[message2 getExtension:extension]];
- XCTAssertEqual([message getExtension:extension],
- [message2 getExtension:extension]);
+ XCTAssertEqual([message getExtension:extension], [message2 getExtension:extension]);
XCTAssertFalse([message2 hasExtension:extension]);
XCTAssertTrue([message hasExtension:extension]);
- TestAllTypes_OptionalGroup *extensionValue =
- [message2 getExtension:extension];
+ TestAllTypes_OptionalGroup *extensionValue = [message2 getExtension:extension];
extensionValue.a = 1;
XCTAssertTrue([message2 hasExtension:extension]);
XCTAssertTrue([message hasExtension:extension]);
@@ -1723,12 +1611,10 @@
- (void)testCopyWithAutocreatedExtension {
// Mutable copy shouldn't copy autocreated extensions.
TestAllExtensions *message = [TestAllExtensions message];
- GPBExtensionDescriptor *optionalGroupExtension =
- [UnittestRoot optionalGroupExtension];
+ GPBExtensionDescriptor *optionalGroupExtension = [UnittestRoot optionalGroupExtension];
GPBExtensionDescriptor *optionalNestedMessageExtesion =
[UnittestRoot optionalNestedMessageExtension];
- TestAllTypes_OptionalGroup *optionalGroup =
- [message getExtension:optionalGroupExtension];
+ TestAllTypes_OptionalGroup *optionalGroup = [message getExtension:optionalGroupExtension];
optionalGroup.a = 42;
XCTAssertNotNil(optionalGroup);
XCTAssertNotNil([message getExtension:optionalNestedMessageExtesion]);
@@ -1755,13 +1641,11 @@
- (void)testClearMessageAutocreatedExtension {
// Call clear should cause it to recreate its autocreated extensions.
TestAllExtensions *message = [TestAllExtensions message];
- GPBExtensionDescriptor *optionalGroupExtension =
- [UnittestRoot optionalGroupExtension];
+ GPBExtensionDescriptor *optionalGroupExtension = [UnittestRoot optionalGroupExtension];
TestAllTypes_OptionalGroup *optionalGroup =
[[message getExtension:optionalGroupExtension] retain];
[message clear];
- TestAllTypes_OptionalGroup *optionalGroupNew =
- [message getExtension:optionalGroupExtension];
+ TestAllTypes_OptionalGroup *optionalGroupNew = [message getExtension:optionalGroupExtension];
// Intentionally doing a pointer comparison.
XCTAssertNotEqual(optionalGroup, optionalGroupNew);
@@ -1772,42 +1656,37 @@
// Should be able to retain autocreated extension while the creator is
// dealloced.
TestAllExtensions *message = [TestAllExtensions message];
- GPBExtensionDescriptor *optionalGroupExtension =
- [UnittestRoot optionalGroupExtension];
+ GPBExtensionDescriptor *optionalGroupExtension = [UnittestRoot optionalGroupExtension];
@autoreleasepool {
TestAllExtensions *message2 = [TestAllExtensions message];
[message setExtension:optionalGroupExtension
value:[message2 getExtension:optionalGroupExtension]];
- XCTAssertTrue(GPBWasMessageAutocreatedBy(
- [message getExtension:optionalGroupExtension], message2));
+ XCTAssertTrue(
+ GPBWasMessageAutocreatedBy([message getExtension:optionalGroupExtension], message2));
}
- XCTAssertFalse(GPBWasMessageAutocreatedBy(
- [message getExtension:optionalGroupExtension], message));
+ XCTAssertFalse(
+ GPBWasMessageAutocreatedBy([message getExtension:optionalGroupExtension], message));
}
- (void)testClearAutocreatedExtension {
// Clearing autocreated extension should NOT cause it to lose its creator.
TestAllExtensions *message = [TestAllExtensions message];
- GPBExtensionDescriptor *optionalGroupExtension =
- [UnittestRoot optionalGroupExtension];
+ GPBExtensionDescriptor *optionalGroupExtension = [UnittestRoot optionalGroupExtension];
TestAllTypes_OptionalGroup *optionalGroup =
[[message getExtension:optionalGroupExtension] retain];
[message clearExtension:optionalGroupExtension];
- TestAllTypes_OptionalGroup *optionalGroupNew =
- [message getExtension:optionalGroupExtension];
+ TestAllTypes_OptionalGroup *optionalGroupNew = [message getExtension:optionalGroupExtension];
XCTAssertEqual(optionalGroup, optionalGroupNew);
XCTAssertFalse([message hasExtension:optionalGroupExtension]);
[optionalGroup release];
// Clearing autocreated extension should not cause its creator to become
// visible
- GPBExtensionDescriptor *recursiveExtension =
- [UnittestObjcRoot recursiveExtension];
+ GPBExtensionDescriptor *recursiveExtension = [UnittestObjcRoot recursiveExtension];
TestAllExtensions *message_lvl2 = [message getExtension:recursiveExtension];
- TestAllExtensions *message_lvl3 =
- [message_lvl2 getExtension:recursiveExtension];
+ TestAllExtensions *message_lvl3 = [message_lvl2 getExtension:recursiveExtension];
[message_lvl3 clearExtension:recursiveExtension];
XCTAssertFalse([message hasExtension:recursiveExtension]);
}
@@ -1816,13 +1695,10 @@
// Setting an extension should cause the extension to appear to its creator.
// Test this several levels deep.
TestAllExtensions *message = [TestAllExtensions message];
- GPBExtensionDescriptor *recursiveExtension =
- [UnittestObjcRoot recursiveExtension];
+ GPBExtensionDescriptor *recursiveExtension = [UnittestObjcRoot recursiveExtension];
TestAllExtensions *message_lvl2 = [message getExtension:recursiveExtension];
- TestAllExtensions *message_lvl3 =
- [message_lvl2 getExtension:recursiveExtension];
- TestAllExtensions *message_lvl4 =
- [message_lvl3 getExtension:recursiveExtension];
+ TestAllExtensions *message_lvl3 = [message_lvl2 getExtension:recursiveExtension];
+ TestAllExtensions *message_lvl4 = [message_lvl3 getExtension:recursiveExtension];
XCTAssertFalse([message hasExtension:recursiveExtension]);
XCTAssertFalse([message_lvl2 hasExtension:recursiveExtension]);
XCTAssertFalse([message_lvl3 hasExtension:recursiveExtension]);
@@ -1840,18 +1716,15 @@
- (void)testSetAutocreatedExtensionToSelf {
// Setting extension to itself should cause it to become visible.
TestAllExtensions *message = [TestAllExtensions message];
- GPBExtensionDescriptor *optionalGroupExtension =
- [UnittestRoot optionalGroupExtension];
+ GPBExtensionDescriptor *optionalGroupExtension = [UnittestRoot optionalGroupExtension];
XCTAssertNotNil([message getExtension:optionalGroupExtension]);
XCTAssertFalse([message hasExtension:optionalGroupExtension]);
- [message setExtension:optionalGroupExtension
- value:[message getExtension:optionalGroupExtension]];
+ [message setExtension:optionalGroupExtension value:[message getExtension:optionalGroupExtension]];
XCTAssertTrue([message hasExtension:optionalGroupExtension]);
}
- (void)testAutocreatedExtensionMemoryLeaks {
- GPBExtensionDescriptor *recursiveExtension =
- [UnittestObjcRoot recursiveExtension];
+ GPBExtensionDescriptor *recursiveExtension = [UnittestObjcRoot recursiveExtension];
// Test for memory leaks with autocreated extensions.
TestAllExtensions *message;
@@ -1863,8 +1736,7 @@
message_lvl2 = [[message getExtension:recursiveExtension] retain];
message_lvl3 = [[message_lvl2 getExtension:recursiveExtension] retain];
message_lvl4 = [[message_lvl3 getExtension:recursiveExtension] retain];
- [message_lvl2 setExtension:[UnittestRoot optionalInt32Extension]
- value:@(1)];
+ [message_lvl2 setExtension:[UnittestRoot optionalInt32Extension] value:@(1)];
}
XCTAssertEqual(message.retainCount, (NSUInteger)1);
@@ -1884,8 +1756,7 @@
}
- (void)testSetExtensionWithAutocreatedValue {
- GPBExtensionDescriptor *recursiveExtension =
- [UnittestObjcRoot recursiveExtension];
+ GPBExtensionDescriptor *recursiveExtension = [UnittestObjcRoot recursiveExtension];
TestAllExtensions *message;
@autoreleasepool {
@@ -1895,8 +1766,7 @@
// This statements checks that the extension value isn't accidentally
// dealloced when removing it from the autocreated map.
- [message setExtension:recursiveExtension
- value:[message getExtension:recursiveExtension]];
+ [message setExtension:recursiveExtension value:[message getExtension:recursiveExtension]];
XCTAssertTrue([message hasExtension:recursiveExtension]);
[message release];
}
@@ -1909,26 +1779,22 @@
}
- (void)testGenerateAndParseUnknownMessage {
- GPBUnknownFieldSet *unknowns =
- [[[GPBUnknownFieldSet alloc] init] autorelease];
+ GPBUnknownFieldSet *unknowns = [[[GPBUnknownFieldSet alloc] init] autorelease];
[unknowns mergeVarintField:123 value:456];
GPBMessage *message = [GPBMessage message];
[message setUnknownFields:unknowns];
NSData *data = [message data];
- GPBMessage *message2 =
- [GPBMessage parseFromData:data extensionRegistry:nil error:NULL];
+ GPBMessage *message2 = [GPBMessage parseFromData:data extensionRegistry:nil error:NULL];
XCTAssertEqualObjects(message, message2);
}
- (void)testDelimitedWriteAndParseMultipleMessages {
- GPBUnknownFieldSet *unknowns1 =
- [[[GPBUnknownFieldSet alloc] init] autorelease];
+ GPBUnknownFieldSet *unknowns1 = [[[GPBUnknownFieldSet alloc] init] autorelease];
[unknowns1 mergeVarintField:123 value:456];
GPBMessage *message1 = [GPBMessage message];
[message1 setUnknownFields:unknowns1];
- GPBUnknownFieldSet *unknowns2 =
- [[[GPBUnknownFieldSet alloc] init] autorelease];
+ GPBUnknownFieldSet *unknowns2 = [[[GPBUnknownFieldSet alloc] init] autorelease];
[unknowns2 mergeVarintField:789 value:987];
[unknowns2 mergeVarintField:654 value:321];
GPBMessage *message2 = [GPBMessage message];
@@ -1937,8 +1803,7 @@
NSMutableData *delimitedData = [NSMutableData data];
[delimitedData appendData:[message1 delimitedData]];
[delimitedData appendData:[message2 delimitedData]];
- GPBCodedInputStream *input =
- [GPBCodedInputStream streamWithData:delimitedData];
+ GPBCodedInputStream *input = [GPBCodedInputStream streamWithData:delimitedData];
GPBMessage *message3 = [GPBMessage parseDelimitedFromCodedInputStream:input
extensionRegistry:nil
error:NULL];
@@ -1970,8 +1835,7 @@
}
- (void)testEnumDescriptorFromExtensionDescriptor {
- GPBExtensionDescriptor *extDescriptor =
- [UnittestRoot optionalForeignEnumExtension];
+ GPBExtensionDescriptor *extDescriptor = [UnittestRoot optionalForeignEnumExtension];
XCTAssertEqual(extDescriptor.dataType, GPBDataTypeEnum);
GPBEnumDescriptor *enumDescriptor = extDescriptor.enumDescriptor;
GPBEnumDescriptor *expectedDescriptor = ForeignEnum_EnumDescriptor();
@@ -2078,8 +1942,7 @@
// Repeated field (shouldn't ever be an issue since developer has to use the
// right GPBArray methods themselves).
- msg.mumbleArray = [GPBEnumArray
- arrayWithValidationFunction:EnumTestMsg_MyEnum_IsValidValue];
+ msg.mumbleArray = [GPBEnumArray arrayWithValidationFunction:EnumTestMsg_MyEnum_IsValidValue];
[msg.mumbleArray addValue:EnumTestMsg_MyEnum_Zero];
[msg.mumbleArray addValue:EnumTestMsg_MyEnum_One];
[msg.mumbleArray addValue:EnumTestMsg_MyEnum_Two];
@@ -2095,14 +1958,11 @@
XCTAssertNotNil(data);
msgPrime = [EnumTestMsg parseFromData:data error:NULL];
XCTAssertEqualObjects(msgPrime, msg);
- XCTAssertEqual([msgPrime.mumbleArray valueAtIndex:0],
- EnumTestMsg_MyEnum_Zero);
+ XCTAssertEqual([msgPrime.mumbleArray valueAtIndex:0], EnumTestMsg_MyEnum_Zero);
XCTAssertEqual([msgPrime.mumbleArray valueAtIndex:1], EnumTestMsg_MyEnum_One);
XCTAssertEqual([msgPrime.mumbleArray valueAtIndex:2], EnumTestMsg_MyEnum_Two);
- XCTAssertEqual([msgPrime.mumbleArray valueAtIndex:3],
- EnumTestMsg_MyEnum_NegOne);
- XCTAssertEqual([msgPrime.mumbleArray valueAtIndex:4],
- EnumTestMsg_MyEnum_NegTwo);
+ XCTAssertEqual([msgPrime.mumbleArray valueAtIndex:3], EnumTestMsg_MyEnum_NegOne);
+ XCTAssertEqual([msgPrime.mumbleArray valueAtIndex:4], EnumTestMsg_MyEnum_NegTwo);
}
- (void)testReservedWordNaming {
@@ -2200,12 +2060,12 @@
msg1.boolField32 = YES;
msg2.boolField32 = YES;
- XCTAssertTrue(msg1 != msg2); // Different pointers.
+ XCTAssertTrue(msg1 != msg2); // Different pointers.
XCTAssertEqual([msg1 hash], [msg2 hash]);
XCTAssertEqualObjects(msg1, msg2);
BoolOnlyMessage *msg1Prime = [[msg1 copy] autorelease];
- XCTAssertTrue(msg1Prime != msg1); // Different pointers.
+ XCTAssertTrue(msg1Prime != msg1); // Different pointers.
XCTAssertEqual([msg1 hash], [msg1Prime hash]);
XCTAssertEqualObjects(msg1, msg1Prime);
@@ -2252,24 +2112,26 @@
TestMessageOfMaps *msg2 = [[msg copy] autorelease];
XCTAssertNotNil(msg2);
XCTAssertEqualObjects(msg2, msg);
- XCTAssertTrue(msg2 != msg); // ptr compare
- XCTAssertTrue(msg.strToStr != msg2.strToStr); // ptr compare
- XCTAssertTrue(msg.intToStr != msg2.intToStr); // ptr compare
- XCTAssertTrue(msg.intToInt != msg2.intToInt); // ptr compare
- XCTAssertTrue(msg.strToBool != msg2.strToBool); // ptr compare
- XCTAssertTrue(msg.boolToStr != msg2.boolToStr); // ptr compare
+ XCTAssertTrue(msg2 != msg); // ptr compare
+ XCTAssertTrue(msg.strToStr != msg2.strToStr); // ptr compare
+ XCTAssertTrue(msg.intToStr != msg2.intToStr); // ptr compare
+ XCTAssertTrue(msg.intToInt != msg2.intToInt); // ptr compare
+ XCTAssertTrue(msg.strToBool != msg2.strToBool); // ptr compare
+ XCTAssertTrue(msg.boolToStr != msg2.boolToStr); // ptr compare
XCTAssertTrue(msg.boolToBool != msg2.boolToBool); // ptr compare
- XCTAssertTrue(msg.intToBool != msg2.intToBool); // ptr compare
- XCTAssertTrue(msg.boolToInt != msg2.boolToInt); // ptr compare
- XCTAssertTrue(msg.strToMsg != msg2.strToMsg); // ptr compare
- XCTAssertTrue(msg.intToMsg != msg2.intToMsg); // ptr compare
- XCTAssertTrue(msg.boolToMsg != msg2.boolToMsg); // ptr compare
+ XCTAssertTrue(msg.intToBool != msg2.intToBool); // ptr compare
+ XCTAssertTrue(msg.boolToInt != msg2.boolToInt); // ptr compare
+ XCTAssertTrue(msg.strToMsg != msg2.strToMsg); // ptr compare
+ XCTAssertTrue(msg.intToMsg != msg2.intToMsg); // ptr compare
+ XCTAssertTrue(msg.boolToMsg != msg2.boolToMsg); // ptr compare
XCTAssertTrue(msg.strToMsg[@"baz"] != msg2.strToMsg[@"baz"]); // ptr compare
XCTAssertEqualObjects(msg.strToMsg[@"baz"], msg2.strToMsg[@"baz"]);
- XCTAssertTrue([msg.intToMsg objectForKey:222] != [msg2.intToMsg objectForKey:222]); // ptr compare
+ XCTAssertTrue([msg.intToMsg objectForKey:222] !=
+ [msg2.intToMsg objectForKey:222]); // ptr compare
XCTAssertEqualObjects([msg.intToMsg objectForKey:222], [msg2.intToMsg objectForKey:222]);
- XCTAssertTrue([msg.boolToMsg objectForKey:YES] != [msg2.boolToMsg objectForKey:YES]); // ptr compare
+ XCTAssertTrue([msg.boolToMsg objectForKey:YES] !=
+ [msg2.boolToMsg objectForKey:YES]); // ptr compare
XCTAssertEqualObjects([msg.boolToMsg objectForKey:YES], [msg2.boolToMsg objectForKey:YES]);
}
diff --git a/objectivec/Tests/GPBObjectiveCPlusPlusTest.mm b/objectivec/Tests/GPBObjectiveCPlusPlusTest.mm
index fb67495..a89bb47 100644
--- a/objectivec/Tests/GPBObjectiveCPlusPlusTest.mm
+++ b/objectivec/Tests/GPBObjectiveCPlusPlusTest.mm
@@ -28,10 +28,8 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
#import "GPBTestUtilities.h"
-
//
// This is just a compile test (here to make sure things never regress).
//
@@ -43,20 +41,19 @@
// The "well know types" should have cross file enums needing imports.
#import "GPBProtocolBuffers.h"
// Some of the tests explicitly use cross file enums also.
-#import "google/protobuf/Unittest.pbobjc.h"
-#import "google/protobuf/UnittestImport.pbobjc.h"
+#import "objectivec/Tests/Unittest.pbobjc.h"
+#import "objectivec/Tests/UnittestImport.pbobjc.h"
// Sanity check the conditions of the test within the Xcode project.
#if !__cplusplus
- #error This isn't compiled as Objective C++?
+#error This isn't compiled as Objective C++?
#elif __cplusplus >= 201103L
- // If this trips, it means the Xcode default might have change (or someone
- // edited the testing project) and it might be time to revisit the GPB_ENUM
- // define in GPBBootstrap.h.
- #warning Did the Xcode default for C++ spec change?
+// If this trips, it means the Xcode default might have change (or someone
+// edited the testing project) and it might be time to revisit the GPB_ENUM
+// define in GPBBootstrap.h.
+#warning Did the Xcode default for C++ spec change?
#endif
-
// Dummy XCTest.
@interface GPBObjectiveCPlusPlusTests : GPBTestCase
@end
diff --git a/objectivec/Tests/GPBPerfTests.m b/objectivec/Tests/GPBPerfTests.m
index 8dd0ffc..7c1cbc5 100644
--- a/objectivec/Tests/GPBPerfTests.m
+++ b/objectivec/Tests/GPBPerfTests.m
@@ -29,9 +29,9 @@
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#import "GPBTestUtilities.h"
-#import "google/protobuf/Unittest.pbobjc.h"
-#import "google/protobuf/UnittestImport.pbobjc.h"
-#import "google/protobuf/UnittestObjc.pbobjc.h"
+#import "objectivec/Tests/Unittest.pbobjc.h"
+#import "objectivec/Tests/UnittestImport.pbobjc.h"
+#import "objectivec/Tests/UnittestObjc.pbobjc.h"
//
// This file really just uses the unittests framework as a testbed to
@@ -69,9 +69,9 @@
// lock across threads when parsing different instances. The Serial version of the test should run
// around ~2 times slower than the Parallel version since it's parsing the protos in the same
// thread.
- TestAllTypes *allTypesMessage = [TestAllTypes message];
+ TestAllTypes* allTypesMessage = [TestAllTypes message];
[self setAllFields:allTypesMessage repeatedCount:2];
- NSData *allTypesData = allTypesMessage.data;
+ NSData* allTypesData = allTypesMessage.data;
[self measureBlock:^{
for (int i = 0; i < 500; ++i) {
@@ -86,9 +86,9 @@
// not lock across threads when parsing different instances. The Serial version of the test should
// run around ~2 times slower than the Parallel version since it's parsing the protos in the same
// thread.
- TestAllTypes *allTypesMessage = [TestAllTypes message];
+ TestAllTypes* allTypesMessage = [TestAllTypes message];
[self setAllFields:allTypesMessage repeatedCount:2];
- NSData *allTypesData = allTypesMessage.data;
+ NSData* allTypesData = allTypesMessage.data;
dispatch_queue_t concurrentQueue = dispatch_queue_create("perfQueue", DISPATCH_QUEUE_CONCURRENT);
@@ -104,7 +104,9 @@
[TestAllTypes parseFromData:allTypesData error:NULL];
});
- dispatch_group_notify(group, concurrentQueue, ^{});
+ dispatch_group_notify(group, concurrentQueue,
+ ^{
+ });
dispatch_release(group);
}
@@ -118,9 +120,9 @@
// lock across threads when parsing different instances when using extensions. The Serial version
// of the test should run around ~2 times slower than the Parallel version since it's parsing the
// protos in the same thread.
- TestAllExtensions *allExtensionsMessage = [TestAllExtensions message];
+ TestAllExtensions* allExtensionsMessage = [TestAllExtensions message];
[self setAllExtensions:allExtensionsMessage repeatedCount:2];
- NSData *allExtensionsData = allExtensionsMessage.data;
+ NSData* allExtensionsData = allExtensionsMessage.data;
[self measureBlock:^{
for (int i = 0; i < 500; ++i) {
@@ -139,9 +141,9 @@
// not lock across threads when parsing different instances when using extensions. The Serial
// version of the test should run around ~2 times slower than the Parallel version since it's
// parsing the protos in the same thread.
- TestAllExtensions *allExtensionsMessage = [TestAllExtensions message];
+ TestAllExtensions* allExtensionsMessage = [TestAllExtensions message];
[self setAllExtensions:allExtensionsMessage repeatedCount:2];
- NSData *allExtensionsData = allExtensionsMessage.data;
+ NSData* allExtensionsData = allExtensionsMessage.data;
dispatch_queue_t concurrentQueue = dispatch_queue_create("perfQueue", DISPATCH_QUEUE_CONCURRENT);
@@ -161,7 +163,9 @@
error:NULL];
});
- dispatch_group_notify(group, concurrentQueue, ^{});
+ dispatch_group_notify(group, concurrentQueue,
+ ^{
+ });
dispatch_release(group);
}
@@ -177,8 +181,7 @@
[self setAllExtensions:message repeatedCount:kRepeatedCount];
NSData* rawBytes = [message data];
[message release];
- TestAllExtensions* message2 =
- [[TestAllExtensions alloc] initWithData:rawBytes error:NULL];
+ TestAllExtensions* message2 = [[TestAllExtensions alloc] initWithData:rawBytes error:NULL];
[message2 release];
}
}];
@@ -204,8 +207,8 @@
[self setPackedExtensions:message repeatedCount:kRepeatedCount];
NSData* rawBytes = [message data];
[message release];
- TestPackedExtensions* message2 =
- [[TestPackedExtensions alloc] initWithData:rawBytes error:NULL];
+ TestPackedExtensions* message2 = [[TestPackedExtensions alloc] initWithData:rawBytes
+ error:NULL];
[message2 release];
}
}];
diff --git a/objectivec/Tests/GPBTestUtilities.h b/objectivec/Tests/GPBTestUtilities.h
index 780184b..bebd557 100644
--- a/objectivec/Tests/GPBTestUtilities.h
+++ b/objectivec/Tests/GPBTestUtilities.h
@@ -48,7 +48,6 @@
#define GPBARRAYSIZE(a) ((sizeof(a) / sizeof((a[0]))))
#endif // GPBARRAYSIZE
-
// The number of repetitions of any repeated objects inside of test messages.
extern const uint32_t kGPBDefaultRepeatCount;
@@ -56,16 +55,11 @@
- (void)setAllFields:(TestAllTypes *)message repeatedCount:(uint32_t)count;
- (void)clearAllFields:(TestAllTypes *)message;
-- (void)setAllExtensions:(TestAllExtensions *)message
- repeatedCount:(uint32_t)count;
-- (void)setPackedFields:(TestPackedTypes *)message
- repeatedCount:(uint32_t)count;
-- (void)setUnpackedFields:(TestUnpackedTypes *)message
- repeatedCount:(uint32_t)count;
-- (void)setPackedExtensions:(TestPackedExtensions *)message
- repeatedCount:(uint32_t)count;
-- (void)setUnpackedExtensions:(TestUnpackedExtensions *)message
- repeatedCount:(uint32_t)count;
+- (void)setAllExtensions:(TestAllExtensions *)message repeatedCount:(uint32_t)count;
+- (void)setPackedFields:(TestPackedTypes *)message repeatedCount:(uint32_t)count;
+- (void)setUnpackedFields:(TestUnpackedTypes *)message repeatedCount:(uint32_t)count;
+- (void)setPackedExtensions:(TestPackedExtensions *)message repeatedCount:(uint32_t)count;
+- (void)setUnpackedExtensions:(TestUnpackedExtensions *)message repeatedCount:(uint32_t)count;
- (void)setAllMapFields:(TestMap *)message numEntries:(uint32_t)count;
- (TestAllTypes *)allSetRepeatedCount:(uint32_t)count;
@@ -73,20 +67,14 @@
- (TestPackedTypes *)packedSetRepeatedCount:(uint32_t)count;
- (TestPackedExtensions *)packedExtensionsSetRepeatedCount:(uint32_t)count;
-- (void)assertAllFieldsSet:(TestAllTypes *)message
- repeatedCount:(uint32_t)count;
-- (void)assertAllExtensionsSet:(TestAllExtensions *)message
- repeatedCount:(uint32_t)count;
-- (void)assertRepeatedFieldsModified:(TestAllTypes *)message
- repeatedCount:(uint32_t)count;
-- (void)assertRepeatedExtensionsModified:(TestAllExtensions *)message
- repeatedCount:(uint32_t)count;
+- (void)assertAllFieldsSet:(TestAllTypes *)message repeatedCount:(uint32_t)count;
+- (void)assertAllExtensionsSet:(TestAllExtensions *)message repeatedCount:(uint32_t)count;
+- (void)assertRepeatedFieldsModified:(TestAllTypes *)message repeatedCount:(uint32_t)count;
+- (void)assertRepeatedExtensionsModified:(TestAllExtensions *)message repeatedCount:(uint32_t)count;
- (void)assertExtensionsClear:(TestAllExtensions *)message;
- (void)assertClear:(TestAllTypes *)message;
-- (void)assertPackedFieldsSet:(TestPackedTypes *)message
- repeatedCount:(uint32_t)count;
-- (void)assertPackedExtensionsSet:(TestPackedExtensions *)message
- repeatedCount:(uint32_t)count;
+- (void)assertPackedFieldsSet:(TestPackedTypes *)message repeatedCount:(uint32_t)count;
+- (void)assertPackedExtensionsSet:(TestPackedExtensions *)message repeatedCount:(uint32_t)count;
- (void)modifyRepeatedExtensions:(TestAllExtensions *)message;
- (void)modifyRepeatedFields:(TestAllTypes *)message;
@@ -96,8 +84,7 @@
- (NSData *)getDataFileNamed:(NSString *)name dataToWrite:(NSData *)dataToWrite;
- (void)assertAllFieldsKVCMatch:(TestAllTypes *)message;
-- (void)setAllFieldsViaKVC:(TestAllTypes *)message
- repeatedCount:(uint32_t)count;
+- (void)setAllFieldsViaKVC:(TestAllTypes *)message repeatedCount:(uint32_t)count;
- (void)assertClearKVC:(TestAllTypes *)message;
@end
diff --git a/objectivec/Tests/GPBTestUtilities.m b/objectivec/Tests/GPBTestUtilities.m
index 48d75e7..37bd5d7 100644
--- a/objectivec/Tests/GPBTestUtilities.m
+++ b/objectivec/Tests/GPBTestUtilities.m
@@ -30,9 +30,9 @@
#import "GPBTestUtilities.h"
-#import "google/protobuf/MapUnittest.pbobjc.h"
-#import "google/protobuf/Unittest.pbobjc.h"
-#import "google/protobuf/UnittestImport.pbobjc.h"
+#import "objectivec/Tests/MapUnittest.pbobjc.h"
+#import "objectivec/Tests/Unittest.pbobjc.h"
+#import "objectivec/Tests/UnittestImport.pbobjc.h"
const uint32_t kGPBDefaultRepeatCount = 2;
@@ -66,8 +66,7 @@
// Return data for name. Optionally (based on #if setting) write out dataToWrite
// to replace that data. Useful for setting golden masters.
-- (NSData *)getDataFileNamed:(NSString *)name
- dataToWrite:(NSData *)dataToWrite {
+- (NSData *)getDataFileNamed:(NSString *)name dataToWrite:(NSData *)dataToWrite {
NSBundle *bundle = [NSBundle bundleForClass:[self class]];
NSString *path = [bundle pathForResource:[name stringByDeletingPathExtension]
ofType:[name pathExtension]];
@@ -93,63 +92,30 @@
// -------------------------------------------------------------------
- (void)modifyRepeatedExtensions:(TestAllExtensions *)message {
- [message setExtension:[UnittestRoot repeatedInt32Extension]
- index:1
- value:@501];
- [message setExtension:[UnittestRoot repeatedInt64Extension]
- index:1
- value:@502];
- [message setExtension:[UnittestRoot repeatedUint32Extension]
- index:1
- value:@503];
- [message setExtension:[UnittestRoot repeatedUint64Extension]
- index:1
- value:@504];
- [message setExtension:[UnittestRoot repeatedSint32Extension]
- index:1
- value:@505];
- [message setExtension:[UnittestRoot repeatedSint64Extension]
- index:1
- value:@506];
- [message setExtension:[UnittestRoot repeatedFixed32Extension]
- index:1
- value:@507];
- [message setExtension:[UnittestRoot repeatedFixed64Extension]
- index:1
- value:@508];
- [message setExtension:[UnittestRoot repeatedSfixed32Extension]
- index:1
- value:@509];
- [message setExtension:[UnittestRoot repeatedSfixed64Extension]
- index:1
- value:@510];
- [message setExtension:[UnittestRoot repeatedFloatExtension]
- index:1
- value:@511.0f];
- [message setExtension:[UnittestRoot repeatedDoubleExtension]
- index:1
- value:@512.0];
- [message setExtension:[UnittestRoot repeatedBoolExtension]
- index:1
- value:@YES];
- [message setExtension:[UnittestRoot repeatedStringExtension]
- index:1
- value:@"515"];
+ [message setExtension:[UnittestRoot repeatedInt32Extension] index:1 value:@501];
+ [message setExtension:[UnittestRoot repeatedInt64Extension] index:1 value:@502];
+ [message setExtension:[UnittestRoot repeatedUint32Extension] index:1 value:@503];
+ [message setExtension:[UnittestRoot repeatedUint64Extension] index:1 value:@504];
+ [message setExtension:[UnittestRoot repeatedSint32Extension] index:1 value:@505];
+ [message setExtension:[UnittestRoot repeatedSint64Extension] index:1 value:@506];
+ [message setExtension:[UnittestRoot repeatedFixed32Extension] index:1 value:@507];
+ [message setExtension:[UnittestRoot repeatedFixed64Extension] index:1 value:@508];
+ [message setExtension:[UnittestRoot repeatedSfixed32Extension] index:1 value:@509];
+ [message setExtension:[UnittestRoot repeatedSfixed64Extension] index:1 value:@510];
+ [message setExtension:[UnittestRoot repeatedFloatExtension] index:1 value:@511.0f];
+ [message setExtension:[UnittestRoot repeatedDoubleExtension] index:1 value:@512.0];
+ [message setExtension:[UnittestRoot repeatedBoolExtension] index:1 value:@YES];
+ [message setExtension:[UnittestRoot repeatedStringExtension] index:1 value:@"515"];
[message setExtension:[UnittestRoot repeatedBytesExtension]
index:1
value:[NSData gpbtu_dataWithUint32:516]];
RepeatedGroup_extension *repeatedGroup = [RepeatedGroup_extension message];
[repeatedGroup setA:517];
- [message setExtension:[UnittestRoot repeatedGroupExtension]
- index:1
- value:repeatedGroup];
- TestAllTypes_NestedMessage *nestedMessage =
- [TestAllTypes_NestedMessage message];
+ [message setExtension:[UnittestRoot repeatedGroupExtension] index:1 value:repeatedGroup];
+ TestAllTypes_NestedMessage *nestedMessage = [TestAllTypes_NestedMessage message];
[nestedMessage setBb:518];
- [message setExtension:[UnittestRoot repeatedNestedMessageExtension]
- index:1
- value:nestedMessage];
+ [message setExtension:[UnittestRoot repeatedNestedMessageExtension] index:1 value:nestedMessage];
ForeignMessage *foreignMessage = [ForeignMessage message];
[foreignMessage setC:519];
[message setExtension:[UnittestRoot repeatedForeignMessageExtension]
@@ -157,9 +123,7 @@
value:foreignMessage];
ImportMessage *importMessage = [ImportMessage message];
[importMessage setD:520];
- [message setExtension:[UnittestRoot repeatedImportMessageExtension]
- index:1
- value:importMessage];
+ [message setExtension:[UnittestRoot repeatedImportMessageExtension] index:1 value:importMessage];
[message setExtension:[UnittestRoot repeatedNestedEnumExtension]
index:1
@@ -171,16 +135,11 @@
index:1
value:@(ImportEnum_ImportFoo)];
- [message setExtension:[UnittestRoot repeatedStringPieceExtension]
- index:1
- value:@"524"];
- [message setExtension:[UnittestRoot repeatedCordExtension]
- index:1
- value:@"525"];
+ [message setExtension:[UnittestRoot repeatedStringPieceExtension] index:1 value:@"524"];
+ [message setExtension:[UnittestRoot repeatedCordExtension] index:1 value:@"525"];
}
-- (void)assertAllExtensionsSet:(TestAllExtensions *)message
- repeatedCount:(uint32_t)count {
+- (void)assertAllExtensionsSet:(TestAllExtensions *)message repeatedCount:(uint32_t)count {
XCTAssertTrue([message hasExtension:[UnittestRoot optionalInt32Extension]]);
XCTAssertTrue([message hasExtension:[UnittestRoot optionalInt64Extension]]);
XCTAssertTrue([message hasExtension:[UnittestRoot optionalUint32Extension]]);
@@ -238,29 +197,44 @@
XCTAssertTrue([message hasExtension:[UnittestRoot defaultCordExtension]]);
XCTAssertEqual(101, [[message getExtension:[UnittestRoot optionalInt32Extension]] intValue]);
- XCTAssertEqual(102LL, [[message getExtension:[UnittestRoot optionalInt64Extension]] longLongValue]);
- XCTAssertEqual(103U, [[message getExtension:[UnittestRoot optionalUint32Extension]] unsignedIntValue]);
- XCTAssertEqual(104ULL, [[message getExtension:[UnittestRoot optionalUint64Extension]] unsignedLongLongValue]);
+ XCTAssertEqual(102LL,
+ [[message getExtension:[UnittestRoot optionalInt64Extension]] longLongValue]);
+ XCTAssertEqual(103U,
+ [[message getExtension:[UnittestRoot optionalUint32Extension]] unsignedIntValue]);
+ XCTAssertEqual(104ULL, [[message getExtension:[UnittestRoot optionalUint64Extension]]
+ unsignedLongLongValue]);
XCTAssertEqual(105, [[message getExtension:[UnittestRoot optionalSint32Extension]] intValue]);
- XCTAssertEqual(106LL, [[message getExtension:[UnittestRoot optionalSint64Extension]] longLongValue]);
- XCTAssertEqual(107U, [[message getExtension:[UnittestRoot optionalFixed32Extension]] unsignedIntValue]);
- XCTAssertEqual(108ULL, [[message getExtension:[UnittestRoot optionalFixed64Extension]] unsignedLongLongValue]);
+ XCTAssertEqual(106LL,
+ [[message getExtension:[UnittestRoot optionalSint64Extension]] longLongValue]);
+ XCTAssertEqual(107U,
+ [[message getExtension:[UnittestRoot optionalFixed32Extension]] unsignedIntValue]);
+ XCTAssertEqual(108ULL, [[message getExtension:[UnittestRoot optionalFixed64Extension]]
+ unsignedLongLongValue]);
XCTAssertEqual(109, [[message getExtension:[UnittestRoot optionalSfixed32Extension]] intValue]);
- XCTAssertEqual(110LL, [[message getExtension:[UnittestRoot optionalSfixed64Extension]] longLongValue]);
- XCTAssertEqualWithAccuracy(111.0f, [[message getExtension:[UnittestRoot optionalFloatExtension]] floatValue], 0.01);
- XCTAssertEqualWithAccuracy(112.0, [[message getExtension:[UnittestRoot optionalDoubleExtension]] doubleValue], 0.01);
+ XCTAssertEqual(110LL,
+ [[message getExtension:[UnittestRoot optionalSfixed64Extension]] longLongValue]);
+ XCTAssertEqualWithAccuracy(
+ 111.0f, [[message getExtension:[UnittestRoot optionalFloatExtension]] floatValue], 0.01);
+ XCTAssertEqualWithAccuracy(
+ 112.0, [[message getExtension:[UnittestRoot optionalDoubleExtension]] doubleValue], 0.01);
XCTAssertTrue([[message getExtension:[UnittestRoot optionalBoolExtension]] boolValue]);
XCTAssertEqualObjects(@"115", [message getExtension:[UnittestRoot optionalStringExtension]]);
- XCTAssertEqualObjects([NSData gpbtu_dataWithEmbeddedNulls], [message getExtension:[UnittestRoot optionalBytesExtension]]);
+ XCTAssertEqualObjects([NSData gpbtu_dataWithEmbeddedNulls],
+ [message getExtension:[UnittestRoot optionalBytesExtension]]);
- XCTAssertEqual(117, [(TestAllTypes_OptionalGroup*)[message getExtension:[UnittestRoot optionalGroupExtension]] a]);
- XCTAssertEqual(118, [(TestAllTypes_NestedMessage*)[message getExtension:[UnittestRoot optionalNestedMessageExtension]] bb]);
+ XCTAssertEqual(117, [(TestAllTypes_OptionalGroup *)[message
+ getExtension:[UnittestRoot optionalGroupExtension]] a]);
+ XCTAssertEqual(118, [(TestAllTypes_NestedMessage *)[message
+ getExtension:[UnittestRoot optionalNestedMessageExtension]] bb]);
XCTAssertEqual(119, [[message getExtension:[UnittestRoot optionalForeignMessageExtension]] c]);
XCTAssertEqual(120, [[message getExtension:[UnittestRoot optionalImportMessageExtension]] d]);
- XCTAssertEqual(TestAllTypes_NestedEnum_Baz, [[message getExtension:[UnittestRoot optionalNestedEnumExtension]] intValue]);
- XCTAssertEqual(ForeignEnum_ForeignBaz, [[message getExtension:[UnittestRoot optionalForeignEnumExtension]] intValue]);
- XCTAssertEqual(ImportEnum_ImportBaz, [[message getExtension:[UnittestRoot optionalImportEnumExtension]] intValue]);
+ XCTAssertEqual(TestAllTypes_NestedEnum_Baz,
+ [[message getExtension:[UnittestRoot optionalNestedEnumExtension]] intValue]);
+ XCTAssertEqual(ForeignEnum_ForeignBaz,
+ [[message getExtension:[UnittestRoot optionalForeignEnumExtension]] intValue]);
+ XCTAssertEqual(ImportEnum_ImportBaz,
+ [[message getExtension:[UnittestRoot optionalImportEnumExtension]] intValue]);
XCTAssertEqualObjects(@"124", [message getExtension:[UnittestRoot optionalStringPieceExtension]]);
XCTAssertEqualObjects(@"125", [message getExtension:[UnittestRoot optionalCordExtension]]);
@@ -284,9 +258,12 @@
XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedBytesExtension]] count]);
XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedGroupExtension]] count]);
- XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedNestedMessageExtension]] count]);
- XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedForeignMessageExtension]] count]);
- XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedImportMessageExtension]] count]);
+ XCTAssertEqual(count,
+ [[message getExtension:[UnittestRoot repeatedNestedMessageExtension]] count]);
+ XCTAssertEqual(count,
+ [[message getExtension:[UnittestRoot repeatedForeignMessageExtension]] count]);
+ XCTAssertEqual(count,
+ [[message getExtension:[UnittestRoot repeatedImportMessageExtension]] count]);
XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedNestedEnumExtension]] count]);
XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedForeignEnumExtension]] count]);
XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedImportEnumExtension]] count]);
@@ -333,18 +310,20 @@
[data release];
extension = [message getExtension:[UnittestRoot repeatedGroupExtension]];
- XCTAssertEqual((int)(217 + i * 100), [(TestAllTypes_OptionalGroup*)extension[i] a]);
+ XCTAssertEqual((int)(217 + i * 100), [(TestAllTypes_OptionalGroup *)extension[i] a]);
extension = [message getExtension:[UnittestRoot repeatedNestedMessageExtension]];
- XCTAssertEqual((int)(218 + i * 100), [(TestAllTypes_NestedMessage*)extension[i] bb]);
+ XCTAssertEqual((int)(218 + i * 100), [(TestAllTypes_NestedMessage *)extension[i] bb]);
extension = [message getExtension:[UnittestRoot repeatedForeignMessageExtension]];
XCTAssertEqual((int)(219 + i * 100), [extension[i] c]);
extension = [message getExtension:[UnittestRoot repeatedImportMessageExtension]];
XCTAssertEqual((int)(220 + i * 100), [extension[i] d]);
extension = [message getExtension:[UnittestRoot repeatedNestedEnumExtension]];
- XCTAssertEqual((i % 2) ? TestAllTypes_NestedEnum_Bar : TestAllTypes_NestedEnum_Baz, [extension[i] intValue]);
+ XCTAssertEqual((i % 2) ? TestAllTypes_NestedEnum_Bar : TestAllTypes_NestedEnum_Baz,
+ [extension[i] intValue]);
extension = [message getExtension:[UnittestRoot repeatedForeignEnumExtension]];
- XCTAssertEqual((i % 2) ? ForeignEnum_ForeignBar : ForeignEnum_ForeignBaz, [extension[i] intValue]);
+ XCTAssertEqual((i % 2) ? ForeignEnum_ForeignBar : ForeignEnum_ForeignBaz,
+ [extension[i] intValue]);
extension = [message getExtension:[UnittestRoot repeatedImportEnumExtension]];
XCTAssertEqual((i % 2) ? ImportEnum_ImportBar : ImportEnum_ImportBaz, [extension[i] intValue]);
@@ -385,24 +364,37 @@
XCTAssertTrue([message hasExtension:[UnittestRoot defaultCordExtension]]);
XCTAssertEqual(401, [[message getExtension:[UnittestRoot defaultInt32Extension]] intValue]);
- XCTAssertEqual(402LL, [[message getExtension:[UnittestRoot defaultInt64Extension]] longLongValue]);
- XCTAssertEqual(403U, [[message getExtension:[UnittestRoot defaultUint32Extension]] unsignedIntValue]);
- XCTAssertEqual(404ULL, [[message getExtension:[UnittestRoot defaultUint64Extension]] unsignedLongLongValue]);
+ XCTAssertEqual(402LL,
+ [[message getExtension:[UnittestRoot defaultInt64Extension]] longLongValue]);
+ XCTAssertEqual(403U,
+ [[message getExtension:[UnittestRoot defaultUint32Extension]] unsignedIntValue]);
+ XCTAssertEqual(
+ 404ULL, [[message getExtension:[UnittestRoot defaultUint64Extension]] unsignedLongLongValue]);
XCTAssertEqual(405, [[message getExtension:[UnittestRoot defaultSint32Extension]] intValue]);
- XCTAssertEqual(406LL, [[message getExtension:[UnittestRoot defaultSint64Extension]] longLongValue]);
- XCTAssertEqual(407U, [[message getExtension:[UnittestRoot defaultFixed32Extension]] unsignedIntValue]);
- XCTAssertEqual(408ULL, [[message getExtension:[UnittestRoot defaultFixed64Extension]] unsignedLongLongValue]);
+ XCTAssertEqual(406LL,
+ [[message getExtension:[UnittestRoot defaultSint64Extension]] longLongValue]);
+ XCTAssertEqual(407U,
+ [[message getExtension:[UnittestRoot defaultFixed32Extension]] unsignedIntValue]);
+ XCTAssertEqual(408ULL, [[message getExtension:[UnittestRoot defaultFixed64Extension]]
+ unsignedLongLongValue]);
XCTAssertEqual(409, [[message getExtension:[UnittestRoot defaultSfixed32Extension]] intValue]);
- XCTAssertEqual(410LL,[[message getExtension:[UnittestRoot defaultSfixed64Extension]] longLongValue]);
- XCTAssertEqualWithAccuracy(411.0f, [[message getExtension:[UnittestRoot defaultFloatExtension]] floatValue], 0.01);
- XCTAssertEqualWithAccuracy(412.0, [[message getExtension:[UnittestRoot defaultDoubleExtension]] doubleValue], 0.01);
+ XCTAssertEqual(410LL,
+ [[message getExtension:[UnittestRoot defaultSfixed64Extension]] longLongValue]);
+ XCTAssertEqualWithAccuracy(
+ 411.0f, [[message getExtension:[UnittestRoot defaultFloatExtension]] floatValue], 0.01);
+ XCTAssertEqualWithAccuracy(
+ 412.0, [[message getExtension:[UnittestRoot defaultDoubleExtension]] doubleValue], 0.01);
XCTAssertFalse([[message getExtension:[UnittestRoot defaultBoolExtension]] boolValue]);
XCTAssertEqualObjects(@"415", [message getExtension:[UnittestRoot defaultStringExtension]]);
- XCTAssertEqualObjects([NSData gpbtu_dataWithUint32:416], [message getExtension:[UnittestRoot defaultBytesExtension]]);
+ XCTAssertEqualObjects([NSData gpbtu_dataWithUint32:416],
+ [message getExtension:[UnittestRoot defaultBytesExtension]]);
- XCTAssertEqual(TestAllTypes_NestedEnum_Foo, [[message getExtension:[UnittestRoot defaultNestedEnumExtension]] intValue]);
- XCTAssertEqual(ForeignEnum_ForeignFoo, [[message getExtension:[UnittestRoot defaultForeignEnumExtension]] intValue]);
- XCTAssertEqual(ImportEnum_ImportFoo, [[message getExtension:[UnittestRoot defaultImportEnumExtension]] intValue]);
+ XCTAssertEqual(TestAllTypes_NestedEnum_Foo,
+ [[message getExtension:[UnittestRoot defaultNestedEnumExtension]] intValue]);
+ XCTAssertEqual(ForeignEnum_ForeignFoo,
+ [[message getExtension:[UnittestRoot defaultForeignEnumExtension]] intValue]);
+ XCTAssertEqual(ImportEnum_ImportFoo,
+ [[message getExtension:[UnittestRoot defaultImportEnumExtension]] intValue]);
XCTAssertEqualObjects(@"424", [message getExtension:[UnittestRoot defaultStringPieceExtension]]);
XCTAssertEqualObjects(@"425", [message getExtension:[UnittestRoot defaultCordExtension]]);
@@ -430,9 +422,12 @@
XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedBytesExtension]] count]);
XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedGroupExtension]] count]);
- XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedNestedMessageExtension]] count]);
- XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedForeignMessageExtension]] count]);
- XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedImportMessageExtension]] count]);
+ XCTAssertEqual(count,
+ [[message getExtension:[UnittestRoot repeatedNestedMessageExtension]] count]);
+ XCTAssertEqual(count,
+ [[message getExtension:[UnittestRoot repeatedForeignMessageExtension]] count]);
+ XCTAssertEqual(count,
+ [[message getExtension:[UnittestRoot repeatedImportMessageExtension]] count]);
XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedNestedEnumExtension]] count]);
XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedForeignEnumExtension]] count]);
XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedImportEnumExtension]] count]);
@@ -440,24 +435,37 @@
XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedStringPieceExtension]] count]);
XCTAssertEqual(count, [[message getExtension:[UnittestRoot repeatedCordExtension]] count]);
- XCTAssertEqual(201,[[message getExtension:[UnittestRoot repeatedInt32Extension]][0] intValue]);
- XCTAssertEqual(202LL, [[message getExtension:[UnittestRoot repeatedInt64Extension]][0] longLongValue]);
- XCTAssertEqual(203U, [[message getExtension:[UnittestRoot repeatedUint32Extension]][0] unsignedIntValue]);
- XCTAssertEqual(204ULL, [[message getExtension:[UnittestRoot repeatedUint64Extension]][0] unsignedLongLongValue]);
+ XCTAssertEqual(201, [[message getExtension:[UnittestRoot repeatedInt32Extension]][0] intValue]);
+ XCTAssertEqual(202LL,
+ [[message getExtension:[UnittestRoot repeatedInt64Extension]][0] longLongValue]);
+ XCTAssertEqual(
+ 203U, [[message getExtension:[UnittestRoot repeatedUint32Extension]][0] unsignedIntValue]);
+ XCTAssertEqual(204ULL, [[message getExtension:[UnittestRoot repeatedUint64Extension]][0]
+ unsignedLongLongValue]);
XCTAssertEqual(205, [[message getExtension:[UnittestRoot repeatedSint32Extension]][0] intValue]);
- XCTAssertEqual(206LL, [[message getExtension:[UnittestRoot repeatedSint64Extension]][0] longLongValue]);
- XCTAssertEqual(207U, [[message getExtension:[UnittestRoot repeatedFixed32Extension]][0] unsignedIntValue]);
- XCTAssertEqual(208ULL, [[message getExtension:[UnittestRoot repeatedFixed64Extension]][0] unsignedLongLongValue]);
- XCTAssertEqual(209, [[message getExtension:[UnittestRoot repeatedSfixed32Extension]][0] intValue]);
- XCTAssertEqual(210LL, [[message getExtension:[UnittestRoot repeatedSfixed64Extension]][0] longLongValue]);
- XCTAssertEqualWithAccuracy(211.0f, [[message getExtension:[UnittestRoot repeatedFloatExtension]][0] floatValue], 0.01);
- XCTAssertEqualWithAccuracy(212.0, [[message getExtension:[UnittestRoot repeatedDoubleExtension]][0] doubleValue], 0.01);
+ XCTAssertEqual(206LL,
+ [[message getExtension:[UnittestRoot repeatedSint64Extension]][0] longLongValue]);
+ XCTAssertEqual(
+ 207U, [[message getExtension:[UnittestRoot repeatedFixed32Extension]][0] unsignedIntValue]);
+ XCTAssertEqual(208ULL, [[message getExtension:[UnittestRoot repeatedFixed64Extension]][0]
+ unsignedLongLongValue]);
+ XCTAssertEqual(209,
+ [[message getExtension:[UnittestRoot repeatedSfixed32Extension]][0] intValue]);
+ XCTAssertEqual(
+ 210LL, [[message getExtension:[UnittestRoot repeatedSfixed64Extension]][0] longLongValue]);
+ XCTAssertEqualWithAccuracy(
+ 211.0f, [[message getExtension:[UnittestRoot repeatedFloatExtension]][0] floatValue], 0.01);
+ XCTAssertEqualWithAccuracy(
+ 212.0, [[message getExtension:[UnittestRoot repeatedDoubleExtension]][0] doubleValue], 0.01);
XCTAssertFalse([[message getExtension:[UnittestRoot repeatedBoolExtension]][0] boolValue]);
XCTAssertEqualObjects(@"215", [message getExtension:[UnittestRoot repeatedStringExtension]][0]);
- XCTAssertEqualObjects([NSData gpbtu_dataWithUint32:216], [message getExtension:[UnittestRoot repeatedBytesExtension]][0]);
+ XCTAssertEqualObjects([NSData gpbtu_dataWithUint32:216],
+ [message getExtension:[UnittestRoot repeatedBytesExtension]][0]);
- XCTAssertEqual(217, [(TestAllTypes_OptionalGroup*)[message getExtension:[UnittestRoot repeatedGroupExtension]][0] a]);
- XCTAssertEqual(218, [(TestAllTypes_NestedMessage*)[message getExtension:[UnittestRoot repeatedNestedMessageExtension]][0] bb]);
+ XCTAssertEqual(217, [(TestAllTypes_OptionalGroup *)[message
+ getExtension:[UnittestRoot repeatedGroupExtension]][0] a]);
+ XCTAssertEqual(218, [(TestAllTypes_NestedMessage *)[message
+ getExtension:[UnittestRoot repeatedNestedMessageExtension]][0] bb]);
XCTAssertEqual(219, [[message getExtension:[UnittestRoot repeatedForeignMessageExtension]][0] c]);
XCTAssertEqual(220, [[message getExtension:[UnittestRoot repeatedImportMessageExtension]][0] d]);
@@ -468,28 +476,42 @@
XCTAssertEqual(ImportEnum_ImportBaz,
[[message getExtension:[UnittestRoot repeatedImportEnumExtension]][0] intValue]);
- XCTAssertEqualObjects(@"224", [message getExtension:[UnittestRoot repeatedStringPieceExtension]][0]);
+ XCTAssertEqualObjects(@"224",
+ [message getExtension:[UnittestRoot repeatedStringPieceExtension]][0]);
XCTAssertEqualObjects(@"225", [message getExtension:[UnittestRoot repeatedCordExtension]][0]);
// Actually verify the second (modified) elements now.
XCTAssertEqual(501, [[message getExtension:[UnittestRoot repeatedInt32Extension]][1] intValue]);
- XCTAssertEqual(502LL, [[message getExtension:[UnittestRoot repeatedInt64Extension]][1] longLongValue]);
- XCTAssertEqual(503U, [[message getExtension:[UnittestRoot repeatedUint32Extension]][1] unsignedIntValue]);
- XCTAssertEqual(504ULL, [[message getExtension:[UnittestRoot repeatedUint64Extension]][1] unsignedLongLongValue]);
+ XCTAssertEqual(502LL,
+ [[message getExtension:[UnittestRoot repeatedInt64Extension]][1] longLongValue]);
+ XCTAssertEqual(
+ 503U, [[message getExtension:[UnittestRoot repeatedUint32Extension]][1] unsignedIntValue]);
+ XCTAssertEqual(504ULL, [[message getExtension:[UnittestRoot repeatedUint64Extension]][1]
+ unsignedLongLongValue]);
XCTAssertEqual(505, [[message getExtension:[UnittestRoot repeatedSint32Extension]][1] intValue]);
- XCTAssertEqual(506LL, [[message getExtension:[UnittestRoot repeatedSint64Extension]][1] longLongValue]);
- XCTAssertEqual(507U, [[message getExtension:[UnittestRoot repeatedFixed32Extension]][1] unsignedIntValue]);
- XCTAssertEqual(508ULL, [[message getExtension:[UnittestRoot repeatedFixed64Extension]][1] unsignedLongLongValue]);
- XCTAssertEqual(509, [[message getExtension:[UnittestRoot repeatedSfixed32Extension]][1] intValue]);
- XCTAssertEqual(510LL, [[message getExtension:[UnittestRoot repeatedSfixed64Extension]][1] longLongValue]);
- XCTAssertEqualWithAccuracy(511.0f, [[message getExtension:[UnittestRoot repeatedFloatExtension]][1] floatValue], 0.01);
- XCTAssertEqualWithAccuracy(512.0, [[message getExtension:[UnittestRoot repeatedDoubleExtension]][1] doubleValue], 0.01);
+ XCTAssertEqual(506LL,
+ [[message getExtension:[UnittestRoot repeatedSint64Extension]][1] longLongValue]);
+ XCTAssertEqual(
+ 507U, [[message getExtension:[UnittestRoot repeatedFixed32Extension]][1] unsignedIntValue]);
+ XCTAssertEqual(508ULL, [[message getExtension:[UnittestRoot repeatedFixed64Extension]][1]
+ unsignedLongLongValue]);
+ XCTAssertEqual(509,
+ [[message getExtension:[UnittestRoot repeatedSfixed32Extension]][1] intValue]);
+ XCTAssertEqual(
+ 510LL, [[message getExtension:[UnittestRoot repeatedSfixed64Extension]][1] longLongValue]);
+ XCTAssertEqualWithAccuracy(
+ 511.0f, [[message getExtension:[UnittestRoot repeatedFloatExtension]][1] floatValue], 0.01);
+ XCTAssertEqualWithAccuracy(
+ 512.0, [[message getExtension:[UnittestRoot repeatedDoubleExtension]][1] doubleValue], 0.01);
XCTAssertTrue([[message getExtension:[UnittestRoot repeatedBoolExtension]][1] boolValue]);
XCTAssertEqualObjects(@"515", [message getExtension:[UnittestRoot repeatedStringExtension]][1]);
- XCTAssertEqualObjects([NSData gpbtu_dataWithUint32:516], [message getExtension:[UnittestRoot repeatedBytesExtension]][1]);
+ XCTAssertEqualObjects([NSData gpbtu_dataWithUint32:516],
+ [message getExtension:[UnittestRoot repeatedBytesExtension]][1]);
- XCTAssertEqual(517, [(TestAllTypes_OptionalGroup*)[message getExtension:[UnittestRoot repeatedGroupExtension]][1] a]);
- XCTAssertEqual(518, [(TestAllTypes_NestedMessage*)[message getExtension:[UnittestRoot repeatedNestedMessageExtension]][1] bb]);
+ XCTAssertEqual(517, [(TestAllTypes_OptionalGroup *)[message
+ getExtension:[UnittestRoot repeatedGroupExtension]][1] a]);
+ XCTAssertEqual(518, [(TestAllTypes_NestedMessage *)[message
+ getExtension:[UnittestRoot repeatedNestedMessageExtension]][1] bb]);
XCTAssertEqual(519, [[message getExtension:[UnittestRoot repeatedForeignMessageExtension]][1] c]);
XCTAssertEqual(520, [[message getExtension:[UnittestRoot repeatedImportMessageExtension]][1] d]);
@@ -500,14 +522,14 @@
XCTAssertEqual(ImportEnum_ImportFoo,
[[message getExtension:[UnittestRoot repeatedImportEnumExtension]][1] intValue]);
- XCTAssertEqualObjects(@"524", [message getExtension:[UnittestRoot repeatedStringPieceExtension]][1]);
+ XCTAssertEqualObjects(@"524",
+ [message getExtension:[UnittestRoot repeatedStringPieceExtension]][1]);
XCTAssertEqualObjects(@"525", [message getExtension:[UnittestRoot repeatedCordExtension]][1]);
}
// -------------------------------------------------------------------
-- (void)assertAllFieldsSet:(TestAllTypes *)message
- repeatedCount:(uint32_t)count {
+- (void)assertAllFieldsSet:(TestAllTypes *)message repeatedCount:(uint32_t)count {
XCTAssertTrue(message.hasOptionalInt32);
XCTAssertTrue(message.hasOptionalInt64);
XCTAssertTrue(message.hasOptionalUint32);
@@ -555,8 +577,7 @@
XCTAssertEqualWithAccuracy(112.0, message.optionalDouble, 0.1);
XCTAssertTrue(message.optionalBool);
XCTAssertEqualObjects(@"115", message.optionalString);
- XCTAssertEqualObjects([NSData gpbtu_dataWithEmbeddedNulls],
- message.optionalBytes);
+ XCTAssertEqualObjects([NSData gpbtu_dataWithEmbeddedNulls], message.optionalBytes);
XCTAssertEqual(117, message.optionalGroup.a);
XCTAssertEqual(118, message.optionalNestedMessage.bb);
@@ -627,28 +648,19 @@
XCTAssertEqual(count, message.repeatedCordArray_Count);
for (uint32_t i = 0; i < count; ++i) {
- XCTAssertEqual((int)(201 + i * 100),
- [message.repeatedInt32Array valueAtIndex:i]);
+ XCTAssertEqual((int)(201 + i * 100), [message.repeatedInt32Array valueAtIndex:i]);
XCTAssertEqual(202 + i * 100, [message.repeatedInt64Array valueAtIndex:i]);
XCTAssertEqual(203 + i * 100, [message.repeatedUint32Array valueAtIndex:i]);
XCTAssertEqual(204 + i * 100, [message.repeatedUint64Array valueAtIndex:i]);
- XCTAssertEqual((int)(205 + i * 100),
- [message.repeatedSint32Array valueAtIndex:i]);
+ XCTAssertEqual((int)(205 + i * 100), [message.repeatedSint32Array valueAtIndex:i]);
XCTAssertEqual(206 + i * 100, [message.repeatedSint64Array valueAtIndex:i]);
- XCTAssertEqual(207 + i * 100,
- [message.repeatedFixed32Array valueAtIndex:i]);
- XCTAssertEqual(208 + i * 100,
- [message.repeatedFixed64Array valueAtIndex:i]);
- XCTAssertEqual((int)(209 + i * 100),
- [message.repeatedSfixed32Array valueAtIndex:i]);
- XCTAssertEqual(210 + i * 100,
- [message.repeatedSfixed64Array valueAtIndex:i]);
- XCTAssertEqualWithAccuracy(
- 211 + i * 100, [message.repeatedFloatArray valueAtIndex:i], 0.1);
- XCTAssertEqualWithAccuracy(
- 212 + i * 100, [message.repeatedDoubleArray valueAtIndex:i], 0.1);
- XCTAssertEqual((i % 2) ? YES : NO,
- [message.repeatedBoolArray valueAtIndex:i]);
+ XCTAssertEqual(207 + i * 100, [message.repeatedFixed32Array valueAtIndex:i]);
+ XCTAssertEqual(208 + i * 100, [message.repeatedFixed64Array valueAtIndex:i]);
+ XCTAssertEqual((int)(209 + i * 100), [message.repeatedSfixed32Array valueAtIndex:i]);
+ XCTAssertEqual(210 + i * 100, [message.repeatedSfixed64Array valueAtIndex:i]);
+ XCTAssertEqualWithAccuracy(211 + i * 100, [message.repeatedFloatArray valueAtIndex:i], 0.1);
+ XCTAssertEqualWithAccuracy(212 + i * 100, [message.repeatedDoubleArray valueAtIndex:i], 0.1);
+ XCTAssertEqual((i % 2) ? YES : NO, [message.repeatedBoolArray valueAtIndex:i]);
NSString *string = [[NSString alloc] initWithFormat:@"%d", 215 + i * 100];
XCTAssertEqualObjects(string, message.repeatedStringArray[i]);
@@ -658,14 +670,21 @@
XCTAssertEqualObjects(data, message.repeatedBytesArray[i]);
[data release];
- XCTAssertEqual((int)(217 + i * 100), ((TestAllTypes_RepeatedGroup*)message.repeatedGroupArray[i]).a);
- XCTAssertEqual((int)(218 + i * 100), ((TestAllTypes_NestedMessage*)message.repeatedNestedMessageArray[i]).bb);
- XCTAssertEqual((int)(219 + i * 100), ((ForeignMessage*)message.repeatedForeignMessageArray[i]).c);
- XCTAssertEqual((int)(220 + i * 100), ((ImportMessage*)message.repeatedImportMessageArray[i]).d);
+ XCTAssertEqual((int)(217 + i * 100),
+ ((TestAllTypes_RepeatedGroup *)message.repeatedGroupArray[i]).a);
+ XCTAssertEqual((int)(218 + i * 100),
+ ((TestAllTypes_NestedMessage *)message.repeatedNestedMessageArray[i]).bb);
+ XCTAssertEqual((int)(219 + i * 100),
+ ((ForeignMessage *)message.repeatedForeignMessageArray[i]).c);
+ XCTAssertEqual((int)(220 + i * 100),
+ ((ImportMessage *)message.repeatedImportMessageArray[i]).d);
- XCTAssertEqual((i % 2) ? TestAllTypes_NestedEnum_Bar : TestAllTypes_NestedEnum_Baz, [message.repeatedNestedEnumArray valueAtIndex:i]);
- XCTAssertEqual((i % 2) ? ForeignEnum_ForeignBar : ForeignEnum_ForeignBaz, [message.repeatedForeignEnumArray valueAtIndex:i]);
- XCTAssertEqual((i % 2) ? ImportEnum_ImportBar : ImportEnum_ImportBaz, [message.repeatedImportEnumArray valueAtIndex:i]);
+ XCTAssertEqual((i % 2) ? TestAllTypes_NestedEnum_Bar : TestAllTypes_NestedEnum_Baz,
+ [message.repeatedNestedEnumArray valueAtIndex:i]);
+ XCTAssertEqual((i % 2) ? ForeignEnum_ForeignBar : ForeignEnum_ForeignBaz,
+ [message.repeatedForeignEnumArray valueAtIndex:i]);
+ XCTAssertEqual((i % 2) ? ImportEnum_ImportBar : ImportEnum_ImportBaz,
+ [message.repeatedImportEnumArray valueAtIndex:i]);
string = [[NSString alloc] initWithFormat:@"%d", 224 + i * 100];
XCTAssertEqualObjects(string, message.repeatedStringPieceArray[i]);
@@ -715,8 +734,7 @@
XCTAssertEqualWithAccuracy(412.0, message.defaultDouble, 0.1);
XCTAssertFalse(message.defaultBool);
XCTAssertEqualObjects(@"415", message.defaultString);
- XCTAssertEqualObjects([NSData gpbtu_dataWithUint32:416],
- message.defaultBytes);
+ XCTAssertEqualObjects([NSData gpbtu_dataWithUint32:416], message.defaultBytes);
XCTAssertEqual(TestAllTypes_NestedEnum_Foo, message.defaultNestedEnum);
XCTAssertEqual(ForeignEnum_ForeignFoo, message.defaultForeignEnum);
@@ -746,8 +764,7 @@
TestAllTypes_OptionalGroup *allTypes = [TestAllTypes_OptionalGroup message];
[allTypes setA:117];
[message setOptionalGroup:allTypes];
- TestAllTypes_NestedMessage *nestedMessage =
- [TestAllTypes_NestedMessage message];
+ TestAllTypes_NestedMessage *nestedMessage = [TestAllTypes_NestedMessage message];
[nestedMessage setBb:118];
[message setOptionalNestedMessage:nestedMessage];
ForeignMessage *foreignMessage = [ForeignMessage message];
@@ -788,8 +805,7 @@
[message.repeatedBytesArray addObject:data];
[data release];
- TestAllTypes_RepeatedGroup *testAll =
- [[TestAllTypes_RepeatedGroup alloc] init];
+ TestAllTypes_RepeatedGroup *testAll = [[TestAllTypes_RepeatedGroup alloc] init];
[testAll setA:217 + i * 100];
[message.repeatedGroupArray addObject:testAll];
[testAll release];
@@ -809,10 +825,13 @@
[message.repeatedImportMessageArray addObject:importMessage];
[importMessage release];
- [message.repeatedNestedEnumArray addValue:(i % 2) ? TestAllTypes_NestedEnum_Bar : TestAllTypes_NestedEnum_Baz];
+ [message.repeatedNestedEnumArray
+ addValue:(i % 2) ? TestAllTypes_NestedEnum_Bar : TestAllTypes_NestedEnum_Baz];
- [message.repeatedForeignEnumArray addValue:(i % 2) ? ForeignEnum_ForeignBar : ForeignEnum_ForeignBaz];
- [message.repeatedImportEnumArray addValue:(i % 2) ? ImportEnum_ImportBar : ImportEnum_ImportBaz];
+ [message.repeatedForeignEnumArray
+ addValue:(i % 2) ? ForeignEnum_ForeignBar : ForeignEnum_ForeignBaz];
+ [message.repeatedImportEnumArray
+ addValue:(i % 2) ? ImportEnum_ImportBar : ImportEnum_ImportBaz];
string = [[NSString alloc] initWithFormat:@"%d", 224 + i * 100];
[message.repeatedStringPieceArray addObject:string];
@@ -933,8 +952,7 @@
message.hasDefaultCord = NO;
}
-- (void)setAllExtensions:(TestAllExtensions *)message
- repeatedCount:(uint32_t)count {
+- (void)setAllExtensions:(TestAllExtensions *)message repeatedCount:(uint32_t)count {
[message setExtension:[UnittestRoot optionalInt32Extension] value:@101];
[message setExtension:[UnittestRoot optionalInt64Extension] value:@102L];
[message setExtension:[UnittestRoot optionalUint32Extension] value:@103];
@@ -954,60 +972,40 @@
OptionalGroup_extension *optionalGroup = [OptionalGroup_extension message];
[optionalGroup setA:117];
- [message setExtension:[UnittestRoot optionalGroupExtension]
- value:optionalGroup];
- TestAllTypes_NestedMessage *nestedMessage =
- [TestAllTypes_NestedMessage message];
+ [message setExtension:[UnittestRoot optionalGroupExtension] value:optionalGroup];
+ TestAllTypes_NestedMessage *nestedMessage = [TestAllTypes_NestedMessage message];
[nestedMessage setBb:118];
- [message setExtension:[UnittestRoot optionalNestedMessageExtension]
- value:nestedMessage];
+ [message setExtension:[UnittestRoot optionalNestedMessageExtension] value:nestedMessage];
ForeignMessage *foreignMessage = [ForeignMessage message];
[foreignMessage setC:119];
- [message setExtension:[UnittestRoot optionalForeignMessageExtension]
- value:foreignMessage];
+ [message setExtension:[UnittestRoot optionalForeignMessageExtension] value:foreignMessage];
ImportMessage *importMessage = [ImportMessage message];
[importMessage setD:120];
- [message setExtension:[UnittestRoot optionalImportMessageExtension]
- value:importMessage];
+ [message setExtension:[UnittestRoot optionalImportMessageExtension] value:importMessage];
[message setExtension:[UnittestRoot optionalNestedEnumExtension]
value:@(TestAllTypes_NestedEnum_Baz)];
[message setExtension:[UnittestRoot optionalForeignEnumExtension]
value:@(ForeignEnum_ForeignBaz)];
- [message setExtension:[UnittestRoot optionalImportEnumExtension]
- value:@(ImportEnum_ImportBaz)];
+ [message setExtension:[UnittestRoot optionalImportEnumExtension] value:@(ImportEnum_ImportBaz)];
- [message setExtension:[UnittestRoot optionalStringPieceExtension]
- value:@"124"];
+ [message setExtension:[UnittestRoot optionalStringPieceExtension] value:@"124"];
[message setExtension:[UnittestRoot optionalCordExtension] value:@"125"];
for (uint32_t i = 0; i < count; ++i) {
- [message addExtension:[UnittestRoot repeatedInt32Extension]
- value:@(201 + i * 100)];
- [message addExtension:[UnittestRoot repeatedInt64Extension]
- value:@(202 + i * 100)];
- [message addExtension:[UnittestRoot repeatedUint32Extension]
- value:@(203 + i * 100)];
- [message addExtension:[UnittestRoot repeatedUint64Extension]
- value:@(204 + i * 100)];
- [message addExtension:[UnittestRoot repeatedSint32Extension]
- value:@(205 + i * 100)];
- [message addExtension:[UnittestRoot repeatedSint64Extension]
- value:@(206 + i * 100)];
- [message addExtension:[UnittestRoot repeatedFixed32Extension]
- value:@(207 + i * 100)];
- [message addExtension:[UnittestRoot repeatedFixed64Extension]
- value:@(208 + i * 100)];
- [message addExtension:[UnittestRoot repeatedSfixed32Extension]
- value:@(209 + i * 100)];
- [message addExtension:[UnittestRoot repeatedSfixed64Extension]
- value:@(210 + i * 100)];
- [message addExtension:[UnittestRoot repeatedFloatExtension]
- value:@(211 + i * 100)];
- [message addExtension:[UnittestRoot repeatedDoubleExtension]
- value:@(212 + i * 100)];
- [message addExtension:[UnittestRoot repeatedBoolExtension]
- value:@((i % 2) ? YES : NO)];
+ [message addExtension:[UnittestRoot repeatedInt32Extension] value:@(201 + i * 100)];
+ [message addExtension:[UnittestRoot repeatedInt64Extension] value:@(202 + i * 100)];
+ [message addExtension:[UnittestRoot repeatedUint32Extension] value:@(203 + i * 100)];
+ [message addExtension:[UnittestRoot repeatedUint64Extension] value:@(204 + i * 100)];
+ [message addExtension:[UnittestRoot repeatedSint32Extension] value:@(205 + i * 100)];
+ [message addExtension:[UnittestRoot repeatedSint64Extension] value:@(206 + i * 100)];
+ [message addExtension:[UnittestRoot repeatedFixed32Extension] value:@(207 + i * 100)];
+ [message addExtension:[UnittestRoot repeatedFixed64Extension] value:@(208 + i * 100)];
+ [message addExtension:[UnittestRoot repeatedSfixed32Extension] value:@(209 + i * 100)];
+ [message addExtension:[UnittestRoot repeatedSfixed64Extension] value:@(210 + i * 100)];
+ [message addExtension:[UnittestRoot repeatedFloatExtension] value:@(211 + i * 100)];
+ [message addExtension:[UnittestRoot repeatedDoubleExtension] value:@(212 + i * 100)];
+ [message addExtension:[UnittestRoot repeatedBoolExtension] value:@((i % 2) ? YES : NO)];
NSString *string = [[NSString alloc] initWithFormat:@"%d", 215 + i * 100];
[message addExtension:[UnittestRoot repeatedStringExtension] value:string];
[string release];
@@ -1015,40 +1013,31 @@
[message addExtension:[UnittestRoot repeatedBytesExtension] value:data];
[data release];
- RepeatedGroup_extension *repeatedGroup =
- [[RepeatedGroup_extension alloc] init];
+ RepeatedGroup_extension *repeatedGroup = [[RepeatedGroup_extension alloc] init];
[repeatedGroup setA:217 + i * 100];
- [message addExtension:[UnittestRoot repeatedGroupExtension]
- value:repeatedGroup];
+ [message addExtension:[UnittestRoot repeatedGroupExtension] value:repeatedGroup];
[repeatedGroup release];
nestedMessage = [[TestAllTypes_NestedMessage alloc] init];
[nestedMessage setBb:218 + i * 100];
- [message addExtension:[UnittestRoot repeatedNestedMessageExtension]
- value:nestedMessage];
+ [message addExtension:[UnittestRoot repeatedNestedMessageExtension] value:nestedMessage];
[nestedMessage release];
foreignMessage = [[ForeignMessage alloc] init];
[foreignMessage setC:219 + i * 100];
- [message addExtension:[UnittestRoot repeatedForeignMessageExtension]
- value:foreignMessage];
+ [message addExtension:[UnittestRoot repeatedForeignMessageExtension] value:foreignMessage];
[foreignMessage release];
importMessage = [[ImportMessage alloc] init];
[importMessage setD:220 + i * 100];
- [message addExtension:[UnittestRoot repeatedImportMessageExtension]
- value:importMessage];
+ [message addExtension:[UnittestRoot repeatedImportMessageExtension] value:importMessage];
[importMessage release];
[message addExtension:[UnittestRoot repeatedNestedEnumExtension]
- value:@((i % 2) ? TestAllTypes_NestedEnum_Bar
- : TestAllTypes_NestedEnum_Baz)];
+ value:@((i % 2) ? TestAllTypes_NestedEnum_Bar : TestAllTypes_NestedEnum_Baz)];
[message addExtension:[UnittestRoot repeatedForeignEnumExtension]
- value:@((i % 2) ? ForeignEnum_ForeignBar
- : ForeignEnum_ForeignBaz)];
- [message
- addExtension:[UnittestRoot repeatedImportEnumExtension]
- value:@((i % 2) ? ImportEnum_ImportBar : ImportEnum_ImportBaz)];
+ value:@((i % 2) ? ForeignEnum_ForeignBar : ForeignEnum_ForeignBaz)];
+ [message addExtension:[UnittestRoot repeatedImportEnumExtension]
+ value:@((i % 2) ? ImportEnum_ImportBar : ImportEnum_ImportBaz)];
string = [[NSString alloc] initWithFormat:@"%d", 224 + i * 100];
- [message addExtension:[UnittestRoot repeatedStringPieceExtension]
- value:string];
+ [message addExtension:[UnittestRoot repeatedStringPieceExtension] value:string];
[string release];
string = [[NSString alloc] initWithFormat:@"%d", 225 + i * 100];
@@ -1077,13 +1066,10 @@
[message setExtension:[UnittestRoot defaultNestedEnumExtension]
value:@(TestAllTypes_NestedEnum_Foo)];
- [message setExtension:[UnittestRoot defaultForeignEnumExtension]
- value:@(ForeignEnum_ForeignFoo)];
- [message setExtension:[UnittestRoot defaultImportEnumExtension]
- value:@(ImportEnum_ImportFoo)];
+ [message setExtension:[UnittestRoot defaultForeignEnumExtension] value:@(ForeignEnum_ForeignFoo)];
+ [message setExtension:[UnittestRoot defaultImportEnumExtension] value:@(ImportEnum_ImportFoo)];
- [message setExtension:[UnittestRoot defaultStringPieceExtension]
- value:@"424"];
+ [message setExtension:[UnittestRoot defaultStringPieceExtension] value:@"424"];
[message setExtension:[UnittestRoot defaultCordExtension] value:@"425"];
}
@@ -1113,9 +1099,8 @@
[message.mapInt32Bytes setObject:data forKey:113 + i * 100];
[data release];
- [message.mapInt32Enum
- setEnum:(i % 2) ? MapEnum_MapEnumBar : MapEnum_MapEnumBaz
- forKey:114 + i * 100];
+ [message.mapInt32Enum setEnum:(i % 2) ? MapEnum_MapEnumBar : MapEnum_MapEnumBaz
+ forKey:114 + i * 100];
ForeignMessage *subMsg = [[ForeignMessage alloc] init];
subMsg.c = i + 1;
@@ -1376,8 +1361,7 @@
XCTAssertEqualWithAccuracy(52e3, message.defaultDouble, 0.1);
XCTAssertTrue(message.defaultBool);
XCTAssertEqualObjects(@"hello", message.defaultString);
- XCTAssertEqualObjects([NSData gpbtu_dataWithCString:"world"],
- message.defaultBytes);
+ XCTAssertEqualObjects([NSData gpbtu_dataWithCString:"world"], message.defaultBytes);
XCTAssertEqual(TestAllTypes_NestedEnum_Bar, message.defaultNestedEnum);
XCTAssertEqual(ForeignEnum_ForeignBar, message.defaultForeignEnum);
@@ -1419,20 +1403,29 @@
// Optional fields without defaults are set to zero or something like it.
XCTAssertEqual(0, [[message getExtension:[UnittestRoot optionalInt32Extension]] intValue]);
- XCTAssertEqual(0LL,[[message getExtension:[UnittestRoot optionalInt64Extension]] longLongValue]);
- XCTAssertEqual(0U, [[message getExtension:[UnittestRoot optionalUint32Extension]] unsignedIntValue]);
- XCTAssertEqual(0ULL, [[message getExtension:[UnittestRoot optionalUint64Extension]] unsignedLongLongValue]);
+ XCTAssertEqual(0LL, [[message getExtension:[UnittestRoot optionalInt64Extension]] longLongValue]);
+ XCTAssertEqual(0U,
+ [[message getExtension:[UnittestRoot optionalUint32Extension]] unsignedIntValue]);
+ XCTAssertEqual(
+ 0ULL, [[message getExtension:[UnittestRoot optionalUint64Extension]] unsignedLongLongValue]);
XCTAssertEqual(0, [[message getExtension:[UnittestRoot optionalSint32Extension]] intValue]);
- XCTAssertEqual(0LL, [[message getExtension:[UnittestRoot optionalSint64Extension]] longLongValue]);
- XCTAssertEqual(0U, [[message getExtension:[UnittestRoot optionalFixed32Extension]] unsignedIntValue]);
- XCTAssertEqual(0ULL, [[message getExtension:[UnittestRoot optionalFixed64Extension]] unsignedLongLongValue]);
+ XCTAssertEqual(0LL,
+ [[message getExtension:[UnittestRoot optionalSint64Extension]] longLongValue]);
+ XCTAssertEqual(0U,
+ [[message getExtension:[UnittestRoot optionalFixed32Extension]] unsignedIntValue]);
+ XCTAssertEqual(
+ 0ULL, [[message getExtension:[UnittestRoot optionalFixed64Extension]] unsignedLongLongValue]);
XCTAssertEqual(0, [[message getExtension:[UnittestRoot optionalSfixed32Extension]] intValue]);
- XCTAssertEqual(0LL, [[message getExtension:[UnittestRoot optionalSfixed64Extension]] longLongValue]);
- XCTAssertEqualWithAccuracy(0.0f, [[message getExtension:[UnittestRoot optionalFloatExtension]] floatValue], 0.01);
- XCTAssertEqualWithAccuracy(0.0, [[message getExtension:[UnittestRoot optionalDoubleExtension]] doubleValue], 0.01);
+ XCTAssertEqual(0LL,
+ [[message getExtension:[UnittestRoot optionalSfixed64Extension]] longLongValue]);
+ XCTAssertEqualWithAccuracy(
+ 0.0f, [[message getExtension:[UnittestRoot optionalFloatExtension]] floatValue], 0.01);
+ XCTAssertEqualWithAccuracy(
+ 0.0, [[message getExtension:[UnittestRoot optionalDoubleExtension]] doubleValue], 0.01);
XCTAssertFalse([[message getExtension:[UnittestRoot optionalBoolExtension]] boolValue]);
XCTAssertEqualObjects(@"", [message getExtension:[UnittestRoot optionalStringExtension]]);
- XCTAssertEqualObjects(GPBEmptyNSData(), [message getExtension:[UnittestRoot optionalBytesExtension]]);
+ XCTAssertEqualObjects(GPBEmptyNSData(),
+ [message getExtension:[UnittestRoot optionalBytesExtension]]);
// Embedded messages should also be clear.
@@ -1441,18 +1434,20 @@
XCTAssertFalse([[message getExtension:[UnittestRoot optionalForeignMessageExtension]] hasC]);
XCTAssertFalse([[message getExtension:[UnittestRoot optionalImportMessageExtension]] hasD]);
- XCTAssertEqual(0, [(TestAllTypes_OptionalGroup*)[message getExtension:[UnittestRoot optionalGroupExtension]] a]);
- XCTAssertEqual(0, [(TestAllTypes_NestedMessage*)[message getExtension:[UnittestRoot optionalNestedMessageExtension]] bb]);
+ XCTAssertEqual(0, [(TestAllTypes_OptionalGroup *)[message
+ getExtension:[UnittestRoot optionalGroupExtension]] a]);
+ XCTAssertEqual(0, [(TestAllTypes_NestedMessage *)[message
+ getExtension:[UnittestRoot optionalNestedMessageExtension]] bb]);
XCTAssertEqual(0, [[message getExtension:[UnittestRoot optionalForeignMessageExtension]] c]);
XCTAssertEqual(0, [[message getExtension:[UnittestRoot optionalImportMessageExtension]] d]);
// Enums without defaults are set to the first value in the enum.
XCTAssertEqual(TestAllTypes_NestedEnum_Foo,
- [[message getExtension:[UnittestRoot optionalNestedEnumExtension]] intValue]);
+ [[message getExtension:[UnittestRoot optionalNestedEnumExtension]] intValue]);
XCTAssertEqual(ForeignEnum_ForeignFoo,
- [[message getExtension:[UnittestRoot optionalForeignEnumExtension]] intValue]);
+ [[message getExtension:[UnittestRoot optionalForeignEnumExtension]] intValue]);
XCTAssertEqual(ImportEnum_ImportFoo,
- [[message getExtension:[UnittestRoot optionalImportEnumExtension]] intValue]);
+ [[message getExtension:[UnittestRoot optionalImportEnumExtension]] intValue]);
XCTAssertEqualObjects(@"", [message getExtension:[UnittestRoot optionalStringPieceExtension]]);
XCTAssertEqualObjects(@"", [message getExtension:[UnittestRoot optionalCordExtension]]);
@@ -1510,28 +1505,36 @@
XCTAssertFalse([message hasExtension:[UnittestRoot defaultCordExtension]]);
// Fields with defaults have their default values (duh).
- XCTAssertEqual( 41, [[message getExtension:[UnittestRoot defaultInt32Extension]] intValue]);
- XCTAssertEqual( 42LL, [[message getExtension:[UnittestRoot defaultInt64Extension]] longLongValue]);
- XCTAssertEqual( 43U, [[message getExtension:[UnittestRoot defaultUint32Extension]] unsignedIntValue]);
- XCTAssertEqual( 44ULL, [[message getExtension:[UnittestRoot defaultUint64Extension]] unsignedLongLongValue]);
+ XCTAssertEqual(41, [[message getExtension:[UnittestRoot defaultInt32Extension]] intValue]);
+ XCTAssertEqual(42LL, [[message getExtension:[UnittestRoot defaultInt64Extension]] longLongValue]);
+ XCTAssertEqual(43U,
+ [[message getExtension:[UnittestRoot defaultUint32Extension]] unsignedIntValue]);
+ XCTAssertEqual(
+ 44ULL, [[message getExtension:[UnittestRoot defaultUint64Extension]] unsignedLongLongValue]);
XCTAssertEqual(-45, [[message getExtension:[UnittestRoot defaultSint32Extension]] intValue]);
- XCTAssertEqual( 46LL, [[message getExtension:[UnittestRoot defaultSint64Extension]] longLongValue]);
- XCTAssertEqual( 47, [[message getExtension:[UnittestRoot defaultFixed32Extension]] intValue]);
- XCTAssertEqual( 48ULL, [[message getExtension:[UnittestRoot defaultFixed64Extension]] unsignedLongLongValue]);
- XCTAssertEqual( 49, [[message getExtension:[UnittestRoot defaultSfixed32Extension]] intValue]);
- XCTAssertEqual(-50LL, [[message getExtension:[UnittestRoot defaultSfixed64Extension]] longLongValue]);
- XCTAssertEqualWithAccuracy( 51.5f, [[message getExtension:[UnittestRoot defaultFloatExtension]] floatValue], 0.01);
- XCTAssertEqualWithAccuracy( 52e3, [[message getExtension:[UnittestRoot defaultDoubleExtension]] doubleValue], 0.01);
+ XCTAssertEqual(46LL,
+ [[message getExtension:[UnittestRoot defaultSint64Extension]] longLongValue]);
+ XCTAssertEqual(47, [[message getExtension:[UnittestRoot defaultFixed32Extension]] intValue]);
+ XCTAssertEqual(
+ 48ULL, [[message getExtension:[UnittestRoot defaultFixed64Extension]] unsignedLongLongValue]);
+ XCTAssertEqual(49, [[message getExtension:[UnittestRoot defaultSfixed32Extension]] intValue]);
+ XCTAssertEqual(-50LL,
+ [[message getExtension:[UnittestRoot defaultSfixed64Extension]] longLongValue]);
+ XCTAssertEqualWithAccuracy(
+ 51.5f, [[message getExtension:[UnittestRoot defaultFloatExtension]] floatValue], 0.01);
+ XCTAssertEqualWithAccuracy(
+ 52e3, [[message getExtension:[UnittestRoot defaultDoubleExtension]] doubleValue], 0.01);
XCTAssertTrue([[message getExtension:[UnittestRoot defaultBoolExtension]] boolValue]);
XCTAssertEqualObjects(@"hello", [message getExtension:[UnittestRoot defaultStringExtension]]);
- XCTAssertEqualObjects([NSData gpbtu_dataWithCString:"world"], [message getExtension:[UnittestRoot defaultBytesExtension]]);
+ XCTAssertEqualObjects([NSData gpbtu_dataWithCString:"world"],
+ [message getExtension:[UnittestRoot defaultBytesExtension]]);
XCTAssertEqual(TestAllTypes_NestedEnum_Bar,
- [[message getExtension:[UnittestRoot defaultNestedEnumExtension]] intValue]);
+ [[message getExtension:[UnittestRoot defaultNestedEnumExtension]] intValue]);
XCTAssertEqual(ForeignEnum_ForeignBar,
- [[message getExtension:[UnittestRoot defaultForeignEnumExtension]] intValue]);
+ [[message getExtension:[UnittestRoot defaultForeignEnumExtension]] intValue]);
XCTAssertEqual(ImportEnum_ImportBar,
- [[message getExtension:[UnittestRoot defaultImportEnumExtension]] intValue]);
+ [[message getExtension:[UnittestRoot defaultImportEnumExtension]] intValue]);
XCTAssertEqualObjects(@"abc", [message getExtension:[UnittestRoot defaultStringPieceExtension]]);
XCTAssertEqualObjects(@"123", [message getExtension:[UnittestRoot defaultCordExtension]]);
@@ -1557,29 +1560,24 @@
[message.repeatedBytesArray replaceObjectAtIndex:1 withObject:data];
[data release];
- TestAllTypes_RepeatedGroup *testAll =
- [[TestAllTypes_RepeatedGroup alloc] init];
+ TestAllTypes_RepeatedGroup *testAll = [[TestAllTypes_RepeatedGroup alloc] init];
[testAll setA:517];
[message.repeatedGroupArray replaceObjectAtIndex:1 withObject:testAll];
[testAll release];
- TestAllTypes_NestedMessage *nestedMessage =
- [[TestAllTypes_NestedMessage alloc] init];
+ TestAllTypes_NestedMessage *nestedMessage = [[TestAllTypes_NestedMessage alloc] init];
[nestedMessage setBb:518];
- [message.repeatedNestedMessageArray replaceObjectAtIndex:1
- withObject:nestedMessage];
+ [message.repeatedNestedMessageArray replaceObjectAtIndex:1 withObject:nestedMessage];
[nestedMessage release];
ForeignMessage *foreignMessage = [[ForeignMessage alloc] init];
[foreignMessage setC:519];
- [message.repeatedForeignMessageArray replaceObjectAtIndex:1
- withObject:foreignMessage];
+ [message.repeatedForeignMessageArray replaceObjectAtIndex:1 withObject:foreignMessage];
[foreignMessage release];
ImportMessage *importMessage = [[ImportMessage alloc] init];
[importMessage setD:520];
- [message.repeatedImportMessageArray replaceObjectAtIndex:1
- withObject:importMessage];
+ [message.repeatedImportMessageArray replaceObjectAtIndex:1 withObject:importMessage];
[importMessage release];
[message.repeatedNestedEnumArray replaceValueAtIndex:1 withValue:TestAllTypes_NestedEnum_Foo];
@@ -1590,8 +1588,7 @@
[message.repeatedCordArray replaceObjectAtIndex:1 withObject:@"525"];
}
-- (void)assertRepeatedFieldsModified:(TestAllTypes *)message
- repeatedCount:(uint32_t)count {
+- (void)assertRepeatedFieldsModified:(TestAllTypes *)message repeatedCount:(uint32_t)count {
// ModifyRepeatedFields only sets the second repeated element of each
// field. In addition to verifying this, we also verify that the first
// element and size were *not* modified.
@@ -1664,13 +1661,12 @@
XCTAssertEqualWithAccuracy(212.0, [message.repeatedDoubleArray valueAtIndex:0], 0.01);
XCTAssertFalse([message.repeatedBoolArray valueAtIndex:0]);
XCTAssertEqualObjects(@"215", message.repeatedStringArray[0]);
- XCTAssertEqualObjects([NSData gpbtu_dataWithUint32:216],
- message.repeatedBytesArray[0]);
+ XCTAssertEqualObjects([NSData gpbtu_dataWithUint32:216], message.repeatedBytesArray[0]);
- XCTAssertEqual(217, ((TestAllTypes_RepeatedGroup*)message.repeatedGroupArray[0]).a);
- XCTAssertEqual(218, ((TestAllTypes_NestedMessage*)message.repeatedNestedMessageArray[0]).bb);
- XCTAssertEqual(219, ((ForeignMessage*)message.repeatedForeignMessageArray[0]).c);
- XCTAssertEqual(220, ((ImportMessage*)message.repeatedImportMessageArray[0]).d);
+ XCTAssertEqual(217, ((TestAllTypes_RepeatedGroup *)message.repeatedGroupArray[0]).a);
+ XCTAssertEqual(218, ((TestAllTypes_NestedMessage *)message.repeatedNestedMessageArray[0]).bb);
+ XCTAssertEqual(219, ((ForeignMessage *)message.repeatedForeignMessageArray[0]).c);
+ XCTAssertEqual(220, ((ImportMessage *)message.repeatedImportMessageArray[0]).d);
XCTAssertEqual(TestAllTypes_NestedEnum_Baz, [message.repeatedNestedEnumArray valueAtIndex:0]);
XCTAssertEqual(ForeignEnum_ForeignBaz, [message.repeatedForeignEnumArray valueAtIndex:0]);
@@ -1694,13 +1690,12 @@
XCTAssertEqualWithAccuracy(512.0, [message.repeatedDoubleArray valueAtIndex:1], 0.01);
XCTAssertTrue([message.repeatedBoolArray valueAtIndex:1]);
XCTAssertEqualObjects(@"515", message.repeatedStringArray[1]);
- XCTAssertEqualObjects([NSData gpbtu_dataWithUint32:516],
- message.repeatedBytesArray[1]);
+ XCTAssertEqualObjects([NSData gpbtu_dataWithUint32:516], message.repeatedBytesArray[1]);
- XCTAssertEqual(517, ((TestAllTypes_RepeatedGroup*)message.repeatedGroupArray[1]).a);
- XCTAssertEqual(518, ((TestAllTypes_NestedMessage*)message.repeatedNestedMessageArray[1]).bb);
- XCTAssertEqual(519, ((ForeignMessage*)message.repeatedForeignMessageArray[1]).c);
- XCTAssertEqual(520, ((ImportMessage*)message.repeatedImportMessageArray[1]).d);
+ XCTAssertEqual(517, ((TestAllTypes_RepeatedGroup *)message.repeatedGroupArray[1]).a);
+ XCTAssertEqual(518, ((TestAllTypes_NestedMessage *)message.repeatedNestedMessageArray[1]).bb);
+ XCTAssertEqual(519, ((ForeignMessage *)message.repeatedForeignMessageArray[1]).c);
+ XCTAssertEqual(520, ((ImportMessage *)message.repeatedImportMessageArray[1]).d);
XCTAssertEqual(TestAllTypes_NestedEnum_Foo, [message.repeatedNestedEnumArray valueAtIndex:1]);
XCTAssertEqual(ForeignEnum_ForeignFoo, [message.repeatedForeignEnumArray valueAtIndex:1]);
@@ -1710,8 +1705,7 @@
XCTAssertEqualObjects(@"525", message.repeatedCordArray[1]);
}
-- (void)setPackedFields:(TestPackedTypes *)message
- repeatedCount:(uint32_t)count {
+- (void)setPackedFields:(TestPackedTypes *)message repeatedCount:(uint32_t)count {
// Must match -setUnpackedFields:repeatedCount:
// Must match -setPackedExtensions:repeatedCount:
// Must match -setUnpackedExtensions:repeatedCount:
@@ -1755,13 +1749,11 @@
[message.packedBoolArray addValue:(i % 2) ? YES : NO];
}
for (uint32_t i = 0; i < count; ++i) {
- [message.packedEnumArray
- addValue:(i % 2) ? ForeignEnum_ForeignBar : ForeignEnum_ForeignBaz];
+ [message.packedEnumArray addValue:(i % 2) ? ForeignEnum_ForeignBar : ForeignEnum_ForeignBaz];
}
}
-- (void)setUnpackedFields:(TestUnpackedTypes *)message
- repeatedCount:(uint32_t)count {
+- (void)setUnpackedFields:(TestUnpackedTypes *)message repeatedCount:(uint32_t)count {
// Must match -setPackedFields:repeatedCount:
// Must match -setPackedExtensions:repeatedCount:
// Must match -setUnpackedExtensions:repeatedCount:
@@ -1805,13 +1797,11 @@
[message.unpackedBoolArray addValue:(i % 2) ? YES : NO];
}
for (uint32_t i = 0; i < count; ++i) {
- [message.unpackedEnumArray
- addValue:(i % 2) ? ForeignEnum_ForeignBar : ForeignEnum_ForeignBaz];
+ [message.unpackedEnumArray addValue:(i % 2) ? ForeignEnum_ForeignBar : ForeignEnum_ForeignBaz];
}
}
-- (void)assertPackedFieldsSet:(TestPackedTypes *)message
- repeatedCount:(uint32_t)count {
+- (void)assertPackedFieldsSet:(TestPackedTypes *)message repeatedCount:(uint32_t)count {
XCTAssertEqual(count, message.packedInt32Array.count);
XCTAssertEqual(count, message.packedInt64Array.count);
XCTAssertEqual(count, message.packedUint32Array.count);
@@ -1827,108 +1817,71 @@
XCTAssertEqual(count, message.packedBoolArray.count);
XCTAssertEqual(count, message.packedEnumArray.count);
for (uint32_t i = 0; i < count; ++i) {
- XCTAssertEqual((int)(601 + i * 100),
- [message.packedInt32Array valueAtIndex:i]);
+ XCTAssertEqual((int)(601 + i * 100), [message.packedInt32Array valueAtIndex:i]);
XCTAssertEqual(602 + i * 100, [message.packedInt64Array valueAtIndex:i]);
XCTAssertEqual(603 + i * 100, [message.packedUint32Array valueAtIndex:i]);
XCTAssertEqual(604 + i * 100, [message.packedUint64Array valueAtIndex:i]);
- XCTAssertEqual((int)(605 + i * 100),
- [message.packedSint32Array valueAtIndex:i]);
+ XCTAssertEqual((int)(605 + i * 100), [message.packedSint32Array valueAtIndex:i]);
XCTAssertEqual(606 + i * 100, [message.packedSint64Array valueAtIndex:i]);
XCTAssertEqual(607 + i * 100, [message.packedFixed32Array valueAtIndex:i]);
XCTAssertEqual(608 + i * 100, [message.packedFixed64Array valueAtIndex:i]);
- XCTAssertEqual((int)(609 + i * 100),
- [message.packedSfixed32Array valueAtIndex:i]);
+ XCTAssertEqual((int)(609 + i * 100), [message.packedSfixed32Array valueAtIndex:i]);
XCTAssertEqual(610 + i * 100, [message.packedSfixed64Array valueAtIndex:i]);
- XCTAssertEqualWithAccuracy(611 + i * 100,
- [message.packedFloatArray valueAtIndex:i], 0.01);
- XCTAssertEqualWithAccuracy(
- 612 + i * 100, [message.packedDoubleArray valueAtIndex:i], 0.01);
- XCTAssertEqual((i % 2) ? YES : NO,
- [message.packedBoolArray valueAtIndex:i]);
+ XCTAssertEqualWithAccuracy(611 + i * 100, [message.packedFloatArray valueAtIndex:i], 0.01);
+ XCTAssertEqualWithAccuracy(612 + i * 100, [message.packedDoubleArray valueAtIndex:i], 0.01);
+ XCTAssertEqual((i % 2) ? YES : NO, [message.packedBoolArray valueAtIndex:i]);
XCTAssertEqual((i % 2) ? ForeignEnum_ForeignBar : ForeignEnum_ForeignBaz,
[message.packedEnumArray valueAtIndex:i]);
}
}
-- (void)setPackedExtensions:(TestPackedExtensions *)message
- repeatedCount:(uint32_t)count {
+- (void)setPackedExtensions:(TestPackedExtensions *)message repeatedCount:(uint32_t)count {
// Must match -setPackedFields:repeatedCount:
// Must match -setUnpackedFields:repeatedCount:
// Must match -setUnpackedExtensions:repeatedCount:
for (uint32_t i = 0; i < count; i++) {
- [message addExtension:[UnittestRoot packedInt32Extension]
- value:@(601 + i * 100)];
- [message addExtension:[UnittestRoot packedInt64Extension]
- value:@(602 + i * 100)];
- [message addExtension:[UnittestRoot packedUint32Extension]
- value:@(603 + i * 100)];
- [message addExtension:[UnittestRoot packedUint64Extension]
- value:@(604 + i * 100)];
- [message addExtension:[UnittestRoot packedSint32Extension]
- value:@(605 + i * 100)];
- [message addExtension:[UnittestRoot packedSint64Extension]
- value:@(606 + i * 100)];
- [message addExtension:[UnittestRoot packedFixed32Extension]
- value:@(607 + i * 100)];
- [message addExtension:[UnittestRoot packedFixed64Extension]
- value:@(608 + i * 100)];
- [message addExtension:[UnittestRoot packedSfixed32Extension]
- value:@(609 + i * 100)];
- [message addExtension:[UnittestRoot packedSfixed64Extension]
- value:@(610 + i * 100)];
- [message addExtension:[UnittestRoot packedFloatExtension]
- value:@(611 + i * 100)];
- [message addExtension:[UnittestRoot packedDoubleExtension]
- value:@(612 + i * 100)];
- [message addExtension:[UnittestRoot packedBoolExtension]
- value:@((i % 2) ? YES : NO)];
+ [message addExtension:[UnittestRoot packedInt32Extension] value:@(601 + i * 100)];
+ [message addExtension:[UnittestRoot packedInt64Extension] value:@(602 + i * 100)];
+ [message addExtension:[UnittestRoot packedUint32Extension] value:@(603 + i * 100)];
+ [message addExtension:[UnittestRoot packedUint64Extension] value:@(604 + i * 100)];
+ [message addExtension:[UnittestRoot packedSint32Extension] value:@(605 + i * 100)];
+ [message addExtension:[UnittestRoot packedSint64Extension] value:@(606 + i * 100)];
+ [message addExtension:[UnittestRoot packedFixed32Extension] value:@(607 + i * 100)];
+ [message addExtension:[UnittestRoot packedFixed64Extension] value:@(608 + i * 100)];
+ [message addExtension:[UnittestRoot packedSfixed32Extension] value:@(609 + i * 100)];
+ [message addExtension:[UnittestRoot packedSfixed64Extension] value:@(610 + i * 100)];
+ [message addExtension:[UnittestRoot packedFloatExtension] value:@(611 + i * 100)];
+ [message addExtension:[UnittestRoot packedDoubleExtension] value:@(612 + i * 100)];
+ [message addExtension:[UnittestRoot packedBoolExtension] value:@((i % 2) ? YES : NO)];
[message addExtension:[UnittestRoot packedEnumExtension]
- value:@((i % 2) ? ForeignEnum_ForeignBar
- : ForeignEnum_ForeignBaz)];
+ value:@((i % 2) ? ForeignEnum_ForeignBar : ForeignEnum_ForeignBaz)];
}
}
-- (void)setUnpackedExtensions:(TestUnpackedExtensions *)message
- repeatedCount:(uint32_t)count {
+- (void)setUnpackedExtensions:(TestUnpackedExtensions *)message repeatedCount:(uint32_t)count {
// Must match -setPackedFields:repeatedCount:
// Must match -setUnpackedFields:repeatedCount:
// Must match -setPackedExtensions:repeatedCount:
for (uint32_t i = 0; i < count; i++) {
- [message addExtension:[UnittestRoot unpackedInt32Extension]
- value:@(601 + i * 100)];
- [message addExtension:[UnittestRoot unpackedInt64Extension]
- value:@(602 + i * 100)];
- [message addExtension:[UnittestRoot unpackedUint32Extension]
- value:@(603 + i * 100)];
- [message addExtension:[UnittestRoot unpackedUint64Extension]
- value:@(604 + i * 100)];
- [message addExtension:[UnittestRoot unpackedSint32Extension]
- value:@(605 + i * 100)];
- [message addExtension:[UnittestRoot unpackedSint64Extension]
- value:@(606 + i * 100)];
- [message addExtension:[UnittestRoot unpackedFixed32Extension]
- value:@(607 + i * 100)];
- [message addExtension:[UnittestRoot unpackedFixed64Extension]
- value:@(608 + i * 100)];
- [message addExtension:[UnittestRoot unpackedSfixed32Extension]
- value:@(609 + i * 100)];
- [message addExtension:[UnittestRoot unpackedSfixed64Extension]
- value:@(610 + i * 100)];
- [message addExtension:[UnittestRoot unpackedFloatExtension]
- value:@(611 + i * 100)];
- [message addExtension:[UnittestRoot unpackedDoubleExtension]
- value:@(612 + i * 100)];
- [message addExtension:[UnittestRoot unpackedBoolExtension]
- value:@((i % 2) ? YES : NO)];
+ [message addExtension:[UnittestRoot unpackedInt32Extension] value:@(601 + i * 100)];
+ [message addExtension:[UnittestRoot unpackedInt64Extension] value:@(602 + i * 100)];
+ [message addExtension:[UnittestRoot unpackedUint32Extension] value:@(603 + i * 100)];
+ [message addExtension:[UnittestRoot unpackedUint64Extension] value:@(604 + i * 100)];
+ [message addExtension:[UnittestRoot unpackedSint32Extension] value:@(605 + i * 100)];
+ [message addExtension:[UnittestRoot unpackedSint64Extension] value:@(606 + i * 100)];
+ [message addExtension:[UnittestRoot unpackedFixed32Extension] value:@(607 + i * 100)];
+ [message addExtension:[UnittestRoot unpackedFixed64Extension] value:@(608 + i * 100)];
+ [message addExtension:[UnittestRoot unpackedSfixed32Extension] value:@(609 + i * 100)];
+ [message addExtension:[UnittestRoot unpackedSfixed64Extension] value:@(610 + i * 100)];
+ [message addExtension:[UnittestRoot unpackedFloatExtension] value:@(611 + i * 100)];
+ [message addExtension:[UnittestRoot unpackedDoubleExtension] value:@(612 + i * 100)];
+ [message addExtension:[UnittestRoot unpackedBoolExtension] value:@((i % 2) ? YES : NO)];
[message addExtension:[UnittestRoot unpackedEnumExtension]
- value:@((i % 2) ? ForeignEnum_ForeignBar
- : ForeignEnum_ForeignBaz)];
+ value:@((i % 2) ? ForeignEnum_ForeignBar : ForeignEnum_ForeignBaz)];
}
}
-- (void)assertPackedExtensionsSet:(TestPackedExtensions *)message
- repeatedCount:(uint32_t)count{
+- (void)assertPackedExtensionsSet:(TestPackedExtensions *)message repeatedCount:(uint32_t)count {
XCTAssertEqual(count, [[message getExtension:[UnittestRoot packedInt32Extension]] count]);
XCTAssertEqual(count, [[message getExtension:[UnittestRoot packedInt64Extension]] count]);
XCTAssertEqual(count, [[message getExtension:[UnittestRoot packedUint32Extension]] count]);
@@ -2016,20 +1969,24 @@
XCTAssertEqualObjects([message valueForKey:@"hasOptionalNestedMessage"], @YES);
XCTAssertNotNil(message.optionalNestedMessage);
XCTAssertEqualObjects([message valueForKeyPath:@"optionalNestedMessage.hasBb"], @YES);
- XCTAssertEqualObjects(@(message.optionalNestedMessage.bb), [message valueForKeyPath:@"optionalNestedMessage.bb"]);
+ XCTAssertEqualObjects(@(message.optionalNestedMessage.bb),
+ [message valueForKeyPath:@"optionalNestedMessage.bb"]);
XCTAssertEqualObjects([message valueForKey:@"hasOptionalForeignMessage"], @YES);
XCTAssertNotNil(message.optionalForeignMessage);
XCTAssertEqualObjects([message valueForKeyPath:@"optionalForeignMessage.hasC"], @YES);
- XCTAssertEqualObjects(@(message.optionalForeignMessage.c), [message valueForKeyPath:@"optionalForeignMessage.c"]);
+ XCTAssertEqualObjects(@(message.optionalForeignMessage.c),
+ [message valueForKeyPath:@"optionalForeignMessage.c"]);
XCTAssertEqualObjects([message valueForKey:@"hasOptionalImportMessage"], @YES);
XCTAssertNotNil(message.optionalForeignMessage);
XCTAssertEqualObjects([message valueForKeyPath:@"optionalImportMessage.hasD"], @YES);
- XCTAssertEqualObjects(@(message.optionalImportMessage.d), [message valueForKeyPath:@"optionalImportMessage.d"]);
+ XCTAssertEqualObjects(@(message.optionalImportMessage.d),
+ [message valueForKeyPath:@"optionalImportMessage.d"]);
XCTAssertEqualObjects([message valueForKey:@"hasOptionalNestedEnum"], @YES);
XCTAssertEqualObjects(@(message.optionalNestedEnum), [message valueForKey:@"optionalNestedEnum"]);
XCTAssertEqualObjects([message valueForKey:@"hasOptionalForeignEnum"], @YES);
- XCTAssertEqualObjects(@(message.optionalForeignEnum), [message valueForKey:@"optionalForeignEnum"]);
+ XCTAssertEqualObjects(@(message.optionalForeignEnum),
+ [message valueForKey:@"optionalForeignEnum"]);
XCTAssertEqualObjects([message valueForKey:@"hasOptionalImportEnum"], @YES);
XCTAssertEqualObjects(@(message.optionalImportEnum), [message valueForKey:@"optionalImportEnum"]);
@@ -2048,10 +2005,14 @@
XCTAssertEqualObjects(message.repeatedUint64Array, [message valueForKey:@"repeatedUint64Array"]);
XCTAssertEqualObjects(message.repeatedSint32Array, [message valueForKey:@"repeatedSint32Array"]);
XCTAssertEqualObjects(message.repeatedSint64Array, [message valueForKey:@"repeatedSint64Array"]);
- XCTAssertEqualObjects(message.repeatedFixed32Array, [message valueForKey:@"repeatedFixed32Array"]);
- XCTAssertEqualObjects(message.repeatedFixed64Array, [message valueForKey:@"repeatedFixed64Array"]);
- XCTAssertEqualObjects(message.repeatedSfixed32Array, [message valueForKey:@"repeatedSfixed32Array"]);
- XCTAssertEqualObjects(message.repeatedSfixed64Array, [message valueForKey:@"repeatedSfixed64Array"]);
+ XCTAssertEqualObjects(message.repeatedFixed32Array,
+ [message valueForKey:@"repeatedFixed32Array"]);
+ XCTAssertEqualObjects(message.repeatedFixed64Array,
+ [message valueForKey:@"repeatedFixed64Array"]);
+ XCTAssertEqualObjects(message.repeatedSfixed32Array,
+ [message valueForKey:@"repeatedSfixed32Array"]);
+ XCTAssertEqualObjects(message.repeatedSfixed64Array,
+ [message valueForKey:@"repeatedSfixed64Array"]);
XCTAssertEqualObjects(message.repeatedFloatArray, [message valueForKey:@"repeatedFloatArray"]);
XCTAssertEqualObjects(message.repeatedDoubleArray, [message valueForKey:@"repeatedDoubleArray"]);
XCTAssertEqualObjects(message.repeatedBoolArray, [message valueForKey:@"repeatedBoolArray"]);
@@ -2059,44 +2020,75 @@
XCTAssertEqualObjects(message.repeatedBytesArray, [message valueForKey:@"repeatedBytesArray"]);
XCTAssertEqualObjects(message.repeatedGroupArray, [message valueForKey:@"repeatedGroupArray"]);
- XCTAssertEqualObjects(message.repeatedNestedMessageArray, [message valueForKey:@"repeatedNestedMessageArray"]);
- XCTAssertEqualObjects(message.repeatedForeignMessageArray, [message valueForKey:@"repeatedForeignMessageArray"]);
- XCTAssertEqualObjects(message.repeatedImportMessageArray, [message valueForKey:@"repeatedImportMessageArray"]);
+ XCTAssertEqualObjects(message.repeatedNestedMessageArray,
+ [message valueForKey:@"repeatedNestedMessageArray"]);
+ XCTAssertEqualObjects(message.repeatedForeignMessageArray,
+ [message valueForKey:@"repeatedForeignMessageArray"]);
+ XCTAssertEqualObjects(message.repeatedImportMessageArray,
+ [message valueForKey:@"repeatedImportMessageArray"]);
- XCTAssertEqualObjects(message.repeatedNestedEnumArray, [message valueForKey:@"repeatedNestedEnumArray"]);
- XCTAssertEqualObjects(message.repeatedForeignEnumArray, [message valueForKey:@"repeatedForeignEnumArray"]);
- XCTAssertEqualObjects(message.repeatedImportEnumArray, [message valueForKey:@"repeatedImportEnumArray"]);
+ XCTAssertEqualObjects(message.repeatedNestedEnumArray,
+ [message valueForKey:@"repeatedNestedEnumArray"]);
+ XCTAssertEqualObjects(message.repeatedForeignEnumArray,
+ [message valueForKey:@"repeatedForeignEnumArray"]);
+ XCTAssertEqualObjects(message.repeatedImportEnumArray,
+ [message valueForKey:@"repeatedImportEnumArray"]);
- XCTAssertEqualObjects(message.repeatedStringPieceArray, [message valueForKey:@"repeatedStringPieceArray"]);
+ XCTAssertEqualObjects(message.repeatedStringPieceArray,
+ [message valueForKey:@"repeatedStringPieceArray"]);
XCTAssertEqualObjects(message.repeatedCordArray, [message valueForKey:@"repeatedCordArray"]);
- XCTAssertEqualObjects(@(message.repeatedInt32Array_Count), [message valueForKey:@"repeatedInt32Array_Count"]);
- XCTAssertEqualObjects(@(message.repeatedInt64Array_Count), [message valueForKey:@"repeatedInt64Array_Count"]);
- XCTAssertEqualObjects(@(message.repeatedUint32Array_Count), [message valueForKey:@"repeatedUint32Array_Count"]);
- XCTAssertEqualObjects(@(message.repeatedUint64Array_Count), [message valueForKey:@"repeatedUint64Array_Count"]);
- XCTAssertEqualObjects(@(message.repeatedSint32Array_Count), [message valueForKey:@"repeatedSint32Array_Count"]);
- XCTAssertEqualObjects(@(message.repeatedSint64Array_Count), [message valueForKey:@"repeatedSint64Array_Count"]);
- XCTAssertEqualObjects(@(message.repeatedFixed32Array_Count), [message valueForKey:@"repeatedFixed32Array_Count"]);
- XCTAssertEqualObjects(@(message.repeatedFixed64Array_Count), [message valueForKey:@"repeatedFixed64Array_Count"]);
- XCTAssertEqualObjects(@(message.repeatedSfixed32Array_Count), [message valueForKey:@"repeatedSfixed32Array_Count"]);
- XCTAssertEqualObjects(@(message.repeatedSfixed64Array_Count), [message valueForKey:@"repeatedSfixed64Array_Count"]);
- XCTAssertEqualObjects(@(message.repeatedFloatArray_Count), [message valueForKey:@"repeatedFloatArray_Count"]);
- XCTAssertEqualObjects(@(message.repeatedDoubleArray_Count), [message valueForKey:@"repeatedDoubleArray_Count"]);
- XCTAssertEqualObjects(@(message.repeatedBoolArray_Count), [message valueForKey:@"repeatedBoolArray_Count"]);
- XCTAssertEqualObjects(@(message.repeatedStringArray_Count), [message valueForKey:@"repeatedStringArray_Count"]);
- XCTAssertEqualObjects(@(message.repeatedBytesArray_Count), [message valueForKey:@"repeatedBytesArray_Count"]);
+ XCTAssertEqualObjects(@(message.repeatedInt32Array_Count),
+ [message valueForKey:@"repeatedInt32Array_Count"]);
+ XCTAssertEqualObjects(@(message.repeatedInt64Array_Count),
+ [message valueForKey:@"repeatedInt64Array_Count"]);
+ XCTAssertEqualObjects(@(message.repeatedUint32Array_Count),
+ [message valueForKey:@"repeatedUint32Array_Count"]);
+ XCTAssertEqualObjects(@(message.repeatedUint64Array_Count),
+ [message valueForKey:@"repeatedUint64Array_Count"]);
+ XCTAssertEqualObjects(@(message.repeatedSint32Array_Count),
+ [message valueForKey:@"repeatedSint32Array_Count"]);
+ XCTAssertEqualObjects(@(message.repeatedSint64Array_Count),
+ [message valueForKey:@"repeatedSint64Array_Count"]);
+ XCTAssertEqualObjects(@(message.repeatedFixed32Array_Count),
+ [message valueForKey:@"repeatedFixed32Array_Count"]);
+ XCTAssertEqualObjects(@(message.repeatedFixed64Array_Count),
+ [message valueForKey:@"repeatedFixed64Array_Count"]);
+ XCTAssertEqualObjects(@(message.repeatedSfixed32Array_Count),
+ [message valueForKey:@"repeatedSfixed32Array_Count"]);
+ XCTAssertEqualObjects(@(message.repeatedSfixed64Array_Count),
+ [message valueForKey:@"repeatedSfixed64Array_Count"]);
+ XCTAssertEqualObjects(@(message.repeatedFloatArray_Count),
+ [message valueForKey:@"repeatedFloatArray_Count"]);
+ XCTAssertEqualObjects(@(message.repeatedDoubleArray_Count),
+ [message valueForKey:@"repeatedDoubleArray_Count"]);
+ XCTAssertEqualObjects(@(message.repeatedBoolArray_Count),
+ [message valueForKey:@"repeatedBoolArray_Count"]);
+ XCTAssertEqualObjects(@(message.repeatedStringArray_Count),
+ [message valueForKey:@"repeatedStringArray_Count"]);
+ XCTAssertEqualObjects(@(message.repeatedBytesArray_Count),
+ [message valueForKey:@"repeatedBytesArray_Count"]);
- XCTAssertEqualObjects(@(message.repeatedGroupArray_Count), [message valueForKey:@"repeatedGroupArray_Count"]);
- XCTAssertEqualObjects(@(message.repeatedNestedMessageArray_Count), [message valueForKey:@"repeatedNestedMessageArray_Count"]);
- XCTAssertEqualObjects(@(message.repeatedForeignMessageArray_Count), [message valueForKey:@"repeatedForeignMessageArray_Count"]);
- XCTAssertEqualObjects(@(message.repeatedImportMessageArray_Count), [message valueForKey:@"repeatedImportMessageArray_Count"]);
+ XCTAssertEqualObjects(@(message.repeatedGroupArray_Count),
+ [message valueForKey:@"repeatedGroupArray_Count"]);
+ XCTAssertEqualObjects(@(message.repeatedNestedMessageArray_Count),
+ [message valueForKey:@"repeatedNestedMessageArray_Count"]);
+ XCTAssertEqualObjects(@(message.repeatedForeignMessageArray_Count),
+ [message valueForKey:@"repeatedForeignMessageArray_Count"]);
+ XCTAssertEqualObjects(@(message.repeatedImportMessageArray_Count),
+ [message valueForKey:@"repeatedImportMessageArray_Count"]);
- XCTAssertEqualObjects(@(message.repeatedNestedEnumArray_Count), [message valueForKey:@"repeatedNestedEnumArray_Count"]);
- XCTAssertEqualObjects(@(message.repeatedForeignEnumArray_Count), [message valueForKey:@"repeatedForeignEnumArray_Count"]);
- XCTAssertEqualObjects(@(message.repeatedImportEnumArray_Count), [message valueForKey:@"repeatedImportEnumArray_Count"]);
+ XCTAssertEqualObjects(@(message.repeatedNestedEnumArray_Count),
+ [message valueForKey:@"repeatedNestedEnumArray_Count"]);
+ XCTAssertEqualObjects(@(message.repeatedForeignEnumArray_Count),
+ [message valueForKey:@"repeatedForeignEnumArray_Count"]);
+ XCTAssertEqualObjects(@(message.repeatedImportEnumArray_Count),
+ [message valueForKey:@"repeatedImportEnumArray_Count"]);
- XCTAssertEqualObjects(@(message.repeatedStringPieceArray_Count), [message valueForKey:@"repeatedStringPieceArray_Count"]);
- XCTAssertEqualObjects(@(message.repeatedCordArray_Count), [message valueForKey:@"repeatedCordArray_Count"]);
+ XCTAssertEqualObjects(@(message.repeatedStringPieceArray_Count),
+ [message valueForKey:@"repeatedStringPieceArray_Count"]);
+ XCTAssertEqualObjects(@(message.repeatedCordArray_Count),
+ [message valueForKey:@"repeatedCordArray_Count"]);
// -----------------------------------------------------------------
@@ -2144,8 +2136,7 @@
XCTAssertEqualObjects(message.defaultCord, [message valueForKey:@"defaultCord"]);
}
-- (void)setAllFieldsViaKVC:(TestAllTypes *)message
- repeatedCount:(uint32_t)count {
+- (void)setAllFieldsViaKVC:(TestAllTypes *)message repeatedCount:(uint32_t)count {
[message setValue:@101 forKey:@"optionalInt32"];
[message setValue:@102 forKey:@"optionalInt64"];
[message setValue:@103 forKey:@"optionalUint32"];
@@ -2160,14 +2151,12 @@
[message setValue:@112 forKey:@"optionalDouble"];
[message setValue:@YES forKey:@"optionalBool"];
[message setValue:@"115" forKey:@"optionalString"];
- [message setValue:[NSData gpbtu_dataWithEmbeddedNulls]
- forKey:@"optionalBytes"];
+ [message setValue:[NSData gpbtu_dataWithEmbeddedNulls] forKey:@"optionalBytes"];
TestAllTypes_OptionalGroup *allTypes = [TestAllTypes_OptionalGroup message];
[allTypes setValue:@117 forKey:@"a"];
[message setValue:allTypes forKey:@"optionalGroup"];
- TestAllTypes_NestedMessage *nestedMessage =
- [TestAllTypes_NestedMessage message];
+ TestAllTypes_NestedMessage *nestedMessage = [TestAllTypes_NestedMessage message];
[nestedMessage setValue:@118 forKey:@"bb"];
[message setValue:nestedMessage forKey:@"optionalNestedMessage"];
ForeignMessage *foreignMessage = [ForeignMessage message];
@@ -2177,8 +2166,7 @@
[importMessage setValue:@120 forKey:@"d"];
[message setValue:importMessage forKey:@"optionalImportMessage"];
- [message setValue:@(TestAllTypes_NestedEnum_Baz)
- forKey:@"optionalNestedEnum"];
+ [message setValue:@(TestAllTypes_NestedEnum_Baz) forKey:@"optionalNestedEnum"];
[message setValue:@(ForeignEnum_ForeignBaz) forKey:@"optionalForeignEnum"];
[message setValue:@(ImportEnum_ImportBaz) forKey:@"optionalImportEnum"];
@@ -2299,8 +2287,7 @@
array = [[NSMutableArray alloc] initWithCapacity:count];
for (uint32_t i = 0; i < count; ++i) {
- TestAllTypes_RepeatedGroup *testAll =
- [[TestAllTypes_RepeatedGroup alloc] init];
+ TestAllTypes_RepeatedGroup *testAll = [[TestAllTypes_RepeatedGroup alloc] init];
[testAll setA:217 + i * 100];
[array addObject:testAll];
[testAll release];
@@ -2339,26 +2326,22 @@
[array release];
{
- GPBEnumArray *scratch = [GPBEnumArray
- arrayWithValidationFunction:TestAllTypes_NestedEnum_IsValidValue];
+ GPBEnumArray *scratch =
+ [GPBEnumArray arrayWithValidationFunction:TestAllTypes_NestedEnum_IsValidValue];
for (uint32_t i = 0; i < count; ++i) {
- [scratch addValue:(i % 2) ? TestAllTypes_NestedEnum_Bar
- : TestAllTypes_NestedEnum_Baz];
+ [scratch addValue:(i % 2) ? TestAllTypes_NestedEnum_Bar : TestAllTypes_NestedEnum_Baz];
}
[message setValue:scratch forKey:@"repeatedNestedEnumArray"];
}
{
- GPBEnumArray *scratch =
- [GPBEnumArray arrayWithValidationFunction:ForeignEnum_IsValidValue];
+ GPBEnumArray *scratch = [GPBEnumArray arrayWithValidationFunction:ForeignEnum_IsValidValue];
for (uint32_t i = 0; i < count; ++i) {
- [scratch
- addValue:(i % 2) ? ForeignEnum_ForeignBar : ForeignEnum_ForeignBaz];
+ [scratch addValue:(i % 2) ? ForeignEnum_ForeignBar : ForeignEnum_ForeignBaz];
}
[message setValue:scratch forKey:@"repeatedForeignEnumArray"];
}
{
- GPBEnumArray *scratch =
- [GPBEnumArray arrayWithValidationFunction:ImportEnum_IsValidValue];
+ GPBEnumArray *scratch = [GPBEnumArray arrayWithValidationFunction:ImportEnum_IsValidValue];
for (uint32_t i = 0; i < count; ++i) {
[scratch addValue:(i % 2) ? ImportEnum_ImportBar : ImportEnum_ImportBaz];
}
@@ -2428,8 +2411,7 @@
XCTAssertEqualObjects([message valueForKey:@"hasOptionalGroup"], @NO);
XCTAssertEqualObjects([message valueForKey:@"hasOptionalNestedMessage"], @NO);
- XCTAssertEqualObjects([message valueForKey:@"hasOptionalForeignMessage"],
- @NO);
+ XCTAssertEqualObjects([message valueForKey:@"hasOptionalForeignMessage"], @NO);
XCTAssertEqualObjects([message valueForKey:@"hasOptionalImportMessage"], @NO);
XCTAssertEqualObjects([message valueForKey:@"hasOptionalNestedEnum"], @NO);
@@ -2454,8 +2436,7 @@
XCTAssertEqualObjects([message valueForKey:@"optionalDouble"], @0);
XCTAssertEqualObjects([message valueForKey:@"optionalBool"], @NO);
XCTAssertEqualObjects([message valueForKey:@"optionalString"], @"");
- XCTAssertEqualObjects([message valueForKey:@"optionalBytes"],
- GPBEmptyNSData());
+ XCTAssertEqualObjects([message valueForKey:@"optionalBytes"], GPBEmptyNSData());
// Embedded messages should also be exist, but be clear.
XCTAssertNotNil([message valueForKeyPath:@"optionalGroup"]);
@@ -2463,28 +2444,20 @@
XCTAssertNotNil([message valueForKeyPath:@"optionalForeignMessage"]);
XCTAssertNotNil([message valueForKeyPath:@"optionalImportMessage"]);
XCTAssertEqualObjects([message valueForKeyPath:@"optionalGroup.hasA"], @NO);
- XCTAssertEqualObjects(
- [message valueForKeyPath:@"optionalNestedMessage.hasBb"], @NO);
- XCTAssertEqualObjects(
- [message valueForKeyPath:@"optionalForeignMessage.hasC"], @NO);
- XCTAssertEqualObjects([message valueForKeyPath:@"optionalImportMessage.hasD"],
- @NO);
+ XCTAssertEqualObjects([message valueForKeyPath:@"optionalNestedMessage.hasBb"], @NO);
+ XCTAssertEqualObjects([message valueForKeyPath:@"optionalForeignMessage.hasC"], @NO);
+ XCTAssertEqualObjects([message valueForKeyPath:@"optionalImportMessage.hasD"], @NO);
XCTAssertEqualObjects([message valueForKeyPath:@"optionalGroup.a"], @0);
- XCTAssertEqualObjects([message valueForKeyPath:@"optionalNestedMessage.bb"],
- @0);
- XCTAssertEqualObjects([message valueForKeyPath:@"optionalForeignMessage.c"],
- @0);
- XCTAssertEqualObjects([message valueForKeyPath:@"optionalImportMessage.d"],
- @0);
+ XCTAssertEqualObjects([message valueForKeyPath:@"optionalNestedMessage.bb"], @0);
+ XCTAssertEqualObjects([message valueForKeyPath:@"optionalForeignMessage.c"], @0);
+ XCTAssertEqualObjects([message valueForKeyPath:@"optionalImportMessage.d"], @0);
// Enums without defaults are set to the first value in the enum.
XCTAssertEqualObjects([message valueForKey:@"optionalNestedEnum"],
@(TestAllTypes_NestedEnum_Foo));
- XCTAssertEqualObjects([message valueForKey:@"optionalForeignEnum"],
- @(ForeignEnum_ForeignFoo));
- XCTAssertEqualObjects([message valueForKey:@"optionalImportEnum"],
- @(ImportEnum_ImportFoo));
+ XCTAssertEqualObjects([message valueForKey:@"optionalForeignEnum"], @(ForeignEnum_ForeignFoo));
+ XCTAssertEqualObjects([message valueForKey:@"optionalImportEnum"], @(ImportEnum_ImportFoo));
XCTAssertEqualObjects([message valueForKey:@"optionalStringPiece"], @"");
XCTAssertEqualObjects([message valueForKey:@"optionalCord"], @"");
@@ -2532,12 +2505,9 @@
XCTAssertEqualObjects([message valueForKey:@"defaultBytes"],
[NSData gpbtu_dataWithCString:"world"]);
- XCTAssertEqualObjects([message valueForKey:@"defaultNestedEnum"],
- @(TestAllTypes_NestedEnum_Bar));
- XCTAssertEqualObjects([message valueForKey:@"defaultForeignEnum"],
- @(ForeignEnum_ForeignBar));
- XCTAssertEqualObjects([message valueForKey:@"defaultImportEnum"],
- @(ImportEnum_ImportBar));
+ XCTAssertEqualObjects([message valueForKey:@"defaultNestedEnum"], @(TestAllTypes_NestedEnum_Bar));
+ XCTAssertEqualObjects([message valueForKey:@"defaultForeignEnum"], @(ForeignEnum_ForeignBar));
+ XCTAssertEqualObjects([message valueForKey:@"defaultImportEnum"], @(ImportEnum_ImportBar));
XCTAssertEqualObjects([message valueForKey:@"defaultStringPiece"], @"abc");
XCTAssertEqualObjects([message valueForKey:@"defaultCord"], @"123");
diff --git a/objectivec/Tests/GPBUnittestProtos.m b/objectivec/Tests/GPBUnittestProtos.m
index 1c6eddf..6208e12 100644
--- a/objectivec/Tests/GPBUnittestProtos.m
+++ b/objectivec/Tests/GPBUnittestProtos.m
@@ -31,43 +31,27 @@
// Collects all the compiled protos into one file and compiles them to make sure
// the compiler is generating valid code.
-// The unittest_custom_options.proto extends the messages in descriptor.proto
-// so we build it in to test extending in general. The library doesn't provide
-// a descriptor as it doesn't use the classes/enums.
-#import "google/protobuf/Descriptor.pbobjc.m"
+#import "objectivec/Tests/AnyTest.pbobjc.m"
+#import "objectivec/Tests/MapProto2Unittest.pbobjc.m"
+#import "objectivec/Tests/MapUnittest.pbobjc.m"
+#import "objectivec/Tests/Unittest.pbobjc.m"
+#import "objectivec/Tests/UnittestCycle.pbobjc.m"
+#import "objectivec/Tests/UnittestDeprecated.pbobjc.m"
+#import "objectivec/Tests/UnittestDeprecatedFile.pbobjc.m"
+#import "objectivec/Tests/UnittestImport.pbobjc.m"
+#import "objectivec/Tests/UnittestImportPublic.pbobjc.m"
+#import "objectivec/Tests/UnittestMset.pbobjc.m"
+#import "objectivec/Tests/UnittestObjc.pbobjc.m"
+#import "objectivec/Tests/UnittestObjcOptions.pbobjc.m"
+#import "objectivec/Tests/UnittestObjcStartup.pbobjc.m"
+#import "objectivec/Tests/UnittestPreserveUnknownEnum.pbobjc.m"
+#import "objectivec/Tests/UnittestRuntimeProto2.pbobjc.m"
+#import "objectivec/Tests/UnittestRuntimeProto3.pbobjc.m"
-#import "google/protobuf/AnyTest.pbobjc.m"
-#import "google/protobuf/MapProto2Unittest.pbobjc.m"
-#import "google/protobuf/MapUnittest.pbobjc.m"
-#import "google/protobuf/Unittest.pbobjc.m"
-#import "google/protobuf/UnittestArena.pbobjc.m"
-#import "google/protobuf/UnittestCustomOptions.pbobjc.m"
-#import "google/protobuf/UnittestCycle.pbobjc.m"
-#import "google/protobuf/UnittestDeprecated.pbobjc.m"
-#import "google/protobuf/UnittestDeprecatedFile.pbobjc.m"
-#import "google/protobuf/UnittestDropUnknownFields.pbobjc.m"
-#import "google/protobuf/UnittestEmbedOptimizeFor.pbobjc.m"
-#import "google/protobuf/UnittestEmpty.pbobjc.m"
-#import "google/protobuf/UnittestEnormousDescriptor.pbobjc.m"
-#import "google/protobuf/UnittestImport.pbobjc.m"
-#import "google/protobuf/UnittestImportLite.pbobjc.m"
-#import "google/protobuf/UnittestImportPublic.pbobjc.m"
-#import "google/protobuf/UnittestImportPublicLite.pbobjc.m"
-#import "google/protobuf/UnittestLite.pbobjc.m"
-#import "google/protobuf/UnittestMset.pbobjc.m"
-#import "google/protobuf/UnittestMsetWireFormat.pbobjc.m"
-#import "google/protobuf/UnittestNoGenericServices.pbobjc.m"
-#import "google/protobuf/UnittestObjc.pbobjc.m"
-#import "google/protobuf/UnittestObjcStartup.pbobjc.m"
-#import "google/protobuf/UnittestOptimizeFor.pbobjc.m"
-#import "google/protobuf/UnittestPreserveUnknownEnum.pbobjc.m"
-#import "google/protobuf/UnittestRuntimeProto2.pbobjc.m"
-#import "google/protobuf/UnittestRuntimeProto3.pbobjc.m"
-
-#import "google/protobuf/UnittestExtensionChainA.pbobjc.m"
-#import "google/protobuf/UnittestExtensionChainB.pbobjc.m"
-#import "google/protobuf/UnittestExtensionChainC.pbobjc.m"
-#import "google/protobuf/UnittestExtensionChainD.pbobjc.m"
-#import "google/protobuf/UnittestExtensionChainE.pbobjc.m"
+#import "objectivec/Tests/UnittestExtensionChainA.pbobjc.m"
+#import "objectivec/Tests/UnittestExtensionChainB.pbobjc.m"
+#import "objectivec/Tests/UnittestExtensionChainC.pbobjc.m"
+#import "objectivec/Tests/UnittestExtensionChainD.pbobjc.m"
+#import "objectivec/Tests/UnittestExtensionChainE.pbobjc.m"
// See GPBUnittestProtos2.m for for "UnittestExtensionChainF.pbobjc.m"
-#import "google/protobuf/UnittestExtensionChainG.pbobjc.m"
+#import "objectivec/Tests/UnittestExtensionChainG.pbobjc.m"
diff --git a/objectivec/Tests/GPBUnittestProtos2.m b/objectivec/Tests/GPBUnittestProtos2.m
index ef9f070..498d85a 100644
--- a/objectivec/Tests/GPBUnittestProtos2.m
+++ b/objectivec/Tests/GPBUnittestProtos2.m
@@ -31,4 +31,4 @@
// This one file in the chain tests is compiled by itself to ensure if was
// generated with the extra #imports needed to pull in the indirect Root class
// used in its Root registry.
-#import "google/protobuf/UnittestExtensionChainF.pbobjc.m"
+#import "objectivec/Tests/UnittestExtensionChainF.pbobjc.m"
diff --git a/objectivec/Tests/GPBUnknownFieldSetTest.m b/objectivec/Tests/GPBUnknownFieldSetTest.m
index 5fa60b2..b98f52e 100644
--- a/objectivec/Tests/GPBUnknownFieldSetTest.m
+++ b/objectivec/Tests/GPBUnknownFieldSetTest.m
@@ -30,9 +30,9 @@
#import "GPBTestUtilities.h"
-#import "GPBUnknownField_PackagePrivate.h"
#import "GPBUnknownFieldSet_PackagePrivate.h"
-#import "google/protobuf/Unittest.pbobjc.h"
+#import "GPBUnknownField_PackagePrivate.h"
+#import "objectivec/Tests/Unittest.pbobjc.h"
@interface GPBUnknownFieldSet (GPBUnknownFieldSetTest)
- (void)getTags:(int32_t*)tags;
@@ -61,7 +61,7 @@
}
- (void)testInvalidFieldNumber {
- GPBUnknownFieldSet *set = [[[GPBUnknownFieldSet alloc] init] autorelease];
+ GPBUnknownFieldSet* set = [[[GPBUnknownFieldSet alloc] init] autorelease];
GPBUnknownField* field = [[[GPBUnknownField alloc] initWithNumber:0] autorelease];
XCTAssertThrowsSpecificNamed([set addField:field], NSException, NSInvalidArgumentException);
}
@@ -69,10 +69,10 @@
- (void)testEqualityAndHash {
// Empty
- GPBUnknownFieldSet *set1 = [[[GPBUnknownFieldSet alloc] init] autorelease];
+ GPBUnknownFieldSet* set1 = [[[GPBUnknownFieldSet alloc] init] autorelease];
XCTAssertTrue([set1 isEqual:set1]);
XCTAssertFalse([set1 isEqual:@"foo"]);
- GPBUnknownFieldSet *set2 = [[[GPBUnknownFieldSet alloc] init] autorelease];
+ GPBUnknownFieldSet* set2 = [[[GPBUnknownFieldSet alloc] init] autorelease];
XCTAssertEqualObjects(set1, set2);
XCTAssertEqual([set1 hash], [set2 hash]);
@@ -126,11 +126,11 @@
// Group
- GPBUnknownFieldSet *group1 = [[[GPBUnknownFieldSet alloc] init] autorelease];
+ GPBUnknownFieldSet* group1 = [[[GPBUnknownFieldSet alloc] init] autorelease];
GPBUnknownField* fieldGroup1 = [[[GPBUnknownField alloc] initWithNumber:10] autorelease];
[fieldGroup1 addVarint:1];
[group1 addField:fieldGroup1];
- GPBUnknownFieldSet *group2 = [[[GPBUnknownFieldSet alloc] init] autorelease];
+ GPBUnknownFieldSet* group2 = [[[GPBUnknownFieldSet alloc] init] autorelease];
GPBUnknownField* fieldGroup2 = [[[GPBUnknownField alloc] initWithNumber:10] autorelease];
[fieldGroup2 addVarint:1];
[group2 addField:fieldGroup2];
@@ -153,10 +153,9 @@
// numbers as allFieldsData except that each field is some other wire
// type.
- (NSData*)getBizarroData {
- GPBUnknownFieldSet* bizarroFields =
- [[[GPBUnknownFieldSet alloc] init] autorelease];
+ GPBUnknownFieldSet* bizarroFields = [[[GPBUnknownFieldSet alloc] init] autorelease];
NSUInteger count = [unknownFields_ countOfFields];
- int32_t *tags = malloc(count * sizeof(int32_t));
+ int32_t* tags = malloc(count * sizeof(int32_t));
if (!tags) {
XCTFail(@"Failed to make scratch buffer for testing");
return [NSData data];
@@ -168,20 +167,17 @@
GPBUnknownField* field = [unknownFields_ getField:tag];
if (field.varintList.count == 0) {
// Original field is not a varint, so use a varint.
- GPBUnknownField* varintField =
- [[[GPBUnknownField alloc] initWithNumber:tag] autorelease];
+ GPBUnknownField* varintField = [[[GPBUnknownField alloc] initWithNumber:tag] autorelease];
[varintField addVarint:1];
[bizarroFields addField:varintField];
} else {
// Original field *is* a varint, so use something else.
- GPBUnknownField* fixed32Field =
- [[[GPBUnknownField alloc] initWithNumber:tag] autorelease];
+ GPBUnknownField* fixed32Field = [[[GPBUnknownField alloc] initWithNumber:tag] autorelease];
[fixed32Field addFixed32:1];
[bizarroFields addField:fixed32Field];
}
}
- }
- @finally {
+ } @finally {
free(tags);
}
@@ -220,7 +216,7 @@
[field addLengthDelimited:DataFromCStr("data1")];
[set1 addField:field];
- GPBUnknownFieldSet *group1 = [[[GPBUnknownFieldSet alloc] init] autorelease];
+ GPBUnknownFieldSet* group1 = [[[GPBUnknownFieldSet alloc] init] autorelease];
GPBUnknownField* fieldGroup1 = [[[GPBUnknownField alloc] initWithNumber:200] autorelease];
[fieldGroup1 addVarint:100];
[group1 addField:fieldGroup1];
@@ -246,7 +242,7 @@
[field addLengthDelimited:DataFromCStr("data2")];
[set2 addField:field];
- GPBUnknownFieldSet *group2 = [[[GPBUnknownFieldSet alloc] init] autorelease];
+ GPBUnknownFieldSet* group2 = [[[GPBUnknownFieldSet alloc] init] autorelease];
GPBUnknownField* fieldGroup2 = [[[GPBUnknownField alloc] initWithNumber:201] autorelease];
[fieldGroup2 addVarint:99];
[group2 addField:fieldGroup2];
@@ -280,11 +276,11 @@
[field addLengthDelimited:DataFromCStr("data2")];
[set3 addField:field];
- GPBUnknownFieldSet *group3a = [[[GPBUnknownFieldSet alloc] init] autorelease];
+ GPBUnknownFieldSet* group3a = [[[GPBUnknownFieldSet alloc] init] autorelease];
GPBUnknownField* fieldGroup3a1 = [[[GPBUnknownField alloc] initWithNumber:200] autorelease];
[fieldGroup3a1 addVarint:100];
[group3a addField:fieldGroup3a1];
- GPBUnknownFieldSet *group3b = [[[GPBUnknownFieldSet alloc] init] autorelease];
+ GPBUnknownFieldSet* group3b = [[[GPBUnknownFieldSet alloc] init] autorelease];
GPBUnknownField* fieldGroup3b2 = [[[GPBUnknownField alloc] initWithNumber:201] autorelease];
[fieldGroup3b2 addVarint:99];
[group3b addField:fieldGroup3b2];
@@ -314,7 +310,7 @@
}
- (void)testClearMessage {
- TestEmptyMessage *message = [TestEmptyMessage message];
+ TestEmptyMessage* message = [TestEmptyMessage message];
[message mergeFrom:emptyMessage_];
[message clear];
XCTAssertEqual(message.serializedSize, (size_t)0);
@@ -322,9 +318,8 @@
- (void)testParseKnownAndUnknown {
// Test mixing known and unknown fields when parsing.
- GPBUnknownFieldSet *fields = [[unknownFields_ copy] autorelease];
- GPBUnknownField *field =
- [[[GPBUnknownField alloc] initWithNumber:123456] autorelease];
+ GPBUnknownFieldSet* fields = [[unknownFields_ copy] autorelease];
+ GPBUnknownField* field = [[[GPBUnknownField alloc] initWithNumber:123456] autorelease];
[field addVarint:654321];
[fields addField:field];
@@ -344,10 +339,8 @@
// when parsing.
NSData* bizarroData = [self getBizarroData];
- TestAllTypes* allTypesMessage =
- [TestAllTypes parseFromData:bizarroData error:NULL];
- TestEmptyMessage* emptyMessage =
- [TestEmptyMessage parseFromData:bizarroData error:NULL];
+ TestAllTypes* allTypesMessage = [TestAllTypes parseFromData:bizarroData error:NULL];
+ TestEmptyMessage* emptyMessage = [TestEmptyMessage parseFromData:bizarroData error:NULL];
// All fields should have been interpreted as unknown, so the debug strings
// should be the same.
@@ -361,8 +354,7 @@
TestEmptyMessageWithExtensions* message =
[TestEmptyMessageWithExtensions parseFromData:allFieldsData_ error:NULL];
- XCTAssertEqual(unknownFields_.countOfFields,
- message.unknownFields.countOfFields);
+ XCTAssertEqual(unknownFields_.countOfFields, message.unknownFields.countOfFields);
XCTAssertEqualObjects(allFieldsData_, message.data);
}
@@ -371,10 +363,9 @@
// when parsing extensions.
NSData* bizarroData = [self getBizarroData];
- TestAllExtensions* allExtensionsMessage =
- [TestAllExtensions parseFromData:bizarroData error:NULL];
- TestEmptyMessage* emptyMessage =
- [TestEmptyMessage parseFromData:bizarroData error:NULL];
+ TestAllExtensions* allExtensionsMessage = [TestAllExtensions parseFromData:bizarroData
+ error:NULL];
+ TestEmptyMessage* emptyMessage = [TestEmptyMessage parseFromData:bizarroData error:NULL];
// All fields should have been interpreted as unknown, so the debug strings
// should be the same.
@@ -465,7 +456,7 @@
// Group
- GPBUnknownFieldSet *group = [[[GPBUnknownFieldSet alloc] init] autorelease];
+ GPBUnknownFieldSet* group = [[[GPBUnknownFieldSet alloc] init] autorelease];
GPBUnknownField* fieldGroup = [[[GPBUnknownField alloc] initWithNumber:100] autorelease];
[fieldGroup addVarint:100];
[group addField:fieldGroup];
diff --git a/objectivec/Tests/GPBUtilitiesTests.m b/objectivec/Tests/GPBUtilitiesTests.m
index f4a09de..b4d52ad 100644
--- a/objectivec/Tests/GPBUtilitiesTests.m
+++ b/objectivec/Tests/GPBUtilitiesTests.m
@@ -41,9 +41,9 @@
#import "GPBMessage.h"
#import "GPBUnknownField_PackagePrivate.h"
-#import "google/protobuf/MapUnittest.pbobjc.h"
-#import "google/protobuf/Unittest.pbobjc.h"
-#import "google/protobuf/UnittestObjc.pbobjc.h"
+#import "objectivec/Tests/MapUnittest.pbobjc.h"
+#import "objectivec/Tests/Unittest.pbobjc.h"
+#import "objectivec/Tests/UnittestObjc.pbobjc.h"
@interface UtilitiesTests : GPBTestCase
@end
@@ -62,6 +62,7 @@
- (void)testGPBDecodeTextFormatName {
uint8_t decodeData[] = {
+ // clang-format off
0x6,
// An inlined string (first to make sure the leading null is handled
// correctly, and with a key of zero to check that).
@@ -80,6 +81,7 @@
// underscore, lower + 30 (01 op), as is + 30 (00 op), as is + 13 (00 op),
// underscore, as is + 3 (00 op)
0xE8, 0x07, 0x04, 0xA5, 0xA4, 0xA2, 0xBF, 0x1F, 0x0E, 0x84, 0x0,
+ // clang-format on
};
NSString *inputStr = @"abcdefghIJ";
@@ -104,10 +106,12 @@
// An inlined string (and key of zero).
XCTAssertEqualObjects(GPBDecodeTextFormatName(decodeData, 0, inputStr), @"zbcdefghIJ");
+ // clang-format off
// Long name so multiple decode ops are needed.
inputStr = @"longFieldNameIsLooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong1000";
XCTAssertEqualObjects(GPBDecodeTextFormatName(decodeData, 1000, inputStr),
@"long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_1000");
+ // clang-format on
}
- (void)testTextFormat {
@@ -121,10 +125,8 @@
NSString *fileName = @"text_format_unittest_data.txt";
NSData *resultData = [result dataUsingEncoding:NSUTF8StringEncoding];
- NSData *expectedData =
- [self getDataFileNamed:fileName dataToWrite:resultData];
- NSString *expected = [[NSString alloc] initWithData:expectedData
- encoding:NSUTF8StringEncoding];
+ NSData *expectedData = [self getDataFileNamed:fileName dataToWrite:resultData];
+ NSString *expected = [[NSString alloc] initWithData:expectedData encoding:NSUTF8StringEncoding];
XCTAssertEqualObjects(expected, result);
[expected release];
}
@@ -141,12 +143,14 @@
message.subEnum = self_autorelease_RetainCount;
message.new_p.copy_p = @"foo";
+ // clang-format off
NSString *expected = @"_cmd: true\n"
@"isProxy: true\n"
@"SubEnum: retainCount\n"
@"New {\n"
@" copy: \"foo\"\n"
@"}\n";
+ // clang-format on
NSString *result = GPBTextFormatForMessage(message, nil);
XCTAssertEqualObjects(expected, result);
}
@@ -161,10 +165,8 @@
NSString *fileName = @"text_format_map_unittest_data.txt";
NSData *resultData = [result dataUsingEncoding:NSUTF8StringEncoding];
- NSData *expectedData =
- [self getDataFileNamed:fileName dataToWrite:resultData];
- NSString *expected = [[NSString alloc] initWithData:expectedData
- encoding:NSUTF8StringEncoding];
+ NSData *expectedData = [self getDataFileNamed:fileName dataToWrite:resultData];
+ NSString *expected = [[NSString alloc] initWithData:expectedData encoding:NSUTF8StringEncoding];
XCTAssertEqualObjects(expected, result);
[expected release];
}
@@ -183,10 +185,8 @@
// of the bracketed extension name.
NSString *fileName = @"text_format_extensions_unittest_data.txt";
NSData *resultData = [result dataUsingEncoding:NSUTF8StringEncoding];
- NSData *expectedData =
- [self getDataFileNamed:fileName dataToWrite:resultData];
- NSString *expected = [[NSString alloc] initWithData:expectedData
- encoding:NSUTF8StringEncoding];
+ NSData *expectedData = [self getDataFileNamed:fileName dataToWrite:resultData];
+ NSString *expected = [[NSString alloc] initWithData:expectedData encoding:NSUTF8StringEncoding];
XCTAssertEqualObjects(expected, result);
[expected release];
}
@@ -195,7 +195,7 @@
TestAllTypes *message = [TestAllTypes message];
NSDictionary *repeatedFieldValues = @{
- @"repeatedStringArray" : [@[@"foo", @"bar"] mutableCopy],
+ @"repeatedStringArray" : [@[ @"foo", @"bar" ] mutableCopy],
@"repeatedBoolArray" : [GPBBoolArray arrayWithValue:YES],
@"repeatedInt32Array" : [GPBInt32Array arrayWithValue:14],
@"repeatedInt64Array" : [GPBInt64Array arrayWithValue:15],
@@ -208,23 +208,19 @@
rawValue:TestAllTypes_NestedEnum_Foo],
};
for (NSString *fieldName in repeatedFieldValues) {
- GPBFieldDescriptor *field =
- [message.descriptor fieldWithName:fieldName];
+ GPBFieldDescriptor *field = [message.descriptor fieldWithName:fieldName];
XCTAssertNotNil(field, @"No field with name: %@", fieldName);
id expectedValues = repeatedFieldValues[fieldName];
GPBSetMessageRepeatedField(message, field, expectedValues);
- XCTAssertEqualObjects(expectedValues,
- [message valueForKeyPath:fieldName]);
+ XCTAssertEqualObjects(expectedValues, [message valueForKeyPath:fieldName]);
}
}
// Helper to make an unknown field set with something in it.
static GPBUnknownFieldSet *UnknownFieldsSetHelper(int num) {
- GPBUnknownFieldSet *result =
- [[[GPBUnknownFieldSet alloc] init] autorelease];
+ GPBUnknownFieldSet *result = [[[GPBUnknownFieldSet alloc] init] autorelease];
- GPBUnknownField *field =
- [[[GPBUnknownField alloc] initWithNumber:num] autorelease];
+ GPBUnknownField *field = [[[GPBUnknownField alloc] initWithNumber:num] autorelease];
[field addVarint:num];
[result addField:field];
@@ -246,32 +242,26 @@
OptionalGroup_extension *optionalGroup = [OptionalGroup_extension message];
optionalGroup.a = 123;
optionalGroup.unknownFields = UnknownFieldsSetHelper(779);
- [message setExtension:[UnittestRoot optionalGroupExtension]
- value:optionalGroup];
+ [message setExtension:[UnittestRoot optionalGroupExtension] value:optionalGroup];
// Message
- TestAllTypes_NestedMessage *nestedMessage =
- [TestAllTypes_NestedMessage message];
+ TestAllTypes_NestedMessage *nestedMessage = [TestAllTypes_NestedMessage message];
nestedMessage.bb = 456;
nestedMessage.unknownFields = UnknownFieldsSetHelper(778);
- [message setExtension:[UnittestRoot optionalNestedMessageExtension]
- value:nestedMessage];
+ [message setExtension:[UnittestRoot optionalNestedMessageExtension] value:nestedMessage];
// Repeated Group
- RepeatedGroup_extension *repeatedGroup =
- [[RepeatedGroup_extension alloc] init];
+ RepeatedGroup_extension *repeatedGroup = [[RepeatedGroup_extension alloc] init];
repeatedGroup.a = 567;
repeatedGroup.unknownFields = UnknownFieldsSetHelper(780);
- [message addExtension:[UnittestRoot repeatedGroupExtension]
- value:repeatedGroup];
+ [message addExtension:[UnittestRoot repeatedGroupExtension] value:repeatedGroup];
[repeatedGroup release];
// Repeated Message
nestedMessage = [[TestAllTypes_NestedMessage alloc] init];
nestedMessage.bb = 678;
nestedMessage.unknownFields = UnknownFieldsSetHelper(781);
- [message addExtension:[UnittestRoot repeatedNestedMessageExtension]
- value:nestedMessage];
+ [message addExtension:[UnittestRoot repeatedNestedMessageExtension] value:nestedMessage];
[nestedMessage release];
}
@@ -311,7 +301,8 @@
{
XCTAssertTrue([message hasExtension:[UnittestRoot repeatedNestedMessageExtension]]);
- NSArray *repeatedNestedMessages = [message getExtension:[UnittestRoot repeatedNestedMessageExtension]];
+ NSArray *repeatedNestedMessages =
+ [message getExtension:[UnittestRoot repeatedNestedMessageExtension]];
XCTAssertEqual(repeatedNestedMessages.count, (NSUInteger)1);
TestAllTypes_NestedMessage *repeatedNestedMessage = repeatedNestedMessages.firstObject;
XCTAssertNotNil(repeatedNestedMessage);
@@ -358,14 +349,14 @@
{
XCTAssertTrue([message hasExtension:[UnittestRoot repeatedNestedMessageExtension]]);
- NSArray *repeatedNestedMessages = [message getExtension:[UnittestRoot repeatedNestedMessageExtension]];
+ NSArray *repeatedNestedMessages =
+ [message getExtension:[UnittestRoot repeatedNestedMessageExtension]];
XCTAssertEqual(repeatedNestedMessages.count, (NSUInteger)1);
TestAllTypes_NestedMessage *repeatedNestedMessage = repeatedNestedMessages.firstObject;
XCTAssertNotNil(repeatedNestedMessage);
XCTAssertEqual(repeatedNestedMessage.bb, 678);
XCTAssertNil(repeatedNestedMessage.unknownFields);
}
-
}
- (void)testDropMessageUnknownFieldsRecursively_Maps {
@@ -414,7 +405,6 @@
XCTAssertNotNil(foreignMessage);
XCTAssertNil(foreignMessage.unknownFields);
}
-
}
@end
diff --git a/objectivec/Tests/GPBWellKnownTypesTest.m b/objectivec/Tests/GPBWellKnownTypesTest.m
index 592d5af..e6ee20a 100644
--- a/objectivec/Tests/GPBWellKnownTypesTest.m
+++ b/objectivec/Tests/GPBWellKnownTypesTest.m
@@ -33,7 +33,7 @@
#import <XCTest/XCTest.h>
#import "GPBTestUtilities.h"
-#import "google/protobuf/AnyTest.pbobjc.h"
+#import "objectivec/Tests/AnyTest.pbobjc.h"
// Nanosecond time accuracy
static const NSTimeInterval kTimeAccuracy = 1e-9;
@@ -46,8 +46,7 @@
- (void)testTimeStamp {
// Test negative and positive values.
NSTimeInterval values[] = {
- -428027599.483999967, -1234567.0, -0.5, 0, 0.75, 54321.0, 2468086,483999967
- };
+ -428027599.483999967, -1234567.0, -0.5, 0, 0.75, 54321.0, 2468086, 483999967};
for (size_t i = 0; i < GPBARRAYSIZE(values); ++i) {
NSTimeInterval value = values[i];
@@ -55,30 +54,24 @@
NSDate *date = [NSDate dateWithTimeIntervalSince1970:value];
GPBTimestamp *timeStamp = [[GPBTimestamp alloc] initWithDate:date];
- XCTAssertGreaterThanOrEqual(timeStamp.nanos, 0,
- @"Offset %f - Date: %@", (double)value, date);
- XCTAssertLessThan(timeStamp.nanos, 1e9,
- @"Offset %f - Date: %@", (double)value, date);
+ XCTAssertGreaterThanOrEqual(timeStamp.nanos, 0, @"Offset %f - Date: %@", (double)value, date);
+ XCTAssertLessThan(timeStamp.nanos, 1e9, @"Offset %f - Date: %@", (double)value, date);
// Comparing timeIntervals instead of directly comparing dates because date
// equality requires the time intervals to be exactly the same, and the
// timeintervals go through a bit of floating point error as they are
// converted back and forth from the internal representation.
- XCTAssertEqualWithAccuracy(value, timeStamp.date.timeIntervalSince1970,
- kTimeAccuracy,
+ XCTAssertEqualWithAccuracy(value, timeStamp.date.timeIntervalSince1970, kTimeAccuracy,
@"Offset %f - Date: %@", (double)value, date);
[timeStamp release];
// Test Creation - timeIntervalSince1970.
timeStamp = [[GPBTimestamp alloc] initWithTimeIntervalSince1970:value];
- XCTAssertGreaterThanOrEqual(timeStamp.nanos, 0,
- @"Offset %f - Date: %@", (double)value, date);
- XCTAssertLessThan(timeStamp.nanos, 1e9,
- @"Offset %f - Date: %@", (double)value, date);
+ XCTAssertGreaterThanOrEqual(timeStamp.nanos, 0, @"Offset %f - Date: %@", (double)value, date);
+ XCTAssertLessThan(timeStamp.nanos, 1e9, @"Offset %f - Date: %@", (double)value, date);
- XCTAssertEqualWithAccuracy(value, timeStamp.timeIntervalSince1970,
- kTimeAccuracy,
+ XCTAssertEqualWithAccuracy(value, timeStamp.timeIntervalSince1970, kTimeAccuracy,
@"Offset %f - Date: %@", (double)value, date);
[timeStamp release];
@@ -86,13 +79,10 @@
timeStamp = [[GPBTimestamp alloc] init];
timeStamp.date = date;
- XCTAssertGreaterThanOrEqual(timeStamp.nanos, 0,
- @"Offset %f - Date: %@", (double)value, date);
- XCTAssertLessThan(timeStamp.nanos, 1e9,
- @"Offset %f - Date: %@", (double)value, date);
+ XCTAssertGreaterThanOrEqual(timeStamp.nanos, 0, @"Offset %f - Date: %@", (double)value, date);
+ XCTAssertLessThan(timeStamp.nanos, 1e9, @"Offset %f - Date: %@", (double)value, date);
- XCTAssertEqualWithAccuracy(value, timeStamp.date.timeIntervalSince1970,
- kTimeAccuracy,
+ XCTAssertEqualWithAccuracy(value, timeStamp.date.timeIntervalSince1970, kTimeAccuracy,
@"Offset %f - Date: %@", (double)value, date);
[timeStamp release];
@@ -100,13 +90,10 @@
timeStamp = [[GPBTimestamp alloc] init];
timeStamp.timeIntervalSince1970 = value;
- XCTAssertGreaterThanOrEqual(timeStamp.nanos, 0,
- @"Offset %f - Date: %@", (double)value, date);
- XCTAssertLessThan(timeStamp.nanos, 1e9,
- @"Offset %f - Date: %@", (double)value, date);
+ XCTAssertGreaterThanOrEqual(timeStamp.nanos, 0, @"Offset %f - Date: %@", (double)value, date);
+ XCTAssertLessThan(timeStamp.nanos, 1e9, @"Offset %f - Date: %@", (double)value, date);
- XCTAssertEqualWithAccuracy(value, timeStamp.date.timeIntervalSince1970,
- kTimeAccuracy,
+ XCTAssertEqualWithAccuracy(value, timeStamp.date.timeIntervalSince1970, kTimeAccuracy,
@"Offset %f - Date: %@", (double)value, date);
[timeStamp release];
@@ -115,55 +102,45 @@
- (void)testDuration {
// Test negative and positive values.
- NSTimeInterval values[] = { -1000.0001, -500.0, -0.5, 0, 0.75, 1000.0, 2000.0002 };
+ NSTimeInterval values[] = {-1000.0001, -500.0, -0.5, 0, 0.75, 1000.0, 2000.0002};
for (size_t i = 0; i < GPBARRAYSIZE(values); ++i) {
NSTimeInterval value = values[i];
// Test Creation.
- GPBDuration *duration =
- [[GPBDuration alloc] initWithTimeInterval:value];
- XCTAssertEqualWithAccuracy(value, duration.timeInterval, kTimeAccuracy,
- @"For interval %f", (double)value);
+ GPBDuration *duration = [[GPBDuration alloc] initWithTimeInterval:value];
+ XCTAssertEqualWithAccuracy(value, duration.timeInterval, kTimeAccuracy, @"For interval %f",
+ (double)value);
if (value > 0) {
- XCTAssertGreaterThanOrEqual(duration.seconds, 0,
- @"For interval %f", (double)value);
- XCTAssertGreaterThanOrEqual(duration.nanos, 0,
- @"For interval %f", (double)value);
+ XCTAssertGreaterThanOrEqual(duration.seconds, 0, @"For interval %f", (double)value);
+ XCTAssertGreaterThanOrEqual(duration.nanos, 0, @"For interval %f", (double)value);
} else {
- XCTAssertLessThanOrEqual(duration.seconds, 0,
- @"For interval %f", (double)value);
- XCTAssertLessThanOrEqual(duration.nanos, 0,
- @"For interval %f", (double)value);
+ XCTAssertLessThanOrEqual(duration.seconds, 0, @"For interval %f", (double)value);
+ XCTAssertLessThanOrEqual(duration.nanos, 0, @"For interval %f", (double)value);
}
[duration release];
// Test Mutation.
duration = [[GPBDuration alloc] init];
duration.timeInterval = value;
- XCTAssertEqualWithAccuracy(value, duration.timeInterval, kTimeAccuracy,
- @"For interval %f", (double)value);
+ XCTAssertEqualWithAccuracy(value, duration.timeInterval, kTimeAccuracy, @"For interval %f",
+ (double)value);
if (value > 0) {
- XCTAssertGreaterThanOrEqual(duration.seconds, 0,
- @"For interval %f", (double)value);
- XCTAssertGreaterThanOrEqual(duration.nanos, 0,
- @"For interval %f", (double)value);
+ XCTAssertGreaterThanOrEqual(duration.seconds, 0, @"For interval %f", (double)value);
+ XCTAssertGreaterThanOrEqual(duration.nanos, 0, @"For interval %f", (double)value);
} else {
- XCTAssertLessThanOrEqual(duration.seconds, 0,
- @"For interval %f", (double)value);
- XCTAssertLessThanOrEqual(duration.nanos, 0,
- @"For interval %f", (double)value);
+ XCTAssertLessThanOrEqual(duration.seconds, 0, @"For interval %f", (double)value);
+ XCTAssertLessThanOrEqual(duration.nanos, 0, @"For interval %f", (double)value);
}
[duration release];
}
}
- (void)testAnyHelpers {
-
// Set and extract covers most of the code.
- TestAny *subMessage = [TestAny message];
+ AnyTestMessage *subMessage = [AnyTestMessage message];
subMessage.int32Value = 12345;
- TestAny *message = [TestAny message];
+ AnyTestMessage *message = [AnyTestMessage message];
NSError *err = nil;
message.anyValue = [GPBAny anyWithMessage:subMessage error:&err];
XCTAssertNil(err);
@@ -171,14 +148,13 @@
NSData *data = message.data;
XCTAssertNotNil(data);
- TestAny *message2 = [TestAny parseFromData:data error:&err];
+ AnyTestMessage *message2 = [AnyTestMessage parseFromData:data error:&err];
XCTAssertNil(err);
XCTAssertNotNil(message2);
XCTAssertTrue(message2.hasAnyValue);
- TestAny *subMessage2 =
- (TestAny *)[message.anyValue unpackMessageClass:[TestAny class]
- error:&err];
+ AnyTestMessage *subMessage2 =
+ (AnyTestMessage *)[message.anyValue unpackMessageClass:[AnyTestMessage class] error:&err];
XCTAssertNil(err);
XCTAssertNotNil(subMessage2);
XCTAssertEqual(subMessage2.int32Value, 12345);
@@ -189,25 +165,22 @@
NSData *data2 = message.data;
XCTAssertEqualObjects(data2, data);
- TestAny *subMessage3 =
- (TestAny *)[message.anyValue unpackMessageClass:[TestAny class]
- error:NULL];
+ AnyTestMessage *subMessage3 =
+ (AnyTestMessage *)[message.anyValue unpackMessageClass:[AnyTestMessage class] error:NULL];
XCTAssertNotNil(subMessage3);
XCTAssertEqualObjects(subMessage2, subMessage3);
// Try to extract wrong type.
GPBTimestamp *wrongMessage =
- (GPBTimestamp *)[message.anyValue unpackMessageClass:[GPBTimestamp class]
- error:&err];
+ (GPBTimestamp *)[message.anyValue unpackMessageClass:[GPBTimestamp class] error:&err];
XCTAssertNotNil(err);
XCTAssertNil(wrongMessage);
XCTAssertEqualObjects(err.domain, GPBWellKnownTypesErrorDomain);
XCTAssertEqual(err.code, GPBWellKnownTypesErrorCodeTypeURLMismatch);
- wrongMessage =
- (GPBTimestamp *)[message.anyValue unpackMessageClass:[GPBTimestamp class]
- error:NULL];
+ wrongMessage = (GPBTimestamp *)[message.anyValue unpackMessageClass:[GPBTimestamp class]
+ error:NULL];
XCTAssertNil(wrongMessage);
}
diff --git a/objectivec/Tests/GPBWireFormatTests.m b/objectivec/Tests/GPBWireFormatTests.m
index dbeab21..64456bc 100644
--- a/objectivec/Tests/GPBWireFormatTests.m
+++ b/objectivec/Tests/GPBWireFormatTests.m
@@ -33,9 +33,8 @@
#import "GPBCodedInputStream.h"
#import "GPBMessage_PackagePrivate.h"
#import "GPBUnknownField_PackagePrivate.h"
-#import "google/protobuf/Unittest.pbobjc.h"
-#import "google/protobuf/UnittestMset.pbobjc.h"
-#import "google/protobuf/UnittestMsetWireFormat.pbobjc.h"
+#import "objectivec/Tests/Unittest.pbobjc.h"
+#import "objectivec/Tests/UnittestMset.pbobjc.h"
@interface WireFormatTests : GPBTestCase
@end
@@ -55,15 +54,13 @@
}
- (void)testSerializationPacked {
- TestPackedTypes* message =
- [self packedSetRepeatedCount:kGPBDefaultRepeatCount];
+ TestPackedTypes* message = [self packedSetRepeatedCount:kGPBDefaultRepeatCount];
NSData* rawBytes = message.data;
[self assertFieldsInOrder:rawBytes];
XCTAssertEqual(message.serializedSize, (size_t)rawBytes.length);
- TestPackedTypes* message2 =
- [TestPackedTypes parseFromData:rawBytes error:NULL];
+ TestPackedTypes* message2 = [TestPackedTypes parseFromData:rawBytes error:NULL];
[self assertPackedFieldsSet:message2 repeatedCount:kGPBDefaultRepeatCount];
}
@@ -73,8 +70,7 @@
// so if we serealize a TestAllExtensions then parse it as TestAllTypes
// it should work.
- TestAllExtensions* message =
- [self allExtensionsSetRepeatedCount:kGPBDefaultRepeatCount];
+ TestAllExtensions* message = [self allExtensionsSetRepeatedCount:kGPBDefaultRepeatCount];
NSData* rawBytes = message.data;
[self assertFieldsInOrder:rawBytes];
XCTAssertEqual(message.serializedSize, (size_t)rawBytes.length);
@@ -87,13 +83,11 @@
- (void)testSerializePackedExtensions {
// TestPackedTypes and TestPackedExtensions should have compatible wire
// formats; check that they serialize to the same string.
- TestPackedExtensions* message =
- [self packedExtensionsSetRepeatedCount:kGPBDefaultRepeatCount];
+ TestPackedExtensions* message = [self packedExtensionsSetRepeatedCount:kGPBDefaultRepeatCount];
NSData* rawBytes = message.data;
[self assertFieldsInOrder:rawBytes];
- TestPackedTypes* message2 =
- [self packedSetRepeatedCount:kGPBDefaultRepeatCount];
+ TestPackedTypes* message2 = [self packedSetRepeatedCount:kGPBDefaultRepeatCount];
NSData* rawBytes2 = message2.data;
XCTAssertEqualObjects(rawBytes, rawBytes2);
@@ -117,7 +111,6 @@
[self assertAllExtensionsSet:message2 repeatedCount:kGPBDefaultRepeatCount];
}
-
- (void)testExtensionsSerializedSize {
size_t allSet = [self allSetRepeatedCount:kGPBDefaultRepeatCount].serializedSize;
size_t extensionSet = [self allExtensionsSetRepeatedCount:kGPBDefaultRepeatCount].serializedSize;
@@ -126,8 +119,7 @@
- (void)testParsePackedExtensions {
// Ensure that packed extensions can be properly parsed.
- TestPackedExtensions* message =
- [self packedExtensionsSetRepeatedCount:kGPBDefaultRepeatCount];
+ TestPackedExtensions* message = [self packedExtensionsSetRepeatedCount:kGPBDefaultRepeatCount];
NSData* rawBytes = message.data;
[self assertFieldsInOrder:rawBytes];
@@ -137,79 +129,74 @@
extensionRegistry:registry
error:NULL];
- [self assertPackedExtensionsSet:message2
- repeatedCount:kGPBDefaultRepeatCount];
+ [self assertPackedExtensionsSet:message2 repeatedCount:kGPBDefaultRepeatCount];
}
const int kUnknownTypeId = 1550055;
- (void)testSerializeMessageSet {
- // Set up a TestMessageSet with two known messages and an unknown one.
- TestMessageSet* message_set = [TestMessageSet message];
- [[message_set getExtension:[TestMessageSetExtension1 messageSetExtension]]
- setI:123];
- [[message_set getExtension:[TestMessageSetExtension2 messageSetExtension]]
- setStr:@"foo"];
+ // Set up a MSetMessage with two known messages and an unknown one.
+ MSetMessage* message_set = [MSetMessage message];
+ [[message_set getExtension:[MSetMessageExtension1 messageSetExtension]] setI:123];
+ [[message_set getExtension:[MSetMessageExtension2 messageSetExtension]] setStr:@"foo"];
GPBUnknownField* unknownField =
[[[GPBUnknownField alloc] initWithNumber:kUnknownTypeId] autorelease];
[unknownField addLengthDelimited:[NSData dataWithBytes:"bar" length:3]];
- GPBUnknownFieldSet* unknownFieldSet =
- [[[GPBUnknownFieldSet alloc] init] autorelease];
+ GPBUnknownFieldSet* unknownFieldSet = [[[GPBUnknownFieldSet alloc] init] autorelease];
[unknownFieldSet addField:unknownField];
[message_set setUnknownFields:unknownFieldSet];
NSData* data = [message_set data];
- // Parse back using RawMessageSet and check the contents.
- RawMessageSet* raw = [RawMessageSet parseFromData:data error:NULL];
+ // Parse back using MSetRawMessageSet and check the contents.
+ MSetRawMessageSet* raw = [MSetRawMessageSet parseFromData:data error:NULL];
XCTAssertEqual([raw.unknownFields countOfFields], (NSUInteger)0);
XCTAssertEqual(raw.itemArray.count, (NSUInteger)3);
XCTAssertEqual((uint32_t)[raw.itemArray[0] typeId],
- [TestMessageSetExtension1 messageSetExtension].fieldNumber);
+ [MSetMessageExtension1 messageSetExtension].fieldNumber);
XCTAssertEqual((uint32_t)[raw.itemArray[1] typeId],
- [TestMessageSetExtension2 messageSetExtension].fieldNumber);
+ [MSetMessageExtension2 messageSetExtension].fieldNumber);
XCTAssertEqual([raw.itemArray[2] typeId], kUnknownTypeId);
- TestMessageSetExtension1* message1 =
- [TestMessageSetExtension1 parseFromData:[((RawMessageSet_Item*)raw.itemArray[0]) message]
- error:NULL];
+ MSetMessageExtension1* message1 =
+ [MSetMessageExtension1 parseFromData:[((MSetRawMessageSet_Item*)raw.itemArray[0]) message]
+ error:NULL];
XCTAssertEqual(message1.i, 123);
- TestMessageSetExtension2* message2 =
- [TestMessageSetExtension2 parseFromData:[((RawMessageSet_Item*)raw.itemArray[1]) message]
- error:NULL];
+ MSetMessageExtension2* message2 =
+ [MSetMessageExtension2 parseFromData:[((MSetRawMessageSet_Item*)raw.itemArray[1]) message]
+ error:NULL];
XCTAssertEqualObjects(message2.str, @"foo");
- XCTAssertEqualObjects([raw.itemArray[2] message],
- [NSData dataWithBytes:"bar" length:3]);
+ XCTAssertEqualObjects([raw.itemArray[2] message], [NSData dataWithBytes:"bar" length:3]);
}
- (void)testParseMessageSet {
- // Set up a RawMessageSet with two known messages and an unknown one.
- RawMessageSet* raw = [RawMessageSet message];
+ // Set up a MSetRawMessageSet with two known messages and an unknown one.
+ MSetRawMessageSet* raw = [MSetRawMessageSet message];
{
- RawMessageSet_Item* item = [RawMessageSet_Item message];
- item.typeId = [TestMessageSetExtension1 messageSetExtension].fieldNumber;
- TestMessageSetExtension1* message = [TestMessageSetExtension1 message];
+ MSetRawMessageSet_Item* item = [MSetRawMessageSet_Item message];
+ item.typeId = [MSetMessageExtension1 messageSetExtension].fieldNumber;
+ MSetMessageExtension1* message = [MSetMessageExtension1 message];
message.i = 123;
item.message = [message data];
[raw.itemArray addObject:item];
}
{
- RawMessageSet_Item* item = [RawMessageSet_Item message];
- item.typeId = [TestMessageSetExtension2 messageSetExtension].fieldNumber;
- TestMessageSetExtension2* message = [TestMessageSetExtension2 message];
+ MSetRawMessageSet_Item* item = [MSetRawMessageSet_Item message];
+ item.typeId = [MSetMessageExtension2 messageSetExtension].fieldNumber;
+ MSetMessageExtension2* message = [MSetMessageExtension2 message];
message.str = @"foo";
item.message = [message data];
[raw.itemArray addObject:item];
}
{
- RawMessageSet_Item* item = [RawMessageSet_Item message];
+ MSetRawMessageSet_Item* item = [MSetRawMessageSet_Item message];
item.typeId = kUnknownTypeId;
item.message = [NSData dataWithBytes:"bar" length:3];
[raw.itemArray addObject:item];
@@ -217,27 +204,20 @@
NSData* data = [raw data];
- // Parse as a TestMessageSet and check the contents.
- TestMessageSet* messageSet =
- [TestMessageSet parseFromData:data
- extensionRegistry:[UnittestMsetRoot extensionRegistry]
- error:NULL];
+ // Parse as a MSetMessage and check the contents.
+ MSetMessage* messageSet = [MSetMessage parseFromData:data
+ extensionRegistry:[MSetUnittestMsetRoot extensionRegistry]
+ error:NULL];
- XCTAssertEqual(
- [[messageSet
- getExtension:[TestMessageSetExtension1 messageSetExtension]] i],
- 123);
- XCTAssertEqualObjects(
- [[messageSet
- getExtension:[TestMessageSetExtension2 messageSetExtension]] str],
- @"foo");
+ XCTAssertEqual([[messageSet getExtension:[MSetMessageExtension1 messageSetExtension]] i], 123);
+ XCTAssertEqualObjects([[messageSet getExtension:[MSetMessageExtension2 messageSetExtension]] str],
+ @"foo");
XCTAssertEqual([messageSet.unknownFields countOfFields], (NSUInteger)1);
GPBUnknownField* unknownField = [messageSet.unknownFields getField:kUnknownTypeId];
XCTAssertNotNil(unknownField);
XCTAssertEqual(unknownField.lengthDelimitedList.count, (NSUInteger)1);
- XCTAssertEqualObjects(unknownField.lengthDelimitedList[0],
- [NSData dataWithBytes:"bar" length:3]);
+ XCTAssertEqualObjects(unknownField.lengthDelimitedList[0], [NSData dataWithBytes:"bar" length:3]);
}
- (void)assertFieldsInOrder:(NSData*)data {
diff --git a/objectivec/Tests/UnitTests-Bridging-Header.h b/objectivec/Tests/UnitTests-Bridging-Header.h
index 46292fc..6d3d9ec 100644
--- a/objectivec/Tests/UnitTests-Bridging-Header.h
+++ b/objectivec/Tests/UnitTests-Bridging-Header.h
@@ -1,6 +1,7 @@
//
-// Use this file to import your target's public headers that you would like to expose to Swift.
+// Use this file to import your target's public headers that you would like to
+// expose to Swift.
//
-#import "google/protobuf/UnittestRuntimeProto2.pbobjc.h"
-#import "google/protobuf/UnittestRuntimeProto3.pbobjc.h"
+#import "objectivec/Tests/UnittestRuntimeProto2.pbobjc.h"
+#import "objectivec/Tests/UnittestRuntimeProto3.pbobjc.h"
diff --git a/src/google/protobuf/stubs/statusor.cc b/objectivec/Tests/any_test.proto
similarity index 78%
rename from src/google/protobuf/stubs/statusor.cc
rename to objectivec/Tests/any_test.proto
index 9c0a178..f2461bf 100644
--- a/src/google/protobuf/stubs/statusor.cc
+++ b/objectivec/Tests/any_test.proto
@@ -28,21 +28,17 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/stubs/statusor.h>
+syntax = "proto3";
-#include <google/protobuf/stubs/logging.h>
+package objc.protobuf.tests.any;
-namespace google {
-namespace protobuf {
-namespace util {
-namespace statusor_internal {
+import "google/protobuf/any.proto";
-void StatusOrHelper::Crash(const Status& status) {
- GOOGLE_LOG(FATAL) << "Attempting to fetch value instead of handling error "
- << status.ToString();
+option objc_class_prefix = "Any";
+
+message TestMessage {
+ int32 int32_value = 1;
+ google.protobuf.Any any_value = 2;
+ repeated google.protobuf.Any repeated_any_value = 3;
+ string text = 4;
}
-
-} // namespace statusor_internal
-} // namespace util
-} // namespace protobuf
-} // namespace google
diff --git a/objectivec/Tests/expected_prefixes.txt b/objectivec/Tests/expected_prefixes.txt
new file mode 100644
index 0000000..1665ab1
--- /dev/null
+++ b/objectivec/Tests/expected_prefixes.txt
@@ -0,0 +1,12 @@
+objc.protobuf.tests = "" # Explicit empty prefix
+objc.protobuf.tests.any = Any
+objc.protobuf.tests.chain = Chain
+objc.protobuf.tests.cycle = Cycle
+objc.protobuf.tests.deprecated = Dep
+objc.protobuf.tests.deprecated_file = FileDep
+objc.protobuf.tests.import = Import
+objc.protobuf.tests.mset = MSet
+objc.protobuf.tests.options = GPBTEST
+objc.protobuf.tests.proto3_preserve_unknown_enum = UnknownEnums
+objc.protobuf.tests.public_import = PublicImport
+objc.protobuf.tests.startup = TestObjCStartup
diff --git a/objectivec/Tests/map_proto2_unittest.proto b/objectivec/Tests/map_proto2_unittest.proto
new file mode 100644
index 0000000..d7b494c
--- /dev/null
+++ b/objectivec/Tests/map_proto2_unittest.proto
@@ -0,0 +1,90 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+syntax = "proto2";
+
+import "objectivec/Tests/unittest_import.proto";
+
+package objc.protobuf.tests;
+
+// Explicit empty prefix, tests some validations code paths also.
+option objc_class_prefix = "";
+
+enum Proto2MapEnum {
+ PROTO2_MAP_ENUM_FOO = 0;
+ PROTO2_MAP_ENUM_BAR = 1;
+ PROTO2_MAP_ENUM_BAZ = 2;
+}
+
+enum Proto2MapEnumPlusExtra {
+ E_PROTO2_MAP_ENUM_FOO = 0;
+ E_PROTO2_MAP_ENUM_BAR = 1;
+ E_PROTO2_MAP_ENUM_BAZ = 2;
+ E_PROTO2_MAP_ENUM_EXTRA = 3;
+}
+
+message TestEnumMap {
+ map<int32, Proto2MapEnum> known_map_field = 101;
+ map<int32, Proto2MapEnum> unknown_map_field = 102;
+}
+
+message TestEnumMapPlusExtra {
+ map<int32, Proto2MapEnumPlusExtra> known_map_field = 101;
+ map<int32, Proto2MapEnumPlusExtra> unknown_map_field = 102;
+}
+
+message TestImportEnumMap {
+ map<int32, objc.protobuf.tests.import.EnumForMap> import_enum_amp = 1;
+}
+
+message TestIntIntMap {
+ map<int32, int32> m = 1;
+}
+
+// Test all key types: string, plus the non-floating-point scalars.
+message TestMaps {
+ map<int32, TestIntIntMap> m_int32 = 1;
+ map<int64, TestIntIntMap> m_int64 = 2;
+ map<uint32, TestIntIntMap> m_uint32 = 3;
+ map<uint64, TestIntIntMap> m_uint64 = 4;
+ map<sint32, TestIntIntMap> m_sint32 = 5;
+ map<sint64, TestIntIntMap> m_sint64 = 6;
+ map<fixed32, TestIntIntMap> m_fixed32 = 7;
+ map<fixed64, TestIntIntMap> m_fixed64 = 8;
+ map<sfixed32, TestIntIntMap> m_sfixed32 = 9;
+ map<sfixed64, TestIntIntMap> m_sfixed64 = 10;
+ map<bool, TestIntIntMap> m_bool = 11;
+ map<string, TestIntIntMap> m_string = 12;
+}
+
+// Test maps in submessages.
+message TestSubmessageMaps {
+ optional TestMaps m = 1;
+}
diff --git a/objectivec/Tests/map_unittest.proto b/objectivec/Tests/map_unittest.proto
new file mode 100644
index 0000000..ba41439
--- /dev/null
+++ b/objectivec/Tests/map_unittest.proto
@@ -0,0 +1,123 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+syntax = "proto3";
+
+import "objectivec/Tests/unittest.proto";
+
+package objc.protobuf.tests;
+
+// Explicit empty prefix, tests some validations code paths also.
+option objc_class_prefix = "";
+
+// Tests maps.
+message TestMap {
+ map<int32, int32> map_int32_int32 = 1;
+ map<int64, int64> map_int64_int64 = 2;
+ map<uint32, uint32> map_uint32_uint32 = 3;
+ map<uint64, uint64> map_uint64_uint64 = 4;
+ map<sint32, sint32> map_sint32_sint32 = 5;
+ map<sint64, sint64> map_sint64_sint64 = 6;
+ map<fixed32, fixed32> map_fixed32_fixed32 = 7;
+ map<fixed64, fixed64> map_fixed64_fixed64 = 8;
+ map<sfixed32, sfixed32> map_sfixed32_sfixed32 = 9;
+ map<sfixed64, sfixed64> map_sfixed64_sfixed64 = 10;
+ map<int32, float> map_int32_float = 11;
+ map<int32, double> map_int32_double = 12;
+ map<bool, bool> map_bool_bool = 13;
+ map<string, string> map_string_string = 14;
+ map<int32, bytes> map_int32_bytes = 15;
+ map<int32, MapEnum> map_int32_enum = 16;
+ map<int32, ForeignMessage> map_int32_foreign_message = 17;
+ map<string, ForeignMessage> map_string_foreign_message = 18;
+ map<int32, TestAllTypes> map_int32_all_types = 19;
+}
+
+message TestMapSubmessage {
+ TestMap test_map = 1;
+}
+
+message TestMessageMap {
+ map<int32, TestAllTypes> map_int32_message = 1;
+}
+
+// Two map fields share the same entry default instance.
+message TestSameTypeMap {
+ map<int32, int32> map1 = 1;
+ map<int32, int32> map2 = 2;
+}
+
+
+enum MapEnum {
+ MAP_ENUM_FOO = 0;
+ MAP_ENUM_BAR = 1;
+ MAP_ENUM_BAZ = 2;
+}
+
+// Test embedded message with required fields
+message TestRequiredMessageMap {
+ map<int32, TestRequired> map_field = 1;
+}
+
+message TestArenaMap {
+ map<int32, int32> map_int32_int32 = 1;
+ map<int64, int64> map_int64_int64 = 2;
+ map<uint32, uint32> map_uint32_uint32 = 3;
+ map<uint64, uint64> map_uint64_uint64 = 4;
+ map<sint32, sint32> map_sint32_sint32 = 5;
+ map<sint64, sint64> map_sint64_sint64 = 6;
+ map<fixed32, fixed32> map_fixed32_fixed32 = 7;
+ map<fixed64, fixed64> map_fixed64_fixed64 = 8;
+ map<sfixed32, sfixed32> map_sfixed32_sfixed32 = 9;
+ map<sfixed64, sfixed64> map_sfixed64_sfixed64 = 10;
+ map<int32, float> map_int32_float = 11;
+ map<int32, double> map_int32_double = 12;
+ map<bool, bool> map_bool_bool = 13;
+ map<string, string> map_string_string = 14;
+ map<int32, bytes> map_int32_bytes = 15;
+ map<int32, MapEnum> map_int32_enum = 16;
+ map<int32, ForeignMessage> map_int32_foreign_message = 17;
+}
+
+// Previously, message containing enum called Type cannot be used as value of
+// map field.
+message MessageContainingEnumCalledType {
+ enum Type { TYPE_FOO = 0; }
+ map<string, MessageContainingEnumCalledType> type = 1;
+}
+
+// Previously, message cannot contain map field called "entry".
+message MessageContainingMapCalledEntry {
+ map<int32, int32> entry = 1;
+}
+
+message TestRecursiveMapMessage {
+ map<string, TestRecursiveMapMessage> a = 1;
+}
diff --git a/objectivec/Tests/unittest.proto b/objectivec/Tests/unittest.proto
new file mode 100644
index 0000000..31353b4
--- /dev/null
+++ b/objectivec/Tests/unittest.proto
@@ -0,0 +1,1536 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// LINT: ALLOW_GROUPS, LEGACY_NAMES
+
+syntax = "proto2";
+
+import "objectivec/Tests/unittest_import.proto";
+
+// Explicit empty prefix, tests some validations code paths also.
+option objc_class_prefix = "";
+
+package objc.protobuf.tests;
+
+// This proto includes every type of field in both singular and repeated
+// forms.
+message TestAllTypes {
+ message NestedMessage {
+ // The field name "b" fails to compile in proto1 because it conflicts with
+ // a local variable named "b" in one of the generated methods. Doh.
+ // This file needs to compile in proto1 to test backwards-compatibility.
+ optional int32 bb = 1;
+ }
+
+ enum NestedEnum {
+ FOO = 1;
+ BAR = 2;
+ BAZ = 3;
+ NEG = -1; // Intentionally negative.
+ }
+
+ // Singular
+ optional int32 optional_int32 = 1;
+ optional int64 optional_int64 = 2;
+ optional uint32 optional_uint32 = 3;
+ optional uint64 optional_uint64 = 4;
+ optional sint32 optional_sint32 = 5;
+ optional sint64 optional_sint64 = 6;
+ optional fixed32 optional_fixed32 = 7;
+ optional fixed64 optional_fixed64 = 8;
+ optional sfixed32 optional_sfixed32 = 9;
+ optional sfixed64 optional_sfixed64 = 10;
+ optional float optional_float = 11;
+ optional double optional_double = 12;
+ optional bool optional_bool = 13;
+ optional string optional_string = 14;
+ optional bytes optional_bytes = 15;
+
+ optional group OptionalGroup = 16 {
+ optional int32 a = 17;
+ }
+
+ optional NestedMessage optional_nested_message = 18;
+ optional ForeignMessage optional_foreign_message = 19;
+ optional objc.protobuf.tests.import.Message optional_import_message = 20;
+
+ optional NestedEnum optional_nested_enum = 21;
+ optional ForeignEnum optional_foreign_enum = 22;
+ optional objc.protobuf.tests.import.Enum optional_import_enum = 23;
+
+ optional string optional_string_piece = 24 [ctype=STRING_PIECE];
+ optional string optional_cord = 25 [ctype=CORD];
+
+ // Defined in unittest_import_public.proto
+ optional objc.protobuf.tests.public_import.Message
+ optional_public_import_message = 26;
+
+ optional NestedMessage optional_lazy_message = 27 [lazy=true];
+ optional NestedMessage optional_unverified_lazy_message = 28 [unverified_lazy=true];
+
+ // Repeated
+ repeated int32 repeated_int32 = 31;
+ repeated int64 repeated_int64 = 32;
+ repeated uint32 repeated_uint32 = 33;
+ repeated uint64 repeated_uint64 = 34;
+ repeated sint32 repeated_sint32 = 35;
+ repeated sint64 repeated_sint64 = 36;
+ repeated fixed32 repeated_fixed32 = 37;
+ repeated fixed64 repeated_fixed64 = 38;
+ repeated sfixed32 repeated_sfixed32 = 39;
+ repeated sfixed64 repeated_sfixed64 = 40;
+ repeated float repeated_float = 41;
+ repeated double repeated_double = 42;
+ repeated bool repeated_bool = 43;
+ repeated string repeated_string = 44;
+ repeated bytes repeated_bytes = 45;
+
+ repeated group RepeatedGroup = 46 {
+ optional int32 a = 47;
+ }
+
+ repeated NestedMessage repeated_nested_message = 48;
+ repeated ForeignMessage repeated_foreign_message = 49;
+ repeated objc.protobuf.tests.import.Message repeated_import_message = 50;
+
+ repeated NestedEnum repeated_nested_enum = 51;
+ repeated ForeignEnum repeated_foreign_enum = 52;
+ repeated objc.protobuf.tests.import.Enum repeated_import_enum = 53;
+
+ repeated string repeated_string_piece = 54 [ctype=STRING_PIECE];
+ repeated string repeated_cord = 55 [ctype=CORD];
+
+ repeated NestedMessage repeated_lazy_message = 57 [lazy=true];
+
+ // Singular with defaults
+ optional int32 default_int32 = 61 [default = 41 ];
+ optional int64 default_int64 = 62 [default = 42 ];
+ optional uint32 default_uint32 = 63 [default = 43 ];
+ optional uint64 default_uint64 = 64 [default = 44 ];
+ optional sint32 default_sint32 = 65 [default = -45 ];
+ optional sint64 default_sint64 = 66 [default = 46 ];
+ optional fixed32 default_fixed32 = 67 [default = 47 ];
+ optional fixed64 default_fixed64 = 68 [default = 48 ];
+ optional sfixed32 default_sfixed32 = 69 [default = 49 ];
+ optional sfixed64 default_sfixed64 = 70 [default = -50 ];
+ optional float default_float = 71 [default = 51.5 ];
+ optional double default_double = 72 [default = 52e3 ];
+ optional bool default_bool = 73 [default = true ];
+ optional string default_string = 74 [default = "hello"];
+ optional bytes default_bytes = 75 [default = "world"];
+
+ optional NestedEnum default_nested_enum = 81 [default = BAR ];
+ optional ForeignEnum default_foreign_enum = 82 [default = FOREIGN_BAR];
+ optional objc.protobuf.tests.import.Enum
+ default_import_enum = 83 [default = IMPORT_BAR];
+
+ optional string default_string_piece = 84 [ctype=STRING_PIECE,default="abc"];
+ optional string default_cord = 85 [ctype=CORD,default="123"];
+
+ // For oneof test
+ oneof oneof_field {
+ uint32 oneof_uint32 = 111;
+ NestedMessage oneof_nested_message = 112;
+ string oneof_string = 113;
+ bytes oneof_bytes = 114;
+ }
+}
+
+// This proto includes a recursively nested message.
+message NestedTestAllTypes {
+ optional NestedTestAllTypes child = 1;
+ optional TestAllTypes payload = 2;
+ repeated NestedTestAllTypes repeated_child = 3;
+ optional NestedTestAllTypes lazy_child = 4 [lazy=true];
+ optional TestAllTypes eager_child = 5 [lazy=false];
+}
+
+message TestDeprecatedFields {
+ optional int32 deprecated_int32 = 1 [deprecated=true];
+ oneof oneof_fields {
+ int32 deprecated_int32_in_oneof = 2 [deprecated=true];
+ }
+}
+
+message TestDeprecatedMessage {
+ option deprecated = true;
+}
+
+// Define these after TestAllTypes to make sure the compiler can handle
+// that.
+message ForeignMessage {
+ optional int32 c = 1;
+ optional int32 d = 2;
+}
+
+enum ForeignEnum {
+ FOREIGN_FOO = 4;
+ FOREIGN_BAR = 5;
+ FOREIGN_BAZ = 6;
+}
+
+message TestReservedFields {
+ reserved 2, 15, 9 to 11;
+ reserved "bar", "baz";
+}
+
+enum TestReservedEnumFields {
+ UNKNOWN = 0;
+ reserved 2, 15, 9 to 11;
+ reserved "bar", "baz";
+}
+
+message TestAllExtensions {
+ extensions 1 to max;
+}
+
+extend TestAllExtensions {
+ // Singular
+ optional int32 optional_int32_extension = 1;
+ optional int64 optional_int64_extension = 2;
+ optional uint32 optional_uint32_extension = 3;
+ optional uint64 optional_uint64_extension = 4;
+ optional sint32 optional_sint32_extension = 5;
+ optional sint64 optional_sint64_extension = 6;
+ optional fixed32 optional_fixed32_extension = 7;
+ optional fixed64 optional_fixed64_extension = 8;
+ optional sfixed32 optional_sfixed32_extension = 9;
+ optional sfixed64 optional_sfixed64_extension = 10;
+ optional float optional_float_extension = 11;
+ optional double optional_double_extension = 12;
+ optional bool optional_bool_extension = 13;
+ optional string optional_string_extension = 14;
+ optional bytes optional_bytes_extension = 15;
+
+ optional group OptionalGroup_extension = 16 {
+ optional int32 a = 17;
+ }
+
+ optional TestAllTypes.NestedMessage optional_nested_message_extension = 18;
+ optional ForeignMessage optional_foreign_message_extension = 19;
+ optional objc.protobuf.tests.import.Message
+ optional_import_message_extension = 20;
+
+ optional TestAllTypes.NestedEnum optional_nested_enum_extension = 21;
+ optional ForeignEnum optional_foreign_enum_extension = 22;
+ optional objc.protobuf.tests.import.Enum
+ optional_import_enum_extension = 23;
+
+ optional string optional_string_piece_extension = 24 [ctype=STRING_PIECE];
+ optional string optional_cord_extension = 25 [ctype=CORD];
+
+ optional objc.protobuf.tests.public_import.Message
+ optional_public_import_message_extension = 26;
+
+ optional TestAllTypes.NestedMessage
+ optional_lazy_message_extension = 27 [lazy=true];
+ optional TestAllTypes.NestedMessage
+ optional_unverified_lazy_message_extension = 28 [unverified_lazy=true];
+
+ // Repeated
+ repeated int32 repeated_int32_extension = 31;
+ repeated int64 repeated_int64_extension = 32;
+ repeated uint32 repeated_uint32_extension = 33;
+ repeated uint64 repeated_uint64_extension = 34;
+ repeated sint32 repeated_sint32_extension = 35;
+ repeated sint64 repeated_sint64_extension = 36;
+ repeated fixed32 repeated_fixed32_extension = 37;
+ repeated fixed64 repeated_fixed64_extension = 38;
+ repeated sfixed32 repeated_sfixed32_extension = 39;
+ repeated sfixed64 repeated_sfixed64_extension = 40;
+ repeated float repeated_float_extension = 41;
+ repeated double repeated_double_extension = 42;
+ repeated bool repeated_bool_extension = 43;
+ repeated string repeated_string_extension = 44;
+ repeated bytes repeated_bytes_extension = 45;
+
+ repeated group RepeatedGroup_extension = 46 {
+ optional int32 a = 47;
+ }
+
+ repeated TestAllTypes.NestedMessage repeated_nested_message_extension = 48;
+ repeated ForeignMessage repeated_foreign_message_extension = 49;
+ repeated objc.protobuf.tests.import.Message
+ repeated_import_message_extension = 50;
+
+ repeated TestAllTypes.NestedEnum repeated_nested_enum_extension = 51;
+ repeated ForeignEnum repeated_foreign_enum_extension = 52;
+ repeated objc.protobuf.tests.import.Enum
+ repeated_import_enum_extension = 53;
+
+ repeated string repeated_string_piece_extension = 54 [ctype=STRING_PIECE];
+ repeated string repeated_cord_extension = 55 [ctype=CORD];
+
+ repeated TestAllTypes.NestedMessage
+ repeated_lazy_message_extension = 57 [lazy=true];
+
+ // Singular with defaults
+ optional int32 default_int32_extension = 61 [default = 41 ];
+ optional int64 default_int64_extension = 62 [default = 42 ];
+ optional uint32 default_uint32_extension = 63 [default = 43 ];
+ optional uint64 default_uint64_extension = 64 [default = 44 ];
+ optional sint32 default_sint32_extension = 65 [default = -45 ];
+ optional sint64 default_sint64_extension = 66 [default = 46 ];
+ optional fixed32 default_fixed32_extension = 67 [default = 47 ];
+ optional fixed64 default_fixed64_extension = 68 [default = 48 ];
+ optional sfixed32 default_sfixed32_extension = 69 [default = 49 ];
+ optional sfixed64 default_sfixed64_extension = 70 [default = -50 ];
+ optional float default_float_extension = 71 [default = 51.5 ];
+ optional double default_double_extension = 72 [default = 52e3 ];
+ optional bool default_bool_extension = 73 [default = true ];
+ optional string default_string_extension = 74 [default = "hello"];
+ optional bytes default_bytes_extension = 75 [default = "world"];
+
+ optional TestAllTypes.NestedEnum
+ default_nested_enum_extension = 81 [default = BAR];
+ optional ForeignEnum
+ default_foreign_enum_extension = 82 [default = FOREIGN_BAR];
+ optional objc.protobuf.tests.import.Enum
+ default_import_enum_extension = 83 [default = IMPORT_BAR];
+
+ optional string default_string_piece_extension = 84 [ctype=STRING_PIECE,
+ default="abc"];
+ optional string default_cord_extension = 85 [ctype=CORD, default="123"];
+
+ // For oneof test
+ optional uint32 oneof_uint32_extension = 111;
+ optional TestAllTypes.NestedMessage oneof_nested_message_extension = 112;
+ optional string oneof_string_extension = 113;
+ optional bytes oneof_bytes_extension = 114;
+}
+
+message TestMixedFieldsAndExtensions {
+ optional int32 a = 1;
+ repeated fixed32 b = 3;
+ extensions 2, 4;
+ extend TestMixedFieldsAndExtensions {
+ optional int32 c = 2;
+ repeated fixed32 d = 4;
+ }
+}
+
+message TestGroup {
+ optional group OptionalGroup = 16 {
+ optional int32 a = 17;
+ }
+ optional ForeignEnum optional_foreign_enum = 22;
+}
+
+message TestGroupExtension {
+ extensions 1 to max;
+}
+
+message TestNestedExtension {
+ extend TestAllExtensions {
+ // Check for bug where string extensions declared in tested scope did not
+ // compile.
+ optional string test = 1002 [default="test"];
+ // Used to test if generated extension name is correct when there are
+ // underscores.
+ optional string nested_string_extension = 1003;
+ }
+
+ extend TestGroupExtension {
+ optional group OptionalGroup_extension = 16 {
+ optional int32 a = 17;
+ }
+ optional ForeignEnum optional_foreign_enum_extension = 22;
+ }
+}
+
+message TestChildExtension {
+ optional string a = 1;
+ optional string b = 2;
+ optional TestAllExtensions optional_extension = 3;
+}
+
+// Emulates wireformat data of TestChildExtension with dynamic extension
+// (DynamicExtension).
+message TestChildExtensionData {
+ message NestedTestAllExtensionsData {
+ message NestedDynamicExtensions {
+ optional int32 a = 1;
+ optional int32 b = 2;
+ }
+ optional NestedDynamicExtensions dynamic = 409707008;
+ }
+ optional string a = 1;
+ optional string b = 2;
+ optional NestedTestAllExtensionsData optional_extension = 3;
+}
+
+message TestNestedChildExtension {
+ optional int32 a = 1;
+ optional TestChildExtension child = 2;
+}
+
+// Emulates wireformat data of TestNestedChildExtension with dynamic extension
+// (DynamicExtension).
+message TestNestedChildExtensionData {
+ optional int32 a = 1;
+ optional TestChildExtensionData child = 2;
+}
+
+// We have separate messages for testing required fields because it's
+// annoying to have to fill in required fields in TestProto in order to
+// do anything with it. Note that we don't need to test every type of
+// required filed because the code output is basically identical to
+// optional fields for all types.
+message TestRequired {
+ required int32 a = 1;
+ optional int32 dummy2 = 2;
+ required int32 b = 3;
+
+ extend TestAllExtensions {
+ optional TestRequired single = 1000;
+ repeated TestRequired multi = 1001;
+ }
+
+ // Pad the field count to 32 so that we can test that IsInitialized()
+ // properly checks multiple elements of has_bits_.
+ optional int32 dummy4 = 4;
+ optional int32 dummy5 = 5;
+ optional int32 dummy6 = 6;
+ optional int32 dummy7 = 7;
+ optional int32 dummy8 = 8;
+ optional int32 dummy9 = 9;
+ optional int32 dummy10 = 10;
+ optional int32 dummy11 = 11;
+ optional int32 dummy12 = 12;
+ optional int32 dummy13 = 13;
+ optional int32 dummy14 = 14;
+ optional int32 dummy15 = 15;
+ optional int32 dummy16 = 16;
+ optional int32 dummy17 = 17;
+ optional int32 dummy18 = 18;
+ optional int32 dummy19 = 19;
+ optional int32 dummy20 = 20;
+ optional int32 dummy21 = 21;
+ optional int32 dummy22 = 22;
+ optional int32 dummy23 = 23;
+ optional int32 dummy24 = 24;
+ optional int32 dummy25 = 25;
+ optional int32 dummy26 = 26;
+ optional int32 dummy27 = 27;
+ optional int32 dummy28 = 28;
+ optional int32 dummy29 = 29;
+ optional int32 dummy30 = 30;
+ optional int32 dummy31 = 31;
+ optional int32 dummy32 = 32;
+
+ required int32 c = 33;
+
+ // Add an optional child message to make this non-trivial for go/pdlazy.
+ optional ForeignMessage optional_foreign = 34;
+}
+
+message TestRequiredForeign {
+ optional TestRequired optional_message = 1;
+ repeated TestRequired repeated_message = 2;
+ optional int32 dummy = 3;
+
+ // Missing required fields must not affect verification of child messages.
+ optional NestedTestAllTypes optional_lazy_message = 4 [lazy = true];
+}
+
+message TestRequiredMessage {
+ optional TestRequired optional_message = 1;
+ repeated TestRequired repeated_message = 2;
+ required TestRequired required_message = 3;
+}
+
+message TestNestedRequiredForeign {
+ optional TestNestedRequiredForeign child = 1;
+ optional TestRequiredForeign payload = 2;
+ optional int32 dummy = 3;
+}
+
+// Test that we can use NestedMessage from outside TestAllTypes.
+message TestForeignNested {
+ optional TestAllTypes.NestedMessage foreign_nested = 1;
+}
+
+// TestEmptyMessage is used to test unknown field support.
+message TestEmptyMessage {
+}
+
+// Like above, but declare all field numbers as potential extensions. No
+// actual extensions should ever be defined for this type.
+message TestEmptyMessageWithExtensions {
+ extensions 1 to max;
+}
+
+// Needed for a Python test.
+message TestPickleNestedMessage {
+ message NestedMessage {
+ optional int32 bb = 1;
+ message NestedNestedMessage {
+ optional int32 cc = 1;
+ }
+ }
+}
+
+message TestMultipleExtensionRanges {
+ extensions 42;
+ extensions 4143 to 4243;
+ extensions 65536 to max;
+}
+
+// Test that really large tag numbers don't break anything.
+message TestReallyLargeTagNumber {
+ // The largest possible tag number is 2^28 - 1, since the wire format uses
+ // three bits to communicate wire type.
+ optional int32 a = 1;
+ optional int32 bb = 268435455;
+}
+
+message TestRecursiveMessage {
+ optional TestRecursiveMessage a = 1;
+ optional int32 i = 2;
+}
+
+// Test that mutual recursion works.
+message TestMutualRecursionA {
+ message SubMessage {
+ optional TestMutualRecursionB b = 1;
+ }
+ optional TestMutualRecursionB bb = 1;
+ optional group SubGroup = 2 {
+ optional SubMessage sub_message = 3; // Needed because of bug in javatest
+ optional TestAllTypes not_in_this_scc = 4;
+ }
+}
+
+message TestMutualRecursionB {
+ optional TestMutualRecursionA a = 1;
+ optional int32 optional_int32 = 2;
+}
+
+message TestIsInitialized {
+ message SubMessage {
+ optional group SubGroup = 1 {
+ required int32 i = 2;
+ }
+ }
+ optional SubMessage sub_message = 1;
+}
+
+// Test that groups have disjoint field numbers from their siblings and
+// parents. This is NOT possible in proto1; only google.protobuf. When attempting
+// to compile with proto1, this will emit an error; so we only include it
+// in objc.protobuf.tests_proto.
+message TestDupFieldNumber { // NO_PROTO1
+ optional int32 a = 1; // NO_PROTO1
+ optional group Foo = 2 { optional int32 a = 1; } // NO_PROTO1
+ optional group Bar = 3 { optional int32 a = 1; } // NO_PROTO1
+} // NO_PROTO1
+
+// Additional messages for testing lazy fields.
+message TestEagerMessage {
+ optional TestAllTypes sub_message = 1 [lazy=false];
+}
+message TestLazyMessage {
+ optional TestAllTypes sub_message = 1 [lazy=true];
+}
+message TestEagerMaybeLazy {
+ message NestedMessage {
+ optional TestPackedTypes packed = 1;
+ }
+ optional TestAllTypes message_foo = 1;
+ optional TestAllTypes message_bar = 2;
+ optional NestedMessage message_baz = 3;
+}
+// Needed for a Python test.
+message TestNestedMessageHasBits {
+ message NestedMessage {
+ repeated int32 nestedmessage_repeated_int32 = 1;
+ repeated ForeignMessage nestedmessage_repeated_foreignmessage = 2;
+ }
+ optional NestedMessage optional_nested_message = 1;
+}
+
+
+// Test an enum that has multiple values with the same number.
+enum TestEnumWithDupValue {
+ option allow_alias = true;
+
+ FOO1 = 1;
+ BAR1 = 2;
+ BAZ = 3;
+ FOO2 = 1;
+ BAR2 = 2;
+}
+
+// Test an enum with large, unordered values.
+enum TestSparseEnum {
+ SPARSE_A = 123;
+ SPARSE_B = 62374;
+ SPARSE_C = 12589234;
+ SPARSE_D = -15;
+ SPARSE_E = -53452;
+ SPARSE_F = 0;
+ SPARSE_G = 2;
+}
+
+// Test message with CamelCase field names. This violates Protocol Buffer
+// standard style.
+message TestCamelCaseFieldNames {
+ optional int32 PrimitiveField = 1;
+ optional string StringField = 2;
+ optional ForeignEnum EnumField = 3;
+ optional ForeignMessage MessageField = 4;
+ optional string StringPieceField = 5 [ctype=STRING_PIECE];
+ optional string CordField = 6 [ctype=CORD];
+
+ repeated int32 RepeatedPrimitiveField = 7;
+ repeated string RepeatedStringField = 8;
+ repeated ForeignEnum RepeatedEnumField = 9;
+ repeated ForeignMessage RepeatedMessageField = 10;
+ repeated string RepeatedStringPieceField = 11 [ctype=STRING_PIECE];
+ repeated string RepeatedCordField = 12 [ctype=CORD];
+}
+
+
+// We list fields out of order, to ensure that we're using field number and not
+// field index to determine serialization order.
+message TestFieldOrderings {
+ optional string my_string = 11;
+ extensions 2 to 10;
+ optional int64 my_int = 1;
+ extensions 12 to 100;
+ optional float my_float = 101;
+ message NestedMessage {
+ optional int64 oo = 2;
+ // The field name "b" fails to compile in proto1 because it conflicts with
+ // a local variable named "b" in one of the generated methods. Doh.
+ // This file needs to compile in proto1 to test backwards-compatibility.
+ optional int32 bb = 1;
+ }
+
+ optional NestedMessage optional_nested_message = 200;
+}
+
+extend TestFieldOrderings {
+ optional string my_extension_string = 50;
+ optional int32 my_extension_int = 5;
+}
+
+message TestExtensionOrderings1 {
+ extend TestFieldOrderings {
+ optional TestExtensionOrderings1 test_ext_orderings1 = 13;
+ }
+ optional string my_string = 1;
+}
+
+message TestExtensionOrderings2 {
+ extend TestFieldOrderings {
+ optional TestExtensionOrderings2 test_ext_orderings2 = 12;
+ }
+ message TestExtensionOrderings3 {
+ extend TestFieldOrderings {
+ optional TestExtensionOrderings3 test_ext_orderings3 = 14;
+ }
+ optional string my_string = 1;
+ }
+ optional string my_string = 1;
+}
+
+message TestExtremeDefaultValues {
+ optional bytes escaped_bytes = 1 [default = "\0\001\a\b\f\n\r\t\v\\\'\"\xfe"];
+ optional uint32 large_uint32 = 2 [default = 0xFFFFFFFF];
+ optional uint64 large_uint64 = 3 [default = 0xFFFFFFFFFFFFFFFF];
+ optional int32 small_int32 = 4 [default = -0x7FFFFFFF];
+ optional int64 small_int64 = 5 [default = -0x7FFFFFFFFFFFFFFF];
+ optional int32 really_small_int32 = 21 [default = -0x80000000];
+ optional int64 really_small_int64 = 22 [default = -0x8000000000000000];
+
+ // The default value here is UTF-8 for "\u1234". (We could also just type
+ // the UTF-8 text directly into this text file rather than escape it, but
+ // lots of people use editors that would be confused by this.)
+ optional string utf8_string = 6 [default = "\341\210\264"];
+
+ // Tests for single-precision floating-point values.
+ optional float zero_float = 7 [default = 0];
+ optional float one_float = 8 [default = 1];
+ optional float small_float = 9 [default = 1.5];
+ optional float negative_one_float = 10 [default = -1];
+ optional float negative_float = 11 [default = -1.5];
+ // Using exponents
+ optional float large_float = 12 [default = 2E8];
+ optional float small_negative_float = 13 [default = -8e-28];
+
+ // Text for nonfinite floating-point values.
+ optional double inf_double = 14 [default = inf];
+ optional double neg_inf_double = 15 [default = -inf];
+ optional double nan_double = 16 [default = nan];
+ optional float inf_float = 17 [default = inf];
+ optional float neg_inf_float = 18 [default = -inf];
+ optional float nan_float = 19 [default = nan];
+
+ // Tests for C++ trigraphs.
+ // Trigraphs should be escaped in C++ generated files, but they should not be
+ // escaped for other languages.
+ // Note that in .proto file, "\?" is a valid way to escape ? in string
+ // literals.
+ optional string cpp_trigraph = 20 [default = "? \? ?? \?? \??? ??/ ?\?-"];
+
+ // String defaults containing the character '\000'
+ optional string string_with_zero = 23 [default = "hel\000lo"];
+ optional bytes bytes_with_zero = 24 [default = "wor\000ld"];
+ optional string string_piece_with_zero = 25 [ctype=STRING_PIECE,
+ default="ab\000c"];
+ optional string cord_with_zero = 26 [ctype=CORD,
+ default="12\0003"];
+ optional string replacement_string = 27 [default="${unknown}"];
+}
+
+message SparseEnumMessage {
+ optional TestSparseEnum sparse_enum = 1;
+}
+
+// Test String and Bytes: string is for valid UTF-8 strings
+message OneString {
+ optional string data = 1;
+}
+
+message MoreString {
+ repeated string data = 1;
+}
+
+message OneBytes {
+ optional bytes data = 1;
+}
+
+message MoreBytes {
+ repeated bytes data = 1;
+}
+
+message ManyOptionalString {
+ optional string str1 = 1;
+ optional string str2 = 2;
+ optional string str3 = 3;
+ optional string str4 = 4;
+ optional string str5 = 5;
+ optional string str6 = 6;
+ optional string str7 = 7;
+ optional string str8 = 8;
+ optional string str9 = 9;
+ optional string str10 = 10;
+ optional string str11 = 11;
+ optional string str12 = 12;
+ optional string str13 = 13;
+ optional string str14 = 14;
+ optional string str15 = 15;
+ optional string str16 = 16;
+ optional string str17 = 17;
+ optional string str18 = 18;
+ optional string str19 = 19;
+ optional string str20 = 20;
+ optional string str21 = 21;
+ optional string str22 = 22;
+ optional string str23 = 23;
+ optional string str24 = 24;
+ optional string str25 = 25;
+ optional string str26 = 26;
+ optional string str27 = 27;
+ optional string str28 = 28;
+ optional string str29 = 29;
+ optional string str30 = 30;
+ optional string str31 = 31;
+ optional string str32 = 32;
+}
+
+// Test int32, uint32, int64, uint64, and bool are all compatible
+message Int32Message {
+ optional int32 data = 1;
+}
+
+message Uint32Message {
+ optional uint32 data = 1;
+}
+
+message Int64Message {
+ optional int64 data = 1;
+}
+
+message Uint64Message {
+ optional uint64 data = 1;
+}
+
+message BoolMessage {
+ optional bool data = 1;
+}
+
+// Test oneofs.
+message TestOneof {
+ oneof foo {
+ int32 foo_int = 1;
+ string foo_string = 2;
+ TestAllTypes foo_message = 3;
+ group FooGroup = 4 {
+ optional int32 a = 5;
+ optional string b = 6;
+ }
+ }
+}
+
+message TestOneofBackwardsCompatible {
+ optional int32 foo_int = 1;
+ optional string foo_string = 2;
+ optional TestAllTypes foo_message = 3;
+ optional group FooGroup = 4 {
+ optional int32 a = 5;
+ optional string b = 6;
+ }
+}
+
+message TestOneof2 {
+ oneof foo {
+ int32 foo_int = 1;
+ string foo_string = 2;
+ string foo_cord = 3 [ctype=CORD];
+ string foo_string_piece = 4 [ctype=STRING_PIECE];
+ bytes foo_bytes = 5;
+ NestedEnum foo_enum = 6;
+ NestedMessage foo_message = 7;
+ group FooGroup = 8 {
+ optional int32 a = 9;
+ optional string b = 10;
+ }
+ NestedMessage foo_lazy_message = 11 [lazy=true];
+ }
+
+ oneof bar {
+ int32 bar_int = 12 [default = 5];
+ string bar_string = 13 [default = "STRING"];
+ string bar_cord = 14 [ctype=CORD, default = "CORD"];
+ string bar_string_piece = 15 [ctype=STRING_PIECE, default = "SPIECE"];
+ bytes bar_bytes = 16 [default = "BYTES"];
+ NestedEnum bar_enum = 17 [default = BAR];
+ string bar_string_with_empty_default = 20 [default = ""];
+ string bar_cord_with_empty_default = 21 [ctype=CORD, default = ""];
+ string bar_string_piece_with_empty_default = 22 [ctype=STRING_PIECE, default = ""];
+ bytes bar_bytes_with_empty_default = 23 [default = ""];
+ }
+
+ optional int32 baz_int = 18;
+ optional string baz_string = 19 [default = "BAZ"];
+
+ message NestedMessage {
+ optional int64 moo_int = 1;
+ repeated int32 corge_int = 2;
+ }
+
+ enum NestedEnum {
+ FOO = 1;
+ BAR = 2;
+ BAZ = 3;
+ }
+}
+
+message TestRequiredOneof {
+ oneof foo {
+ int32 foo_int = 1;
+ string foo_string = 2;
+ NestedMessage foo_message = 3;
+ }
+ message NestedMessage {
+ required double required_double = 1;
+ }
+}
+
+
+// Test messages for packed fields
+
+message TestPackedTypes {
+ repeated int32 packed_int32 = 90 [packed = true];
+ repeated int64 packed_int64 = 91 [packed = true];
+ repeated uint32 packed_uint32 = 92 [packed = true];
+ repeated uint64 packed_uint64 = 93 [packed = true];
+ repeated sint32 packed_sint32 = 94 [packed = true];
+ repeated sint64 packed_sint64 = 95 [packed = true];
+ repeated fixed32 packed_fixed32 = 96 [packed = true];
+ repeated fixed64 packed_fixed64 = 97 [packed = true];
+ repeated sfixed32 packed_sfixed32 = 98 [packed = true];
+ repeated sfixed64 packed_sfixed64 = 99 [packed = true];
+ repeated float packed_float = 100 [packed = true];
+ repeated double packed_double = 101 [packed = true];
+ repeated bool packed_bool = 102 [packed = true];
+ repeated ForeignEnum packed_enum = 103 [packed = true];
+}
+
+// A message with the same fields as TestPackedTypes, but without packing. Used
+// to test packed <-> unpacked wire compatibility.
+message TestUnpackedTypes {
+ repeated int32 unpacked_int32 = 90 [packed = false];
+ repeated int64 unpacked_int64 = 91 [packed = false];
+ repeated uint32 unpacked_uint32 = 92 [packed = false];
+ repeated uint64 unpacked_uint64 = 93 [packed = false];
+ repeated sint32 unpacked_sint32 = 94 [packed = false];
+ repeated sint64 unpacked_sint64 = 95 [packed = false];
+ repeated fixed32 unpacked_fixed32 = 96 [packed = false];
+ repeated fixed64 unpacked_fixed64 = 97 [packed = false];
+ repeated sfixed32 unpacked_sfixed32 = 98 [packed = false];
+ repeated sfixed64 unpacked_sfixed64 = 99 [packed = false];
+ repeated float unpacked_float = 100 [packed = false];
+ repeated double unpacked_double = 101 [packed = false];
+ repeated bool unpacked_bool = 102 [packed = false];
+ repeated ForeignEnum unpacked_enum = 103 [packed = false];
+}
+
+message TestPackedExtensions {
+ extensions 1 to max;
+}
+
+extend TestPackedExtensions {
+ repeated int32 packed_int32_extension = 90 [packed = true];
+ repeated int64 packed_int64_extension = 91 [packed = true];
+ repeated uint32 packed_uint32_extension = 92 [packed = true];
+ repeated uint64 packed_uint64_extension = 93 [packed = true];
+ repeated sint32 packed_sint32_extension = 94 [packed = true];
+ repeated sint64 packed_sint64_extension = 95 [packed = true];
+ repeated fixed32 packed_fixed32_extension = 96 [packed = true];
+ repeated fixed64 packed_fixed64_extension = 97 [packed = true];
+ repeated sfixed32 packed_sfixed32_extension = 98 [packed = true];
+ repeated sfixed64 packed_sfixed64_extension = 99 [packed = true];
+ repeated float packed_float_extension = 100 [packed = true];
+ repeated double packed_double_extension = 101 [packed = true];
+ repeated bool packed_bool_extension = 102 [packed = true];
+ repeated ForeignEnum packed_enum_extension = 103 [packed = true];
+}
+
+message TestUnpackedExtensions {
+ extensions 1 to max;
+}
+
+extend TestUnpackedExtensions {
+ repeated int32 unpacked_int32_extension = 90 [packed = false];
+ repeated int64 unpacked_int64_extension = 91 [packed = false];
+ repeated uint32 unpacked_uint32_extension = 92 [packed = false];
+ repeated uint64 unpacked_uint64_extension = 93 [packed = false];
+ repeated sint32 unpacked_sint32_extension = 94 [packed = false];
+ repeated sint64 unpacked_sint64_extension = 95 [packed = false];
+ repeated fixed32 unpacked_fixed32_extension = 96 [packed = false];
+ repeated fixed64 unpacked_fixed64_extension = 97 [packed = false];
+ repeated sfixed32 unpacked_sfixed32_extension = 98 [packed = false];
+ repeated sfixed64 unpacked_sfixed64_extension = 99 [packed = false];
+ repeated float unpacked_float_extension = 100 [packed = false];
+ repeated double unpacked_double_extension = 101 [packed = false];
+ repeated bool unpacked_bool_extension = 102 [packed = false];
+ repeated ForeignEnum unpacked_enum_extension = 103 [packed = false];
+}
+
+// Used by ExtensionSetTest/DynamicExtensions. The test actually builds
+// a set of extensions to TestAllExtensions dynamically, based on the fields
+// of this message type.
+message TestDynamicExtensions {
+ enum DynamicEnumType {
+ DYNAMIC_FOO = 2200;
+ DYNAMIC_BAR = 2201;
+ DYNAMIC_BAZ = 2202;
+ }
+ message DynamicMessageType {
+ optional int32 dynamic_field = 2100;
+ }
+
+ optional fixed32 scalar_extension = 2000;
+ optional ForeignEnum enum_extension = 2001;
+ optional DynamicEnumType dynamic_enum_extension = 2002;
+
+ optional ForeignMessage message_extension = 2003;
+ optional DynamicMessageType dynamic_message_extension = 2004;
+
+ repeated string repeated_extension = 2005;
+ repeated sint32 packed_extension = 2006 [packed = true];
+}
+
+message TestRepeatedScalarDifferentTagSizes {
+ // Parsing repeated fixed size values used to fail. This message needs to be
+ // used in order to get a tag of the right size; all of the repeated fields
+ // in TestAllTypes didn't trigger the check.
+ repeated fixed32 repeated_fixed32 = 12;
+ // Check for a varint type, just for good measure.
+ repeated int32 repeated_int32 = 13;
+
+ // These have two-byte tags.
+ repeated fixed64 repeated_fixed64 = 2046;
+ repeated int64 repeated_int64 = 2047;
+
+ // Three byte tags.
+ repeated float repeated_float = 262142;
+ repeated uint64 repeated_uint64 = 262143;
+}
+
+// Test that if an optional or required message/group field appears multiple
+// times in the input, they need to be merged.
+message TestParsingMerge {
+ // RepeatedFieldsGenerator defines matching field types as TestParsingMerge,
+ // except that all fields are repeated. In the tests, we will serialize the
+ // RepeatedFieldsGenerator to bytes, and parse the bytes to TestParsingMerge.
+ // Repeated fields in RepeatedFieldsGenerator are expected to be merged into
+ // the corresponding required/optional fields in TestParsingMerge.
+ message RepeatedFieldsGenerator {
+ repeated TestAllTypes field1 = 1;
+ repeated TestAllTypes field2 = 2;
+ repeated TestAllTypes field3 = 3;
+ repeated group Group1 = 10 {
+ optional TestAllTypes field1 = 11;
+ }
+ repeated group Group2 = 20 {
+ optional TestAllTypes field1 = 21;
+ }
+ repeated TestAllTypes ext1 = 1000;
+ repeated TestAllTypes ext2 = 1001;
+ }
+ required TestAllTypes required_all_types = 1;
+ optional TestAllTypes optional_all_types = 2;
+ repeated TestAllTypes repeated_all_types = 3;
+ optional group OptionalGroup = 10 {
+ optional TestAllTypes optional_group_all_types = 11;
+ }
+ repeated group RepeatedGroup = 20 {
+ optional TestAllTypes repeated_group_all_types = 21;
+ }
+ extensions 1000 to max;
+ extend TestParsingMerge {
+ optional TestAllTypes optional_ext = 1000;
+ repeated TestAllTypes repeated_ext = 1001;
+ }
+}
+
+// Test that the correct exception is thrown by parseFrom in a corner case
+// involving merging, extensions, and required fields.
+message TestMergeException {
+ optional TestAllExtensions all_extensions = 1;
+}
+
+message TestCommentInjectionMessage {
+ // */ <- This should not close the generated doc comment
+ optional string a = 1 [default="*/ <- Neither should this."];
+}
+
+// Used to check that the c++ code generator re-orders messages to reduce
+// padding.
+message TestMessageSize {
+ optional bool m1 = 1;
+ optional int64 m2 = 2;
+ optional bool m3 = 3;
+ optional string m4 = 4;
+ optional int32 m5 = 5;
+ optional int64 m6 = 6;
+}
+
+
+// Test that RPC services work.
+message FooRequest {}
+message FooResponse {}
+
+message FooClientMessage {}
+message FooServerMessage{}
+
+service TestService {
+ rpc Foo(FooRequest) returns (FooResponse);
+ rpc Bar(BarRequest) returns (BarResponse);
+}
+
+
+message BarRequest {}
+message BarResponse {}
+
+message TestJsonName {
+ optional int32 field_name1 = 1;
+ optional int32 fieldName2 = 2;
+ optional int32 FieldName3 = 3;
+ optional int32 _field_name4 = 4;
+ optional int32 FIELD_NAME5 = 5;
+ optional int32 field_name6 = 6 [json_name = "@type"];
+ optional int32 fieldname7 = 7;
+}
+
+message TestHugeFieldNumbers {
+ optional int32 optional_int32 = 536870000;
+ optional int32 fixed_32 = 536870001;
+ repeated int32 repeated_int32 = 536870002 [packed = false];
+ repeated int32 packed_int32 = 536870003 [packed = true];
+
+ optional ForeignEnum optional_enum = 536870004;
+ optional string optional_string = 536870005;
+ optional bytes optional_bytes = 536870006;
+ optional ForeignMessage optional_message = 536870007;
+
+ optional group OptionalGroup = 536870008 {
+ optional int32 group_a = 536870009;
+ }
+
+ map<string, string> string_string_map = 536870010;
+
+ oneof oneof_field {
+ uint32 oneof_uint32 = 536870011;
+ TestAllTypes oneof_test_all_types = 536870012;
+ string oneof_string = 536870013;
+ bytes oneof_bytes = 536870014;
+ }
+
+ extensions 536860000 to 536869999;
+}
+
+extend TestHugeFieldNumbers {
+ optional TestAllTypes test_all_types = 536860000;
+}
+
+message TestExtensionInsideTable {
+ optional int32 field1 = 1;
+ optional int32 field2 = 2;
+ optional int32 field3 = 3;
+ optional int32 field4 = 4;
+ extensions 5 to 5;
+ optional int32 field6 = 6;
+ optional int32 field7 = 7;
+ optional int32 field8 = 8;
+ optional int32 field9 = 9;
+ optional int32 field10 = 10;
+}
+
+extend TestExtensionInsideTable {
+ optional int32 test_extension_inside_table_extension = 5;
+}
+
+// NOTE(b/202996544): Intentionally nested to mirror go/glep.
+message TestNestedGroupExtensionOuter {
+ optional group Layer1OptionalGroup = 1 {
+ repeated group Layer2RepeatedGroup = 2 {
+ extensions 3
+ // NOTE: extension metadata is not supported due to targets such as
+ // `//third_party/protobuf_legacy_opensource/src:shell_scripts_test`,
+ // eee https://screenshot.googleplex.com/Axz2QD8nxjdpyFF
+ //[metadata = {
+ // NOTE: can't write type there due to some clever build gen code at
+ // http://google3/net/proto2/internal/BUILD;l=1247;rcl=411090862
+ // type: "objc.protobuf.tests.TestNestedGroupExtensionInnerExtension",
+ // name: "inner",
+ // }]
+ ;
+ optional string another_field = 6;
+ }
+ repeated group Layer2AnotherOptionalRepeatedGroup = 4 {
+ optional string but_why_tho = 5;
+ }
+ }
+}
+
+message TestNestedGroupExtensionInnerExtension {
+ optional string inner_name= 1;
+}
+
+extend TestNestedGroupExtensionOuter.Layer1OptionalGroup.Layer2RepeatedGroup {
+ optional TestNestedGroupExtensionInnerExtension inner = 3;
+}
+
+enum VeryLargeEnum {
+ ENUM_LABEL_DEFAULT = 0;
+ ENUM_LABEL_1 = 1;
+ ENUM_LABEL_2 = 2;
+ ENUM_LABEL_3 = 3;
+ ENUM_LABEL_4 = 4;
+ ENUM_LABEL_5 = 5;
+ ENUM_LABEL_6 = 6;
+ ENUM_LABEL_7 = 7;
+ ENUM_LABEL_8 = 8;
+ ENUM_LABEL_9 = 9;
+ ENUM_LABEL_10 = 10;
+ ENUM_LABEL_11 = 11;
+ ENUM_LABEL_12 = 12;
+ ENUM_LABEL_13 = 13;
+ ENUM_LABEL_14 = 14;
+ ENUM_LABEL_15 = 15;
+ ENUM_LABEL_16 = 16;
+ ENUM_LABEL_17 = 17;
+ ENUM_LABEL_18 = 18;
+ ENUM_LABEL_19 = 19;
+ ENUM_LABEL_20 = 20;
+ ENUM_LABEL_21 = 21;
+ ENUM_LABEL_22 = 22;
+ ENUM_LABEL_23 = 23;
+ ENUM_LABEL_24 = 24;
+ ENUM_LABEL_25 = 25;
+ ENUM_LABEL_26 = 26;
+ ENUM_LABEL_27 = 27;
+ ENUM_LABEL_28 = 28;
+ ENUM_LABEL_29 = 29;
+ ENUM_LABEL_30 = 30;
+ ENUM_LABEL_31 = 31;
+ ENUM_LABEL_32 = 32;
+ ENUM_LABEL_33 = 33;
+ ENUM_LABEL_34 = 34;
+ ENUM_LABEL_35 = 35;
+ ENUM_LABEL_36 = 36;
+ ENUM_LABEL_37 = 37;
+ ENUM_LABEL_38 = 38;
+ ENUM_LABEL_39 = 39;
+ ENUM_LABEL_40 = 40;
+ ENUM_LABEL_41 = 41;
+ ENUM_LABEL_42 = 42;
+ ENUM_LABEL_43 = 43;
+ ENUM_LABEL_44 = 44;
+ ENUM_LABEL_45 = 45;
+ ENUM_LABEL_46 = 46;
+ ENUM_LABEL_47 = 47;
+ ENUM_LABEL_48 = 48;
+ ENUM_LABEL_49 = 49;
+ ENUM_LABEL_50 = 50;
+ ENUM_LABEL_51 = 51;
+ ENUM_LABEL_52 = 52;
+ ENUM_LABEL_53 = 53;
+ ENUM_LABEL_54 = 54;
+ ENUM_LABEL_55 = 55;
+ ENUM_LABEL_56 = 56;
+ ENUM_LABEL_57 = 57;
+ ENUM_LABEL_58 = 58;
+ ENUM_LABEL_59 = 59;
+ ENUM_LABEL_60 = 60;
+ ENUM_LABEL_61 = 61;
+ ENUM_LABEL_62 = 62;
+ ENUM_LABEL_63 = 63;
+ ENUM_LABEL_64 = 64;
+ ENUM_LABEL_65 = 65;
+ ENUM_LABEL_66 = 66;
+ ENUM_LABEL_67 = 67;
+ ENUM_LABEL_68 = 68;
+ ENUM_LABEL_69 = 69;
+ ENUM_LABEL_70 = 70;
+ ENUM_LABEL_71 = 71;
+ ENUM_LABEL_72 = 72;
+ ENUM_LABEL_73 = 73;
+ ENUM_LABEL_74 = 74;
+ ENUM_LABEL_75 = 75;
+ ENUM_LABEL_76 = 76;
+ ENUM_LABEL_77 = 77;
+ ENUM_LABEL_78 = 78;
+ ENUM_LABEL_79 = 79;
+ ENUM_LABEL_80 = 80;
+ ENUM_LABEL_81 = 81;
+ ENUM_LABEL_82 = 82;
+ ENUM_LABEL_83 = 83;
+ ENUM_LABEL_84 = 84;
+ ENUM_LABEL_85 = 85;
+ ENUM_LABEL_86 = 86;
+ ENUM_LABEL_87 = 87;
+ ENUM_LABEL_88 = 88;
+ ENUM_LABEL_89 = 89;
+ ENUM_LABEL_90 = 90;
+ ENUM_LABEL_91 = 91;
+ ENUM_LABEL_92 = 92;
+ ENUM_LABEL_93 = 93;
+ ENUM_LABEL_94 = 94;
+ ENUM_LABEL_95 = 95;
+ ENUM_LABEL_96 = 96;
+ ENUM_LABEL_97 = 97;
+ ENUM_LABEL_98 = 98;
+ ENUM_LABEL_99 = 99;
+ ENUM_LABEL_100 = 100;
+};
+
+message TestExtensionRangeSerialize {
+ optional int32 foo_one = 1;
+
+ extensions 2 to 2;
+ extensions 3 to 4;
+
+ optional int32 foo_two = 6;
+ optional int32 foo_three = 7;
+
+ extensions 9 to 10;
+
+ optional int32 foo_four = 13;
+
+ extensions 15 to 15;
+ extensions 17 to 17;
+ extensions 19 to 19;
+
+ extend TestExtensionRangeSerialize {
+ optional int32 bar_one = 2;
+ optional int32 bar_two = 4;
+
+ optional int32 bar_three = 10;
+
+ optional int32 bar_four = 15;
+ optional int32 bar_five = 19;
+ }
+}
+
+message TestVerifyInt32Simple {
+ optional int32 optional_int32_1 = 1;
+ optional int32 optional_int32_2 = 2;
+ optional int32 optional_int32_63 = 63;
+ optional int32 optional_int32_64 = 64;
+}
+
+message TestVerifyInt32 {
+ optional int32 optional_int32_1 = 1;
+ optional int32 optional_int32_2 = 2;
+ optional int32 optional_int32_63 = 63;
+ optional int32 optional_int32_64 = 64;
+
+ optional TestAllTypes optional_all_types = 9;
+ repeated TestAllTypes repeated_all_types = 10;
+}
+
+message TestVerifyMostlyInt32 {
+ optional int64 optional_int64_30 = 30;
+
+ optional int32 optional_int32_1 = 1;
+ optional int32 optional_int32_2 = 2;
+ optional int32 optional_int32_3 = 3;
+ optional int32 optional_int32_4 = 4;
+ optional int32 optional_int32_63 = 63;
+ optional int32 optional_int32_64 = 64;
+
+ optional TestAllTypes optional_all_types = 9;
+ repeated TestAllTypes repeated_all_types = 10;
+}
+
+message TestVerifyMostlyInt32BigFieldNumber {
+ optional int64 optional_int64_30 = 30;
+ optional int32 optional_int32_300 = 300;
+
+ optional int32 optional_int32_1 = 1;
+ optional int32 optional_int32_2 = 2;
+ optional int32 optional_int32_3 = 3;
+ optional int32 optional_int32_4 = 4;
+ optional int32 optional_int32_63 = 63;
+ optional int32 optional_int32_64 = 64;
+
+ optional TestAllTypes optional_all_types = 9;
+ repeated TestAllTypes repeated_all_types = 10;
+}
+
+message TestVerifyUint32Simple {
+ optional uint32 optional_uint32_1 = 1;
+ optional uint32 optional_uint32_2 = 2;
+ optional uint32 optional_uint32_63 = 63;
+ optional uint32 optional_uint32_64 = 64;
+}
+
+message TestVerifyUint32 {
+ optional uint32 optional_uint32_1 = 1;
+ optional uint32 optional_uint32_2 = 2;
+ optional uint32 optional_uint32_63 = 63;
+ optional uint32 optional_uint32_64 = 64;
+
+ optional TestAllTypes optional_all_types = 9;
+ repeated TestAllTypes repeated_all_types = 10;
+}
+
+message TestVerifyOneUint32 {
+ optional uint32 optional_uint32_1 = 1;
+ optional int32 optional_int32_2 = 2;
+ optional int32 optional_int32_63 = 63;
+ optional int32 optional_int32_64 = 64;
+
+ optional TestAllTypes optional_all_types = 9;
+ repeated TestAllTypes repeated_all_types = 10;
+}
+
+message TestVerifyOneInt32BigFieldNumber {
+ optional int32 optional_int32_65 = 65;
+
+ optional int64 optional_int64_1 = 1;
+ optional int64 optional_int64_2 = 2;
+ optional int64 optional_int64_63 = 63;
+ optional int64 optional_int64_64 = 64;
+
+ optional TestAllTypes optional_all_types = 9;
+ repeated TestAllTypes repeated_all_types = 10;
+}
+
+message TestVerifyInt32BigFieldNumber {
+ optional int32 optional_int32_1000 = 1000;
+ optional int32 optional_int32_65 = 65;
+
+ optional int32 optional_int32_1 = 1;
+ optional int32 optional_int32_2 = 2;
+ optional int32 optional_int32_63 = 63;
+ optional int32 optional_int32_64 = 64;
+
+ optional TestAllTypes optional_all_types = 9;
+ repeated TestAllTypes repeated_all_types = 10;
+}
+
+message TestVerifyUint32BigFieldNumber {
+ optional uint32 optional_uint32_1000 = 1000;
+ optional uint32 optional_uint32_65 = 65;
+
+ optional uint32 optional_uint32_1 = 1;
+ optional uint32 optional_uint32_2 = 2;
+ optional uint32 optional_uint32_63 = 63;
+ optional uint32 optional_uint32_64 = 64;
+
+ optional TestAllTypes optional_all_types = 9;
+ repeated TestAllTypes repeated_all_types = 10;
+}
+
+message TestVerifyBigFieldNumberUint32 {
+ message Nested {
+ optional uint32 optional_uint32_5000 = 5000;
+ optional uint32 optional_uint32_1000 = 1000;
+ optional uint32 optional_uint32_66 = 66;
+ optional uint32 optional_uint32_65 = 65;
+
+ optional uint32 optional_uint32_1 = 1;
+ optional uint32 optional_uint32_2 = 2;
+ optional uint32 optional_uint32_63 = 63;
+ optional uint32 optional_uint32_64 = 64;
+
+ optional Nested optional_nested = 9;
+ repeated Nested repeated_nested = 10;
+ }
+ optional Nested optional_nested = 1;
+}
+
+
+// This message contains different kind of enums to exercise the different
+// parsers in table-driven.
+message EnumParseTester {
+ enum SeqSmall0 {
+ SEQ_SMALL_0_DEFAULT = 0;
+ SEQ_SMALL_0_1 = 1;
+ SEQ_SMALL_0_2 = 2;
+ };
+ optional SeqSmall0 optional_seq_small_0_lowfield = 1;
+ optional SeqSmall0 optional_seq_small_0_midfield = 1001;
+ optional SeqSmall0 optional_seq_small_0_hifield = 1000001;
+ repeated SeqSmall0 repeated_seq_small_0_lowfield = 2;
+ repeated SeqSmall0 repeated_seq_small_0_midfield = 1002;
+ repeated SeqSmall0 repeated_seq_small_0_hifield = 1000002;
+ repeated SeqSmall0 packed_seq_small_0_lowfield = 3 [packed = true];
+ repeated SeqSmall0 packed_seq_small_0_midfield = 1003 [packed = true];
+ repeated SeqSmall0 packed_seq_small_0_hifield = 1000003 [packed = true];
+
+ enum SeqSmall1 {
+ SEQ_SMALL_1_DEFAULT = 1;
+ SEQ_SMALL_1_2 = 2;
+ SEQ_SMALL_1_3 = 3;
+ };
+ optional SeqSmall1 optional_seq_small_1_lowfield = 4;
+ optional SeqSmall1 optional_seq_small_1_midfield = 1004;
+ optional SeqSmall1 optional_seq_small_1_hifield = 1000004;
+ repeated SeqSmall1 repeated_seq_small_1_lowfield = 5;
+ repeated SeqSmall1 repeated_seq_small_1_midfield = 1005;
+ repeated SeqSmall1 repeated_seq_small_1_hifield = 1000005;
+ repeated SeqSmall1 packed_seq_small_1_lowfield = 6 [packed = true];
+ repeated SeqSmall1 packed_seq_small_1_midfield = 1006 [packed = true];
+ repeated SeqSmall1 packed_seq_small_1_hifield = 1000006 [packed = true];
+
+ enum SeqLarge {
+ SEQ_LARGE_DEFAULT = -1;
+ SEQ_LARGE_0 = 0;
+ SEQ_LARGE_1 = 1;
+ SEQ_LARGE_2 = 2;
+ SEQ_LARGE_3 = 3;
+ SEQ_LARGE_4 = 4;
+ SEQ_LARGE_5 = 5;
+ SEQ_LARGE_6 = 6;
+ SEQ_LARGE_7 = 7;
+ SEQ_LARGE_8 = 8;
+ SEQ_LARGE_9 = 9;
+ SEQ_LARGE_10 = 10;
+ SEQ_LARGE_11 = 11;
+ SEQ_LARGE_12 = 12;
+ SEQ_LARGE_13 = 13;
+ SEQ_LARGE_14 = 14;
+ SEQ_LARGE_15 = 15;
+ SEQ_LARGE_16 = 16;
+ SEQ_LARGE_17 = 17;
+ SEQ_LARGE_18 = 18;
+ SEQ_LARGE_19 = 19;
+ SEQ_LARGE_20 = 20;
+ SEQ_LARGE_21 = 21;
+ SEQ_LARGE_22 = 22;
+ SEQ_LARGE_23 = 23;
+ SEQ_LARGE_24 = 24;
+ SEQ_LARGE_25 = 25;
+ SEQ_LARGE_26 = 26;
+ SEQ_LARGE_27 = 27;
+ SEQ_LARGE_28 = 28;
+ SEQ_LARGE_29 = 29;
+ SEQ_LARGE_30 = 30;
+ SEQ_LARGE_31 = 31;
+ SEQ_LARGE_32 = 32;
+ SEQ_LARGE_33 = 33;
+ };
+ optional SeqLarge optional_seq_large_lowfield = 7;
+ optional SeqLarge optional_seq_large_midfield = 1007;
+ optional SeqLarge optional_seq_large_hifield = 1000007;
+ repeated SeqLarge repeated_seq_large_lowfield = 8;
+ repeated SeqLarge repeated_seq_large_midfield = 1008;
+ repeated SeqLarge repeated_seq_large_hifield = 1000008;
+ repeated SeqLarge packed_seq_large_lowfield = 9 [packed = true];
+ repeated SeqLarge packed_seq_large_midfield = 1009 [packed = true];
+ repeated SeqLarge packed_seq_large_hifield = 1000009 [packed = true];
+
+ enum Arbitrary {
+ ARBITRARY_DEFAULT = -123123;
+ ARBITRARY_1 = -123;
+ ARBITRARY_2 = 213;
+ ARBITRARY_3 = 213213;
+ ARBITRARY_MIN = -2147483648;
+ ARBITRARY_MAX = 2147483647;
+ };
+ optional Arbitrary optional_arbitrary_lowfield = 10;
+ optional Arbitrary optional_arbitrary_midfield = 1010;
+ optional Arbitrary optional_arbitrary_hifield = 1000010;
+ repeated Arbitrary repeated_arbitrary_lowfield = 11;
+ repeated Arbitrary repeated_arbitrary_midfield = 1011;
+ repeated Arbitrary repeated_arbitrary_hifield = 1000011;
+ repeated Arbitrary packed_arbitrary_lowfield = 12 [packed = true];
+ repeated Arbitrary packed_arbitrary_midfield = 1012 [packed = true];
+ repeated Arbitrary packed_arbitrary_hifield = 1000012 [packed = true];
+
+ // An arbitrary field we can append to to break the runs of repeated fields.
+ optional int32 other_field = 99;
+};
+
+// This message contains different kind of bool fields to exercise the different
+// parsers in table-drived.
+message BoolParseTester {
+ optional bool optional_bool_lowfield = 1;
+ optional bool optional_bool_midfield = 1001;
+ optional bool optional_bool_hifield = 1000001;
+ repeated bool repeated_bool_lowfield = 2;
+ repeated bool repeated_bool_midfield = 1002;
+ repeated bool repeated_bool_hifield = 1000002;
+ repeated bool packed_bool_lowfield = 3 [packed = true];
+ repeated bool packed_bool_midfield = 1003 [packed = true];
+ repeated bool packed_bool_hifield = 1000003 [packed = true];
+
+ // An arbitrary field we can append to to break the runs of repeated fields.
+ optional int32 other_field = 99;
+};
+
diff --git a/objectivec/Tests/unittest_cycle.proto b/objectivec/Tests/unittest_cycle.proto
index afc1b0f..91e33ce 100644
--- a/objectivec/Tests/unittest_cycle.proto
+++ b/objectivec/Tests/unittest_cycle.proto
@@ -29,7 +29,9 @@
syntax = "proto2";
-package protobuf_unittest;
+package objc.protobuf.tests.cycle;
+
+option objc_class_prefix = "Cycle";
// Cycles in the Message graph can cause problems for message class
// initialization order.
@@ -37,20 +39,20 @@
// You can't make a object graph that spans files, so this can only be done
// within a single proto file.
-message CycleFoo {
- optional CycleFoo a_foo = 1;
- optional CycleBar a_bar = 2;
- optional CycleBaz a_baz = 3;
+message Foo {
+ optional Foo a_foo = 1;
+ optional Bar a_bar = 2;
+ optional Baz a_baz = 3;
}
-message CycleBar {
- optional CycleBar a_bar = 1;
- optional CycleBaz a_baz = 2;
- optional CycleFoo a_foo = 3;
+message Bar {
+ optional Bar a_bar = 1;
+ optional Baz a_baz = 2;
+ optional Foo a_foo = 3;
}
-message CycleBaz {
- optional CycleBaz a_baz = 1;
- optional CycleFoo a_foo = 2;
- optional CycleBar a_bar = 3;
+message Baz {
+ optional Baz a_baz = 1;
+ optional Foo a_foo = 2;
+ optional Bar a_bar = 3;
}
diff --git a/objectivec/Tests/unittest_deprecated.proto b/objectivec/Tests/unittest_deprecated.proto
index 96a52bb..aa06a06 100644
--- a/objectivec/Tests/unittest_deprecated.proto
+++ b/objectivec/Tests/unittest_deprecated.proto
@@ -29,7 +29,7 @@
syntax = "proto2";
-package protobuf_deprecated;
+package objc.protobuf.tests.deprecated;
option objc_class_prefix = "Dep";
//
diff --git a/objectivec/Tests/unittest_deprecated_file.proto b/objectivec/Tests/unittest_deprecated_file.proto
index ef92e7d..b32b4b4 100644
--- a/objectivec/Tests/unittest_deprecated_file.proto
+++ b/objectivec/Tests/unittest_deprecated_file.proto
@@ -29,7 +29,7 @@
syntax = "proto2";
-package protobuf_deprecated_file;
+package objc.protobuf.tests.deprecated_file;
option objc_class_prefix = "FileDep";
//
diff --git a/objectivec/Tests/unittest_extension_chain_a.proto b/objectivec/Tests/unittest_extension_chain_a.proto
index 6a227eb..2e09a40 100644
--- a/objectivec/Tests/unittest_extension_chain_a.proto
+++ b/objectivec/Tests/unittest_extension_chain_a.proto
@@ -29,23 +29,25 @@
syntax = "proto2";
-package protobuf_unittest;
+package objc.protobuf.tests.chain;
-import "google/protobuf/unittest.proto";
+import "objectivec/Tests/unittest.proto";
-import "unittest_extension_chain_b.proto";
-import "unittest_extension_chain_c.proto";
-import "unittest_extension_chain_d.proto";
+import "objectivec/Tests/unittest_extension_chain_b.proto";
+import "objectivec/Tests/unittest_extension_chain_c.proto";
+import "objectivec/Tests/unittest_extension_chain_d.proto";
+
+option objc_class_prefix = "Chain";
// The Root for this file should end up adding the local extension and merging
// in the extensions from D's Root (unittest and C will come via D's).
-message ChainAMessage {
- optional ChainBMessage b = 1;
- optional ChainCMessage c = 2;
- optional ChainDMessage d = 3;
+message AMessage {
+ optional BMessage b = 1;
+ optional CMessage c = 2;
+ optional DMessage d = 3;
}
-extend TestAllExtensions {
+extend objc.protobuf.tests.TestAllExtensions {
optional int32 chain_a_extension = 10001;
}
diff --git a/objectivec/Tests/unittest_extension_chain_b.proto b/objectivec/Tests/unittest_extension_chain_b.proto
index 0da7ed3..5cf7ea3 100644
--- a/objectivec/Tests/unittest_extension_chain_b.proto
+++ b/objectivec/Tests/unittest_extension_chain_b.proto
@@ -29,19 +29,21 @@
syntax = "proto2";
-package protobuf_unittest;
+package objc.protobuf.tests.chain;
-import "google/protobuf/unittest.proto";
+import "objectivec/Tests/unittest.proto";
-import "unittest_extension_chain_c.proto";
+import "objectivec/Tests/unittest_extension_chain_c.proto";
+
+option objc_class_prefix = "Chain";
// The Root for this file should end up adding the local extension and merging
// in the extensions from C's Root (unittest will come via C's).
-message ChainBMessage {
- optional ChainCMessage c = 1;
+message BMessage {
+ optional CMessage c = 1;
}
-extend TestAllExtensions {
+extend objc.protobuf.tests.TestAllExtensions {
optional int32 chain_b_extension = 10002;
}
diff --git a/objectivec/Tests/unittest_extension_chain_c.proto b/objectivec/Tests/unittest_extension_chain_c.proto
index c702900..b07b288 100644
--- a/objectivec/Tests/unittest_extension_chain_c.proto
+++ b/objectivec/Tests/unittest_extension_chain_c.proto
@@ -29,17 +29,19 @@
syntax = "proto2";
-package protobuf_unittest;
+package objc.protobuf.tests.chain;
-import "google/protobuf/unittest.proto";
+import "objectivec/Tests/unittest.proto";
+
+option objc_class_prefix = "Chain";
// The Root for this file should end up adding the local extension and merging
// in the extensions from unittest.proto's Root.
-message ChainCMessage {
+message CMessage {
optional int32 my_field = 1;
}
-extend TestAllExtensions {
+extend objc.protobuf.tests.TestAllExtensions {
optional int32 chain_c_extension = 10003;
}
diff --git a/objectivec/Tests/unittest_extension_chain_d.proto b/objectivec/Tests/unittest_extension_chain_d.proto
index f9abe3b..44d9ee8 100644
--- a/objectivec/Tests/unittest_extension_chain_d.proto
+++ b/objectivec/Tests/unittest_extension_chain_d.proto
@@ -29,21 +29,23 @@
syntax = "proto2";
-package protobuf_unittest;
+package objc.protobuf.tests.chain;
-import "google/protobuf/unittest.proto";
+import "objectivec/Tests/unittest.proto";
-import "unittest_extension_chain_b.proto";
-import "unittest_extension_chain_c.proto";
+import "objectivec/Tests/unittest_extension_chain_b.proto";
+import "objectivec/Tests/unittest_extension_chain_c.proto";
+
+option objc_class_prefix = "Chain";
// The root should end up needing to merge B (C will be merged into B, so it
// doesn't need to be directly merged).
-message ChainDMessage {
- optional ChainBMessage b = 1;
- optional ChainCMessage c = 2;
+message DMessage {
+ optional BMessage b = 1;
+ optional CMessage c = 2;
}
-extend TestAllExtensions {
+extend objc.protobuf.tests.TestAllExtensions {
optional int32 chain_d_extension = 10004;
}
diff --git a/objectivec/Tests/unittest_extension_chain_e.proto b/objectivec/Tests/unittest_extension_chain_e.proto
index fe11663..9c7cea8 100644
--- a/objectivec/Tests/unittest_extension_chain_e.proto
+++ b/objectivec/Tests/unittest_extension_chain_e.proto
@@ -29,12 +29,14 @@
syntax = "proto2";
-package protobuf_unittest;
+package objc.protobuf.tests.chain;
-import "google/protobuf/unittest.proto";
+import "objectivec/Tests/unittest.proto";
+
+option objc_class_prefix = "Chain";
// The Root for this file should end up just merging in unittest's Root.
-message ChainEMessage {
+message EMessage {
optional TestAllTypes my_field = 1;
}
diff --git a/objectivec/Tests/unittest_extension_chain_f.proto b/objectivec/Tests/unittest_extension_chain_f.proto
index 096598d..33fcaf9 100644
--- a/objectivec/Tests/unittest_extension_chain_f.proto
+++ b/objectivec/Tests/unittest_extension_chain_f.proto
@@ -29,9 +29,11 @@
syntax = "proto2";
-package protobuf_unittest;
+package objc.protobuf.tests.chain;
-import "unittest_extension_chain_g.proto";
+import "objectivec/Tests/unittest_extension_chain_g.proto";
+
+option objc_class_prefix = "Chain";
// The Root for this file should just be merging in the extensions from C's
// Root (because G doesn't define anything itself).
@@ -39,6 +41,6 @@
// The generated source will also have to directly import C's .h file so it can
// compile the reference to C's Root class.
-message ChainFMessage {
- optional ChainGMessage g = 1;
+message FMessage {
+ optional GMessage g = 1;
}
diff --git a/objectivec/Tests/unittest_extension_chain_g.proto b/objectivec/Tests/unittest_extension_chain_g.proto
index aee827b..9044e46 100644
--- a/objectivec/Tests/unittest_extension_chain_g.proto
+++ b/objectivec/Tests/unittest_extension_chain_g.proto
@@ -29,13 +29,15 @@
syntax = "proto2";
-package protobuf_unittest;
+package objc.protobuf.tests.chain;
-import "unittest_extension_chain_c.proto";
+import "objectivec/Tests/unittest_extension_chain_c.proto";
+
+option objc_class_prefix = "Chain";
// The Root for this file should just be merging in the extensions from C's
// Root.
-message ChainGMessage {
- optional ChainCMessage c = 1;
+message GMessage {
+ optional CMessage c = 1;
}
diff --git a/objectivec/Tests/GPBCompileTest24.m b/objectivec/Tests/unittest_import.proto
similarity index 77%
rename from objectivec/Tests/GPBCompileTest24.m
rename to objectivec/Tests/unittest_import.proto
index c81ea73..8b8996f 100644
--- a/objectivec/Tests/GPBCompileTest24.m
+++ b/objectivec/Tests/unittest_import.proto
@@ -28,15 +28,31 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+// A proto file which is imported by unittest.proto to test importing.
-// This is a test including a single header to ensure things build. This
-// is NOT a public header of the library, but uses a file that defines
-// proto2 syntax messages that are extendable, so it can need more things
-// that the proto3 syntax WKTs bundled with the library.
+syntax = "proto2";
-#import "google/protobuf/Descriptor.pbobjc.h"
+package objc.protobuf.tests.import;
+
+// Test public import
+import public "objectivec/Tests/unittest_import_public.proto";
+
+option objc_class_prefix = "Import";
+
+message Message {
+ optional int32 d = 1;
+}
+
+enum Enum {
+ IMPORT_FOO = 7;
+ IMPORT_BAR = 8;
+ IMPORT_BAZ = 9;
+}
-// Something in the body of this file so the compiler/linker won't complain
-// about an empty .o file.
-__attribute__((visibility("default"))) char dummy_symbol_24 = 0;
+// To use an enum in a map, it must has the first value as 0.
+enum EnumForMap {
+ UNKNOWN = 0;
+ FOO = 1;
+ BAR = 2;
+}
diff --git a/src/google/protobuf/stubs/statusor.cc b/objectivec/Tests/unittest_import_public.proto
similarity index 78%
copy from src/google/protobuf/stubs/statusor.cc
copy to objectivec/Tests/unittest_import_public.proto
index 9c0a178..05969b6 100644
--- a/src/google/protobuf/stubs/statusor.cc
+++ b/objectivec/Tests/unittest_import_public.proto
@@ -28,21 +28,14 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/stubs/statusor.h>
+// Author: liujisi@google.com (Pherl Liu)
-#include <google/protobuf/stubs/logging.h>
+syntax = "proto2";
-namespace google {
-namespace protobuf {
-namespace util {
-namespace statusor_internal {
+package objc.protobuf.tests.public_import;
-void StatusOrHelper::Crash(const Status& status) {
- GOOGLE_LOG(FATAL) << "Attempting to fetch value instead of handling error "
- << status.ToString();
+option objc_class_prefix = "PublicImport";
+
+message Message {
+ optional int32 e = 1;
}
-
-} // namespace statusor_internal
-} // namespace util
-} // namespace protobuf
-} // namespace google
diff --git a/objectivec/Tests/GPBCompileTest25.m b/objectivec/Tests/unittest_mset.proto
similarity index 68%
rename from objectivec/Tests/GPBCompileTest25.m
rename to objectivec/Tests/unittest_mset.proto
index 7a482b5..9ff070f 100644
--- a/objectivec/Tests/GPBCompileTest25.m
+++ b/objectivec/Tests/unittest_mset.proto
@@ -28,15 +28,38 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+syntax = "proto2";
-// This is a test including a single header to ensure things build. This
-// is NOT a public header of the library, but uses a file that defines
-// extensions to proto2 syntax messages, so it can need more things
-// that the proto3 syntax WKTs bundled with the library.
+package objc.protobuf.tests.mset;
-#import "google/protobuf/UnittestCustomOptions.pbobjc.h"
+option objc_class_prefix = "MSet";
+// A message with message_set_wire_format.
+message Message {
+ option message_set_wire_format = true;
+ extensions 4 to max;
+}
-// Something in the body of this file so the compiler/linker won't complain
-// about an empty .o file.
-__attribute__((visibility("default"))) char dummy_symbol_25 = 0;
+message MessageExtension1 {
+ extend Message {
+ optional MessageExtension1 message_set_extension = 1545008;
+ }
+ optional int32 i = 15;
+ optional Message recursive = 16;
+ optional string test_aliasing = 17 [ctype = STRING_PIECE];
+}
+
+message MessageExtension2 {
+ extend Message {
+ optional MessageExtension2 message_set_extension = 1547769;
+ }
+ optional string str = 25;
+}
+
+// MessageSet wire format is equivalent to this.
+message RawMessageSet {
+ repeated group Item = 1 {
+ required int32 type_id = 2;
+ required bytes message = 3;
+ }
+}
diff --git a/objectivec/Tests/unittest_objc.proto b/objectivec/Tests/unittest_objc.proto
index 91c2139..c7e4034 100644
--- a/objectivec/Tests/unittest_objc.proto
+++ b/objectivec/Tests/unittest_objc.proto
@@ -30,9 +30,12 @@
syntax = "proto2";
import "google/protobuf/any.proto";
-import "google/protobuf/unittest.proto";
+import "objectivec/Tests/unittest.proto";
-package protobuf_unittest;
+package objc.protobuf.tests;
+
+// Explicit empty prefix, tests some validations code paths also.
+option objc_class_prefix = "";
// Used to check that Headerdocs and appledoc work correctly. If these comments
// are not handled correctly, Xcode will fail to build the tests.
@@ -236,8 +239,7 @@
repeated sint32 byref = 3004 [packed = true];
}
-// Test handing of fields that start with init* since Xcode 5's ARC support
-// doesn't like messages that look like initializers but aren't.
+// Test handing of fields that start with init*.
message ObjCInitFoo {
optional string init_val = 11;
optional int32 init_size = 12;
diff --git a/objectivec/Tests/unittest_objc_options.proto b/objectivec/Tests/unittest_objc_options.proto
index 6129b85..7d3f677 100644
--- a/objectivec/Tests/unittest_objc_options.proto
+++ b/objectivec/Tests/unittest_objc_options.proto
@@ -30,7 +30,8 @@
syntax = "proto2";
-package protobuf_objc_unittest;
+package objc.protobuf.tests.options;
+
option objc_class_prefix = "GPBTEST";
// Verify that enum types and values get the prefix.
@@ -59,3 +60,9 @@
// Verify that classes named the same as prefixes are prefixed.
message GPBTEST {
}
+
+// Tests that lookup deals with prefix.
+message PrefixedParentMessage {
+ message Child {
+ }
+}
diff --git a/objectivec/Tests/unittest_objc_startup.proto b/objectivec/Tests/unittest_objc_startup.proto
index aee7bd5..f2bf9d5 100644
--- a/objectivec/Tests/unittest_objc_startup.proto
+++ b/objectivec/Tests/unittest_objc_startup.proto
@@ -30,20 +30,21 @@
syntax = "proto2";
-package protobuf_objc_unittest;
+package objc.protobuf.tests.startup;
+option objc_class_prefix = "TestObjCStartup";
-message TestObjCStartupMessage {
+message Message {
extensions 1 to max;
}
-extend TestObjCStartupMessage {
+extend Message {
// Singular
optional int32 optional_int32_extension = 1;
repeated int32 repeated_int32_extension = 2;
}
-message TestObjCStartupNested {
- extend TestObjCStartupMessage {
+message Nested {
+ extend Message {
optional string nested_string_extension = 3;
}
}
diff --git a/objectivec/Tests/GPBCompileTest25.m b/objectivec/Tests/unittest_preserve_unknown_enum.proto
similarity index 66%
copy from objectivec/Tests/GPBCompileTest25.m
copy to objectivec/Tests/unittest_preserve_unknown_enum.proto
index 7a482b5..8cdd58d 100644
--- a/objectivec/Tests/GPBCompileTest25.m
+++ b/objectivec/Tests/unittest_preserve_unknown_enum.proto
@@ -28,15 +28,42 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+syntax = "proto3";
-// This is a test including a single header to ensure things build. This
-// is NOT a public header of the library, but uses a file that defines
-// extensions to proto2 syntax messages, so it can need more things
-// that the proto3 syntax WKTs bundled with the library.
+package objc.protobuf.tests.proto3_preserve_unknown_enum;
+option objc_class_prefix = "UnknownEnums";
-#import "google/protobuf/UnittestCustomOptions.pbobjc.h"
+enum MyEnum {
+ FOO = 0;
+ BAR = 1;
+ BAZ = 2;
+}
+enum MyEnumPlusExtra {
+ E_FOO = 0;
+ E_BAR = 1;
+ E_BAZ = 2;
+ E_EXTRA = 3;
+}
-// Something in the body of this file so the compiler/linker won't complain
-// about an empty .o file.
-__attribute__((visibility("default"))) char dummy_symbol_25 = 0;
+message MyMessage {
+ MyEnum e = 1;
+ repeated MyEnum repeated_e = 2;
+ repeated MyEnum repeated_packed_e = 3 [packed=true];
+ repeated MyEnumPlusExtra repeated_packed_unexpected_e = 4; // not packed
+ oneof o {
+ MyEnum oneof_e_1 = 5;
+ MyEnum oneof_e_2 = 6;
+ }
+}
+
+message MyMessagePlusExtra {
+ MyEnumPlusExtra e = 1;
+ repeated MyEnumPlusExtra repeated_e = 2;
+ repeated MyEnumPlusExtra repeated_packed_e = 3 [packed=true];
+ repeated MyEnumPlusExtra repeated_packed_unexpected_e = 4 [packed=true];
+ oneof o {
+ MyEnumPlusExtra oneof_e_1 = 5;
+ MyEnumPlusExtra oneof_e_2 = 6;
+ }
+}
diff --git a/objectivec/Tests/unittest_runtime_proto2.proto b/objectivec/Tests/unittest_runtime_proto2.proto
index ed83502..12c2b1c 100644
--- a/objectivec/Tests/unittest_runtime_proto2.proto
+++ b/objectivec/Tests/unittest_runtime_proto2.proto
@@ -29,7 +29,10 @@
syntax = "proto2";
-package protobuf_unittest;
+// Explicit empty prefix, tests some validations code paths also.
+package objc.protobuf.tests;
+
+option objc_class_prefix = "";
message Message2 {
enum Enum {
diff --git a/objectivec/Tests/unittest_runtime_proto3.proto b/objectivec/Tests/unittest_runtime_proto3.proto
index c2ee5fb..d6d4380 100644
--- a/objectivec/Tests/unittest_runtime_proto3.proto
+++ b/objectivec/Tests/unittest_runtime_proto3.proto
@@ -29,7 +29,10 @@
syntax = "proto3";
-package protobuf_unittest;
+// Explicit empty prefix, tests some validations code paths also.
+package objc.protobuf.tests;
+
+option objc_class_prefix = "";
message Message3 {
enum Enum {
diff --git a/objectivec/generate_well_known_types.sh b/objectivec/generate_well_known_types.sh
index 1b9de6e..0fb9f4c 100755
--- a/objectivec/generate_well_known_types.sh
+++ b/objectivec/generate_well_known_types.sh
@@ -3,16 +3,15 @@
# Run this script to regenerate *.pbobjc.{h,m} for the well known types after
# the protocol compiler changes.
-# HINT: Flags passed to generate_well_known_types.sh will be passed directly
-# to make when building protoc. This is particularly useful for passing
-# -j4 to run 4 jobs simultaneously.
-
set -eu
readonly ScriptDir=$(dirname "$(echo $0 | sed -e "s,^\([^/]\),$(pwd)/\1,")")
readonly ObjCDir="${ScriptDir}"
readonly ProtoRootDir="${ObjCDir}/.."
+# Invoke with BAZEL=bazelisk to use that instead.
+readonly BazelBin="${BAZEL:=bazel}"
+
# Flag for continuous integration to check that everything is current.
CHECK_ONLY=0
if [[ $# -ge 1 && ( "$1" == "--check-only" ) ]] ; then
@@ -30,18 +29,10 @@
exit 1
fi
-if [[ ! -e src/Makefile ]]; then
- cat >&2 << __EOF__
-Could not find src/Makefile. You must run ./configure (and perhaps
-./autogen.sh) first.
-__EOF__
- exit 1
-fi
-
# Make sure the compiler is current.
-cd src
-make $@ protoc
+"${BazelBin}" build $@ //:protoc
+cd src
declare -a RUNTIME_PROTO_FILES=( \
google/protobuf/any.proto \
google/protobuf/api.proto \
@@ -59,7 +50,7 @@
# Generate to a temp directory to see if they match.
TMP_DIR=$(mktemp -d)
trap "rm -rf ${TMP_DIR}" EXIT
-./protoc --objc_out="${TMP_DIR}" ${RUNTIME_PROTO_FILES[@]}
+${ProtoRootDir}/bazel-bin/protoc --objc_out="${TMP_DIR}" ${RUNTIME_PROTO_FILES[@]}
DID_COPY=0
for PROTO_FILE in "${RUNTIME_PROTO_FILES[@]}"; do
@@ -73,6 +64,7 @@
if ! diff "${ObjCDir}/GPB${OBJC_NAME}${EXT}" "${TMP_DIR}/${DIR}/${OBJC_NAME}${EXT}" > /dev/null 2>&1 ; then
if [[ "${CHECK_ONLY}" == 1 ]] ; then
echo "ERROR: The WKTs need to be regenerated! Run $0"
+ diff -u "${ObjCDir}/GPB${OBJC_NAME}${EXT}" "${TMP_DIR}/${DIR}/${OBJC_NAME}${EXT}"
exit 1
fi
diff --git a/php/BUILD.bazel b/php/BUILD.bazel
index dfb0976..1f31466 100644
--- a/php/BUILD.bazel
+++ b/php/BUILD.bazel
@@ -3,19 +3,102 @@
# See also code generation logic under /src/google/protobuf/compiler/php.
load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
+load("//build_defs:internal_shell.bzl", "inline_sh_binary")
+load("//conformance:defs.bzl", "conformance_test")
+
+filegroup(
+ name = "source_files",
+ visibility = [
+ "//conformance:__pkg__",
+ "//php:__pkg__",
+ ],
+ srcs = glob([
+ "ext/google/protobuf/*.h",
+ "ext/google/protobuf/*.c",
+ "src/GPBMetadata/Google/Protobuf/**/*.php",
+ "src/Google/Protobuf/**/*.php",
+ ]) + [
+ "composer.json",
+ "ext/google/protobuf/wkt.inc",
+ "ext/google/protobuf/config.m4",
+ "ext/google/protobuf/package.xml",
+ ],
+)
+
+################################################################################
+# PHP Extension
+################################################################################
+
+inline_sh_binary(
+ name = "build_extension",
+ cmd = """
+ mkdir -p php/ext/google/protobuf/third_party/utf8_range
+ cp third_party/utf8_range/* php/ext/google/protobuf/third_party/utf8_range
+
+ pushd php/ext/google/protobuf
+ phpize
+ ./configure --with-php-config=$$(which php-config)
+ make
+ popd
+ """,
+)
+
+genrule(
+ name = "extension",
+ srcs = [
+ ":source_files",
+ "//third_party/utf8_range:all_files",
+ ],
+ tools = [":build_extension"],
+ outs = ["protobuf.so"],
+ cmd = """
+ ./$(execpath :build_extension) $@
+ cp php/ext/google/protobuf/modules/protobuf.so $(OUTS)
+ """,
+ visibility = ["//visibility:public"],
+)
+
+################################################################################
+# Tests
+################################################################################
+
+conformance_test(
+ name = "conformance_test",
+ failure_list = "//conformance:failure_list_php.txt",
+ testee = "//conformance:conformance_php",
+ text_format_failure_list = "//conformance:text_format_failure_list_php.txt",
+ target_compatible_with = select({
+ "@platforms//os:osx": ["@platforms//:incompatible"],
+ "//conditions:default": [],
+ }),
+)
+
+conformance_test(
+ name = "conformance_test_c",
+ failure_list = "//conformance:failure_list_php_c.txt",
+ testee = "//conformance:conformance_php_c",
+ text_format_failure_list = "//conformance:text_format_failure_list_php.txt",
+ target_compatible_with = select({
+ "@platforms//os:osx": [],
+ "//conditions:default": ["@platforms//:incompatible"],
+ }),
+)
+
+################################################################################
+# Distribution files
+################################################################################
pkg_files(
name = "dist_files",
srcs = glob([
"ext/google/protobuf/**/*",
- "src/GPBMetadata/Google/Protobuf/**/*.php",
- "src/Google/Protobuf/**/*.php",
"tests/*.php",
"tests/*.sh",
"tests/generated_previous/**/*.php",
"tests/proto/**/*.proto",
"tests/proto_previous/*.proto",
]) + [
+ ":source_files",
"BUILD.bazel",
"README.md",
"REFCOUNTING.md",
diff --git a/php/README.md b/php/README.md
index c4292cf..f4e420e 100644
--- a/php/README.md
+++ b/php/README.md
@@ -26,8 +26,6 @@
#### Prerequirements
To install the c extension, the following tools are needed:
-* autoconf
-* automake
* libtool
* make
* gcc
@@ -36,7 +34,7 @@
On Ubuntu, you can install them with:
```
-sudo apt-get install -y php-pear php5-dev autoconf automake libtool make gcc
+sudo apt-get install -y php-pear php-dev libtool make gcc
```
On other platforms, please use the corresponding package managing tool to
install them before proceeding.
@@ -67,6 +65,8 @@
Simply add "google/protobuf" to the 'require' section of composer.json in your
project.
+To use the pure PHP implementation, you need to install bcmath.
+
### Protoc
Once the extension or package is installed, if you wish to generate PHP code
@@ -98,24 +98,18 @@
## Development
-### Docker Image
-
-We provide a docker image for php development, which is also used in our automatic tests:
-```
-docker run --security-opt seccomp=unconfined -it protobuftesting/php_8dbe419c6df1a8b3af0ae3a267c112efb436b45c
-```
-
### Test Native PHP
```
+# Install Dependencies (Linux)
+apt-get install bazel composer php-dev
+
# Download protobuf
git clone https://github.com/protocolbuffers/protobuf.git
cd protobuf
# Build protoc
-./autogen.sh
-./configure
-make -j4
+bazel build :protoc
# Test native php
cd php
diff --git a/php/composer.json b/php/composer.json
index 436142f..0e498fc 100644
--- a/php/composer.json
+++ b/php/composer.json
@@ -30,5 +30,8 @@
"test_valgrind": "./generate_test_protos.sh && ./tests/compile_extension.sh && ZEND_DONT_UNLOAD_MODULES=1 USE_ZEND_ALLOC=0 valgrind --leak-check=full --error-exitcode=1 php -dextension=ext/google/protobuf/modules/protobuf.so vendor/bin/phpunit --bootstrap tests/force_c_ext.php tests",
"test": "./generate_test_protos.sh && vendor/bin/phpunit tests",
"aggregate_metadata_test": "./generate_test_protos.sh --aggregate_metadata && vendor/bin/phpunit tests"
+ },
+ "config": {
+ "process-timeout": 1200
}
}
diff --git a/php/ext/google/protobuf/message.c b/php/ext/google/protobuf/message.c
index 55f4f4d..83c51a4 100644
--- a/php/ext/google/protobuf/message.c
+++ b/php/ext/google/protobuf/message.c
@@ -601,7 +601,7 @@
//
// However, if the user created their own class derived from Message, this
// will trigger an infinite construction loop and blow the stack. We
- // temporarily clear create_object to break this loop (see check in
+ // store this `ce` in a global variable to break the cycle (see the check in
// NameMap_GetMessage()).
NameMap_EnterConstructor(ce);
desc = Descriptor_GetFromClassEntry(ce);
diff --git a/php/generate_descriptor_protos.sh b/php/generate_descriptor_protos.sh
index 9feaa96..0e5be35 100755
--- a/php/generate_descriptor_protos.sh
+++ b/php/generate_descriptor_protos.sh
@@ -5,6 +5,14 @@
set -e
+if [[ -z "${PROTOC}" ]]; then
+ PROTOC=$(realpath protoc)
+fi
+if [ ! -f $PROTOC ]; then
+ bazel build -c opt //:protoc
+ PROTOC=$(realpath bazel-bin/protoc)
+fi
+
if test ! -e src/google/protobuf/stubs/common.h; then
cat >&2 << __EOF__
Could not find source code. Make sure you are running this script from the
@@ -14,8 +22,8 @@
fi
pushd src
-./protoc --php_out=internal:../php/src google/protobuf/descriptor.proto
-./protoc --php_out=internal_generate_c_wkt:../php/src \
+$PROTOC --php_out=internal:../php/src google/protobuf/descriptor.proto
+$PROTOC --php_out=internal_generate_c_wkt:../php/src \
google/protobuf/any.proto \
google/protobuf/api.proto \
google/protobuf/duration.proto \
diff --git a/php/generate_test_protos.sh b/php/generate_test_protos.sh
index 8607499..6d06f95 100755
--- a/php/generate_test_protos.sh
+++ b/php/generate_test_protos.sh
@@ -2,19 +2,17 @@
set -ex
-cd `dirname $0`
+cd `dirname $0`/..
-if ../src/protoc --help > /dev/null; then
- PROTOC=src/protoc
-else
- # Bazel seems to be creating a problematic symlink in
- # _build/out/external/com_google_protobuf, so we remove the _build directory
- # before building protoc.
- (cd .. && bazel build -c opt :protoc)
- PROTOC=bazel-bin/protoc
+if [[ -z "${PROTOC}" ]]; then
+ PROTOC=$(pwd)/protoc
+fi
+if [ ! -f $PROTOC ]; then
+ bazel build -c opt //:protoc
+ PROTOC=$(pwd)/bazel-bin/protoc
fi
-if [[ -d tmp && -z $(find tests/proto ../$PROTOC -newer tmp) ]]; then
+if [[ -d php/tmp && -z $(find php/tests/proto $PROTOC -newer php/tmp) ]]; then
# Generated protos are already present and up to date, so we can skip protoc.
#
# Protoc is very fast, but sometimes it is not available (like if we haven't
@@ -23,10 +21,9 @@
exit 0
fi
-rm -rf tmp
-mkdir -p tmp
+rm -rf php/tmp
+mkdir -p php/tmp
-cd ..
find php/tests/proto -type f -name "*.proto"| xargs $PROTOC --php_out=php/tmp -Isrc -Iphp/tests
if [ "$1" = "--aggregate_metadata" ]; then
diff --git a/php/src/GPBMetadata/Google/Protobuf/Internal/Descriptor.php b/php/src/GPBMetadata/Google/Protobuf/Internal/Descriptor.php
index d71def9..d26f517 100644
--- a/php/src/GPBMetadata/Google/Protobuf/Internal/Descriptor.php
+++ b/php/src/GPBMetadata/Google/Protobuf/Internal/Descriptor.php
@@ -31,6 +31,7 @@
->optional('options', \Google\Protobuf\Internal\GPBType::MESSAGE, 8, 'google.protobuf.internal.FileOptions')
->optional('source_code_info', \Google\Protobuf\Internal\GPBType::MESSAGE, 9, 'google.protobuf.internal.SourceCodeInfo')
->optional('syntax', \Google\Protobuf\Internal\GPBType::STRING, 12)
+ ->optional('edition', \Google\Protobuf\Internal\GPBType::STRING, 13)
->finalizeToPool();
$pool->addMessage('google.protobuf.internal.DescriptorProto', \Google\Protobuf\Internal\DescriptorProto::class)
diff --git a/php/src/Google/Protobuf/Internal/FieldOptions.php b/php/src/Google/Protobuf/Internal/FieldOptions.php
index 665cb06..ea32e7f 100644
--- a/php/src/Google/Protobuf/Internal/FieldOptions.php
+++ b/php/src/Google/Protobuf/Internal/FieldOptions.php
@@ -74,10 +74,8 @@
* implementation must either *always* check its required fields, or *never*
* check its required fields, regardless of whether or not the message has
* been parsed.
- * As of 2021, lazy does no correctness checks on the byte stream during
- * parsing. This may lead to crashes if and when an invalid byte stream is
- * finally parsed upon access.
- * TODO(b/211906113): Enable validation on lazy fields.
+ * As of May 2022, lazy verifies the contents of the byte stream during
+ * parsing. An invalid byte stream will cause the overall parsing to fail.
*
* Generated from protobuf field <code>optional bool lazy = 5 [default = false];</code>
*/
@@ -165,10 +163,8 @@
* implementation must either *always* check its required fields, or *never*
* check its required fields, regardless of whether or not the message has
* been parsed.
- * As of 2021, lazy does no correctness checks on the byte stream during
- * parsing. This may lead to crashes if and when an invalid byte stream is
- * finally parsed upon access.
- * TODO(b/211906113): Enable validation on lazy fields.
+ * As of May 2022, lazy verifies the contents of the byte stream during
+ * parsing. An invalid byte stream will cause the overall parsing to fail.
* @type bool $unverified_lazy
* unverified_lazy does no correctness checks on the byte stream. This should
* only be used where lazy with verification is prohibitive for performance
@@ -354,10 +350,8 @@
* implementation must either *always* check its required fields, or *never*
* check its required fields, regardless of whether or not the message has
* been parsed.
- * As of 2021, lazy does no correctness checks on the byte stream during
- * parsing. This may lead to crashes if and when an invalid byte stream is
- * finally parsed upon access.
- * TODO(b/211906113): Enable validation on lazy fields.
+ * As of May 2022, lazy verifies the contents of the byte stream during
+ * parsing. An invalid byte stream will cause the overall parsing to fail.
*
* Generated from protobuf field <code>optional bool lazy = 5 [default = false];</code>
* @return bool
@@ -402,10 +396,8 @@
* implementation must either *always* check its required fields, or *never*
* check its required fields, regardless of whether or not the message has
* been parsed.
- * As of 2021, lazy does no correctness checks on the byte stream during
- * parsing. This may lead to crashes if and when an invalid byte stream is
- * finally parsed upon access.
- * TODO(b/211906113): Enable validation on lazy fields.
+ * As of May 2022, lazy verifies the contents of the byte stream during
+ * parsing. An invalid byte stream will cause the overall parsing to fail.
*
* Generated from protobuf field <code>optional bool lazy = 5 [default = false];</code>
* @param bool $var
diff --git a/php/src/Google/Protobuf/Internal/FileDescriptorProto.php b/php/src/Google/Protobuf/Internal/FileDescriptorProto.php
index 5ba7db6..d4c7f6b 100644
--- a/php/src/Google/Protobuf/Internal/FileDescriptorProto.php
+++ b/php/src/Google/Protobuf/Internal/FileDescriptorProto.php
@@ -81,11 +81,18 @@
protected $source_code_info = null;
/**
* The syntax of the proto file.
- * The supported values are "proto2" and "proto3".
+ * The supported values are "proto2", "proto3", and "editions".
+ * If `edition` is present, this value must be "editions".
*
* Generated from protobuf field <code>optional string syntax = 12;</code>
*/
protected $syntax = null;
+ /**
+ * The edition of the proto file, which is an opaque string.
+ *
+ * Generated from protobuf field <code>optional string edition = 13;</code>
+ */
+ protected $edition = null;
/**
* Constructor.
@@ -117,7 +124,10 @@
* development tools.
* @type string $syntax
* The syntax of the proto file.
- * The supported values are "proto2" and "proto3".
+ * The supported values are "proto2", "proto3", and "editions".
+ * If `edition` is present, this value must be "editions".
+ * @type string $edition
+ * The edition of the proto file, which is an opaque string.
* }
*/
public function __construct($data = NULL) {
@@ -445,7 +455,8 @@
/**
* The syntax of the proto file.
- * The supported values are "proto2" and "proto3".
+ * The supported values are "proto2", "proto3", and "editions".
+ * If `edition` is present, this value must be "editions".
*
* Generated from protobuf field <code>optional string syntax = 12;</code>
* @return string
@@ -467,7 +478,8 @@
/**
* The syntax of the proto file.
- * The supported values are "proto2" and "proto3".
+ * The supported values are "proto2", "proto3", and "editions".
+ * If `edition` is present, this value must be "editions".
*
* Generated from protobuf field <code>optional string syntax = 12;</code>
* @param string $var
@@ -481,5 +493,41 @@
return $this;
}
+ /**
+ * The edition of the proto file, which is an opaque string.
+ *
+ * Generated from protobuf field <code>optional string edition = 13;</code>
+ * @return string
+ */
+ public function getEdition()
+ {
+ return isset($this->edition) ? $this->edition : '';
+ }
+
+ public function hasEdition()
+ {
+ return isset($this->edition);
+ }
+
+ public function clearEdition()
+ {
+ unset($this->edition);
+ }
+
+ /**
+ * The edition of the proto file, which is an opaque string.
+ *
+ * Generated from protobuf field <code>optional string edition = 13;</code>
+ * @param string $var
+ * @return $this
+ */
+ public function setEdition($var)
+ {
+ GPBUtil::checkString($var, True);
+ $this->edition = $var;
+
+ return $this;
+ }
+
}
diff --git a/php/src/Google/Protobuf/Internal/MessageOptions.php b/php/src/Google/Protobuf/Internal/MessageOptions.php
index 5c61580..96e6f52 100644
--- a/php/src/Google/Protobuf/Internal/MessageOptions.php
+++ b/php/src/Google/Protobuf/Internal/MessageOptions.php
@@ -53,6 +53,9 @@
*/
protected $deprecated = null;
/**
+ * NOTE: Do not set the option in .proto files. Always use the maps syntax
+ * instead. The option should only be implicitly set by the proto compiler
+ * parser.
* Whether the message is an automatically generated map entry type for the
* maps field.
* For maps fields:
@@ -68,9 +71,6 @@
* use a native map in the target language to hold the keys and values.
* The reflection APIs in such implementations still need to work as
* if the field is a repeated message field.
- * NOTE: Do not set the option in .proto files. Always use the maps syntax
- * instead. The option should only be implicitly set by the proto compiler
- * parser.
*
* Generated from protobuf field <code>optional bool map_entry = 7;</code>
*/
@@ -114,6 +114,9 @@
* for the message, or it will be completely ignored; in the very least,
* this is a formalization for deprecating messages.
* @type bool $map_entry
+ * NOTE: Do not set the option in .proto files. Always use the maps syntax
+ * instead. The option should only be implicitly set by the proto compiler
+ * parser.
* Whether the message is an automatically generated map entry type for the
* maps field.
* For maps fields:
@@ -129,9 +132,6 @@
* use a native map in the target language to hold the keys and values.
* The reflection APIs in such implementations still need to work as
* if the field is a repeated message field.
- * NOTE: Do not set the option in .proto files. Always use the maps syntax
- * instead. The option should only be implicitly set by the proto compiler
- * parser.
* @type array<\Google\Protobuf\Internal\UninterpretedOption>|\Google\Protobuf\Internal\RepeatedField $uninterpreted_option
* The parser stores options it doesn't recognize here. See above.
* }
@@ -288,6 +288,9 @@
}
/**
+ * NOTE: Do not set the option in .proto files. Always use the maps syntax
+ * instead. The option should only be implicitly set by the proto compiler
+ * parser.
* Whether the message is an automatically generated map entry type for the
* maps field.
* For maps fields:
@@ -303,9 +306,6 @@
* use a native map in the target language to hold the keys and values.
* The reflection APIs in such implementations still need to work as
* if the field is a repeated message field.
- * NOTE: Do not set the option in .proto files. Always use the maps syntax
- * instead. The option should only be implicitly set by the proto compiler
- * parser.
*
* Generated from protobuf field <code>optional bool map_entry = 7;</code>
* @return bool
@@ -326,6 +326,9 @@
}
/**
+ * NOTE: Do not set the option in .proto files. Always use the maps syntax
+ * instead. The option should only be implicitly set by the proto compiler
+ * parser.
* Whether the message is an automatically generated map entry type for the
* maps field.
* For maps fields:
@@ -341,9 +344,6 @@
* use a native map in the target language to hold the keys and values.
* The reflection APIs in such implementations still need to work as
* if the field is a repeated message field.
- * NOTE: Do not set the option in .proto files. Always use the maps syntax
- * instead. The option should only be implicitly set by the proto compiler
- * parser.
*
* Generated from protobuf field <code>optional bool map_entry = 7;</code>
* @param bool $var
diff --git a/php/tests/PhpImplementationTest.php b/php/tests/PhpImplementationTest.php
index 7187315..38c628d 100644
--- a/php/tests/PhpImplementationTest.php
+++ b/php/tests/PhpImplementationTest.php
@@ -275,13 +275,13 @@
$this->assertSame(0x7FFFFFFE, GPBWire::zigZagEncode64(0x3FFFFFFF));
$this->assertSame(
0x7FFFFFFF,
- GPBWire::zigZagEncode64(0xFFFFFFFFC0000000));
+ GPBWire::zigZagEncode64(-1073741824)); // 0xFFFFFFFFC0000000
$this->assertSame(
0xFFFFFFFE,
GPBWire::zigZagEncode64(0x7FFFFFFF));
$this->assertSame(
0xFFFFFFFF,
- GPBWire::zigZagEncode64(0xFFFFFFFF80000000));
+ GPBWire::zigZagEncode64(-2147483648)); // 0xFFFFFFFF80000000
$this->assertSame(
-2, // 0xFFFFFFFFFFFFFFFE
GPBWire::zigZagEncode64(0x7FFFFFFFFFFFFFFF));
diff --git a/php/tests/compatibility_test.sh b/php/tests/compatibility_test.sh
deleted file mode 100755
index 7e44cce..0000000
--- a/php/tests/compatibility_test.sh
+++ /dev/null
@@ -1,152 +0,0 @@
-#!/bin/bash
-
-function generate_proto() {
- PROTOC1=$1
- PROTOC2=$2
-
- rm -rf generated
- mkdir generated
-
- $PROTOC1 --php_out=generated proto/test_include.proto
- $PROTOC2 --php_out=generated \
- -I../../src -I. \
- proto/empty/echo.proto \
- proto/test.proto \
- proto/test_no_namespace.proto \
- proto/test_prefix.proto \
- proto/test_php_namespace.proto \
- proto/test_empty_php_namespace.proto \
- proto/test_reserved_enum_lower.proto \
- proto/test_reserved_enum_upper.proto \
- proto/test_reserved_enum_value_lower.proto \
- proto/test_reserved_enum_value_upper.proto \
- proto/test_reserved_message_lower.proto \
- proto/test_reserved_message_upper.proto \
- proto/test_service.proto \
- proto/test_service_namespace.proto \
- proto/test_wrapper_type_setters.proto \
- proto/test_descriptors.proto
-
- pushd ../../src
- $PROTOC2 --php_out=../php/tests/generated -I../php/tests -I. ../php/tests/proto/test_import_descriptor_proto.proto
- popd
-}
-
-# Remove tests to expect error. These were added to API tests by mistake.
-function remove_error_test() {
- local TEMPFILE=`tempfile`
- cat $1 | \
- awk -v file=`basename $1` -v dir=`basename $(dirname $1)` '
- BEGIN {
- show = 1
- }
- /@expectedException PHPUnit_Framework_Error/ { show = 0; next; }
- / *\*\// { print; next; }
- / *}/ {
- if (!show) {
- show = 1;
- next;
- }
- }
- show { print }
- ' > $TEMPFILE
- cp $TEMPFILE $1
-}
-
-set -ex
-
-# Change to the script's directory.
-cd $(dirname $0)
-
-OLD_VERSION=$1
-OLD_VERSION_PROTOC=https://repo1.maven.org/maven2/com/google/protobuf/protoc/$OLD_VERSION/protoc-$OLD_VERSION-linux-x86_64.exe
-
-# Extract the latest protobuf version number.
-VERSION_NUMBER=`grep "PHP_PROTOBUF_VERSION" ../ext/google/protobuf/protobuf.h | sed "s|#define PHP_PROTOBUF_VERSION \"\(.*\)\"|\1|"`
-
-echo "Running compatibility tests between current $VERSION_NUMBER and released $OLD_VERSION"
-
-# Check protoc
-[ -f ../../src/protoc ] || {
- echo "[ERROR]: Please build protoc first."
- exit 1
-}
-
-# Download old test.
-rm -rf protobuf
-git clone https://github.com/protocolbuffers/protobuf.git
-pushd protobuf
-git checkout v$OLD_VERSION
-popd
-
-# Build and copy the new runtime
-pushd ../ext/google/protobuf
-make clean || true
-phpize && ./configure && make
-popd
-
-rm -rf protobuf/php/ext
-rm -rf protobuf/php/src
-cp -r ../ext protobuf/php/ext/
-cp -r ../src protobuf/php/src/
-
-# Download old version protoc compiler (for linux)
-wget $OLD_VERSION_PROTOC -O old_protoc
-chmod +x old_protoc
-
-NEW_PROTOC=`pwd`/../../src/protoc
-OLD_PROTOC=`pwd`/old_protoc
-cd protobuf/php
-composer install
-
-# Remove implementation detail tests.
-# TODO(teboring): Temporarily disable encode_decode_test.php. In 3.13.0-rc1,
-# repeated primitive field encoding is changed to packed, which is a bug fix.
-# However, this fails the compatibility test which hard coded old encoding.
-# Will re-enable the test after making a release. After the version bump, the
-# compatibility test will use the updated test code.
-tests=( array_test.php generated_class_test.php map_field_test.php well_known_test.php )
-sed -i.bak '/php_implementation_test.php/d' phpunit.xml
-sed -i.bak '/generated_phpdoc_test.php/d' phpunit.xml
-sed -i.bak '/encode_decode_test.php/d' phpunit.xml
-sed -i.bak 's/generated_phpdoc_test.php//g' tests/test.sh
-sed -i.bak 's/generated_service_test.php//g' tests/test.sh
-sed -i.bak 's/encode_decode_test.php//g' tests/test.sh
-sed -i.bak '/memory_leak_test.php/d' tests/test.sh
-sed -i.bak '/^ public function testTimestamp()$/,/^ }$/d' tests/well_known_test.php
-sed -i.bak 's/PHPUnit_Framework_TestCase/\\PHPUnit\\Framework\\TestCase/g' tests/array_test.php
-sed -i.bak 's/PHPUnit_Framework_TestCase/\\PHPUnit\\Framework\\TestCase/g' tests/map_field_test.php
-sed -i.bak 's/PHPUnit_Framework_TestCase/\\PHPUnit\\Framework\\TestCase/g' tests/test_base.php
-for t in "${tests[@]}"
-do
- remove_error_test tests/$t
-done
-
-cd tests
-
-# Test A.1:
-# proto set 1: use old version
-# proto set 2 which may import protos in set 1: use old version
-generate_proto $OLD_PROTOC $OLD_PROTOC
-./test.sh
-pushd ..
-./vendor/bin/phpunit
-popd
-
-# Test A.2:
-# proto set 1: use new version
-# proto set 2 which may import protos in set 1: use old version
-generate_proto $NEW_PROTOC $OLD_PROTOC
-./test.sh
-pushd ..
-./vendor/bin/phpunit
-popd
-
-# Test A.3:
-# proto set 1: use old version
-# proto set 2 which may import protos in set 1: use new version
-generate_proto $OLD_PROTOC $NEW_PROTOC
-./test.sh
-pushd ..
-./vendor/bin/phpunit
-popd
diff --git a/php/tests/compile_extension.sh b/php/tests/compile_extension.sh
index 3261917..dc42aa3 100755
--- a/php/tests/compile_extension.sh
+++ b/php/tests/compile_extension.sh
@@ -1,6 +1,6 @@
#!/bin/bash
-set -e
+set -ex
cd $(dirname $0)/..
diff --git a/pkg/BUILD.bazel b/pkg/BUILD.bazel
index ecce255..34e60d6 100644
--- a/pkg/BUILD.bazel
+++ b/pkg/BUILD.bazel
@@ -7,7 +7,7 @@
"strip_prefix",
)
load("//:protobuf_release.bzl", "package_naming")
-load(":build_systems.bzl", "gen_automake_file_lists", "gen_file_lists")
+load(":build_systems.bzl", "gen_file_lists")
load(":cc_dist_library.bzl", "cc_dist_library")
package_naming(
@@ -17,17 +17,8 @@
pkg_files(
name = "wkt_protos_files",
srcs = [
- "//:src/google/protobuf/any.proto",
- "//:src/google/protobuf/api.proto",
- "//:src/google/protobuf/descriptor.proto",
- "//:src/google/protobuf/duration.proto",
- "//:src/google/protobuf/empty.proto",
- "//:src/google/protobuf/field_mask.proto",
- "//:src/google/protobuf/source_context.proto",
- "//:src/google/protobuf/struct.proto",
- "//:src/google/protobuf/timestamp.proto",
- "//:src/google/protobuf/type.proto",
- "//:src/google/protobuf/wrappers.proto",
+ "//:well_known_type_protos",
+ "//src/google/protobuf:descriptor_proto_srcs",
],
prefix = "include/google/protobuf",
visibility = ["//visibility:private"],
@@ -35,7 +26,9 @@
pkg_files(
name = "compiler_plugin_protos_files",
- srcs = ["//:src/google/protobuf/compiler/plugin.proto"],
+ srcs = [
+ "//src/google/protobuf/compiler:compiler_plugin_protos_files",
+ ],
prefix = "include/google/protobuf/compiler",
visibility = ["//visibility:private"],
)
@@ -95,10 +88,10 @@
srcs = [
":dist_files",
"//:common_dist_files",
- "//:cpp_dist_files", # to build protoc
- "//benchmarks:all_dist_files",
"//build_defs:dist_files",
"//conformance:all_dist_files",
+ "//src:all_dist_files",
+ "//third_party/utf8_range:dist_files",
"@com_google_protobuf_examples//:dist_files",
],
)
@@ -107,7 +100,7 @@
name = "cpp_srcs",
srcs = [
":dist_common",
- "//:cpp_dist_files",
+ "//src:all_dist_files",
],
)
@@ -229,7 +222,7 @@
name = "python_srcs",
srcs = [
":dist_common",
- "//:python_dist_files",
+ "//python:dist_files",
],
)
@@ -311,30 +304,31 @@
testonly = 1,
out_stem = "src_file_lists",
src_libs = {
- # source rule: name in generated file
- "//:protobuf": "libprotobuf",
- "//:protoc_lib": "libprotoc",
- "//:protobuf_lite": "libprotobuf_lite",
- },
-)
-
-gen_automake_file_lists(
- name = "gen_automake_extra_dist_lists",
- testonly = 1,
- out = "extra_dist_file_lists.am",
- src_libs = {
- # source rule: name in generated file
- "//:common_dist_files": "dist_common",
- "//conformance:dist_files": "dist_conformance",
- "//benchmarks:all_dist_files": "dist_benchmark",
- "@com_google_protobuf_examples//:dist_files": "dist_example",
- "//:csharp_dist_files": "dist_csharp",
- "//csharp:dist_files": "dist_csharp2",
- "//:objectivec_dist_files": "dist_objectivec",
- "//objectivec:dist_files": "dist_objectivec2",
- "//php:dist_files": "dist_php",
- "//:python_dist_files": "dist_python",
- "//ruby:dist_files": "dist_ruby",
+ # {[source rule]: [name in generated file]}
+ # Libraries:
+ ":protobuf": "libprotobuf",
+ ":protobuf_lite": "libprotobuf_lite",
+ ":protoc": "libprotoc",
+ # Protos:
+ "//src/google/protobuf:well_known_type_protos": "wkt_protos",
+ "//src/google/protobuf:descriptor_proto": "descriptor_proto",
+ "//src/google/protobuf/compiler:plugin_proto": "plugin_proto",
+ # Test libraries:
+ ":common_test": "common_test",
+ ":lite_test_util": "lite_test_util",
+ ":test_util": "test_util",
+ # Tests and test-only protos:
+ "//src/google/protobuf:full_test_srcs": "protobuf_test",
+ "//src/google/protobuf:test_proto_srcs": "protobuf_test_protos",
+ "//src/google/protobuf:lite_test_srcs": "protobuf_lite_test",
+ "//src/google/protobuf:lite_test_proto_srcs": "protobuf_lite_test_protos",
+ "//src/google/protobuf/compiler:test_srcs": "compiler_test",
+ "//src/google/protobuf/compiler:test_proto_srcs": "compiler_test_protos",
+ "//src/google/protobuf/compiler:test_plugin_srcs": "test_plugin",
+ "//src/google/protobuf/io:test_srcs": "io_test",
+ "//src/google/protobuf/util:test_srcs": "util_test",
+ "//src/google/protobuf/util:test_proto_srcs": "util_test_protos",
+ "//src/google/protobuf/stubs:test_srcs": "stubs_test",
},
)
@@ -348,8 +342,13 @@
"//build_defs:config_msvc": [],
"//conditions:default": ["-lpthread"],
}),
+ tags = ["manual"],
deps = [
- "//:protobuf_lite",
+ "//src/google/protobuf:arena",
+ "//src/google/protobuf:protobuf_lite",
+ "//src/google/protobuf/io",
+ "//src/google/protobuf/io:io_win32",
+ "//src/google/protobuf/stubs:lite",
],
)
@@ -362,12 +361,97 @@
"-lpthread",
],
}),
+ tags = ["manual"],
deps = [
- "//:protobuf",
- "//:protobuf_lite",
+ "//src/google/protobuf:wkt_cc_proto",
+ "//src/google/protobuf:protobuf_nowkt",
+ "//src/google/protobuf:arena",
+ "//src/google/protobuf:protobuf_lite",
+ "//src/google/protobuf:port_def",
+ "//src/google/protobuf/compiler:importer",
+ "//src/google/protobuf/io",
+ "//src/google/protobuf/io:gzip_stream",
+ "//src/google/protobuf/io:io_win32",
+ "//src/google/protobuf/io:printer",
+ "//src/google/protobuf/io:tokenizer",
+ "//src/google/protobuf/io:zero_copy_sink",
+ "//src/google/protobuf/stubs",
+ "//src/google/protobuf/stubs:lite",
+ "//src/google/protobuf/util:delimited_message_util",
+ "//src/google/protobuf/util:differencer",
+ "//src/google/protobuf/util:field_mask_util",
+ "//src/google/protobuf/util:json_util",
+ "//src/google/protobuf/util:time_util",
+ "//src/google/protobuf/util:type_resolver_util",
+ "//src/google/protobuf/util/internal:constants",
+ "//src/google/protobuf/util/internal:datapiece",
+ "//src/google/protobuf/util/internal:default_value",
+ "//src/google/protobuf/util/internal:field_mask_utility",
+ "//src/google/protobuf/util/internal:json",
+ "//src/google/protobuf/util/internal:object_writer",
+ "//src/google/protobuf/util/internal:protostream",
+ "//src/google/protobuf/util/internal:type_info",
+ "//src/google/protobuf/util/internal:utility",
],
)
+cc_dist_library(
+ name = "protoc",
+ tags = ["manual"],
+ deps = [
+ "//src/google/protobuf/compiler:code_generator",
+ "//src/google/protobuf/compiler:command_line_interface",
+ "//src/google/protobuf/compiler/cpp",
+ "//src/google/protobuf/compiler/cpp:names",
+ "//src/google/protobuf/compiler/cpp:names_internal",
+ "//src/google/protobuf/compiler/csharp",
+ "//src/google/protobuf/compiler/csharp:names",
+ "//src/google/protobuf/compiler/java",
+ "//src/google/protobuf/compiler/java:names",
+ "//src/google/protobuf/compiler/java:names_internal",
+ "//src/google/protobuf/compiler/objectivec",
+ "//src/google/protobuf/compiler/objectivec:names",
+ "//src/google/protobuf/compiler/objectivec:names_internal",
+ "//src/google/protobuf/compiler/php",
+ "//src/google/protobuf/compiler/php:names",
+ "//src/google/protobuf/compiler/python",
+ "//src/google/protobuf/compiler/ruby",
+ ],
+)
+
+cc_dist_library(
+ name = "lite_test_util",
+ testonly = 1,
+ tags = ["manual"],
+ deps = ["//src/google/protobuf:lite_test_util"],
+)
+
+cc_dist_library(
+ name = "test_util",
+ testonly = 1,
+ tags = ["manual"],
+ deps = [
+ "//src/google/protobuf:test_util",
+ "//src/google/protobuf:test_util2",
+ "//src/google/protobuf/util/internal:expecting_objectwriter",
+ "//src/google/protobuf/util/internal:mock_error_listener",
+ "//src/google/protobuf/util/internal:type_info_test_helper",
+ "//src/google/protobuf/compiler:annotation_test_util",
+ "//src/google/protobuf/compiler/cpp:unittest_lib",
+ ],
+)
+
+cc_dist_library(
+ name = "common_test",
+ testonly = 1,
+ tags = ["manual"],
+ deps = [
+ "//src/google/protobuf/testing",
+ "//src/google/protobuf/compiler:mock_code_generator",
+ ],
+)
+
+
################################################################################
# Distribution sources
################################################################################
diff --git a/pkg/build_systems.bzl b/pkg/build_systems.bzl
index 753d285..ce6d429 100644
--- a/pkg/build_systems.bzl
+++ b/pkg/build_systems.bzl
@@ -1,6 +1,7 @@
# Starlark utilities for working with other build systems
load("@rules_pkg//:providers.bzl", "PackageFilegroupInfo", "PackageFilesInfo")
+load(":cc_dist_library.bzl", "CcFileList")
################################################################################
# Macro to create CMake and Automake source lists.
@@ -13,39 +14,18 @@
source_prefix = "${protobuf_SOURCE_DIR}/",
**kwargs
)
- gen_automake_file_lists(
- name = name + "_automake",
- out = out_stem + ".am",
- source_prefix = "$(top_srcdir)/",
- **kwargs
- )
native.filegroup(
name = name,
srcs = [
out_stem + ".cmake",
- out_stem + ".am",
],
+ visibility = ["//src:__pkg__"],
)
################################################################################
# Aspect that extracts srcs, hdrs, etc.
################################################################################
-CcFileList = provider(
- doc = "List of files to be built into a library.",
- fields = {
- # As a rule of thumb, `hdrs` and `textual_hdrs` are the files that
- # would be installed along with a prebuilt library.
- "hdrs": "public header files, including those used by generated code",
- "textual_hdrs": "files which are included but are not self-contained",
-
- # The `internal_hdrs` are header files which appear in `srcs`.
- # These are only used when compiling the library.
- "internal_hdrs": "internal header files (only used to build .cc files)",
- "srcs": "source files",
- },
-)
-
ProtoFileList = provider(
doc = "List of proto files and generated code to be built into a library.",
fields = {
@@ -65,56 +45,11 @@
files.append(tfile)
return files
-def _combine_cc_file_lists(file_lists):
- hdrs = {}
- textual_hdrs = {}
- internal_hdrs = {}
- srcs = {}
- for file_list in file_lists:
- hdrs.update({f: 1 for f in file_list.hdrs})
- textual_hdrs.update({f: 1 for f in file_list.textual_hdrs})
- internal_hdrs.update({f: 1 for f in file_list.internal_hdrs})
- srcs.update({f: 1 for f in file_list.srcs})
- return CcFileList(
- hdrs = sorted(hdrs.keys()),
- textual_hdrs = sorted(textual_hdrs.keys()),
- internal_hdrs = sorted(internal_hdrs.keys()),
- srcs = sorted(srcs.keys()),
- )
-
def _file_list_aspect_impl(target, ctx):
# We're going to reach directly into the attrs on the traversed rule.
rule_attr = ctx.rule.attr
providers = []
- # Extract sources from a `cc_library` (or similar):
- if CcInfo in target:
- # CcInfo is a proxy for what we expect this rule to look like.
- # However, some deps may expose `CcInfo` without having `srcs`,
- # `hdrs`, etc., so we use `getattr` to handle that gracefully.
-
- internal_hdrs = []
- srcs = []
-
- # Filter `srcs` so it only contains source files. Headers will go
- # into `internal_headers`.
- for src in _flatten_target_files(getattr(rule_attr, "srcs", [])):
- if src.extension.lower() in ["c", "cc", "cpp", "cxx"]:
- srcs.append(src)
- else:
- internal_hdrs.append(src)
-
- providers.append(CcFileList(
- hdrs = _flatten_target_files(getattr(rule_attr, "hdrs", [])),
- textual_hdrs = _flatten_target_files(getattr(
- rule_attr,
- "textual_hdrs",
- [],
- )),
- internal_hdrs = internal_hdrs,
- srcs = srcs,
- ))
-
# Extract sources from a `proto_library`:
if ProtoInfo in target:
proto_srcs = []
@@ -178,7 +113,7 @@
# fragment generator function.
################################################################################
-def _create_file_list_impl(fragment_generator):
+def _create_file_list_impl(ctx, fragment_generator):
# `fragment_generator` is a function like:
# def fn(originating_rule: Label,
# varname: str,
@@ -191,92 +126,98 @@
# When dealing with `File` objects, the `short_path` is used to strip
# the output prefix for generated files.
- def _impl(ctx):
- out = ctx.outputs.out
+ out = ctx.outputs.out
- fragments = []
- for srcrule, libname in ctx.attr.src_libs.items():
- if CcFileList in srcrule:
- cc_file_list = srcrule[CcFileList]
- fragments.extend([
- fragment_generator(
- srcrule.label,
- libname + "_srcs",
- ctx.attr.source_prefix,
- [f.short_path for f in cc_file_list.srcs],
- ),
- fragment_generator(
- srcrule.label,
- libname + "_hdrs",
- ctx.attr.source_prefix,
- [f.short_path for f in (cc_file_list.hdrs +
- cc_file_list.textual_hdrs)],
- ),
- ])
+ fragments = []
+ for srcrule, libname in ctx.attr.src_libs.items():
+ if CcFileList in srcrule:
+ cc_file_list = srcrule[CcFileList]
- if ProtoFileList in srcrule:
- proto_file_list = srcrule[ProtoFileList]
- fragments.extend([
- fragment_generator(
- srcrule.label,
- libname + "_proto_srcs",
- ctx.attr.source_prefix,
- [f.short_path for f in proto_file_list.proto_srcs],
- ),
- fragment_generator(
- srcrule.label,
- libname + "_srcs",
- ctx.attr.source_prefix,
- proto_file_list.srcs,
- ),
- fragment_generator(
- srcrule.label,
- libname + "_hdrs",
- ctx.attr.source_prefix,
- proto_file_list.hdrs,
- ),
- ])
+ # Turn depsets of files into sorted lists.
+ srcs = sorted(cc_file_list.srcs.to_list())
+ hdrs = sorted(
+ depset(transitive = [
+ cc_file_list.textual_hdrs,
+ cc_file_list.hdrs,
+ ]).to_list(),
+ )
- files = {}
+ fragments.extend([
+ fragment_generator(
+ srcrule.label,
+ libname + "_srcs",
+ ctx.attr.source_prefix,
+ [f.short_path for f in srcs],
+ ),
+ fragment_generator(
+ srcrule.label,
+ libname + "_hdrs",
+ ctx.attr.source_prefix,
+ [f.short_path for f in hdrs],
+ ),
+ ])
- if PackageFilegroupInfo in srcrule:
- for pkg_files_info, origin in srcrule[PackageFilegroupInfo].pkg_files:
- # keys are the destination path:
- files.update(pkg_files_info.dest_src_map)
+ if ProtoFileList in srcrule:
+ proto_file_list = srcrule[ProtoFileList]
+ fragments.extend([
+ fragment_generator(
+ srcrule.label,
+ libname + "_proto_srcs",
+ ctx.attr.source_prefix,
+ [f.short_path for f in proto_file_list.proto_srcs],
+ ),
+ fragment_generator(
+ srcrule.label,
+ libname + "_srcs",
+ ctx.attr.source_prefix,
+ proto_file_list.srcs,
+ ),
+ fragment_generator(
+ srcrule.label,
+ libname + "_hdrs",
+ ctx.attr.source_prefix,
+ proto_file_list.hdrs,
+ ),
+ ])
- if PackageFilesInfo in srcrule:
- # keys are the destination:
- files.update(srcrule[PackageFilesInfo].dest_src_map)
+ files = {}
- if files == {} and DefaultInfo in srcrule and CcInfo not in srcrule:
- # This could be an individual file or filegroup.
- # We explicitly ignore rules with CcInfo, since their
- # output artifacts are libraries or binaries.
- files.update(
- {
- f.short_path: 1
- for f in srcrule[DefaultInfo].files.to_list()
- },
- )
+ if PackageFilegroupInfo in srcrule:
+ for pkg_files_info, origin in srcrule[PackageFilegroupInfo].pkg_files:
+ # keys are the destination path:
+ files.update(pkg_files_info.dest_src_map)
- if files:
- fragments.append(
- fragment_generator(
- srcrule.label,
- libname + "_files",
- ctx.attr.source_prefix,
- sorted(files.keys()),
- ),
- )
+ if PackageFilesInfo in srcrule:
+ # keys are the destination:
+ files.update(srcrule[PackageFilesInfo].dest_src_map)
- ctx.actions.write(
- output = out,
- content = (ctx.attr._header % ctx.label) + "\n".join(fragments),
- )
+ if files == {} and DefaultInfo in srcrule and CcFileList not in srcrule:
+ # This could be an individual file or filegroup.
+ # We explicitly ignore rules with CcInfo, since their
+ # output artifacts are libraries or binaries.
+ files.update(
+ {
+ f.short_path: 1
+ for f in srcrule[DefaultInfo].files.to_list()
+ },
+ )
- return [DefaultInfo(files = depset([out]))]
+ if files:
+ fragments.append(
+ fragment_generator(
+ srcrule.label,
+ libname + "_files",
+ ctx.attr.source_prefix,
+ sorted(files.keys()),
+ ),
+ )
- return _impl
+ ctx.actions.write(
+ output = out,
+ content = (ctx.attr._header % ctx.label) + "\n".join(fragments),
+ )
+
+ return [DefaultInfo(files = depset([out]))]
# Common rule attrs for rules that use `_create_file_list_impl`:
# (note that `_header` is also required)
@@ -343,6 +284,9 @@
entries = "\n".join([" %s%s" % (prefix, f) for f in entries]),
)
+def _cmake_file_list_impl(ctx):
+ _create_file_list_impl(ctx, _cmake_var_fragment)
+
gen_cmake_file_lists = rule(
doc = """
Generates a CMake-syntax file with lists of files.
@@ -361,7 +305,7 @@
{libname}_hdrs: contains syntesized paths for generated C++ headers.
""",
- implementation = _create_file_list_impl(_cmake_var_fragment),
+ implementation = _cmake_file_list_impl,
attrs = dict(
_source_list_common_attrs,
_header = attr.string(
@@ -381,72 +325,3 @@
),
),
)
-
-################################################################################
-# Automake source lists generation
-################################################################################
-
-def _automake_var_fragment(owner, varname, prefix, entries):
- """Returns a single variable assignment fragment (Automake syntax).
-
- Args:
- owner: Label, the rule that owns these srcs.
- varname: str, the var name to set.
- prefix: str, prefix to prepend to each of `entries`.
- entries: [str], the entries in the list.
-
- Returns:
- A string.
- """
- if len(entries) == 0:
- # A backslash followed by a blank line is illegal. We still want
- # to emit the variable, though.
- return "# {owner}\n{varname} =\n".format(
- owner = owner,
- varname = varname,
- )
- fragment = (
- "# {owner}\n" +
- "{varname} = \\\n" +
- "{entries}"
- ).format(
- owner = owner,
- varname = varname,
- entries = " \\\n".join([" %s%s" % (prefix, f) for f in entries]),
- )
- return fragment.rstrip("\\ ") + "\n"
-
-gen_automake_file_lists = rule(
- doc = """
-Generates an Automake-syntax file with lists of files.
-
-The generated file defines variables with lists of files from `srcs`. The
-intent is for these files to be included from a non-generated Makefile.am
-file which actually defines the libraries based on these lists.
-
-For C++ rules, the following are generated:
- {libname}_srcs: contains srcs.
- {libname}_hdrs: contains hdrs and textual_hdrs.
-
-For proto_library, the following are generated:
- {libname}_proto_srcs: contains the srcs from the `proto_library` rule.
- {libname}_srcs: contains syntesized paths for generated C++ sources.
- {libname}_hdrs: contains syntesized paths for generated C++ headers.
-
-""",
- implementation = _create_file_list_impl(_automake_var_fragment),
- attrs = dict(
- _source_list_common_attrs.items(),
- _header = attr.string(
- default = """\
-# Auto-generated by %s
-#
-# This file contains lists of sources based on Bazel rules. It should
-# be included from a hand-written Makefile.am that defines targets.
-#
-# Changes to this file will be overwritten based on Bazel definitions.
-
-""",
- ),
- ),
-)
diff --git a/pkg/cc_dist_library.bzl b/pkg/cc_dist_library.bzl
index 654fb73..383979e 100644
--- a/pkg/cc_dist_library.bzl
+++ b/pkg/cc_dist_library.bzl
@@ -3,12 +3,32 @@
load("@rules_cc//cc:action_names.bzl", cc_action_names = "ACTION_NAMES")
load("@rules_cc//cc:find_cc_toolchain.bzl", "find_cc_toolchain")
+################################################################################
+# Archive/linking support
+################################################################################
+
+def _collect_linker_input_objects(dep_label, cc_info, objs, pic_objs):
+ """Accumulate .o and .pic.o files into `objs` and `pic_objs`."""
+ link_ctx = cc_info.linking_context
+ if link_ctx == None:
+ return
+
+ linker_inputs = link_ctx.linker_inputs.to_list()
+ for link_input in linker_inputs:
+ if link_input.owner != dep_label:
+ # This is a transitive dep: skip it.
+ continue
+
+ for lib in link_input.libraries:
+ objs.extend(lib.objects or [])
+ pic_objs.extend(lib.pic_objects or [])
+
# Creates an action to build the `output_file` static library (archive)
# using `object_files`.
def _create_archive_action(
ctx,
feature_configuration,
- cc_toolchain,
+ cc_toolchain_info,
output_file,
object_files):
# Based on Bazel's src/main/starlark/builtins_bzl/common/cc/cc_import.bzl:
@@ -16,7 +36,7 @@
# Build the command line and add args for all of the input files:
archiver_variables = cc_common.create_link_variables(
feature_configuration = feature_configuration,
- cc_toolchain = cc_toolchain,
+ cc_toolchain = cc_toolchain_info,
output_file = output_file.path,
is_using_linker = False,
)
@@ -48,80 +68,23 @@
inputs = depset(
direct = object_files,
transitive = [
- cc_toolchain.all_files,
+ cc_toolchain_info.all_files,
],
),
- use_default_shell_env = True,
+ use_default_shell_env = False,
outputs = [output_file],
mnemonic = "CppArchiveDist",
)
-# Implementation for cc_dist_library rule.
-def _cc_dist_library_impl(ctx):
- cc_toolchain_info = find_cc_toolchain(ctx)
- if cc_toolchain_info.ar_executable == None:
- return []
-
- feature_configuration = cc_common.configure_features(
- ctx = ctx,
- cc_toolchain = cc_toolchain_info,
- )
-
- # Collect the set of object files from the immediate deps.
-
- objs = []
- pic_objs = []
- for dep in ctx.attr.deps:
- if CcInfo not in dep:
- continue
-
- link_ctx = dep[CcInfo].linking_context
- if link_ctx == None:
- continue
-
- linker_inputs = link_ctx.linker_inputs.to_list()
- for link_input in linker_inputs:
- if link_input.owner != dep.label:
- # This is a transitive dep: skip it.
- continue
-
- for lib in link_input.libraries:
- objs.extend(lib.objects or [])
- pic_objs.extend(lib.pic_objects or [])
-
- # For static libraries, build separately with and without pic.
-
- stemname = "lib" + ctx.label.name
- outputs = []
-
- if len(objs) > 0:
- archive_out = ctx.actions.declare_file(stemname + ".a")
- _create_archive_action(
- ctx,
- feature_configuration,
- cc_toolchain_info,
- archive_out,
- objs,
- )
- outputs.append(archive_out)
-
- if len(pic_objs) > 0:
- pic_archive_out = ctx.actions.declare_file(stemname + ".pic.a")
- _create_archive_action(
- ctx,
- feature_configuration,
- cc_toolchain_info,
- pic_archive_out,
- pic_objs,
- )
- outputs.append(pic_archive_out)
-
- # For dynamic libraries, use the `cc_common.link` command to ensure
- # everything gets built correctly according to toolchain definitions.
-
+def _create_dso_link_action(
+ ctx,
+ feature_configuration,
+ cc_toolchain_info,
+ object_files,
+ pic_object_files):
compilation_outputs = cc_common.create_compilation_outputs(
- objects = depset(objs),
- pic_objects = depset(pic_objs),
+ objects = depset(object_files),
+ pic_objects = depset(pic_object_files),
)
link_output = cc_common.link(
actions = ctx.actions,
@@ -134,6 +97,8 @@
)
library_to_link = link_output.library_to_link
+ outputs = []
+
# Note: library_to_link.dynamic_library and interface_library are often
# symlinks in the solib directory. For DefaultInfo, prefer reporting
# the resolved artifact paths.
@@ -147,6 +112,207 @@
elif library_to_link.interface_library != None:
outputs.append(library_to_link.interface_library)
+ return outputs
+
+################################################################################
+# Source file/header support
+################################################################################
+
+CcFileList = provider(
+ doc = "List of files to be built into a library.",
+ fields = {
+ # As a rule of thumb, `hdrs` and `textual_hdrs` are the files that
+ # would be installed along with a prebuilt library.
+ "hdrs": "public header files, including those used by generated code",
+ "textual_hdrs": "files which are included but are not self-contained",
+
+ # The `internal_hdrs` are header files which appear in `srcs`.
+ # These are only used when compiling the library.
+ "internal_hdrs": "internal header files (only used to build .cc files)",
+ "srcs": "source files",
+ },
+)
+
+def _flatten_target_files(targets):
+ return depset(transitive = [target.files for target in targets])
+
+ files = []
+ for target in targets:
+ files.extend(target.files.to_list())
+ return files
+
+def _cc_file_list_aspect_impl(target, ctx):
+ # Extract sources from a `cc_library` (or similar):
+ if CcInfo not in target:
+ return []
+
+ # We're going to reach directly into the attrs on the traversed rule.
+ rule_attr = ctx.rule.attr
+
+ # CcInfo is a proxy for what we expect this rule to look like.
+ # However, some deps may expose `CcInfo` without having `srcs`,
+ # `hdrs`, etc., so we use `getattr` to handle that gracefully.
+
+ internal_hdrs = []
+ srcs = []
+
+ # Filter `srcs` so it only contains source files. Headers will go
+ # into `internal_headers`.
+ for src in _flatten_target_files(getattr(rule_attr, "srcs", [])).to_list():
+ if src.extension.lower() in ["c", "cc", "cpp", "cxx"]:
+ srcs.append(src)
+ else:
+ internal_hdrs.append(src)
+
+ return [CcFileList(
+ hdrs = _flatten_target_files(getattr(rule_attr, "hdrs", depset())),
+ textual_hdrs = _flatten_target_files(getattr(
+ rule_attr,
+ "textual_hdrs",
+ depset(),
+ )),
+ internal_hdrs = depset(internal_hdrs),
+ srcs = depset(srcs),
+ )]
+
+cc_file_list_aspect = aspect(
+ doc = """
+Aspect to provide the list of sources and headers from a rule.
+
+Output is CcFileList. Example:
+
+ cc_library(
+ name = "foo",
+ srcs = [
+ "foo.cc",
+ "foo_internal.h",
+ ],
+ hdrs = ["foo.h"],
+ textual_hdrs = ["foo_inl.inc"],
+ )
+ # produces:
+ # CcFileList(
+ # hdrs = depset([File("foo.h")]),
+ # textual_hdrs = depset([File("foo_inl.inc")]),
+ # internal_hdrs = depset([File("foo_internal.h")]),
+ # srcs = depset([File("foo.cc")]),
+ # )
+""",
+ implementation = _cc_file_list_aspect_impl,
+)
+
+################################################################################
+# Rule impl
+################################################################################
+
+def _collect_inputs(deps):
+ """Collects files from a list of immediate deps.
+
+ This rule collects source files and linker inputs for C++ deps. Only
+ these immediate deps are considered, not transitive deps.
+
+ The return value is a struct with object files (linker inputs),
+ partitioned by PIC and non-pic, and the rules' source and header files:
+
+ struct(
+ objects = ..., # non-PIC object files
+ pic_objects = ..., # PIC objects
+ cc_file_list = ..., # a CcFileList
+ )
+
+ Args:
+ deps: Iterable of immediate deps. These will be treated as the "inputs,"
+ but not the transitive deps.
+
+ Returns:
+ A struct with linker inputs, source files, and header files.
+ """
+
+ objs = []
+ pic_objs = []
+
+ # The returned CcFileList will contain depsets of the deps' file lists.
+ # These lists hold `depset()`s from each of `deps`.
+ srcs = []
+ hdrs = []
+ internal_hdrs = []
+ textual_hdrs = []
+
+ for dep in deps:
+ if CcInfo in dep:
+ _collect_linker_input_objects(
+ dep.label,
+ dep[CcInfo],
+ objs,
+ pic_objs,
+ )
+
+ if CcFileList in dep:
+ cfl = dep[CcFileList]
+ srcs.append(cfl.srcs)
+ hdrs.append(cfl.hdrs)
+ internal_hdrs.append(cfl.internal_hdrs)
+ textual_hdrs.append(cfl.textual_hdrs)
+
+ return struct(
+ objects = objs,
+ pic_objects = pic_objs,
+ cc_file_list = CcFileList(
+ srcs = depset(transitive = srcs),
+ hdrs = depset(transitive = hdrs),
+ internal_hdrs = depset(transitive = internal_hdrs),
+ textual_hdrs = depset(transitive = textual_hdrs),
+ ),
+ )
+
+# Implementation for cc_dist_library rule.
+def _cc_dist_library_impl(ctx):
+ cc_toolchain_info = find_cc_toolchain(ctx)
+
+ feature_configuration = cc_common.configure_features(
+ ctx = ctx,
+ cc_toolchain = cc_toolchain_info,
+ )
+
+ inputs = _collect_inputs(ctx.attr.deps)
+
+ # For static libraries, build separately with and without pic.
+
+ stemname = "lib" + ctx.label.name
+ outputs = []
+
+ if len(inputs.objects) > 0:
+ archive_out = ctx.actions.declare_file(stemname + ".a")
+ _create_archive_action(
+ ctx,
+ feature_configuration,
+ cc_toolchain_info,
+ archive_out,
+ inputs.objects,
+ )
+ outputs.append(archive_out)
+
+ if len(inputs.pic_objects) > 0:
+ pic_archive_out = ctx.actions.declare_file(stemname + ".pic.a")
+ _create_archive_action(
+ ctx,
+ feature_configuration,
+ cc_toolchain_info,
+ pic_archive_out,
+ inputs.pic_objects,
+ )
+ outputs.append(pic_archive_out)
+
+ # For dynamic libraries, use the `cc_common.link` command to ensure
+ # everything gets built correctly according to toolchain definitions.
+ outputs.extend(_create_dso_link_action(
+ ctx,
+ feature_configuration,
+ cc_toolchain_info,
+ inputs.objects,
+ inputs.pic_objects,
+ ))
+
# We could expose the libraries for use from cc rules:
#
# linking_context = cc_common.create_linking_context(
@@ -169,6 +335,7 @@
return [
DefaultInfo(files = depset(outputs)),
+ inputs.cc_file_list,
]
cc_dist_library = rule(
@@ -214,6 +381,7 @@
"Only these targets' compilation outputs will be " +
"included (i.e., the transitive dependencies are not " +
"included in the output)."),
+ aspects = [cc_file_list_aspect],
),
"linkopts": attr.string_list(
doc = ("Add these flags to the C++ linker command when creating " +
diff --git a/post_process_dist.sh b/post_process_dist.sh
deleted file mode 100755
index 2630f97..0000000
--- a/post_process_dist.sh
+++ /dev/null
@@ -1,64 +0,0 @@
-#! /bin/sh
-
-# This script takes the result of "make dist" and:
-# 1) Unpacks it.
-# 2) Ensures all contents are user-writable. Some version control systems
-# keep code read-only until you explicitly ask to edit it, and the normal
-# "make dist" process does not correct for this, so the result is that
-# the entire dist is still marked read-only when unpacked, which is
-# annoying. So, we fix it.
-# 3) Convert MSVC project files to MSVC 2005, so that anyone who has version
-# 2005 *or* 2008 can open them. (In version control, we keep things in
-# MSVC 2008 format since that's what we use in development.)
-# 4) Uses the result to create .tar.gz, .tar.bz2, and .zip versions and
-# deposits them in the "dist" directory. In the .zip version, all
-# non-testdata .txt files are converted to Windows-style line endings.
-# 5) Cleans up after itself.
-
-if [ "$1" == "" ]; then
- echo "USAGE: $0 DISTFILE" >&2
- exit 1
-fi
-
-if [ ! -e $1 ]; then
- echo $1": File not found." >&2
- exit 1
-fi
-
-set -ex
-
-LANGUAGES="cpp csharp java objectivec python ruby php all"
-BASENAME=`basename $1 .tar.gz`
-VERSION=${BASENAME:9}
-
-# Create a directory called "dist", copy the tarball there and unpack it.
-mkdir dist
-cp $1 dist
-cd dist
-tar zxvf $BASENAME.tar.gz
-rm $BASENAME.tar.gz
-
-# Set the entire contents to be user-writable.
-chmod -R u+w $BASENAME
-cd $BASENAME
-
-for LANG in $LANGUAGES; do
- # Build the dist again in .tar.gz
- ./configure DIST_LANG=$LANG
- make dist-gzip
- mv $BASENAME.tar.gz ../protobuf-$LANG-$VERSION.tar.gz
-done
-
-# Convert all text files to use DOS-style line endings, then build a .zip
-# distribution.
-todos *.txt */*.txt
-
-for LANG in $LANGUAGES; do
- # Build the dist again in .zip
- ./configure DIST_LANG=$LANG
- make dist-zip
- mv $BASENAME.zip ../protobuf-$LANG-$VERSION.zip
-done
-
-cd ..
-rm -rf $BASENAME
diff --git a/protobuf-lite.pc.in b/protobuf-lite.pc.in
deleted file mode 100644
index f92e4ad..0000000
--- a/protobuf-lite.pc.in
+++ /dev/null
@@ -1,11 +0,0 @@
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-includedir=@includedir@
-
-Name: Protocol Buffers
-Description: Google's Data Interchange Format
-Version: @VERSION@
-Libs: -L${libdir} -lprotobuf-lite
-Cflags: -I${includedir}
-Conflicts: protobuf
diff --git a/protobuf.bzl b/protobuf.bzl
index c5b8dab..8ed2cfa 100644
--- a/protobuf.bzl
+++ b/protobuf.bzl
@@ -1,5 +1,6 @@
load("@bazel_skylib//lib:versions.bzl", "versions")
-load("@rules_cc//cc:defs.bzl", "cc_library")
+load("@bazel_skylib//lib:collections.bzl", "collections")
+load("@rules_cc//cc:defs.bzl", "cc_library", "objc_library")
load("@rules_proto//proto:defs.bzl", "ProtoInfo")
load("@rules_python//python:defs.bzl", "py_library", "py_test")
@@ -37,20 +38,23 @@
return _GetPath(ctx, ctx.attr.includes[0])
return _GetPath(ctx, ctx.label.package + "/" + ctx.attr.includes[0])
-def _CcHdrs(srcs, use_grpc_plugin = False):
- ret = [s[:-len(".proto")] + ".pb.h" for s in srcs]
- if use_grpc_plugin:
- ret += [s[:-len(".proto")] + ".grpc.pb.h" for s in srcs]
- return ret
+def _ObjcBase(srcs):
+ return [
+ "".join([token.capitalize() for token in src[:-len(".proto")].split("_")])
+ for src in srcs]
-def _CcSrcs(srcs, use_grpc_plugin = False):
- ret = [s[:-len(".proto")] + ".pb.cc" for s in srcs]
- if use_grpc_plugin:
- ret += [s[:-len(".proto")] + ".grpc.pb.cc" for s in srcs]
- return ret
+def _ObjcHdrs(srcs):
+ return[src + ".pbobjc.h" for src in _ObjcBase(srcs)]
-def _CcOuts(srcs, use_grpc_plugin = False):
- return _CcHdrs(srcs, use_grpc_plugin) + _CcSrcs(srcs, use_grpc_plugin)
+def _ObjcSrcs(srcs):
+ return[src + ".pbobjc.m" for src in _ObjcBase(srcs)]
+
+def _ObjcOuts(srcs, out_type):
+ if out_type == "hdrs":
+ return _ObjcHdrs(srcs)
+ if out_type == "srcs":
+ return _ObjcSrcs(srcs)
+ return _ObjcHdrs(srcs) + _ObjcSrcs(srcs)
def _PyOuts(srcs, use_grpc_plugin = False):
ret = [s[:-len(".proto")] + "_pb2.py" for s in srcs]
@@ -58,29 +62,28 @@
ret += [s[:-len(".proto")] + "_pb2_grpc.py" for s in srcs]
return ret
-def _RelativeOutputPath(path, include, dest = ""):
- if include == None:
- return path
+def _RubyOuts(srcs):
+ return [s[:-len(".proto")] + "_pb.rb" for s in srcs]
- if not path.startswith(include):
- fail("Include path %s isn't part of the path %s." % (include, path))
+def _CsharpOuts(srcs):
+ return [
+ "".join([token.capitalize() for token in src[:-len(".proto")].split("_")]) + ".cs"
+ for src in srcs]
- if include and include[-1] != "/":
- include = include + "/"
- if dest and dest[-1] != "/":
- dest = dest + "/"
-
- path = path[len(include):]
- return dest + path
+ProtoGenInfo = provider(
+ fields = ["srcs", "import_flags", "deps"],
+)
def _proto_gen_impl(ctx):
"""General implementation for generating protos"""
srcs = ctx.files.srcs
- deps = depset(direct=ctx.files.srcs)
+ langs = ctx.attr.langs or []
+ out_type = ctx.attr.out_type
+ deps = depset(direct = ctx.files.srcs)
source_dir = _SourceDir(ctx)
gen_dir = _GenDir(ctx).rstrip("/")
import_flags = []
-
+
if source_dir:
has_sources = any([src.is_source for src in srcs])
if has_sources:
@@ -92,27 +95,38 @@
if has_generated:
import_flags += ["-I" + gen_dir]
- import_flags = depset(direct=import_flags)
+ if ctx.attr.includes:
+ for include in ctx.attr.includes:
+ import_flags += ["-I"+_GetPath(ctx,include)]
+
+ import_flags = depset(direct = import_flags)
for dep in ctx.attr.deps:
- if type(dep.proto.import_flags) == "list":
- import_flags = depset(transitive=[import_flags], direct=dep.proto.import_flags)
+ dep_proto = dep[ProtoGenInfo]
+ if type(dep_proto.import_flags) == "list":
+ import_flags = depset(
+ transitive = [import_flags],
+ direct = dep_proto.import_flags,
+ )
else:
- import_flags = depset(transitive=[import_flags, dep.proto.import_flags])
- if type(dep.proto.deps) == "list":
- deps = depset(transitive=[deps], direct=dep.proto.deps)
+ import_flags = depset(
+ transitive = [import_flags, dep_proto.import_flags],
+ )
+ if type(dep_proto.deps) == "list":
+ deps = depset(transitive = [deps], direct = dep_proto.deps)
else:
- deps = depset(transitive=[deps, dep.proto.deps])
+ deps = depset(transitive = [deps, dep_proto.deps])
- if not ctx.attr.gen_cc and not ctx.attr.gen_py and not ctx.executable.plugin:
- return struct(
- proto = struct(
+ if not langs and not ctx.executable.plugin:
+ return [
+ ProtoGenInfo(
srcs = srcs,
import_flags = import_flags,
deps = deps,
),
- )
+ ]
+ generated_files = []
for src in srcs:
args = []
@@ -123,17 +137,27 @@
path = f.replace("-I", "")
import_flags_real.append("-I$(realpath -s %s)" % path)
- outs = []
use_grpc_plugin = (ctx.attr.plugin_language == "grpc" and ctx.attr.plugin)
path_tpl = "$(realpath %s)" if in_gen_dir else "%s"
- if ctx.attr.gen_cc:
- args += [("--cpp_out=" + path_tpl) % gen_dir]
- outs.extend(_CcOuts([src.basename], use_grpc_plugin = use_grpc_plugin))
- if ctx.attr.gen_py:
- args += [("--python_out=" + path_tpl) % gen_dir]
- outs.extend(_PyOuts([src.basename], use_grpc_plugin = use_grpc_plugin))
+ outs = []
+ for lang in langs:
+ if lang == "csharp":
+ outs.extend(_CsharpOuts([src.basename]))
+ elif lang == "objc":
+ outs.extend(_ObjcOuts([src.basename], out_type = out_type))
+ elif lang == "python":
+ outs.extend(_PyOuts([src.basename], use_grpc_plugin = use_grpc_plugin))
+ elif lang == "ruby":
+ outs.extend(_RubyOuts([src.basename]))
+ # Otherwise, rely on user-supplied outs.
+ args += [("--%s_out=" + path_tpl) % (lang, gen_dir)]
+
+ if ctx.attr.outs:
+ outs.extend(ctx.attr.outs)
outs = [ctx.actions.declare_file(out, sibling = src) for out in outs]
+ generated_files.extend(outs)
+
inputs = [src] + deps.to_list()
tools = [ctx.executable.protoc]
if ctx.executable.plugin:
@@ -186,39 +210,15 @@
use_default_shell_env = True,
)
- return struct(
- proto = struct(
+ return [
+ ProtoGenInfo(
srcs = srcs,
import_flags = import_flags,
deps = deps,
),
- )
+ DefaultInfo(files = depset(generated_files)),
+ ]
-proto_gen = rule(
- attrs = {
- "srcs": attr.label_list(allow_files = True),
- "deps": attr.label_list(providers = ["proto"]),
- "includes": attr.string_list(),
- "protoc": attr.label(
- cfg = "exec",
- executable = True,
- allow_single_file = True,
- mandatory = True,
- ),
- "plugin": attr.label(
- cfg = "exec",
- allow_files = True,
- executable = True,
- ),
- "plugin_language": attr.string(),
- "plugin_options": attr.string_list(),
- "gen_cc": attr.bool(),
- "gen_py": attr.bool(),
- "outs": attr.output_list(),
- },
- output_to_genfiles = True,
- implementation = _proto_gen_impl,
-)
"""Generates codes from Protocol Buffers definitions.
This rule helps you to implement Skylark macros specific to the target
@@ -235,103 +235,40 @@
compiler.
plugin_language: the language of the generated sources
plugin_options: a list of options to be passed to the plugin
- gen_cc: generates C++ sources in addition to the ones from the plugin.
- gen_py: generates Python sources in addition to the ones from the plugin.
+ langs: generates sources in addition to the ones from the plugin for each
+ specified language.
outs: a list of labels of the expected outputs from the protocol compiler.
+ out_type: only generated a single type of source file for languages that have
+ split sources (e.g. *.h and *.cc in C++)
"""
-
-def _adapt_proto_library_impl(ctx):
- deps = [dep[ProtoInfo] for dep in ctx.attr.deps]
-
- srcs = [src for dep in deps for src in dep.direct_sources]
- return struct(
- proto = struct(
- srcs = srcs,
- import_flags = ["-I{}".format(path) for dep in deps for path in dep.transitive_proto_path.to_list()],
- deps = srcs,
- ),
- )
-
-adapt_proto_library = rule(
- implementation = _adapt_proto_library_impl,
+_proto_gen = rule(
attrs = {
- "deps": attr.label_list(
+ "srcs": attr.label_list(allow_files = True),
+ "deps": attr.label_list(providers = [ProtoGenInfo]),
+ "includes": attr.string_list(),
+ "protoc": attr.label(
+ cfg = "exec",
+ executable = True,
+ allow_single_file = True,
mandatory = True,
- providers = [ProtoInfo],
+ ),
+ "plugin": attr.label(
+ cfg = "exec",
+ allow_files = True,
+ executable = True,
+ ),
+ "plugin_language": attr.string(),
+ "plugin_options": attr.string_list(),
+ "langs": attr.string_list(),
+ "outs": attr.string_list(),
+ "out_type": attr.string(
+ default = "all"
),
},
- doc = "Adapts `proto_library` from `@rules_proto` to be used with `{cc,py}_proto_library` from this file.",
+ output_to_genfiles = True,
+ implementation = _proto_gen_impl,
)
-def cc_proto_library(
- name,
- srcs = [],
- deps = [],
- cc_libs = [],
- include = None,
- protoc = "@com_google_protobuf//:protoc",
- use_grpc_plugin = False,
- default_runtime = "@com_google_protobuf//:protobuf",
- **kargs):
- """Bazel rule to create a C++ protobuf library from proto source files
-
- NOTE: the rule is only an internal workaround to generate protos. The
- interface may change and the rule may be removed when bazel has introduced
- the native rule.
-
- Args:
- name: the name of the cc_proto_library.
- srcs: the .proto files of the cc_proto_library.
- deps: a list of dependency labels; must be cc_proto_library.
- cc_libs: a list of other cc_library targets depended by the generated
- cc_library.
- include: a string indicating the include path of the .proto files.
- protoc: the label of the protocol compiler to generate the sources.
- use_grpc_plugin: a flag to indicate whether to call the grpc C++ plugin
- when processing the proto files.
- default_runtime: the implicitly default runtime which will be depended on by
- the generated cc_library target.
- **kargs: other keyword arguments that are passed to cc_library.
- """
-
- includes = []
- if include != None:
- includes = [include]
-
- grpc_cpp_plugin = None
- if use_grpc_plugin:
- grpc_cpp_plugin = "//external:grpc_cpp_plugin"
-
- gen_srcs = _CcSrcs(srcs, use_grpc_plugin)
- gen_hdrs = _CcHdrs(srcs, use_grpc_plugin)
- outs = gen_srcs + gen_hdrs
-
- proto_gen(
- name = name + "_genproto",
- srcs = srcs,
- deps = [s + "_genproto" for s in deps],
- includes = includes,
- protoc = protoc,
- plugin = grpc_cpp_plugin,
- plugin_language = "grpc",
- gen_cc = 1,
- outs = outs,
- visibility = ["//visibility:public"],
- )
-
- if default_runtime and not default_runtime in cc_libs:
- cc_libs = cc_libs + [default_runtime]
- if use_grpc_plugin:
- cc_libs = cc_libs + ["//external:grpc_lib"]
- cc_library(
- name = name,
- srcs = gen_srcs,
- hdrs = gen_hdrs,
- deps = cc_libs + deps,
- includes = includes,
- **kargs
- )
-
def _internal_gen_well_known_protos_java_impl(ctx):
args = ctx.actions.args()
@@ -456,42 +393,97 @@
},
)
+def internal_objc_proto_library(
+ name,
+ srcs = [],
+ deps = [],
+ outs = [],
+ proto_deps = [],
+ includes = ["."],
+ default_runtime = "@com_google_protobuf//:protobuf_objc",
+ protoc = "@com_google_protobuf//:protoc",
+ testonly = None,
+ visibility = ["//visibility:public"],
+ **kwargs):
+ """Bazel rule to create a Objective-C protobuf library from proto source
+ files
-
-def internal_copied_filegroup(name, srcs, strip_prefix, dest, **kwargs):
- """Macro to copy files to a different directory and then create a filegroup.
-
- This is used by the //:protobuf_python py_proto_library target to work around
- an issue caused by Python source files that are part of the same Python
- package being in separate directories.
+ NOTE: the rule is only an internal workaround to generate protos. The
+ interface may change and the rule may be removed when bazel has introduced
+ the native rule.
Args:
- srcs: The source files to copy and add to the filegroup.
- strip_prefix: Path to the root of the files to copy.
- dest: The directory to copy the source files into.
- **kwargs: extra arguments that will be passesd to the filegroup.
- """
- outs = [_RelativeOutputPath(s, strip_prefix, dest) for s in srcs]
+ name: the name of the objc_proto_library.
+ srcs: the .proto files to compile.
+ deps: a list of dependency labels; must be objc_proto_library.
+ outs: a list of expected output files.
+ proto_deps: a list of proto file dependencies that don't have a
+ objc_proto_library rule.
+ include: a string indicating the include path of the .proto files.
+ default_runtime: the Objective-C Protobuf runtime
+ protoc: the label of the protocol compiler to generate the sources.
+ testonly: common rule attribute (see:
+ https://bazel.build/reference/be/common-definitions#common-attributes)
+ visibility: the visibility of the generated files.
+ **kwargs: other keyword arguments that are passed to py_library.
- native.genrule(
- name = name + "_genrule",
+ """
+ full_deps = [d + "_genproto" for d in deps]
+
+ if proto_deps:
+ _proto_gen(
+ name = name + "_deps_genproto",
+ testonly = testonly,
+ srcs = proto_deps,
+ protoc = protoc,
+ includes = includes,
+ )
+ full_deps.append(":%s_deps_genproto" % name)
+
+ # Note: we need to run the protoc build twice to get separate targets for
+ # the generated header and the source files.
+ _proto_gen(
+ name = name + "_genproto_hdrs",
srcs = srcs,
- outs = outs,
- cmd_bash = " && ".join(
- ["cp $(location %s) $(location %s)" %
- (s, _RelativeOutputPath(s, strip_prefix, dest)) for s in srcs]),
- cmd_bat = " && ".join(
- ["@copy /Y $(location %s) $(location %s) >NUL" %
- (s, _RelativeOutputPath(s, strip_prefix, dest)) for s in srcs]),
+ deps = full_deps,
+ langs = ["objc"],
+ out_type = "hdrs",
+ includes = includes,
+ protoc = protoc,
+ testonly = testonly,
+ visibility = visibility,
+ tags = ["manual"],
)
- native.filegroup(
+ _proto_gen(
+ name = name + "_genproto",
+ srcs = srcs,
+ deps = full_deps,
+ langs = ["objc"],
+ out_type = "srcs",
+ includes = includes,
+ protoc = protoc,
+ testonly = testonly,
+ visibility = visibility,
+ tags = ["manual"],
+ )
+
+ objc_library(
name = name,
- srcs = outs,
+ hdrs = [name + "_genproto_hdrs"],
+ non_arc_srcs = [name + "_genproto"],
+ deps = [default_runtime],
+ includes = includes,
+ testonly = testonly,
+ visibility = visibility,
+ # Don't auto-expand these targets until target_compatible_with
+ # works. See https://github.com/bazelbuild/bazel/issues/12897.
+ tags = ["manual"],
+ target_compatible_with = ["@platforms//os:osx"],
**kwargs
)
-def py_proto_library(
+def internal_py_proto_library(
name,
srcs = [],
deps = [],
@@ -501,6 +493,7 @@
default_runtime = "@com_google_protobuf//:protobuf_python",
protoc = "@com_google_protobuf//:protoc",
use_grpc_plugin = False,
+ testonly = None,
**kargs):
"""Bazel rule to create a Python protobuf library from proto source files
@@ -522,11 +515,11 @@
protoc: the label of the protocol compiler to generate the sources.
use_grpc_plugin: a flag to indicate whether to call the Python C++ plugin
when processing the proto files.
+ testonly: common rule attribute (see:
+ https://bazel.build/reference/be/common-definitions#common-attributes)
**kargs: other keyword arguments that are passed to py_library.
"""
- outs = _PyOuts(srcs, use_grpc_plugin)
-
includes = []
if include != None:
includes = [include]
@@ -538,14 +531,14 @@
# is not explicitly listed in py_libs. Instead, host system is assumed to
# have grpc installed.
- proto_gen(
+ _proto_gen(
name = name + "_genproto",
+ testonly = testonly,
srcs = srcs,
deps = [s + "_genproto" for s in deps],
includes = includes,
protoc = protoc,
- gen_py = 1,
- outs = outs,
+ langs = ["python"],
visibility = ["//visibility:public"],
plugin = grpc_python_plugin,
plugin_language = "grpc",
@@ -555,33 +548,158 @@
py_libs = py_libs + [default_runtime]
py_library(
name = name,
- srcs = outs + py_extra_srcs,
+ testonly = testonly,
+ srcs = [name + "_genproto"] + py_extra_srcs,
deps = py_libs + deps,
imports = includes,
**kargs
)
-def internal_protobuf_py_tests(
- name,
- modules = [],
- **kargs):
- """Bazel rules to create batch tests for protobuf internal.
+def py_proto_library(
+ *args,
+ **kwargs):
+ """Deprecated alias for use before Bazel 5.3.
Args:
- name: the name of the rule.
- modules: a list of modules for tests. The macro will create a py_test for
- each of the parameter with the source "google/protobuf/%s.py"
- kargs: extra parameters that will be passed into the py_test.
+ *args: the name of the py_proto_library.
+ **kwargs: other keyword arguments that are passed to py_library.
+
+ Deprecated:
+ This is provided for backwards compatibility only. Bazel 5.3 will
+ introduce support for py_proto_library, which should be used instead.
+ """
+ internal_py_proto_library(*args, **kwargs)
+
+def _source_proto_library(
+ name,
+ srcs = [],
+ deps = [],
+ proto_deps = [],
+ outs = [],
+ lang = None,
+ includes = ["."],
+ protoc = "@com_google_protobuf//:protoc",
+ testonly = None,
+ visibility = ["//visibility:public"],
+ **kwargs):
+ """Bazel rule to create generated protobuf code from proto source files for
+ languages not well supported by Bazel yet. This will output the generated
+ code as-is without any compilation. This is most useful for interpreted
+ languages that don't require it.
+
+ NOTE: the rule is only an internal workaround to generate protos. The
+ interface may change and the rule may be removed when bazel has introduced
+ the native rule.
+
+ Args:
+ name: the name of the unsupported_proto_library.
+ srcs: the .proto files to compile. Note, that for languages where out
+ needs to be provided, only a single source file is allowed.
+ deps: a list of dependency labels; must be unsupported_proto_library.
+ proto_deps: a list of proto file dependencies that don't have a
+ unsupported_proto_library rule.
+ lang: the language to (optionally) generate code for.
+ outs: a list of expected output files. This is only required for
+ languages where we can't predict the outputs.
+ includes: strings indicating the include path of the .proto files.
+ protoc: the label of the protocol compiler to generate the sources.
+ testonly: common rule attribute (see:
+ https://bazel.build/reference/be/common-definitions#common-attributes)
+ visibility: the visibility of the generated files.
+ **kwargs: other keyword arguments that are passed to py_library.
"""
- for m in modules:
- s = "python/google/protobuf/internal/%s.py" % m
- py_test(
- name = "py_%s" % m,
- srcs = [s],
- main = s,
- **kargs
+ if outs and len(srcs) != 1:
+ fail("Custom outputs only allowed for single proto targets.")
+
+ langs = []
+ if lang != None:
+ langs = [lang]
+
+ full_deps = [d + "_genproto" for d in deps]
+
+ if proto_deps:
+ _proto_gen(
+ name = name + "_deps_genproto",
+ testonly = testonly,
+ srcs = proto_deps,
+ protoc = protoc,
+ includes = includes,
)
+ full_deps.append(":%s_deps_genproto" % name)
+
+ _proto_gen(
+ name = name + "_genproto",
+ srcs = srcs,
+ deps = full_deps,
+ langs = langs,
+ outs = outs,
+ includes = includes,
+ protoc = protoc,
+ testonly = testonly,
+ visibility = visibility,
+ )
+
+ native.filegroup(
+ name = name,
+ srcs = [":%s_genproto"%name],
+ testonly = testonly,
+ visibility = visibility,
+ **kwargs
+ )
+
+def internal_csharp_proto_library(**kwargs):
+ """Bazel rule to create a C# protobuf library from proto source files
+
+ NOTE: the rule is only an internal workaround to generate protos. The
+ interface may change and the rule may be removed when bazel has introduced
+ the native rule.
+
+ Args:
+ **kwargs: arguments that are passed to unsupported_proto_library.
+
+ """
+
+ _source_proto_library(
+ lang = "csharp",
+ **kwargs
+ )
+
+def internal_php_proto_library(**kwargs):
+ """Bazel rule to create a PHP protobuf library from proto source files
+
+ NOTE: the rule is only an internal workaround to generate protos. The
+ interface may change and the rule may be removed when bazel has introduced
+ the native rule.
+
+ Args:
+ **kwargs: arguments that are passed to unsupported_proto_library.
+
+ """
+ if not kwargs.get("outs"):
+ fail("Unable to predict the outputs for php_proto_library. Please specify them via `outs`.")
+
+ _source_proto_library(
+ lang = "php",
+ **kwargs
+ )
+
+def internal_ruby_proto_library(**kwargs):
+ """Bazel rule to create a Ruby protobuf library from proto source files
+
+ NOTE: the rule is only an internal workaround to generate protos. The
+ interface may change and the rule may be removed when bazel has introduced
+ the native rule.
+
+ Args:
+ **kwargs: arguments that are passed to unsupported_proto_library.
+
+ """
+
+ _source_proto_library(
+ lang = "ruby",
+ **kwargs
+ )
def check_protobuf_required_bazel_version():
"""For WORKSPACE files, to check the installed version of bazel.
diff --git a/protobuf.pc.in b/protobuf.pc.in
deleted file mode 100644
index e9bef5d..0000000
--- a/protobuf.pc.in
+++ /dev/null
@@ -1,13 +0,0 @@
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-includedir=@includedir@
-
-Name: Protocol Buffers
-Description: Google's Data Interchange Format
-Version: @VERSION@
-Libs: -L${libdir} -lprotobuf
-Libs.private: @LIBS@
-
-Cflags: -I${includedir}
-Conflicts: protobuf-lite
diff --git a/protobuf_deps.bzl b/protobuf_deps.bzl
index ae4021d..7c897ef 100644
--- a/protobuf_deps.bzl
+++ b/protobuf_deps.bzl
@@ -3,9 +3,10 @@
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
PROTOBUF_MAVEN_ARTIFACTS = [
+ "com.google.caliper:caliper:1.0-beta-3",
"com.google.code.findbugs:jsr305:3.0.2",
"com.google.code.gson:gson:2.8.9",
- "com.google.errorprone:error_prone_annotations:2.3.2",
+ "com.google.errorprone:error_prone_annotations:2.5.1",
"com.google.j2objc:j2objc-annotations:1.3",
"com.google.guava:guava:31.1-jre",
"com.google.guava:guava-testlib:31.1-jre",
@@ -28,11 +29,11 @@
if not native.existing_rule("bazel_skylib"):
http_archive(
name = "bazel_skylib",
- sha256 = "97e70364e9249702246c0e9444bccdc4b847bed1eb03c5a3ece4f83dfe6abc44",
urls = [
- "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.0.2/bazel-skylib-1.0.2.tar.gz",
- "https://github.com/bazelbuild/bazel-skylib/releases/download/1.0.2/bazel-skylib-1.0.2.tar.gz",
+ "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.2.1/bazel-skylib-1.2.1.tar.gz",
+ "https://github.com/bazelbuild/bazel-skylib/releases/download/1.2.1/bazel-skylib-1.2.1.tar.gz",
],
+ sha256 = "f7be3474d42aae265405a592bb7da8e171919d74c16f082a5457840f06054728",
)
if not native.existing_rule("com_google_absl"):
@@ -40,8 +41,8 @@
_github_archive(
name = "com_google_absl",
repo = "https://github.com/abseil/abseil-cpp",
- commit = "215105818dfde3174fe799600bb0f3cae233d0bf",
- sha256 = "b4e20d9e752a75c10636675691b1e9c2698e0764cb404987d0ffa77223041c19",
+ commit = "273292d1cfc0a94a65082ee350509af1d113344d",
+ sha256 = "6764f226bd6e2d8ab9fe2f3cab5f45fb1a4a15c04b58b87ba7fa87456054f98b",
)
if not native.existing_rule("zlib"):
@@ -106,8 +107,8 @@
if not native.existing_rule("io_bazel_rules_kotlin"):
http_archive(
name = "io_bazel_rules_kotlin",
- urls = ["https://github.com/bazelbuild/rules_kotlin/releases/download/v1.5.0-beta-4/rules_kotlin_release.tgz"],
- sha256 = "6cbd4e5768bdfae1598662e40272729ec9ece8b7bded8f0d2c81c8ff96dc139d",
+ urls = ["https://github.com/bazelbuild/rules_kotlin/releases/download/v1.7.0-RC-1/rules_kotlin_release.tgz"],
+ sha256 = "68b910730026921814d3a504ccbe9adaac9938983d940e626523e6e4ecfb0355",
)
if not native.existing_rule("upb"):
diff --git a/protoc-artifacts/Dockerfile b/protoc-artifacts/Dockerfile
deleted file mode 100644
index 278bc74..0000000
--- a/protoc-artifacts/Dockerfile
+++ /dev/null
@@ -1,55 +0,0 @@
-FROM centos:6.9
-
-RUN yum install -y git \
- tar \
- wget \
- make \
- autoconf \
- curl-devel \
- unzip \
- automake \
- libtool \
- glibc-static.i686 \
- glibc-devel \
- glibc-devel.i686 \
- && \
- yum clean all
-
-# Install Java 8
-RUN wget -q --no-cookies --no-check-certificate \
- --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" \
- "http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.tar.gz" \
- -O - | tar xz -C /var/local
-ENV JAVA_HOME /var/local/jdk1.8.0_131
-ENV PATH $JAVA_HOME/bin:$PATH
-
-# Install Maven
-RUN wget -q http://apache.cs.utah.edu/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz -O - | \
- tar xz -C /var/local
-ENV PATH /var/local/apache-maven-3.3.9/bin:$PATH
-
-# Install GCC 4.8 to support -static-libstdc++
-RUN wget http://people.centos.org/tru/devtools-2/devtools-2.repo -P /etc/yum.repos.d && \
- bash -c 'echo "enabled=1" >> /etc/yum.repos.d/devtools-2.repo' && \
- bash -c "sed -e 's/\$basearch/i386/g' /etc/yum.repos.d/devtools-2.repo > /etc/yum.repos.d/devtools-i386-2.repo" && \
- sed -e 's/testing-/testing-i386-/g' -i /etc/yum.repos.d/devtools-i386-2.repo && \
- rpm --rebuilddb
-
-RUN yum install -y devtoolset-2-gcc \
- devtoolset-2-gcc-c++ \
- devtoolset-2-binutils \
- devtoolset-2-libstdc++-devel \
- devtoolset-2-libatomic-devel \
- libatomic \
- devtoolset-2-gcc.i686 \
- devtoolset-2-gcc-c++.i686 \
- devtoolset-2-binutils.i686 \
- devtoolset-2-libstdc++-devel.i686 \
- devtoolset-2-libatomic-devel.i686 \
- libatomic.i686 && \
- yum clean all
-
-COPY scl-enable-devtoolset.sh /var/local/
-
-# Start in devtoolset environment that uses GCC 4.7
-ENTRYPOINT ["/var/local/scl-enable-devtoolset.sh"]
diff --git a/protoc-artifacts/README.md b/protoc-artifacts/README.md
deleted file mode 100644
index 8fc3669..0000000
--- a/protoc-artifacts/README.md
+++ /dev/null
@@ -1,161 +0,0 @@
-# Build scripts that publish pre-compiled protoc artifacts
-``protoc`` is the compiler for ``.proto`` files. It generates language bindings
-for the messages and/or RPC services from ``.proto`` files.
-
-Because ``protoc`` is a native executable, the scripts under this directory
-build and publish a ``protoc`` executable (a.k.a. artifact) to Maven
-repositories. The artifact can be used by build automation tools so that users
-would not need to compile and install ``protoc`` for their systems.
-
-If you would like us to publish protoc artifact for a new platform, please send
-us a pull request to add support for the new platform. You would need to change
-the following files:
-
-* [build-protoc.sh](build-protoc.sh): script to cross-build the protoc for your
- platform.
-* [pom.xml](pom.xml): script to upload artifacts to maven.
-* [build-zip.sh](build-zip.sh): script to package published maven artifacts in
- our release page.
-
-## Maven Location
-The published protoc artifacts are available on Maven here:
-
- https://repo.maven.apache.org/maven2/com/google/protobuf/protoc/
-
-## Versioning
-The version of the ``protoc`` artifact must be the same as the version of the
-Protobuf project.
-
-## Artifact name
-The name of a published ``protoc`` artifact is in the following format:
-``protoc-<version>-<os>-<arch>.exe``, e.g., ``protoc-3.6.1-linux-x86_64.exe``.
-
-Note that artifacts for linux/macos also have the `.exe` suffix but they are
-not windows binaries.
-
-## System requirement
-Install [Apache Maven](http://maven.apache.org/) if you don't have it.
-
-The scripts only work under Unix-like environments, e.g., Linux, MacOSX, and
-Cygwin or MinGW for Windows. Please see ``README.md`` of the Protobuf project
-for how to set up the build environment.
-
-## Building from a freshly checked-out source
-
-If you just checked out the Protobuf source from github, you need to
-generate the configure script.
-
-Under the protobuf project directory:
-
-
-```
-$ ./autogen.sh
-```
-
-### Build the artifact for each platform
-
-Run the build-protoc.sh script under this protoc-artifacts directory to build the protoc
-artifact for each platform. For example:
-
-```
-$ cd protoc-artifacts
-$ ./build-protoc.sh linux x86_64 protoc
-```
-
-The above command will produce a `target/linux/x86_64/protoc` binary under the
-protoc-artifacts directory.
-
-For a list of supported platforms, see the comments in the build-protoc.sh
-script. We only use this script to build artifacts on Ubuntu and MacOS (both
-with x86_64, and do cross-compilation for other platforms.
-
-### Tips for building for Linux
-We build on Centos 6.9 to provide a good compatibility for not very new
-systems. We have provided a ``Dockerfile`` under this directory to build the
-environment. It has been tested with Docker 1.6.1.
-
-To build a image:
-
-```
-$ docker build -t protoc-artifacts .
-```
-
-To run the image:
-
-```
-$ docker run -it --rm=true protoc-artifacts bash
-```
-
-To checkout protobuf (run within the container):
-
-```
-$ # Replace v3.5.1 with the version you want
-$ wget -O - https://github.com/protocolbuffers/protobuf/archive/v3.5.1.tar.gz | tar xvzp
-```
-
-### Windows build
-We no longer use scripts in this directory to build windows artifacts. Instead,
-we use Visual Studio 2015 to build our windows release artifacts. See our
-[kokoro windows build scripts here](../kokoro/release/protoc/windows/build.bat).
-
-To upload windows artifacts, copy the built binaries into this directory and
-put it into the target/windows/(x86_64|x86_32) directory the same way as the
-artifacts for other platforms. That will allow the maven script to find and
-upload the artifacts to maven.
-
-## To push artifacts to Maven Central
-Before you can upload artifacts to Maven Central repository, make sure you have
-read [this page](http://central.sonatype.org/pages/apache-maven.html) on how to
-configure GPG and Sonatype account.
-
-Before you do the deployment, make sure you have built the protoc artifacts for
-every supported platform and put them under the target directory. Example
-target directory layout:
-
- + pom.xml
- + target
- + linux
- + x86_64
- protoc.exe
- + x86_32
- protoc.exe
- + aarch_64
- protoc.exe
- + ppcle_64
- protoc.exe
- + s390_64
- protoc.exe
- + osx
- + x86_64
- protoc.exe
- + x86_32
- protoc.exe
- + windows
- + x86_64
- protoc.exe
- + x86_32
- protoc.exe
-
-You will need to build the artifacts on multiple machines and gather them
-together into one place.
-
-Use the following command to deploy artifacts for the host platform to a
-staging repository.
-
-```
-$ mvn deploy -P release
-```
-
-It creates a new staging repository. Go to
-https://oss.sonatype.org/#stagingRepositories and find the repository, usually
-in the name like ``comgoogle-123``. Verify that the staging repository has all
-the binaries, close and release this repository.
-
-
-## Tested build environments
-We have successfully built artifacts on the following environments:
-- Linux x86_32 and x86_64:
- - Centos 6.9 (within Docker 1.6.1)
- - Ubuntu 14.04.5 64-bit
-- Linux aarch_64: Cross compiled with `g++-aarch64-linux-gnu` on Ubuntu 14.04.5 64-bit
-- Mac OS X x86_32 and x86_64: Mac OS X 10.9.5
diff --git a/protoc-artifacts/build-zip.sh b/protoc-artifacts/build-zip.sh
deleted file mode 100755
index 1d97725..0000000
--- a/protoc-artifacts/build-zip.sh
+++ /dev/null
@@ -1,120 +0,0 @@
-#!/bin/bash
-
-if [ $# -ne 2 ]; then
- cat <<EOF
-Usage: $0 <TARGET> <VERSION_NUMBER>
-
-TARGET: protoc | protoc-gen-javalite
-
-Example:
- $ $0 protoc 3.0.0
- $ $0 protoc-gen-javalite 3.0.0
-
-This script will download pre-built protoc or protoc plugin binaries from maven
-repository and create .zip packages suitable to be included in the github
-release page. If the target is protoc, well-known type .proto files will also be
-included. Each invocation will create 8 zip packages:
- dist/<TARGET>-<VERSION_NUMBER>-win32.zip
- dist/<TARGET>-<VERSION_NUMBER>-win64.zip
- dist/<TARGET>-<VERSION_NUMBER>-osx-aarch_64.zip
- dist/<TARGET>-<VERSION_NUMBER>-osx-x86_64.zip
- dist/<TARGET>-<VERSION_NUMBER>-linux-x86_32.zip
- dist/<TARGET>-<VERSION_NUMBER>-linux-x86_64.zip
- dist/<TARGET>-<VERSION_NUMBER>-linux-aarch_64.zip
- dist/<TARGET>-<VERSION_NUMBER>-linux-ppcle_64.zip
- dist/<TARGET>-<VERSION_NUMBER>-linux-s390_64.zip
-EOF
- exit 1
-fi
-
-TARGET=$1
-VERSION_NUMBER=$2
-
-# <zip file name> <binary file name> pairs.
-declare -a FILE_NAMES=( \
- win32.zip windows-x86_32.exe \
- win64.zip windows-x86_64.exe \
- osx-aarch_64.zip osx-aarch_64.exe \
- osx-x86_64.zip osx-x86_64.exe \
- linux-x86_32.zip linux-x86_32.exe \
- linux-x86_64.zip linux-x86_64.exe \
- linux-aarch_64.zip linux-aarch_64.exe \
- linux-ppcle_64.zip linux-ppcle_64.exe \
- linux-s390_64.zip linux-s390_64.exe \
-)
-
-# List of all well-known types to be included.
-declare -a WELL_KNOWN_TYPES=( \
- google/protobuf/descriptor.proto \
- google/protobuf/any.proto \
- google/protobuf/api.proto \
- google/protobuf/duration.proto \
- google/protobuf/empty.proto \
- google/protobuf/field_mask.proto \
- google/protobuf/source_context.proto \
- google/protobuf/struct.proto \
- google/protobuf/timestamp.proto \
- google/protobuf/type.proto \
- google/protobuf/wrappers.proto \
- google/protobuf/compiler/plugin.proto \
-)
-
-set -e
-
-# A temporary working directory to put all files.
-DIR=$(mktemp -d)
-
-# Copy over well-known types.
-mkdir -p ${DIR}/include/google/protobuf/compiler
-for PROTO in ${WELL_KNOWN_TYPES[@]}; do
- cp -f ../src/${PROTO} ${DIR}/include/${PROTO}
-done
-
-# Create a readme file.
-cat <<EOF > ${DIR}/readme.txt
-Protocol Buffers - Google's data interchange format
-Copyright 2008 Google Inc.
-https://developers.google.com/protocol-buffers/
-
-This package contains a precompiled binary version of the protocol buffer
-compiler (protoc). This binary is intended for users who want to use Protocol
-Buffers in languages other than C++ but do not want to compile protoc
-themselves. To install, simply place this binary somewhere in your PATH.
-
-If you intend to use the included well known types then don't forget to
-copy the contents of the 'include' directory somewhere as well, for example
-into '/usr/local/include/'.
-
-Please refer to our official github site for more installation instructions:
- https://github.com/protocolbuffers/protobuf
-EOF
-
-mkdir -p dist
-mkdir -p ${DIR}/bin
-# Create a zip file for each binary.
-for((i=0;i<${#FILE_NAMES[@]};i+=2));do
- ZIP_NAME=${FILE_NAMES[$i]}
- if [ ${ZIP_NAME:0:3} = "win" ]; then
- BINARY="$TARGET.exe"
- else
- BINARY="$TARGET"
- fi
- BINARY_NAME=${FILE_NAMES[$(($i+1))]}
- BINARY_URL=https://repo1.maven.org/maven2/com/google/protobuf/$TARGET/${VERSION_NUMBER}/$TARGET-${VERSION_NUMBER}-${BINARY_NAME}
- if ! wget ${BINARY_URL} -O ${DIR}/bin/$BINARY &> /dev/null; then
- echo "[ERROR] Failed to download ${BINARY_URL}" >&2
- echo "[ERROR] Skipped $TARGET-${VERSION_NAME}-${ZIP_NAME}" >&2
- continue
- fi
- TARGET_ZIP_FILE=`pwd`/dist/$TARGET-${VERSION_NUMBER}-${ZIP_NAME}
- pushd $DIR &> /dev/null
- chmod +x bin/$BINARY
- if [ "$TARGET" = "protoc" ]; then
- zip -r ${TARGET_ZIP_FILE} include bin readme.txt &> /dev/null
- else
- zip -r ${TARGET_ZIP_FILE} bin &> /dev/null
- fi
- rm bin/$BINARY
- popd &> /dev/null
- echo "[INFO] Successfully created ${TARGET_ZIP_FILE}"
-done
diff --git a/protoc-artifacts/pom.xml b/protoc-artifacts/pom.xml
deleted file mode 100644
index 8910337..0000000
--- a/protoc-artifacts/pom.xml
+++ /dev/null
@@ -1,144 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <parent>
- <groupId>com.google</groupId>
- <artifactId>google</artifactId>
- <version>1</version>
- </parent>
- <groupId>com.google.protobuf</groupId>
- <artifactId>protoc</artifactId>
- <version>3.21.7</version>
- <packaging>pom</packaging>
- <name>Protobuf Compiler</name>
- <description>
- Protobuf Compiler (protoc) is a compiler for .proto files. It generates
- language-specific code for Protobuf messages and RPC interfaces.
- </description>
- <inceptionYear>2008</inceptionYear>
- <url>https://developers.google.com/protocol-buffers/</url>
- <licenses>
- <license>
- <name>BSD-3-Clause</name>
- <url>https://opensource.org/licenses/BSD-3-Clause</url>
- <distribution>repo</distribution>
- </license>
- </licenses>
- <scm>
- <url>https://github.com/protocolbuffers/protobuf</url>
- <connection>
- scm:git:https://github.com/protocolbuffers/protobuf.git
- </connection>
- </scm>
- <build>
- <plugins>
- <plugin>
- <groupId>org.codehaus.mojo</groupId>
- <artifactId>build-helper-maven-plugin</artifactId>
- <version>1.8</version>
- <executions>
- <execution>
- <id>attach-artifacts</id>
- <phase>package</phase>
- <goals>
- <goal>attach-artifact</goal>
- </goals>
- <configuration>
- <artifacts>
- <artifact>
- <file>${basedir}/target/linux/x86_64/protoc.exe</file>
- <classifier>linux-x86_64</classifier>
- <type>exe</type>
- </artifact>
- <artifact>
- <file>${basedir}/target/linux/x86_32/protoc.exe</file>
- <classifier>linux-x86_32</classifier>
- <type>exe</type>
- </artifact>
- <artifact>
- <file>${basedir}/target/windows/x86_64/protoc.exe</file>
- <classifier>windows-x86_64</classifier>
- <type>exe</type>
- </artifact>
- <artifact>
- <file>${basedir}/target/windows/x86_32/protoc.exe</file>
- <classifier>windows-x86_32</classifier>
- <type>exe</type>
- </artifact>
- <artifact>
- <file>${basedir}/target/osx/x86_64/protoc.exe</file>
- <classifier>osx-x86_64</classifier>
- <type>exe</type>
- </artifact>
- <artifact>
- <file>${basedir}/target/osx/aarch_64/protoc.exe</file>
- <classifier>osx-aarch_64</classifier>
- <type>exe</type>
- </artifact>
- <artifact>
- <file>${basedir}/target/linux/aarch_64/protoc.exe</file>
- <classifier>linux-aarch_64</classifier>
- <type>exe</type>
- </artifact>
- <artifact>
- <file>${basedir}/target/linux/ppcle_64/protoc.exe</file>
- <classifier>linux-ppcle_64</classifier>
- <type>exe</type>
- </artifact>
- <artifact>
- <file>${basedir}/target/linux/s390_64/protoc.exe</file>
- <classifier>linux-s390_64</classifier>
- <type>exe</type>
- </artifact>
- </artifacts>
- </configuration>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
- <profiles>
- <profile>
- <id>release</id>
- <properties>
- <!-- Specify the staging repository to deploy to. This can be left
- empty for the first deployment, and Sonatype will create one. For
- subsequent deployments it should be set to what Sonatype has
- created, so that all deployments will go to the same repository.
- -->
- <staging.repository/>
- </properties>
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-gpg-plugin</artifactId>
- <version>1.5</version>
- <executions>
- <execution>
- <id>sign-artifacts</id>
- <phase>verify</phase>
- <goals>
- <goal>sign</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- <plugin>
- <groupId>org.sonatype.plugins</groupId>
- <artifactId>nexus-staging-maven-plugin</artifactId>
- <version>1.6.3</version>
- <extensions>true</extensions>
- <configuration>
- <serverId>sonatype-nexus-staging</serverId>
- <nexusUrl>https://oss.sonatype.org/</nexusUrl>
- <skipStagingRepositoryClose>true</skipStagingRepositoryClose>
- <autoReleaseAfterClose>false</autoReleaseAfterClose>
- <stagingRepositoryId>${staging.repository}</stagingRepositoryId>
- </configuration>
- </plugin>
- </plugins>
- </build>
- </profile>
- </profiles>
-</project>
diff --git a/protoc-artifacts/scl-enable-devtoolset.sh b/protoc-artifacts/scl-enable-devtoolset.sh
deleted file mode 100755
index 3089558..0000000
--- a/protoc-artifacts/scl-enable-devtoolset.sh
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/bin/bash
-set -eu -o pipefail
-
-quote() {
- local arg
- for arg in "$@"; do
- printf "'"
- printf "%s" "$arg" | sed -e "s/'/'\\\\''/g"
- printf "' "
- done
-}
-
-exec scl enable devtoolset-2 "$(quote "$@")"
diff --git a/python/.repo-metadata.json b/python/.repo-metadata.json
new file mode 100644
index 0000000..c8d71a8
--- /dev/null
+++ b/python/.repo-metadata.json
@@ -0,0 +1,11 @@
+{
+ "name": "protobuf",
+ "name_pretty": "Protocol Buffers",
+ "product_documentation": "https://developers.google.com/protocol-buffers ",
+ "client_documentation": "https://developers.google.com/protocol-buffers/docs/pythontutorial",
+ "issue_tracker": "https://github.com/protocolbuffers/protobuf/issues",
+ "release_level": "ga",
+ "language": "python",
+ "repo": "protocolbuffers/protobuf ",
+ "distribution_name": "protobuf"
+}
diff --git a/python/BUILD.bazel b/python/BUILD.bazel
new file mode 100644
index 0000000..118bb4d
--- /dev/null
+++ b/python/BUILD.bazel
@@ -0,0 +1,455 @@
+# Protobuf Python runtime
+#
+# See also code generation logic under /src/google/protobuf/compiler/python.
+#
+# Most users should depend upon public aliases in the root:
+# //:protobuf_python
+# //:well_known_types_py_pb2
+
+load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
+load("@rules_python//python:defs.bzl", "py_library")
+load("//:protobuf.bzl", "internal_py_proto_library")
+load("//build_defs:cpp_opts.bzl", "COPTS")
+load("//conformance:defs.bzl", "conformance_test")
+load(":internal.bzl", "internal_copy_files")
+
+py_library(
+ name = "protobuf_python",
+ data = select({
+ "//conditions:default": [],
+ ":use_fast_cpp_protos": [
+ ":google/protobuf/internal/_api_implementation.so",
+ ":google/protobuf/pyext/_message.so",
+ ],
+ }),
+ visibility = ["//:__pkg__"],
+ deps = [
+ ":python_srcs",
+ ":well_known_types_py_pb2",
+ ],
+)
+
+config_setting(
+ name = "use_fast_cpp_protos",
+ values = {
+ "define": "use_fast_cpp_protos=true",
+ },
+)
+
+internal_py_proto_library(
+ name = "well_known_types_py_pb2",
+ srcs = [":copied_wkt_proto_files"],
+ include = ".",
+ default_runtime = "",
+ protoc = "//:protoc",
+ srcs_version = "PY2AND3",
+ visibility = [
+ "//:__pkg__",
+ "@upb//:__subpackages__",
+ ],
+)
+
+internal_copy_files(
+ name = "copied_wkt_proto_files",
+ srcs = [
+ "//:well_known_type_protos",
+ "//src/google/protobuf:descriptor_proto_srcs",
+ ],
+ strip_prefix = "src",
+)
+
+cc_binary(
+ name = "google/protobuf/internal/_api_implementation.so",
+ srcs = ["google/protobuf/internal/api_implementation.cc"],
+ copts = COPTS + [
+ "-DPYTHON_PROTO2_CPP_IMPL_V2",
+ ],
+ linkshared = 1,
+ linkstatic = 1,
+ tags = [
+ # Exclude this target from wildcard expansion (//...) because it may
+ # not even be buildable. It will be built if it is needed according
+ # to :use_fast_cpp_protos.
+ # https://docs.bazel.build/versions/master/be/common-definitions.html#common-attributes
+ "manual",
+ ],
+ deps = select({
+ "//conditions:default": [],
+ ":use_fast_cpp_protos": ["//external:python_headers"],
+ }),
+)
+
+config_setting(
+ name = "allow_oversize_protos",
+ values = {
+ "define": "allow_oversize_protos=true",
+ },
+)
+
+cc_binary(
+ name = "google/protobuf/pyext/_message.so",
+ srcs = glob([
+ "google/protobuf/pyext/*.cc",
+ "google/protobuf/pyext/*.h",
+ ]),
+ copts = COPTS + [
+ "-DGOOGLE_PROTOBUF_HAS_ONEOF=1",
+ ] + select({
+ "//conditions:default": [],
+ ":allow_oversize_protos": ["-DPROTOBUF_PYTHON_ALLOW_OVERSIZE_PROTOS=1"],
+ }),
+ includes = ["."],
+ linkshared = 1,
+ linkstatic = 1,
+ tags = [
+ # Exclude this target from wildcard expansion (//...) because it may
+ # not even be buildable. It will be built if it is needed according
+ # to :use_fast_cpp_protos.
+ # https://docs.bazel.build/versions/master/be/common-definitions.html#common-attributes
+ "manual",
+ ],
+ deps = [
+ ":proto_api",
+ "//:protobuf",
+ ] + select({
+ "//conditions:default": [],
+ ":use_fast_cpp_protos": ["//external:python_headers"],
+ }),
+)
+
+py_library(
+ name = "python_srcs",
+ srcs = glob(
+ [
+ "google/protobuf/**/*.py",
+ ],
+ exclude = [
+ "google/protobuf/internal/*_test.py",
+ "google/protobuf/internal/test_util.py",
+ "google/protobuf/internal/import_test_package/__init__.py",
+ ],
+ ),
+ imports = ["python"],
+ srcs_version = "PY2AND3",
+ visibility = [
+ "//:__pkg__",
+ "@upb//:__subpackages__",
+ ],
+)
+
+py_library(
+ name = "python_test_srcs",
+ srcs = glob([
+ "google/protobuf/internal/*_test.py",
+ ]) + [
+ "google/protobuf/internal/test_util.py",
+ "google/protobuf/internal/import_test_package/__init__.py",
+ ],
+ imports = ["python"],
+ srcs_version = "PY3",
+ visibility = [
+ "//:__pkg__",
+ "@upb//:__subpackages__",
+ ],
+)
+
+################################################################################
+# Tests
+################################################################################
+
+internal_copy_files(
+ name = "copied_test_proto_files",
+ testonly = 1,
+ srcs = [
+ "//:test_proto_srcs",
+ "//src/google/protobuf/util:test_proto_srcs",
+ ],
+ strip_prefix = "src",
+)
+
+internal_copy_files(
+ name = "copied_test_messages_proto2_files",
+ testonly = 1,
+ srcs = [
+ "//src/google/protobuf:test_messages_proto2.proto",
+ ],
+ strip_prefix = "src",
+)
+
+internal_copy_files(
+ name = "copied_test_messages_proto3_files",
+ testonly = 1,
+ srcs = [
+ "//src/google/protobuf:test_messages_proto3.proto",
+ ],
+ strip_prefix = "src",
+)
+
+internal_py_proto_library(
+ name = "python_common_test_protos",
+ testonly = 1,
+ srcs = [":copied_test_proto_files"],
+ include = ".",
+ default_runtime = "",
+ protoc = "//:protoc",
+ srcs_version = "PY2AND3",
+ visibility = ["//:__pkg__"],
+ deps = [":well_known_types_py_pb2"],
+)
+
+internal_py_proto_library(
+ name = "python_specific_test_protos",
+ testonly = 1,
+ srcs = glob([
+ "google/protobuf/internal/*.proto",
+ "google/protobuf/internal/import_test_package/*.proto",
+ ]),
+ include = ".",
+ default_runtime = ":protobuf_python",
+ protoc = "//:protoc",
+ srcs_version = "PY2AND3",
+ visibility = ["//:__pkg__"],
+ deps = [":python_common_test_protos"],
+)
+
+internal_py_proto_library(
+ name = "test_messages_proto2_py_proto",
+ testonly = 1,
+ srcs = [":copied_test_messages_proto2_files"],
+ include = ".",
+ default_runtime = "//:protobuf_python",
+ protoc = "//:protoc",
+ visibility = [
+ "//conformance:__pkg__",
+ "//python:__subpackages__",
+ ],
+)
+
+internal_py_proto_library(
+ name = "test_messages_proto3_py_proto",
+ testonly = 1,
+ srcs = [":copied_test_messages_proto3_files"],
+ include = ".",
+ default_runtime = "//:protobuf_python",
+ protoc = "//:protoc",
+ visibility = [
+ "//conformance:__pkg__",
+ "//python:__subpackages__",
+ ],
+ deps = [":well_known_types_py_pb2"],
+)
+
+py_library(
+ name = "python_test_lib",
+ testonly = 1,
+ srcs = [
+ "google/protobuf/internal/import_test_package/__init__.py",
+ "google/protobuf/internal/test_util.py",
+ ],
+ imports = ["python"],
+ srcs_version = "PY2AND3",
+ deps = [
+ ":protobuf_python",
+ ":python_common_test_protos",
+ ":python_specific_test_protos",
+ ],
+)
+
+py_test(
+ name = "descriptor_database_test",
+ srcs = ["google/protobuf/internal/descriptor_database_test.py"],
+ deps = [":python_test_lib"],
+)
+
+py_test(
+ name = "descriptor_pool_test",
+ srcs = ["google/protobuf/internal/descriptor_pool_test.py"],
+ deps = [":python_test_lib"],
+)
+
+py_test(
+ name = "descriptor_test",
+ srcs = ["google/protobuf/internal/descriptor_test.py"],
+ imports = ["."],
+ deps = [":python_test_lib"],
+)
+
+py_test(
+ name = "generator_test",
+ srcs = ["google/protobuf/internal/generator_test.py"],
+ imports = ["."],
+ deps = [":python_test_lib"],
+)
+
+py_test(
+ name = "import_test",
+ srcs = ["google/protobuf/internal/import_test.py"],
+ imports = ["."],
+ deps = [":python_test_lib"],
+)
+
+py_test(
+ name = "json_format_test",
+ srcs = ["google/protobuf/internal/json_format_test.py"],
+ imports = ["."],
+ deps = [":python_test_lib"],
+)
+
+py_test(
+ name = "keywords_test",
+ srcs = ["google/protobuf/internal/keywords_test.py"],
+ imports = ["."],
+ deps = [":python_test_lib"],
+)
+
+py_test(
+ name = "message_factory_test",
+ srcs = ["google/protobuf/internal/message_factory_test.py"],
+ imports = ["."],
+ deps = [":python_test_lib"],
+)
+
+py_test(
+ name = "message_test",
+ srcs = ["google/protobuf/internal/message_test.py"],
+ data = glob(["testdata/golden_pickle_*"]) + [
+ "//src/google/protobuf:testdata",
+ ],
+ imports = ["."],
+ deps = [":python_test_lib"],
+)
+
+py_test(
+ name = "proto_builder_test",
+ srcs = ["google/protobuf/internal/proto_builder_test.py"],
+ imports = ["."],
+ deps = [":python_test_lib"],
+)
+
+py_test(
+ name = "reflection_test",
+ srcs = ["google/protobuf/internal/reflection_test.py"],
+ imports = ["."],
+ deps = [":python_test_lib"],
+)
+
+py_test(
+ name = "service_reflection_test",
+ srcs = ["google/protobuf/internal/service_reflection_test.py"],
+ imports = ["."],
+ deps = [":python_test_lib"],
+)
+
+py_test(
+ name = "symbol_database_test",
+ srcs = ["google/protobuf/internal/symbol_database_test.py"],
+ imports = ["."],
+ deps = [":python_test_lib"],
+)
+
+py_test(
+ name = "text_encoding_test",
+ srcs = ["google/protobuf/internal/text_encoding_test.py"],
+ imports = ["."],
+ deps = [":python_test_lib"],
+)
+
+py_test(
+ name = "text_format_test",
+ srcs = ["google/protobuf/internal/text_format_test.py"],
+ data = ["//src/google/protobuf:testdata"],
+ imports = ["."],
+ deps = [":python_test_lib"],
+)
+
+py_test(
+ name = "unknown_fields_test",
+ srcs = ["google/protobuf/internal/unknown_fields_test.py"],
+ imports = ["."],
+ deps = [":python_test_lib"],
+)
+
+py_test(
+ name = "well_known_types_test",
+ srcs = ["google/protobuf/internal/well_known_types_test.py"],
+ imports = ["."],
+ deps = [":python_test_lib"],
+)
+
+py_test(
+ name = "wire_format_test",
+ srcs = ["google/protobuf/internal/wire_format_test.py"],
+ imports = ["."],
+ deps = [":python_test_lib"],
+)
+
+cc_library(
+ name = "proto_api",
+ hdrs = ["google/protobuf/proto_api.h"],
+ visibility = ["//visibility:public"],
+ deps = [
+ "//external:python_headers",
+ ],
+)
+
+py_test(
+ name = "python_version",
+ srcs = ["python_version.py"],
+)
+
+conformance_test(
+ name = "conformance_test",
+ env = {"PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": "python"},
+ failure_list = "//conformance:failure_list_python.txt",
+ target_compatible_with = select({
+ ":use_fast_cpp_protos": ["@platforms//:incompatible"],
+ "//conditions:default": [],
+ }),
+ testee = "//conformance:conformance_python",
+ text_format_failure_list = "//conformance:text_format_failure_list_python.txt",
+)
+
+# Note: this requires --define=use_fast_cpp_protos=true
+conformance_test(
+ name = "conformance_test_cpp",
+ env = {"PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": "cpp"},
+ failure_list = "//conformance:failure_list_python.txt",
+ target_compatible_with = select({
+ ":use_fast_cpp_protos": [],
+ "//conditions:default": ["@platforms//:incompatible"],
+ }),
+ testee = "//conformance:conformance_python",
+ text_format_failure_list = "//conformance:text_format_failure_list_python_cpp.txt",
+)
+
+################################################################################
+# Distribution files
+################################################################################
+
+pkg_files(
+ name = "dist_files",
+ srcs = glob([
+ "google/**/*.proto",
+ "google/**/*.py",
+ "google/protobuf/internal/*.cc",
+ "google/protobuf/pyext/*.cc",
+ "google/protobuf/pyext/*.h",
+ ]) + [
+ "BUILD.bazel",
+ "MANIFEST.in",
+ "README.md",
+ "google/protobuf/proto_api.h",
+ "google/protobuf/pyext/README",
+ "google/protobuf/python_protobuf.h",
+ "internal.bzl",
+ "mox.py",
+ "python_version.py",
+ "release.sh",
+ "setup.cfg",
+ "setup.py",
+ "stubout.py",
+ "tox.ini",
+ ],
+ strip_prefix = strip_prefix.from_root(""),
+ visibility = ["//pkg:__pkg__"],
+)
diff --git a/python/README.md b/python/README.md
index 27f22c8..6549fb6 100644
--- a/python/README.md
+++ b/python/README.md
@@ -30,33 +30,33 @@
$ python -V
-2) If you do not have setuptools installed, note that it will be
+2) Make sure you have Bazel 0.5.4 or later (or CMake 3.5 or later).
+
+3) If you do not have setuptools installed, note that it will be
downloaded and installed automatically as soon as you run `setup.py`.
If you would rather install it manually, you may do so by following
- the instructions on [this page](https://packaging.python.org/en/latest/installing.html#setup-for-installing-packages).
+ the instructions on [this page](https://packaging.python.org/en/latest/tutorials/installing-packages/).
-3) Build the C++ code, or install a binary distribution of `protoc`. If
+4) Build the C++ code, or install a binary distribution of `protoc`. If
you install a binary distribution, make sure that it is the same
version as this package. If in doubt, run:
$ protoc --version
-4) Build and run the tests:
+5) Build and run the tests:
$ python setup.py build
$ python setup.py test
To build, test, and use the C++ implementation, you must first compile
- `libprotobuf.so`:
-
- $ (cd .. && make)
+ `libprotobuf.so` using either [Bazel](../README.md) or [CMake](../src/README.md):
On OS X:
If you are running a Homebrew-provided Python, you must make sure another
version of protobuf is not already installed, as Homebrew's Python will
- search `/usr/local/lib` for `libprotobuf.so` before it searches
- `../src/.libs`.
+ search `/usr/local/lib` for `libprotobuf.so` before it searches the compiled
+ binaries.
You can either unlink Homebrew's protobuf or install the `libprotobuf` you
built earlier:
@@ -65,18 +65,18 @@
or
- $ (cd .. && make install)
+ $ (cd .. && cmake . && make install)
On other *nix:
You must make `libprotobuf.so` dynamically available. You can either
install libprotobuf you built earlier, or set `LD_LIBRARY_PATH`:
- $ export LD_LIBRARY_PATH=../src/.libs
+ $ (cd .. && cmake . && make -j20 install)
or
- $ (cd .. && make install)
+ $ export LD_LIBRARY_PATH=../bazel-bin
To build the C++ implementation run:
@@ -98,7 +98,7 @@
We do not know if or when it might be fixed. We also do not know
how likely it is that this bug will affect users in practice.
-5) Install:
+6) Install:
$ python setup.py install
diff --git a/python/docs/google/protobuf.rst b/python/docs/google/protobuf.rst
index b26102e..6c472e1 100644
--- a/python/docs/google/protobuf.rst
+++ b/python/docs/google/protobuf.rst
@@ -5,7 +5,7 @@
.. warning::
You are reading the documentation for the `latest committed changes
- <https://github.com/protocolbuffers/protobuf/tree/master/python>`_ of
+ <https://github.com/protocolbuffers/protobuf/tree/main/python>`_ of
the `Protocol Buffers package for Python
<https://developers.google.com/protocol-buffers/docs/pythontutorial>`_.
Some features may not yet be released. Read the documentation for the
diff --git a/python/docs/google/protobuf/any_pb2.rst b/python/docs/google/protobuf/any_pb2.rst
index b6f47ef..9fca2d2 100644
--- a/python/docs/google/protobuf/any_pb2.rst
+++ b/python/docs/google/protobuf/any_pb2.rst
@@ -5,7 +5,7 @@
.. warning::
You are reading the documentation for the `latest committed changes
- <https://github.com/protocolbuffers/protobuf/tree/master/python>`_ of
+ <https://github.com/protocolbuffers/protobuf/tree/main/python>`_ of
the `Protocol Buffers package for Python
<https://developers.google.com/protocol-buffers/docs/pythontutorial>`_.
Some features may not yet be released. Read the documentation for the
diff --git a/python/docs/google/protobuf/descriptor.rst b/python/docs/google/protobuf/descriptor.rst
index 29b0774..5a8a264 100644
--- a/python/docs/google/protobuf/descriptor.rst
+++ b/python/docs/google/protobuf/descriptor.rst
@@ -5,7 +5,7 @@
.. warning::
You are reading the documentation for the `latest committed changes
- <https://github.com/protocolbuffers/protobuf/tree/master/python>`_ of
+ <https://github.com/protocolbuffers/protobuf/tree/main/python>`_ of
the `Protocol Buffers package for Python
<https://developers.google.com/protocol-buffers/docs/pythontutorial>`_.
Some features may not yet be released. Read the documentation for the
diff --git a/python/docs/google/protobuf/descriptor_database.rst b/python/docs/google/protobuf/descriptor_database.rst
index 1b8b390..660fc41 100644
--- a/python/docs/google/protobuf/descriptor_database.rst
+++ b/python/docs/google/protobuf/descriptor_database.rst
@@ -5,7 +5,7 @@
.. warning::
You are reading the documentation for the `latest committed changes
- <https://github.com/protocolbuffers/protobuf/tree/master/python>`_ of
+ <https://github.com/protocolbuffers/protobuf/tree/main/python>`_ of
the `Protocol Buffers package for Python
<https://developers.google.com/protocol-buffers/docs/pythontutorial>`_.
Some features may not yet be released. Read the documentation for the
diff --git a/python/docs/google/protobuf/descriptor_pb2.rst b/python/docs/google/protobuf/descriptor_pb2.rst
index 94eec35..9f20f49 100644
--- a/python/docs/google/protobuf/descriptor_pb2.rst
+++ b/python/docs/google/protobuf/descriptor_pb2.rst
@@ -5,7 +5,7 @@
.. warning::
You are reading the documentation for the `latest committed changes
- <https://github.com/protocolbuffers/protobuf/tree/master/python>`_ of
+ <https://github.com/protocolbuffers/protobuf/tree/main/python>`_ of
the `Protocol Buffers package for Python
<https://developers.google.com/protocol-buffers/docs/pythontutorial>`_.
Some features may not yet be released. Read the documentation for the
diff --git a/python/docs/google/protobuf/descriptor_pool.rst b/python/docs/google/protobuf/descriptor_pool.rst
index c2ee33e..aa8de30 100644
--- a/python/docs/google/protobuf/descriptor_pool.rst
+++ b/python/docs/google/protobuf/descriptor_pool.rst
@@ -5,7 +5,7 @@
.. warning::
You are reading the documentation for the `latest committed changes
- <https://github.com/protocolbuffers/protobuf/tree/master/python>`_ of
+ <https://github.com/protocolbuffers/protobuf/tree/main/python>`_ of
the `Protocol Buffers package for Python
<https://developers.google.com/protocol-buffers/docs/pythontutorial>`_.
Some features may not yet be released. Read the documentation for the
diff --git a/python/docs/google/protobuf/duration_pb2.rst b/python/docs/google/protobuf/duration_pb2.rst
index 4233e3c..9e9a032 100644
--- a/python/docs/google/protobuf/duration_pb2.rst
+++ b/python/docs/google/protobuf/duration_pb2.rst
@@ -5,7 +5,7 @@
.. warning::
You are reading the documentation for the `latest committed changes
- <https://github.com/protocolbuffers/protobuf/tree/master/python>`_ of
+ <https://github.com/protocolbuffers/protobuf/tree/main/python>`_ of
the `Protocol Buffers package for Python
<https://developers.google.com/protocol-buffers/docs/pythontutorial>`_.
Some features may not yet be released. Read the documentation for the
diff --git a/python/docs/google/protobuf/empty_pb2.rst b/python/docs/google/protobuf/empty_pb2.rst
index c386a4c..f117553 100644
--- a/python/docs/google/protobuf/empty_pb2.rst
+++ b/python/docs/google/protobuf/empty_pb2.rst
@@ -5,7 +5,7 @@
.. warning::
You are reading the documentation for the `latest committed changes
- <https://github.com/protocolbuffers/protobuf/tree/master/python>`_ of
+ <https://github.com/protocolbuffers/protobuf/tree/main/python>`_ of
the `Protocol Buffers package for Python
<https://developers.google.com/protocol-buffers/docs/pythontutorial>`_.
Some features may not yet be released. Read the documentation for the
diff --git a/python/docs/google/protobuf/field_mask_pb2.rst b/python/docs/google/protobuf/field_mask_pb2.rst
index d9d8070..1c11f46 100644
--- a/python/docs/google/protobuf/field_mask_pb2.rst
+++ b/python/docs/google/protobuf/field_mask_pb2.rst
@@ -5,7 +5,7 @@
.. warning::
You are reading the documentation for the `latest committed changes
- <https://github.com/protocolbuffers/protobuf/tree/master/python>`_ of
+ <https://github.com/protocolbuffers/protobuf/tree/main/python>`_ of
the `Protocol Buffers package for Python
<https://developers.google.com/protocol-buffers/docs/pythontutorial>`_.
Some features may not yet be released. Read the documentation for the
diff --git a/python/docs/google/protobuf/internal/containers.rst b/python/docs/google/protobuf/internal/containers.rst
index c3b8e59..67009bc 100644
--- a/python/docs/google/protobuf/internal/containers.rst
+++ b/python/docs/google/protobuf/internal/containers.rst
@@ -5,7 +5,7 @@
.. warning::
You are reading the documentation for the `latest committed changes
- <https://github.com/protocolbuffers/protobuf/tree/master/python>`_ of
+ <https://github.com/protocolbuffers/protobuf/tree/main/python>`_ of
the `Protocol Buffers package for Python
<https://developers.google.com/protocol-buffers/docs/pythontutorial>`_.
Some features may not yet be released. Read the documentation for the
diff --git a/python/docs/google/protobuf/json_format.rst b/python/docs/google/protobuf/json_format.rst
index eb3b0c5..71023fc 100644
--- a/python/docs/google/protobuf/json_format.rst
+++ b/python/docs/google/protobuf/json_format.rst
@@ -5,7 +5,7 @@
.. warning::
You are reading the documentation for the `latest committed changes
- <https://github.com/protocolbuffers/protobuf/tree/master/python>`_ of
+ <https://github.com/protocolbuffers/protobuf/tree/main/python>`_ of
the `Protocol Buffers package for Python
<https://developers.google.com/protocol-buffers/docs/pythontutorial>`_.
Some features may not yet be released. Read the documentation for the
diff --git a/python/docs/google/protobuf/message.rst b/python/docs/google/protobuf/message.rst
index a204248..c33561f 100644
--- a/python/docs/google/protobuf/message.rst
+++ b/python/docs/google/protobuf/message.rst
@@ -5,7 +5,7 @@
.. warning::
You are reading the documentation for the `latest committed changes
- <https://github.com/protocolbuffers/protobuf/tree/master/python>`_ of
+ <https://github.com/protocolbuffers/protobuf/tree/main/python>`_ of
the `Protocol Buffers package for Python
<https://developers.google.com/protocol-buffers/docs/pythontutorial>`_.
Some features may not yet be released. Read the documentation for the
diff --git a/python/docs/google/protobuf/message_factory.rst b/python/docs/google/protobuf/message_factory.rst
index 93183cc..19f6623 100644
--- a/python/docs/google/protobuf/message_factory.rst
+++ b/python/docs/google/protobuf/message_factory.rst
@@ -5,7 +5,7 @@
.. warning::
You are reading the documentation for the `latest committed changes
- <https://github.com/protocolbuffers/protobuf/tree/master/python>`_ of
+ <https://github.com/protocolbuffers/protobuf/tree/main/python>`_ of
the `Protocol Buffers package for Python
<https://developers.google.com/protocol-buffers/docs/pythontutorial>`_.
Some features may not yet be released. Read the documentation for the
diff --git a/python/docs/google/protobuf/proto_builder.rst b/python/docs/google/protobuf/proto_builder.rst
index 36243a2..718f612 100644
--- a/python/docs/google/protobuf/proto_builder.rst
+++ b/python/docs/google/protobuf/proto_builder.rst
@@ -5,7 +5,7 @@
.. warning::
You are reading the documentation for the `latest committed changes
- <https://github.com/protocolbuffers/protobuf/tree/master/python>`_ of
+ <https://github.com/protocolbuffers/protobuf/tree/main/python>`_ of
the `Protocol Buffers package for Python
<https://developers.google.com/protocol-buffers/docs/pythontutorial>`_.
Some features may not yet be released. Read the documentation for the
diff --git a/python/docs/google/protobuf/reflection.rst b/python/docs/google/protobuf/reflection.rst
index d177fc0..c806834 100644
--- a/python/docs/google/protobuf/reflection.rst
+++ b/python/docs/google/protobuf/reflection.rst
@@ -5,7 +5,7 @@
.. warning::
You are reading the documentation for the `latest committed changes
- <https://github.com/protocolbuffers/protobuf/tree/master/python>`_ of
+ <https://github.com/protocolbuffers/protobuf/tree/main/python>`_ of
the `Protocol Buffers package for Python
<https://developers.google.com/protocol-buffers/docs/pythontutorial>`_.
Some features may not yet be released. Read the documentation for the
diff --git a/python/docs/google/protobuf/service.rst b/python/docs/google/protobuf/service.rst
index 6d71f81..ddc427f 100644
--- a/python/docs/google/protobuf/service.rst
+++ b/python/docs/google/protobuf/service.rst
@@ -5,7 +5,7 @@
.. warning::
You are reading the documentation for the `latest committed changes
- <https://github.com/protocolbuffers/protobuf/tree/master/python>`_ of
+ <https://github.com/protocolbuffers/protobuf/tree/main/python>`_ of
the `Protocol Buffers package for Python
<https://developers.google.com/protocol-buffers/docs/pythontutorial>`_.
Some features may not yet be released. Read the documentation for the
diff --git a/python/docs/google/protobuf/service_reflection.rst b/python/docs/google/protobuf/service_reflection.rst
index 30f30dd..f088c17 100644
--- a/python/docs/google/protobuf/service_reflection.rst
+++ b/python/docs/google/protobuf/service_reflection.rst
@@ -5,7 +5,7 @@
.. warning::
You are reading the documentation for the `latest committed changes
- <https://github.com/protocolbuffers/protobuf/tree/master/python>`_ of
+ <https://github.com/protocolbuffers/protobuf/tree/main/python>`_ of
the `Protocol Buffers package for Python
<https://developers.google.com/protocol-buffers/docs/pythontutorial>`_.
Some features may not yet be released. Read the documentation for the
diff --git a/python/docs/google/protobuf/struct_pb2.rst b/python/docs/google/protobuf/struct_pb2.rst
index 9179eed..7b25487 100644
--- a/python/docs/google/protobuf/struct_pb2.rst
+++ b/python/docs/google/protobuf/struct_pb2.rst
@@ -5,7 +5,7 @@
.. warning::
You are reading the documentation for the `latest committed changes
- <https://github.com/protocolbuffers/protobuf/tree/master/python>`_ of
+ <https://github.com/protocolbuffers/protobuf/tree/main/python>`_ of
the `Protocol Buffers package for Python
<https://developers.google.com/protocol-buffers/docs/pythontutorial>`_.
Some features may not yet be released. Read the documentation for the
diff --git a/python/docs/google/protobuf/symbol_database.rst b/python/docs/google/protobuf/symbol_database.rst
index 6ea7352..99a8c10 100644
--- a/python/docs/google/protobuf/symbol_database.rst
+++ b/python/docs/google/protobuf/symbol_database.rst
@@ -5,7 +5,7 @@
.. warning::
You are reading the documentation for the `latest committed changes
- <https://github.com/protocolbuffers/protobuf/tree/master/python>`_ of
+ <https://github.com/protocolbuffers/protobuf/tree/main/python>`_ of
the `Protocol Buffers package for Python
<https://developers.google.com/protocol-buffers/docs/pythontutorial>`_.
Some features may not yet be released. Read the documentation for the
diff --git a/python/docs/google/protobuf/text_encoding.rst b/python/docs/google/protobuf/text_encoding.rst
index a2eb959..5a070e5 100644
--- a/python/docs/google/protobuf/text_encoding.rst
+++ b/python/docs/google/protobuf/text_encoding.rst
@@ -5,7 +5,7 @@
.. warning::
You are reading the documentation for the `latest committed changes
- <https://github.com/protocolbuffers/protobuf/tree/master/python>`_ of
+ <https://github.com/protocolbuffers/protobuf/tree/main/python>`_ of
the `Protocol Buffers package for Python
<https://developers.google.com/protocol-buffers/docs/pythontutorial>`_.
Some features may not yet be released. Read the documentation for the
diff --git a/python/docs/google/protobuf/text_format.rst b/python/docs/google/protobuf/text_format.rst
index 686b8fc..5c2c346 100644
--- a/python/docs/google/protobuf/text_format.rst
+++ b/python/docs/google/protobuf/text_format.rst
@@ -5,7 +5,7 @@
.. warning::
You are reading the documentation for the `latest committed changes
- <https://github.com/protocolbuffers/protobuf/tree/master/python>`_ of
+ <https://github.com/protocolbuffers/protobuf/tree/main/python>`_ of
the `Protocol Buffers package for Python
<https://developers.google.com/protocol-buffers/docs/pythontutorial>`_.
Some features may not yet be released. Read the documentation for the
diff --git a/python/docs/google/protobuf/timestamp_pb2.rst b/python/docs/google/protobuf/timestamp_pb2.rst
index 540df83..62e4708 100644
--- a/python/docs/google/protobuf/timestamp_pb2.rst
+++ b/python/docs/google/protobuf/timestamp_pb2.rst
@@ -5,7 +5,7 @@
.. warning::
You are reading the documentation for the `latest committed changes
- <https://github.com/protocolbuffers/protobuf/tree/master/python>`_ of
+ <https://github.com/protocolbuffers/protobuf/tree/main/python>`_ of
the `Protocol Buffers package for Python
<https://developers.google.com/protocol-buffers/docs/pythontutorial>`_.
Some features may not yet be released. Read the documentation for the
diff --git a/python/docs/google/protobuf/type_pb2.rst b/python/docs/google/protobuf/type_pb2.rst
index e9b19d7..cbd4150 100644
--- a/python/docs/google/protobuf/type_pb2.rst
+++ b/python/docs/google/protobuf/type_pb2.rst
@@ -5,7 +5,7 @@
.. warning::
You are reading the documentation for the `latest committed changes
- <https://github.com/protocolbuffers/protobuf/tree/master/python>`_ of
+ <https://github.com/protocolbuffers/protobuf/tree/main/python>`_ of
the `Protocol Buffers package for Python
<https://developers.google.com/protocol-buffers/docs/pythontutorial>`_.
Some features may not yet be released. Read the documentation for the
diff --git a/python/docs/google/protobuf/unknown_fields.rst b/python/docs/google/protobuf/unknown_fields.rst
new file mode 100644
index 0000000..7ba283d
--- /dev/null
+++ b/python/docs/google/protobuf/unknown_fields.rst
@@ -0,0 +1,21 @@
+.. DO NOT EDIT, generated by generate_docs.py.
+
+.. ifconfig:: build_env == 'readthedocs'
+
+ .. warning::
+
+ You are reading the documentation for the `latest committed changes
+ <https://github.com/protocolbuffers/protobuf/tree/main/python>`_ of
+ the `Protocol Buffers package for Python
+ <https://developers.google.com/protocol-buffers/docs/pythontutorial>`_.
+ Some features may not yet be released. Read the documentation for the
+ latest released package at `googleapis.dev
+ <https://googleapis.dev/python/protobuf/latest/>`_.
+
+google.protobuf.unknown_fields
+==============================
+
+.. automodule:: google.protobuf.unknown_fields
+ :members:
+ :inherited-members:
+ :undoc-members:
diff --git a/python/docs/google/protobuf/wrappers_pb2.rst b/python/docs/google/protobuf/wrappers_pb2.rst
index 8f29aa7..64f9cbb 100644
--- a/python/docs/google/protobuf/wrappers_pb2.rst
+++ b/python/docs/google/protobuf/wrappers_pb2.rst
@@ -5,7 +5,7 @@
.. warning::
You are reading the documentation for the `latest committed changes
- <https://github.com/protocolbuffers/protobuf/tree/master/python>`_ of
+ <https://github.com/protocolbuffers/protobuf/tree/main/python>`_ of
the `Protocol Buffers package for Python
<https://developers.google.com/protocol-buffers/docs/pythontutorial>`_.
Some features may not yet be released. Read the documentation for the
diff --git a/python/docs/index.rst b/python/docs/index.rst
index 5535b39..544b18e 100644
--- a/python/docs/index.rst
+++ b/python/docs/index.rst
@@ -52,6 +52,7 @@
google/protobuf/text_format
google/protobuf/timestamp_pb2
google/protobuf/type_pb2
+ google/protobuf/unknown_fields
google/protobuf/wrappers_pb2
.. END REFTOC.
diff --git a/python/google/protobuf/descriptor.py b/python/google/protobuf/descriptor.py
index f5a0caa..997f6db 100644
--- a/python/google/protobuf/descriptor.py
+++ b/python/google/protobuf/descriptor.py
@@ -873,11 +873,14 @@
Args:
name (str): Name of the method.
+
Returns:
- MethodDescriptor or None: the descriptor for the requested method, if
- found.
+ MethodDescriptor: The descriptor for the requested method.
+
+ Raises:
+ KeyError: if the method cannot be found in the service.
"""
- return self.methods_by_name.get(name, None)
+ return self.methods_by_name[name]
def CopyToProto(self, proto):
"""Copies this to a descriptor_pb2.ServiceDescriptorProto.
@@ -1018,13 +1021,7 @@
# FileDescriptor() is called from various places, not only from generated
# files, to register dynamic proto files and messages.
# pylint: disable=g-explicit-bool-comparison
- if serialized_pb == b'':
- # Cpp generated code must be linked in if serialized_pb is ''
- try:
- return _message.default_pool.FindFileByName(name)
- except KeyError:
- raise RuntimeError('Please link in cpp generated lib for %s' % (name))
- elif serialized_pb:
+ if serialized_pb:
return _message.default_pool.AddSerializedFile(serialized_pb)
else:
return super(FileDescriptor, cls).__new__(cls)
diff --git a/python/google/protobuf/descriptor_pool.py b/python/google/protobuf/descriptor_pool.py
index 911372a..dccac5e 100644
--- a/python/google/protobuf/descriptor_pool.py
+++ b/python/google/protobuf/descriptor_pool.py
@@ -144,9 +144,6 @@
self._service_descriptors = {}
self._file_descriptors = {}
self._toplevel_extensions = {}
- # TODO(jieluo): Remove _file_desc_by_toplevel_extension after
- # maybe year 2020 for compatibility issue (with 3.4.1 only).
- self._file_desc_by_toplevel_extension = {}
self._top_enum_values = {}
# We store extensions in two two-level mappings: The first key is the
# descriptor of the message being extended, the second key is the extension
@@ -220,7 +217,7 @@
file_desc.serialized_pb = serialized_file_desc_proto
return file_desc
- # Add Descriptor to descriptor pool is dreprecated. Please use Add()
+ # Add Descriptor to descriptor pool is deprecated. Please use Add()
# or AddSerializedFile() to add a FileDescriptorProto instead.
@_Deprecated
def AddDescriptor(self, desc):
@@ -245,7 +242,7 @@
self._descriptors[desc.full_name] = desc
self._AddFileDescriptor(desc.file)
- # Add EnumDescriptor to descriptor pool is dreprecated. Please use Add()
+ # Add EnumDescriptor to descriptor pool is deprecated. Please use Add()
# or AddSerializedFile() to add a FileDescriptorProto instead.
@_Deprecated
def AddEnumDescriptor(self, enum_desc):
@@ -286,7 +283,7 @@
self._top_enum_values[full_name] = enum_value
self._AddFileDescriptor(enum_desc.file)
- # Add ServiceDescriptor to descriptor pool is dreprecated. Please use Add()
+ # Add ServiceDescriptor to descriptor pool is deprecated. Please use Add()
# or AddSerializedFile() to add a FileDescriptorProto instead.
@_Deprecated
def AddServiceDescriptor(self, service_desc):
@@ -307,7 +304,7 @@
service_desc.file.name)
self._service_descriptors[service_desc.full_name] = service_desc
- # Add ExtensionDescriptor to descriptor pool is dreprecated. Please use Add()
+ # Add ExtensionDescriptor to descriptor pool is deprecated. Please use Add()
# or AddSerializedFile() to add a FileDescriptorProto instead.
@_Deprecated
def AddExtensionDescriptor(self, extension):
@@ -331,6 +328,8 @@
raise TypeError('Expected an extension descriptor.')
if extension.extension_scope is None:
+ self._CheckConflictRegister(
+ extension, extension.full_name, extension.file.name)
self._toplevel_extensions[extension.full_name] = extension
try:
@@ -372,12 +371,6 @@
"""
self._AddFileDescriptor(file_desc)
- # TODO(jieluo): This is a temporary solution for FieldDescriptor.file.
- # FieldDescriptor.file is added in code gen. Remove this solution after
- # maybe 2020 for compatibility reason (with 3.4.1 only).
- for extension in file_desc.extensions_by_name.values():
- self._file_desc_by_toplevel_extension[
- extension.full_name] = file_desc
def _AddFileDescriptor(self, file_desc):
"""Adds a FileDescriptor to the pool, non-recursively.
@@ -483,7 +476,7 @@
pass
try:
- return self._file_desc_by_toplevel_extension[symbol]
+ return self._toplevel_extensions[symbol].file
except KeyError:
pass
@@ -792,8 +785,6 @@
file_descriptor.package, scope)
file_descriptor.extensions_by_name[extension_desc.name] = (
extension_desc)
- self._file_desc_by_toplevel_extension[extension_desc.full_name] = (
- file_descriptor)
for desc_proto in file_proto.message_type:
self._SetAllFieldTypes(file_proto.package, desc_proto, scope)
diff --git a/python/google/protobuf/internal/api_implementation.py b/python/google/protobuf/internal/api_implementation.py
index 7458648..3b81f27 100644
--- a/python/google/protobuf/internal/api_implementation.py
+++ b/python/google/protobuf/internal/api_implementation.py
@@ -151,12 +151,6 @@
return _implementation_type
-def _SetType(implementation_type):
- """Never use! Only for protobuf benchmark."""
- global _implementation_type
- _implementation_type = implementation_type
-
-
# See comment on 'Type' above.
# TODO(jieluo): Remove the API, it returns a constant. b/228102101
def Version():
diff --git a/python/google/protobuf/internal/descriptor_pool_test.py b/python/google/protobuf/internal/descriptor_pool_test.py
index 9e451b4..efd909a 100644
--- a/python/google/protobuf/internal/descriptor_pool_test.py
+++ b/python/google/protobuf/internal/descriptor_pool_test.py
@@ -33,7 +33,6 @@
__author__ = 'matthewtoia@google.com (Matt Toia)'
import copy
-import os
import unittest
import warnings
@@ -415,7 +414,6 @@
field = file_json.message_types_by_name['class'].fields_by_name['int_field']
self.assertEqual(field.json_name, 'json_int')
-
def testEnumDefaultValue(self):
"""Test the default value of enums which don't start at zero."""
def _CheckDefaultValue(file_descriptor):
diff --git a/python/google/protobuf/internal/descriptor_test.py b/python/google/protobuf/internal/descriptor_test.py
index 6a8532c..3af2bdc 100644
--- a/python/google/protobuf/internal/descriptor_test.py
+++ b/python/google/protobuf/internal/descriptor_test.py
@@ -118,6 +118,30 @@
def GetDescriptorPool(self):
return symbol_database.Default().pool
+ def testMissingPackage(self):
+ file_proto = descriptor_pb2.FileDescriptorProto(
+ name='some/filename/some.proto')
+ serialized = file_proto.SerializeToString()
+ pool = descriptor_pool.DescriptorPool()
+ file_descriptor = pool.AddSerializedFile(serialized)
+ self.assertEqual('', file_descriptor.package)
+
+ def testEmptyPackage(self):
+ file_proto = descriptor_pb2.FileDescriptorProto(
+ name='some/filename/some.proto', package='')
+ serialized = file_proto.SerializeToString()
+ pool = descriptor_pool.DescriptorPool()
+ file_descriptor = pool.AddSerializedFile(serialized)
+ self.assertEqual('', file_descriptor.package)
+
+ def testFindMethodByName(self):
+ service_descriptor = (unittest_custom_options_pb2.
+ TestServiceWithCustomOptions.DESCRIPTOR)
+ method_descriptor = service_descriptor.FindMethodByName('Foo')
+ self.assertEqual(method_descriptor.name, 'Foo')
+ with self.assertRaises(KeyError):
+ service_descriptor.FindMethodByName('MethodDoesNotExist')
+
def testEnumValueName(self):
self.assertEqual(self.my_message.EnumValueName('ForeignEnum', 4),
'FOREIGN_FOO')
@@ -595,6 +619,12 @@
def CheckDescriptorMapping(self, mapping):
# Verifies that a property like 'messageDescriptor.fields' has all the
# properties of an immutable abc.Mapping.
+ iterated_keys = []
+ for key in mapping:
+ iterated_keys.append(key)
+ self.assertEqual(len(iterated_keys), len(mapping))
+ self.assertEqual(set(iterated_keys), set(mapping.keys()))
+
self.assertNotEqual(
mapping, unittest_pb2.TestAllExtensions.DESCRIPTOR.fields_by_name)
self.assertNotEqual(mapping, {})
@@ -611,10 +641,15 @@
with self.assertRaises(TypeError):
mapping.get()
# TODO(jieluo): Fix python and cpp extension diff.
- if api_implementation.Type() == 'python':
- self.assertRaises(TypeError, mapping.get, [])
- else:
+ if api_implementation.Type() == 'cpp':
self.assertEqual(None, mapping.get([]))
+ else:
+ self.assertRaises(TypeError, mapping.get, [])
+ with self.assertRaises(TypeError):
+ if [] in mapping:
+ pass
+ with self.assertRaises(TypeError):
+ _ = mapping[[]]
# keys(), iterkeys() &co
item = (next(iter(mapping.keys())), next(iter(mapping.values())))
self.assertEqual(item, next(iter(mapping.items())))
@@ -626,10 +661,12 @@
self.assertRaises(KeyError, mapping.__getitem__, 'key_error')
self.assertRaises(KeyError, mapping.__getitem__, len(mapping) + 1)
# TODO(jieluo): Add __repr__ support for DescriptorMapping.
- if api_implementation.Type() == 'python':
- self.assertEqual(len(str(dict(mapping.items()))), len(str(mapping)))
- else:
+ if api_implementation.Type() == 'cpp':
self.assertEqual(str(mapping)[0], '<')
+ else:
+ print(str(dict(mapping.items()))[:100])
+ print(str(mapping)[:100])
+ self.assertEqual(len(str(dict(mapping.items()))), len(str(mapping)))
def testDescriptor(self):
message_descriptor = unittest_pb2.TestAllTypes.DESCRIPTOR
diff --git a/python/google/protobuf/internal/message_factory_test.py b/python/google/protobuf/internal/message_factory_test.py
index efba619..3ab3b8e 100644
--- a/python/google/protobuf/internal/message_factory_test.py
+++ b/python/google/protobuf/internal/message_factory_test.py
@@ -118,6 +118,16 @@
'google.protobuf.python.internal.Factory2Message'))
self.assertTrue(hasattr(cls, 'additional_field'))
+ def testGetExistingPrototype(self):
+ factory = message_factory.MessageFactory()
+ # Get Existing Prototype should not create a new class.
+ cls = factory.GetPrototype(
+ descriptor=factory_test2_pb2.Factory2Message.DESCRIPTOR)
+ msg = factory_test2_pb2.Factory2Message()
+ self.assertIsInstance(msg, cls)
+ self.assertIsInstance(msg.factory_1_message,
+ factory_test1_pb2.Factory1Message)
+
def testGetMessages(self):
# performed twice because multiple calls with the same input must be allowed
for _ in range(2):
diff --git a/python/google/protobuf/internal/message_test.py b/python/google/protobuf/internal/message_test.py
index bd1df8c..3c604dd 100644
--- a/python/google/protobuf/internal/message_test.py
+++ b/python/google/protobuf/internal/message_test.py
@@ -34,10 +34,6 @@
Note that the golden messages exercise every known field type, thus this
test ends up exercising and verifying nearly all of the parsing and
serialization code in the whole library.
-
-TODO(kenton): Merge with wire_format_test? It doesn't make a whole lot of
-sense to call this a test of the "message" module, which only declares an
-abstract interface.
"""
__author__ = 'gps@google.com (Gregory P. Smith)'
@@ -476,6 +472,12 @@
'}\n')
self.assertEqual(sub_msg.bb, 1)
+ def testAssignRepeatedField(self, message_module):
+ msg = message_module.NestedTestAllTypes()
+ msg.payload.repeated_int32[:] = [1, 2, 3, 4]
+ self.assertEqual(4, len(msg.payload.repeated_int32))
+ self.assertEqual([1, 2, 3, 4], msg.payload.repeated_int32)
+
def testMergeFromRepeatedField(self, message_module):
msg = message_module.TestAllTypes()
msg.repeated_int32.append(1)
@@ -887,6 +889,7 @@
def testOneofClearField(self, message_module):
m = message_module.TestAllTypes()
+ m.ClearField('oneof_field')
m.oneof_uint32 = 11
m.ClearField('oneof_field')
if message_module is unittest_pb2:
@@ -1766,6 +1769,19 @@
with self.assertRaises(TypeError):
123 in msg.map_string_string
+ def testScalarMapComparison(self):
+ msg1 = map_unittest_pb2.TestMap()
+ msg2 = map_unittest_pb2.TestMap()
+
+ self.assertEqual(msg1.map_int32_int32, msg2.map_int32_int32)
+
+ def testMessageMapComparison(self):
+ msg1 = map_unittest_pb2.TestMap()
+ msg2 = map_unittest_pb2.TestMap()
+
+ self.assertEqual(msg1.map_int32_foreign_message,
+ msg2.map_int32_foreign_message)
+
def testMapGet(self):
# Need to test that get() properly returns the default, even though the dict
# has defaultdict-like semantics.
@@ -2229,7 +2245,7 @@
def testMapItems(self):
# Map items used to have strange behaviors when use c extension. Because
- # [] may reorder the map and invalidate any exsting iterators.
+ # [] may reorder the map and invalidate any existing iterators.
# TODO(jieluo): Check if [] reordering the map is a bug or intended
# behavior.
msg = map_unittest_pb2.TestMap()
@@ -2453,6 +2469,26 @@
with self.assertRaises(ValueError):
unittest_proto3_arena_pb2.TestAllTypes(optional_string=u'\ud801\ud801')
+ def testCrashNullAA(self):
+ self.assertEqual(
+ unittest_proto3_arena_pb2.TestAllTypes.NestedMessage(),
+ unittest_proto3_arena_pb2.TestAllTypes.NestedMessage())
+
+ def testCrashNullAB(self):
+ self.assertEqual(
+ unittest_proto3_arena_pb2.TestAllTypes.NestedMessage(),
+ unittest_proto3_arena_pb2.TestAllTypes().optional_nested_message)
+
+ def testCrashNullBA(self):
+ self.assertEqual(
+ unittest_proto3_arena_pb2.TestAllTypes().optional_nested_message,
+ unittest_proto3_arena_pb2.TestAllTypes.NestedMessage())
+
+ def testCrashNullBB(self):
+ self.assertEqual(
+ unittest_proto3_arena_pb2.TestAllTypes().optional_nested_message,
+ unittest_proto3_arena_pb2.TestAllTypes().optional_nested_message)
+
diff --git a/python/google/protobuf/internal/python_protobuf.cc b/python/google/protobuf/internal/python_protobuf.cc
index 26e3a8b..95c6d2b 100644
--- a/python/google/protobuf/internal/python_protobuf.cc
+++ b/python/google/protobuf/internal/python_protobuf.cc
@@ -30,7 +30,7 @@
// Author: qrczak@google.com (Marcin Kowalczyk)
-#include <google/protobuf/python/python_protobuf.h>
+#include "google/protobuf/python/python_protobuf.h"
namespace google {
namespace protobuf {
diff --git a/python/google/protobuf/internal/text_format_test.py b/python/google/protobuf/internal/text_format_test.py
index 18b784e..996ef65 100644
--- a/python/google/protobuf/internal/text_format_test.py
+++ b/python/google/protobuf/internal/text_format_test.py
@@ -1598,6 +1598,47 @@
self.assertEqual(23, message.message_set.Extensions[ext1].i)
self.assertEqual('foo', message.message_set.Extensions[ext2].str)
+ # Handle Any messages inside unknown extensions.
+ message = any_test_pb2.TestAny()
+ text = ('any_value {\n'
+ ' [type.googleapis.com/google.protobuf.internal.TestAny] {\n'
+ ' [unknown_extension] {\n'
+ ' str: "string"\n'
+ ' any_value {\n'
+ ' [type.googleapis.com/protobuf_unittest.OneString] {\n'
+ ' data: "string"\n'
+ ' }\n'
+ ' }\n'
+ ' }\n'
+ ' }\n'
+ '}\n'
+ 'int32_value: 123')
+ text_format.Parse(text, message, allow_unknown_extension=True)
+ self.assertEqual(123, message.int32_value)
+
+ # Fail if invalid Any message type url inside unknown extensions.
+ message = any_test_pb2.TestAny()
+ text = ('any_value {\n'
+ ' [type.googleapis.com.invalid/google.protobuf.internal.TestAny] {\n'
+ ' [unknown_extension] {\n'
+ ' str: "string"\n'
+ ' any_value {\n'
+ ' [type.googleapis.com/protobuf_unittest.OneString] {\n'
+ ' data: "string"\n'
+ ' }\n'
+ ' }\n'
+ ' }\n'
+ ' }\n'
+ '}\n'
+ 'int32_value: 123')
+ self.assertRaisesRegex(
+ text_format.ParseError,
+ '[type.googleapis.com.invalid/google.protobuf.internal.TestAny]',
+ text_format.Parse,
+ text,
+ message,
+ allow_unknown_extension=True)
+
def testParseBadIdentifier(self):
message = unittest_pb2.TestAllTypes()
text = ('optional_nested_message { "bb": 1 }')
@@ -2443,5 +2484,6 @@
self.assertEqual('repeated_int32: [1]\n', output)
+
if __name__ == '__main__':
unittest.main()
diff --git a/python/google/protobuf/json_format.py b/python/google/protobuf/json_format.py
index 5024ed8..f35a432 100644
--- a/python/google/protobuf/json_format.py
+++ b/python/google/protobuf/json_format.py
@@ -109,7 +109,8 @@
names as defined in the .proto file. If False, convert the field
names to lowerCamelCase.
indent: The JSON object will be pretty-printed with this indent level.
- An indent level of 0 or negative will only insert newlines.
+ An indent level of 0 or negative will only insert newlines. If the
+ indent level is None, no newlines will be inserted.
sort_keys: If True, then the output will be sorted by field names.
use_integers_for_enums: If true, print integers instead of enum names.
descriptor_pool: A Descriptor Pool for resolving types. If None use the
diff --git a/python/google/protobuf/message.py b/python/google/protobuf/message.py
index 76c6802..0fe6a4f 100644
--- a/python/google/protobuf/message.py
+++ b/python/google/protobuf/message.py
@@ -74,7 +74,8 @@
__slots__ = []
- #: The :class:`google.protobuf.descriptor.Descriptor` for this message type.
+ #: The :class:`google.protobuf.Descriptor`
+ # for this message type.
DESCRIPTOR = None
def __deepcopy__(self, memo=None):
diff --git a/python/google/protobuf/message_factory.py b/python/google/protobuf/message_factory.py
index 8d65204..ce5b5a7 100644
--- a/python/google/protobuf/message_factory.py
+++ b/python/google/protobuf/message_factory.py
@@ -60,9 +60,6 @@
"""Initializes a new factory."""
self.pool = pool or descriptor_pool.DescriptorPool()
- # local cache of all classes built from protobuf descriptors
- self._classes = {}
-
def GetPrototype(self, descriptor):
"""Obtains a proto2 message class based on the passed in descriptor.
@@ -75,14 +72,11 @@
Returns:
A class describing the passed in descriptor.
"""
- if descriptor not in self._classes:
- result_class = self.CreatePrototype(descriptor)
- # The assignment to _classes is redundant for the base implementation, but
- # might avoid confusion in cases where CreatePrototype gets overridden and
- # does not call the base implementation.
- self._classes[descriptor] = result_class
- return result_class
- return self._classes[descriptor]
+ concrete_class = getattr(descriptor, '_concrete_class', None)
+ if concrete_class:
+ return concrete_class
+ result_class = self.CreatePrototype(descriptor)
+ return result_class
def CreatePrototype(self, descriptor):
"""Builds a proto2 message class based on the passed in descriptor.
@@ -107,16 +101,11 @@
'__module__': None,
})
result_class._FACTORY = self # pylint: disable=protected-access
- # Assign in _classes before doing recursive calls to avoid infinite
- # recursion.
- self._classes[descriptor] = result_class
for field in descriptor.fields:
if field.message_type:
self.GetPrototype(field.message_type)
for extension in result_class.DESCRIPTOR.extensions:
- if extension.containing_type not in self._classes:
- self.GetPrototype(extension.containing_type)
- extended_class = self._classes[extension.containing_type]
+ extended_class = self.GetPrototype(extension.containing_type)
extended_class.RegisterExtension(extension)
if extension.message_type:
self.GetPrototype(extension.message_type)
@@ -152,9 +141,7 @@
# an error if they were different.
for extension in file_desc.extensions_by_name.values():
- if extension.containing_type not in self._classes:
- self.GetPrototype(extension.containing_type)
- extended_class = self._classes[extension.containing_type]
+ extended_class = self.GetPrototype(extension.containing_type)
extended_class.RegisterExtension(extension)
if extension.message_type:
self.GetPrototype(extension.message_type)
diff --git a/python/google/protobuf/proto_api.h b/python/google/protobuf/proto_api.h
index 9969a91..4e910e0 100644
--- a/python/google/protobuf/proto_api.h
+++ b/python/google/protobuf/proto_api.h
@@ -48,8 +48,8 @@
#define PY_SSIZE_T_CLEAN
#include <Python.h>
-#include <google/protobuf/descriptor_database.h>
-#include <google/protobuf/message.h>
+#include "google/protobuf/descriptor_database.h"
+#include "google/protobuf/message.h"
namespace google {
namespace protobuf {
@@ -133,8 +133,7 @@
};
inline const char* PyProtoAPICapsuleName() {
- static const char kCapsuleName[] =
- "google.protobuf.pyext._message.proto_API";
+ static const char kCapsuleName[] = "google.protobuf.pyext._message.proto_API";
return kCapsuleName;
}
diff --git a/python/google/protobuf/pyext/descriptor.cc b/python/google/protobuf/pyext/descriptor.cc
index 1625312..fc97b0f 100644
--- a/python/google/protobuf/pyext/descriptor.cc
+++ b/python/google/protobuf/pyext/descriptor.cc
@@ -30,7 +30,7 @@
// Author: petar@google.com (Petar Petrov)
-#include <google/protobuf/pyext/descriptor.h>
+#include "google/protobuf/pyext/descriptor.h"
#define PY_SSIZE_T_CLEAN
#include <Python.h>
@@ -40,15 +40,15 @@
#include <string>
#include <unordered_map>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/dynamic_message.h>
-#include <google/protobuf/pyext/descriptor_containers.h>
-#include <google/protobuf/pyext/descriptor_pool.h>
-#include <google/protobuf/pyext/message.h>
-#include <google/protobuf/pyext/message_factory.h>
-#include <google/protobuf/pyext/scoped_pyobject_ptr.h>
-#include <google/protobuf/stubs/hash.h>
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/dynamic_message.h"
+#include "google/protobuf/pyext/descriptor_containers.h"
+#include "google/protobuf/pyext/descriptor_pool.h"
+#include "google/protobuf/pyext/message.h"
+#include "google/protobuf/pyext/message_factory.h"
+#include "google/protobuf/pyext/scoped_pyobject_ptr.h"
+#include "absl/strings/string_view.h"
+#include "google/protobuf/io/coded_stream.h"
#define PyString_AsStringAndSize(ob, charpp, sizep) \
(PyUnicode_Check(ob) \
@@ -58,6 +58,37 @@
: 0) \
: PyBytes_AsStringAndSize(ob, (charpp), (sizep)))
+#if PY_VERSION_HEX < 0x030900B1 && !defined(PYPY_VERSION)
+static PyCodeObject* PyFrame_GetCode(PyFrameObject *frame)
+{
+ Py_INCREF(frame->f_code);
+ return frame->f_code;
+}
+
+static PyFrameObject* PyFrame_GetBack(PyFrameObject *frame)
+{
+ Py_XINCREF(frame->f_back);
+ return frame->f_back;
+}
+#endif
+
+#if PY_VERSION_HEX < 0x030B00A7 && !defined(PYPY_VERSION)
+static PyObject* PyFrame_GetLocals(PyFrameObject *frame)
+{
+ if (PyFrame_FastToLocalsWithError(frame) < 0) {
+ return NULL;
+ }
+ Py_INCREF(frame->f_locals);
+ return frame->f_locals;
+}
+
+static PyObject* PyFrame_GetGlobals(PyFrameObject *frame)
+{
+ Py_INCREF(frame->f_globals);
+ return frame->f_globals;
+}
+#endif
+
namespace google {
namespace protobuf {
namespace python {
@@ -96,48 +127,66 @@
// This check is not critical and is somewhat difficult to implement correctly
// in PyPy.
PyFrameObject* frame = PyEval_GetFrame();
+ PyCodeObject* frame_code = nullptr;
+ PyObject* frame_globals = nullptr;
+ PyObject* frame_locals = nullptr;
+ bool result = false;
+
if (frame == nullptr) {
- return false;
+ goto exit;
}
+ Py_INCREF(frame);
while (stacklevel-- > 0) {
- frame = frame->f_back;
+ PyFrameObject* next_frame = PyFrame_GetBack(frame);
+ Py_DECREF(frame);
+ frame = next_frame;
if (frame == nullptr) {
- return false;
+ goto exit;
}
}
- if (frame->f_code->co_filename == nullptr) {
- return false;
+ frame_code = PyFrame_GetCode(frame);
+ if (frame_code->co_filename == nullptr) {
+ goto exit;
}
char* filename;
Py_ssize_t filename_size;
- if (PyString_AsStringAndSize(frame->f_code->co_filename,
+ if (PyString_AsStringAndSize(frame_code->co_filename,
&filename, &filename_size) < 0) {
// filename is not a string.
PyErr_Clear();
- return false;
+ goto exit;
}
if ((filename_size < 3) ||
(strcmp(&filename[filename_size - 3], ".py") != 0)) {
// Cython's stack does not have .py file name and is not at global module
// scope.
- return true;
+ result = true;
+ goto exit;
}
if (filename_size < 7) {
// filename is too short.
- return false;
+ goto exit;
}
if (strcmp(&filename[filename_size - 7], "_pb2.py") != 0) {
// Filename is not ending with _pb2.
- return false;
+ goto exit;
}
- if (frame->f_globals != frame->f_locals) {
+ frame_globals = PyFrame_GetGlobals(frame);
+ frame_locals = PyFrame_GetLocals(frame);
+ if (frame_globals != frame_locals) {
// Not at global module scope
- return false;
+ goto exit;
}
#endif
- return true;
+ result = true;
+exit:
+ Py_XDECREF(frame_globals);
+ Py_XDECREF(frame_locals);
+ Py_XDECREF(frame_code);
+ Py_XDECREF(frame);
+ return result;
}
// If the calling code is not a _pb2.py file, raise AttributeError.
@@ -490,6 +539,12 @@
GetDescriptorPool_FromPool(
_GetDescriptor(self)->file()->pool())->py_message_factory,
_GetDescriptor(self)));
+
+ if (concrete_class == nullptr) {
+ PyErr_Clear();
+ return nullptr;
+ }
+
Py_XINCREF(concrete_class);
return concrete_class->AsPyObject();
}
@@ -1741,7 +1796,8 @@
}
const MethodDescriptor* method_descriptor =
- _GetDescriptor(self)->FindMethodByName(StringParam(name, name_size));
+ _GetDescriptor(self)->FindMethodByName(
+ absl::string_view(name, name_size));
if (method_descriptor == nullptr) {
PyErr_Format(PyExc_KeyError, "Couldn't find method %.200s", name);
return nullptr;
diff --git a/python/google/protobuf/pyext/descriptor.h b/python/google/protobuf/pyext/descriptor.h
index d97e2f8..8559c66 100644
--- a/python/google/protobuf/pyext/descriptor.h
+++ b/python/google/protobuf/pyext/descriptor.h
@@ -36,15 +36,12 @@
#define PY_SSIZE_T_CLEAN
#include <Python.h>
-#include <google/protobuf/descriptor.h>
+#include "google/protobuf/descriptor.h"
namespace google {
namespace protobuf {
namespace python {
-// Should match the type of ConstStringParam.
-using StringParam = std::string;
-
extern PyTypeObject PyMessageDescriptor_Type;
extern PyTypeObject PyFieldDescriptor_Type;
extern PyTypeObject PyEnumDescriptor_Type;
diff --git a/python/google/protobuf/pyext/descriptor_containers.cc b/python/google/protobuf/pyext/descriptor_containers.cc
index a87155b..f38fdc7 100644
--- a/python/google/protobuf/pyext/descriptor_containers.cc
+++ b/python/google/protobuf/pyext/descriptor_containers.cc
@@ -49,14 +49,21 @@
// because the Python API is based on C, and does not play well with C++
// inheritance.
+// clang-format off
#define PY_SSIZE_T_CLEAN
+// This inclusion must appear before all the others.
#include <Python.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/pyext/descriptor_containers.h>
-#include <google/protobuf/pyext/descriptor_pool.h>
-#include <google/protobuf/pyext/descriptor.h>
-#include <google/protobuf/pyext/scoped_pyobject_ptr.h>
+#include <string>
+
+#include "google/protobuf/pyext/descriptor_containers.h"
+// clang-format on
+
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/pyext/descriptor.h"
+#include "google/protobuf/pyext/descriptor_pool.h"
+#include "google/protobuf/pyext/scoped_pyobject_ptr.h"
+#include "absl/strings/string_view.h"
#define PyString_AsStringAndSize(ob, charpp, sizep) \
(PyUnicode_Check(ob) \
@@ -75,9 +82,9 @@
typedef int (*CountMethod)(PyContainer* self);
typedef const void* (*GetByIndexMethod)(PyContainer* self, int index);
typedef const void* (*GetByNameMethod)(PyContainer* self,
- ConstStringParam name);
+ absl::string_view name);
typedef const void* (*GetByCamelcaseNameMethod)(PyContainer* self,
- ConstStringParam name);
+ absl::string_view name);
typedef const void* (*GetByNumberMethod)(PyContainer* self, int index);
typedef PyObject* (*NewObjectFromItemMethod)(const void* descriptor);
typedef const std::string& (*GetItemNameMethod)(const void* descriptor);
@@ -175,8 +182,8 @@
}
return false;
}
- *item = self->container_def->get_by_name_fn(self,
- StringParam(name, name_size));
+ *item = self->container_def->get_by_name_fn(
+ self, absl::string_view(name, name_size));
return true;
}
case PyContainer::KIND_BYCAMELCASENAME: {
@@ -192,7 +199,7 @@
return false;
}
*item = self->container_def->get_by_camelcase_name_fn(
- self, StringParam(camelcase_name, name_size));
+ self, absl::string_view(camelcase_name, name_size));
return true;
}
case PyContainer::KIND_BYNUMBER: {
@@ -958,12 +965,12 @@
return GetDescriptor(self)->field_count();
}
-static const void* GetByName(PyContainer* self, ConstStringParam name) {
+static const void* GetByName(PyContainer* self, absl::string_view name) {
return GetDescriptor(self)->FindFieldByName(name);
}
static const void* GetByCamelcaseName(PyContainer* self,
- ConstStringParam name) {
+ absl::string_view name) {
return GetDescriptor(self)->FindFieldByCamelcaseName(name);
}
@@ -1028,7 +1035,7 @@
return GetDescriptor(self)->nested_type_count();
}
-static const void* GetByName(PyContainer* self, ConstStringParam name) {
+static const void* GetByName(PyContainer* self, absl::string_view name) {
return GetDescriptor(self)->FindNestedTypeByName(name);
}
@@ -1080,7 +1087,7 @@
return GetDescriptor(self)->enum_type_count();
}
-static const void* GetByName(PyContainer* self, ConstStringParam name) {
+static const void* GetByName(PyContainer* self, absl::string_view name) {
return GetDescriptor(self)->FindEnumTypeByName(name);
}
@@ -1143,7 +1150,7 @@
return count;
}
-static const void* GetByName(PyContainer* self, ConstStringParam name) {
+static const void* GetByName(PyContainer* self, absl::string_view name) {
return GetDescriptor(self)->FindEnumValueByName(name);
}
@@ -1194,7 +1201,7 @@
return GetDescriptor(self)->extension_count();
}
-static const void* GetByName(PyContainer* self, ConstStringParam name) {
+static const void* GetByName(PyContainer* self, absl::string_view name) {
return GetDescriptor(self)->FindExtensionByName(name);
}
@@ -1246,7 +1253,7 @@
return GetDescriptor(self)->oneof_decl_count();
}
-static const void* GetByName(PyContainer* self, ConstStringParam name) {
+static const void* GetByName(PyContainer* self, absl::string_view name) {
return GetDescriptor(self)->FindOneofByName(name);
}
@@ -1304,7 +1311,7 @@
return GetDescriptor(self)->value(index);
}
-static const void* GetByName(PyContainer* self, ConstStringParam name) {
+static const void* GetByName(PyContainer* self, absl::string_view name) {
return GetDescriptor(self)->FindValueByName(name);
}
@@ -1408,7 +1415,7 @@
return GetDescriptor(self)->method_count();
}
-static const void* GetByName(PyContainer* self, ConstStringParam name) {
+static const void* GetByName(PyContainer* self, absl::string_view name) {
return GetDescriptor(self)->FindMethodByName(name);
}
@@ -1462,7 +1469,7 @@
return GetDescriptor(self)->message_type_count();
}
-static const void* GetByName(PyContainer* self, ConstStringParam name) {
+static const void* GetByName(PyContainer* self, absl::string_view name) {
return GetDescriptor(self)->FindMessageTypeByName(name);
}
@@ -1502,7 +1509,7 @@
return GetDescriptor(self)->enum_type_count();
}
-static const void* GetByName(PyContainer* self, ConstStringParam name) {
+static const void* GetByName(PyContainer* self, absl::string_view name) {
return GetDescriptor(self)->FindEnumTypeByName(name);
}
@@ -1542,7 +1549,7 @@
return GetDescriptor(self)->extension_count();
}
-static const void* GetByName(PyContainer* self, ConstStringParam name) {
+static const void* GetByName(PyContainer* self, absl::string_view name) {
return GetDescriptor(self)->FindExtensionByName(name);
}
@@ -1582,7 +1589,7 @@
return GetDescriptor(self)->service_count();
}
-static const void* GetByName(PyContainer* self, ConstStringParam name) {
+static const void* GetByName(PyContainer* self, absl::string_view name) {
return GetDescriptor(self)->FindServiceByName(name);
}
diff --git a/python/google/protobuf/pyext/descriptor_database.cc b/python/google/protobuf/pyext/descriptor_database.cc
index f87f23d..e547306 100644
--- a/python/google/protobuf/pyext/descriptor_database.cc
+++ b/python/google/protobuf/pyext/descriptor_database.cc
@@ -31,15 +31,17 @@
// This file defines a C++ DescriptorDatabase, which wraps a Python Database
// and delegate all its operations to Python methods.
-#include <google/protobuf/pyext/descriptor_database.h>
+#include "google/protobuf/pyext/descriptor_database.h"
#include <cstdint>
+#include <string>
+#include <vector>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/pyext/message.h>
-#include <google/protobuf/pyext/scoped_pyobject_ptr.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/pyext/message.h"
+#include "google/protobuf/pyext/scoped_pyobject_ptr.h"
namespace google {
namespace protobuf {
diff --git a/python/google/protobuf/pyext/descriptor_database.h b/python/google/protobuf/pyext/descriptor_database.h
index 5621a22..108a858 100644
--- a/python/google/protobuf/pyext/descriptor_database.h
+++ b/python/google/protobuf/pyext/descriptor_database.h
@@ -34,7 +34,10 @@
#define PY_SSIZE_T_CLEAN
#include <Python.h>
-#include <google/protobuf/descriptor_database.h>
+#include <string>
+#include <vector>
+
+#include "google/protobuf/descriptor_database.h"
namespace google {
namespace protobuf {
diff --git a/python/google/protobuf/pyext/descriptor_pool.cc b/python/google/protobuf/pyext/descriptor_pool.cc
index 2f39281..db14ae6 100644
--- a/python/google/protobuf/pyext/descriptor_pool.cc
+++ b/python/google/protobuf/pyext/descriptor_pool.cc
@@ -30,19 +30,22 @@
// Implements the DescriptorPool, which collects all descriptors.
+#include <string>
#include <unordered_map>
+#include <utility>
+#include <vector>
#define PY_SSIZE_T_CLEAN
#include <Python.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/pyext/descriptor.h>
-#include <google/protobuf/pyext/descriptor_database.h>
-#include <google/protobuf/pyext/descriptor_pool.h>
-#include <google/protobuf/pyext/message.h>
-#include <google/protobuf/pyext/message_factory.h>
-#include <google/protobuf/pyext/scoped_pyobject_ptr.h>
-#include <google/protobuf/stubs/hash.h>
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/pyext/descriptor.h"
+#include "google/protobuf/pyext/descriptor_database.h"
+#include "google/protobuf/pyext/descriptor_pool.h"
+#include "google/protobuf/pyext/message.h"
+#include "google/protobuf/pyext/message_factory.h"
+#include "google/protobuf/pyext/scoped_pyobject_ptr.h"
+#include "absl/strings/string_view.h"
#define PyString_AsStringAndSize(ob, charpp, sizep) \
(PyUnicode_Check(ob) \
@@ -246,7 +249,7 @@
const Descriptor* message_descriptor =
reinterpret_cast<PyDescriptorPool*>(self)->pool->FindMessageTypeByName(
- StringParam(name, name_size));
+ absl::string_view(name, name_size));
if (message_descriptor == nullptr) {
return SetErrorFromCollector(
@@ -270,7 +273,7 @@
PyDescriptorPool* py_pool = reinterpret_cast<PyDescriptorPool*>(self);
const FileDescriptor* file_descriptor =
- py_pool->pool->FindFileByName(StringParam(name, name_size));
+ py_pool->pool->FindFileByName(absl::string_view(name, name_size));
if (file_descriptor == nullptr) {
return SetErrorFromCollector(py_pool->error_collector, name, "file");
@@ -286,7 +289,7 @@
}
const FieldDescriptor* field_descriptor =
- self->pool->FindFieldByName(StringParam(name, name_size));
+ self->pool->FindFieldByName(absl::string_view(name, name_size));
if (field_descriptor == nullptr) {
return SetErrorFromCollector(self->error_collector, name, "field");
}
@@ -307,7 +310,7 @@
}
const FieldDescriptor* field_descriptor =
- self->pool->FindExtensionByName(StringParam(name, name_size));
+ self->pool->FindExtensionByName(absl::string_view(name, name_size));
if (field_descriptor == nullptr) {
return SetErrorFromCollector(self->error_collector, name,
"extension field");
@@ -329,7 +332,7 @@
}
const EnumDescriptor* enum_descriptor =
- self->pool->FindEnumTypeByName(StringParam(name, name_size));
+ self->pool->FindEnumTypeByName(absl::string_view(name, name_size));
if (enum_descriptor == nullptr) {
return SetErrorFromCollector(self->error_collector, name, "enum");
}
@@ -350,7 +353,7 @@
}
const OneofDescriptor* oneof_descriptor =
- self->pool->FindOneofByName(StringParam(name, name_size));
+ self->pool->FindOneofByName(absl::string_view(name, name_size));
if (oneof_descriptor == nullptr) {
return SetErrorFromCollector(self->error_collector, name, "oneof");
}
@@ -372,7 +375,7 @@
const ServiceDescriptor* service_descriptor =
reinterpret_cast<PyDescriptorPool*>(self)->pool->FindServiceByName(
- StringParam(name, name_size));
+ absl::string_view(name, name_size));
if (service_descriptor == nullptr) {
return SetErrorFromCollector(
reinterpret_cast<PyDescriptorPool*>(self)->error_collector, name,
@@ -392,7 +395,7 @@
const MethodDescriptor* method_descriptor =
reinterpret_cast<PyDescriptorPool*>(self)->pool->FindMethodByName(
- StringParam(name, name_size));
+ absl::string_view(name, name_size));
if (method_descriptor == nullptr) {
return SetErrorFromCollector(
reinterpret_cast<PyDescriptorPool*>(self)->error_collector, name,
@@ -412,7 +415,7 @@
const FileDescriptor* file_descriptor =
reinterpret_cast<PyDescriptorPool*>(self)->pool->FindFileContainingSymbol(
- StringParam(name, name_size));
+ absl::string_view(name, name_size));
if (file_descriptor == nullptr) {
return SetErrorFromCollector(
reinterpret_cast<PyDescriptorPool*>(self)->error_collector, name,
diff --git a/python/google/protobuf/pyext/descriptor_pool.h b/python/google/protobuf/pyext/descriptor_pool.h
index 5d3c3a9..851cf31 100644
--- a/python/google/protobuf/pyext/descriptor_pool.h
+++ b/python/google/protobuf/pyext/descriptor_pool.h
@@ -35,7 +35,7 @@
#include <Python.h>
#include <unordered_map>
-#include <google/protobuf/descriptor.h>
+#include "google/protobuf/descriptor.h"
namespace google {
namespace protobuf {
diff --git a/python/google/protobuf/pyext/extension_dict.cc b/python/google/protobuf/pyext/extension_dict.cc
index 66703da..806af4f 100644
--- a/python/google/protobuf/pyext/extension_dict.cc
+++ b/python/google/protobuf/pyext/extension_dict.cc
@@ -31,23 +31,25 @@
// Author: anuraag@google.com (Anuraag Agrawal)
// Author: tibell@google.com (Johan Tibell)
-#include <google/protobuf/pyext/extension_dict.h>
+#include "google/protobuf/pyext/extension_dict.h"
#include <cstdint>
#include <memory>
+#include <vector>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/dynamic_message.h>
-#include <google/protobuf/message.h>
-#include <google/protobuf/pyext/descriptor.h>
-#include <google/protobuf/pyext/message.h>
-#include <google/protobuf/pyext/message_factory.h>
-#include <google/protobuf/pyext/repeated_composite_container.h>
-#include <google/protobuf/pyext/repeated_scalar_container.h>
-#include <google/protobuf/pyext/scoped_pyobject_ptr.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/dynamic_message.h"
+#include "google/protobuf/message.h"
+#include "google/protobuf/pyext/descriptor.h"
+#include "google/protobuf/pyext/message.h"
+#include "google/protobuf/pyext/message_factory.h"
+#include "google/protobuf/pyext/repeated_composite_container.h"
+#include "google/protobuf/pyext/repeated_scalar_container.h"
+#include "google/protobuf/pyext/scoped_pyobject_ptr.h"
+#include "absl/strings/string_view.h"
#define PyString_AsStringAndSize(ob, charpp, sizep) \
(PyUnicode_Check(ob) \
@@ -125,8 +127,9 @@
ExtensionIterator* self = reinterpret_cast<ExtensionIterator*>(_self);
self->fields.clear();
Py_XDECREF(self->extension_dict);
+ freefunc tp_free = Py_TYPE(_self)->tp_free;
self->~ExtensionIterator();
- Py_TYPE(_self)->tp_free(_self);
+ (*tp_free)(_self);
}
PyObject* subscript(ExtensionDict* self, PyObject* key) {
@@ -238,11 +241,11 @@
PyDescriptorPool* pool = cmessage::GetFactoryForMessage(self->parent)->pool;
const FieldDescriptor* message_extension =
- pool->pool->FindExtensionByName(StringParam(name, name_size));
+ pool->pool->FindExtensionByName(absl::string_view(name, name_size));
if (message_extension == nullptr) {
// Is is the name of a message set extension?
const Descriptor* message_descriptor =
- pool->pool->FindMessageTypeByName(StringParam(name, name_size));
+ pool->pool->FindMessageTypeByName(absl::string_view(name, name_size));
if (message_descriptor && message_descriptor->extension_count() > 0) {
const FieldDescriptor* extension = message_descriptor->extension(0);
if (extension->is_extension() &&
diff --git a/python/google/protobuf/pyext/extension_dict.h b/python/google/protobuf/pyext/extension_dict.h
index 86d2451..c5c2875 100644
--- a/python/google/protobuf/pyext/extension_dict.h
+++ b/python/google/protobuf/pyext/extension_dict.h
@@ -37,7 +37,7 @@
#define PY_SSIZE_T_CLEAN
#include <Python.h>
-#include <google/protobuf/pyext/message.h>
+#include "google/protobuf/pyext/message.h"
namespace google {
namespace protobuf {
diff --git a/python/google/protobuf/pyext/field.cc b/python/google/protobuf/pyext/field.cc
index 0d3b0b9..daa95d0 100644
--- a/python/google/protobuf/pyext/field.cc
+++ b/python/google/protobuf/pyext/field.cc
@@ -28,11 +28,11 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/pyext/field.h>
+#include "google/protobuf/pyext/field.h"
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/pyext/descriptor.h>
-#include <google/protobuf/pyext/message.h>
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/pyext/descriptor.h"
+#include "google/protobuf/pyext/message.h"
namespace google {
namespace protobuf {
diff --git a/python/google/protobuf/pyext/map_container.cc b/python/google/protobuf/pyext/map_container.cc
index e8a6888..76c4d88 100644
--- a/python/google/protobuf/pyext/map_container.cc
+++ b/python/google/protobuf/pyext/map_container.cc
@@ -30,21 +30,21 @@
// Author: haberman@google.com (Josh Haberman)
-#include <google/protobuf/pyext/map_container.h>
+#include "google/protobuf/pyext/map_container.h"
#include <cstdint>
#include <memory>
+#include <string>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/map.h>
-#include <google/protobuf/map_field.h>
-#include <google/protobuf/message.h>
-#include <google/protobuf/pyext/message.h>
-#include <google/protobuf/pyext/message_factory.h>
-#include <google/protobuf/pyext/repeated_composite_container.h>
-#include <google/protobuf/pyext/scoped_pyobject_ptr.h>
-#include <google/protobuf/stubs/map_util.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/map.h"
+#include "google/protobuf/map_field.h"
+#include "google/protobuf/message.h"
+#include "google/protobuf/pyext/message.h"
+#include "google/protobuf/pyext/message_factory.h"
+#include "google/protobuf/pyext/repeated_composite_container.h"
+#include "google/protobuf/pyext/scoped_pyobject_ptr.h"
namespace google {
namespace protobuf {
diff --git a/python/google/protobuf/pyext/map_container.h b/python/google/protobuf/pyext/map_container.h
index af334d2..d90d3a5 100644
--- a/python/google/protobuf/pyext/map_container.h
+++ b/python/google/protobuf/pyext/map_container.h
@@ -36,9 +36,9 @@
#include <cstdint>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/message.h>
-#include <google/protobuf/pyext/message.h>
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/message.h"
+#include "google/protobuf/pyext/message.h"
namespace google {
namespace protobuf {
diff --git a/python/google/protobuf/pyext/message.cc b/python/google/protobuf/pyext/message.cc
index 2c4a957..ebad6b4 100644
--- a/python/google/protobuf/pyext/message.cc
+++ b/python/google/protobuf/pyext/message.cc
@@ -31,17 +31,18 @@
// Author: anuraag@google.com (Anuraag Agrawal)
// Author: tibell@google.com (Johan Tibell)
-#include <google/protobuf/pyext/message.h>
+#include "google/protobuf/pyext/message.h"
#include <structmember.h> // A Python header file.
#include <cstdint>
#include <map>
#include <memory>
+#include <set>
#include <string>
#include <vector>
-#include <google/protobuf/stubs/strutil.h>
+#include "absl/strings/match.h"
#ifndef PyVarObject_HEAD_INIT
#define PyVarObject_HEAD_INIT(type, size) PyObject_HEAD_INIT(type) size,
@@ -49,33 +50,34 @@
#ifndef Py_TYPE
#define Py_TYPE(ob) (((PyObject*)(ob))->ob_type)
#endif
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/message.h>
-#include <google/protobuf/text_format.h>
-#include <google/protobuf/unknown_field_set.h>
-#include <google/protobuf/pyext/descriptor.h>
-#include <google/protobuf/pyext/descriptor_pool.h>
-#include <google/protobuf/pyext/extension_dict.h>
-#include <google/protobuf/pyext/field.h>
-#include <google/protobuf/pyext/map_container.h>
-#include <google/protobuf/pyext/message_factory.h>
-#include <google/protobuf/pyext/repeated_composite_container.h>
-#include <google/protobuf/pyext/repeated_scalar_container.h>
-#include <google/protobuf/pyext/safe_numerics.h>
-#include <google/protobuf/pyext/scoped_pyobject_ptr.h>
-#include <google/protobuf/pyext/unknown_field_set.h>
-#include <google/protobuf/pyext/unknown_fields.h>
-#include <google/protobuf/util/message_differencer.h>
-#include <google/protobuf/io/strtod.h>
-#include <google/protobuf/stubs/map_util.h>
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/message.h"
+#include "google/protobuf/text_format.h"
+#include "google/protobuf/unknown_field_set.h"
+#include "google/protobuf/pyext/descriptor.h"
+#include "google/protobuf/pyext/descriptor_pool.h"
+#include "google/protobuf/pyext/extension_dict.h"
+#include "google/protobuf/pyext/field.h"
+#include "google/protobuf/pyext/map_container.h"
+#include "google/protobuf/pyext/message_factory.h"
+#include "google/protobuf/pyext/repeated_composite_container.h"
+#include "google/protobuf/pyext/repeated_scalar_container.h"
+#include "google/protobuf/pyext/safe_numerics.h"
+#include "google/protobuf/pyext/scoped_pyobject_ptr.h"
+#include "google/protobuf/pyext/unknown_field_set.h"
+#include "google/protobuf/pyext/unknown_fields.h"
+#include "google/protobuf/util/message_differencer.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "absl/strings/string_view.h"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/io/strtod.h"
+#include "google/protobuf/io/zero_copy_stream_impl_lite.h"
// clang-format off
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
// clang-format on
#define PyString_AsString(ob) \
@@ -88,6 +90,9 @@
: 0) \
: PyBytes_AsStringAndSize(ob, (charpp), (sizep)))
+#define PROTOBUF_PYTHON_PUBLIC "google.protobuf"
+#define PROTOBUF_PYTHON_INTERNAL "google.protobuf.internal"
+
namespace google {
namespace protobuf {
namespace python {
@@ -246,8 +251,8 @@
ScopedPyObjectPtr new_args;
if (WKT_classes == nullptr) {
- ScopedPyObjectPtr well_known_types(PyImport_ImportModule(
- "google.protobuf.internal.well_known_types"));
+ ScopedPyObjectPtr well_known_types(
+ PyImport_ImportModule(PROTOBUF_PYTHON_INTERNAL ".well_known_types"));
GOOGLE_DCHECK(well_known_types != nullptr);
WKT_classes = PyObject_GetAttrString(well_known_types.get(), "WKTBASES");
@@ -405,7 +410,7 @@
Py_ssize_t attr_size;
static const char kSuffix[] = "_FIELD_NUMBER";
if (PyString_AsStringAndSize(name, &attr, &attr_size) >= 0 &&
- HasSuffixString(StringPiece(attr, attr_size), kSuffix)) {
+ absl::EndsWith(absl::string_view(attr, attr_size), kSuffix)) {
std::string field_name(attr, attr_size - sizeof(kSuffix) + 1);
LowerString(&field_name);
@@ -910,7 +915,7 @@
return nullptr;
}
const EnumValueDescriptor* enum_value_descriptor =
- enum_descriptor->FindValueByName(StringParam(enum_label, size));
+ enum_descriptor->FindValueByName(absl::string_view(enum_label, size));
if (enum_value_descriptor == nullptr) {
PyErr_Format(PyExc_ValueError, "unknown enum label \"%s\"", enum_label);
return nullptr;
@@ -1337,7 +1342,7 @@
}
const FieldDescriptor* FindFieldWithOneofs(const Message* message,
- ConstStringParam field_name,
+ absl::string_view field_name,
bool* in_oneof) {
*in_oneof = false;
const Descriptor* descriptor = message->GetDescriptor();
@@ -1386,8 +1391,8 @@
Message* message = self->message;
bool is_in_oneof;
- const FieldDescriptor* field_descriptor =
- FindFieldWithOneofs(message, StringParam(field_name, size), &is_in_oneof);
+ const FieldDescriptor* field_descriptor = FindFieldWithOneofs(
+ message, absl::string_view(field_name, size), &is_in_oneof);
if (field_descriptor == nullptr) {
if (!is_in_oneof) {
PyErr_Format(PyExc_ValueError, "Protocol message %s has no field %s.",
@@ -1571,7 +1576,7 @@
AssureWritable(self);
bool is_in_oneof;
const FieldDescriptor* field_descriptor = FindFieldWithOneofs(
- self->message, StringParam(field_name, field_size), &is_in_oneof);
+ self->message, absl::string_view(field_name, field_size), &is_in_oneof);
if (field_descriptor == nullptr) {
if (is_in_oneof) {
// We gave the name of a oneof, and none of its fields are set.
@@ -1881,7 +1886,7 @@
const char* ptr;
internal::ParseContext ctx(
depth, false, &ptr,
- StringPiece(static_cast<const char*>(data.buf), data.len));
+ absl::string_view(static_cast<const char*>(data.buf), data.len));
PyBuffer_Release(&data);
ctx.data().pool = factory->pool->pool;
ctx.data().factory = factory->message_factory;
@@ -1973,7 +1978,7 @@
if (PyString_AsStringAndSize(arg, &name_data, &name_size) < 0) return nullptr;
const OneofDescriptor* oneof_desc =
self->message->GetDescriptor()->FindOneofByName(
- StringParam(name_data, name_size));
+ absl::string_view(name_data, name_size));
if (oneof_desc == nullptr) {
PyErr_Format(PyExc_ValueError,
"Protocol message has no oneof \"%s\" field.", name_data);
@@ -2372,7 +2377,7 @@
PyObject* ToUnicode(CMessage* self) {
// Lazy import to prevent circular dependencies
ScopedPyObjectPtr text_format(
- PyImport_ImportModule("google.protobuf.text_format"));
+ PyImport_ImportModule(PROTOBUF_PYTHON_PUBLIC ".text_format"));
if (text_format == nullptr) {
return nullptr;
}
@@ -2673,22 +2678,22 @@
if (!this->child_submessages) {
this->child_submessages = new CMessage::SubMessagesMap();
}
- CMessage* cmsg = FindPtrOrNull(
- *this->child_submessages, sub_message);
- if (cmsg) {
- Py_INCREF(cmsg);
- } else {
- cmsg = cmessage::NewEmptyMessage(message_class);
-
- if (cmsg == nullptr) {
- return nullptr;
- }
- cmsg->message = sub_message;
- Py_INCREF(this);
- cmsg->parent = this;
- cmsg->parent_field_descriptor = field_descriptor;
- cmessage::SetSubmessage(this, cmsg);
+ auto it = this->child_submessages->find(sub_message);
+ if (it != this->child_submessages->end()) {
+ Py_INCREF(it->second);
+ return it->second;
}
+
+ CMessage* cmsg = cmessage::NewEmptyMessage(message_class);
+
+ if (cmsg == nullptr) {
+ return nullptr;
+ }
+ cmsg->message = sub_message;
+ Py_INCREF(this);
+ cmsg->parent = this;
+ cmsg->parent_field_descriptor = field_descriptor;
+ cmessage::SetSubmessage(this, cmsg);
return cmsg;
}
@@ -2696,11 +2701,10 @@
if (!this->child_submessages) {
return nullptr;
}
- CMessage* released = FindPtrOrNull(
- *this->child_submessages, sub_message);
- if (!released) {
- return nullptr;
- }
+ auto it = this->child_submessages->find(sub_message);
+ if (it == this->child_submessages->end()) return nullptr;
+ CMessage* released = it->second;
+
// The target message will now own its content.
Py_CLEAR(released->parent);
released->parent_field_descriptor = nullptr;
@@ -3034,8 +3038,8 @@
PyModule_AddObject(m, "MethodDescriptor",
reinterpret_cast<PyObject*>(&PyMethodDescriptor_Type));
- PyObject* enum_type_wrapper = PyImport_ImportModule(
- "google.protobuf.internal.enum_type_wrapper");
+ PyObject* enum_type_wrapper =
+ PyImport_ImportModule(PROTOBUF_PYTHON_INTERNAL ".enum_type_wrapper");
if (enum_type_wrapper == nullptr) {
return false;
}
@@ -3043,8 +3047,8 @@
PyObject_GetAttrString(enum_type_wrapper, "EnumTypeWrapper");
Py_DECREF(enum_type_wrapper);
- PyObject* message_module = PyImport_ImportModule(
- "google.protobuf.message");
+ PyObject* message_module =
+ PyImport_ImportModule(PROTOBUF_PYTHON_PUBLIC ".message");
if (message_module == nullptr) {
return false;
}
diff --git a/python/google/protobuf/pyext/message.h b/python/google/protobuf/pyext/message.h
index b17daa5..1b0172f 100644
--- a/python/google/protobuf/pyext/message.h
+++ b/python/google/protobuf/pyext/message.h
@@ -42,7 +42,7 @@
#include <string>
#include <unordered_map>
-#include <google/protobuf/stubs/common.h>
+#include "google/protobuf/stubs/common.h"
namespace google {
namespace protobuf {
diff --git a/python/google/protobuf/pyext/message_factory.cc b/python/google/protobuf/pyext/message_factory.cc
index bc44dd4..27aa5e4 100644
--- a/python/google/protobuf/pyext/message_factory.cc
+++ b/python/google/protobuf/pyext/message_factory.cc
@@ -29,15 +29,16 @@
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <unordered_map>
+#include <utility>
#define PY_SSIZE_T_CLEAN
#include <Python.h>
-#include <google/protobuf/dynamic_message.h>
-#include <google/protobuf/pyext/descriptor.h>
-#include <google/protobuf/pyext/message.h>
-#include <google/protobuf/pyext/message_factory.h>
-#include <google/protobuf/pyext/scoped_pyobject_ptr.h>
+#include "google/protobuf/dynamic_message.h"
+#include "google/protobuf/pyext/descriptor.h"
+#include "google/protobuf/pyext/message.h"
+#include "google/protobuf/pyext/message_factory.h"
+#include "google/protobuf/pyext/scoped_pyobject_ptr.h"
#define PyString_AsStringAndSize(ob, charpp, sizep) \
(PyUnicode_Check(ob) \
diff --git a/python/google/protobuf/pyext/message_factory.h b/python/google/protobuf/pyext/message_factory.h
index 7dfe425..1d911a8 100644
--- a/python/google/protobuf/pyext/message_factory.h
+++ b/python/google/protobuf/pyext/message_factory.h
@@ -35,8 +35,8 @@
#include <Python.h>
#include <unordered_map>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/pyext/descriptor_pool.h>
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/pyext/descriptor_pool.h"
namespace google {
namespace protobuf {
diff --git a/python/google/protobuf/pyext/message_module.cc b/python/google/protobuf/pyext/message_module.cc
index 2d3c1d2..f469206 100644
--- a/python/google/protobuf/pyext/message_module.cc
+++ b/python/google/protobuf/pyext/message_module.cc
@@ -31,12 +31,12 @@
#define PY_SSIZE_T_CLEAN
#include <Python.h>
-#include <google/protobuf/message_lite.h>
-#include <google/protobuf/pyext/descriptor.h>
-#include <google/protobuf/pyext/descriptor_pool.h>
-#include <google/protobuf/pyext/message.h>
-#include <google/protobuf/pyext/message_factory.h>
-#include <google/protobuf/proto_api.h>
+#include "google/protobuf/message_lite.h"
+#include "google/protobuf/pyext/descriptor.h"
+#include "google/protobuf/pyext/descriptor_pool.h"
+#include "google/protobuf/pyext/message.h"
+#include "google/protobuf/pyext/message_factory.h"
+#include "google/protobuf/proto_api.h"
namespace {
diff --git a/python/google/protobuf/pyext/repeated_composite_container.cc b/python/google/protobuf/pyext/repeated_composite_container.cc
index 0b63f82..a191670 100644
--- a/python/google/protobuf/pyext/repeated_composite_container.cc
+++ b/python/google/protobuf/pyext/repeated_composite_container.cc
@@ -31,22 +31,21 @@
// Author: anuraag@google.com (Anuraag Agrawal)
// Author: tibell@google.com (Johan Tibell)
-#include <google/protobuf/pyext/repeated_composite_container.h>
+#include "google/protobuf/pyext/repeated_composite_container.h"
#include <memory>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/dynamic_message.h>
-#include <google/protobuf/message.h>
-#include <google/protobuf/reflection.h>
-#include <google/protobuf/pyext/descriptor.h>
-#include <google/protobuf/pyext/descriptor_pool.h>
-#include <google/protobuf/pyext/message.h>
-#include <google/protobuf/pyext/message_factory.h>
-#include <google/protobuf/pyext/scoped_pyobject_ptr.h>
-#include <google/protobuf/stubs/map_util.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/dynamic_message.h"
+#include "google/protobuf/message.h"
+#include "google/protobuf/reflection.h"
+#include "google/protobuf/pyext/descriptor.h"
+#include "google/protobuf/pyext/descriptor_pool.h"
+#include "google/protobuf/pyext/message.h"
+#include "google/protobuf/pyext/message_factory.h"
+#include "google/protobuf/pyext/scoped_pyobject_ptr.h"
namespace google {
namespace protobuf {
diff --git a/python/google/protobuf/pyext/repeated_composite_container.h b/python/google/protobuf/pyext/repeated_composite_container.h
index 6fa6e17..8964374 100644
--- a/python/google/protobuf/pyext/repeated_composite_container.h
+++ b/python/google/protobuf/pyext/repeated_composite_container.h
@@ -37,7 +37,7 @@
#define PY_SSIZE_T_CLEAN
#include <Python.h>
-#include <google/protobuf/pyext/message.h>
+#include "google/protobuf/pyext/message.h"
namespace google {
namespace protobuf {
diff --git a/python/google/protobuf/pyext/repeated_scalar_container.cc b/python/google/protobuf/pyext/repeated_scalar_container.cc
index f4a8df2..57746dc 100644
--- a/python/google/protobuf/pyext/repeated_scalar_container.cc
+++ b/python/google/protobuf/pyext/repeated_scalar_container.cc
@@ -31,20 +31,21 @@
// Author: anuraag@google.com (Anuraag Agrawal)
// Author: tibell@google.com (Johan Tibell)
-#include <google/protobuf/pyext/repeated_scalar_container.h>
+#include "google/protobuf/pyext/repeated_scalar_container.h"
#include <cstdint>
#include <memory>
+#include <string>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/dynamic_message.h>
-#include <google/protobuf/message.h>
-#include <google/protobuf/pyext/descriptor.h>
-#include <google/protobuf/pyext/descriptor_pool.h>
-#include <google/protobuf/pyext/message.h>
-#include <google/protobuf/pyext/scoped_pyobject_ptr.h>
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/dynamic_message.h"
+#include "google/protobuf/message.h"
+#include "google/protobuf/pyext/descriptor.h"
+#include "google/protobuf/pyext/descriptor_pool.h"
+#include "google/protobuf/pyext/message.h"
+#include "google/protobuf/pyext/scoped_pyobject_ptr.h"
#define PyString_AsString(ob) \
(PyUnicode_Check(ob) ? PyUnicode_AsUTF8(ob) : PyBytes_AsString(ob))
diff --git a/python/google/protobuf/pyext/repeated_scalar_container.h b/python/google/protobuf/pyext/repeated_scalar_container.h
index 67423ab..0189886 100644
--- a/python/google/protobuf/pyext/repeated_scalar_container.h
+++ b/python/google/protobuf/pyext/repeated_scalar_container.h
@@ -37,8 +37,8 @@
#define PY_SSIZE_T_CLEAN
#include <Python.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/pyext/message.h>
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/pyext/message.h"
namespace google {
namespace protobuf {
diff --git a/python/google/protobuf/pyext/safe_numerics.h b/python/google/protobuf/pyext/safe_numerics.h
index 93ae640..0d4dd25 100644
--- a/python/google/protobuf/pyext/safe_numerics.h
+++ b/python/google/protobuf/pyext/safe_numerics.h
@@ -34,8 +34,8 @@
#include <limits>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
namespace google {
namespace protobuf {
diff --git a/python/google/protobuf/pyext/scoped_pyobject_ptr.h b/python/google/protobuf/pyext/scoped_pyobject_ptr.h
index ad3fa94..d39a4d1 100644
--- a/python/google/protobuf/pyext/scoped_pyobject_ptr.h
+++ b/python/google/protobuf/pyext/scoped_pyobject_ptr.h
@@ -33,8 +33,6 @@
#ifndef GOOGLE_PROTOBUF_PYTHON_CPP_SCOPED_PYOBJECT_PTR_H__
#define GOOGLE_PROTOBUF_PYTHON_CPP_SCOPED_PYOBJECT_PTR_H__
-#include <google/protobuf/stubs/common.h>
-
#define PY_SSIZE_T_CLEAN
#include <Python.h>
namespace google {
@@ -50,6 +48,8 @@
// The reference count of the specified py_object is not incremented.
explicit ScopedPythonPtr(PyObjectStruct* py_object = nullptr)
: ptr_(py_object) {}
+ ScopedPythonPtr(const ScopedPythonPtr&) = delete;
+ ScopedPythonPtr& operator=(const ScopedPythonPtr&) = delete;
// If a PyObject is owned, decrement its reference count.
~ScopedPythonPtr() { Py_XDECREF(ptr_); }
@@ -89,8 +89,6 @@
private:
PyObjectStruct* ptr_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ScopedPythonPtr);
};
typedef ScopedPythonPtr<PyObject> ScopedPyObjectPtr;
diff --git a/python/google/protobuf/pyext/unknown_field_set.cc b/python/google/protobuf/pyext/unknown_field_set.cc
index 42f9bbc..5cc48e7 100644
--- a/python/google/protobuf/pyext/unknown_field_set.cc
+++ b/python/google/protobuf/pyext/unknown_field_set.cc
@@ -28,7 +28,7 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/pyext/unknown_field_set.h>
+#include "google/protobuf/pyext/unknown_field_set.h"
#define PY_SSIZE_T_CLEAN
#include <Python.h>
@@ -36,11 +36,11 @@
#include <memory>
#include <set>
-#include <google/protobuf/message.h>
-#include <google/protobuf/unknown_field_set.h>
-#include <google/protobuf/wire_format_lite.h>
-#include <google/protobuf/pyext/message.h>
-#include <google/protobuf/pyext/scoped_pyobject_ptr.h>
+#include "google/protobuf/message.h"
+#include "google/protobuf/unknown_field_set.h"
+#include "google/protobuf/wire_format_lite.h"
+#include "google/protobuf/pyext/message.h"
+#include "google/protobuf/pyext/scoped_pyobject_ptr.h"
namespace google {
namespace protobuf {
diff --git a/python/google/protobuf/pyext/unknown_field_set.h b/python/google/protobuf/pyext/unknown_field_set.h
index 3fa764d..92a889d 100644
--- a/python/google/protobuf/pyext/unknown_field_set.h
+++ b/python/google/protobuf/pyext/unknown_field_set.h
@@ -37,7 +37,7 @@
#include <memory>
#include <set>
-#include <google/protobuf/pyext/message.h>
+#include "google/protobuf/pyext/message.h"
namespace google {
namespace protobuf {
diff --git a/python/google/protobuf/pyext/unknown_fields.cc b/python/google/protobuf/pyext/unknown_fields.cc
index dcd63b2..9f27f26 100644
--- a/python/google/protobuf/pyext/unknown_fields.cc
+++ b/python/google/protobuf/pyext/unknown_fields.cc
@@ -28,18 +28,18 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/pyext/unknown_fields.h>
+#include "google/protobuf/pyext/unknown_fields.h"
#define PY_SSIZE_T_CLEAN
#include <Python.h>
#include <set>
#include <memory>
-#include <google/protobuf/message.h>
-#include <google/protobuf/pyext/message.h>
-#include <google/protobuf/pyext/scoped_pyobject_ptr.h>
-#include <google/protobuf/unknown_field_set.h>
-#include <google/protobuf/wire_format_lite.h>
+#include "google/protobuf/message.h"
+#include "google/protobuf/pyext/message.h"
+#include "google/protobuf/pyext/scoped_pyobject_ptr.h"
+#include "google/protobuf/unknown_field_set.h"
+#include "google/protobuf/wire_format_lite.h"
namespace google {
namespace protobuf {
diff --git a/python/google/protobuf/pyext/unknown_fields.h b/python/google/protobuf/pyext/unknown_fields.h
index e7b0b35..81ee1a9 100644
--- a/python/google/protobuf/pyext/unknown_fields.h
+++ b/python/google/protobuf/pyext/unknown_fields.h
@@ -37,7 +37,7 @@
#include <memory>
#include <set>
-#include <google/protobuf/pyext/message.h>
+#include "google/protobuf/pyext/message.h"
namespace google {
namespace protobuf {
diff --git a/python/google/protobuf/symbol_database.py b/python/google/protobuf/symbol_database.py
index fdcf8cf..ed5fce3 100644
--- a/python/google/protobuf/symbol_database.py
+++ b/python/google/protobuf/symbol_database.py
@@ -66,6 +66,9 @@
class SymbolDatabase(message_factory.MessageFactory):
"""A database of Python generated symbols."""
+ # local cache of registered classes.
+ _classes = {}
+
def RegisterMessage(self, message):
"""Registers the given message type in the local database.
diff --git a/python/google/protobuf/text_encoding.py b/python/google/protobuf/text_encoding.py
index 759cf11..1955b6a 100644
--- a/python/google/protobuf/text_encoding.py
+++ b/python/google/protobuf/text_encoding.py
@@ -53,8 +53,7 @@
del byte, string
-def CEscape(text, as_utf8):
- # type: (...) -> str
+def CEscape(text, as_utf8) -> str:
"""Escape a bytes string for use in an text protocol buffer.
Args:
@@ -83,8 +82,7 @@
_CUNESCAPE_HEX = re.compile(r'(\\+)x([0-9a-fA-F])(?![0-9a-fA-F])')
-def CUnescape(text):
- # type: (str) -> bytes
+def CUnescape(text: str) -> bytes:
"""Unescape a text string with C-style escape sequences to UTF-8 bytes.
Args:
diff --git a/python/google/protobuf/text_format.py b/python/google/protobuf/text_format.py
index a6d8bcf..cab7cb7 100644
--- a/python/google/protobuf/text_format.py
+++ b/python/google/protobuf/text_format.py
@@ -67,6 +67,7 @@
_FLOAT_NAN = re.compile('nanf?$', re.IGNORECASE)
_QUOTES = frozenset(("'", '"'))
_ANY_FULL_TYPE_NAME = 'google.protobuf.Any'
+_DEBUG_STRING_SILENT_MARKER = '\t '
class Error(Exception):
@@ -125,8 +126,7 @@
indent=0,
message_formatter=None,
print_unknown_fields=False,
- force_colon=False):
- # type: (...) -> str
+ force_colon=False) -> str:
"""Convert protobuf message to text format.
Double values can be formatted compactly with 15 digits of
@@ -191,8 +191,7 @@
return result
-def MessageToBytes(message, **kwargs):
- # type: (...) -> bytes
+def MessageToBytes(message, **kwargs) -> bytes:
"""Convert protobuf message to encoded text format. See MessageToString."""
text = MessageToString(message, **kwargs)
if isinstance(text, bytes):
@@ -558,7 +557,7 @@
# For groups, use the capitalized name.
out.write(field.message_type.name)
else:
- out.write(field.name)
+ out.write(field.name)
if (self.force_colon or
field.cpp_type != descriptor.FieldDescriptor.CPPTYPE_MESSAGE):
@@ -856,10 +855,15 @@
ParseError: On text parsing problems.
"""
# Tokenize expects native str lines.
- str_lines = (
- line if isinstance(line, str) else line.decode('utf-8')
- for line in lines)
+ try:
+ str_lines = (
+ line if isinstance(line, str) else line.decode('utf-8')
+ for line in lines)
+ except UnicodeDecodeError as e:
+ raise self._StringParseError(e)
tokenizer = Tokenizer(str_lines)
+ if message:
+ self.root_type = message.DESCRIPTOR.full_name
while not tokenizer.AtEnd():
self._MergeField(tokenizer, message)
@@ -879,6 +883,8 @@
type_url_prefix, packed_type_name = self._ConsumeAnyTypeUrl(tokenizer)
tokenizer.Consume(']')
tokenizer.TryConsume(':')
+ self._DetectSilentMarker(tokenizer,
+ type_url_prefix + '/' + packed_type_name)
if tokenizer.TryConsume('<'):
expanded_any_end_token = '>'
else:
@@ -917,8 +923,6 @@
# pylint: disable=protected-access
field = message.Extensions._FindExtensionByName(name)
# pylint: enable=protected-access
-
-
if not field:
if self.allow_unknown_extension:
field = None
@@ -978,9 +982,11 @@
if field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_MESSAGE:
tokenizer.TryConsume(':')
+ self._DetectSilentMarker(tokenizer, field.full_name)
merger = self._MergeMessageField
else:
tokenizer.Consume(':')
+ self._DetectSilentMarker(tokenizer, field.full_name)
merger = self._MergeScalarField
if (field.label == descriptor.FieldDescriptor.LABEL_REPEATED and
@@ -998,13 +1004,19 @@
else: # Proto field is unknown.
assert (self.allow_unknown_extension or self.allow_unknown_field)
- _SkipFieldContents(tokenizer)
+ self._SkipFieldContents(tokenizer, name)
# For historical reasons, fields may optionally be separated by commas or
# semicolons.
if not tokenizer.TryConsume(','):
tokenizer.TryConsume(';')
+ def _LogSilentMarker(self, field_name):
+ pass
+
+ def _DetectSilentMarker(self, tokenizer, field_name):
+ if tokenizer.contains_silent_marker_before_current_token:
+ self._LogSilentMarker(field_name)
def _ConsumeAnyTypeUrl(self, tokenizer):
"""Consumes a google.protobuf.Any type URL and returns the type name."""
@@ -1160,105 +1172,111 @@
else:
setattr(message, field.name, value)
+ def _SkipFieldContents(self, tokenizer, field_name):
+ """Skips over contents (value or message) of a field.
-def _SkipFieldContents(tokenizer):
- """Skips over contents (value or message) of a field.
-
- Args:
- tokenizer: A tokenizer to parse the field name and values.
- """
- # Try to guess the type of this field.
- # If this field is not a message, there should be a ":" between the
- # field name and the field value and also the field value should not
- # start with "{" or "<" which indicates the beginning of a message body.
- # If there is no ":" or there is a "{" or "<" after ":", this field has
- # to be a message or the input is ill-formed.
- if tokenizer.TryConsume(
- ':') and not tokenizer.LookingAt('{') and not tokenizer.LookingAt('<'):
- if tokenizer.LookingAt('['):
- _SkipRepeatedFieldValue(tokenizer)
+ Args:
+ tokenizer: A tokenizer to parse the field name and values.
+ field_name: The field name currently being parsed.
+ """
+ # Try to guess the type of this field.
+ # If this field is not a message, there should be a ":" between the
+ # field name and the field value and also the field value should not
+ # start with "{" or "<" which indicates the beginning of a message body.
+ # If there is no ":" or there is a "{" or "<" after ":", this field has
+ # to be a message or the input is ill-formed.
+ if tokenizer.TryConsume(
+ ':') and not tokenizer.LookingAt('{') and not tokenizer.LookingAt('<'):
+ self._DetectSilentMarker(tokenizer, field_name)
+ if tokenizer.LookingAt('['):
+ self._SkipRepeatedFieldValue(tokenizer)
+ else:
+ self._SkipFieldValue(tokenizer)
else:
- _SkipFieldValue(tokenizer)
- else:
- _SkipFieldMessage(tokenizer)
+ self._DetectSilentMarker(tokenizer, field_name)
+ self._SkipFieldMessage(tokenizer)
+ def _SkipField(self, tokenizer):
+ """Skips over a complete field (name and value/message).
-def _SkipField(tokenizer):
- """Skips over a complete field (name and value/message).
+ Args:
+ tokenizer: A tokenizer to parse the field name and values.
+ """
+ field_name = ''
+ if tokenizer.TryConsume('['):
+ # Consume extension or google.protobuf.Any type URL
+ field_name += '[' + tokenizer.ConsumeIdentifier()
+ num_identifiers = 1
+ while tokenizer.TryConsume('.'):
+ field_name += '.' + tokenizer.ConsumeIdentifier()
+ num_identifiers += 1
+ # This is possibly a type URL for an Any message.
+ if num_identifiers == 3 and tokenizer.TryConsume('/'):
+ field_name += '/' + tokenizer.ConsumeIdentifier()
+ while tokenizer.TryConsume('.'):
+ field_name += '.' + tokenizer.ConsumeIdentifier()
+ tokenizer.Consume(']')
+ field_name += ']'
+ else:
+ field_name += tokenizer.ConsumeIdentifierOrNumber()
- Args:
- tokenizer: A tokenizer to parse the field name and values.
- """
- if tokenizer.TryConsume('['):
- # Consume extension name.
- tokenizer.ConsumeIdentifier()
- while tokenizer.TryConsume('.'):
- tokenizer.ConsumeIdentifier()
+ self._SkipFieldContents(tokenizer, field_name)
+
+ # For historical reasons, fields may optionally be separated by commas or
+ # semicolons.
+ if not tokenizer.TryConsume(','):
+ tokenizer.TryConsume(';')
+
+ def _SkipFieldMessage(self, tokenizer):
+ """Skips over a field message.
+
+ Args:
+ tokenizer: A tokenizer to parse the field name and values.
+ """
+ if tokenizer.TryConsume('<'):
+ delimiter = '>'
+ else:
+ tokenizer.Consume('{')
+ delimiter = '}'
+
+ while not tokenizer.LookingAt('>') and not tokenizer.LookingAt('}'):
+ self._SkipField(tokenizer)
+
+ tokenizer.Consume(delimiter)
+
+ def _SkipFieldValue(self, tokenizer):
+ """Skips over a field value.
+
+ Args:
+ tokenizer: A tokenizer to parse the field name and values.
+
+ Raises:
+ ParseError: In case an invalid field value is found.
+ """
+ # String/bytes tokens can come in multiple adjacent string literals.
+ # If we can consume one, consume as many as we can.
+ if tokenizer.TryConsumeByteString():
+ while tokenizer.TryConsumeByteString():
+ pass
+ return
+
+ if (not tokenizer.TryConsumeIdentifier() and
+ not _TryConsumeInt64(tokenizer) and not _TryConsumeUint64(tokenizer) and
+ not tokenizer.TryConsumeFloat()):
+ raise ParseError('Invalid field value: ' + tokenizer.token)
+
+ def _SkipRepeatedFieldValue(self, tokenizer):
+ """Skips over a repeated field value.
+
+ Args:
+ tokenizer: A tokenizer to parse the field value.
+ """
+ tokenizer.Consume('[')
+ if not tokenizer.LookingAt(']'):
+ self._SkipFieldValue(tokenizer)
+ while tokenizer.TryConsume(','):
+ self._SkipFieldValue(tokenizer)
tokenizer.Consume(']')
- else:
- tokenizer.ConsumeIdentifierOrNumber()
-
- _SkipFieldContents(tokenizer)
-
- # For historical reasons, fields may optionally be separated by commas or
- # semicolons.
- if not tokenizer.TryConsume(','):
- tokenizer.TryConsume(';')
-
-
-def _SkipFieldMessage(tokenizer):
- """Skips over a field message.
-
- Args:
- tokenizer: A tokenizer to parse the field name and values.
- """
-
- if tokenizer.TryConsume('<'):
- delimiter = '>'
- else:
- tokenizer.Consume('{')
- delimiter = '}'
-
- while not tokenizer.LookingAt('>') and not tokenizer.LookingAt('}'):
- _SkipField(tokenizer)
-
- tokenizer.Consume(delimiter)
-
-
-def _SkipFieldValue(tokenizer):
- """Skips over a field value.
-
- Args:
- tokenizer: A tokenizer to parse the field name and values.
-
- Raises:
- ParseError: In case an invalid field value is found.
- """
- # String/bytes tokens can come in multiple adjacent string literals.
- # If we can consume one, consume as many as we can.
- if tokenizer.TryConsumeByteString():
- while tokenizer.TryConsumeByteString():
- pass
- return
-
- if (not tokenizer.TryConsumeIdentifier() and
- not _TryConsumeInt64(tokenizer) and not _TryConsumeUint64(tokenizer) and
- not tokenizer.TryConsumeFloat()):
- raise ParseError('Invalid field value: ' + tokenizer.token)
-
-
-def _SkipRepeatedFieldValue(tokenizer):
- """Skips over a repeated field value.
-
- Args:
- tokenizer: A tokenizer to parse the field value.
- """
- tokenizer.Consume('[')
- if not tokenizer.LookingAt(']'):
- _SkipFieldValue(tokenizer)
- while tokenizer.TryConsume(','):
- _SkipFieldValue(tokenizer)
- tokenizer.Consume(']')
class Tokenizer(object):
@@ -1299,6 +1317,8 @@
self._skip_comments = skip_comments
self._whitespace_pattern = (skip_comments and self._WHITESPACE_OR_COMMENT
or self._WHITESPACE)
+ self.contains_silent_marker_before_current_token = False
+
self._SkipWhitespace()
self.NextToken()
@@ -1331,6 +1351,8 @@
match = self._whitespace_pattern.match(self._current_line, self._column)
if not match:
break
+ self.contains_silent_marker_before_current_token = match.group(0) == (
+ ' ' + _DEBUG_STRING_SILENT_MARKER)
length = len(match.group(0))
self._column += length
@@ -1583,6 +1605,7 @@
"""Reads the next meaningful token."""
self._previous_line = self._line
self._previous_column = self._column
+ self.contains_silent_marker_before_current_token = False
self._column += len(self.token)
self._SkipWhitespace()
diff --git a/python/internal.bzl b/python/internal.bzl
new file mode 100644
index 0000000..e9bcb27
--- /dev/null
+++ b/python/internal.bzl
@@ -0,0 +1,108 @@
+# Internal helpers for building the Python protobuf runtime.
+
+def _internal_copy_files_impl(ctx):
+ strip_prefix = ctx.attr.strip_prefix
+ if strip_prefix[-1] != "/":
+ strip_prefix += "/"
+
+ src_dests = []
+ for src in ctx.files.srcs:
+ if src.short_path[:len(strip_prefix)] != strip_prefix:
+ fail("Source does not start with %s: %s" %
+ (strip_prefix, src.short_path))
+ dest = ctx.actions.declare_file(src.short_path[len(strip_prefix):])
+ src_dests.append([src, dest])
+
+ if ctx.attr.is_windows:
+ bat_file = ctx.actions.declare_file(ctx.label.name + "_copy.bat")
+ ctx.actions.write(
+ output = bat_file,
+ content = "\r\n".join([
+ '@copy /Y "{}" "{}" >NUL'.format(
+ src.path.replace("/", "\\"),
+ dest.path.replace("/", "\\"),
+ )
+ for src, dest in src_dests
+ ]) + "\r\n",
+ )
+ ctx.actions.run(
+ inputs = ctx.files.srcs,
+ tools = [bat_file],
+ outputs = [dest for src, dest in src_dests],
+ executable = "cmd.exe",
+ arguments = ["/C", bat_file.path.replace("/", "\\")],
+ mnemonic = "InternalCopyFile",
+ progress_message = "Copying files",
+ use_default_shell_env = True,
+ )
+
+ else:
+ sh_file = ctx.actions.declare_file(ctx.label.name + "_copy.sh")
+ ctx.actions.write(
+ output = sh_file,
+ content = "\n".join([
+ 'cp -f "{}" "{}"'.format(src.path, dest.path)
+ for src, dest in src_dests
+ ]),
+ )
+ ctx.actions.run(
+ inputs = ctx.files.srcs,
+ tools = [sh_file],
+ outputs = [dest for src, dest in src_dests],
+ executable = "bash",
+ arguments = [sh_file.path],
+ mnemonic = "InternalCopyFile",
+ progress_message = "Copying files",
+ use_default_shell_env = True,
+ )
+
+ return [
+ DefaultInfo(files = depset([dest for src, dest in src_dests])),
+ ]
+
+internal_copy_files_impl = rule(
+ doc = """
+Implementation for internal_copy_files macro.
+
+This rule implements file copying, including a compatibility mode for Windows.
+""",
+ implementation = _internal_copy_files_impl,
+ attrs = {
+ "srcs": attr.label_list(allow_files = True, providers = [DefaultInfo]),
+ "strip_prefix": attr.string(),
+ "is_windows": attr.bool(),
+ },
+)
+
+def internal_copy_files(name, srcs, strip_prefix, **kwargs):
+ """Copies common proto files to the python tree.
+
+ In order for Python imports to work, generated proto interfaces under
+ the google.protobuf package need to be in the same directory as other
+ source files. This rule copies the .proto files themselves, e.g. with
+ strip_prefix = 'src', 'src/google/protobuf/blah.proto' could be copied
+ to '<package>/google/protobuf/blah.proto'.
+
+ (An alternative might be to implement a separate rule to generate
+ Python code in a different location for the sources. However, this
+ would be strange behavior that doesn't match any other language's proto
+ library generation.)
+
+ Args:
+ name: the name for the rule.
+ srcs: the sources.
+ strip_prefix: the prefix to remove from each of the paths in 'srcs'. The
+ remainder will be used to construct the output path.
+ **kwargs: common rule arguments.
+
+ """
+ internal_copy_files_impl(
+ name = name,
+ srcs = srcs,
+ strip_prefix = strip_prefix,
+ is_windows = select({
+ "@bazel_tools//src/conditions:host_windows": True,
+ "//conditions:default": False,
+ }),
+ **kwargs
+ )
diff --git a/python/python_version.py b/python/python_version.py
new file mode 100644
index 0000000..5bf8d21
--- /dev/null
+++ b/python/python_version.py
@@ -0,0 +1,52 @@
+# Protocol Buffers - Google's data interchange format
+# Copyright 2008 Google Inc. All rights reserved.
+# https://developers.google.com/protocol-buffers/
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Test that Kokoro is using the expected version of python."""
+
+import os
+import sys
+import unittest
+
+
+class PythonVersionTest(unittest.TestCase):
+
+ def testPython3(self):
+ """Test that we can import nested import public messages."""
+
+ exp = os.getenv('KOKORO_PYTHON_VERSION', '')
+ if not exp:
+ print('No kokoro python version found, skipping check', file=sys.stderr)
+ return
+ self.assertTrue(
+ sys.version.startswith(exp),
+ 'Expected Python %s but found Python %s' % (exp, sys.version))
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/python/setup.py b/python/setup.py
index cbb9a59..7a55359 100755
--- a/python/setup.py
+++ b/python/setup.py
@@ -29,10 +29,14 @@
# Find the Protocol Compiler.
if 'PROTOC' in os.environ and os.path.exists(os.environ['PROTOC']):
protoc = os.environ['PROTOC']
-elif os.path.exists('../src/protoc'):
- protoc = '../src/protoc'
-elif os.path.exists('../src/protoc.exe'):
- protoc = '../src/protoc.exe'
+elif os.path.exists('../bazel-bin/protoc'):
+ protoc = '../bazel-bin/protoc'
+elif os.path.exists('../bazel-bin/protoc.exe'):
+ protoc = '../bazel-bin/protoc.exe'
+elif os.path.exists('protoc'):
+ protoc = '../protoc'
+elif os.path.exists('protoc.exe'):
+ protoc = '../protoc.exe'
elif os.path.exists('../vsprojects/Debug/protoc.exe'):
protoc = '../vsprojects/Debug/protoc.exe'
elif os.path.exists('../vsprojects/Release/protoc.exe'):
@@ -203,13 +207,13 @@
class TestConformanceCmd(_build_py):
- target = 'test_python'
+ target = '//python:conformance_test'
def run(self):
# Python 2.6 dodges these extra failures.
os.environ['CONFORMANCE_PYTHON_EXTRA_FAILURES'] = (
'--failure_list failure_list_python-post26.txt')
- cmd = 'cd ../conformance && make %s' % (TestConformanceCmd.target)
+ cmd = 'bazel test %s' % (TestConformanceCmd.target,)
subprocess.check_call(cmd, shell=True)
@@ -220,6 +224,59 @@
return False
+def _GetFlagValues(flag_long, flag_short):
+ """Searches sys.argv for distutils-style flags and yields values."""
+
+ expect_value = flag_long.endswith('=')
+ flag_res = [re.compile(r'--?%s(=(.*))?' %
+ (flag_long[:-1] if expect_value else flag_long))]
+ if flag_short:
+ flag_res.append(re.compile(r'-%s(.*)?' % (flag_short,)))
+
+ flag_match = None
+ for arg in sys.argv:
+ # If the last arg was like '-O', check if this is the library we want.
+ if flag_match is not None:
+ yield arg
+ flag_match = None
+ continue
+
+ for flag_re in flag_res:
+ m = flag_re.match(arg)
+ if m is None:
+ continue
+ if not expect_value:
+ yield arg
+ continue
+ groups = m.groups()
+ # Check for matches:
+ # --long-name=foo => ('=foo', 'foo')
+ # -Xfoo => ('foo')
+ # N.B.: if the flag is like '--long-name=', then there is a value
+ # (the empty string).
+ if groups[0] or groups[-1]:
+ yield groups[-1]
+ continue
+ flag_match = m
+
+ return False
+
+
+def HasStaticLibprotobufOpt():
+ """Returns true if there is a --link-objects arg for libprotobuf."""
+
+ lib_re = re.compile(r'(.*[/\\])?(lib)?protobuf([.]pic)?[.](a|lib)')
+ for value in _GetFlagValues('link-objects=', 'O'):
+ if lib_re.match(value):
+ return True
+ return False
+
+
+def HasLibraryDirsOpt():
+ """Returns true if there is a --library-dirs arg."""
+ return any(_GetFlagValues('library-dirs=', 'L'))
+
+
if __name__ == '__main__':
ext_module_list = []
warnings_as_errors = '--warnings_as_errors'
@@ -227,14 +284,37 @@
# Link libprotobuf.a and libprotobuf-lite.a statically with the
# extension. Note that those libraries have to be compiled with
# -fPIC for this to work.
- compile_static_ext = GetOptionFromArgv('--compile_static_extension')
- libraries = ['protobuf']
+ compile_static_ext = HasStaticLibprotobufOpt()
+ if GetOptionFromArgv('--compile_static_extension'):
+ # FUTURE: add a warning and deprecate --compile_static_extension.
+ compile_static_ext = True
extra_objects = None
if compile_static_ext:
libraries = None
- extra_objects = ['../src/.libs/libprotobuf.a',
- '../src/.libs/libprotobuf-lite.a']
- TestConformanceCmd.target = 'test_python_cpp'
+ library_dirs = None
+ if not HasStaticLibprotobufOpt():
+ if os.path.exists('../bazel-bin/src/google/protobuf/libprotobuf.a'):
+ extra_objects = ['../bazel-bin/src/google/protobuf/libprotobuf.a']
+ else:
+ extra_objects = ['../libprotobuf.a']
+ # Repeat all of these enough times to eliminate order-dependence.
+ extra_objects += list(
+ glob.iglob('../third_party/abseil-cpp/absl/**/*.a'))
+ extra_objects += list(
+ glob.iglob('../third_party/abseil-cpp/absl/**/*.a'))
+ extra_objects += list(
+ glob.iglob('../third_party/abseil-cpp/absl/**/*.a'))
+ else:
+ libraries = ['protobuf']
+ if HasLibraryDirsOpt():
+ library_dirs = None
+ elif os.path.exists('../bazel-bin/src/google/protobuf/libprotobuf.a'):
+ library_dirs = ['../bazel-bin/src/google/protobuf']
+ else:
+ library_dirs = ['..']
+
+ TestConformanceCmd.target = ('//python:conformance_test_cpp '
+ '--define=use_fast_cpp_protos=true')
extra_compile_args = []
@@ -259,7 +339,7 @@
extra_compile_args.append('-Wno-invalid-offsetof')
extra_compile_args.append('-Wno-sign-compare')
extra_compile_args.append('-Wno-unused-variable')
- extra_compile_args.append('-std=c++11')
+ extra_compile_args.append('-std=c++14')
if sys.platform == 'darwin':
extra_compile_args.append('-Wno-shorten-64-to-32')
@@ -301,11 +381,11 @@
Extension(
'google.protobuf.pyext._message',
glob.glob('google/protobuf/pyext/*.cc'),
- include_dirs=['.', '../src'],
+ include_dirs=['.', '../src', '../third_party/abseil-cpp'],
libraries=libraries,
extra_objects=extra_objects,
extra_link_args=message_extra_link_args,
- library_dirs=['../src/.libs'],
+ library_dirs=library_dirs,
extra_compile_args=extra_compile_args,
),
Extension(
diff --git a/python/tox.ini b/python/tox.ini
index b923a4a..346ce21 100644
--- a/python/tox.ini
+++ b/python/tox.ini
@@ -5,10 +5,10 @@
[testenv]
usedevelop=true
passenv =
- CC KOKORO_BUILD_ID KOKORO_BUILD_NUMBER
+ CC PYTHONPATH KOKORO_BUILD_ID KOKORO_BUILD_NUMBER
setenv =
- cpp: LD_LIBRARY_PATH={toxinidir}/../src/.libs
- cpp: DYLD_LIBRARY_PATH={toxinidir}/../src/.libs
+ cpp: LD_LIBRARY_PATH={toxinidir}/../bazel-bin/src/google
+ cpp: DYLD_LIBRARY_PATH={toxinidir}/../bazel-bin/src/google
cpp: PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=cpp
python: PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python
commands =
diff --git a/ruby/BUILD.bazel b/ruby/BUILD.bazel
index fe336e5..d014402 100644
--- a/ruby/BUILD.bazel
+++ b/ruby/BUILD.bazel
@@ -3,30 +3,180 @@
# See also code generation logic under /src/google/protobuf/compiler/ruby.
load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
+load("//build_defs:internal_shell.bzl", "inline_sh_test")
+load("//conformance:defs.bzl", "conformance_test")
+load("//:protobuf.bzl", "internal_ruby_proto_library")
+load(":internal.bzl", "internal_ruby_extension")
+
+################################################################################
+# Ruby Runtime
+################################################################################
+
+config_setting(
+ name = "java_ruby",
+ values = {"define": "ruby_platform=java"},
+)
+
+config_setting(
+ name = "c_ruby",
+ values = {"define": "ruby_platform=c"},
+)
+
+filegroup(
+ name = "srcs",
+ srcs = glob([
+ "lib/**/*.rb",
+ "src/**/*.proto",
+ ]) + [
+ "Gemfile",
+ "Rakefile",
+ "google-protobuf.gemspec",
+ "pom.xml",
+ ],
+)
+
+internal_ruby_extension(
+ name = "protobuf_c_mac",
+ extension = "lib/google/protobuf_c.bundle",
+ deps = glob(["ext/google/protobuf_c/*"]),
+ target_compatible_with = select({
+ ":java_ruby": ["@platforms//:incompatible"],
+ "//conditions:default": ["@platforms//os:osx"],
+ }),
+)
+
+internal_ruby_extension(
+ name = "protobuf_c",
+ extension = "lib/google/protobuf_c.so",
+ deps = glob(["ext/google/protobuf_c/*"]),
+ target_compatible_with = select({
+ ":java_ruby": ["@platforms//:incompatible"],
+ "@platforms//os:osx": ["@platforms//:incompatible"],
+ "//conditions:default": [],
+ }),
+)
+
+internal_ruby_extension(
+ name = "protobuf_java",
+ extension = "lib/google/protobuf_java.jar",
+ deps = glob(["src/**/*.java"]),
+ target_compatible_with = select({
+ ":java_ruby": [],
+ "//conditions:default": ["@platforms//:incompatible"],
+ }),
+)
+
+filegroup(
+ name = "protobuf",
+ srcs = [
+ ":srcs",
+ "//third_party/utf8_range:all_files",
+ ] + select({
+ ":java_ruby": [":protobuf_java"],
+ "@bazel_tools//src/conditions:darwin": [":protobuf_c_mac"],
+ "//conditions:default": [":protobuf_c"],
+ }),
+ visibility = [
+ "//conformance:__subpackages__",
+ "//ruby:__subpackages__",
+ ],
+)
+
+################################################################################
+# Tests
+################################################################################
+
+filegroup(
+ name = "tests",
+ srcs = glob(["tests/*.rb"]),
+)
+
+filegroup(
+ name = "test_protos",
+ srcs = glob(["tests/*.proto"]),
+)
+
+internal_ruby_proto_library(
+ name = "test_ruby_protos",
+ srcs = [":test_protos"],
+ proto_deps = ["//:well_known_protos"],
+ includes = [".", "src", "ruby/tests"],
+)
+
+inline_sh_test(
+ name = "test",
+ srcs = [
+ "Rakefile",
+ ],
+ deps = [
+ ":protobuf",
+ ":test_ruby_protos",
+ ":tests",
+ "//:well_known_ruby_protos",
+ ],
+ cmd = """
+ pushd `dirname $(location Rakefile)`
+ RUBYLIB=../src:tests:. BAZEL=true rake test
+ popd
+ """,
+)
+
+inline_sh_test(
+ name = "gc_test",
+ srcs = [
+ "Rakefile",
+ ],
+ deps = [
+ ":protobuf",
+ ":test_ruby_protos",
+ ":tests",
+ "//:well_known_ruby_protos",
+ ],
+ cmd = """
+ pushd `dirname $(location Rakefile)`
+ RUBYLIB=../src:tests:. BAZEL=true rake gc_test
+ popd
+ """,
+)
+
+conformance_test(
+ name = "conformance_test",
+ failure_list = "//conformance:failure_list_ruby.txt",
+ testee = "//conformance:conformance_ruby",
+ text_format_failure_list = "//conformance:text_format_failure_list_ruby.txt",
+ target_compatible_with = select({
+ ":java_ruby": ["@platforms//:incompatible"],
+ "//conditions:default": [],
+ }),
+)
+
+conformance_test(
+ name = "conformance_test_jruby",
+ failure_list = "//conformance:failure_list_jruby.txt",
+ testee = "//conformance:conformance_ruby",
+ text_format_failure_list = "//conformance:text_format_failure_list_jruby.txt",
+ target_compatible_with = select({
+ ":java_ruby": [],
+ "//conditions:default": ["@platforms//:incompatible"],
+ }),
+)
+
+################################################################################
+# Distribution files
+################################################################################
pkg_files(
name = "dist_files",
srcs = glob([
- "compatibility_tests/v3.0.0/**/*",
- "ext/google/protobuf_c/*",
- "src/main/java/com/google/protobuf/jruby/*.java",
"tests/*.proto",
"tests/*.rb",
]) + [
+ ":srcs",
".gitignore",
"BUILD.bazel",
+ "internal.bzl",
"Gemfile",
"README.md",
- "Rakefile",
- "google-protobuf.gemspec",
- "lib/google/protobuf.rb",
- "lib/google/protobuf/descriptor_dsl.rb",
- "lib/google/protobuf/message_exts.rb",
- "lib/google/protobuf/repeated_field.rb",
- "lib/google/protobuf/well_known_types.rb",
- "pom.xml",
- "src/main/java/google/ProtobufJavaService.java",
- "src/main/sentinel.proto",
"travis-test.sh",
],
strip_prefix = strip_prefix.from_root(""),
diff --git a/ruby/README.md b/ruby/README.md
index 42a1ffa..be8d6bc 100644
--- a/ruby/README.md
+++ b/ruby/README.md
@@ -9,7 +9,7 @@
Installation from Gem
---------------------
-In Gemfile (Please check a version of Protocol Buffers you needed [RubyGems](https://rubygems.org/gems/google-protobuf)):
+In Gemfile (Please check which version of Protocol Buffers you need: [RubyGems](https://rubygems.org/gems/google-protobuf)):
gem 'google-protobuf'
diff --git a/ruby/Rakefile b/ruby/Rakefile
index d8ac763..89a00e1 100644
--- a/ruby/Rakefile
+++ b/ruby/Rakefile
@@ -39,8 +39,8 @@
if !ENV['PROTOC'].nil?
protoc_command = ENV['PROTOC']
-elsif system('../src/protoc --version')
- protoc_command = '../src/protoc'
+elsif system('../bazel-bin/protoc --version')
+ protoc_command = '../bazel-bin/protoc'
else
protoc_command = 'protoc'
end
@@ -49,7 +49,7 @@
# We won't have access to .. from within docker, but the proto files
# will be there, thanks to the :genproto rule dependency for gem:native.
-unless ENV['IN_DOCKER'] == 'true'
+unless ENV['IN_DOCKER'] == 'true' or ENV['BAZEL'] == 'true'
well_known_protos.each do |proto_file|
input_file = "../src/" + proto_file
output_file = "lib/" + proto_file.sub(/\.proto$/, "_pb.rb")
@@ -153,13 +153,15 @@
Gem::PackageTask.new(spec) do |pkg|
end
-Rake::TestTask.new(:test => [:build, :genproto]) do |t|
+# Skip build/genproto in Bazel builds, where we expect this to
+# be done already.
+Rake::TestTask.new(:test => ENV['BAZEL'] == 'true' ? [] : [:build, :genproto]) do |t|
t.test_files = FileList["tests/*.rb"].exclude("tests/gc_test.rb", "tests/common_tests.rb")
end
# gc_test needs to be split out to ensure the generated file hasn't been
# imported by other tests.
-Rake::TestTask.new(:gc_test => :build) do |t|
+Rake::TestTask.new(:gc_test => ENV['BAZEL'] == 'true' ? [] : :build) do |t|
t.test_files = FileList["tests/gc_test.rb"]
end
diff --git a/ruby/compatibility_tests/v3.0.0/BUILD.bazel b/ruby/compatibility_tests/v3.0.0/BUILD.bazel
new file mode 100644
index 0000000..b5fcede
--- /dev/null
+++ b/ruby/compatibility_tests/v3.0.0/BUILD.bazel
@@ -0,0 +1,56 @@
+load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
+load("//build_defs:internal_shell.bzl", "inline_sh_test")
+load("//:protobuf.bzl", "internal_ruby_proto_library")
+
+filegroup(
+ name = "tests",
+ srcs = glob(["tests/*.rb"]),
+)
+
+filegroup(
+ name = "test_protos",
+ srcs = glob(["tests/*.proto"]),
+)
+
+internal_ruby_proto_library(
+ name = "test_ruby_protos",
+ srcs = [":test_protos"],
+ includes = ["."],
+)
+
+inline_sh_test(
+ name = "test",
+ srcs = [
+ "Rakefile",
+ ],
+ deps = [
+ ":test_ruby_protos",
+ ":tests",
+ "//:well_known_ruby_protos",
+ "//ruby:protobuf",
+ ],
+ cmd = """
+ pushd `dirname $(location Rakefile)`
+ RUBYLIB=.:tests:../../lib:../../../src BAZEL=true rake test
+ popd
+ """,
+)
+
+################################################################################
+# Distribution files
+############################################################################
+
+pkg_files(
+ name = "dist_files",
+ srcs = glob([
+ "**/*.rb",
+ "**/*.proto"
+ ]) + [
+ "BUILD.bazel",
+ "Rakefile",
+ "README.md",
+ "test.sh",
+ ],
+ strip_prefix = strip_prefix.from_root(""),
+ visibility = ["//pkg:__pkg__"],
+)
diff --git a/ruby/compatibility_tests/v3.0.0/Rakefile b/ruby/compatibility_tests/v3.0.0/Rakefile
index 19a4ba1..f72bed2 100644
--- a/ruby/compatibility_tests/v3.0.0/Rakefile
+++ b/ruby/compatibility_tests/v3.0.0/Rakefile
@@ -2,14 +2,17 @@
# Proto for tests.
genproto_output = []
-genproto_output << "tests/generated_code.rb"
-genproto_output << "tests/test_import.rb"
-file "tests/generated_code.rb" => "tests/generated_code.proto" do |file_task|
- sh "./protoc --ruby_out=. tests/generated_code.proto"
-end
-file "tests/test_import.rb" => "tests/test_import.proto" do |file_task|
- sh "./protoc --ruby_out=. tests/test_import.proto"
+unless ENV['BAZEL'] == 'true'
+ genproto_output << "tests/generated_code.rb"
+ genproto_output << "tests/test_import.rb"
+ file "tests/generated_code.rb" => "tests/generated_code.proto" do |file_task|
+ sh "./protoc --ruby_out=. tests/generated_code.proto"
+ end
+
+ file "tests/test_import.rb" => "tests/test_import.proto" do |file_task|
+ sh "./protoc --ruby_out=. tests/test_import.proto"
+ end
end
task :genproto => genproto_output
diff --git a/ruby/compatibility_tests/v3.0.0/tests/basic.rb b/ruby/compatibility_tests/v3.0.0/tests/basic.rb
index 7228144..d45c196 100755
--- a/ruby/compatibility_tests/v3.0.0/tests/basic.rb
+++ b/ruby/compatibility_tests/v3.0.0/tests/basic.rb
@@ -667,8 +667,8 @@
assert m["z"] == :C
m["z"] = 2
assert m["z"] == :B
- m["z"] = 4
- assert m["z"] == 4
+ m["z"] = 5
+ assert m["z"] == 5
assert_raise RangeError do
m["z"] = :Z
end
diff --git a/ruby/ext/google/protobuf_c/extconf.rb b/ruby/ext/google/protobuf_c/extconf.rb
index 8bc96ae..5cc4533 100755
--- a/ruby/ext/google/protobuf_c/extconf.rb
+++ b/ruby/ext/google/protobuf_c/extconf.rb
@@ -25,4 +25,4 @@
"repeated_field.c", "map.c", "ruby-upb.c", "wrap_memcpy.c",
"naive.c", "range2-neon.c", "range2-sse.c"]
-create_makefile(ext_name)
+create_makefile(ext_name, Dir.pwd+"/../../../../ext/google/protobuf_c")
diff --git a/ruby/ext/google/protobuf_c/message.c b/ruby/ext/google/protobuf_c/message.c
index 6b8bbaa..5acff80 100644
--- a/ruby/ext/google/protobuf_c/message.c
+++ b/ruby/ext/google/protobuf_c/message.c
@@ -37,6 +37,7 @@
#include "repeated_field.h"
static VALUE cParseError = Qnil;
+static VALUE cAbstractMessage = Qnil;
static ID descriptor_instancevar_interned;
static VALUE initialize_rb_class_with_no_args(VALUE klass) {
@@ -1201,36 +1202,8 @@
klass = rb_define_class_id(
// Docs say this parameter is ignored. User will assign return value to
// their own toplevel constant class name.
- rb_intern("Message"), rb_cObject);
+ rb_intern("Message"), cAbstractMessage);
rb_ivar_set(klass, descriptor_instancevar_interned, descriptor);
- rb_define_alloc_func(klass, Message_alloc);
- rb_require("google/protobuf/message_exts");
- rb_include_module(klass, rb_eval_string("::Google::Protobuf::MessageExts"));
- rb_extend_object(
- klass, rb_eval_string("::Google::Protobuf::MessageExts::ClassMethods"));
-
- rb_define_method(klass, "method_missing", Message_method_missing, -1);
- rb_define_method(klass, "respond_to_missing?", Message_respond_to_missing,
- -1);
- rb_define_method(klass, "initialize", Message_initialize, -1);
- rb_define_method(klass, "dup", Message_dup, 0);
- // Also define #clone so that we don't inherit Object#clone.
- rb_define_method(klass, "clone", Message_dup, 0);
- rb_define_method(klass, "==", Message_eq, 1);
- rb_define_method(klass, "eql?", Message_eq, 1);
- rb_define_method(klass, "freeze", Message_freeze, 0);
- rb_define_method(klass, "hash", Message_hash, 0);
- rb_define_method(klass, "to_h", Message_to_h, 0);
- rb_define_method(klass, "inspect", Message_inspect, 0);
- rb_define_method(klass, "to_s", Message_inspect, 0);
- rb_define_method(klass, "[]", Message_index, 1);
- rb_define_method(klass, "[]=", Message_index_set, 2);
- rb_define_singleton_method(klass, "decode", Message_decode, -1);
- rb_define_singleton_method(klass, "encode", Message_encode, -1);
- rb_define_singleton_method(klass, "decode_json", Message_decode_json, -1);
- rb_define_singleton_method(klass, "encode_json", Message_encode_json, -1);
- rb_define_singleton_method(klass, "descriptor", Message_descriptor, 0);
-
return klass;
}
@@ -1290,15 +1263,20 @@
int n = upb_EnumDef_ValueCount(e);
for (int i = 0; i < n; i++) {
const upb_EnumValueDef* ev = upb_EnumDef_Value(e, i);
- const char* name = upb_EnumValueDef_Name(ev);
+ char* name = strdup(upb_EnumValueDef_Name(ev));
int32_t value = upb_EnumValueDef_Number(ev);
if (name[0] < 'A' || name[0] > 'Z') {
- rb_warn(
+ if (name[0] >= 'a' && name[0] <= 'z') {
+ name[0] -= 32; // auto capitalize
+ } else {
+ rb_warn(
"Enum value '%s' does not start with an uppercase letter "
"as is required for Ruby constants.",
name);
+ }
}
rb_define_const(mod, name, INT2NUM(value));
+ free(name);
}
rb_define_singleton_method(mod, "lookup", enum_lookup, 1);
@@ -1392,11 +1370,41 @@
return self->msg;
}
+static void Message_define_class(VALUE klass) {
+ rb_define_alloc_func(klass, Message_alloc);
+
+ rb_require("google/protobuf/message_exts");
+ rb_define_method(klass, "method_missing", Message_method_missing, -1);
+ rb_define_method(klass, "respond_to_missing?", Message_respond_to_missing,
+ -1);
+ rb_define_method(klass, "initialize", Message_initialize, -1);
+ rb_define_method(klass, "dup", Message_dup, 0);
+ // Also define #clone so that we don't inherit Object#clone.
+ rb_define_method(klass, "clone", Message_dup, 0);
+ rb_define_method(klass, "==", Message_eq, 1);
+ rb_define_method(klass, "eql?", Message_eq, 1);
+ rb_define_method(klass, "freeze", Message_freeze, 0);
+ rb_define_method(klass, "hash", Message_hash, 0);
+ rb_define_method(klass, "to_h", Message_to_h, 0);
+ rb_define_method(klass, "inspect", Message_inspect, 0);
+ rb_define_method(klass, "to_s", Message_inspect, 0);
+ rb_define_method(klass, "[]", Message_index, 1);
+ rb_define_method(klass, "[]=", Message_index_set, 2);
+ rb_define_singleton_method(klass, "decode", Message_decode, -1);
+ rb_define_singleton_method(klass, "encode", Message_encode, -1);
+ rb_define_singleton_method(klass, "decode_json", Message_decode_json, -1);
+ rb_define_singleton_method(klass, "encode_json", Message_encode_json, -1);
+ rb_define_singleton_method(klass, "descriptor", Message_descriptor, 0);
+}
+
void Message_register(VALUE protobuf) {
cParseError = rb_const_get(protobuf, rb_intern("ParseError"));
+ cAbstractMessage = rb_define_class_under(protobuf, "AbstractMessage", rb_cObject);
+ Message_define_class(cAbstractMessage);
+ rb_gc_register_address(&cAbstractMessage);
// Ruby-interned string: "descriptor". We use this identifier to store an
// instance variable on message classes we create in order to link them back
// to their descriptors.
- descriptor_instancevar_interned = rb_intern("descriptor");
+ descriptor_instancevar_interned = rb_intern("@descriptor");
}
diff --git a/ruby/internal.bzl b/ruby/internal.bzl
new file mode 100644
index 0000000..74a2d10
--- /dev/null
+++ b/ruby/internal.bzl
@@ -0,0 +1,35 @@
+def internal_ruby_extension(
+ name,
+ extension,
+ deps = [],
+ **kwargs):
+ """Bazel rule to wrap up a generated ruby extension.
+
+ NOTE: the rule is only an internal workaround. The interface may change and
+ the rule may be removed when everything is properly "Bazelified".
+
+ Args:
+ name: the name of the target.
+ extension: the path of the extension file.
+ deps: extra dependencies to add.
+ **kwargs: extra arguments to forward to the genrule.
+ """
+
+
+ native.genrule(
+ name = name,
+ srcs = deps + [
+ "Rakefile",
+ ":srcs",
+ ":test_ruby_protos",
+ ":tests",
+ "//third_party/utf8_range:all_files",
+ ],
+ tags = ["manual"],
+ outs = [extension],
+ cmd = "pushd `dirname $(location Rakefile)`\n" +
+ "BAZEL=true rake\n" +
+ "popd\n" +
+ "cp `dirname $(location Rakefile)`/%s $(OUTS)\n" % extension,
+ **kwargs,
+ )
diff --git a/ruby/lib/google/protobuf/message_exts.rb b/ruby/lib/google/protobuf/message_exts.rb
index 6608521..3cc1a08 100644
--- a/ruby/lib/google/protobuf/message_exts.rb
+++ b/ruby/lib/google/protobuf/message_exts.rb
@@ -49,5 +49,10 @@
end
end
+ class AbstractMessage
+ include MessageExts
+ extend MessageExts::ClassMethods
+ end
+ private_constant :AbstractMessage
end
end
diff --git a/ruby/src/main/java/com/google/protobuf/jruby/RubyEnumDescriptor.java b/ruby/src/main/java/com/google/protobuf/jruby/RubyEnumDescriptor.java
index 6532867..0eb7c93 100644
--- a/ruby/src/main/java/com/google/protobuf/jruby/RubyEnumDescriptor.java
+++ b/ruby/src/main/java/com/google/protobuf/jruby/RubyEnumDescriptor.java
@@ -162,9 +162,10 @@
boolean defaultValueRequiredButNotFound =
descriptor.getFile().getSyntax() == FileDescriptor.Syntax.PROTO3;
for (EnumValueDescriptor value : descriptor.getValues()) {
- String name = value.getName();
- // Make sure its a valid constant name before trying to create it
- if (Character.isUpperCase(name.codePointAt(0))) {
+ String name = fixEnumConstantName(value.getName());
+ // Make sure it's a valid constant name before trying to create it
+ int ch = name.codePointAt(0);
+ if (Character.isUpperCase(ch)) {
enumModule.defineConstant(name, runtime.newFixnum(value.getNumber()));
} else {
runtime
@@ -189,6 +190,22 @@
return enumModule;
}
+ private static String fixEnumConstantName(String name) {
+ if (name != null && name.length() > 0) {
+ int ch = name.codePointAt(0);
+ if (ch >= 'a' && ch <= 'z') {
+ // Protobuf enums can start with lowercase letters, while Ruby's constant should
+ // always start with uppercase letters. We tolerate this case by capitalizing
+ // the first character if possible.
+ return new StringBuilder()
+ .appendCodePoint(Character.toUpperCase(ch))
+ .append(name.substring(1))
+ .toString();
+ }
+ }
+ return name;
+ }
+
private EnumDescriptor descriptor;
private EnumDescriptorProto.Builder builder;
private IRubyObject name;
diff --git a/ruby/tests/basic_test.proto b/ruby/tests/basic_test.proto
index fb70f47..d480d48 100644
--- a/ruby/tests/basic_test.proto
+++ b/ruby/tests/basic_test.proto
@@ -73,6 +73,7 @@
A = 1;
B = 2;
C = 3;
+ v0 = 4;
}
message TestEmbeddedMessageParent {
diff --git a/ruby/tests/basic_test_proto2.proto b/ruby/tests/basic_test_proto2.proto
index 0c1a2b9..ac705ed 100644
--- a/ruby/tests/basic_test_proto2.proto
+++ b/ruby/tests/basic_test_proto2.proto
@@ -69,6 +69,7 @@
A = 1;
B = 2;
C = 3;
+ v0 = 4;
}
enum TestNonZeroEnum {
diff --git a/ruby/tests/common_tests.rb b/ruby/tests/common_tests.rb
index 5918c8a..9288425 100644
--- a/ruby/tests/common_tests.rb
+++ b/ruby/tests/common_tests.rb
@@ -331,14 +331,16 @@
l.push :A
l.push :B
l.push :C
- assert l.count == 3
+ l.push :v0
+ assert l.count == 4
assert_raise RangeError do
l.push :D
end
assert l[0] == :A
+ assert l[3] == :v0
- l.push 4
- assert l[3] == 4
+ l.push 5
+ assert l[4] == 5
end
def test_rptfield_initialize
@@ -542,8 +544,8 @@
assert m["z"] == :C
m["z"] = 2
assert m["z"] == :B
- m["z"] = 4
- assert m["z"] == 4
+ m["z"] = 5
+ assert m["z"] == 5
assert_raise RangeError do
m["z"] = :Z
end
@@ -712,14 +714,17 @@
assert proto_module::TestEnum::A == 1
assert proto_module::TestEnum::B == 2
assert proto_module::TestEnum::C == 3
+ assert proto_module::TestEnum::V0 == 4
assert proto_module::TestEnum::lookup(1) == :A
assert proto_module::TestEnum::lookup(2) == :B
assert proto_module::TestEnum::lookup(3) == :C
+ assert proto_module::TestEnum::lookup(4) == :v0
assert proto_module::TestEnum::resolve(:A) == 1
assert proto_module::TestEnum::resolve(:B) == 2
assert proto_module::TestEnum::resolve(:C) == 3
+ assert proto_module::TestEnum::resolve(:v0) == 4
end
def test_enum_const_get_helpers
@@ -788,7 +793,7 @@
assert_raise(NoMethodError) { m.a }
assert_raise(NoMethodError) { m.a_const_const }
end
-
+
def test_repeated_push
m = proto_module::TestMessage.new
@@ -1762,7 +1767,7 @@
assert_raise(FrozenErrorType) { m.repeated_msg = proto_module::TestMessage2.new }
assert_raise(FrozenErrorType) { m.repeated_enum = :A }
end
-
+
def test_eq
m1 = proto_module::TestMessage.new(:optional_string => 'foo', :repeated_string => ['bar1', 'bar2'])
m2 = proto_module::TestMessage.new(:optional_string => 'foo', :repeated_string => ['bar1', 'bar2'])
diff --git a/ruby/tests/generated_code.proto b/ruby/tests/generated_code.proto
index bfdfa5a..5f017ba 100644
--- a/ruby/tests/generated_code.proto
+++ b/ruby/tests/generated_code.proto
@@ -67,6 +67,8 @@
A = 1;
B = 2;
C = 3;
+
+ v0 = 4;
}
message testLowercaseNested {
diff --git a/ruby/tests/generated_code_proto2.proto b/ruby/tests/generated_code_proto2.proto
index 1e95721..1a50b84 100644
--- a/ruby/tests/generated_code_proto2.proto
+++ b/ruby/tests/generated_code_proto2.proto
@@ -68,6 +68,8 @@
A = 1;
B = 2;
C = 3;
+
+ v0 = 4;
}
message TestUnknown {
diff --git a/ruby/tests/repeated_field_test.rb b/ruby/tests/repeated_field_test.rb
index 881810c..de96869 100755
--- a/ruby/tests/repeated_field_test.rb
+++ b/ruby/tests/repeated_field_test.rb
@@ -697,6 +697,7 @@
value :A, 1
value :B, 2
value :C, 3
+ value :v0, 4
end
end
diff --git a/ruby/tests/ruby_version.rb b/ruby/tests/ruby_version.rb
new file mode 100644
index 0000000..eb98960
--- /dev/null
+++ b/ruby/tests/ruby_version.rb
@@ -0,0 +1,33 @@
+#!/usr/bin/ruby
+
+# Test that Kokoro is using the expected version of ruby.
+
+require 'test/unit'
+
+class RubyVersionTest < Test::Unit::TestCase
+
+ def test_ruby_version
+ return if RUBY_PLATFORM == "java"
+ if not ENV["KOKORO_RUBY_VERSION"]
+ STDERR.puts("No kokoro ruby version found, skipping check")
+ return
+ end
+
+ actual = RUBY_VERSION
+ expected = ENV["KOKORO_RUBY_VERSION"].delete_prefix("ruby-")
+ assert actual.start_with?(expected), "Version #{actual} found, expecting #{expected}"
+ end
+
+ def test_jruby_version
+ return if RUBY_PLATFORM != "java"
+ if not ENV["KOKORO_RUBY_VERSION"]
+ STDERR.puts("No kokoro ruby version found, skipping check")
+ return
+ end
+
+ expected = ENV["KOKORO_RUBY_VERSION"].delete_prefix("jruby-")
+ actual = JRUBY_VERSION
+ assert actual.start_with?(expected), "Version #{actual} found, expecting #{expected}"
+ end
+
+end
diff --git a/ruby/travis-test.sh b/ruby/travis-test.sh
index f7fa815..6e9c612 100755
--- a/ruby/travis-test.sh
+++ b/ruby/travis-test.sh
@@ -5,8 +5,12 @@
test_version() {
version=$1
-
- RUBY_CONFORMANCE=test_ruby
+ bazel_args=" \
+ -k --test_output=streamed \
+ --action_env=PATH \
+ --action_env=GEM_PATH \
+ --action_env=GEM_HOME \
+ --test_env=KOKORO_RUBY_VERSION=$version"
if [[ $version == jruby-9* ]] ; then
bash --login -c \
@@ -14,21 +18,14 @@
which ruby && \
git clean -f && \
gem install --no-document bundler && bundle && \
- rake test && \
- rake gc_test && \
- cd ../conformance && make test_jruby && \
- cd ../ruby/compatibility_tests/v3.0.0 && ./test.sh"
+ bazel test //ruby/... $bazel_args --define=ruby_platform=java"
else
bash --login -c \
"rvm install $version && rvm use $version && \
which ruby && \
git clean -f && \
gem install --no-document bundler -v 1.17.3 && bundle && \
- rake test && \
- rake gc_test && \
- cd ../conformance && make ${RUBY_CONFORMANCE} && \
- cd ../ruby/compatibility_tests/v3.0.0 && \
- cp -R ../../lib lib && ./test.sh"
+ bazel test //ruby/... $bazel_args --define=ruby_platform=c"
fi
}
diff --git a/src/BUILD.bazel b/src/BUILD.bazel
new file mode 100644
index 0000000..cd6b736
--- /dev/null
+++ b/src/BUILD.bazel
@@ -0,0 +1,65 @@
+################################################################################
+# Protocol Buffers: C++ Runtime
+################################################################################
+
+# Most rules are under google/protobuf. This package exists for convenience.
+load("@rules_pkg//:mappings.bzl", "pkg_filegroup", "pkg_files", "strip_prefix")
+load("@upb//cmake:build_defs.bzl", "staleness_test")
+load("//conformance:defs.bzl", "conformance_test")
+
+pkg_files(
+ name = "dist_files",
+ srcs = glob(["**"]),
+ strip_prefix = strip_prefix.from_root(""),
+ visibility = ["//src:__pkg__"],
+)
+
+pkg_filegroup(
+ name = "all_dist_files",
+ srcs = [
+ ":dist_files",
+ "//src/google/protobuf:dist_files",
+ "//src/google/protobuf/compiler:dist_files",
+ "//src/google/protobuf/compiler/cpp:dist_files",
+ "//src/google/protobuf/compiler/csharp:dist_files",
+ "//src/google/protobuf/compiler/java:dist_files",
+ "//src/google/protobuf/compiler/objectivec:dist_files",
+ "//src/google/protobuf/compiler/php:dist_files",
+ "//src/google/protobuf/compiler/python:dist_files",
+ "//src/google/protobuf/compiler/ruby:dist_files",
+ "//src/google/protobuf/io:dist_files",
+ "//src/google/protobuf/stubs:dist_files",
+ "//src/google/protobuf/testing:dist_files",
+ "//src/google/protobuf/util:dist_files",
+ "//src/google/protobuf/util/internal:dist_files",
+ ],
+ visibility = ["//pkg:__pkg__"],
+)
+
+conformance_test(
+ name = "conformance_test",
+ failure_list = "//conformance:failure_list_cpp.txt",
+ testee = "//conformance:conformance_cpp",
+ text_format_failure_list = "//conformance:text_format_failure_list_cpp.txt",
+)
+
+# Copy the generated file_lists.cmake into a place where the staleness test
+# below can use it.
+genrule(
+ name = "copy_cmake_lists",
+ srcs = ["//pkg:gen_src_file_lists"],
+ outs = ["cmake_copy/file_lists.cmake"],
+ cmd = "cp $< $@",
+ visibility = ["//visibility:private"],
+)
+
+staleness_test(
+ name = "cmake_lists_staleness_test",
+ outs = ["file_lists.cmake"],
+ generated_pattern = "cmake_copy/%s",
+ # Only run this test if it is explicitly specified on the command line (not
+ # via //src:all or ...). This file will be automatically updated in a
+ # GitHub action, so developers should not worry about failures from this
+ # test.
+ tags = ["manual"],
+)
diff --git a/src/Makefile.am b/src/Makefile.am
deleted file mode 100644
index 0e915a4..0000000
--- a/src/Makefile.am
+++ /dev/null
@@ -1,918 +0,0 @@
-## Process this file with automake to produce Makefile.in
-
-if HAVE_ZLIB
-GZCHECKPROGRAMS = zcgzip zcgunzip
-GZHEADERS = google/protobuf/io/gzip_stream.h
-GZTESTS = google/protobuf/io/gzip_stream_unittest.sh
-ZLIB_DEF = -DHAVE_ZLIB=1
-else
-GZCHECKPROGRAMS =
-GZHEADERS =
-GZTESTS =
-ZLIB_DEF =
-endif
-
-if HAVE_PTHREAD
-PTHREAD_DEF = -DHAVE_PTHREAD=1
-else
-PTHREAD_DEF =
-endif
-
-PROTOBUF_VERSION = 32:7:0
-
-if GCC
-# Turn on all warnings except for sign comparison (we ignore sign comparison
-# in Google so our code base have tons of such warnings).
-NO_OPT_CXXFLAGS = $(PTHREAD_CFLAGS) $(PTHREAD_DEF) $(ZLIB_DEF) -Wall -Wno-sign-compare
-else
-NO_OPT_CXXFLAGS = $(PTHREAD_CFLAGS) $(PTHREAD_DEF) $(ZLIB_DEF)
-endif
-
-AM_CXXFLAGS = $(NO_OPT_CXXFLAGS) $(PROTOBUF_OPT_FLAG)
-
-AM_LDFLAGS = $(PTHREAD_CFLAGS) ${LIBLOG_LIBS}
-
-# If I say "dist_include_DATA", automake complains that $(includedir) is not
-# a "legitimate" directory for DATA. Screw you, automake.
-protodir = $(includedir)
-
-# If you are adding new files here, also remember to change the build files for
-# all other languages, //protoc-artifacts/build-zip.sh and run
-# //update_file_list.sh for bazel.
-nobase_dist_proto_DATA = \
- google/protobuf/any.proto \
- google/protobuf/api.proto \
- google/protobuf/compiler/plugin.proto \
- google/protobuf/descriptor.proto \
- google/protobuf/duration.proto \
- google/protobuf/empty.proto \
- google/protobuf/field_mask.proto \
- google/protobuf/source_context.proto \
- google/protobuf/struct.proto \
- google/protobuf/timestamp.proto \
- google/protobuf/type.proto \
- google/protobuf/wrappers.proto
-
-# Not sure why these don't get cleaned automatically.
-clean-local:
- rm -f *.loT
-
-CLEANFILES = $(protoc_outputs) unittest_proto_middleman \
- testzip.jar testzip.list testzip.proto testzip.zip \
- no_warning_test.cc
-
-MAINTAINERCLEANFILES = \
- Makefile.in
-
-nobase_include_HEADERS = \
- google/protobuf/any.h \
- google/protobuf/any.pb.h \
- google/protobuf/api.pb.h \
- google/protobuf/arena.h \
- google/protobuf/arena_impl.h \
- google/protobuf/arenastring.h \
- google/protobuf/arenaz_sampler.h \
- google/protobuf/compiler/code_generator.h \
- google/protobuf/compiler/command_line_interface.h \
- google/protobuf/compiler/cpp/cpp_generator.h \
- google/protobuf/compiler/cpp/file.h \
- google/protobuf/compiler/cpp/generator.h \
- google/protobuf/compiler/cpp/helpers.h \
- google/protobuf/compiler/cpp/names.h \
- google/protobuf/compiler/csharp/csharp_doc_comment.h \
- google/protobuf/compiler/csharp/csharp_generator.h \
- google/protobuf/compiler/csharp/csharp_names.h \
- google/protobuf/compiler/csharp/csharp_options.h \
- google/protobuf/compiler/importer.h \
- google/protobuf/compiler/java/generator.h \
- google/protobuf/compiler/java/java_generator.h \
- google/protobuf/compiler/java/kotlin_generator.h \
- google/protobuf/compiler/java/names.h \
- google/protobuf/compiler/objectivec/objectivec_generator.h \
- google/protobuf/compiler/objectivec/objectivec_helpers.h \
- google/protobuf/compiler/parser.h \
- google/protobuf/compiler/php/php_generator.h \
- google/protobuf/compiler/plugin.h \
- google/protobuf/compiler/plugin.pb.h \
- google/protobuf/compiler/python/generator.h \
- google/protobuf/compiler/python/pyi_generator.h \
- google/protobuf/compiler/python/python_generator.h \
- google/protobuf/compiler/ruby/ruby_generator.h \
- google/protobuf/descriptor.h \
- google/protobuf/descriptor.pb.h \
- google/protobuf/descriptor_database.h \
- google/protobuf/duration.pb.h \
- google/protobuf/dynamic_message.h \
- google/protobuf/empty.pb.h \
- google/protobuf/endian.h \
- google/protobuf/explicitly_constructed.h \
- google/protobuf/extension_set.h \
- google/protobuf/extension_set_inl.h \
- google/protobuf/field_access_listener.h \
- google/protobuf/field_mask.pb.h \
- google/protobuf/generated_enum_reflection.h \
- google/protobuf/generated_enum_util.h \
- google/protobuf/generated_message_bases.h \
- google/protobuf/generated_message_reflection.h \
- google/protobuf/generated_message_tctable_decl.h \
- google/protobuf/generated_message_tctable_impl.h \
- google/protobuf/generated_message_util.h \
- google/protobuf/has_bits.h \
- google/protobuf/implicit_weak_message.h \
- google/protobuf/inlined_string_field.h \
- google/protobuf/io/coded_stream.h \
- $(GZHEADERS) \
- google/protobuf/io/io_win32.h \
- google/protobuf/io/printer.h \
- google/protobuf/io/strtod.h \
- google/protobuf/io/tokenizer.h \
- google/protobuf/io/zero_copy_stream.h \
- google/protobuf/io/zero_copy_stream_impl.h \
- google/protobuf/io/zero_copy_stream_impl_lite.h \
- google/protobuf/map.h \
- google/protobuf/map_entry.h \
- google/protobuf/map_entry_lite.h \
- google/protobuf/map_field.h \
- google/protobuf/map_field_inl.h \
- google/protobuf/map_field_lite.h \
- google/protobuf/map_type_handler.h \
- google/protobuf/message.h \
- google/protobuf/message_lite.h \
- google/protobuf/metadata.h \
- google/protobuf/metadata_lite.h \
- google/protobuf/parse_context.h \
- google/protobuf/port.h \
- google/protobuf/port_def.inc \
- google/protobuf/port_undef.inc \
- google/protobuf/reflection.h \
- google/protobuf/reflection_internal.h \
- google/protobuf/reflection_ops.h \
- google/protobuf/repeated_field.h \
- google/protobuf/repeated_ptr_field.h \
- google/protobuf/service.h \
- google/protobuf/source_context.pb.h \
- google/protobuf/struct.pb.h \
- google/protobuf/stubs/bytestream.h \
- google/protobuf/stubs/callback.h \
- google/protobuf/stubs/casts.h \
- google/protobuf/stubs/common.h \
- google/protobuf/stubs/hash.h \
- google/protobuf/stubs/logging.h \
- google/protobuf/stubs/macros.h \
- google/protobuf/stubs/map_util.h \
- google/protobuf/stubs/mutex.h \
- google/protobuf/stubs/once.h \
- google/protobuf/stubs/platform_macros.h \
- google/protobuf/stubs/port.h \
- google/protobuf/stubs/status.h \
- google/protobuf/stubs/stl_util.h \
- google/protobuf/stubs/stringpiece.h \
- google/protobuf/stubs/strutil.h \
- google/protobuf/stubs/template_util.h \
- google/protobuf/text_format.h \
- google/protobuf/timestamp.pb.h \
- google/protobuf/type.pb.h \
- google/protobuf/unknown_field_set.h \
- google/protobuf/util/delimited_message_util.h \
- google/protobuf/util/field_comparator.h \
- google/protobuf/util/field_mask_util.h \
- google/protobuf/util/json_util.h \
- google/protobuf/util/message_differencer.h \
- google/protobuf/util/time_util.h \
- google/protobuf/util/type_resolver.h \
- google/protobuf/util/type_resolver_util.h \
- google/protobuf/wire_format.h \
- google/protobuf/wire_format_lite.h \
- google/protobuf/wrappers.pb.h
-
-lib_LTLIBRARIES = libprotobuf-lite.la libprotobuf.la libprotoc.la
-
-libprotobuf_lite_la_LIBADD = $(PTHREAD_LIBS) $(LIBATOMIC_LIBS)
-libprotobuf_lite_la_LDFLAGS = -version-info $(PROTOBUF_VERSION) -export-dynamic -no-undefined
-if HAVE_LD_VERSION_SCRIPT
-libprotobuf_lite_la_LDFLAGS += -Wl,--version-script=$(srcdir)/libprotobuf-lite.map
-EXTRA_libprotobuf_lite_la_DEPENDENCIES = libprotobuf-lite.map
-endif
-libprotobuf_lite_la_SOURCES = \
- google/protobuf/any_lite.cc \
- google/protobuf/arena.cc \
- google/protobuf/arenastring.cc \
- google/protobuf/arenaz_sampler.cc \
- google/protobuf/extension_set.cc \
- google/protobuf/generated_enum_util.cc \
- google/protobuf/generated_message_tctable_lite.cc \
- google/protobuf/generated_message_util.cc \
- google/protobuf/implicit_weak_message.cc \
- google/protobuf/inlined_string_field.cc \
- google/protobuf/io/coded_stream.cc \
- google/protobuf/io/io_win32.cc \
- google/protobuf/io/strtod.cc \
- google/protobuf/io/zero_copy_stream.cc \
- google/protobuf/io/zero_copy_stream_impl.cc \
- google/protobuf/io/zero_copy_stream_impl_lite.cc \
- google/protobuf/map.cc \
- google/protobuf/message_lite.cc \
- google/protobuf/parse_context.cc \
- google/protobuf/repeated_field.cc \
- google/protobuf/repeated_ptr_field.cc \
- google/protobuf/string_member_robber.h \
- google/protobuf/stubs/bytestream.cc \
- google/protobuf/stubs/common.cc \
- google/protobuf/stubs/int128.cc \
- google/protobuf/stubs/int128.h \
- google/protobuf/stubs/mathutil.h \
- google/protobuf/stubs/status.cc \
- google/protobuf/stubs/status_macros.h \
- google/protobuf/stubs/statusor.cc \
- google/protobuf/stubs/statusor.h \
- google/protobuf/stubs/stringpiece.cc \
- google/protobuf/stubs/stringprintf.cc \
- google/protobuf/stubs/stringprintf.h \
- google/protobuf/stubs/structurally_valid.cc \
- google/protobuf/stubs/strutil.cc \
- google/protobuf/stubs/time.cc \
- google/protobuf/stubs/time.h \
- google/protobuf/wire_format_lite.cc
-
-libprotobuf_la_LIBADD = $(PTHREAD_LIBS) $(LIBATOMIC_LIBS)
-libprotobuf_la_LDFLAGS = -version-info $(PROTOBUF_VERSION) -export-dynamic -no-undefined
-if HAVE_LD_VERSION_SCRIPT
-libprotobuf_la_LDFLAGS += -Wl,--version-script=$(srcdir)/libprotobuf.map
-EXTRA_libprotobuf_la_DEPENDENCIES = libprotobuf.map
-endif
-libprotobuf_la_SOURCES = \
- $(libprotobuf_lite_la_SOURCES) \
- google/protobuf/any.cc \
- google/protobuf/any.pb.cc \
- google/protobuf/api.pb.cc \
- google/protobuf/compiler/importer.cc \
- google/protobuf/compiler/parser.cc \
- google/protobuf/descriptor.cc \
- google/protobuf/descriptor.pb.cc \
- google/protobuf/descriptor_database.cc \
- google/protobuf/duration.pb.cc \
- google/protobuf/dynamic_message.cc \
- google/protobuf/empty.pb.cc \
- google/protobuf/extension_set_heavy.cc \
- google/protobuf/field_mask.pb.cc \
- google/protobuf/generated_message_bases.cc \
- google/protobuf/generated_message_reflection.cc \
- google/protobuf/generated_message_tctable_full.cc \
- google/protobuf/io/gzip_stream.cc \
- google/protobuf/io/printer.cc \
- google/protobuf/io/tokenizer.cc \
- google/protobuf/map_field.cc \
- google/protobuf/message.cc \
- google/protobuf/reflection_ops.cc \
- google/protobuf/service.cc \
- google/protobuf/source_context.pb.cc \
- google/protobuf/struct.pb.cc \
- google/protobuf/stubs/substitute.cc \
- google/protobuf/stubs/substitute.h \
- google/protobuf/text_format.cc \
- google/protobuf/timestamp.pb.cc \
- google/protobuf/type.pb.cc \
- google/protobuf/unknown_field_set.cc \
- google/protobuf/util/delimited_message_util.cc \
- google/protobuf/util/field_comparator.cc \
- google/protobuf/util/field_mask_util.cc \
- google/protobuf/util/internal/constants.h \
- google/protobuf/util/internal/datapiece.cc \
- google/protobuf/util/internal/datapiece.h \
- google/protobuf/util/internal/default_value_objectwriter.cc \
- google/protobuf/util/internal/default_value_objectwriter.h \
- google/protobuf/util/internal/error_listener.cc \
- google/protobuf/util/internal/error_listener.h \
- google/protobuf/util/internal/expecting_objectwriter.h \
- google/protobuf/util/internal/field_mask_utility.cc \
- google/protobuf/util/internal/field_mask_utility.h \
- google/protobuf/util/internal/json_escaping.cc \
- google/protobuf/util/internal/json_escaping.h \
- google/protobuf/util/internal/json_objectwriter.cc \
- google/protobuf/util/internal/json_objectwriter.h \
- google/protobuf/util/internal/json_stream_parser.cc \
- google/protobuf/util/internal/json_stream_parser.h \
- google/protobuf/util/internal/location_tracker.h \
- google/protobuf/util/internal/mock_error_listener.h \
- google/protobuf/util/internal/object_location_tracker.h \
- google/protobuf/util/internal/object_source.h \
- google/protobuf/util/internal/object_writer.cc \
- google/protobuf/util/internal/object_writer.h \
- google/protobuf/util/internal/proto_writer.cc \
- google/protobuf/util/internal/proto_writer.h \
- google/protobuf/util/internal/protostream_objectsource.cc \
- google/protobuf/util/internal/protostream_objectsource.h \
- google/protobuf/util/internal/protostream_objectwriter.cc \
- google/protobuf/util/internal/protostream_objectwriter.h \
- google/protobuf/util/internal/structured_objectwriter.h \
- google/protobuf/util/internal/type_info.cc \
- google/protobuf/util/internal/type_info.h \
- google/protobuf/util/internal/type_info_test_helper.h \
- google/protobuf/util/internal/utility.cc \
- google/protobuf/util/internal/utility.h \
- google/protobuf/util/json_util.cc \
- google/protobuf/util/message_differencer.cc \
- google/protobuf/util/time_util.cc \
- google/protobuf/util/type_resolver_util.cc \
- google/protobuf/wire_format.cc \
- google/protobuf/wrappers.pb.cc
-
-nodist_libprotobuf_la_SOURCES = $(nodist_libprotobuf_lite_la_SOURCES)
-
-libprotoc_la_LIBADD = $(PTHREAD_LIBS) libprotobuf.la
-libprotoc_la_LDFLAGS = -version-info $(PROTOBUF_VERSION) -export-dynamic -no-undefined
-if HAVE_LD_VERSION_SCRIPT
-libprotoc_la_LDFLAGS += -Wl,--version-script=$(srcdir)/libprotoc.map
-EXTRA_libprotoc_la_DEPENDENCIES = libprotoc.map
-endif
-libprotoc_la_SOURCES = \
- google/protobuf/compiler/code_generator.cc \
- google/protobuf/compiler/command_line_interface.cc \
- google/protobuf/compiler/cpp/enum.cc \
- google/protobuf/compiler/cpp/enum.h \
- google/protobuf/compiler/cpp/enum_field.cc \
- google/protobuf/compiler/cpp/enum_field.h \
- google/protobuf/compiler/cpp/extension.cc \
- google/protobuf/compiler/cpp/extension.h \
- google/protobuf/compiler/cpp/field.cc \
- google/protobuf/compiler/cpp/field.h \
- google/protobuf/compiler/cpp/file.cc \
- google/protobuf/compiler/cpp/generator.cc \
- google/protobuf/compiler/cpp/helpers.cc \
- google/protobuf/compiler/cpp/map_field.cc \
- google/protobuf/compiler/cpp/map_field.h \
- google/protobuf/compiler/cpp/message.cc \
- google/protobuf/compiler/cpp/message.h \
- google/protobuf/compiler/cpp/message_field.cc \
- google/protobuf/compiler/cpp/message_field.h \
- google/protobuf/compiler/cpp/message_layout_helper.h \
- google/protobuf/compiler/cpp/options.h \
- google/protobuf/compiler/cpp/padding_optimizer.cc \
- google/protobuf/compiler/cpp/padding_optimizer.h \
- google/protobuf/compiler/cpp/parse_function_generator.cc \
- google/protobuf/compiler/cpp/parse_function_generator.h \
- google/protobuf/compiler/cpp/primitive_field.cc \
- google/protobuf/compiler/cpp/primitive_field.h \
- google/protobuf/compiler/cpp/service.cc \
- google/protobuf/compiler/cpp/service.h \
- google/protobuf/compiler/cpp/string_field.cc \
- google/protobuf/compiler/cpp/string_field.h \
- google/protobuf/compiler/csharp/csharp_doc_comment.cc \
- google/protobuf/compiler/csharp/csharp_enum.cc \
- google/protobuf/compiler/csharp/csharp_enum.h \
- google/protobuf/compiler/csharp/csharp_enum_field.cc \
- google/protobuf/compiler/csharp/csharp_enum_field.h \
- google/protobuf/compiler/csharp/csharp_field_base.cc \
- google/protobuf/compiler/csharp/csharp_field_base.h \
- google/protobuf/compiler/csharp/csharp_generator.cc \
- google/protobuf/compiler/csharp/csharp_helpers.cc \
- google/protobuf/compiler/csharp/csharp_helpers.h \
- google/protobuf/compiler/csharp/csharp_map_field.cc \
- google/protobuf/compiler/csharp/csharp_map_field.h \
- google/protobuf/compiler/csharp/csharp_message.cc \
- google/protobuf/compiler/csharp/csharp_message.h \
- google/protobuf/compiler/csharp/csharp_message_field.cc \
- google/protobuf/compiler/csharp/csharp_message_field.h \
- google/protobuf/compiler/csharp/csharp_primitive_field.cc \
- google/protobuf/compiler/csharp/csharp_primitive_field.h \
- google/protobuf/compiler/csharp/csharp_reflection_class.cc \
- google/protobuf/compiler/csharp/csharp_reflection_class.h \
- google/protobuf/compiler/csharp/csharp_repeated_enum_field.cc \
- google/protobuf/compiler/csharp/csharp_repeated_enum_field.h \
- google/protobuf/compiler/csharp/csharp_repeated_message_field.cc \
- google/protobuf/compiler/csharp/csharp_repeated_message_field.h \
- google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc \
- google/protobuf/compiler/csharp/csharp_repeated_primitive_field.h \
- google/protobuf/compiler/csharp/csharp_source_generator_base.cc \
- google/protobuf/compiler/csharp/csharp_source_generator_base.h \
- google/protobuf/compiler/csharp/csharp_wrapper_field.cc \
- google/protobuf/compiler/csharp/csharp_wrapper_field.h \
- google/protobuf/compiler/java/context.cc \
- google/protobuf/compiler/java/context.h \
- google/protobuf/compiler/java/doc_comment.cc \
- google/protobuf/compiler/java/doc_comment.h \
- google/protobuf/compiler/java/enum.cc \
- google/protobuf/compiler/java/enum.h \
- google/protobuf/compiler/java/enum_field.cc \
- google/protobuf/compiler/java/enum_field.h \
- google/protobuf/compiler/java/enum_field_lite.cc \
- google/protobuf/compiler/java/enum_field_lite.h \
- google/protobuf/compiler/java/enum_lite.cc \
- google/protobuf/compiler/java/enum_lite.h \
- google/protobuf/compiler/java/extension.cc \
- google/protobuf/compiler/java/extension.h \
- google/protobuf/compiler/java/extension_lite.cc \
- google/protobuf/compiler/java/extension_lite.h \
- google/protobuf/compiler/java/field.cc \
- google/protobuf/compiler/java/field.h \
- google/protobuf/compiler/java/file.cc \
- google/protobuf/compiler/java/file.h \
- google/protobuf/compiler/java/generator.cc \
- google/protobuf/compiler/java/generator_factory.cc \
- google/protobuf/compiler/java/generator_factory.h \
- google/protobuf/compiler/java/helpers.cc \
- google/protobuf/compiler/java/helpers.h \
- google/protobuf/compiler/java/kotlin_generator.cc \
- google/protobuf/compiler/java/map_field.cc \
- google/protobuf/compiler/java/map_field.h \
- google/protobuf/compiler/java/map_field_lite.cc \
- google/protobuf/compiler/java/map_field_lite.h \
- google/protobuf/compiler/java/message.cc \
- google/protobuf/compiler/java/message.h \
- google/protobuf/compiler/java/message_builder.cc \
- google/protobuf/compiler/java/message_builder.h \
- google/protobuf/compiler/java/message_builder_lite.cc \
- google/protobuf/compiler/java/message_builder_lite.h \
- google/protobuf/compiler/java/message_field.cc \
- google/protobuf/compiler/java/message_field.h \
- google/protobuf/compiler/java/message_field_lite.cc \
- google/protobuf/compiler/java/message_field_lite.h \
- google/protobuf/compiler/java/message_lite.cc \
- google/protobuf/compiler/java/message_lite.h \
- google/protobuf/compiler/java/name_resolver.cc \
- google/protobuf/compiler/java/name_resolver.h \
- google/protobuf/compiler/java/options.h \
- google/protobuf/compiler/java/primitive_field.cc \
- google/protobuf/compiler/java/primitive_field.h \
- google/protobuf/compiler/java/primitive_field_lite.cc \
- google/protobuf/compiler/java/primitive_field_lite.h \
- google/protobuf/compiler/java/service.cc \
- google/protobuf/compiler/java/service.h \
- google/protobuf/compiler/java/shared_code_generator.cc \
- google/protobuf/compiler/java/shared_code_generator.h \
- google/protobuf/compiler/java/string_field.cc \
- google/protobuf/compiler/java/string_field.h \
- google/protobuf/compiler/java/string_field_lite.cc \
- google/protobuf/compiler/java/string_field_lite.h \
- google/protobuf/compiler/objectivec/objectivec_enum.cc \
- google/protobuf/compiler/objectivec/objectivec_enum.h \
- google/protobuf/compiler/objectivec/objectivec_enum_field.cc \
- google/protobuf/compiler/objectivec/objectivec_enum_field.h \
- google/protobuf/compiler/objectivec/objectivec_extension.cc \
- google/protobuf/compiler/objectivec/objectivec_extension.h \
- google/protobuf/compiler/objectivec/objectivec_field.cc \
- google/protobuf/compiler/objectivec/objectivec_field.h \
- google/protobuf/compiler/objectivec/objectivec_file.cc \
- google/protobuf/compiler/objectivec/objectivec_file.h \
- google/protobuf/compiler/objectivec/objectivec_generator.cc \
- google/protobuf/compiler/objectivec/objectivec_helpers.cc \
- google/protobuf/compiler/objectivec/objectivec_map_field.cc \
- google/protobuf/compiler/objectivec/objectivec_map_field.h \
- google/protobuf/compiler/objectivec/objectivec_message.cc \
- google/protobuf/compiler/objectivec/objectivec_message.h \
- google/protobuf/compiler/objectivec/objectivec_message_field.cc \
- google/protobuf/compiler/objectivec/objectivec_message_field.h \
- google/protobuf/compiler/objectivec/objectivec_nsobject_methods.h \
- google/protobuf/compiler/objectivec/objectivec_oneof.cc \
- google/protobuf/compiler/objectivec/objectivec_oneof.h \
- google/protobuf/compiler/objectivec/objectivec_primitive_field.cc \
- google/protobuf/compiler/objectivec/objectivec_primitive_field.h \
- google/protobuf/compiler/php/php_generator.cc \
- google/protobuf/compiler/plugin.cc \
- google/protobuf/compiler/plugin.pb.cc \
- google/protobuf/compiler/python/generator.cc \
- google/protobuf/compiler/python/helpers.cc \
- google/protobuf/compiler/python/helpers.h \
- google/protobuf/compiler/python/pyi_generator.cc \
- google/protobuf/compiler/ruby/ruby_generator.cc \
- google/protobuf/compiler/scc.h \
- google/protobuf/compiler/subprocess.cc \
- google/protobuf/compiler/subprocess.h \
- google/protobuf/compiler/zip_writer.cc \
- google/protobuf/compiler/zip_writer.h
-
-bin_PROGRAMS = protoc
-protoc_LDADD = $(PTHREAD_LIBS) libprotobuf.la libprotoc.la
-protoc_SOURCES = google/protobuf/compiler/main.cc
-
-# Tests ==============================================================
-
-protoc_inputs = \
- google/protobuf/any_test.proto \
- google/protobuf/compiler/cpp/test_bad_identifiers.proto \
- google/protobuf/compiler/cpp/test_large_enum_value.proto \
- google/protobuf/map_lite_unittest.proto \
- google/protobuf/map_proto2_unittest.proto \
- google/protobuf/map_unittest.proto \
- google/protobuf/unittest.proto \
- google/protobuf/unittest_arena.proto \
- google/protobuf/unittest_custom_options.proto \
- google/protobuf/unittest_drop_unknown_fields.proto \
- google/protobuf/unittest_embed_optimize_for.proto \
- google/protobuf/unittest_empty.proto \
- google/protobuf/unittest_enormous_descriptor.proto \
- google/protobuf/unittest_import.proto \
- google/protobuf/unittest_import_lite.proto \
- google/protobuf/unittest_import_public.proto \
- google/protobuf/unittest_import_public_lite.proto \
- google/protobuf/unittest_lazy_dependencies.proto \
- google/protobuf/unittest_lazy_dependencies_custom_option.proto \
- google/protobuf/unittest_lazy_dependencies_enum.proto \
- google/protobuf/unittest_lite.proto \
- google/protobuf/unittest_lite_imports_nonlite.proto \
- google/protobuf/unittest_mset.proto \
- google/protobuf/unittest_mset_wire_format.proto \
- google/protobuf/unittest_no_field_presence.proto \
- google/protobuf/unittest_no_generic_services.proto \
- google/protobuf/unittest_optimize_for.proto \
- google/protobuf/unittest_preserve_unknown_enum.proto \
- google/protobuf/unittest_preserve_unknown_enum2.proto \
- google/protobuf/unittest_proto3.proto \
- google/protobuf/unittest_proto3_arena.proto \
- google/protobuf/unittest_proto3_arena_lite.proto \
- google/protobuf/unittest_proto3_lite.proto \
- google/protobuf/unittest_proto3_optional.proto \
- google/protobuf/unittest_well_known_types.proto \
- google/protobuf/util/internal/testdata/anys.proto \
- google/protobuf/util/internal/testdata/books.proto \
- google/protobuf/util/internal/testdata/default_value.proto \
- google/protobuf/util/internal/testdata/default_value_test.proto \
- google/protobuf/util/internal/testdata/field_mask.proto \
- google/protobuf/util/internal/testdata/maps.proto \
- google/protobuf/util/internal/testdata/oneofs.proto \
- google/protobuf/util/internal/testdata/proto3.proto \
- google/protobuf/util/internal/testdata/struct.proto \
- google/protobuf/util/internal/testdata/timestamp_duration.proto \
- google/protobuf/util/internal/testdata/wrappers.proto \
- google/protobuf/util/json_format.proto \
- google/protobuf/util/json_format_proto3.proto \
- google/protobuf/util/message_differencer_unittest.proto
-
-EXTRA_DIST = \
- $(protoc_inputs) \
- README.md \
- google/protobuf/compiler/package_info.h \
- google/protobuf/compiler/ruby/ruby_generated_code.proto \
- google/protobuf/compiler/ruby/ruby_generated_code_pb.rb \
- google/protobuf/compiler/ruby/ruby_generated_code_proto2.proto \
- google/protobuf/compiler/ruby/ruby_generated_code_proto2_import.proto \
- google/protobuf/compiler/ruby/ruby_generated_code_proto2_pb.rb \
- google/protobuf/compiler/ruby/ruby_generated_pkg_explicit.proto \
- google/protobuf/compiler/ruby/ruby_generated_pkg_explicit_legacy.proto \
- google/protobuf/compiler/ruby/ruby_generated_pkg_explicit_legacy_pb.rb \
- google/protobuf/compiler/ruby/ruby_generated_pkg_explicit_pb.rb \
- google/protobuf/compiler/ruby/ruby_generated_pkg_implicit.proto \
- google/protobuf/compiler/ruby/ruby_generated_pkg_implicit_pb.rb \
- google/protobuf/compiler/zip_output_unittest.sh \
- google/protobuf/io/gzip_stream.h \
- google/protobuf/io/gzip_stream_unittest.sh \
- google/protobuf/io/package_info.h \
- google/protobuf/package_info.h \
- google/protobuf/test_messages_proto2.proto \
- google/protobuf/test_messages_proto3.proto \
- google/protobuf/testdata/bad_utf8_string \
- google/protobuf/testdata/golden_message \
- google/protobuf/testdata/golden_message_maps \
- google/protobuf/testdata/golden_message_oneof_implemented \
- google/protobuf/testdata/golden_message_proto3 \
- google/protobuf/testdata/golden_packed_fields_message \
- google/protobuf/testdata/map_test_data.txt \
- google/protobuf/testdata/text_format_unittest_data.txt \
- google/protobuf/testdata/text_format_unittest_data_oneof_implemented.txt \
- google/protobuf/testdata/text_format_unittest_data_pointy.txt \
- google/protobuf/testdata/text_format_unittest_data_pointy_oneof.txt \
- google/protobuf/testdata/text_format_unittest_extensions_data.txt \
- google/protobuf/testdata/text_format_unittest_extensions_data_pointy.txt \
- google/protobuf/util/package_info.h \
- libprotobuf-lite.map \
- libprotobuf.map \
- libprotoc.map \
- solaris/libstdc++.la
-
-protoc_lite_outputs = \
- google/protobuf/map_lite_unittest.pb.cc \
- google/protobuf/map_lite_unittest.pb.h \
- google/protobuf/unittest_import_lite.pb.cc \
- google/protobuf/unittest_import_lite.pb.h \
- google/protobuf/unittest_import_public_lite.pb.cc \
- google/protobuf/unittest_import_public_lite.pb.h \
- google/protobuf/unittest_lite.pb.cc \
- google/protobuf/unittest_lite.pb.h
-
-protoc_outputs = \
- $(protoc_lite_outputs) \
- google/protobuf/any_test.pb.cc \
- google/protobuf/any_test.pb.h \
- google/protobuf/compiler/cpp/test_bad_identifiers.pb.cc \
- google/protobuf/compiler/cpp/test_bad_identifiers.pb.h \
- google/protobuf/compiler/cpp/test_large_enum_value.pb.cc \
- google/protobuf/compiler/cpp/test_large_enum_value.pb.h \
- google/protobuf/map_proto2_unittest.pb.cc \
- google/protobuf/map_proto2_unittest.pb.h \
- google/protobuf/map_unittest.pb.cc \
- google/protobuf/map_unittest.pb.h \
- google/protobuf/unittest.pb.cc \
- google/protobuf/unittest.pb.h \
- google/protobuf/unittest_arena.pb.cc \
- google/protobuf/unittest_arena.pb.h \
- google/protobuf/unittest_custom_options.pb.cc \
- google/protobuf/unittest_custom_options.pb.h \
- google/protobuf/unittest_drop_unknown_fields.pb.cc \
- google/protobuf/unittest_drop_unknown_fields.pb.h \
- google/protobuf/unittest_embed_optimize_for.pb.cc \
- google/protobuf/unittest_embed_optimize_for.pb.h \
- google/protobuf/unittest_empty.pb.cc \
- google/protobuf/unittest_empty.pb.h \
- google/protobuf/unittest_enormous_descriptor.pb.cc \
- google/protobuf/unittest_enormous_descriptor.pb.h \
- google/protobuf/unittest_import.pb.cc \
- google/protobuf/unittest_import.pb.h \
- google/protobuf/unittest_import_public.pb.cc \
- google/protobuf/unittest_import_public.pb.h \
- google/protobuf/unittest_lazy_dependencies.pb.cc \
- google/protobuf/unittest_lazy_dependencies.pb.h \
- google/protobuf/unittest_lazy_dependencies_custom_option.pb.cc \
- google/protobuf/unittest_lazy_dependencies_custom_option.pb.h \
- google/protobuf/unittest_lazy_dependencies_enum.pb.cc \
- google/protobuf/unittest_lazy_dependencies_enum.pb.h \
- google/protobuf/unittest_lite_imports_nonlite.pb.cc \
- google/protobuf/unittest_lite_imports_nonlite.pb.h \
- google/protobuf/unittest_mset.pb.cc \
- google/protobuf/unittest_mset.pb.h \
- google/protobuf/unittest_mset_wire_format.pb.cc \
- google/protobuf/unittest_mset_wire_format.pb.h \
- google/protobuf/unittest_no_field_presence.pb.cc \
- google/protobuf/unittest_no_field_presence.pb.h \
- google/protobuf/unittest_no_generic_services.pb.cc \
- google/protobuf/unittest_no_generic_services.pb.h \
- google/protobuf/unittest_optimize_for.pb.cc \
- google/protobuf/unittest_optimize_for.pb.h \
- google/protobuf/unittest_preserve_unknown_enum.pb.cc \
- google/protobuf/unittest_preserve_unknown_enum.pb.h \
- google/protobuf/unittest_preserve_unknown_enum2.pb.cc \
- google/protobuf/unittest_preserve_unknown_enum2.pb.h \
- google/protobuf/unittest_proto3.pb.cc \
- google/protobuf/unittest_proto3.pb.h \
- google/protobuf/unittest_proto3_arena.pb.cc \
- google/protobuf/unittest_proto3_arena.pb.h \
- google/protobuf/unittest_proto3_arena_lite.pb.cc \
- google/protobuf/unittest_proto3_arena_lite.pb.h \
- google/protobuf/unittest_proto3_lite.pb.cc \
- google/protobuf/unittest_proto3_lite.pb.h \
- google/protobuf/unittest_proto3_optional.pb.cc \
- google/protobuf/unittest_proto3_optional.pb.h \
- google/protobuf/unittest_well_known_types.pb.cc \
- google/protobuf/unittest_well_known_types.pb.h \
- google/protobuf/util/internal/testdata/anys.pb.cc \
- google/protobuf/util/internal/testdata/anys.pb.h \
- google/protobuf/util/internal/testdata/books.pb.cc \
- google/protobuf/util/internal/testdata/books.pb.h \
- google/protobuf/util/internal/testdata/default_value.pb.cc \
- google/protobuf/util/internal/testdata/default_value.pb.h \
- google/protobuf/util/internal/testdata/default_value_test.pb.cc \
- google/protobuf/util/internal/testdata/default_value_test.pb.h \
- google/protobuf/util/internal/testdata/field_mask.pb.cc \
- google/protobuf/util/internal/testdata/field_mask.pb.h \
- google/protobuf/util/internal/testdata/maps.pb.cc \
- google/protobuf/util/internal/testdata/maps.pb.h \
- google/protobuf/util/internal/testdata/oneofs.pb.cc \
- google/protobuf/util/internal/testdata/oneofs.pb.h \
- google/protobuf/util/internal/testdata/proto3.pb.cc \
- google/protobuf/util/internal/testdata/proto3.pb.h \
- google/protobuf/util/internal/testdata/struct.pb.cc \
- google/protobuf/util/internal/testdata/struct.pb.h \
- google/protobuf/util/internal/testdata/timestamp_duration.pb.cc \
- google/protobuf/util/internal/testdata/timestamp_duration.pb.h \
- google/protobuf/util/internal/testdata/wrappers.pb.cc \
- google/protobuf/util/internal/testdata/wrappers.pb.h \
- google/protobuf/util/json_format.pb.cc \
- google/protobuf/util/json_format.pb.h \
- google/protobuf/util/json_format_proto3.pb.cc \
- google/protobuf/util/json_format_proto3.pb.h \
- google/protobuf/util/message_differencer_unittest.pb.cc \
- google/protobuf/util/message_differencer_unittest.pb.h
-
-if USE_EXTERNAL_PROTOC
-
-unittest_proto_middleman: $(protoc_inputs)
- $(PROTOC) -I$(srcdir) --cpp_out=. $^
- touch unittest_proto_middleman
-
-else
-
-# We have to cd to $(srcdir) before executing protoc because $(protoc_inputs) is
-# relative to srcdir, which may not be the same as the current directory when
-# building out-of-tree.
-unittest_proto_middleman: protoc$(EXEEXT) $(protoc_inputs)
- oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/protoc$(EXEEXT) -I. --cpp_out=$$oldpwd $(protoc_inputs) --experimental_allow_proto3_optional )
- touch unittest_proto_middleman
-
-endif
-
-$(protoc_outputs): unittest_proto_middleman
-
-COMMON_TEST_SOURCES = \
- $(COMMON_LITE_TEST_SOURCES) \
- google/protobuf/compiler/cpp/unittest.h \
- google/protobuf/map_test_util.h \
- google/protobuf/map_test_util.inc \
- google/protobuf/reflection_tester.cc \
- google/protobuf/reflection_tester.h \
- google/protobuf/test_util.cc \
- google/protobuf/test_util.h \
- google/protobuf/test_util.inc \
- google/protobuf/test_util2.h \
- google/protobuf/testing/file.cc \
- google/protobuf/testing/file.h \
- google/protobuf/testing/googletest.cc \
- google/protobuf/testing/googletest.h
-
-GOOGLETEST_BUILD_DIR=../third_party/googletest/googletest
-GOOGLEMOCK_BUILD_DIR=../third_party/googletest/googlemock
-GOOGLETEST_SRC_DIR=$(srcdir)/../third_party/googletest/googletest
-GOOGLEMOCK_SRC_DIR=$(srcdir)/../third_party/googletest/googlemock
-check_PROGRAMS = protoc protobuf-test protobuf-lazy-descriptor-test \
- protobuf-lite-test test_plugin protobuf-lite-arena-test \
- no-warning-test $(GZCHECKPROGRAMS)
-protobuf_test_LDADD = $(PTHREAD_LIBS) libprotobuf.la libprotoc.la \
- $(GOOGLETEST_BUILD_DIR)/lib/libgtest.la \
- $(GOOGLEMOCK_BUILD_DIR)/lib/libgmock.la \
- $(GOOGLEMOCK_BUILD_DIR)/lib/libgmock_main.la
-protobuf_test_CPPFLAGS = -I$(GOOGLETEST_SRC_DIR)/include \
- -I$(GOOGLEMOCK_SRC_DIR)/include
-# Disable optimization for tests unless the user explicitly asked for it,
-# since test_util.cc takes forever to compile with optimization (with GCC).
-# See configure.ac for more info.
-protobuf_test_CXXFLAGS = $(NO_OPT_CXXFLAGS)
-protobuf_test_SOURCES = \
- $(COMMON_TEST_SOURCES) \
- google/protobuf/any_test.cc \
- google/protobuf/arena_unittest.cc \
- google/protobuf/arenastring_unittest.cc \
- google/protobuf/arenaz_sampler_test.cc \
- google/protobuf/compiler/annotation_test_util.cc \
- google/protobuf/compiler/annotation_test_util.h \
- google/protobuf/compiler/command_line_interface_unittest.cc \
- google/protobuf/compiler/cpp/bootstrap_unittest.cc \
- google/protobuf/compiler/cpp/message_size_unittest.cc \
- google/protobuf/compiler/cpp/metadata_test.cc \
- google/protobuf/compiler/cpp/move_unittest.cc \
- google/protobuf/compiler/cpp/plugin_unittest.cc \
- google/protobuf/compiler/cpp/unittest.cc \
- google/protobuf/compiler/cpp/unittest.inc \
- google/protobuf/compiler/csharp/csharp_bootstrap_unittest.cc \
- google/protobuf/compiler/csharp/csharp_generator_unittest.cc \
- google/protobuf/compiler/importer_unittest.cc \
- google/protobuf/compiler/java/doc_comment_unittest.cc \
- google/protobuf/compiler/java/plugin_unittest.cc \
- google/protobuf/compiler/mock_code_generator.cc \
- google/protobuf/compiler/mock_code_generator.h \
- google/protobuf/compiler/objectivec/objectivec_helpers_unittest.cc \
- google/protobuf/compiler/parser_unittest.cc \
- google/protobuf/compiler/python/plugin_unittest.cc \
- google/protobuf/compiler/ruby/ruby_generator_unittest.cc \
- google/protobuf/descriptor_database_unittest.cc \
- google/protobuf/descriptor_unittest.cc \
- google/protobuf/drop_unknown_fields_test.cc \
- google/protobuf/dynamic_message_unittest.cc \
- google/protobuf/extension_set_unittest.cc \
- google/protobuf/generated_message_reflection_unittest.cc \
- google/protobuf/generated_message_tctable_lite_test.cc \
- google/protobuf/inlined_string_field_unittest.cc \
- google/protobuf/io/coded_stream_unittest.cc \
- google/protobuf/io/io_win32_unittest.cc \
- google/protobuf/io/printer_unittest.cc \
- google/protobuf/io/tokenizer_unittest.cc \
- google/protobuf/io/zero_copy_stream_unittest.cc \
- google/protobuf/map_field_test.cc \
- google/protobuf/map_test.cc \
- google/protobuf/map_test.inc \
- google/protobuf/message_unittest.cc \
- google/protobuf/message_unittest.inc \
- google/protobuf/no_field_presence_test.cc \
- google/protobuf/preserve_unknown_enum_test.cc \
- google/protobuf/proto3_arena_lite_unittest.cc \
- google/protobuf/proto3_arena_unittest.cc \
- google/protobuf/proto3_lite_unittest.cc \
- google/protobuf/proto3_lite_unittest.inc \
- google/protobuf/reflection_ops_unittest.cc \
- google/protobuf/repeated_field_reflection_unittest.cc \
- google/protobuf/repeated_field_unittest.cc \
- google/protobuf/stubs/bytestream_unittest.cc \
- google/protobuf/stubs/common_unittest.cc \
- google/protobuf/stubs/int128_unittest.cc \
- google/protobuf/stubs/status_test.cc \
- google/protobuf/stubs/statusor_test.cc \
- google/protobuf/stubs/stringpiece_unittest.cc \
- google/protobuf/stubs/stringprintf_unittest.cc \
- google/protobuf/stubs/structurally_valid_unittest.cc \
- google/protobuf/stubs/strutil_unittest.cc \
- google/protobuf/stubs/template_util_unittest.cc \
- google/protobuf/stubs/time_test.cc \
- google/protobuf/text_format_unittest.cc \
- google/protobuf/unknown_field_set_unittest.cc \
- google/protobuf/util/delimited_message_util_test.cc \
- google/protobuf/util/field_comparator_test.cc \
- google/protobuf/util/field_mask_util_test.cc \
- google/protobuf/util/internal/default_value_objectwriter_test.cc \
- google/protobuf/util/internal/json_objectwriter_test.cc \
- google/protobuf/util/internal/json_stream_parser_test.cc \
- google/protobuf/util/internal/protostream_objectsource_test.cc \
- google/protobuf/util/internal/protostream_objectwriter_test.cc \
- google/protobuf/util/internal/type_info_test_helper.cc \
- google/protobuf/util/json_util_test.cc \
- google/protobuf/util/message_differencer_unittest.cc \
- google/protobuf/util/time_util_test.cc \
- google/protobuf/util/type_resolver_util_test.cc \
- google/protobuf/well_known_types_unittest.cc \
- google/protobuf/wire_format_unittest.cc \
- google/protobuf/wire_format_unittest.inc
-
-nodist_protobuf_test_SOURCES = $(protoc_outputs)
-$(am_protobuf_test_OBJECTS): unittest_proto_middleman
-
-# Run cpp_unittest again with PROTOBUF_TEST_NO_DESCRIPTORS defined.
-protobuf_lazy_descriptor_test_LDADD = $(PTHREAD_LIBS) libprotobuf.la \
- libprotoc.la \
- $(GOOGLETEST_BUILD_DIR)/lib/libgtest.la \
- $(GOOGLEMOCK_BUILD_DIR)/lib/libgmock.la \
- $(GOOGLEMOCK_BUILD_DIR)/lib/libgmock_main.la
-protobuf_lazy_descriptor_test_CPPFLAGS = -I$(GOOGLEMOCK_SRC_DIR)/include \
- -I$(GOOGLETEST_SRC_DIR)/include \
- -DPROTOBUF_TEST_NO_DESCRIPTORS
-protobuf_lazy_descriptor_test_CXXFLAGS = $(NO_OPT_CXXFLAGS)
-protobuf_lazy_descriptor_test_SOURCES = \
- google/protobuf/compiler/cpp/unittest.cc \
- $(COMMON_TEST_SOURCES)
-nodist_protobuf_lazy_descriptor_test_SOURCES = $(protoc_outputs)
-$(am_protobuf_lazy_descriptor_test_OBJECTS): unittest_proto_middleman
-
-COMMON_LITE_TEST_SOURCES = \
- google/protobuf/arena_test_util.cc \
- google/protobuf/arena_test_util.h \
- google/protobuf/map_lite_test_util.cc \
- google/protobuf/map_lite_test_util.h \
- google/protobuf/map_test_util_impl.h \
- google/protobuf/test_util_lite.cc \
- google/protobuf/test_util_lite.h
-
-# Build lite_unittest separately, since it doesn't use gtest. It can't
-# depend on gtest because our internal version of gtest depend on proto
-# full runtime and we want to make sure this test builds without full
-# runtime.
-protobuf_lite_test_LDADD = $(PTHREAD_LIBS) libprotobuf-lite.la \
- $(GOOGLETEST_BUILD_DIR)/lib/libgtest.la \
- $(GOOGLEMOCK_BUILD_DIR)/lib/libgmock.la \
- $(GOOGLEMOCK_BUILD_DIR)/lib/libgmock_main.la
-protobuf_lite_test_CPPFLAGS= -I$(GOOGLEMOCK_SRC_DIR)/include \
- -I$(GOOGLETEST_SRC_DIR)/include
-protobuf_lite_test_CXXFLAGS = $(NO_OPT_CXXFLAGS)
-protobuf_lite_test_SOURCES = \
- google/protobuf/lite_unittest.cc \
- $(COMMON_LITE_TEST_SOURCES)
-nodist_protobuf_lite_test_SOURCES = $(protoc_lite_outputs)
-$(am_protobuf_lite_test_OBJECTS): unittest_proto_middleman
-
-# lite_arena_unittest depends on gtest because teboring@ found that without
-# gtest when building the test internally our memory sanitizer doesn't detect
-# memory leaks (don't know why).
-protobuf_lite_arena_test_LDADD = $(PTHREAD_LIBS) libprotobuf-lite.la \
- $(GOOGLETEST_BUILD_DIR)/lib/libgtest.la \
- $(GOOGLEMOCK_BUILD_DIR)/lib/libgmock.la \
- $(GOOGLEMOCK_BUILD_DIR)/lib/libgmock_main.la
-protobuf_lite_arena_test_CPPFLAGS = -I$(GOOGLEMOCK_SRC_DIR)/include \
- -I$(GOOGLETEST_SRC_DIR)/include
-protobuf_lite_arena_test_CXXFLAGS = $(NO_OPT_CXXFLAGS)
-protobuf_lite_arena_test_SOURCES = \
- google/protobuf/lite_arena_unittest.cc \
- $(COMMON_LITE_TEST_SOURCES)
-nodist_protobuf_lite_arena_test_SOURCES = $(protoc_lite_outputs)
-$(am_protobuf_lite_arena_test_OBJECTS): unittest_proto_middleman
-
-# Test plugin binary.
-test_plugin_LDADD = $(PTHREAD_LIBS) libprotobuf.la libprotoc.la \
- $(GOOGLETEST_BUILD_DIR)/lib/libgtest.la
-test_plugin_CPPFLAGS = -I$(GOOGLETEST_SRC_DIR)/include
-test_plugin_SOURCES = \
- google/protobuf/compiler/mock_code_generator.cc \
- google/protobuf/compiler/test_plugin.cc \
- google/protobuf/testing/file.cc \
- google/protobuf/testing/file.h
-
-if HAVE_ZLIB
-zcgzip_LDADD = $(PTHREAD_LIBS) libprotobuf.la
-zcgzip_SOURCES = google/protobuf/testing/zcgzip.cc
-
-zcgunzip_LDADD = $(PTHREAD_LIBS) libprotobuf.la
-zcgunzip_SOURCES = google/protobuf/testing/zcgunzip.cc
-endif
-
-# This test target is to ensure all our public header files and generated
-# code is free from warnings. We have to be more pedantic about these
-# files because they are compiled by users with different compiler flags.
-no_warning_test.cc:
- echo "// Generated from Makefile.am" > no_warning_test.cc
- for FILE in $(nobase_include_HEADERS); do \
- case $$FILE in *.inc) continue;; esac; \
- echo "#include <$${FILE}>" >> no_warning_test.cc; \
- done
- echo "int main(int, char**) { return 0; }" >> no_warning_test.cc
-
-no_warning_test_LDADD = $(PTHREAD_LIBS) libprotobuf.la libprotoc.la
-no_warning_test_CXXFLAGS = $(PTHREAD_CFLAGS) $(PTHREAD_DEF) $(ZLIB_DEF) \
- -Wall -Wextra -Werror -Wno-unused-parameter
-nodist_no_warning_test_SOURCES = no_warning_test.cc $(protoc_outputs)
-
-TESTS = protobuf-test protobuf-lazy-descriptor-test protobuf-lite-test \
- google/protobuf/compiler/zip_output_unittest.sh $(GZTESTS) \
- protobuf-lite-arena-test no-warning-test
diff --git a/src/README.md b/src/README.md
index cf843d7..b28b0f0 100644
--- a/src/README.md
+++ b/src/README.md
@@ -5,26 +5,31 @@
https://developers.google.com/protocol-buffers/
-C++ Installation - Unix
+CMake Installation
+-----------------------
+
+To compile or install protobuf from source using CMake, see
+[cmake/README.md](../cmake/README.md).
+
+C++ Protobuf - Unix
-----------------------
To build protobuf from source, the following tools are needed:
- * autoconf
- * automake
- * libtool
- * make
+ * bazel
+ * git
* g++
- * unzip
-On Ubuntu/Debian, you can install them with:
+On Ubuntu/Debian, for example, you can install them with:
- sudo apt-get install autoconf automake libtool curl make g++ unzip
+ sudo apt-get install g++ git bazel
On other platforms, please use the corresponding package managing tool to
-install them before proceeding.
+install them before proceeding. See https://bazel.build/install for further
+instructions on installing Bazel, or to build from source using CMake, see
+[cmake/README.md](../cmake/README.md).
-To get the source, download one of the release .tar.gz or .zip packages in the
+To get the source, download the release .tar.gz or .zip package in the
release page:
https://github.com/protocolbuffers/protobuf/releases/latest
@@ -41,79 +46,23 @@
git clone https://github.com/protocolbuffers/protobuf.git
cd protobuf
git submodule update --init --recursive
- ./autogen.sh
-To build and install the C++ Protocol Buffer runtime and the Protocol
-Buffer compiler (protoc) execute the following:
+To build the C++ Protocol Buffer runtime and the Protocol Buffer compiler
+(protoc) execute the following:
+ bazel build :protoc :protobuf
- ./configure
- make -j$(nproc) # $(nproc) ensures it uses all cores for compilation
- make check
- sudo make install
- sudo ldconfig # refresh shared library cache.
+The compiler can then be installed, for example on Linux:
-If "make check" fails, you can still install, but it is likely that
-some features of this library will not work correctly on your system.
-Proceed at your own risk.
+ cp bazel-bin/protoc /usr/local/bin
-For advanced usage information on configure and make, please refer to the
-autoconf documentation:
-
- http://www.gnu.org/software/autoconf/manual/autoconf.html#Running-configure-Scripts
-
-**Hint on install location**
-
-By default, the package will be installed to /usr/local. However,
-on many platforms, /usr/local/lib is not part of LD_LIBRARY_PATH.
-You can add it, but it may be easier to just install to /usr
-instead. To do this, invoke configure as follows:
-
- ./configure --prefix=/usr
-
-If you already built the package with a different prefix, make sure
-to run "make clean" before building again.
+For more usage information on Bazel, please refer to http://bazel.build.
**Compiling dependent packages**
-To compile a package that uses Protocol Buffers, you need to pass
-various flags to your compiler and linker. As of version 2.2.0,
-Protocol Buffers integrates with pkg-config to manage this. If you
-have pkg-config installed, then you can invoke it to get a list of
-flags like so:
-
-
- pkg-config --cflags protobuf # print compiler flags
- pkg-config --libs protobuf # print linker flags
- pkg-config --cflags --libs protobuf # print both
-
-
-For example:
-
- c++ my_program.cc my_proto.pb.cc `pkg-config --cflags --libs protobuf`
-
-Note that packages written prior to the 2.2.0 release of Protocol
-Buffers may not yet integrate with pkg-config to get flags, and may
-not pass the correct set of flags to correctly link against
-libprotobuf. If the package in question uses autoconf, you can
-often fix the problem by invoking its configure script like:
-
-
- configure CXXFLAGS="$(pkg-config --cflags protobuf)" \
- LIBS="$(pkg-config --libs protobuf)"
-
-This will force it to use the correct flags.
-
-If you are writing an autoconf-based package that uses Protocol
-Buffers, you should probably use the PKG_CHECK_MODULES macro in your
-configure script like:
-
- PKG_CHECK_MODULES([protobuf], [protobuf])
-
-See the pkg-config man page for more info.
-
-If you only want protobuf-lite, substitute "protobuf-lite" in place
-of "protobuf" in these examples.
+To compile a package that uses Protocol Buffers, you need to setup a Bazel
+WORKSPACE that's hooked up to the protobuf repository and loads its
+dependencies. For an example, see [WORKSPACE](../examples/WORKSPACE).
**Note for Mac users**
@@ -127,64 +76,16 @@
https://www.macports.org . This will reside in /opt/local/bin/port for most
Mac installations.
- sudo /opt/local/bin/port install autoconf automake libtool
+ sudo /opt/local/bin/port install bazel
Alternative for Homebrew users:
- brew install autoconf automake libtool
+ brew install bazel
Then follow the Unix instructions above.
-**Note for cross-compiling**
-The makefiles normally invoke the protoc executable that they just
-built in order to build tests. When cross-compiling, the protoc
-executable may not be executable on the host machine. In this case,
-you must build a copy of protoc for the host machine first, then use
-the --with-protoc option to tell configure to use it instead. For
-example:
-
- ./configure --with-protoc=protoc
-
-This will use the installed protoc (found in your $PATH) instead of
-trying to execute the one built during the build process. You can
-also use an executable that hasn't been installed. For example, if
-you built the protobuf package for your host machine in ../host,
-you might do:
-
- ./configure --with-protoc=../host/src/protoc
-
-Either way, you must make sure that the protoc executable you use
-has the same version as the protobuf source code you are trying to
-use it with.
-
-**Note for Solaris users**
-
-Solaris 10 x86 has a bug that will make linking fail, complaining
-about libstdc++.la being invalid. We have included a work-around
-in this package. To use the work-around, run configure as follows:
-
- ./configure LDFLAGS=-L$PWD/src/solaris
-
-See src/solaris/libstdc++.la for more info on this bug.
-
-**Note for HP C++ Tru64 users**
-
-To compile invoke configure as follows:
-
- ./configure CXXFLAGS="-O -std ansi -ieee -D__USE_STD_IOSTREAM"
-
-Also, you will need to use gmake instead of make.
-
-**Note for AIX users**
-
-Compile using the IBM xlC C++ compiler as follows:
-
- ./configure CXX=xlC
-
-Also, you will need to use GNU `make` (`gmake`) instead of AIX `make`.
-
-C++ Installation - Windows
+C++ Protobuf - Windows
--------------------------
If you only need the protoc binary, you can download it from the release
@@ -220,10 +121,10 @@
libprotobuf, it is unlikely to work with a newer version without
re-compiling. This problem, when it occurs, will normally be detected
immediately on startup of your app. Still, you may want to consider
-using static linkage. You can configure this package to install
-static libraries only using:
+using static linkage. You can configure this in your `cc_binary` Bazel rules
+by specifying:
- ./configure --disable-shared
+ linkstatic=True
Usage
-----
diff --git a/src/file_lists.cmake b/src/file_lists.cmake
new file mode 100644
index 0000000..e874574
--- /dev/null
+++ b/src/file_lists.cmake
@@ -0,0 +1,751 @@
+# Auto-generated by //pkg:gen_src_file_lists_cmake
+#
+# This file contains lists of sources based on Bazel rules. It should
+# be included from a hand-written CMake file that defines targets.
+#
+# Changes to this file will be overwritten based on Bazel definitions.
+
+if(${CMAKE_VERSION} VERSION_GREATER 3.10 OR ${CMAKE_VERSION} VERSION_EQUAL 3.10)
+ include_guard()
+endif()
+
+# //pkg:protobuf
+set(libprotobuf_srcs
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/any.pb.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/api.pb.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/duration.pb.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/empty.pb.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/field_mask.pb.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/source_context.pb.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/struct.pb.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/timestamp.pb.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/type.pb.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/wrappers.pb.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/any.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/any_lite.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/arena.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/arena_config.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/arenastring.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/arenaz_sampler.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/importer.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/parser.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/descriptor.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/descriptor.pb.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/descriptor_database.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/dynamic_message.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/extension_set.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/extension_set_heavy.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/generated_enum_util.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/generated_message_bases.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/generated_message_reflection.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/generated_message_tctable_full.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/generated_message_tctable_gen.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/generated_message_tctable_lite.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/generated_message_util.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/implicit_weak_message.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/inlined_string_field.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/io/coded_stream.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/io/gzip_stream.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/io/io_win32.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/io/printer.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/io/strtod.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/io/tokenizer.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/io/zero_copy_sink.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/io/zero_copy_stream.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/io/zero_copy_stream_impl.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/io/zero_copy_stream_impl_lite.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/map.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/map_field.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/message.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/message_lite.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/parse_context.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/reflection_ops.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/repeated_field.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/repeated_ptr_field.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/service.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/bytestream.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/common.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/structurally_valid.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/strutil.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/text_format.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/unknown_field_set.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/delimited_message_util.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/field_comparator.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/field_mask_util.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/datapiece.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/default_value_objectwriter.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/error_listener.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/field_mask_utility.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/json_escaping.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/json_objectwriter.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/json_stream_parser.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/object_writer.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/proto_writer.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/protostream_objectsource.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/protostream_objectwriter.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/type_info.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/utility.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/json_util.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/message_differencer.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/time_util.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/type_resolver_util.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/wire_format.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/wire_format_lite.cc
+)
+
+# //pkg:protobuf
+set(libprotobuf_hdrs
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/any.pb.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/api.pb.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/duration.pb.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/empty.pb.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/field_mask.pb.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/source_context.pb.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/struct.pb.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/timestamp.pb.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/type.pb.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/wrappers.pb.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/any.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/arena.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/arena_config.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/arena_impl.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/arenastring.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/arenaz_sampler.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/importer.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/parser.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/descriptor.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/descriptor.pb.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/descriptor_database.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/dynamic_message.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/endian.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/explicitly_constructed.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/extension_set.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/extension_set_inl.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/field_access_listener.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/generated_enum_reflection.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/generated_enum_util.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/generated_message_bases.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/generated_message_reflection.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/generated_message_tctable_decl.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/generated_message_tctable_gen.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/generated_message_tctable_impl.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/generated_message_util.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/has_bits.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/implicit_weak_message.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/inlined_string_field.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/io/coded_stream.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/io/gzip_stream.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/io/io_win32.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/io/printer.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/io/strtod.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/io/tokenizer.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/io/zero_copy_sink.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/io/zero_copy_stream.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/io/zero_copy_stream_impl.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/io/zero_copy_stream_impl_lite.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/map.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/map_entry.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/map_entry_lite.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/map_field.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/map_field_inl.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/map_field_lite.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/map_type_handler.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/message.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/message_lite.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/metadata.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/metadata_lite.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/parse_context.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/port.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/port_def.inc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/port_undef.inc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/reflection.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/reflection_internal.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/reflection_ops.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/repeated_field.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/repeated_ptr_field.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/service.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/bytestream.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/callback.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/common.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/logging.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/mathutil.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/platform_macros.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/port.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/status_macros.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/stl_util.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/strutil.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/text_format.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/unknown_field_set.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/delimited_message_util.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/field_comparator.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/field_mask_util.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/constants.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/datapiece.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/default_value_objectwriter.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/error_listener.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/field_mask_utility.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/json_escaping.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/json_objectwriter.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/json_stream_parser.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/location_tracker.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/object_location_tracker.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/object_source.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/object_writer.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/proto_writer.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/protostream_objectsource.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/protostream_objectwriter.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/structured_objectwriter.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/type_info.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/utility.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/json_util.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/message_differencer.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/time_util.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/type_resolver.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/type_resolver_util.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/wire_format.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/wire_format_lite.h
+)
+
+# //pkg:protobuf_lite
+set(libprotobuf_lite_srcs
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/any_lite.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/arena.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/arena_config.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/arenastring.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/arenaz_sampler.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/extension_set.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/generated_enum_util.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/generated_message_tctable_lite.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/generated_message_util.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/implicit_weak_message.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/inlined_string_field.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/io/coded_stream.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/io/io_win32.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/io/zero_copy_stream.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/io/zero_copy_stream_impl.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/io/zero_copy_stream_impl_lite.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/map.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/message_lite.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/parse_context.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/repeated_field.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/repeated_ptr_field.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/bytestream.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/common.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/structurally_valid.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/strutil.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/wire_format_lite.cc
+)
+
+# //pkg:protobuf_lite
+set(libprotobuf_lite_hdrs
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/any.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/arena.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/arena_config.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/arena_impl.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/arenastring.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/arenaz_sampler.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/endian.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/explicitly_constructed.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/extension_set.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/extension_set_inl.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/generated_enum_util.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/generated_message_tctable_decl.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/generated_message_tctable_impl.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/generated_message_util.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/has_bits.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/implicit_weak_message.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/inlined_string_field.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/io/coded_stream.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/io/io_win32.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/io/zero_copy_stream.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/io/zero_copy_stream_impl.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/io/zero_copy_stream_impl_lite.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/map.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/map_entry_lite.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/map_field_lite.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/map_type_handler.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/message_lite.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/metadata_lite.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/parse_context.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/port.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/repeated_field.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/repeated_ptr_field.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/bytestream.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/callback.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/common.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/logging.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/mathutil.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/platform_macros.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/port.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/status_macros.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/stl_util.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/strutil.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/wire_format_lite.h
+)
+
+# //pkg:protoc
+set(libprotoc_srcs
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/code_generator.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/command_line_interface.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/enum.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/enum_field.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/extension.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/field.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/file.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/generator.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/helpers.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/map_field.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/message.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/message_field.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/padding_optimizer.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/parse_function_generator.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/primitive_field.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/service.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/string_field.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_doc_comment.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_enum.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_enum_field.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_field_base.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_generator.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_helpers.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_map_field.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_message.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_message_field.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_primitive_field.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_reflection_class.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_repeated_message_field.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_source_generator_base.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_wrapper_field.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/names.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/context.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/doc_comment.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/enum.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/enum_field.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/enum_field_lite.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/enum_lite.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/extension.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/extension_lite.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/field.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/file.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/generator.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/generator_factory.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/helpers.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/kotlin_generator.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/map_field.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/map_field_lite.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/message.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/message_builder.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/message_builder_lite.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/message_field.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/message_field_lite.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/message_lite.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/message_serialization.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/name_resolver.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/names.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/primitive_field.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/primitive_field_lite.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/service.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/shared_code_generator.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/string_field.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/string_field_lite.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/objectivec/names.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/objectivec/objectivec_enum.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/objectivec/objectivec_enum_field.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/objectivec/objectivec_extension.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/objectivec/objectivec_field.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/objectivec/objectivec_file.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/objectivec/objectivec_generator.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/objectivec/objectivec_map_field.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/objectivec/objectivec_message.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/objectivec/objectivec_message_field.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/objectivec/objectivec_oneof.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/objectivec/objectivec_primitive_field.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/php/names.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/php/php_generator.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/plugin.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/plugin.pb.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/python/generator.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/python/helpers.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/python/pyi_generator.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/ruby/ruby_generator.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/subprocess.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/zip_writer.cc
+)
+
+# //pkg:protoc
+set(libprotoc_hdrs
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/code_generator.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/command_line_interface.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/enum.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/enum_field.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/extension.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/field.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/file.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/generator.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/helpers.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/map_field.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/message.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/message_field.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/message_layout_helper.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/names.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/options.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/padding_optimizer.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/parse_function_generator.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/primitive_field.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/service.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/string_field.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_doc_comment.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_enum.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_enum_field.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_field_base.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_generator.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_helpers.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_map_field.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_message.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_message_field.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_options.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_primitive_field.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_reflection_class.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_repeated_message_field.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_source_generator_base.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_wrapper_field.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/names.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/context.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/doc_comment.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/enum.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/enum_field.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/enum_field_lite.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/enum_lite.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/extension.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/extension_lite.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/field.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/file.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/generator.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/generator_factory.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/helpers.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/kotlin_generator.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/map_field.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/map_field_lite.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/message.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/message_builder.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/message_builder_lite.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/message_field.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/message_field_lite.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/message_lite.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/message_serialization.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/name_resolver.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/names.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/options.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/primitive_field.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/primitive_field_lite.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/service.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/shared_code_generator.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/string_field.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/string_field_lite.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/objectivec/names.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/objectivec/objectivec_enum.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/objectivec/objectivec_enum_field.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/objectivec/objectivec_extension.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/objectivec/objectivec_field.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/objectivec/objectivec_file.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/objectivec/objectivec_generator.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/objectivec/objectivec_helpers.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/objectivec/objectivec_map_field.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/objectivec/objectivec_message.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/objectivec/objectivec_message_field.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/objectivec/objectivec_nsobject_methods.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/objectivec/objectivec_oneof.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/objectivec/objectivec_options.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/objectivec/objectivec_primitive_field.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/php/names.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/php/php_generator.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/plugin.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/plugin.pb.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/python/generator.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/python/helpers.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/python/pyi_generator.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/ruby/ruby_generator.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/scc.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/subprocess.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/zip_writer.h
+)
+
+# //src/google/protobuf:well_known_type_protos
+set(wkt_protos_files
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/any.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/api.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/duration.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/empty.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/field_mask.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/source_context.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/struct.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/timestamp.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/type.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/wrappers.proto
+)
+
+# //src/google/protobuf:descriptor_proto
+set(descriptor_proto_proto_srcs
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/descriptor.proto
+)
+
+# //src/google/protobuf:descriptor_proto
+set(descriptor_proto_srcs
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/descriptor.proto.pb.cc
+)
+
+# //src/google/protobuf:descriptor_proto
+set(descriptor_proto_hdrs
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/descriptor.proto.pb.h
+)
+
+# //src/google/protobuf:descriptor_proto
+set(descriptor_proto_files
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/descriptor_proto-descriptor-set.proto.bin
+)
+
+# //src/google/protobuf/compiler:plugin_proto
+set(plugin_proto_proto_srcs
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/plugin.proto
+)
+
+# //src/google/protobuf/compiler:plugin_proto
+set(plugin_proto_srcs
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/plugin.proto.pb.cc
+)
+
+# //src/google/protobuf/compiler:plugin_proto
+set(plugin_proto_hdrs
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/plugin.proto.pb.h
+)
+
+# //src/google/protobuf/compiler:plugin_proto
+set(plugin_proto_files
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/plugin_proto-descriptor-set.proto.bin
+)
+
+# //pkg:common_test
+set(common_test_srcs
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/mock_code_generator.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/testing/file.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/testing/googletest.cc
+)
+
+# //pkg:common_test
+set(common_test_hdrs
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/mock_code_generator.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/testing/file.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/testing/googletest.h
+)
+
+# //pkg:lite_test_util
+set(lite_test_util_srcs
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/arena_test_util.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/map_lite_test_util.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/test_util_lite.cc
+)
+
+# //pkg:lite_test_util
+set(lite_test_util_hdrs
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/arena_test_util.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/map_lite_test_util.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/map_test_util_impl.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/proto3_lite_unittest.inc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/test_util_lite.h
+)
+
+# //pkg:test_util
+set(test_util_srcs
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/annotation_test_util.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/reflection_tester.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/test_util.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/type_info_test_helper.cc
+)
+
+# //pkg:test_util
+set(test_util_hdrs
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/annotation_test_util.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/unittest.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/unittest.inc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/map_test.inc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/map_test_util.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/map_test_util.inc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/message_unittest.inc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/reflection_tester.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/test_util.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/test_util.inc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/test_util2.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/test_util_lite.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/expecting_objectwriter.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/mock_error_listener.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/type_info_test_helper.h
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/wire_format_unittest.inc
+)
+
+# //src/google/protobuf:full_test_srcs
+set(protobuf_test_files
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/any_test.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/arena_unittest.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/arenastring_unittest.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/arenaz_sampler_test.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/descriptor_database_unittest.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/descriptor_unittest.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/drop_unknown_fields_test.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/dynamic_message_unittest.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/extension_set_unittest.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/generated_message_reflection_unittest.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/generated_message_tctable_lite_test.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/inlined_string_field_unittest.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/map_field_test.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/map_test.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/message_unittest.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/no_field_presence_test.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/preserve_unknown_enum_test.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/proto3_arena_lite_unittest.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/proto3_arena_unittest.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/proto3_lite_unittest.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/reflection_ops_unittest.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/repeated_field_reflection_unittest.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/repeated_field_unittest.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/text_format_unittest.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/unknown_field_set_unittest.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/well_known_types_unittest.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/wire_format_unittest.cc
+)
+
+# //src/google/protobuf:test_proto_srcs
+set(protobuf_test_protos_files
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/any_test.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/map_proto2_unittest.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/map_unittest.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_arena.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_custom_options.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_drop_unknown_fields.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_embed_optimize_for.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_empty.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_enormous_descriptor.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_import.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_import_public.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_lazy_dependencies.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_lazy_dependencies_custom_option.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_lazy_dependencies_enum.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_lite_imports_nonlite.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_mset.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_mset_wire_format.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_no_field_presence.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_no_generic_services.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_optimize_for.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_preserve_unknown_enum.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_preserve_unknown_enum2.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_proto3.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_proto3_arena.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_proto3_arena_lite.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_proto3_lite.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_proto3_optional.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_well_known_types.proto
+)
+
+# //src/google/protobuf:lite_test_srcs
+set(protobuf_lite_test_files
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/lite_arena_unittest.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/lite_unittest.cc
+)
+
+# //src/google/protobuf:lite_test_proto_srcs
+set(protobuf_lite_test_protos_files
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/map_lite_unittest.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_import_lite.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_import_public_lite.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/unittest_lite.proto
+)
+
+# //src/google/protobuf/compiler:test_srcs
+set(compiler_test_files
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/command_line_interface_unittest.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/bootstrap_unittest.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/message_size_unittest.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/metadata_test.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/move_unittest.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/plugin_unittest.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/unittest.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_bootstrap_unittest.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/csharp/csharp_generator_unittest.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/importer_unittest.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/doc_comment_unittest.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/message_serialization_unittest.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/java/plugin_unittest.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/objectivec/objectivec_helpers_unittest.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/parser_unittest.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/python/plugin_unittest.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/ruby/ruby_generator_unittest.cc
+)
+
+# //src/google/protobuf/compiler:test_proto_srcs
+set(compiler_test_protos_files
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/test_bad_identifiers.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/cpp/test_large_enum_value.proto
+)
+
+# //src/google/protobuf/compiler:test_plugin_srcs
+set(test_plugin_files
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/compiler/test_plugin.cc
+)
+
+# //src/google/protobuf/io:test_srcs
+set(io_test_files
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/io/coded_stream_unittest.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/io/io_win32_unittest.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/io/printer_death_test.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/io/printer_unittest.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/io/tokenizer_unittest.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/io/zero_copy_sink_test.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/io/zero_copy_stream_unittest.cc
+)
+
+# //src/google/protobuf/util:test_srcs
+set(util_test_files
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/delimited_message_util_test.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/field_comparator_test.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/field_mask_util_test.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/default_value_objectwriter_test.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/json_objectwriter_test.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/json_stream_parser_test.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/protostream_objectsource_test.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/protostream_objectwriter_test.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/type_info_test_helper.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/json_util_test.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/message_differencer_unittest.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/time_util_test.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/type_resolver_util_test.cc
+)
+
+# //src/google/protobuf/util:test_proto_srcs
+set(util_test_protos_files
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/testdata/anys.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/testdata/books.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/testdata/default_value.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/testdata/default_value_test.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/testdata/field_mask.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/testdata/maps.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/testdata/oneofs.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/testdata/proto3.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/testdata/struct.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/testdata/timestamp_duration.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/internal/testdata/wrappers.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/json_format.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/json_format_proto3.proto
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/util/message_differencer_unittest.proto
+)
+
+# //src/google/protobuf/stubs:test_srcs
+set(stubs_test_files
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/bytestream_unittest.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/common_unittest.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/structurally_valid_unittest.cc
+ ${protobuf_SOURCE_DIR}/src/google/protobuf/stubs/strutil_unittest.cc
+)
diff --git a/src/google/protobuf/BUILD.bazel b/src/google/protobuf/BUILD.bazel
new file mode 100644
index 0000000..0578e66
--- /dev/null
+++ b/src/google/protobuf/BUILD.bazel
@@ -0,0 +1,1215 @@
+################################################################################
+# Protocol Buffers: C++ Runtime and common proto files
+################################################################################
+
+load("@rules_cc//cc:defs.bzl", "cc_library", "cc_proto_library", "cc_test")
+load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
+load("@rules_proto//proto:defs.bzl", "proto_library")
+load("//build_defs:cpp_opts.bzl", "COPTS", "LINK_OPTS")
+
+package(
+ default_visibility = [
+ "//:__pkg__", # "public" targets are alias rules in //.
+ ],
+)
+
+proto_library(
+ name = "any_proto",
+ srcs = ["any.proto"],
+ strip_import_prefix = "/src",
+)
+
+proto_library(
+ name = "api_proto",
+ srcs = ["api.proto"],
+ strip_import_prefix = "/src",
+ deps = [
+ "//:source_context_proto",
+ "//:type_proto",
+ ],
+)
+
+proto_library(
+ name = "duration_proto",
+ srcs = ["duration.proto"],
+ strip_import_prefix = "/src",
+)
+
+proto_library(
+ name = "empty_proto",
+ srcs = ["empty.proto"],
+ strip_import_prefix = "/src",
+)
+
+proto_library(
+ name = "field_mask_proto",
+ srcs = ["field_mask.proto"],
+ strip_import_prefix = "/src",
+)
+
+proto_library(
+ name = "source_context_proto",
+ srcs = ["source_context.proto"],
+ strip_import_prefix = "/src",
+)
+
+proto_library(
+ name = "struct_proto",
+ srcs = ["struct.proto"],
+ strip_import_prefix = "/src",
+)
+
+proto_library(
+ name = "timestamp_proto",
+ srcs = ["timestamp.proto"],
+ strip_import_prefix = "/src",
+)
+
+proto_library(
+ name = "type_proto",
+ srcs = ["type.proto"],
+ strip_import_prefix = "/src",
+ deps = [
+ "//:any_proto",
+ "//:source_context_proto",
+ ],
+)
+
+proto_library(
+ name = "wrappers_proto",
+ srcs = ["wrappers.proto"],
+ strip_import_prefix = "/src",
+)
+
+# Generate code for the well-known types on demand.
+# This needs to be done in a separate genrule because we publish protoc and the
+# C++ runtime with the WKT code linked in. We need to use a stripped down
+# compiler and runtime library to generate them, and cc_proto_library doesn't
+# support swapping out the compiler binary (even though a custom runtime can
+# be passed to proto_lang_toolchain).
+#
+# TODO(b/246826624) We still check in generated pb.h and pb.cc files purely to
+# support CMake builds. These aren't used at all by Bazel and will be removed
+# in the future once CMake can generate them too.
+
+WELL_KNOWN_TYPES = [
+ "any",
+ "api",
+ "duration",
+ "empty",
+ "field_mask",
+ "source_context",
+ "struct",
+ "timestamp",
+ "type",
+ "wrappers",
+]
+
+genrule(
+ name = "gen_wkt_cc_sources",
+ srcs = [wkt + ".proto" for wkt in WELL_KNOWN_TYPES],
+ outs =
+ [wkt + ".pb.h" for wkt in WELL_KNOWN_TYPES] +
+ [wkt + ".pb.cc" for wkt in WELL_KNOWN_TYPES],
+ cmd = """
+ $(execpath //src/google/protobuf/compiler:protoc_nowkt) \
+ --cpp_out=$(RULEDIR)/../.. \
+ --proto_path=$$(dirname $$(dirname $$(dirname $(location any.proto)))) \
+ $(SRCS)
+ """,
+ exec_tools = ["//src/google/protobuf/compiler:protoc_nowkt"],
+ visibility = ["//visibility:private"],
+)
+
+cc_library(
+ name = "wkt_cc_proto",
+ srcs = [wkt + ".pb.cc" for wkt in WELL_KNOWN_TYPES],
+ hdrs = [wkt + ".pb.h" for wkt in WELL_KNOWN_TYPES],
+ copts = COPTS,
+ include_prefix = "google/protobuf",
+ linkopts = LINK_OPTS,
+ visibility = ["//pkg:__pkg__"],
+ deps = [":protobuf_nowkt"],
+)
+
+# Built-in runtime types
+
+proto_library(
+ name = "descriptor_proto",
+ srcs = ["descriptor.proto"],
+ strip_import_prefix = "/src",
+ visibility = [
+ "//:__pkg__",
+ "//pkg:__pkg__",
+ ],
+)
+
+################################################################################
+# C++ Runtime Library
+################################################################################
+
+cc_library(
+ name = "port_def",
+ hdrs = [
+ "port.h",
+ "port_def.inc",
+ "port_undef.inc",
+ ],
+ include_prefix = "google/protobuf",
+ visibility = [
+ "//:__subpackages__",
+ "//src/google/protobuf:__subpackages__",
+ ],
+)
+
+cc_library(
+ name = "arena",
+ srcs = [
+ "arena.cc",
+ "arena_config.cc",
+ ],
+ hdrs = [
+ "arena.h",
+ "arena_config.h",
+ "arena_impl.h",
+ "arenaz_sampler.h",
+ ],
+ include_prefix = "google/protobuf",
+ visibility = [
+ "//:__subpackages__",
+ "//src/google/protobuf:__subpackages__",
+ ],
+ deps = [
+ "//src/google/protobuf/stubs:lite",
+ "@com_google_absl//absl/synchronization",
+ ],
+)
+
+cc_library(
+ name = "protobuf_lite",
+ srcs = [
+ "any_lite.cc",
+ "arena_config.cc",
+ "arenastring.cc",
+ "arenaz_sampler.cc",
+ "extension_set.cc",
+ "generated_enum_util.cc",
+ "generated_message_tctable_lite.cc",
+ "generated_message_util.cc",
+ "implicit_weak_message.cc",
+ "inlined_string_field.cc",
+ "map.cc",
+ "message_lite.cc",
+ "parse_context.cc",
+ "repeated_field.cc",
+ "repeated_ptr_field.cc",
+ "wire_format_lite.cc",
+ ],
+ hdrs = [
+ "any.h",
+ "arena.h",
+ "arena_config.h",
+ "arena_impl.h",
+ "arenastring.h",
+ "arenaz_sampler.h",
+ "endian.h",
+ "explicitly_constructed.h",
+ "extension_set.h",
+ "extension_set_inl.h",
+ "generated_enum_util.h",
+ "generated_message_tctable_decl.h",
+ "generated_message_tctable_impl.h",
+ "generated_message_util.h",
+ "has_bits.h",
+ "implicit_weak_message.h",
+ "inlined_string_field.h",
+ "map.h",
+ "map_entry_lite.h",
+ "map_field_lite.h",
+ "map_type_handler.h",
+ "message_lite.h",
+ "metadata_lite.h",
+ "parse_context.h",
+ "port.h",
+ "repeated_field.h",
+ "repeated_ptr_field.h",
+ "wire_format_lite.h",
+ ],
+ copts = COPTS + select({
+ "//build_defs:config_msvc": [],
+ "//conditions:default": [
+ "-Wno-error",
+ ],
+ }),
+ include_prefix = "google/protobuf",
+ linkopts = LINK_OPTS,
+ visibility = [
+ "//:__pkg__",
+ "//pkg:__pkg__",
+ "//src/google/protobuf:__subpackages__",
+ ],
+ # In Bazel 6.0+, these will be `interface_deps`:
+ deps = [
+ ":arena",
+ "//src/google/protobuf/io",
+ "//src/google/protobuf/stubs:lite",
+ "@com_google_absl//absl/container:flat_hash_set",
+ "@com_google_absl//absl/numeric:bits",
+ "@com_google_absl//absl/strings:internal",
+ "@com_google_absl//absl/synchronization",
+ "@com_google_absl//absl/time",
+ ],
+)
+
+cc_library(
+ name = "protobuf_nowkt",
+ srcs = [
+ "any.cc",
+ "descriptor.cc",
+ "descriptor.pb.cc",
+ "descriptor_database.cc",
+ "dynamic_message.cc",
+ "extension_set_heavy.cc",
+ "generated_message_bases.cc",
+ "generated_message_reflection.cc",
+ "generated_message_tctable_full.cc",
+ "generated_message_tctable_gen.cc",
+ "map_field.cc",
+ "message.cc",
+ "reflection_ops.cc",
+ "service.cc",
+ "text_format.cc",
+ "unknown_field_set.cc",
+ "wire_format.cc",
+ ],
+ hdrs = [
+ "descriptor.h",
+ "descriptor.pb.h",
+ "descriptor_database.h",
+ "dynamic_message.h",
+ "field_access_listener.h",
+ "generated_enum_reflection.h",
+ "generated_message_bases.h",
+ "generated_message_reflection.h",
+ "generated_message_tctable_gen.h",
+ "map_entry.h",
+ "map_field.h",
+ "map_field_inl.h",
+ "message.h",
+ "metadata.h",
+ "reflection.h",
+ "reflection_internal.h",
+ "reflection_ops.h",
+ "service.h",
+ "text_format.h",
+ "unknown_field_set.h",
+ "wire_format.h",
+ ],
+ copts = COPTS,
+ include_prefix = "google/protobuf",
+ linkopts = LINK_OPTS,
+ visibility = [
+ "//pkg:__pkg__",
+ "//src/google/protobuf:__subpackages__",
+ ],
+ deps = [
+ ":protobuf_lite",
+ "//src/google/protobuf/io",
+ "//src/google/protobuf/io:gzip_stream",
+ "//src/google/protobuf/io:printer",
+ "//src/google/protobuf/io:tokenizer",
+ "//src/google/protobuf/stubs",
+ "@com_google_absl//absl/base",
+ "@com_google_absl//absl/base:dynamic_annotations",
+ "@com_google_absl//absl/container:flat_hash_map",
+ "@com_google_absl//absl/container:flat_hash_set",
+ "@com_google_absl//absl/hash",
+ "@com_google_absl//absl/strings:internal",
+ "@com_google_absl//absl/synchronization",
+ "@com_google_absl//absl/time",
+ ],
+)
+
+cc_library(
+ name = "protobuf",
+ copts = COPTS,
+ include_prefix = "google/protobuf",
+ linkopts = LINK_OPTS,
+ visibility = [
+ "//:__pkg__",
+ "//pkg:__pkg__",
+ "//src/google/protobuf:__subpackages__",
+ ],
+ deps = [
+ ":protobuf_nowkt",
+ ":wkt_cc_proto",
+ ],
+)
+
+# This provides just the header files for use in projects that need to build
+# shared libraries for dynamic loading. This target is available until Bazel
+# adds native support for such use cases.
+# TODO(keveman): Remove this target once the support gets added to Bazel.
+cc_library(
+ name = "protobuf_headers",
+ hdrs = glob([
+ "**/*.h",
+ "**/*.inc",
+ ]),
+)
+
+filegroup(
+ name = "well_known_type_protos",
+ srcs = [
+ "any.proto",
+ "api.proto",
+ "duration.proto",
+ "empty.proto",
+ "field_mask.proto",
+ "source_context.proto",
+ "struct.proto",
+ "timestamp.proto",
+ "type.proto",
+ "wrappers.proto",
+ ],
+ visibility = ["//:__subpackages__"],
+)
+
+filegroup(
+ name = "descriptor_proto_srcs",
+ srcs = ["descriptor.proto"],
+ visibility = ["//:__subpackages__"],
+)
+
+filegroup(
+ name = "testdata",
+ srcs = glob(["testdata/**/*"]) + [
+ "descriptor.cc",
+ ],
+ visibility = [
+ "//:__subpackages__",
+ "@upb//:__subpackages__",
+ ],
+)
+
+filegroup(
+ name = "lite_test_proto_srcs",
+ srcs = [
+ "map_lite_unittest.proto",
+ "unittest_import_lite.proto",
+ "unittest_import_public_lite.proto",
+ "unittest_lite.proto",
+ ],
+ visibility = ["//:__subpackages__"],
+)
+
+proto_library(
+ name = "lite_test_protos",
+ srcs = [":lite_test_proto_srcs"],
+ strip_import_prefix = "/src",
+ visibility = ["//:__subpackages__"],
+ deps = [
+ ":any_proto",
+ ":api_proto",
+ ":descriptor_proto",
+ ":duration_proto",
+ ":empty_proto",
+ ":field_mask_proto",
+ ":source_context_proto",
+ ":struct_proto",
+ ":timestamp_proto",
+ ":type_proto",
+ ":wrappers_proto",
+ ],
+)
+
+filegroup(
+ name = "test_proto_srcs",
+ srcs = [
+ "any_test.proto",
+ "map_proto2_unittest.proto",
+ "map_unittest.proto",
+ "unittest.proto",
+ "unittest_arena.proto",
+ "unittest_custom_options.proto",
+ "unittest_drop_unknown_fields.proto",
+ "unittest_embed_optimize_for.proto",
+ "unittest_empty.proto",
+ "unittest_enormous_descriptor.proto",
+ "unittest_import.proto",
+ "unittest_import_public.proto",
+ "unittest_lazy_dependencies.proto",
+ "unittest_lazy_dependencies_custom_option.proto",
+ "unittest_lazy_dependencies_enum.proto",
+ "unittest_lite_imports_nonlite.proto",
+ "unittest_mset.proto",
+ "unittest_mset_wire_format.proto",
+ "unittest_no_field_presence.proto",
+ "unittest_no_generic_services.proto",
+ "unittest_optimize_for.proto",
+ "unittest_preserve_unknown_enum.proto",
+ "unittest_preserve_unknown_enum2.proto",
+ "unittest_proto3.proto",
+ "unittest_proto3_arena.proto",
+ "unittest_proto3_arena_lite.proto",
+ "unittest_proto3_lite.proto",
+ "unittest_proto3_optional.proto",
+ "unittest_well_known_types.proto",
+ ],
+ visibility = ["//:__subpackages__"],
+)
+
+proto_library(
+ name = "test_protos",
+ srcs = [":test_proto_srcs"],
+ strip_import_prefix = "/src",
+ visibility = ["//:__subpackages__"],
+ deps = [
+ ":any_proto",
+ ":api_proto",
+ ":descriptor_proto",
+ ":duration_proto",
+ ":empty_proto",
+ ":field_mask_proto",
+ ":source_context_proto",
+ ":struct_proto",
+ ":timestamp_proto",
+ ":type_proto",
+ ":wrappers_proto",
+ ],
+)
+
+proto_library(
+ name = "generic_test_protos",
+ srcs = [
+ "map_proto2_unittest.proto",
+ "map_unittest.proto",
+ "unittest.proto",
+ "unittest_arena.proto",
+ "unittest_custom_options.proto",
+ "unittest_drop_unknown_fields.proto",
+ "unittest_embed_optimize_for.proto",
+ "unittest_empty.proto",
+ "unittest_enormous_descriptor.proto",
+ "unittest_import.proto",
+ "unittest_import_public.proto",
+ "unittest_lazy_dependencies.proto",
+ "unittest_lazy_dependencies_custom_option.proto",
+ "unittest_lazy_dependencies_enum.proto",
+ "unittest_lite_imports_nonlite.proto",
+ "unittest_mset.proto",
+ "unittest_mset_wire_format.proto",
+ "unittest_no_field_presence.proto",
+ "unittest_no_generic_services.proto",
+ "unittest_optimize_for.proto",
+ "unittest_preserve_unknown_enum.proto",
+ "unittest_preserve_unknown_enum2.proto",
+ "unittest_proto3.proto",
+ "unittest_proto3_arena.proto",
+ "unittest_proto3_arena_lite.proto",
+ "unittest_proto3_lite.proto",
+ "unittest_proto3_optional.proto",
+ "unittest_well_known_types.proto",
+ ],
+ strip_import_prefix = "/src",
+ visibility = ["//:__subpackages__"],
+ deps = [
+ ":any_proto",
+ ":api_proto",
+ ":descriptor_proto",
+ ":duration_proto",
+ ":empty_proto",
+ ":field_mask_proto",
+ ":source_context_proto",
+ ":struct_proto",
+ ":timestamp_proto",
+ ":type_proto",
+ ":wrappers_proto",
+ ],
+)
+
+exports_files(
+ [
+ "test_messages_proto2.proto",
+ "test_messages_proto3.proto",
+ ],
+ visibility = [
+ "//:__pkg__",
+ "//python:__pkg__",
+ ],
+)
+
+proto_library(
+ name = "test_messages_proto2_proto",
+ srcs = ["test_messages_proto2.proto"],
+ strip_import_prefix = "/src",
+ visibility = [
+ "//:__pkg__",
+ "//conformance:__pkg__",
+ ],
+)
+
+proto_library(
+ name = "test_messages_proto3_proto",
+ srcs = ["test_messages_proto3.proto"],
+ strip_import_prefix = "/src",
+ visibility = [
+ "//:__pkg__",
+ "//conformance:__pkg__",
+ ],
+ deps = [
+ ":any_proto",
+ ":duration_proto",
+ ":field_mask_proto",
+ ":struct_proto",
+ ":timestamp_proto",
+ ":wrappers_proto",
+ ],
+)
+
+cc_proto_library(
+ name = "cc_lite_test_protos",
+ deps = [":lite_test_protos"],
+)
+
+cc_proto_library(
+ name = "cc_test_protos",
+ visibility = ["//src/google/protobuf:__subpackages__"],
+ deps = [":test_protos"],
+)
+
+# Filegroup for golden comparison test:
+filegroup(
+ name = "descriptor_cc_srcs",
+ testonly = 1,
+ data = [
+ "descriptor.pb.cc",
+ "descriptor.pb.h",
+ ],
+ visibility = ["//src/google/protobuf/compiler/cpp:__pkg__"],
+)
+
+cc_library(
+ name = "lite_test_util",
+ testonly = 1,
+ srcs = [
+ "arena_test_util.cc",
+ "map_lite_test_util.cc",
+ "test_util_lite.cc",
+ ],
+ hdrs = [
+ "arena_test_util.h",
+ "map_lite_test_util.h",
+ "map_test_util_impl.h",
+ "proto3_lite_unittest.inc",
+ "test_util_lite.h",
+ ],
+ strip_include_prefix = "/src",
+ visibility = ["//:__subpackages__"],
+ deps = [
+ ":cc_lite_test_protos",
+ ":test_util2",
+ "@com_google_googletest//:gtest",
+ ],
+)
+
+cc_library(
+ name = "test_util",
+ testonly = 1,
+ srcs = [
+ "reflection_tester.cc",
+ "test_util.cc",
+ ],
+ hdrs = [
+ "map_test.inc",
+ "map_test_util.h",
+ "map_test_util.inc",
+ "message_unittest.inc",
+ "reflection_tester.h",
+ "test_util.h",
+ "test_util.inc",
+ "test_util_lite.h",
+ "wire_format_unittest.inc",
+ ],
+ copts = COPTS + select({
+ "//build_defs:config_msvc": [],
+ "//conditions:default": [
+ "-Wno-error=sign-compare",
+ ],
+ }),
+ strip_include_prefix = "/src",
+ visibility = ["//:__subpackages__"],
+ deps = [
+ ":cc_lite_test_protos",
+ ":cc_test_protos",
+ ":lite_test_util",
+ "//src/google/protobuf/testing",
+ "@com_google_googletest//:gtest",
+ ],
+)
+
+cc_library(
+ name = "test_util2",
+ testonly = 1,
+ hdrs = ["test_util2.h"],
+ strip_include_prefix = "/src",
+ textual_hdrs = ["test_util.inc"],
+ visibility = ["//:__subpackages__"],
+ deps = [
+ "//src/google/protobuf/io",
+ "@com_google_googletest//:gtest",
+ ],
+)
+
+cc_test(
+ name = "any_test",
+ srcs = ["any_test.cc"],
+ deps = [
+ ":protobuf",
+ ":test_util",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_test(
+ name = "arena_unittest",
+ srcs = ["arena_unittest.cc"],
+ copts = COPTS + select({
+ "//build_defs:config_msvc": [],
+ "//conditions:default": [
+ "-Wno-error=sign-compare",
+ ],
+ }),
+ deps = [
+ ":cc_test_protos",
+ ":lite_test_util",
+ ":protobuf",
+ ":test_util",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_test(
+ name = "arenastring_unittest",
+ srcs = ["arenastring_unittest.cc"],
+ deps = [
+ ":protobuf",
+ "//src/google/protobuf/io",
+ "//src/google/protobuf/stubs",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_test(
+ name = "arenaz_sampler_test",
+ srcs = ["arenaz_sampler_test.cc"],
+ deps = [
+ ":protobuf",
+ "//src/google/protobuf/stubs",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_test(
+ name = "descriptor_database_unittest",
+ srcs = ["descriptor_database_unittest.cc"],
+ deps = [
+ ":protobuf",
+ "//src/google/protobuf/testing",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_test(
+ name = "descriptor_unittest",
+ srcs = ["descriptor_unittest.cc"],
+ copts = COPTS + select({
+ "//build_defs:config_msvc": [],
+ "//conditions:default": [
+ "-Wno-error=sign-compare",
+ ],
+ }),
+ deps = [
+ ":cc_test_protos",
+ ":protobuf",
+ "//src/google/protobuf/compiler:importer",
+ "//src/google/protobuf/testing",
+ "@com_google_absl//absl/strings:str_format",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_test(
+ name = "drop_unknown_fields_test",
+ srcs = ["drop_unknown_fields_test.cc"],
+ deps = [
+ ":cc_test_protos",
+ ":protobuf",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_test(
+ name = "dynamic_message_unittest",
+ srcs = ["dynamic_message_unittest.cc"],
+ copts = COPTS + select({
+ "//build_defs:config_msvc": [],
+ "//conditions:default": [
+ "-Wno-error=sign-compare",
+ ],
+ }),
+ deps = [
+ ":cc_test_protos",
+ ":protobuf",
+ ":test_util",
+ "//src/google/protobuf/stubs",
+ "//src/google/protobuf/testing",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_test(
+ name = "extension_set_unittest",
+ srcs = ["extension_set_unittest.cc"],
+ copts = COPTS + select({
+ "//build_defs:config_msvc": [],
+ "//conditions:default": [
+ "-Wno-error=sign-compare",
+ ],
+ }),
+ deps = [
+ ":cc_test_protos",
+ ":protobuf",
+ ":test_util",
+ "//src/google/protobuf/io",
+ "//src/google/protobuf/stubs",
+ "//src/google/protobuf/testing",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_test(
+ name = "generated_message_reflection_unittest",
+ srcs = ["generated_message_reflection_unittest.cc"],
+ copts = COPTS + select({
+ "//build_defs:config_msvc": [],
+ "//conditions:default": [
+ "-Wno-error=sign-compare",
+ ],
+ }),
+ deps = [
+ ":cc_test_protos",
+ ":protobuf",
+ ":test_util",
+ "//src/google/protobuf/stubs",
+ "//src/google/protobuf/testing",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_test(
+ name = "generated_message_tctable_lite_test",
+ srcs = ["generated_message_tctable_lite_test.cc"],
+ copts = COPTS + select({
+ "//build_defs:config_msvc": [],
+ "//conditions:default": [
+ "-Wno-error=sign-compare",
+ ],
+ }),
+ deps = [
+ ":protobuf_lite",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_test(
+ name = "inlined_string_field_unittest",
+ srcs = ["inlined_string_field_unittest.cc"],
+ deps = [
+ ":cc_test_protos",
+ ":protobuf",
+ "//src/google/protobuf/io",
+ "//src/google/protobuf/stubs",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_test(
+ name = "lite_arena_unittest",
+ srcs = ["lite_arena_unittest.cc"],
+ copts = COPTS + select({
+ "//build_defs:config_msvc": [],
+ "//conditions:default": [
+ "-Wno-error=sign-compare",
+ ],
+ }),
+ deps = [
+ ":lite_test_util",
+ ":protobuf",
+ ":test_util",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_test(
+ name = "lite_unittest",
+ srcs = ["lite_unittest.cc"],
+ deps = [
+ ":cc_lite_test_protos",
+ ":lite_test_util",
+ ":protobuf",
+ "//src/google/protobuf/io",
+ "//src/google/protobuf/stubs",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_test(
+ name = "map_field_test",
+ srcs = ["map_field_test.cc"],
+ deps = [
+ ":cc_test_protos",
+ ":protobuf",
+ ":test_util",
+ "//src/google/protobuf/stubs",
+ "@com_google_absl//absl/strings:str_format",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_test(
+ name = "map_test",
+ srcs = [
+ "map_test.cc",
+ "map_test.inc",
+ ],
+ copts = COPTS + select({
+ "//build_defs:config_msvc": [],
+ "//conditions:default": [
+ "-Wno-deprecated-declarations",
+ ],
+ }),
+ data = [":testdata"],
+ deps = [
+ ":cc_test_protos",
+ ":protobuf",
+ ":test_util",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_test(
+ name = "message_unittest",
+ srcs = [
+ "message_unittest.cc",
+ "message_unittest.inc",
+ ],
+ data = [":testdata"],
+ deps = [
+ ":cc_test_protos",
+ ":protobuf",
+ ":test_util",
+ "//src/google/protobuf/io",
+ "//src/google/protobuf/stubs",
+ "//src/google/protobuf/testing",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_test(
+ name = "no_field_presence_test",
+ srcs = ["no_field_presence_test.cc"],
+ deps = [
+ ":cc_test_protos",
+ ":protobuf",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_test(
+ name = "preserve_unknown_enum_test",
+ srcs = ["preserve_unknown_enum_test.cc"],
+ deps = [
+ ":cc_test_protos",
+ ":protobuf",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_test(
+ name = "proto3_arena_lite_unittest",
+ srcs = ["proto3_arena_lite_unittest.cc"],
+ deps = [
+ ":cc_test_protos",
+ ":protobuf",
+ "//src/google/protobuf/testing",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_test(
+ name = "proto3_arena_unittest",
+ srcs = ["proto3_arena_unittest.cc"],
+ copts = COPTS + select({
+ "//build_defs:config_msvc": [],
+ "//conditions:default": [
+ "-Wno-error=sign-compare",
+ ],
+ }),
+ deps = [
+ ":cc_test_protos",
+ ":protobuf",
+ ":test_util",
+ "//src/google/protobuf/stubs",
+ "//src/google/protobuf/testing",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_test(
+ name = "proto3_lite_unittest",
+ srcs = [
+ "proto3_lite_unittest.cc",
+ "proto3_lite_unittest.inc",
+ ],
+ copts = COPTS + select({
+ "//build_defs:config_msvc": [],
+ "//conditions:default": [
+ "-Wno-deprecated-declarations",
+ ],
+ }),
+ deps = [
+ ":cc_test_protos",
+ ":lite_test_util",
+ ":protobuf",
+ "//src/google/protobuf/testing",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_test(
+ name = "reflection_ops_unittest",
+ srcs = ["reflection_ops_unittest.cc"],
+ copts = COPTS + select({
+ "//build_defs:config_msvc": [],
+ "//conditions:default": [
+ "-Wno-error=sign-compare",
+ ],
+ }),
+ deps = [
+ ":cc_test_protos",
+ ":protobuf",
+ ":test_util",
+ "//src/google/protobuf/stubs",
+ "//src/google/protobuf/testing",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_test(
+ name = "repeated_field_reflection_unittest",
+ srcs = ["repeated_field_reflection_unittest.cc"],
+ copts = COPTS + select({
+ "//build_defs:config_msvc": [],
+ "//conditions:default": [
+ "-Wno-deprecated-declarations",
+ ],
+ }),
+ deps = [
+ ":cc_test_protos",
+ ":protobuf",
+ ":test_util",
+ "//src/google/protobuf/stubs",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_test(
+ name = "repeated_field_unittest",
+ srcs = ["repeated_field_unittest.cc"],
+ copts = COPTS + select({
+ "//build_defs:config_msvc": [],
+ "//conditions:default": [
+ "-Wno-deprecated-declarations",
+ ],
+ }),
+ deps = [
+ ":cc_test_protos",
+ ":protobuf",
+ "//src/google/protobuf/stubs",
+ "//src/google/protobuf/testing",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_test(
+ name = "text_format_unittest",
+ srcs = ["text_format_unittest.cc"],
+ copts = COPTS + select({
+ "//build_defs:config_msvc": [],
+ "//conditions:default": [
+ "-Wno-deprecated-declarations",
+ ],
+ }),
+ data = [":testdata"],
+ deps = [
+ ":cc_test_protos",
+ ":protobuf",
+ ":test_util",
+ "//src/google/protobuf/io",
+ "//src/google/protobuf/stubs",
+ "//src/google/protobuf/testing",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_test(
+ name = "unknown_field_set_unittest",
+ srcs = ["unknown_field_set_unittest.cc"],
+ copts = COPTS + select({
+ "//build_defs:config_msvc": [],
+ "//conditions:default": [
+ "-Wno-error=sign-compare",
+ ],
+ }),
+ deps = [
+ ":cc_lite_test_protos",
+ ":protobuf",
+ ":test_util",
+ "//src/google/protobuf/io",
+ "//src/google/protobuf/stubs",
+ "//src/google/protobuf/testing",
+ "@com_google_absl//absl/synchronization",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_test(
+ name = "well_known_types_unittest",
+ srcs = ["well_known_types_unittest.cc"],
+ copts = COPTS + select({
+ "//build_defs:config_msvc": [],
+ "//conditions:default": [
+ "-Wno-deprecated-declarations",
+ ],
+ }),
+ deps = [
+ ":cc_test_protos",
+ ":protobuf",
+ "//src/google/protobuf/stubs",
+ "//src/google/protobuf/testing",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_test(
+ name = "wire_format_unittest",
+ srcs = [
+ "wire_format_unittest.cc",
+ "wire_format_unittest.inc",
+ ],
+ deps = [
+ ":cc_test_protos",
+ ":protobuf",
+ ":test_util",
+ ":test_util2",
+ "//src/google/protobuf/io",
+ "//src/google/protobuf/stubs",
+ "//src/google/protobuf/testing",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+################################################################################
+# Helper targets for Kotlin tests
+################################################################################
+
+proto_library(
+ name = "kt_unittest_protos",
+ srcs = [
+ "map_proto2_unittest.proto",
+ "unittest.proto",
+ "unittest_import.proto",
+ "unittest_import_public.proto",
+ ],
+ strip_import_prefix = "/src",
+ visibility = ["//java/kotlin:__pkg__"],
+)
+
+proto_library(
+ name = "kt_proto3_unittest_protos",
+ srcs = [
+ "unittest_import.proto",
+ "unittest_import_public.proto",
+ "unittest_proto3.proto",
+ ],
+ strip_import_prefix = "/src",
+ visibility = [
+ "//java/kotlin:__pkg__",
+ "//java/kotlin-lite:__pkg__",
+ ],
+)
+
+################################################################################
+# Packaging rules
+################################################################################
+
+pkg_files(
+ name = "dist_files",
+ srcs = glob(["**"]),
+ strip_prefix = strip_prefix.from_root(""),
+ visibility = ["//src:__pkg__"],
+)
+
+filegroup(
+ name = "full_test_srcs",
+ srcs = glob(
+ include = [
+ "*_test.cc",
+ "*unittest.cc",
+ ],
+ exclude = [
+ "lite_unittest.cc",
+ "lite_arena_unittest.cc",
+ ],
+ ),
+ visibility = ["//pkg:__pkg__"],
+)
+
+filegroup(
+ name = "lite_test_srcs",
+ srcs = [
+ "lite_arena_unittest.cc",
+ "lite_unittest.cc",
+ ],
+ visibility = ["//pkg:__pkg__"],
+)
diff --git a/src/google/protobuf/any.cc b/src/google/protobuf/any.cc
index 346fa19..1f6ef87 100644
--- a/src/google/protobuf/any.cc
+++ b/src/google/protobuf/any.cc
@@ -28,15 +28,15 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/any.h>
+#include "google/protobuf/any.h"
-#include <google/protobuf/arenastring.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/generated_message_util.h>
-#include <google/protobuf/message.h>
+#include "google/protobuf/arenastring.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/generated_message_util.h"
+#include "google/protobuf/message.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -47,7 +47,7 @@
}
bool AnyMetadata::PackFrom(Arena* arena, const Message& message,
- StringPiece type_url_prefix) {
+ absl::string_view type_url_prefix) {
type_url_->Set(
GetTypeUrl(message.GetDescriptor()->full_name(), type_url_prefix), arena);
return message.SerializeToString(value_->Mutable(arena));
@@ -79,4 +79,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/any.h b/src/google/protobuf/any.h
index 92ea2bb..ab71a6c 100644
--- a/src/google/protobuf/any.h
+++ b/src/google/protobuf/any.h
@@ -33,12 +33,12 @@
#include <string>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/arenastring.h>
-#include <google/protobuf/message_lite.h>
+#include "google/protobuf/port.h"
+#include "google/protobuf/arenastring.h"
+#include "google/protobuf/message_lite.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -52,8 +52,8 @@
extern const char kTypeGoogleApisComPrefix[]; // "type.googleapis.com/".
extern const char kTypeGoogleProdComPrefix[]; // "type.googleprod.com/".
-std::string GetTypeUrl(StringPiece message_name,
- StringPiece type_url_prefix);
+std::string GetTypeUrl(absl::string_view message_name,
+ absl::string_view type_url_prefix);
// Helper class used to implement google::protobuf::Any.
class PROTOBUF_EXPORT AnyMetadata {
@@ -63,6 +63,8 @@
// AnyMetadata does not take ownership of "type_url" and "value".
constexpr AnyMetadata(UrlType* type_url, ValueType* value)
: type_url_(type_url), value_(value) {}
+ AnyMetadata(const AnyMetadata&) = delete;
+ AnyMetadata& operator=(const AnyMetadata&) = delete;
// Packs a message using the default type URL prefix: "type.googleapis.com".
// The resulted type URL will be "type.googleapis.com/<message_full_name>".
@@ -84,13 +86,13 @@
// Returns false if serializing the message failed.
template <typename T>
bool PackFrom(Arena* arena, const T& message,
- StringPiece type_url_prefix) {
+ absl::string_view type_url_prefix) {
return InternalPackFrom(arena, message, type_url_prefix,
T::FullMessageName());
}
bool PackFrom(Arena* arena, const Message& message,
- StringPiece type_url_prefix);
+ absl::string_view type_url_prefix);
// Unpacks the payload into the given message. Returns false if the message's
// type doesn't match the type specified in the type URL (i.e., the full
@@ -113,16 +115,14 @@
private:
bool InternalPackFrom(Arena* arena, const MessageLite& message,
- StringPiece type_url_prefix,
- StringPiece type_name);
- bool InternalUnpackTo(StringPiece type_name,
+ absl::string_view type_url_prefix,
+ absl::string_view type_name);
+ bool InternalUnpackTo(absl::string_view type_name,
MessageLite* message) const;
- bool InternalIs(StringPiece type_name) const;
+ bool InternalIs(absl::string_view type_name) const;
UrlType* type_url_;
ValueType* value_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(AnyMetadata);
};
// Get the proto type name from Any::type_url value. For example, passing
@@ -132,14 +132,14 @@
//
// NOTE: this function is available publicly as a static method on the
// generated message type: google::protobuf::Any::ParseAnyTypeUrl()
-bool ParseAnyTypeUrl(StringPiece type_url, std::string* full_type_name);
+bool ParseAnyTypeUrl(absl::string_view type_url, std::string* full_type_name);
// Get the proto type name and prefix from Any::type_url value. For example,
// passing "type.googleapis.com/rpc.QueryOrigin" will return
// "type.googleapis.com/" in *url_prefix and "rpc.QueryOrigin" in
// *full_type_name. Returns false if the type_url does not have a "/" in the
// type url separating the full type name.
-bool ParseAnyTypeUrl(StringPiece type_url, std::string* url_prefix,
+bool ParseAnyTypeUrl(absl::string_view type_url, std::string* url_prefix,
std::string* full_type_name);
// See if message is of type google.protobuf.Any, if so, return the descriptors
@@ -152,6 +152,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_ANY_H__
diff --git a/src/google/protobuf/any.pb.cc b/src/google/protobuf/any.pb.cc
index c02f9eb..514da71 100644
--- a/src/google/protobuf/any.pb.cc
+++ b/src/google/protobuf/any.pb.cc
@@ -1,28 +1,26 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: google/protobuf/any.proto
-#include <google/protobuf/any.pb.h>
+#include "google/protobuf/any.pb.h"
#include <algorithm>
-
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/extension_set.h>
-#include <google/protobuf/wire_format_lite.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/generated_message_reflection.h>
-#include <google/protobuf/reflection_ops.h>
-#include <google/protobuf/wire_format.h>
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/extension_set.h"
+#include "google/protobuf/wire_format_lite.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/generated_message_reflection.h"
+#include "google/protobuf/reflection_ops.h"
+#include "google/protobuf/wire_format.h"
// @@protoc_insertion_point(includes)
-#include <google/protobuf/port_def.inc>
+// Must be included last.
+#include "google/protobuf/port_def.inc"
PROTOBUF_PRAGMA_INIT_SEG
-
namespace _pb = ::PROTOBUF_NAMESPACE_ID;
-namespace _pbi = _pb::internal;
-
+namespace _pbi = ::PROTOBUF_NAMESPACE_ID::internal;
#if defined(__llvm__)
- #pragma clang diagnostic push
- #pragma clang diagnostic ignored "-Wuninitialized"
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wuninitialized"
#endif // __llvm__
PROTOBUF_NAMESPACE_OPEN
PROTOBUF_CONSTEXPR Any::Any(
@@ -32,62 +30,88 @@
, /*decltype(_impl_._cached_size_)*/{}
, /*decltype(_impl_._any_metadata_)*/{&_impl_.type_url_, &_impl_.value_}} {}
struct AnyDefaultTypeInternal {
- PROTOBUF_CONSTEXPR AnyDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR AnyDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~AnyDefaultTypeInternal() {}
union {
Any _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 AnyDefaultTypeInternal _Any_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 AnyDefaultTypeInternal _Any_default_instance_;
PROTOBUF_NAMESPACE_CLOSE
static ::_pb::Metadata file_level_metadata_google_2fprotobuf_2fany_2eproto[1];
-static constexpr ::_pb::EnumDescriptor const** file_level_enum_descriptors_google_2fprotobuf_2fany_2eproto = nullptr;
-static constexpr ::_pb::ServiceDescriptor const** file_level_service_descriptors_google_2fprotobuf_2fany_2eproto = nullptr;
-
-const uint32_t TableStruct_google_2fprotobuf_2fany_2eproto::offsets[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
- ~0u, // no _has_bits_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Any, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Any, _impl_.type_url_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Any, _impl_.value_),
+static constexpr const ::_pb::EnumDescriptor**
+ file_level_enum_descriptors_google_2fprotobuf_2fany_2eproto = nullptr;
+static constexpr const ::_pb::ServiceDescriptor**
+ file_level_service_descriptors_google_2fprotobuf_2fany_2eproto = nullptr;
+const uint32_t TableStruct_google_2fprotobuf_2fany_2eproto::offsets[] PROTOBUF_SECTION_VARIABLE(
+ protodesc_cold) = {
+ ~0u, // no _has_bits_
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Any, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Any, _impl_.type_url_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Any, _impl_.value_),
};
-static const ::_pbi::MigrationSchema schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
- { 0, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::Any)},
+
+static const ::_pbi::MigrationSchema
+ schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
+ { 0, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::Any)},
};
static const ::_pb::Message* const file_default_instances[] = {
- &::PROTOBUF_NAMESPACE_ID::_Any_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_Any_default_instance_._instance,
};
-
-const char descriptor_table_protodef_google_2fprotobuf_2fany_2eproto[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) =
- "\n\031google/protobuf/any.proto\022\017google.prot"
- "obuf\"&\n\003Any\022\020\n\010type_url\030\001 \001(\t\022\r\n\005value\030\002"
- " \001(\014Bv\n\023com.google.protobufB\010AnyProtoP\001Z"
- ",google.golang.org/protobuf/types/known/"
- "anypb\242\002\003GPB\252\002\036Google.Protobuf.WellKnownT"
- "ypesb\006proto3"
- ;
-static ::_pbi::once_flag descriptor_table_google_2fprotobuf_2fany_2eproto_once;
+const char descriptor_table_protodef_google_2fprotobuf_2fany_2eproto[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
+ "\n\031google/protobuf/any.proto\022\017google.prot"
+ "obuf\"&\n\003Any\022\020\n\010type_url\030\001 \001(\t\022\r\n\005value\030\002"
+ " \001(\014Bv\n\023com.google.protobufB\010AnyProtoP\001Z"
+ ",google.golang.org/protobuf/types/known/"
+ "anypb\242\002\003GPB\252\002\036Google.Protobuf.WellKnownT"
+ "ypesb\006proto3"
+};
+static ::absl::once_flag descriptor_table_google_2fprotobuf_2fany_2eproto_once;
const ::_pbi::DescriptorTable descriptor_table_google_2fprotobuf_2fany_2eproto = {
- false, false, 212, descriptor_table_protodef_google_2fprotobuf_2fany_2eproto,
+ false,
+ false,
+ 212,
+ descriptor_table_protodef_google_2fprotobuf_2fany_2eproto,
"google/protobuf/any.proto",
- &descriptor_table_google_2fprotobuf_2fany_2eproto_once, nullptr, 0, 1,
- schemas, file_default_instances, TableStruct_google_2fprotobuf_2fany_2eproto::offsets,
- file_level_metadata_google_2fprotobuf_2fany_2eproto, file_level_enum_descriptors_google_2fprotobuf_2fany_2eproto,
+ &descriptor_table_google_2fprotobuf_2fany_2eproto_once,
+ nullptr,
+ 0,
+ 1,
+ schemas,
+ file_default_instances,
+ TableStruct_google_2fprotobuf_2fany_2eproto::offsets,
+ file_level_metadata_google_2fprotobuf_2fany_2eproto,
+ file_level_enum_descriptors_google_2fprotobuf_2fany_2eproto,
file_level_service_descriptors_google_2fprotobuf_2fany_2eproto,
};
+
+// This function exists to be marked as weak.
+// It can significantly speed up compilation by breaking up LLVM's SCC
+// in the .pb.cc translation units. Large translation units see a
+// reduction of more than 35% of walltime for optimized builds. Without
+// the weak attribute all the messages in the file, including all the
+// vtables and everything they use become part of the same SCC through
+// a cycle like:
+// GetMetadata -> descriptor table -> default instances ->
+// vtables -> GetMetadata
+// By adding a weak function here we break the connection from the
+// individual vtables back into the descriptor table.
PROTOBUF_ATTRIBUTE_WEAK const ::_pbi::DescriptorTable* descriptor_table_google_2fprotobuf_2fany_2eproto_getter() {
return &descriptor_table_google_2fprotobuf_2fany_2eproto;
}
-
// Force running AddDescriptors() at dynamic initialization time.
-PROTOBUF_ATTRIBUTE_INIT_PRIORITY2 static ::_pbi::AddDescriptorsRunner dynamic_init_dummy_google_2fprotobuf_2fany_2eproto(&descriptor_table_google_2fprotobuf_2fany_2eproto);
+PROTOBUF_ATTRIBUTE_INIT_PRIORITY2
+static ::_pbi::AddDescriptorsRunner dynamic_init_dummy_google_2fprotobuf_2fany_2eproto(&descriptor_table_google_2fprotobuf_2fany_2eproto);
PROTOBUF_NAMESPACE_OPEN
-
// ===================================================================
bool Any::GetAnyFieldDescriptors(
@@ -98,7 +122,7 @@
message, type_url_field, value_field);
}
bool Any::ParseAnyTypeUrl(
- ::PROTOBUF_NAMESPACE_ID::ConstStringParam type_url,
+ ::absl::string_view type_url,
std::string* full_type_name) {
return ::_pbi::ParseAnyTypeUrl(type_url, full_type_name);
}
@@ -351,7 +375,6 @@
&descriptor_table_google_2fprotobuf_2fany_2eproto_getter, &descriptor_table_google_2fprotobuf_2fany_2eproto_once,
file_level_metadata_google_2fprotobuf_2fany_2eproto[0]);
}
-
// @@protoc_insertion_point(namespace_scope)
PROTOBUF_NAMESPACE_CLOSE
PROTOBUF_NAMESPACE_OPEN
@@ -360,9 +383,8 @@
return Arena::CreateMessageInternal< ::PROTOBUF_NAMESPACE_ID::Any >(arena);
}
PROTOBUF_NAMESPACE_CLOSE
-
// @@protoc_insertion_point(global_scope)
#if defined(__llvm__)
- #pragma clang diagnostic pop
+#pragma clang diagnostic pop
#endif // __llvm__
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/any.pb.h b/src/google/protobuf/any.pb.h
index a9c35be..01ca595 100644
--- a/src/google/protobuf/any.pb.h
+++ b/src/google/protobuf/any.pb.h
@@ -1,38 +1,43 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: google/protobuf/any.proto
-#ifndef GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fany_2eproto
-#define GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fany_2eproto
+#ifndef GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fany_2eproto_2epb_2eh
+#define GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fany_2eproto_2epb_2eh
#include <limits>
#include <string>
+#include <type_traits>
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
#if PROTOBUF_VERSION < 3021000
-#error This file was generated by a newer version of protoc which is
-#error incompatible with your Protocol Buffer headers. Please update
-#error your headers.
-#endif
-#if 3021007 < PROTOBUF_MIN_PROTOC_VERSION
-#error This file was generated by an older version of protoc which is
-#error incompatible with your Protocol Buffer headers. Please
-#error regenerate this file with a newer version of protoc.
-#endif
+#error "This file was generated by a newer version of protoc which is"
+#error "incompatible with your Protocol Buffer headers. Please update"
+#error "your headers."
+#endif // PROTOBUF_VERSION
-#include <google/protobuf/port_undef.inc>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/arena.h>
-#include <google/protobuf/arenastring.h>
-#include <google/protobuf/generated_message_util.h>
-#include <google/protobuf/metadata_lite.h>
-#include <google/protobuf/generated_message_reflection.h>
-#include <google/protobuf/message.h>
-#include <google/protobuf/repeated_field.h> // IWYU pragma: export
-#include <google/protobuf/extension_set.h> // IWYU pragma: export
-#include <google/protobuf/unknown_field_set.h>
+#if 3021007 < PROTOBUF_MIN_PROTOC_VERSION
+#error "This file was generated by an older version of protoc which is"
+#error "incompatible with your Protocol Buffer headers. Please"
+#error "regenerate this file with a newer version of protoc."
+#endif // PROTOBUF_MIN_PROTOC_VERSION
+#include "google/protobuf/port_undef.inc"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/arena.h"
+#include "google/protobuf/arenastring.h"
+#include "google/protobuf/generated_message_util.h"
+#include "google/protobuf/metadata_lite.h"
+#include "google/protobuf/generated_message_reflection.h"
+#include "google/protobuf/message.h"
+#include "google/protobuf/repeated_field.h" // IWYU pragma: export
+#include "google/protobuf/extension_set.h" // IWYU pragma: export
+#include "google/protobuf/unknown_field_set.h"
// @@protoc_insertion_point(includes)
-#include <google/protobuf/port_def.inc>
+
+// Must be included last.
+#include "google/protobuf/port_def.inc"
+
#define PROTOBUF_INTERNAL_EXPORT_google_2fprotobuf_2fany_2eproto PROTOBUF_EXPORT
+
PROTOBUF_NAMESPACE_OPEN
namespace internal {
class AnyMetadata;
@@ -43,19 +48,23 @@
struct PROTOBUF_EXPORT TableStruct_google_2fprotobuf_2fany_2eproto {
static const uint32_t offsets[];
};
-PROTOBUF_EXPORT extern const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_google_2fprotobuf_2fany_2eproto;
+PROTOBUF_EXPORT extern const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable
+ descriptor_table_google_2fprotobuf_2fany_2eproto;
PROTOBUF_NAMESPACE_OPEN
class Any;
struct AnyDefaultTypeInternal;
PROTOBUF_EXPORT extern AnyDefaultTypeInternal _Any_default_instance_;
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::Any* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::Any>(Arena*);
PROTOBUF_NAMESPACE_CLOSE
-PROTOBUF_NAMESPACE_OPEN
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::Any* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::Any>(Arena*);
-PROTOBUF_NAMESPACE_CLOSE
+
PROTOBUF_NAMESPACE_OPEN
// ===================================================================
+
+// -------------------------------------------------------------------
+
class PROTOBUF_EXPORT Any final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.Any) */ {
public:
@@ -113,7 +122,7 @@
return _impl_._any_metadata_.PackFrom(GetArena(), message);
}
bool PackFrom(const ::PROTOBUF_NAMESPACE_ID::Message& message,
- ::PROTOBUF_NAMESPACE_ID::ConstStringParam type_url_prefix) {
+ ::absl::string_view type_url_prefix) {
GOOGLE_DCHECK_NE(&message, this);
return _impl_._any_metadata_.PackFrom(GetArena(), message, type_url_prefix);
}
@@ -130,7 +139,7 @@
}
template <typename T, class = typename std::enable_if<!std::is_convertible<T, const ::PROTOBUF_NAMESPACE_ID::Message&>::value>::type>
bool PackFrom(const T& message,
- ::PROTOBUF_NAMESPACE_ID::ConstStringParam type_url_prefix) {
+ ::absl::string_view type_url_prefix) {
return _impl_._any_metadata_.PackFrom<T>(GetArena(), message, type_url_prefix);}
template <typename T, class = typename std::enable_if<!std::is_convertible<T, const ::PROTOBUF_NAMESPACE_ID::Message&>::value>::type>
bool UnpackTo(T* message) const {
@@ -139,7 +148,7 @@
template<typename T> bool Is() const {
return _impl_._any_metadata_.Is<T>();
}
- static bool ParseAnyTypeUrl(::PROTOBUF_NAMESPACE_ID::ConstStringParam type_url,
+ static bool ParseAnyTypeUrl(::absl::string_view type_url,
std::string* full_type_name);
friend void swap(Any& a, Any& b) {
a.Swap(&b);
@@ -194,7 +203,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.Any";
}
protected:
@@ -262,12 +271,17 @@
// ===================================================================
+
+
// ===================================================================
+
#ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wstrict-aliasing"
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wstrict-aliasing"
#endif // __GNUC__
+// -------------------------------------------------------------------
+
// Any
// string type_url = 1;
@@ -294,11 +308,11 @@
return _impl_.type_url_.Get();
}
inline void Any::_internal_set_type_url(const std::string& value) {
-
+
_impl_.type_url_.Set(value, GetArenaForAllocation());
}
inline std::string* Any::_internal_mutable_type_url() {
-
+
return _impl_.type_url_.Mutable(GetArenaForAllocation());
}
inline std::string* Any::release_type_url() {
@@ -307,9 +321,9 @@
}
inline void Any::set_allocated_type_url(std::string* type_url) {
if (type_url != nullptr) {
-
+
} else {
-
+
}
_impl_.type_url_.SetAllocated(type_url, GetArenaForAllocation());
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
@@ -344,11 +358,11 @@
return _impl_.value_.Get();
}
inline void Any::_internal_set_value(const std::string& value) {
-
+
_impl_.value_.Set(value, GetArenaForAllocation());
}
inline std::string* Any::_internal_mutable_value() {
-
+
return _impl_.value_.Mutable(GetArenaForAllocation());
}
inline std::string* Any::release_value() {
@@ -357,9 +371,9 @@
}
inline void Any::set_allocated_value(std::string* value) {
if (value != nullptr) {
-
+
} else {
-
+
}
_impl_.value_.SetAllocated(value, GetArenaForAllocation());
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
@@ -371,14 +385,15 @@
}
#ifdef __GNUC__
- #pragma GCC diagnostic pop
+#pragma GCC diagnostic pop
#endif // __GNUC__
// @@protoc_insertion_point(namespace_scope)
-
PROTOBUF_NAMESPACE_CLOSE
+
// @@protoc_insertion_point(global_scope)
-#include <google/protobuf/port_undef.inc>
-#endif // GOOGLE_PROTOBUF_INCLUDED_GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fany_2eproto
+#include "google/protobuf/port_undef.inc"
+
+#endif // GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fany_2eproto_2epb_2eh
diff --git a/src/google/protobuf/any_lite.cc b/src/google/protobuf/any_lite.cc
index f283a31..a15d19f 100644
--- a/src/google/protobuf/any_lite.cc
+++ b/src/google/protobuf/any_lite.cc
@@ -28,23 +28,24 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/any.h>
-#include <google/protobuf/arenastring.h>
-#include <google/protobuf/generated_message_util.h>
+#include "google/protobuf/io/zero_copy_stream_impl_lite.h"
+#include "absl/strings/match.h"
+#include "absl/strings/str_cat.h"
+#include "google/protobuf/any.h"
+#include "google/protobuf/arenastring.h"
+#include "google/protobuf/generated_message_util.h"
namespace google {
namespace protobuf {
namespace internal {
-std::string GetTypeUrl(StringPiece message_name,
- StringPiece type_url_prefix) {
+std::string GetTypeUrl(absl::string_view message_name,
+ absl::string_view type_url_prefix) {
if (!type_url_prefix.empty() &&
type_url_prefix[type_url_prefix.size() - 1] == '/') {
- return StrCat(type_url_prefix, message_name);
+ return absl::StrCat(type_url_prefix, message_name);
} else {
- return StrCat(type_url_prefix, "/", message_name);
+ return absl::StrCat(type_url_prefix, "/", message_name);
}
}
@@ -53,13 +54,13 @@
const char kTypeGoogleProdComPrefix[] = "type.googleprod.com/";
bool AnyMetadata::InternalPackFrom(Arena* arena, const MessageLite& message,
- StringPiece type_url_prefix,
- StringPiece type_name) {
+ absl::string_view type_url_prefix,
+ absl::string_view type_name) {
type_url_->Set(GetTypeUrl(type_name, type_url_prefix), arena);
return message.SerializeToString(value_->Mutable(arena));
}
-bool AnyMetadata::InternalUnpackTo(StringPiece type_name,
+bool AnyMetadata::InternalUnpackTo(absl::string_view type_name,
MessageLite* message) const {
if (!InternalIs(type_name)) {
return false;
@@ -67,14 +68,14 @@
return message->ParseFromString(value_->Get());
}
-bool AnyMetadata::InternalIs(StringPiece type_name) const {
- StringPiece type_url = type_url_->Get();
+bool AnyMetadata::InternalIs(absl::string_view type_name) const {
+ absl::string_view type_url = type_url_->Get();
return type_url.size() >= type_name.size() + 1 &&
type_url[type_url.size() - type_name.size() - 1] == '/' &&
- HasSuffixString(type_url, type_name);
+ absl::EndsWith(type_url, type_name);
}
-bool ParseAnyTypeUrl(StringPiece type_url, std::string* url_prefix,
+bool ParseAnyTypeUrl(absl::string_view type_url, std::string* url_prefix,
std::string* full_type_name) {
size_t pos = type_url.find_last_of('/');
if (pos == std::string::npos || pos + 1 == type_url.size()) {
@@ -87,7 +88,7 @@
return true;
}
-bool ParseAnyTypeUrl(StringPiece type_url, std::string* full_type_name) {
+bool ParseAnyTypeUrl(absl::string_view type_url, std::string* full_type_name) {
return ParseAnyTypeUrl(type_url, nullptr, full_type_name);
}
diff --git a/src/google/protobuf/any_test.cc b/src/google/protobuf/any_test.cc
index a82afb2..7e6ecb2 100644
--- a/src/google/protobuf/any_test.cc
+++ b/src/google/protobuf/any_test.cc
@@ -28,13 +28,14 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/any_test.pb.h>
-#include <google/protobuf/unittest.pb.h>
+#include "google/protobuf/any_test.pb.h"
+#include "google/protobuf/unittest.pb.h"
#include <gtest/gtest.h>
+#include "absl/strings/str_cat.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -191,4 +192,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/api.pb.cc b/src/google/protobuf/api.pb.cc
index 24b6049..865bf59 100644
--- a/src/google/protobuf/api.pb.cc
+++ b/src/google/protobuf/api.pb.cc
@@ -1,25 +1,23 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: google/protobuf/api.proto
-#include <google/protobuf/api.pb.h>
+#include "google/protobuf/api.pb.h"
#include <algorithm>
-
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/extension_set.h>
-#include <google/protobuf/wire_format_lite.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/generated_message_reflection.h>
-#include <google/protobuf/reflection_ops.h>
-#include <google/protobuf/wire_format.h>
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/extension_set.h"
+#include "google/protobuf/wire_format_lite.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/generated_message_reflection.h"
+#include "google/protobuf/reflection_ops.h"
+#include "google/protobuf/wire_format.h"
// @@protoc_insertion_point(includes)
-#include <google/protobuf/port_def.inc>
+// Must be included last.
+#include "google/protobuf/port_def.inc"
PROTOBUF_PRAGMA_INIT_SEG
-
namespace _pb = ::PROTOBUF_NAMESPACE_ID;
-namespace _pbi = _pb::internal;
-
+namespace _pbi = ::PROTOBUF_NAMESPACE_ID::internal;
PROTOBUF_NAMESPACE_OPEN
PROTOBUF_CONSTEXPR Api::Api(
::_pbi::ConstantInitialized): _impl_{
@@ -32,14 +30,15 @@
, /*decltype(_impl_.syntax_)*/0
, /*decltype(_impl_._cached_size_)*/{}} {}
struct ApiDefaultTypeInternal {
- PROTOBUF_CONSTEXPR ApiDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR ApiDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~ApiDefaultTypeInternal() {}
union {
Api _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 ApiDefaultTypeInternal _Api_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 ApiDefaultTypeInternal _Api_default_instance_;
PROTOBUF_CONSTEXPR Method::Method(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_.options_)*/{}
@@ -51,123 +50,155 @@
, /*decltype(_impl_.syntax_)*/0
, /*decltype(_impl_._cached_size_)*/{}} {}
struct MethodDefaultTypeInternal {
- PROTOBUF_CONSTEXPR MethodDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR MethodDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~MethodDefaultTypeInternal() {}
union {
Method _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 MethodDefaultTypeInternal _Method_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 MethodDefaultTypeInternal _Method_default_instance_;
PROTOBUF_CONSTEXPR Mixin::Mixin(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_.name_)*/{&::_pbi::fixed_address_empty_string, ::_pbi::ConstantInitialized{}}
, /*decltype(_impl_.root_)*/{&::_pbi::fixed_address_empty_string, ::_pbi::ConstantInitialized{}}
, /*decltype(_impl_._cached_size_)*/{}} {}
struct MixinDefaultTypeInternal {
- PROTOBUF_CONSTEXPR MixinDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR MixinDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~MixinDefaultTypeInternal() {}
union {
Mixin _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 MixinDefaultTypeInternal _Mixin_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 MixinDefaultTypeInternal _Mixin_default_instance_;
PROTOBUF_NAMESPACE_CLOSE
static ::_pb::Metadata file_level_metadata_google_2fprotobuf_2fapi_2eproto[3];
-static constexpr ::_pb::EnumDescriptor const** file_level_enum_descriptors_google_2fprotobuf_2fapi_2eproto = nullptr;
-static constexpr ::_pb::ServiceDescriptor const** file_level_service_descriptors_google_2fprotobuf_2fapi_2eproto = nullptr;
-
-const uint32_t TableStruct_google_2fprotobuf_2fapi_2eproto::offsets[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
- ~0u, // no _has_bits_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Api, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Api, _impl_.name_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Api, _impl_.methods_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Api, _impl_.options_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Api, _impl_.version_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Api, _impl_.source_context_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Api, _impl_.mixins_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Api, _impl_.syntax_),
- ~0u, // no _has_bits_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Method, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Method, _impl_.name_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Method, _impl_.request_type_url_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Method, _impl_.request_streaming_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Method, _impl_.response_type_url_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Method, _impl_.response_streaming_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Method, _impl_.options_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Method, _impl_.syntax_),
- ~0u, // no _has_bits_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Mixin, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Mixin, _impl_.name_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Mixin, _impl_.root_),
+static constexpr const ::_pb::EnumDescriptor**
+ file_level_enum_descriptors_google_2fprotobuf_2fapi_2eproto = nullptr;
+static constexpr const ::_pb::ServiceDescriptor**
+ file_level_service_descriptors_google_2fprotobuf_2fapi_2eproto = nullptr;
+const uint32_t TableStruct_google_2fprotobuf_2fapi_2eproto::offsets[] PROTOBUF_SECTION_VARIABLE(
+ protodesc_cold) = {
+ ~0u, // no _has_bits_
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Api, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Api, _impl_.name_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Api, _impl_.methods_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Api, _impl_.options_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Api, _impl_.version_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Api, _impl_.source_context_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Api, _impl_.mixins_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Api, _impl_.syntax_),
+ ~0u, // no _has_bits_
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Method, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Method, _impl_.name_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Method, _impl_.request_type_url_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Method, _impl_.request_streaming_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Method, _impl_.response_type_url_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Method, _impl_.response_streaming_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Method, _impl_.options_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Method, _impl_.syntax_),
+ ~0u, // no _has_bits_
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Mixin, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Mixin, _impl_.name_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Mixin, _impl_.root_),
};
-static const ::_pbi::MigrationSchema schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
- { 0, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::Api)},
- { 13, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::Method)},
- { 26, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::Mixin)},
+
+static const ::_pbi::MigrationSchema
+ schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
+ { 0, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::Api)},
+ { 15, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::Method)},
+ { 30, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::Mixin)},
};
static const ::_pb::Message* const file_default_instances[] = {
- &::PROTOBUF_NAMESPACE_ID::_Api_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::_Method_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::_Mixin_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_Api_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_Method_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_Mixin_default_instance_._instance,
};
-
-const char descriptor_table_protodef_google_2fprotobuf_2fapi_2eproto[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) =
- "\n\031google/protobuf/api.proto\022\017google.prot"
- "obuf\032$google/protobuf/source_context.pro"
- "to\032\032google/protobuf/type.proto\"\201\002\n\003Api\022\014"
- "\n\004name\030\001 \001(\t\022(\n\007methods\030\002 \003(\0132\027.google.p"
- "rotobuf.Method\022(\n\007options\030\003 \003(\0132\027.google"
- ".protobuf.Option\022\017\n\007version\030\004 \001(\t\0226\n\016sou"
- "rce_context\030\005 \001(\0132\036.google.protobuf.Sour"
- "ceContext\022&\n\006mixins\030\006 \003(\0132\026.google.proto"
- "buf.Mixin\022\'\n\006syntax\030\007 \001(\0162\027.google.proto"
- "buf.Syntax\"\325\001\n\006Method\022\014\n\004name\030\001 \001(\t\022\030\n\020r"
- "equest_type_url\030\002 \001(\t\022\031\n\021request_streami"
- "ng\030\003 \001(\010\022\031\n\021response_type_url\030\004 \001(\t\022\032\n\022r"
- "esponse_streaming\030\005 \001(\010\022(\n\007options\030\006 \003(\013"
- "2\027.google.protobuf.Option\022\'\n\006syntax\030\007 \001("
- "\0162\027.google.protobuf.Syntax\"#\n\005Mixin\022\014\n\004n"
- "ame\030\001 \001(\t\022\014\n\004root\030\002 \001(\tBv\n\023com.google.pr"
- "otobufB\010ApiProtoP\001Z,google.golang.org/pr"
- "otobuf/types/known/apipb\242\002\003GPB\252\002\036Google."
- "Protobuf.WellKnownTypesb\006proto3"
- ;
-static const ::_pbi::DescriptorTable* const descriptor_table_google_2fprotobuf_2fapi_2eproto_deps[2] = {
- &::descriptor_table_google_2fprotobuf_2fsource_5fcontext_2eproto,
- &::descriptor_table_google_2fprotobuf_2ftype_2eproto,
+const char descriptor_table_protodef_google_2fprotobuf_2fapi_2eproto[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
+ "\n\031google/protobuf/api.proto\022\017google.prot"
+ "obuf\032$google/protobuf/source_context.pro"
+ "to\032\032google/protobuf/type.proto\"\201\002\n\003Api\022\014"
+ "\n\004name\030\001 \001(\t\022(\n\007methods\030\002 \003(\0132\027.google.p"
+ "rotobuf.Method\022(\n\007options\030\003 \003(\0132\027.google"
+ ".protobuf.Option\022\017\n\007version\030\004 \001(\t\0226\n\016sou"
+ "rce_context\030\005 \001(\0132\036.google.protobuf.Sour"
+ "ceContext\022&\n\006mixins\030\006 \003(\0132\026.google.proto"
+ "buf.Mixin\022\'\n\006syntax\030\007 \001(\0162\027.google.proto"
+ "buf.Syntax\"\325\001\n\006Method\022\014\n\004name\030\001 \001(\t\022\030\n\020r"
+ "equest_type_url\030\002 \001(\t\022\031\n\021request_streami"
+ "ng\030\003 \001(\010\022\031\n\021response_type_url\030\004 \001(\t\022\032\n\022r"
+ "esponse_streaming\030\005 \001(\010\022(\n\007options\030\006 \003(\013"
+ "2\027.google.protobuf.Option\022\'\n\006syntax\030\007 \001("
+ "\0162\027.google.protobuf.Syntax\"#\n\005Mixin\022\014\n\004n"
+ "ame\030\001 \001(\t\022\014\n\004root\030\002 \001(\tBv\n\023com.google.pr"
+ "otobufB\010ApiProtoP\001Z,google.golang.org/pr"
+ "otobuf/types/known/apipb\242\002\003GPB\252\002\036Google."
+ "Protobuf.WellKnownTypesb\006proto3"
};
-static ::_pbi::once_flag descriptor_table_google_2fprotobuf_2fapi_2eproto_once;
+static const ::_pbi::DescriptorTable* const descriptor_table_google_2fprotobuf_2fapi_2eproto_deps[2] =
+ {
+ &::descriptor_table_google_2fprotobuf_2fsource_5fcontext_2eproto,
+ &::descriptor_table_google_2fprotobuf_2ftype_2eproto,
+};
+static ::absl::once_flag descriptor_table_google_2fprotobuf_2fapi_2eproto_once;
const ::_pbi::DescriptorTable descriptor_table_google_2fprotobuf_2fapi_2eproto = {
- false, false, 751, descriptor_table_protodef_google_2fprotobuf_2fapi_2eproto,
+ false,
+ false,
+ 751,
+ descriptor_table_protodef_google_2fprotobuf_2fapi_2eproto,
"google/protobuf/api.proto",
- &descriptor_table_google_2fprotobuf_2fapi_2eproto_once, descriptor_table_google_2fprotobuf_2fapi_2eproto_deps, 2, 3,
- schemas, file_default_instances, TableStruct_google_2fprotobuf_2fapi_2eproto::offsets,
- file_level_metadata_google_2fprotobuf_2fapi_2eproto, file_level_enum_descriptors_google_2fprotobuf_2fapi_2eproto,
+ &descriptor_table_google_2fprotobuf_2fapi_2eproto_once,
+ descriptor_table_google_2fprotobuf_2fapi_2eproto_deps,
+ 2,
+ 3,
+ schemas,
+ file_default_instances,
+ TableStruct_google_2fprotobuf_2fapi_2eproto::offsets,
+ file_level_metadata_google_2fprotobuf_2fapi_2eproto,
+ file_level_enum_descriptors_google_2fprotobuf_2fapi_2eproto,
file_level_service_descriptors_google_2fprotobuf_2fapi_2eproto,
};
+
+// This function exists to be marked as weak.
+// It can significantly speed up compilation by breaking up LLVM's SCC
+// in the .pb.cc translation units. Large translation units see a
+// reduction of more than 35% of walltime for optimized builds. Without
+// the weak attribute all the messages in the file, including all the
+// vtables and everything they use become part of the same SCC through
+// a cycle like:
+// GetMetadata -> descriptor table -> default instances ->
+// vtables -> GetMetadata
+// By adding a weak function here we break the connection from the
+// individual vtables back into the descriptor table.
PROTOBUF_ATTRIBUTE_WEAK const ::_pbi::DescriptorTable* descriptor_table_google_2fprotobuf_2fapi_2eproto_getter() {
return &descriptor_table_google_2fprotobuf_2fapi_2eproto;
}
-
// Force running AddDescriptors() at dynamic initialization time.
-PROTOBUF_ATTRIBUTE_INIT_PRIORITY2 static ::_pbi::AddDescriptorsRunner dynamic_init_dummy_google_2fprotobuf_2fapi_2eproto(&descriptor_table_google_2fprotobuf_2fapi_2eproto);
+PROTOBUF_ATTRIBUTE_INIT_PRIORITY2
+static ::_pbi::AddDescriptorsRunner dynamic_init_dummy_google_2fprotobuf_2fapi_2eproto(&descriptor_table_google_2fprotobuf_2fapi_2eproto);
PROTOBUF_NAMESPACE_OPEN
-
// ===================================================================
class Api::_Internal {
@@ -373,7 +404,7 @@
// .google.protobuf.Syntax syntax = 7;
case 7:
if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 56)) {
- uint64_t val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr);
+ uint32_t val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr);
CHK_(ptr);
_internal_set_syntax(static_cast<::PROTOBUF_NAMESPACE_ID::Syntax>(val));
} else
@@ -607,7 +638,6 @@
&descriptor_table_google_2fprotobuf_2fapi_2eproto_getter, &descriptor_table_google_2fprotobuf_2fapi_2eproto_once,
file_level_metadata_google_2fprotobuf_2fapi_2eproto[0]);
}
-
// ===================================================================
class Method::_Internal {
@@ -800,7 +830,7 @@
// .google.protobuf.Syntax syntax = 7;
case 7:
if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 56)) {
- uint64_t val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr);
+ uint32_t val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr);
CHK_(ptr);
_internal_set_syntax(static_cast<::PROTOBUF_NAMESPACE_ID::Syntax>(val));
} else
@@ -1034,7 +1064,6 @@
&descriptor_table_google_2fprotobuf_2fapi_2eproto_getter, &descriptor_table_google_2fprotobuf_2fapi_2eproto_once,
file_level_metadata_google_2fprotobuf_2fapi_2eproto[1]);
}
-
// ===================================================================
class Mixin::_Internal {
@@ -1287,7 +1316,6 @@
&descriptor_table_google_2fprotobuf_2fapi_2eproto_getter, &descriptor_table_google_2fprotobuf_2fapi_2eproto_once,
file_level_metadata_google_2fprotobuf_2fapi_2eproto[2]);
}
-
// @@protoc_insertion_point(namespace_scope)
PROTOBUF_NAMESPACE_CLOSE
PROTOBUF_NAMESPACE_OPEN
@@ -1304,6 +1332,5 @@
return Arena::CreateMessageInternal< ::PROTOBUF_NAMESPACE_ID::Mixin >(arena);
}
PROTOBUF_NAMESPACE_CLOSE
-
// @@protoc_insertion_point(global_scope)
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/api.pb.h b/src/google/protobuf/api.pb.h
index c88f6d2..20c1f5a 100644
--- a/src/google/protobuf/api.pb.h
+++ b/src/google/protobuf/api.pb.h
@@ -1,40 +1,45 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: google/protobuf/api.proto
-#ifndef GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fapi_2eproto
-#define GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fapi_2eproto
+#ifndef GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fapi_2eproto_2epb_2eh
+#define GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fapi_2eproto_2epb_2eh
#include <limits>
#include <string>
+#include <type_traits>
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
#if PROTOBUF_VERSION < 3021000
-#error This file was generated by a newer version of protoc which is
-#error incompatible with your Protocol Buffer headers. Please update
-#error your headers.
-#endif
-#if 3021007 < PROTOBUF_MIN_PROTOC_VERSION
-#error This file was generated by an older version of protoc which is
-#error incompatible with your Protocol Buffer headers. Please
-#error regenerate this file with a newer version of protoc.
-#endif
+#error "This file was generated by a newer version of protoc which is"
+#error "incompatible with your Protocol Buffer headers. Please update"
+#error "your headers."
+#endif // PROTOBUF_VERSION
-#include <google/protobuf/port_undef.inc>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/arena.h>
-#include <google/protobuf/arenastring.h>
-#include <google/protobuf/generated_message_util.h>
-#include <google/protobuf/metadata_lite.h>
-#include <google/protobuf/generated_message_reflection.h>
-#include <google/protobuf/message.h>
-#include <google/protobuf/repeated_field.h> // IWYU pragma: export
-#include <google/protobuf/extension_set.h> // IWYU pragma: export
-#include <google/protobuf/unknown_field_set.h>
-#include <google/protobuf/source_context.pb.h>
-#include <google/protobuf/type.pb.h>
+#if 3021007 < PROTOBUF_MIN_PROTOC_VERSION
+#error "This file was generated by an older version of protoc which is"
+#error "incompatible with your Protocol Buffer headers. Please"
+#error "regenerate this file with a newer version of protoc."
+#endif // PROTOBUF_MIN_PROTOC_VERSION
+#include "google/protobuf/port_undef.inc"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/arena.h"
+#include "google/protobuf/arenastring.h"
+#include "google/protobuf/generated_message_util.h"
+#include "google/protobuf/metadata_lite.h"
+#include "google/protobuf/generated_message_reflection.h"
+#include "google/protobuf/message.h"
+#include "google/protobuf/repeated_field.h" // IWYU pragma: export
+#include "google/protobuf/extension_set.h" // IWYU pragma: export
+#include "google/protobuf/unknown_field_set.h"
+#include "google/protobuf/source_context.pb.h"
+#include "google/protobuf/type.pb.h"
// @@protoc_insertion_point(includes)
-#include <google/protobuf/port_def.inc>
+
+// Must be included last.
+#include "google/protobuf/port_def.inc"
+
#define PROTOBUF_INTERNAL_EXPORT_google_2fprotobuf_2fapi_2eproto PROTOBUF_EXPORT
+
PROTOBUF_NAMESPACE_OPEN
namespace internal {
class AnyMetadata;
@@ -45,7 +50,8 @@
struct PROTOBUF_EXPORT TableStruct_google_2fprotobuf_2fapi_2eproto {
static const uint32_t offsets[];
};
-PROTOBUF_EXPORT extern const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_google_2fprotobuf_2fapi_2eproto;
+PROTOBUF_EXPORT extern const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable
+ descriptor_table_google_2fprotobuf_2fapi_2eproto;
PROTOBUF_NAMESPACE_OPEN
class Api;
struct ApiDefaultTypeInternal;
@@ -56,16 +62,21 @@
class Mixin;
struct MixinDefaultTypeInternal;
PROTOBUF_EXPORT extern MixinDefaultTypeInternal _Mixin_default_instance_;
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::Api* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::Api>(Arena*);
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::Method* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::Method>(Arena*);
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::Mixin* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::Mixin>(Arena*);
PROTOBUF_NAMESPACE_CLOSE
-PROTOBUF_NAMESPACE_OPEN
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::Api* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::Api>(Arena*);
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::Method* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::Method>(Arena*);
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::Mixin* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::Mixin>(Arena*);
-PROTOBUF_NAMESPACE_CLOSE
+
PROTOBUF_NAMESPACE_OPEN
// ===================================================================
+
+// -------------------------------------------------------------------
+
class PROTOBUF_EXPORT Api final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.Api) */ {
public:
@@ -169,7 +180,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.Api";
}
protected:
@@ -323,8 +334,7 @@
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2fapi_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOBUF_EXPORT Method final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.Method) */ {
@@ -429,7 +439,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.Method";
}
protected:
@@ -561,8 +571,7 @@
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2fapi_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOBUF_EXPORT Mixin final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.Mixin) */ {
@@ -667,7 +676,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.Mixin";
}
protected:
@@ -734,12 +743,17 @@
// ===================================================================
+
+
// ===================================================================
+
#ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wstrict-aliasing"
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wstrict-aliasing"
#endif // __GNUC__
+// -------------------------------------------------------------------
+
// Api
// string name = 1;
@@ -766,11 +780,11 @@
return _impl_.name_.Get();
}
inline void Api::_internal_set_name(const std::string& value) {
-
+
_impl_.name_.Set(value, GetArenaForAllocation());
}
inline std::string* Api::_internal_mutable_name() {
-
+
return _impl_.name_.Mutable(GetArenaForAllocation());
}
inline std::string* Api::release_name() {
@@ -779,9 +793,9 @@
}
inline void Api::set_allocated_name(std::string* name) {
if (name != nullptr) {
-
+
} else {
-
+
}
_impl_.name_.SetAllocated(name, GetArenaForAllocation());
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
@@ -893,11 +907,11 @@
return _impl_.version_.Get();
}
inline void Api::_internal_set_version(const std::string& value) {
-
+
_impl_.version_.Set(value, GetArenaForAllocation());
}
inline std::string* Api::_internal_mutable_version() {
-
+
return _impl_.version_.Mutable(GetArenaForAllocation());
}
inline std::string* Api::release_version() {
@@ -906,9 +920,9 @@
}
inline void Api::set_allocated_version(std::string* version) {
if (version != nullptr) {
-
+
} else {
-
+
}
_impl_.version_.SetAllocated(version, GetArenaForAllocation());
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
@@ -942,9 +956,9 @@
}
_impl_.source_context_ = source_context;
if (source_context) {
-
+
} else {
-
+
}
// @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.Api.source_context)
}
@@ -996,9 +1010,9 @@
source_context = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage(
message_arena, source_context, submessage_arena);
}
-
+
} else {
-
+
}
_impl_.source_context_ = source_context;
// @@protoc_insertion_point(field_set_allocated:google.protobuf.Api.source_context)
@@ -1092,11 +1106,11 @@
return _impl_.name_.Get();
}
inline void Method::_internal_set_name(const std::string& value) {
-
+
_impl_.name_.Set(value, GetArenaForAllocation());
}
inline std::string* Method::_internal_mutable_name() {
-
+
return _impl_.name_.Mutable(GetArenaForAllocation());
}
inline std::string* Method::release_name() {
@@ -1105,9 +1119,9 @@
}
inline void Method::set_allocated_name(std::string* name) {
if (name != nullptr) {
-
+
} else {
-
+
}
_impl_.name_.SetAllocated(name, GetArenaForAllocation());
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
@@ -1142,11 +1156,11 @@
return _impl_.request_type_url_.Get();
}
inline void Method::_internal_set_request_type_url(const std::string& value) {
-
+
_impl_.request_type_url_.Set(value, GetArenaForAllocation());
}
inline std::string* Method::_internal_mutable_request_type_url() {
-
+
return _impl_.request_type_url_.Mutable(GetArenaForAllocation());
}
inline std::string* Method::release_request_type_url() {
@@ -1155,9 +1169,9 @@
}
inline void Method::set_allocated_request_type_url(std::string* request_type_url) {
if (request_type_url != nullptr) {
-
+
} else {
-
+
}
_impl_.request_type_url_.SetAllocated(request_type_url, GetArenaForAllocation());
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
@@ -1180,7 +1194,7 @@
return _internal_request_streaming();
}
inline void Method::_internal_set_request_streaming(bool value) {
-
+
_impl_.request_streaming_ = value;
}
inline void Method::set_request_streaming(bool value) {
@@ -1212,11 +1226,11 @@
return _impl_.response_type_url_.Get();
}
inline void Method::_internal_set_response_type_url(const std::string& value) {
-
+
_impl_.response_type_url_.Set(value, GetArenaForAllocation());
}
inline std::string* Method::_internal_mutable_response_type_url() {
-
+
return _impl_.response_type_url_.Mutable(GetArenaForAllocation());
}
inline std::string* Method::release_response_type_url() {
@@ -1225,9 +1239,9 @@
}
inline void Method::set_allocated_response_type_url(std::string* response_type_url) {
if (response_type_url != nullptr) {
-
+
} else {
-
+
}
_impl_.response_type_url_.SetAllocated(response_type_url, GetArenaForAllocation());
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
@@ -1250,7 +1264,7 @@
return _internal_response_streaming();
}
inline void Method::_internal_set_response_streaming(bool value) {
-
+
_impl_.response_streaming_ = value;
}
inline void Method::set_response_streaming(bool value) {
@@ -1343,11 +1357,11 @@
return _impl_.name_.Get();
}
inline void Mixin::_internal_set_name(const std::string& value) {
-
+
_impl_.name_.Set(value, GetArenaForAllocation());
}
inline std::string* Mixin::_internal_mutable_name() {
-
+
return _impl_.name_.Mutable(GetArenaForAllocation());
}
inline std::string* Mixin::release_name() {
@@ -1356,9 +1370,9 @@
}
inline void Mixin::set_allocated_name(std::string* name) {
if (name != nullptr) {
-
+
} else {
-
+
}
_impl_.name_.SetAllocated(name, GetArenaForAllocation());
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
@@ -1393,11 +1407,11 @@
return _impl_.root_.Get();
}
inline void Mixin::_internal_set_root(const std::string& value) {
-
+
_impl_.root_.Set(value, GetArenaForAllocation());
}
inline std::string* Mixin::_internal_mutable_root() {
-
+
return _impl_.root_.Mutable(GetArenaForAllocation());
}
inline std::string* Mixin::release_root() {
@@ -1406,9 +1420,9 @@
}
inline void Mixin::set_allocated_root(std::string* root) {
if (root != nullptr) {
-
+
} else {
-
+
}
_impl_.root_.SetAllocated(root, GetArenaForAllocation());
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
@@ -1420,18 +1434,15 @@
}
#ifdef __GNUC__
- #pragma GCC diagnostic pop
+#pragma GCC diagnostic pop
#endif // __GNUC__
-// -------------------------------------------------------------------
-
-// -------------------------------------------------------------------
-
// @@protoc_insertion_point(namespace_scope)
-
PROTOBUF_NAMESPACE_CLOSE
+
// @@protoc_insertion_point(global_scope)
-#include <google/protobuf/port_undef.inc>
-#endif // GOOGLE_PROTOBUF_INCLUDED_GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fapi_2eproto
+#include "google/protobuf/port_undef.inc"
+
+#endif // GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fapi_2eproto_2epb_2eh
diff --git a/src/google/protobuf/arena.cc b/src/google/protobuf/arena.cc
index 6ba508a..49591ab 100644
--- a/src/google/protobuf/arena.cc
+++ b/src/google/protobuf/arena.cc
@@ -28,7 +28,7 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/arena.h>
+#include "google/protobuf/arena.h"
#include <algorithm>
#include <atomic>
@@ -37,21 +37,33 @@
#include <limits>
#include <typeinfo>
-#include <google/protobuf/arena_impl.h>
-#include <google/protobuf/arenaz_sampler.h>
-#include <google/protobuf/port.h>
+#include "absl/synchronization/mutex.h"
+#include "google/protobuf/arena_impl.h"
+#include "google/protobuf/arenaz_sampler.h"
+#include "google/protobuf/port.h"
-#include <google/protobuf/stubs/mutex.h>
+
#ifdef ADDRESS_SANITIZER
#include <sanitizer/asan_interface.h>
#endif // ADDRESS_SANITIZER
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
namespace internal {
+namespace {
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT ArenaBlock
+ kSentryArenaBlock = {};
+
+ArenaBlock* SentryArenaBlock() {
+ // const_cast<> is okay as kSentryArenaBlock will never be mutated.
+ return const_cast<ArenaBlock*>(&kSentryArenaBlock);
+}
+
+} // namespace
static SerialArena::Memory AllocateMemory(const AllocationPolicy* policy_ptr,
size_t last_size, size_t min_bytes) {
@@ -104,107 +116,343 @@
size_t* space_allocated_;
};
-SerialArena::SerialArena(Block* b, void* owner, ThreadSafeArenaStats* stats)
- : space_allocated_(b->size) {
- owner_ = owner;
- head_ = b;
- ptr_ = b->Pointer(kBlockHeaderSize + ThreadSafeArena::kSerialArenaSize);
- limit_ = b->Pointer(b->size & static_cast<size_t>(-8));
- arena_stats_ = stats;
+// It is guaranteed that this is constructed in `b`. IOW, this is not the first
+// arena and `b` cannot be sentry.
+SerialArena::SerialArena(ArenaBlock* b, ThreadSafeArena& parent)
+ : ptr_{b->Pointer(kBlockHeaderSize + ThreadSafeArena::kSerialArenaSize)},
+ limit_{b->Limit()},
+ head_{b},
+ space_allocated_{b->size()},
+ parent_{parent} {
+ GOOGLE_DCHECK(!b->IsSentry());
}
-SerialArena* SerialArena::New(Memory mem, void* owner,
- ThreadSafeArenaStats* stats) {
+// It is guaranteed that this is the first SerialArena. Use sentry block.
+SerialArena::SerialArena(ThreadSafeArena& parent)
+ : head_{SentryArenaBlock()}, parent_{parent} {}
+
+// It is guaranteed that this is the first SerialArena but `b` may be user
+// provided or newly allocated to store AllocationPolicy.
+SerialArena::SerialArena(FirstSerialArena, ArenaBlock* b,
+ ThreadSafeArena& parent)
+ : head_{b}, space_allocated_{b->size()}, parent_{parent} {
+ if (b->IsSentry()) return;
+
+ set_ptr(b->Pointer(kBlockHeaderSize));
+ limit_ = b->Limit();
+}
+
+void SerialArena::Init(ArenaBlock* b, size_t offset) {
+ set_ptr(b->Pointer(offset));
+ limit_ = b->Limit();
+ set_head(b);
+ space_used_.relaxed_set(0);
+ space_allocated_.relaxed_set(b->size());
+ cached_block_length_ = 0;
+ cached_blocks_ = nullptr;
+}
+
+SerialArena* SerialArena::New(Memory mem, ThreadSafeArena& parent) {
GOOGLE_DCHECK_LE(kBlockHeaderSize + ThreadSafeArena::kSerialArenaSize, mem.size);
- ThreadSafeArenaStats::RecordAllocateStats(
- stats, /*requested=*/mem.size, /*allocated=*/mem.size, /*wasted=*/0);
- auto b = new (mem.ptr) Block{nullptr, mem.size};
- return new (b->Pointer(kBlockHeaderSize)) SerialArena(b, owner, stats);
+ ThreadSafeArenaStats::RecordAllocateStats(parent.arena_stats_.MutableStats(),
+ /*used=*/0, /*allocated=*/mem.size,
+ /*wasted=*/0);
+ auto b = new (mem.ptr) ArenaBlock{nullptr, mem.size};
+ return new (b->Pointer(kBlockHeaderSize)) SerialArena(b, parent);
}
template <typename Deallocator>
SerialArena::Memory SerialArena::Free(Deallocator deallocator) {
- Block* b = head_;
- Memory mem = {b, b->size};
+ ArenaBlock* b = head();
+ Memory mem = {b, b->size()};
while (b->next) {
b = b->next; // We must first advance before deleting this block
deallocator(mem);
- mem = {b, b->size};
+ mem = {b, b->size()};
}
return mem;
}
PROTOBUF_NOINLINE
-std::pair<void*, SerialArena::CleanupNode*>
-SerialArena::AllocateAlignedWithCleanupFallback(
- size_t n, const AllocationPolicy* policy) {
- AllocateNewBlock(n + kCleanupSize, policy);
- return AllocateFromExistingWithCleanupFallback(n);
-}
-
-PROTOBUF_NOINLINE
-void* SerialArena::AllocateAlignedFallback(size_t n,
- const AllocationPolicy* policy) {
- AllocateNewBlock(n, policy);
+void* SerialArena::AllocateAlignedFallback(size_t n) {
+ AllocateNewBlock(n);
return AllocateFromExisting(n);
}
-void SerialArena::AllocateNewBlock(size_t n, const AllocationPolicy* policy) {
- // Sync limit to block
- head_->start = reinterpret_cast<CleanupNode*>(limit_);
+PROTOBUF_NOINLINE
+void* SerialArena::AllocateAlignedWithCleanupFallback(
+ size_t n, size_t align, void (*destructor)(void*)) {
+ size_t required = AlignUpTo(n, align) + cleanup::Size(destructor);
+ AllocateNewBlock(required);
+ return AllocateFromExistingWithCleanupFallback(n, align, destructor);
+}
- // Record how much used in this block.
- size_t used = ptr_ - head_->Pointer(kBlockHeaderSize);
- size_t wasted = head_->size - used;
- space_used_ += used;
+PROTOBUF_NOINLINE
+void SerialArena::AddCleanupFallback(void* elem, void (*destructor)(void*)) {
+ size_t required = cleanup::Size(destructor);
+ AllocateNewBlock(required);
+ AddCleanupFromExisting(elem, destructor);
+}
+
+void SerialArena::AllocateNewBlock(size_t n) {
+ size_t used = 0;
+ size_t wasted = 0;
+ ArenaBlock* old_head = head();
+ if (!old_head->IsSentry()) {
+ // Sync limit to block
+ old_head->cleanup_nodes = limit_;
+
+ // Record how much used in this block.
+ used = static_cast<size_t>(ptr() - old_head->Pointer(kBlockHeaderSize));
+ wasted = old_head->size() - used;
+ space_used_.relaxed_set(space_used_.relaxed_get() + used);
+ }
// TODO(sbenza): Evaluate if pushing unused space into the cached blocks is a
// win. In preliminary testing showed increased memory savings as expected,
// but with a CPU regression. The regression might have been an artifact of
// the microbenchmark.
- auto mem = AllocateMemory(policy, head_->size, n);
+ auto mem = AllocateMemory(parent_.AllocPolicy(), old_head->size(), n);
// We don't want to emit an expensive RMW instruction that requires
// exclusive access to a cacheline. Hence we write it in terms of a
// regular add.
- auto relaxed = std::memory_order_relaxed;
- space_allocated_.store(space_allocated_.load(relaxed) + mem.size, relaxed);
- ThreadSafeArenaStats::RecordAllocateStats(arena_stats_, /*requested=*/n,
+ space_allocated_.relaxed_set(space_allocated_.relaxed_get() + mem.size);
+ ThreadSafeArenaStats::RecordAllocateStats(parent_.arena_stats_.MutableStats(),
+ /*used=*/used,
/*allocated=*/mem.size, wasted);
- head_ = new (mem.ptr) Block{head_, mem.size};
- ptr_ = head_->Pointer(kBlockHeaderSize);
- limit_ = head_->Pointer(head_->size);
+ auto* new_head = new (mem.ptr) ArenaBlock{old_head, mem.size};
+ set_head(new_head);
+ set_ptr(new_head->Pointer(kBlockHeaderSize));
+ limit_ = new_head->Limit();
#ifdef ADDRESS_SANITIZER
- ASAN_POISON_MEMORY_REGION(ptr_, limit_ - ptr_);
+ ASAN_POISON_MEMORY_REGION(ptr(), limit_ - ptr());
#endif // ADDRESS_SANITIZER
}
uint64_t SerialArena::SpaceUsed() const {
- uint64_t space_used = ptr_ - head_->Pointer(kBlockHeaderSize);
- space_used += space_used_;
- // Remove the overhead of the SerialArena itself.
- space_used -= ThreadSafeArena::kSerialArenaSize;
- return space_used;
+ // Note: the calculation below technically causes a race with
+ // AllocateNewBlock when called from another thread (which happens in
+ // ThreadSafeArena::SpaceUsed). However, worst-case space_used_ will have
+ // stale data and the calculation will incorrectly assume 100%
+ // usage of the *current* block.
+ // TODO(mkruskal) Consider eliminating this race in exchange for a possible
+ // performance hit on ARM (see cl/455186837).
+ const ArenaBlock* h = head();
+ if (h->IsSentry()) return 0;
+
+ const uint64_t current_block_size = h->size();
+ uint64_t current_space_used = std::min(
+ static_cast<uint64_t>(
+ ptr() - const_cast<ArenaBlock*>(h)->Pointer(kBlockHeaderSize)),
+ current_block_size);
+ return current_space_used + space_used_.relaxed_get();
}
void SerialArena::CleanupList() {
- Block* b = head_;
- b->start = reinterpret_cast<CleanupNode*>(limit_);
+ ArenaBlock* b = head();
+ if (b->IsSentry()) return;
+
+ b->cleanup_nodes = limit_;
do {
- auto* limit = reinterpret_cast<CleanupNode*>(
- b->Pointer(b->size & static_cast<size_t>(-8)));
- auto it = b->start;
- auto num = limit - it;
- if (num > 0) {
- for (; it < limit; it++) {
- it->cleanup(it->elem);
+ char* limit = b->Limit();
+ char* it = reinterpret_cast<char*>(b->cleanup_nodes);
+ GOOGLE_DCHECK(!b->IsSentry() || it == limit);
+ if (it < limit) {
+ // A prefetch distance of 8 here was chosen arbitrarily. It makes the
+ // pending nodes fill a cacheline which seemed nice.
+ constexpr int kPrefetchDist = 8;
+ cleanup::Tag pending_type[kPrefetchDist];
+ char* pending_node[kPrefetchDist];
+
+ int pos = 0;
+ for (; pos < kPrefetchDist && it < limit; ++pos) {
+ pending_type[pos] = cleanup::Type(it);
+ pending_node[pos] = it;
+ it += cleanup::Size(pending_type[pos]);
+ }
+
+ if (pos < kPrefetchDist) {
+ for (int i = 0; i < pos; ++i) {
+ cleanup::DestroyNode(pending_type[i], pending_node[i]);
+ }
+ } else {
+ pos = 0;
+ while (it < limit) {
+ cleanup::PrefetchNode(it);
+ cleanup::DestroyNode(pending_type[pos], pending_node[pos]);
+ pending_type[pos] = cleanup::Type(it);
+ pending_node[pos] = it;
+ it += cleanup::Size(pending_type[pos]);
+ pos = (pos + 1) % kPrefetchDist;
+ }
+ for (int i = pos; i < pos + kPrefetchDist; ++i) {
+ cleanup::DestroyNode(pending_type[i % kPrefetchDist],
+ pending_node[i % kPrefetchDist]);
+ }
}
}
b = b->next;
} while (b);
}
+// Stores arrays of void* and SerialArena* instead of linked list of
+// SerialArena* to speed up traversing all SerialArena. The cost of walk is non
+// trivial when there are many nodes. Separately storing "ids" minimizes cache
+// footprints and more efficient when looking for matching arena.
+//
+// Uses absl::container_internal::Layout to emulate the following:
+//
+// struct SerialArenaChunk {
+// struct SerialArenaChunkHeader {
+// SerialArenaChunk* next_chunk;
+// uint32_t capacity;
+// Atomic<uint32_t> size;
+// } header;
+// Atomic<void*> ids[];
+// Atomic<SerialArena*> arenas[];
+// };
+//
+// where the size of "ids" and "arenas" is determined at runtime; hence the use
+// of Layout.
+struct SerialArenaChunkHeader {
+ PROTOBUF_CONSTEXPR SerialArenaChunkHeader(uint32_t capacity, uint32_t size)
+ : next_chunk(nullptr), capacity(capacity), size(size) {}
+
+ ThreadSafeArena::SerialArenaChunk* next_chunk;
+ uint32_t capacity;
+ Atomic<uint32_t> size;
+};
+
+class ThreadSafeArena::SerialArenaChunk {
+ public:
+ SerialArenaChunk(uint32_t capacity, void* me, SerialArena* serial) {
+ new (&header()) SerialArenaChunkHeader{capacity, 1};
+
+ new (&id(0)) Atomic<void*>{me};
+ for (uint32_t i = 1; i < capacity; ++i) {
+ new (&id(i)) Atomic<void*>{nullptr};
+ }
+
+ new (&arena(0)) Atomic<SerialArena*>{serial};
+ for (uint32_t i = 1; i < capacity; ++i) {
+ new (&arena(i)) Atomic<void*>{nullptr};
+ }
+ }
+
+ bool IsSentry() const { return capacity() == 0; }
+
+ // next_chunk
+ const SerialArenaChunk* next_chunk() const { return header().next_chunk; }
+ SerialArenaChunk* next_chunk() { return header().next_chunk; }
+ void set_next(SerialArenaChunk* next_chunk) {
+ header().next_chunk = next_chunk;
+ }
+
+ // capacity
+ uint32_t capacity() const { return header().capacity; }
+ void set_capacity(uint32_t capacity) { header().capacity = capacity; }
+
+ // ids: returns up to size().
+ absl::Span<const Atomic<void*>> ids() const {
+ return Layout(capacity()).Slice<kIds>(ptr()).first(safe_size());
+ }
+ absl::Span<Atomic<void*>> ids() {
+ return Layout(capacity()).Slice<kIds>(ptr()).first(safe_size());
+ }
+ Atomic<void*>& id(uint32_t i) {
+ GOOGLE_DCHECK_LT(i, capacity());
+ return Layout(capacity()).Pointer<kIds>(ptr())[i];
+ }
+
+ // arenas: returns up to size().
+ absl::Span<const Atomic<SerialArena*>> arenas() const {
+ return Layout(capacity()).Slice<kArenas>(ptr()).first(safe_size());
+ }
+ absl::Span<Atomic<SerialArena*>> arenas() {
+ return Layout(capacity()).Slice<kArenas>(ptr()).first(safe_size());
+ }
+ const Atomic<SerialArena*>& arena(uint32_t i) const {
+ GOOGLE_DCHECK_LT(i, capacity());
+ return Layout(capacity()).Pointer<kArenas>(ptr())[i];
+ }
+ Atomic<SerialArena*>& arena(uint32_t i) {
+ GOOGLE_DCHECK_LT(i, capacity());
+ return Layout(capacity()).Pointer<kArenas>(ptr())[i];
+ }
+
+ // Tries to insert {id, serial} to head chunk. Returns false if the head is
+ // already full.
+ //
+ // Note that the updating "size", "id", "arena" is individually atomic but
+ // those are not protected by a mutex. This is acceptable because concurrent
+ // lookups from SpaceUsed or SpaceAllocated accept inaccuracy due to race. On
+ // other paths, either race is not possible (GetSerialArenaFallback) or must
+ // be prevented by users (CleanupList, Free).
+ bool insert(void* me, SerialArena* serial) {
+ uint32_t idx = size().relaxed_fetch_add(1);
+ // Bail out if this chunk is full.
+ if (idx >= capacity()) {
+ // Write old value back to avoid potential overflow.
+ size().relaxed_set(capacity());
+ return false;
+ }
+
+ id(idx).relaxed_set(me);
+ arena(idx).relaxed_set(serial);
+ return true;
+ }
+
+ constexpr static size_t AllocSize(size_t n) { return Layout(n).AllocSize(); }
+
+ private:
+ constexpr static int kHeader = 0;
+ constexpr static int kIds = 1;
+ constexpr static int kArenas = 2;
+
+ using layout_type =
+ absl::container_internal::Layout<SerialArenaChunkHeader, Atomic<void*>,
+ Atomic<SerialArena*>>;
+
+ const char* ptr() const { return reinterpret_cast<const char*>(this); }
+ char* ptr() { return reinterpret_cast<char*>(this); }
+
+ SerialArenaChunkHeader& header() {
+ return *layout_type::Partial().Pointer<kHeader>(ptr());
+ }
+ const SerialArenaChunkHeader& header() const {
+ return *layout_type::Partial().Pointer<kHeader>(ptr());
+ }
+
+ Atomic<uint32_t>& size() { return header().size; }
+ const Atomic<uint32_t>& size() const { return header().size; }
+
+ // Returns the size capped by the capacity as fetch_add may result in a size
+ // greater than capacity.
+ uint32_t safe_size() const {
+ return std::min(capacity(), size().relaxed_get());
+ }
+
+ constexpr static layout_type Layout(size_t n) {
+ return layout_type(
+ /*header*/ 1,
+ /*ids*/ n,
+ /*arenas*/ n);
+ }
+};
+
+PROTOBUF_CONSTEXPR SerialArenaChunkHeader kSentryArenaChunk = {0, 0};
+
+ThreadSafeArena::SerialArenaChunk* ThreadSafeArena::SentrySerialArenaChunk() {
+ // const_cast is okay because the sentry chunk is never mutated. Also,
+ // reinterpret_cast is acceptable here as it should be identical to
+ // SerialArenaChunk with zero payload. This is a necessary trick to
+ // constexpr initialize kSentryArenaChunk.
+ return reinterpret_cast<SerialArenaChunk*>(
+ const_cast<SerialArenaChunkHeader*>(&kSentryArenaChunk));
+}
+
ThreadSafeArena::CacheAlignedLifecycleIdGenerator
ThreadSafeArena::lifecycle_id_generator_;
@@ -226,66 +474,71 @@
nullptr};
#endif
-void ThreadSafeArena::InitializeFrom(void* mem, size_t size) {
- GOOGLE_DCHECK_EQ(reinterpret_cast<uintptr_t>(mem) & 7, 0u);
- GOOGLE_DCHECK(!AllocPolicy()); // Reset should call InitializeWithPolicy instead.
- Init();
+ThreadSafeArena::ThreadSafeArena() : first_arena_(*this) { Init(); }
- // Ignore initial block if it is too small.
- if (mem != nullptr && size >= kBlockHeaderSize + kSerialArenaSize) {
- alloc_policy_.set_is_user_owned_initial_block(true);
- SetInitialBlock(mem, size);
- }
+// Constructor solely used by message-owned arena.
+ThreadSafeArena::ThreadSafeArena(internal::MessageOwned)
+ : tag_and_id_(kMessageOwnedArena), first_arena_(*this) {
+ Init();
}
-void ThreadSafeArena::InitializeWithPolicy(void* mem, size_t size,
- AllocationPolicy policy) {
+ThreadSafeArena::ThreadSafeArena(char* mem, size_t size)
+ : first_arena_(FirstSerialArena{}, FirstBlock(mem, size), *this) {
+ Init();
+}
+
+ThreadSafeArena::ThreadSafeArena(void* mem, size_t size,
+ const AllocationPolicy& policy)
+ : first_arena_(FirstSerialArena{}, FirstBlock(mem, size, policy), *this) {
+ InitializeWithPolicy(policy);
+}
+
+ArenaBlock* ThreadSafeArena::FirstBlock(void* buf, size_t size) {
+ GOOGLE_DCHECK_EQ(reinterpret_cast<uintptr_t>(buf) & 7, 0u);
+ if (buf == nullptr || size <= kBlockHeaderSize) {
+ return SentryArenaBlock();
+ }
+ // Record user-owned block.
+ alloc_policy_.set_is_user_owned_initial_block(true);
+ return new (buf) ArenaBlock{nullptr, size};
+}
+
+ArenaBlock* ThreadSafeArena::FirstBlock(void* buf, size_t size,
+ const AllocationPolicy& policy) {
+ if (policy.IsDefault()) return FirstBlock(buf, size);
+
+ GOOGLE_DCHECK_EQ(reinterpret_cast<uintptr_t>(buf) & 7, 0u);
+
+ SerialArena::Memory mem;
+ if (buf == nullptr || size < kBlockHeaderSize + kAllocPolicySize) {
+ mem = AllocateMemory(&policy, 0, kAllocPolicySize);
+ } else {
+ mem = {buf, size};
+ // Record user-owned block.
+ alloc_policy_.set_is_user_owned_initial_block(true);
+ }
+
+ return new (mem.ptr) ArenaBlock{nullptr, mem.size};
+}
+
+void ThreadSafeArena::InitializeWithPolicy(const AllocationPolicy& policy) {
+ Init();
+
+ if (policy.IsDefault()) return;
+
#ifndef NDEBUG
const uint64_t old_alloc_policy = alloc_policy_.get_raw();
// If there was a policy (e.g., in Reset()), make sure flags were preserved.
#define GOOGLE_DCHECK_POLICY_FLAGS_() \
if (old_alloc_policy > 3) \
- GOOGLE_CHECK_EQ(old_alloc_policy & 3, alloc_policy_.get_raw() & 3)
+ GOOGLE_CHECK_EQ(old_alloc_policy & 3, alloc_policy_.get_raw() & 3)
#else
#define GOOGLE_DCHECK_POLICY_FLAGS_()
#endif // NDEBUG
- if (policy.IsDefault()) {
- // Legacy code doesn't use the API above, but provides the initial block
- // through ArenaOptions. I suspect most do not touch the allocation
- // policy parameters.
- InitializeFrom(mem, size);
- GOOGLE_DCHECK_POLICY_FLAGS_();
- return;
- }
- GOOGLE_DCHECK_EQ(reinterpret_cast<uintptr_t>(mem) & 7, 0u);
- Init();
-
- // Ignore initial block if it is too small. We include an optional
- // AllocationPolicy in this check, so that this can be allocated on the
- // first block.
- constexpr size_t kAPSize = internal::AlignUpTo8(sizeof(AllocationPolicy));
- constexpr size_t kMinimumSize = kBlockHeaderSize + kSerialArenaSize + kAPSize;
-
- // The value for alloc_policy_ stores whether or not allocations should be
- // recorded.
- alloc_policy_.set_should_record_allocs(
- policy.metrics_collector != nullptr &&
- policy.metrics_collector->RecordAllocs());
- // Make sure we have an initial block to store the AllocationPolicy.
- if (mem != nullptr && size >= kMinimumSize) {
- alloc_policy_.set_is_user_owned_initial_block(true);
- } else {
- auto tmp = AllocateMemory(&policy, 0, kMinimumSize);
- mem = tmp.ptr;
- size = tmp.size;
- }
- SetInitialBlock(mem, size);
-
- auto sa = threads_.load(std::memory_order_relaxed);
// We ensured enough space so this cannot fail.
void* p;
- if (!sa || !sa->MaybeAllocateAligned(kAPSize, &p)) {
+ if (!first_arena_.MaybeAllocateAligned(kAllocPolicySize, &p)) {
GOOGLE_LOG(FATAL) << "MaybeAllocateAligned cannot fail here.";
return;
}
@@ -298,41 +551,99 @@
#undef GOOGLE_DCHECK_POLICY_FLAGS_
}
-void ThreadSafeArena::Init() {
-#ifndef NDEBUG
- const bool was_message_owned = IsMessageOwned();
-#endif // NDEBUG
+uint64_t ThreadSafeArena::GetNextLifeCycleId() {
ThreadCache& tc = thread_cache();
- auto id = tc.next_lifecycle_id;
+ uint64_t id = tc.next_lifecycle_id;
// We increment lifecycle_id's by multiples of two so we can use bit 0 as
// a tag.
constexpr uint64_t kDelta = 2;
constexpr uint64_t kInc = ThreadCache::kPerThreadIds * kDelta;
if (PROTOBUF_PREDICT_FALSE((id & (kInc - 1)) == 0)) {
- constexpr auto relaxed = std::memory_order_relaxed;
// On platforms that don't support uint64_t atomics we can certainly not
// afford to increment by large intervals and expect uniqueness due to
// wrapping, hence we only add by 1.
- id = lifecycle_id_generator_.id.fetch_add(1, relaxed) * kInc;
+ id = lifecycle_id_generator_.id.relaxed_fetch_add(1) * kInc;
}
tc.next_lifecycle_id = id + kDelta;
- // Message ownership is stored in tag_and_id_, and is set in the constructor.
- // This flag bit must be preserved, even across calls to Reset().
- tag_and_id_ = id | (tag_and_id_ & kMessageOwnedArena);
- hint_.store(nullptr, std::memory_order_relaxed);
- threads_.store(nullptr, std::memory_order_relaxed);
-#ifndef NDEBUG
- GOOGLE_CHECK_EQ(was_message_owned, IsMessageOwned());
-#endif // NDEBUG
- arena_stats_ = Sample();
+ return id;
}
-void ThreadSafeArena::SetInitialBlock(void* mem, size_t size) {
- SerialArena* serial = SerialArena::New({mem, size}, &thread_cache(),
- arena_stats_.MutableStats());
- serial->set_next(NULL);
- threads_.store(serial, std::memory_order_relaxed);
- CacheSerialArena(serial);
+// We assume that #threads / arena is bimodal; i.e. majority small ones are
+// single threaded but some big ones are highly concurrent. To balance between
+// memory overhead and minimum pointer chasing, we start with few entries and
+// exponentially (4x) grow with a limit (255 entries). Note that parameters are
+// picked for x64 architectures as hint and the actual size is calculated by
+// Layout.
+ThreadSafeArena::SerialArenaChunk* ThreadSafeArena::NewSerialArenaChunk(
+ uint32_t prev_capacity, void* id, SerialArena* serial) {
+ constexpr size_t kMaxBytes = 4096; // Can hold up to 255 entries.
+ constexpr size_t kGrowthFactor = 4;
+ constexpr size_t kHeaderSize = SerialArenaChunk::AllocSize(0);
+ constexpr size_t kEntrySize = SerialArenaChunk::AllocSize(1) - kHeaderSize;
+
+ // On x64 arch: {4, 16, 64, 256, 256, ...} * 16.
+ size_t prev_bytes = SerialArenaChunk::AllocSize(prev_capacity);
+ size_t next_bytes = std::min(kMaxBytes, prev_bytes * kGrowthFactor);
+ uint32_t next_capacity =
+ static_cast<uint32_t>(next_bytes - kHeaderSize) / kEntrySize;
+ // Growth based on bytes needs to be adjusted by AllocSize.
+ next_bytes = SerialArenaChunk::AllocSize(next_capacity);
+ void* mem;
+ mem = ::operator new(next_bytes);
+
+ return new (mem) SerialArenaChunk{next_capacity, id, serial};
+}
+
+// Tries to reserve an entry by atomic fetch_add. If the head chunk is already
+// full (size >= capacity), acquires the mutex and adds a new head.
+void ThreadSafeArena::AddSerialArena(void* id, SerialArena* serial) {
+ SerialArenaChunk* head = head_.atomic_get();
+ // Fast path without acquiring mutex.
+ if (!head->IsSentry() && head->insert(id, serial)) {
+ return;
+ }
+
+ // Slow path with acquiring mutex.
+ absl::MutexLock lock(&mutex_);
+
+ // Refetch and if someone else installed a new head, try allocating on that!
+ SerialArenaChunk* new_head = head_.atomic_get();
+ if (new_head != head) {
+ if (new_head->insert(id, serial)) return;
+ // Update head to link to the latest one.
+ head = new_head;
+ }
+
+ new_head = NewSerialArenaChunk(head->capacity(), id, serial);
+ new_head->set_next(head);
+
+ // Use "std::memory_order_release" to make sure prior stores are visible after
+ // this one.
+ head_.atomic_set(new_head);
+}
+
+void ThreadSafeArena::Init() {
+ const bool message_owned = IsMessageOwned();
+ if (!message_owned) {
+ // Message-owned arenas bypass thread cache and do not need life cycle ID.
+ tag_and_id_ = GetNextLifeCycleId();
+ } else {
+ GOOGLE_DCHECK_EQ(tag_and_id_, kMessageOwnedArena);
+ }
+ arena_stats_ = Sample();
+ head_.relaxed_set(SentrySerialArenaChunk());
+ GOOGLE_DCHECK_EQ(message_owned, IsMessageOwned());
+ first_owner_ = &thread_cache();
+
+ // Record allocation for the first block that was either user-provided or
+ // newly allocated.
+ ThreadSafeArenaStats::RecordAllocateStats(
+ arena_stats_.MutableStats(),
+ /*used=*/0,
+ /*allocated=*/first_arena_.SpaceAllocated(),
+ /*wasted=*/0);
+
+ CacheSerialArena(&first_arena_);
}
ThreadSafeArena::~ThreadSafeArena() {
@@ -342,32 +653,41 @@
size_t space_allocated = 0;
auto mem = Free(&space_allocated);
-
- // Policy is about to get deleted.
- auto* p = alloc_policy_.get();
- ArenaMetricsCollector* collector = p ? p->metrics_collector : nullptr;
-
if (alloc_policy_.is_user_owned_initial_block()) {
#ifdef ADDRESS_SANITIZER
// Unpoison the initial block, now that it's going back to the user.
ASAN_UNPOISON_MEMORY_REGION(mem.ptr, mem.size);
#endif // ADDRESS_SANITIZER
space_allocated += mem.size;
- } else {
+ } else if (mem.size > 0) {
GetDeallocator(alloc_policy_.get(), &space_allocated)(mem);
}
-
- if (collector) collector->OnDestroy(space_allocated);
}
SerialArena::Memory ThreadSafeArena::Free(size_t* space_allocated) {
- SerialArena::Memory mem = {nullptr, 0};
auto deallocator = GetDeallocator(alloc_policy_.get(), space_allocated);
- PerSerialArena([deallocator, &mem](SerialArena* a) {
- if (mem.ptr) deallocator(mem);
- mem = a->Free(deallocator);
+
+ WalkSerialArenaChunk([deallocator](SerialArenaChunk* chunk) {
+ absl::Span<Atomic<SerialArena*>> span = chunk->arenas();
+ // Walks arenas backward to handle the first serial arena the last. Freeing
+ // in reverse-order to the order in which objects were created may not be
+ // necessary to Free and we should revisit this. (b/247560530)
+ for (auto it = span.rbegin(); it != span.rend(); ++it) {
+ SerialArena* serial = it->relaxed_get();
+ GOOGLE_DCHECK_NE(serial, nullptr);
+ // Always frees the first block of "serial" as it cannot be user-provided.
+ SerialArena::Memory mem = serial->Free(deallocator);
+ GOOGLE_DCHECK_NE(mem.ptr, nullptr);
+ deallocator(mem);
+ }
+
+ // Delete the chunk as we're done with it.
+ internal::SizedDelete(chunk,
+ SerialArenaChunk::AllocSize(chunk->capacity()));
});
- return mem;
+
+ // The first block of the first arena is special and let the caller handle it.
+ return first_arena_.Free(deallocator);
}
uint64_t ThreadSafeArena::Reset() {
@@ -375,132 +695,168 @@
// refer to memory in other blocks.
CleanupList();
- // Discard all blocks except the special block (if present).
+ // Discard all blocks except the first one. Whether it is user-provided or
+ // allocated, always reuse the first block for the first arena.
size_t space_allocated = 0;
auto mem = Free(&space_allocated);
- arena_stats_.RecordReset();
+ space_allocated += mem.size;
- AllocationPolicy* policy = alloc_policy_.get();
- if (policy) {
- auto saved_policy = *policy;
- if (alloc_policy_.is_user_owned_initial_block()) {
- space_allocated += mem.size;
- } else {
- GetDeallocator(alloc_policy_.get(), &space_allocated)(mem);
- mem.ptr = nullptr;
- mem.size = 0;
- }
- ArenaMetricsCollector* collector = saved_policy.metrics_collector;
- if (collector) collector->OnReset(space_allocated);
- InitializeWithPolicy(mem.ptr, mem.size, saved_policy);
+ // Reset the first arena with the first block. This avoids redundant
+ // free / allocation and re-allocating for AllocationPolicy. Adjust offset if
+ // we need to preserve alloc_policy_.
+ if (alloc_policy_.is_user_owned_initial_block() ||
+ alloc_policy_.get() != nullptr) {
+ size_t offset = alloc_policy_.get() == nullptr
+ ? kBlockHeaderSize
+ : kBlockHeaderSize + kAllocPolicySize;
+ first_arena_.Init(new (mem.ptr) ArenaBlock{nullptr, mem.size}, offset);
} else {
- GOOGLE_DCHECK(!alloc_policy_.should_record_allocs());
- // Nullptr policy
- if (alloc_policy_.is_user_owned_initial_block()) {
- space_allocated += mem.size;
- InitializeFrom(mem.ptr, mem.size);
- } else {
- GetDeallocator(alloc_policy_.get(), &space_allocated)(mem);
- Init();
- }
+ first_arena_.Init(SentryArenaBlock(), 0);
}
+ // Since the first block and potential alloc_policy on the first block is
+ // preserved, this can be initialized by Init().
+ Init();
+
return space_allocated;
}
-std::pair<void*, SerialArena::CleanupNode*>
-ThreadSafeArena::AllocateAlignedWithCleanup(size_t n,
- const std::type_info* type) {
+void* ThreadSafeArena::AllocateAlignedWithCleanup(size_t n, size_t align,
+ void (*destructor)(void*)) {
SerialArena* arena;
- if (PROTOBUF_PREDICT_TRUE(!alloc_policy_.should_record_allocs() &&
- GetSerialArenaFast(&arena))) {
- return arena->AllocateAlignedWithCleanup(n, alloc_policy_.get());
+ if (PROTOBUF_PREDICT_TRUE(GetSerialArenaFast(&arena))) {
+ return arena->AllocateAlignedWithCleanup(n, align, destructor);
} else {
- return AllocateAlignedWithCleanupFallback(n, type);
+ return AllocateAlignedWithCleanupFallback(n, align, destructor);
}
}
void ThreadSafeArena::AddCleanup(void* elem, void (*cleanup)(void*)) {
SerialArena* arena;
if (PROTOBUF_PREDICT_FALSE(!GetSerialArenaFast(&arena))) {
- arena = GetSerialArenaFallback(&thread_cache());
+ arena = GetSerialArenaFallback();
}
- arena->AddCleanup(elem, cleanup, AllocPolicy());
+ arena->AddCleanup(elem, cleanup, AllocPolicy(), arena_stats_.MutableStats());
}
PROTOBUF_NOINLINE
-void* ThreadSafeArena::AllocateAlignedFallback(size_t n,
- const std::type_info* type) {
- if (alloc_policy_.should_record_allocs()) {
- alloc_policy_.RecordAlloc(type, n);
- SerialArena* arena;
- if (PROTOBUF_PREDICT_TRUE(GetSerialArenaFast(&arena))) {
- return arena->AllocateAligned(n, alloc_policy_.get());
- }
- }
- return GetSerialArenaFallback(&thread_cache())
- ->AllocateAligned(n, alloc_policy_.get());
+void* ThreadSafeArena::AllocateAlignedWithCleanupFallback(
+ size_t n, size_t align, void (*destructor)(void*)) {
+ return GetSerialArenaFallback()->AllocateAlignedWithCleanup(n, align,
+ destructor);
}
-PROTOBUF_NOINLINE
-std::pair<void*, SerialArena::CleanupNode*>
-ThreadSafeArena::AllocateAlignedWithCleanupFallback(
- size_t n, const std::type_info* type) {
- if (alloc_policy_.should_record_allocs()) {
- alloc_policy_.RecordAlloc(type, n);
- SerialArena* arena;
- if (GetSerialArenaFast(&arena)) {
- return arena->AllocateAlignedWithCleanup(n, alloc_policy_.get());
- }
+template <typename Functor>
+void ThreadSafeArena::WalkConstSerialArenaChunk(Functor fn) const {
+ const SerialArenaChunk* chunk = head_.atomic_get();
+
+ for (; !chunk->IsSentry(); chunk = chunk->next_chunk()) {
+ fn(chunk);
}
- return GetSerialArenaFallback(&thread_cache())
- ->AllocateAlignedWithCleanup(n, alloc_policy_.get());
+}
+
+template <typename Functor>
+void ThreadSafeArena::WalkSerialArenaChunk(Functor fn) {
+ // By omitting an Acquire barrier we help the sanitizer that any user code
+ // that doesn't properly synchronize Reset() or the destructor will throw a
+ // TSAN warning.
+ SerialArenaChunk* chunk = head_.relaxed_get();
+
+ while (!chunk->IsSentry()) {
+ // Cache next chunk in case this chunk is destroyed.
+ SerialArenaChunk* next_chunk = chunk->next_chunk();
+ fn(chunk);
+ chunk = next_chunk;
+ }
+}
+
+template <typename Functor>
+void ThreadSafeArena::PerConstSerialArenaInChunk(Functor fn) const {
+ WalkConstSerialArenaChunk([&fn](const SerialArenaChunk* chunk) {
+ for (const auto& each : chunk->arenas()) {
+ const SerialArena* serial = each.relaxed_get();
+ // It is possible that newly added SerialArena is not updated although
+ // size was. This is acceptable for SpaceAllocated and SpaceUsed.
+ if (serial == nullptr) continue;
+ fn(serial);
+ }
+ });
}
uint64_t ThreadSafeArena::SpaceAllocated() const {
- SerialArena* serial = threads_.load(std::memory_order_acquire);
- uint64_t res = 0;
- for (; serial; serial = serial->next()) {
- res += serial->SpaceAllocated();
- }
- return res;
+ uint64_t space_allocated = first_arena_.SpaceAllocated();
+ PerConstSerialArenaInChunk([&space_allocated](const SerialArena* serial) {
+ space_allocated += serial->SpaceAllocated();
+ });
+ return space_allocated;
}
uint64_t ThreadSafeArena::SpaceUsed() const {
- SerialArena* serial = threads_.load(std::memory_order_acquire);
- uint64_t space_used = 0;
- for (; serial; serial = serial->next()) {
- space_used += serial->SpaceUsed();
- }
+ // First arena is inlined to ThreadSafeArena and the first block's overhead is
+ // smaller than others that contain SerialArena.
+ uint64_t space_used = first_arena_.SpaceUsed();
+ PerConstSerialArenaInChunk([&space_used](const SerialArena* serial) {
+ // SerialArena on chunks directly allocated from the block and needs to be
+ // subtracted from SpaceUsed.
+ space_used += serial->SpaceUsed() - kSerialArenaSize;
+ });
return space_used - (alloc_policy_.get() ? sizeof(AllocationPolicy) : 0);
}
+template <AllocationClient alloc_client>
+PROTOBUF_NOINLINE void* ThreadSafeArena::AllocateAlignedFallback(size_t n) {
+ return GetSerialArenaFallback()->AllocateAligned<alloc_client>(n);
+}
+
+template void* ThreadSafeArena::AllocateAlignedFallback<
+ AllocationClient::kDefault>(size_t);
+template void*
+ ThreadSafeArena::AllocateAlignedFallback<AllocationClient::kArray>(size_t);
+
void ThreadSafeArena::CleanupList() {
- PerSerialArena([](SerialArena* a) { a->CleanupList(); });
+ WalkSerialArenaChunk([](SerialArenaChunk* chunk) {
+ absl::Span<Atomic<SerialArena*>> span = chunk->arenas();
+ // Walks arenas backward to handle the first serial arena the last.
+ // Destroying in reverse-order to the construction is often assumed by users
+ // and required not to break inter-object dependencies. (b/247560530)
+ for (auto it = span.rbegin(); it != span.rend(); ++it) {
+ SerialArena* serial = it->relaxed_get();
+ GOOGLE_DCHECK_NE(serial, nullptr);
+ serial->CleanupList();
+ }
+ });
+ // First arena must be cleaned up last. (b/247560530)
+ first_arena_.CleanupList();
}
PROTOBUF_NOINLINE
-SerialArena* ThreadSafeArena::GetSerialArenaFallback(void* me) {
- // Look for this SerialArena in our linked list.
- SerialArena* serial = threads_.load(std::memory_order_acquire);
- for (; serial; serial = serial->next()) {
- if (serial->owner() == me) {
- break;
- }
+SerialArena* ThreadSafeArena::GetSerialArenaFallback() {
+ void* const id = &thread_cache();
+ if (id == first_owner_) {
+ CacheSerialArena(&first_arena_);
+ return &first_arena_;
}
+ // Search matching SerialArena.
+ SerialArena* serial = nullptr;
+ WalkConstSerialArenaChunk([&serial, id](const SerialArenaChunk* chunk) {
+ absl::Span<const Atomic<void*>> ids = chunk->ids();
+ for (uint32_t i = 0; i < ids.size(); ++i) {
+ if (ids[i].relaxed_get() == id) {
+ serial = chunk->arena(i).relaxed_get();
+ GOOGLE_DCHECK_NE(serial, nullptr);
+ break;
+ }
+ }
+ });
+
if (!serial) {
// This thread doesn't have any SerialArena, which also means it doesn't
// have any blocks yet. So we'll allocate its first block now.
serial = SerialArena::New(
- AllocateMemory(alloc_policy_.get(), 0, kSerialArenaSize), me,
- arena_stats_.MutableStats());
+ AllocateMemory(alloc_policy_.get(), 0, kSerialArenaSize), *this);
- SerialArena* head = threads_.load(std::memory_order_relaxed);
- do {
- serial->set_next(head);
- } while (!threads_.compare_exchange_weak(
- head, serial, std::memory_order_release, std::memory_order_relaxed));
+ AddSerialArena(id, serial);
}
CacheSerialArena(serial);
@@ -509,29 +865,18 @@
} // namespace internal
-PROTOBUF_FUNC_ALIGN(32)
-void* Arena::AllocateAlignedNoHook(size_t n) {
- return impl_.AllocateAligned(n, nullptr);
+void* Arena::Allocate(size_t n) { return impl_.AllocateAligned(n); }
+
+void* Arena::AllocateForArray(size_t n) {
+ return impl_.AllocateAligned<internal::AllocationClient::kArray>(n);
}
-PROTOBUF_FUNC_ALIGN(32)
-void* Arena::AllocateAlignedWithHook(size_t n, const std::type_info* type) {
- return impl_.AllocateAligned(n, type);
-}
-
-PROTOBUF_FUNC_ALIGN(32)
-void* Arena::AllocateAlignedWithHookForArray(size_t n,
- const std::type_info* type) {
- return impl_.AllocateAligned<internal::AllocationClient::kArray>(n, type);
-}
-
-PROTOBUF_FUNC_ALIGN(32)
-std::pair<void*, internal::SerialArena::CleanupNode*>
-Arena::AllocateAlignedWithCleanup(size_t n, const std::type_info* type) {
- return impl_.AllocateAlignedWithCleanup(n, type);
+void* Arena::AllocateAlignedWithCleanup(size_t n, size_t align,
+ void (*destructor)(void*)) {
+ return impl_.AllocateAlignedWithCleanup(n, align, destructor);
}
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/arena.h b/src/google/protobuf/arena.h
index 3b5f16c..d3dec65 100644
--- a/src/google/protobuf/arena.h
+++ b/src/google/protobuf/arena.h
@@ -49,11 +49,12 @@
#endif
#include <type_traits>
-#include <google/protobuf/arena_impl.h>
-#include <google/protobuf/port.h>
+#include "google/protobuf/arena_config.h"
+#include "google/protobuf/arena_impl.h"
+#include "google/protobuf/port.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
#ifdef SWIG
#error "You cannot SWIG proto headers"
@@ -86,25 +87,15 @@
class LazyField; // defined in lazy_field.h
class EpsCopyInputStream; // defined in parse_context.h
class RepeatedPtrFieldBase; // defined in repeated_ptr_field.h
+class TcParser; // defined in generated_message_tctable_impl.h
template <typename Type>
class GenericTypeHandler; // defined in repeated_field.h
-inline PROTOBUF_ALWAYS_INLINE
-void* AlignTo(void* ptr, size_t align) {
- return reinterpret_cast<void*>(
- (reinterpret_cast<uintptr_t>(ptr) + align - 1) & (~align + 1));
-}
-
-// Templated cleanup methods.
-template <typename T>
-void arena_destruct_object(void* object) {
- reinterpret_cast<T*>(object)->~T();
-}
-
template <bool destructor_skippable, typename T>
struct ObjectDestructor {
- constexpr static void (*destructor)(void*) = &arena_destruct_object<T>;
+ constexpr static void (*destructor)(void*) =
+ &internal::cleanup::arena_destruct_object<T>;
};
template <typename T>
@@ -131,7 +122,7 @@
// here.
size_t max_block_size;
- // An initial block of memory for the arena to use, or NULL for none. If
+ // An initial block of memory for the arena to use, or nullptr for none. If
// provided, the block must live at least as long as the arena itself. The
// creator of the Arena retains ownership of the block after the Arena is
// destroyed.
@@ -153,8 +144,8 @@
ArenaOptions()
: start_block_size(internal::AllocationPolicy::kDefaultStartBlockSize),
- max_block_size(internal::AllocationPolicy::kDefaultMaxBlockSize),
- initial_block(NULL),
+ max_block_size(internal::GetDefaultArenaMaxBlockSize()),
+ initial_block(nullptr),
initial_block_size(0),
block_alloc(nullptr),
block_dealloc(nullptr),
@@ -176,7 +167,6 @@
res.max_block_size = max_block_size;
res.block_alloc = block_alloc;
res.block_dealloc = block_dealloc;
- res.metrics_collector = MetricsCollector();
return res;
}
@@ -186,14 +176,6 @@
friend class ArenaOptionsTestFriend;
};
-// Support for non-RTTI environments. (The metrics hooks API uses type
-// information.)
-#if PROTOBUF_RTTI
-#define RTTI_TYPE_ID(type) (&typeid(type))
-#else
-#define RTTI_TYPE_ID(type) (NULL)
-#endif
-
// Arena allocator. Arena allocation replaces ordinary (heap-based) allocation
// with new/delete, and improves performance by aggregating allocations into
// larger blocks and freeing allocations all at once. Protocol messages are
@@ -221,7 +203,7 @@
// with `args` (without `arena`), called when a T is allocated on the heap;
// and a constructor callable with `Arena* arena, Args&&... args`, called when
// a T is allocated on an arena. If the second constructor is called with a
-// NULL arena pointer, it must be equivalent to invoking the first
+// null arena pointer, it must be equivalent to invoking the first
// (`args`-only) constructor.
//
// - The type T must have a particular type trait: a nested type
@@ -231,7 +213,7 @@
//
// - The type T *may* have the type trait |DestructorSkippable_|. If this type
// trait is present in the type, then its destructor will not be called if and
-// only if it was passed a non-NULL arena pointer. If this type trait is not
+// only if it was passed a non-null arena pointer. If this type trait is not
// present on the type, then its destructor is always called when the
// containing arena is destroyed.
//
@@ -270,13 +252,10 @@
inline ~Arena() {}
- // TODO(protobuf-team): Fix callers to use constructor and delete this method.
- void Init(const ArenaOptions&) {}
-
// API to create proto2 message objects on the arena. If the arena passed in
- // is NULL, then a heap allocated object is returned. Type T must be a message
- // defined in a .proto file with cc_enable_arenas set to true, otherwise a
- // compilation error will occur.
+ // is nullptr, then a heap allocated object is returned. Type T must be a
+ // message defined in a .proto file with cc_enable_arenas set to true,
+ // otherwise a compilation error will occur.
//
// RepeatedField and RepeatedPtrField may also be instantiated directly on an
// arena with this method.
@@ -315,17 +294,26 @@
static_cast<Args&&>(args)...);
}
+ // API to delete any objects not on an arena. This can be used to safely
+ // clean up messages or repeated fields without knowing whether or not they're
+ // owned by an arena. The pointer passed to this function should not be used
+ // again.
+ template <typename T>
+ PROTOBUF_ALWAYS_INLINE static void Destroy(T* obj) {
+ if (InternalGetOwningArena(obj) == nullptr) delete obj;
+ }
+
// Allocates memory with the specific size and alignment.
void* AllocateAligned(size_t size, size_t align = 8) {
if (align <= 8) {
- return AllocateAlignedNoHook(internal::AlignUpTo8(size));
+ return Allocate(internal::AlignUpTo8(size));
} else {
// We are wasting space by over allocating align - 8 bytes. Compared
// to a dedicated function that takes current alignment in consideration.
// Such a scheme would only waste (align - 8)/2 bytes on average, but
// requires a dedicated function in the outline arena allocation
// functions. Possibly re-evaluate tradeoffs later.
- return internal::AlignTo(AllocateAlignedNoHook(size + align - 8), align);
+ return internal::AlignTo(Allocate(size + align - 8), align);
}
}
@@ -344,7 +332,7 @@
"CreateArray requires a trivially destructible type");
GOOGLE_CHECK_LE(num_elements, std::numeric_limits<size_t>::max() / sizeof(T))
<< "Requested size is too large to fit into size_t.";
- if (arena == NULL) {
+ if (arena == nullptr) {
return static_cast<T*>(::operator new[](num_elements * sizeof(T)));
} else {
return arena->CreateInternalRawArray<T>(num_elements);
@@ -359,9 +347,12 @@
// sizes of the underlying blocks.
uint64_t SpaceAllocated() const { return impl_.SpaceAllocated(); }
// Returns the total space used by the arena. Similar to SpaceAllocated but
- // does not include free space and block overhead. The total space returned
- // may not include space used by other threads executing concurrently with
- // the call to this method.
+ // does not include free space and block overhead. This is a best-effort
+ // estimate and may inaccurately calculate space used by other threads
+ // executing concurrently with the call to this method. These inaccuracies
+ // are due to race conditions, and are bounded but unpredictable. Stale data
+ // can lead to underestimates of the space used, and race conditions can lead
+ // to overestimates (up to the current block size).
uint64_t SpaceUsed() const { return impl_.SpaceUsed(); }
// Frees all storage allocated by this arena after calling destructors
@@ -385,8 +376,8 @@
// arena-allocated memory.
template <typename T>
PROTOBUF_ALWAYS_INLINE void OwnDestructor(T* object) {
- if (object != NULL) {
- impl_.AddCleanup(object, &internal::arena_destruct_object<T>);
+ if (object != nullptr) {
+ impl_.AddCleanup(object, &internal::cleanup::arena_destruct_object<T>);
}
}
@@ -400,9 +391,9 @@
}
// Retrieves the arena associated with |value| if |value| is an arena-capable
- // message, or NULL otherwise. If possible, the call resolves at compile time.
- // Note that we can often devirtualize calls to `value->GetArena()` so usually
- // calling this method is unnecessary.
+ // message, or nullptr otherwise. If possible, the call resolves at compile
+ // time. Note that we can often devirtualize calls to `value->GetArena()` so
+ // usually calling this method is unnecessary.
template <typename T>
PROTOBUF_ALWAYS_INLINE static Arena* GetArena(const T* value) {
return GetArenaInternal(value);
@@ -411,40 +402,62 @@
template <typename T>
class InternalHelper {
private:
- // Provides access to protected GetOwningArena to generated messages.
- static Arena* GetOwningArena(const T* p) { return p->GetOwningArena(); }
+ // A SFINAE friendly trait that probes for `U` but always evalues to
+ // `Arena*`.
+ template <typename U>
+ using EnableIfArena =
+ typename std::enable_if<std::is_same<Arena*, U>::value, Arena*>::type;
+
+ // Rather than use SFINAE that must fully cover the space of options in a
+ // mutually exclusive fashion, we use implicit conversions to base classes
+ // to force an explicit ranking for our preferences. The lowest ranked
+ // version that compiles will be accepted.
+ struct Rank2 {};
+ struct Rank1 : Rank2 {};
+ struct Rank0 : Rank1 {};
+
+ static Arena* GetOwningArena(const T* p) {
+ return GetOwningArena(Rank0{}, p);
+ }
+
+ template <typename U>
+ static auto GetOwningArena(Rank0, const U* p)
+ -> EnableIfArena<decltype(p->GetOwningArena())> {
+ return p->GetOwningArena();
+ }
+
+ template <typename U>
+ static Arena* GetOwningArena(Rank1, const U* p) {
+ return nullptr;
+ }
static void InternalSwap(T* a, T* b) { a->InternalSwap(b); }
- static Arena* GetArenaForAllocationInternal(
- const T* p, std::true_type /*is_derived_from<MessageLite>*/) {
+ static Arena* GetArenaForAllocation(const T* p) {
+ return GetArenaForAllocation(Rank0{}, p);
+ }
+
+ static Arena* GetArena(const T* p) {
+ // Rather than replicate probing for `GetArena` with fallback to nullptr,
+ // we borrow the implementation of `GetArenaForAllocation` but skip
+ // `Rank0` which probes for `GetArenaForAllocation`.
+ return GetArenaForAllocation(Rank1{}, p);
+ }
+
+ template <typename U>
+ static auto GetArenaForAllocation(Rank0, const U* p)
+ -> EnableIfArena<decltype(p->GetArenaForAllocation())> {
return p->GetArenaForAllocation();
}
- static Arena* GetArenaForAllocationInternal(
- const T* p, std::false_type /*is_derived_from<MessageLite>*/) {
- return GetArenaForAllocationForNonMessage(
- p, typename is_arena_constructable::type());
- }
-
- static Arena* GetArenaForAllocationForNonMessage(
- const T* p, std::true_type /*is_arena_constructible*/) {
+ template <typename U>
+ static auto GetArenaForAllocation(Rank1, const U* p)
+ -> EnableIfArena<decltype(p->GetArena())> {
return p->GetArena();
}
- static Arena* GetArenaForAllocationForNonMessage(
- const T* p, std::false_type /*is_arena_constructible*/) {
- return GetArenaForAllocationForNonMessageNonArenaConstructible(
- p, typename has_get_arena::type());
- }
-
- static Arena* GetArenaForAllocationForNonMessageNonArenaConstructible(
- const T* p, std::true_type /*has_get_arena*/) {
- return p->GetArena();
- }
-
- static Arena* GetArenaForAllocationForNonMessageNonArenaConstructible(
- const T* /* p */, std::false_type /*has_get_arena*/) {
+ template <typename U>
+ static Arena* GetArenaForAllocation(Rank2, const U* p) {
return nullptr;
}
@@ -470,18 +483,6 @@
sizeof(char)>
is_arena_constructable;
- template <typename U,
- typename std::enable_if<
- std::is_same<Arena*, decltype(std::declval<const U>()
- .GetArena())>::value,
- int>::type = 0>
- static char HasGetArena(decltype(&U::GetArena));
- template <typename U>
- static double HasGetArena(...);
-
- typedef std::integral_constant<bool, sizeof(HasGetArena<T>(nullptr)) ==
- sizeof(char)>
- has_get_arena;
template <typename... Args>
static T* Construct(void* ptr, Args&&... args) {
@@ -492,8 +493,6 @@
return new T(nullptr);
}
- static Arena* GetArena(const T* p) { return p->GetArena(); }
-
friend class Arena;
friend class TestUtil::ReflectionTester;
};
@@ -509,8 +508,7 @@
// For internal use only.
template <typename T>
static Arena* InternalGetArenaForAllocation(const T* p) {
- return InternalHelper<T>::GetArenaForAllocationInternal(
- p, std::is_convertible<T*, MessageLite*>());
+ return InternalHelper<T>::GetArenaForAllocation(p);
}
// Creates message-owned arena. For internal use only.
@@ -542,9 +540,6 @@
private:
internal::ThreadSafeArena impl_;
- template <typename T>
- struct has_get_arena : InternalHelper<T>::has_get_arena {};
-
// Constructor solely used by message-owned arena.
inline Arena(internal::MessageOwned) : impl_(internal::MessageOwned{}) {}
@@ -563,7 +558,7 @@
static_assert(
InternalHelper<T>::is_arena_constructable::value,
"CreateMessage can only construct types that are ArenaConstructable");
- if (arena == NULL) {
+ if (arena == nullptr) {
return new T(nullptr, static_cast<Args&&>(args)...);
} else {
return arena->DoCreateMessage<T>(static_cast<Args&&>(args)...);
@@ -578,7 +573,7 @@
static_assert(
InternalHelper<T>::is_arena_constructable::value,
"CreateMessage can only construct types that are ArenaConstructable");
- if (arena == NULL) {
+ if (arena == nullptr) {
// Generated arena constructor T(Arena*) is protected. Call via
// InternalHelper.
return InternalHelper<T>::New();
@@ -587,27 +582,13 @@
}
}
- // Allocate and also optionally call collector with the allocated type info
- // when allocation recording is enabled.
PROTOBUF_NDEBUG_INLINE void* AllocateInternal(size_t size, size_t align,
- void (*destructor)(void*),
- const std::type_info* type) {
+ void (*destructor)(void*)) {
// Monitor allocation if needed.
if (destructor == nullptr) {
- return AllocateAlignedWithHook(size, align, type);
+ return AllocateAligned(size, align);
} else {
- if (align <= 8) {
- auto res = AllocateAlignedWithCleanup(internal::AlignUpTo8(size), type);
- res.second->elem = res.first;
- res.second->cleanup = destructor;
- return res.first;
- } else {
- auto res = AllocateAlignedWithCleanup(size + align - 8, type);
- auto ptr = internal::AlignTo(res.first, align);
- res.second->elem = ptr;
- res.second->cleanup = destructor;
- return ptr;
- }
+ return AllocateAlignedWithCleanup(size, align, destructor);
}
}
@@ -646,8 +627,7 @@
// We count on compiler to realize that if sizeof(T) is a multiple of
// 8 AlignUpTo can be elided.
const size_t n = sizeof(T) * num_elements;
- return static_cast<T*>(
- AllocateAlignedWithHookForArray(n, alignof(T), RTTI_TYPE_ID(T)));
+ return static_cast<T*>(AllocateAlignedForArray(n, alignof(T)));
}
template <typename T, typename... Args>
@@ -656,8 +636,7 @@
AllocateInternal(sizeof(T), alignof(T),
internal::ObjectDestructor<
InternalHelper<T>::is_destructor_skippable::value,
- T>::destructor,
- RTTI_TYPE_ID(T)),
+ T>::destructor),
this, std::forward<Args>(args)...);
}
@@ -708,9 +687,8 @@
internal::ObjectDestructor<std::is_trivially_destructible<T>::value,
T>::destructor;
T* result =
- new (arena->AllocateInternal(sizeof(T), alignof(T), destructor,
- RTTI_TYPE_ID(T)))
- T(std::forward<Args>(args)...);
+ new (arena->AllocateInternal(sizeof(T), alignof(T), destructor))
+ T(std::forward<Args>(args)...);
return result;
}
}
@@ -723,8 +701,7 @@
auto destructor =
internal::ObjectDestructor<std::is_trivially_destructible<T>::value,
T>::destructor;
- return new (arena->AllocateInternal(sizeof(T), alignof(T), destructor,
- RTTI_TYPE_ID(T)))
+ return new (arena->AllocateInternal(sizeof(T), alignof(T), destructor))
T(std::forward<Args>(args)...);
}
}
@@ -736,13 +713,13 @@
// using the virtual destructor instead.
template <typename T>
PROTOBUF_ALWAYS_INLINE void OwnInternal(T* object, std::true_type) {
- if (object != NULL) {
+ if (object != nullptr) {
impl_.AddCleanup(object, &internal::arena_delete_object<MessageLite>);
}
}
template <typename T>
PROTOBUF_ALWAYS_INLINE void OwnInternal(T* object, std::false_type) {
- if (object != NULL) {
+ if (object != nullptr) {
impl_.AddCleanup(object, &internal::arena_delete_object<T>);
}
}
@@ -750,87 +727,35 @@
// Implementation for GetArena(). Only message objects with
// InternalArenaConstructable_ tags can be associated with an arena, and such
// objects must implement a GetArena() method.
- template <typename T, typename std::enable_if<
- is_arena_constructable<T>::value, int>::type = 0>
+ template <typename T>
PROTOBUF_ALWAYS_INLINE static Arena* GetArenaInternal(const T* value) {
return InternalHelper<T>::GetArena(value);
}
- template <typename T,
- typename std::enable_if<!is_arena_constructable<T>::value &&
- has_get_arena<T>::value,
- int>::type = 0>
- PROTOBUF_ALWAYS_INLINE static Arena* GetArenaInternal(const T* value) {
- return value->GetArena();
- }
- template <typename T,
- typename std::enable_if<!is_arena_constructable<T>::value &&
- !has_get_arena<T>::value,
- int>::type = 0>
- PROTOBUF_ALWAYS_INLINE static Arena* GetArenaInternal(const T* value) {
- (void)value;
- return nullptr;
- }
- template <typename T>
- PROTOBUF_ALWAYS_INLINE static Arena* GetOwningArena(const T* value) {
- return GetOwningArenaInternal(
- value, std::is_convertible<T*, MessageLite*>());
- }
-
- // Implementation for GetOwningArena(). All and only message objects have
- // GetOwningArena() method.
- template <typename T>
- PROTOBUF_ALWAYS_INLINE static Arena* GetOwningArenaInternal(
- const T* value, std::true_type) {
- return InternalHelper<T>::GetOwningArena(value);
- }
- template <typename T>
- PROTOBUF_ALWAYS_INLINE static Arena* GetOwningArenaInternal(
- const T* /* value */, std::false_type) {
- return nullptr;
- }
-
- void* AllocateAlignedWithHookForArray(size_t n, size_t align,
- const std::type_info* type) {
+ void* AllocateAlignedForArray(size_t n, size_t align) {
if (align <= 8) {
- return AllocateAlignedWithHookForArray(internal::AlignUpTo8(n), type);
+ return AllocateForArray(internal::AlignUpTo8(n));
} else {
// We are wasting space by over allocating align - 8 bytes. Compared
// to a dedicated function that takes current alignment in consideration.
// Such a scheme would only waste (align - 8)/2 bytes on average, but
// requires a dedicated function in the outline arena allocation
// functions. Possibly re-evaluate tradeoffs later.
- return internal::AlignTo(
- AllocateAlignedWithHookForArray(n + align - 8, type), align);
+ return internal::AlignTo(AllocateForArray(n + align - 8), align);
}
}
- void* AllocateAlignedWithHook(size_t n, size_t align,
- const std::type_info* type) {
- if (align <= 8) {
- return AllocateAlignedWithHook(internal::AlignUpTo8(n), type);
- } else {
- // We are wasting space by over allocating align - 8 bytes. Compared
- // to a dedicated function that takes current alignment in consideration.
- // Such a scheme would only waste (align - 8)/2 bytes on average, but
- // requires a dedicated function in the outline arena allocation
- // functions. Possibly re-evaluate tradeoffs later.
- return internal::AlignTo(AllocateAlignedWithHook(n + align - 8, type),
- align);
- }
- }
-
- void* AllocateAlignedNoHook(size_t n);
- void* AllocateAlignedWithHook(size_t n, const std::type_info* type);
- void* AllocateAlignedWithHookForArray(size_t n, const std::type_info* type);
- std::pair<void*, internal::SerialArena::CleanupNode*>
- AllocateAlignedWithCleanup(size_t n, const std::type_info* type);
+ void* Allocate(size_t n);
+ void* AllocateForArray(size_t n);
+ void* AllocateAlignedWithCleanup(size_t n, size_t align,
+ void (*destructor)(void*));
template <typename Type>
friend class internal::GenericTypeHandler;
friend class internal::InternalMetadata; // For user_arena().
friend class internal::LazyField; // For CreateMaybeMessage.
friend class internal::EpsCopyInputStream; // For parser performance
+ friend class internal::TcParser; // For parser performance
friend class MessageLite;
template <typename Key, typename T>
friend class Map;
@@ -840,12 +765,9 @@
friend struct internal::ArenaTestPeer;
};
-// Defined above for supporting environments without RTTI.
-#undef RTTI_TYPE_ID
-
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_ARENA_H__
diff --git a/src/google/protobuf/stubs/once.h b/src/google/protobuf/arena_config.cc
similarity index 81%
rename from src/google/protobuf/stubs/once.h
rename to src/google/protobuf/arena_config.cc
index 070d36d..813f7d0 100644
--- a/src/google/protobuf/stubs/once.h
+++ b/src/google/protobuf/arena_config.cc
@@ -28,28 +28,26 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#ifndef GOOGLE_PROTOBUF_STUBS_ONCE_H__
-#define GOOGLE_PROTOBUF_STUBS_ONCE_H__
+#include "google/protobuf/arena_config.h"
-#include <mutex>
-#include <utility>
+#include <atomic>
+#include <cstddef>
-#include <google/protobuf/port_def.inc>
+// Must be included last.
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
namespace internal {
-using once_flag = std::once_flag;
-template <typename... Args>
-void call_once(Args&&... args ) {
- std::call_once(std::forward<Args>(args)...);
-}
+PROTOBUF_CONSTINIT const size_t kDefaultDefaultArenaMaxBlockSize = 8 << 10;
+namespace arena_config_internal {
+
+std::atomic<size_t> default_arena_max_block_size{
+ kDefaultDefaultArenaMaxBlockSize};
+
+} // namespace arena_config_internal
} // namespace internal
} // namespace protobuf
} // namespace google
-
-#include <google/protobuf/port_undef.inc>
-
-#endif // GOOGLE_PROTOBUF_STUBS_ONCE_H__
diff --git a/src/google/protobuf/arena_config.h b/src/google/protobuf/arena_config.h
new file mode 100644
index 0000000..f16d86a
--- /dev/null
+++ b/src/google/protobuf/arena_config.h
@@ -0,0 +1,73 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef GOOGLE_PROTOBUF_ARENA_CONFIG_H__
+#define GOOGLE_PROTOBUF_ARENA_CONFIG_H__
+
+#include <atomic>
+#include <cstddef>
+
+// Must be included last.
+#include "google/protobuf/port_def.inc"
+
+namespace google {
+namespace protobuf {
+namespace internal {
+namespace arena_config_internal {
+
+// We use an atomic here only for correctness so that we can read/write
+// concurrently. We don't have memory order requirements so we use relaxed
+// memory ordering.
+PROTOBUF_EXPORT extern std::atomic<size_t> default_arena_max_block_size;
+
+} // namespace arena_config_internal
+
+// The default value to use for DefaultArenaMaxBlockSize when
+// SetDefaultArenaMaxBlockSize hasn't been called.
+PROTOBUF_EXPORT extern const size_t kDefaultDefaultArenaMaxBlockSize;
+
+// The default value to use for arena max block size when no value is provided
+// in ArenaOptions.
+inline size_t GetDefaultArenaMaxBlockSize() {
+ return arena_config_internal::default_arena_max_block_size.load(
+ std::memory_order_relaxed);
+}
+inline void SetDefaultArenaMaxBlockSize(size_t default_arena_max_block_size) {
+ return arena_config_internal::default_arena_max_block_size.store(
+ default_arena_max_block_size, std::memory_order_relaxed);
+}
+
+} // namespace internal
+} // namespace protobuf
+} // namespace google
+
+#include "google/protobuf/port_undef.inc"
+
+#endif // GOOGLE_PROTOBUF_ARENA_CONFIG_H__
diff --git a/src/google/protobuf/arena_impl.h b/src/google/protobuf/arena_impl.h
index 7672768..fa4d6f5 100644
--- a/src/google/protobuf/arena_impl.h
+++ b/src/google/protobuf/arena_impl.h
@@ -35,20 +35,22 @@
#include <atomic>
#include <limits>
+#include <string>
+#include <type_traits>
#include <typeinfo>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/port.h>
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/stubs/logging.h"
+#include "absl/numeric/bits.h"
+#include "absl/synchronization/mutex.h"
+#include "google/protobuf/port.h"
-#ifdef ADDRESS_SANITIZER
-#include <sanitizer/asan_interface.h>
-#endif // ADDRESS_SANITIZER
-#include <google/protobuf/arenaz_sampler.h>
+#include "google/protobuf/arena_config.h"
+#include "google/protobuf/arenaz_sampler.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
@@ -62,11 +64,200 @@
enum { kCacheAlignment = alignof(max_align_t) }; // do the best we can
#endif
-inline constexpr size_t AlignUpTo8(size_t n) {
+inline PROTOBUF_ALWAYS_INLINE constexpr size_t AlignUpTo8(size_t n) {
// Align n to next multiple of 8 (from Hacker's Delight, Chapter 3.)
return (n + 7) & static_cast<size_t>(-8);
}
+inline PROTOBUF_ALWAYS_INLINE constexpr size_t AlignUpTo(size_t n, size_t a) {
+ // We are wasting space by over allocating align - 8 bytes. Compared to a
+ // dedicated function that takes current alignment in consideration. Such a
+ // scheme would only waste (align - 8)/2 bytes on average, but requires a
+ // dedicated function in the outline arena allocation functions. Possibly
+ // re-evaluate tradeoffs later.
+ return a <= 8 ? AlignUpTo8(n) : n + a - 8;
+}
+
+inline PROTOBUF_ALWAYS_INLINE void* AlignTo(void* p, size_t a) {
+ if (a <= 8) {
+ return p;
+ } else {
+ auto u = reinterpret_cast<uintptr_t>(p);
+ return reinterpret_cast<void*>((u + a - 1) & (~a + 1));
+ }
+}
+
+// Wraps std::atomic<T> to avoid accidentally accessing the atomic variable via
+// a default memory order (std::memory_order_seq_cst).
+template <typename T>
+struct Atomic {
+ PROTOBUF_CONSTEXPR explicit Atomic(T v) : val(v) {}
+
+ T relaxed_get() const { return val.load(std::memory_order_relaxed); }
+ T relaxed_get() { return val.load(std::memory_order_relaxed); }
+ void relaxed_set(T v) { val.store(v, std::memory_order_relaxed); }
+
+ T atomic_get() const { return val.load(std::memory_order_acquire); }
+ T atomic_get() { return val.load(std::memory_order_acquire); }
+ void atomic_set(T v) { val.store(v, std::memory_order_release); }
+
+ T relaxed_fetch_add(T v) {
+ return val.fetch_add(v, std::memory_order_relaxed);
+ }
+
+ private:
+ std::atomic<T> val;
+};
+
+// Arena blocks are variable length malloc-ed objects. The following structure
+// describes the common header for all blocks.
+struct ArenaBlock {
+ // For the sentry block with zero-size where ptr_, limit_, cleanup_nodes all
+ // point to "this".
+ PROTOBUF_CONSTEXPR ArenaBlock()
+ : next(nullptr), cleanup_nodes(this), relaxed_size(0) {}
+
+ ArenaBlock(ArenaBlock* next, size_t size)
+ : next(next), cleanup_nodes(nullptr), relaxed_size(size) {
+ GOOGLE_DCHECK_GT(size, sizeof(ArenaBlock));
+ }
+
+ char* Pointer(size_t n) {
+ GOOGLE_DCHECK_LE(n, size());
+ return reinterpret_cast<char*>(this) + n;
+ }
+ char* Limit() { return Pointer(size() & static_cast<size_t>(-8)); }
+
+ size_t size() const { return relaxed_size.relaxed_get(); }
+ bool IsSentry() const { return size() == 0; }
+
+ ArenaBlock* const next;
+ void* cleanup_nodes;
+
+ private:
+ const Atomic<size_t> relaxed_size;
+ // data follows
+};
+
+namespace cleanup {
+
+template <typename T>
+void arena_destruct_object(void* object) {
+ reinterpret_cast<T*>(object)->~T();
+}
+
+enum class Tag : uintptr_t {
+ kDynamic = 0, // {void* elem, void (*destructor)(void*)}
+ kString = 1, // std::string* | kString
+};
+
+constexpr bool EnableSpecializedTags() {
+ return alignof(std::string) >= 8
+ ;
+}
+
+// All node types must start with a `uintptr_t` that stores `Tag` in its low
+// two bits.
+struct DynamicNode {
+ uintptr_t elem;
+ void (*destructor)(void*);
+};
+
+struct StringNode {
+ uintptr_t elem;
+};
+
+
+inline PROTOBUF_ALWAYS_INLINE void CreateNode(Tag tag, void* pos,
+ const void* elem,
+ void (*destructor)(void*)) {
+ if (EnableSpecializedTags()) {
+ switch (tag) {
+ case Tag::kString: {
+ StringNode n = {reinterpret_cast<uintptr_t>(elem) |
+ static_cast<uintptr_t>(Tag::kString)};
+ memcpy(pos, &n, sizeof(n));
+ return;
+ }
+ default:
+ break;
+ }
+ }
+ DynamicNode n = {reinterpret_cast<uintptr_t>(elem), destructor};
+ memcpy(pos, &n, sizeof(n));
+}
+
+inline PROTOBUF_ALWAYS_INLINE void PrefetchNode(const void* elem_address) {
+ (void)elem_address;
+}
+
+inline PROTOBUF_ALWAYS_INLINE void DestroyNode(Tag tag, const void* pos) {
+ if (EnableSpecializedTags()) {
+ switch (tag) {
+ case Tag::kString: {
+ StringNode n;
+ memcpy(&n, pos, sizeof(n));
+ auto* s = reinterpret_cast<std::string*>(n.elem & ~0x7ULL);
+ // Some compilers don't like fully qualified explicit dtor calls,
+ // so use an alias to avoid having to type `::`.
+ using string_type = std::string;
+ s->~string_type();
+ return;
+ }
+ default:
+ break;
+ }
+ }
+ DynamicNode n;
+ memcpy(&n, pos, sizeof(n));
+ n.destructor(reinterpret_cast<void*>(n.elem));
+}
+
+inline PROTOBUF_ALWAYS_INLINE Tag Type(void (*destructor)(void*)) {
+ if (EnableSpecializedTags()) {
+ if (destructor == &arena_destruct_object<std::string>) {
+ return Tag::kString;
+ }
+ }
+ return Tag::kDynamic;
+}
+
+inline PROTOBUF_ALWAYS_INLINE Tag Type(void* raw) {
+ if (!EnableSpecializedTags()) return Tag::kDynamic;
+
+ uintptr_t elem;
+ memcpy(&elem, raw, sizeof(elem));
+ switch (static_cast<Tag>(elem & 0x7ULL)) {
+ case Tag::kDynamic:
+ return Tag::kDynamic;
+ case Tag::kString:
+ return Tag::kString;
+ default:
+ GOOGLE_LOG(FATAL) << "Corrupted cleanup tag: " << (elem & 0x7ULL);
+ return Tag::kDynamic;
+ }
+}
+
+inline PROTOBUF_ALWAYS_INLINE size_t Size(Tag tag) {
+ if (!EnableSpecializedTags()) return sizeof(DynamicNode);
+
+ switch (tag) {
+ case Tag::kDynamic:
+ return sizeof(DynamicNode);
+ case Tag::kString:
+ return sizeof(StringNode);
+ default:
+ GOOGLE_LOG(FATAL) << "Corrupted cleanup tag: " << static_cast<int>(tag);
+ return sizeof(DynamicNode);
+ }
+}
+
+inline PROTOBUF_ALWAYS_INLINE size_t Size(void (*destructor)(void*)) {
+ return destructor == nullptr ? 0 : Size(Type(destructor));
+}
+
+} // namespace cleanup
+
using LifecycleIdAtomic = uint64_t;
// MetricsCollector collects stats for a particular arena.
@@ -104,18 +295,16 @@
struct AllocationPolicy {
static constexpr size_t kDefaultStartBlockSize = 256;
- static constexpr size_t kDefaultMaxBlockSize = 8192;
size_t start_block_size = kDefaultStartBlockSize;
- size_t max_block_size = kDefaultMaxBlockSize;
+ size_t max_block_size = GetDefaultArenaMaxBlockSize();
void* (*block_alloc)(size_t) = nullptr;
void (*block_dealloc)(void*, size_t) = nullptr;
- ArenaMetricsCollector* metrics_collector = nullptr;
bool IsDefault() const {
- return start_block_size == kDefaultMaxBlockSize &&
- max_block_size == kDefaultMaxBlockSize && block_alloc == nullptr &&
- block_dealloc == nullptr && metrics_collector == nullptr;
+ return start_block_size == kDefaultStartBlockSize &&
+ max_block_size == GetDefaultArenaMaxBlockSize() &&
+ block_alloc == nullptr && block_dealloc == nullptr;
}
};
@@ -152,22 +341,11 @@
set_mask<kUserOwnedInitialBlock>(v);
}
- bool should_record_allocs() const {
- return static_cast<bool>(get_mask<kRecordAllocs>());
- }
- void set_should_record_allocs(bool v) { set_mask<kRecordAllocs>(v); }
-
uintptr_t get_raw() const { return policy_; }
- inline void RecordAlloc(const std::type_info* allocated_type,
- size_t n) const {
- get()->metrics_collector->OnAlloc(allocated_type, n);
- }
-
private:
enum : uintptr_t {
kUserOwnedInitialBlock = 1,
- kRecordAllocs = 2,
};
static constexpr uintptr_t kTagsMask = 7;
@@ -190,6 +368,13 @@
enum class AllocationClient { kDefault, kArray };
+class ThreadSafeArena;
+
+// Tag type used to invoke the constructor of the first SerialArena.
+struct FirstSerialArena {
+ explicit FirstSerialArena() = default;
+};
+
// A simple arena allocator. Calls to allocate functions must be properly
// serialized by the caller, hence this class cannot be used as a general
// purpose allocator in a multi-threaded program. It serves as a building block
@@ -198,7 +383,7 @@
// This class manages
// 1) Arena bump allocation + owning memory blocks.
// 2) Maintaining a cleanup list.
-// It delagetes the actual memory allocation back to ThreadSafeArena, which
+// It delegates the actual memory allocation back to ThreadSafeArena, which
// contains the information on block growth policy and backing memory allocation
// used.
class PROTOBUF_EXPORT SerialArena {
@@ -208,21 +393,12 @@
size_t size;
};
- // Node contains the ptr of the object to be cleaned up and the associated
- // cleanup function ptr.
- struct CleanupNode {
- void* elem; // Pointer to the object to be cleaned up.
- void (*cleanup)(void*); // Function pointer to the destructor or deleter.
- };
-
void CleanupList();
- uint64_t SpaceAllocated() const {
- return space_allocated_.load(std::memory_order_relaxed);
- }
+ uint64_t SpaceAllocated() const { return space_allocated_.relaxed_get(); }
uint64_t SpaceUsed() const;
bool HasSpace(size_t n) const {
- return n <= static_cast<size_t>(limit_ - ptr_);
+ return n <= static_cast<size_t>(limit_ - ptr());
}
// See comments on `cached_blocks_` member for details.
@@ -230,16 +406,14 @@
if (PROTOBUF_PREDICT_FALSE(size < 16)) return nullptr;
// We round up to the next larger block in case the memory doesn't match
// the pattern we are looking for.
- const size_t index = Bits::Log2FloorNonZero64(size - 1) - 3;
+ const size_t index = absl::bit_width(size - 1) - 4;
if (index >= cached_block_length_) return nullptr;
auto& cached_head = cached_blocks_[index];
if (cached_head == nullptr) return nullptr;
void* ret = cached_head;
-#ifdef ADDRESS_SANITIZER
- ASAN_UNPOISON_MEMORY_REGION(ret, size);
-#endif // ADDRESS_SANITIZER
+ PROTOBUF_UNPOISON_MEMORY_REGION(ret, size);
cached_head = cached_head->next;
return ret;
}
@@ -252,9 +426,9 @@
// the right size. We can statically know if the allocation size can benefit
// from it.
template <AllocationClient alloc_client = AllocationClient::kDefault>
- void* AllocateAligned(size_t n, const AllocationPolicy* policy) {
+ void* AllocateAligned(size_t n) {
GOOGLE_DCHECK_EQ(internal::AlignUpTo8(n), n); // Must be already aligned.
- GOOGLE_DCHECK_GE(limit_, ptr_);
+ GOOGLE_DCHECK_GE(limit_, ptr());
if (alloc_client == AllocationClient::kArray) {
if (void* res = TryAllocateFromCachedBlock(n)) {
@@ -263,18 +437,16 @@
}
if (PROTOBUF_PREDICT_FALSE(!HasSpace(n))) {
- return AllocateAlignedFallback(n, policy);
+ return AllocateAlignedFallback(n);
}
return AllocateFromExisting(n);
}
private:
void* AllocateFromExisting(size_t n) {
- void* ret = ptr_;
- ptr_ += n;
-#ifdef ADDRESS_SANITIZER
- ASAN_UNPOISON_MEMORY_REGION(ret, n);
-#endif // ADDRESS_SANITIZER
+ PROTOBUF_UNPOISON_MEMORY_REGION(ptr(), n);
+ void* ret = ptr();
+ set_ptr(static_cast<char*>(ret) + n);
return ret;
}
@@ -286,13 +458,13 @@
if (sizeof(void*) < 8) {
if (PROTOBUF_PREDICT_FALSE(size < 16)) return;
} else {
- GOOGLE_DCHECK(size >= 16);
+ PROTOBUF_ASSUME(size >= 16);
}
// We round down to the next smaller block in case the memory doesn't match
// the pattern we are looking for. eg, someone might have called Reserve()
// on the repeated field.
- const size_t index = Bits::Log2FloorNonZero64(size) - 4;
+ const size_t index = absl::bit_width(size) - 5;
if (PROTOBUF_PREDICT_FALSE(index >= cached_block_length_)) {
// We can't put this object on the freelist so make this object the
@@ -303,7 +475,15 @@
std::copy(cached_blocks_, cached_blocks_ + cached_block_length_,
new_list);
+
+ // We need to unpoison this memory before filling it in case it has been
+ // poisoned by another santizer client.
+ PROTOBUF_UNPOISON_MEMORY_REGION(
+ new_list + cached_block_length_,
+ (new_size - cached_block_length_) * sizeof(CachedBlock*));
+
std::fill(new_list + cached_block_length_, new_list + new_size, nullptr);
+
cached_blocks_ = new_list;
// Make the size fit in uint8_t. This is the power of two, so we don't
// need anything larger.
@@ -317,98 +497,109 @@
auto* new_node = static_cast<CachedBlock*>(p);
new_node->next = cached_head;
cached_head = new_node;
-#ifdef ADDRESS_SANITIZER
- ASAN_POISON_MEMORY_REGION(p, size);
-#endif // ADDRESS_SANITIZER
+ PROTOBUF_POISON_MEMORY_REGION(p, size);
}
public:
// Allocate space if the current region provides enough space.
bool MaybeAllocateAligned(size_t n, void** out) {
GOOGLE_DCHECK_EQ(internal::AlignUpTo8(n), n); // Must be already aligned.
- GOOGLE_DCHECK_GE(limit_, ptr_);
+ GOOGLE_DCHECK_GE(limit_, ptr());
if (PROTOBUF_PREDICT_FALSE(!HasSpace(n))) return false;
*out = AllocateFromExisting(n);
return true;
}
- std::pair<void*, CleanupNode*> AllocateAlignedWithCleanup(
- size_t n, const AllocationPolicy* policy) {
- GOOGLE_DCHECK_EQ(internal::AlignUpTo8(n), n); // Must be already aligned.
- if (PROTOBUF_PREDICT_FALSE(!HasSpace(n + kCleanupSize))) {
- return AllocateAlignedWithCleanupFallback(n, policy);
+ // If there is enough space in the current block, allocate space for one `T`
+ // object and register for destruction. The object has not been constructed
+ // and the memory returned is uninitialized.
+ template <typename T>
+ PROTOBUF_ALWAYS_INLINE void* MaybeAllocateWithCleanup() {
+ GOOGLE_DCHECK_GE(limit_, ptr());
+ static_assert(!std::is_trivially_destructible<T>::value,
+ "This function is only for non-trivial types.");
+
+ constexpr int aligned_size = AlignUpTo8(sizeof(T));
+ constexpr auto destructor = cleanup::arena_destruct_object<T>;
+ size_t required = aligned_size + cleanup::Size(destructor);
+ if (PROTOBUF_PREDICT_FALSE(!HasSpace(required))) {
+ return nullptr;
}
- return AllocateFromExistingWithCleanupFallback(n);
+ void* ptr = AllocateFromExistingWithCleanupFallback(aligned_size,
+ alignof(T), destructor);
+ PROTOBUF_ASSUME(ptr != nullptr);
+ return ptr;
+ }
+
+ PROTOBUF_ALWAYS_INLINE
+ void* AllocateAlignedWithCleanup(size_t n, size_t align,
+ void (*destructor)(void*)) {
+ size_t required = AlignUpTo(n, align) + cleanup::Size(destructor);
+ if (PROTOBUF_PREDICT_FALSE(!HasSpace(required))) {
+ return AllocateAlignedWithCleanupFallback(n, align, destructor);
+ }
+ return AllocateFromExistingWithCleanupFallback(n, align, destructor);
+ }
+
+ PROTOBUF_ALWAYS_INLINE
+ void AddCleanup(void* elem, void (*destructor)(void*),
+ const AllocationPolicy* policy, ThreadSafeArenaStats* stats) {
+ size_t required = cleanup::Size(destructor);
+ if (PROTOBUF_PREDICT_FALSE(!HasSpace(required))) {
+ return AddCleanupFallback(elem, destructor);
+ }
+ AddCleanupFromExisting(elem, destructor);
}
private:
- std::pair<void*, CleanupNode*> AllocateFromExistingWithCleanupFallback(
- size_t n) {
- void* ret = ptr_;
- ptr_ += n;
- limit_ -= kCleanupSize;
-#ifdef ADDRESS_SANITIZER
- ASAN_UNPOISON_MEMORY_REGION(ret, n);
- ASAN_UNPOISON_MEMORY_REGION(limit_, kCleanupSize);
-#endif // ADDRESS_SANITIZER
- return CreatePair(ret, reinterpret_cast<CleanupNode*>(limit_));
+ void* AllocateFromExistingWithCleanupFallback(size_t n, size_t align,
+ void (*destructor)(void*)) {
+ n = AlignUpTo(n, align);
+ PROTOBUF_UNPOISON_MEMORY_REGION(ptr(), n);
+ void* ret = internal::AlignTo(ptr(), align);
+ set_ptr(ptr() + n);
+ GOOGLE_DCHECK_GE(limit_, ptr());
+ AddCleanupFromExisting(ret, destructor);
+ return ret;
}
- public:
- void AddCleanup(void* elem, void (*cleanup)(void*),
- const AllocationPolicy* policy) {
- auto res = AllocateAlignedWithCleanup(0, policy);
- res.second->elem = elem;
- res.second->cleanup = cleanup;
- }
+ PROTOBUF_ALWAYS_INLINE
+ void AddCleanupFromExisting(void* elem, void (*destructor)(void*)) {
+ cleanup::Tag tag = cleanup::Type(destructor);
+ size_t n = cleanup::Size(tag);
- void* owner() const { return owner_; }
- SerialArena* next() const { return next_; }
- void set_next(SerialArena* next) { next_ = next; }
+ PROTOBUF_UNPOISON_MEMORY_REGION(limit_ - n, n);
+ limit_ -= n;
+ GOOGLE_DCHECK_GE(limit_, ptr());
+ cleanup::CreateNode(tag, limit_, elem, destructor);
+ }
private:
friend class ThreadSafeArena;
- friend class ArenaBenchmark;
// Creates a new SerialArena inside mem using the remaining memory as for
// future allocations.
- static SerialArena* New(SerialArena::Memory mem, void* owner,
- ThreadSafeArenaStats* stats);
+ // The `parent` arena must outlive the serial arena, which is guaranteed
+ // because the parent manages the lifetime of the serial arenas.
+ static SerialArena* New(SerialArena::Memory mem, ThreadSafeArena& parent);
// Free SerialArena returning the memory passed in to New
template <typename Deallocator>
Memory Free(Deallocator deallocator);
- // Blocks are variable length malloc-ed objects. The following structure
- // describes the common header for all blocks.
- struct Block {
- Block(Block* next, size_t size) : next(next), size(size), start(nullptr) {}
-
- char* Pointer(size_t n) {
- GOOGLE_DCHECK(n <= size);
- return reinterpret_cast<char*>(this) + n;
- }
-
- Block* const next;
- const size_t size;
- CleanupNode* start;
- // data follows
- };
-
- void* owner_; // &ThreadCache of this thread;
- Block* head_; // Head of linked list of blocks.
- SerialArena* next_; // Next SerialArena in this linked list.
- size_t space_used_ = 0; // Necessary for metrics.
- std::atomic<size_t> space_allocated_;
+ // Members are declared here to track sizeof(SerialArena) and hotness
+ // centrally. They are (roughly) laid out in descending order of hotness.
// Next pointer to allocate from. Always 8-byte aligned. Points inside
// head_ (and head_->pos will always be non-canonical). We keep these
// here to reduce indirection.
- char* ptr_;
+ Atomic<char*> ptr_{nullptr};
// Limiting address up to which memory can be allocated from the head block.
- char* limit_;
- // For holding sampling information. The pointer is owned by the
- // ThreadSafeArena that holds this serial arena.
- ThreadSafeArenaStats* arena_stats_;
+ char* limit_ = nullptr;
+
+ Atomic<ArenaBlock*> head_{nullptr}; // Head of linked list of blocks.
+ Atomic<size_t> space_used_{0}; // Necessary for metrics.
+ Atomic<size_t> space_allocated_{0};
+ ThreadSafeArena& parent_;
// Repeated*Field and Arena play together to reduce memory consumption by
// reusing blocks. Currently, natural growth of the repeated field types makes
@@ -424,20 +615,31 @@
uint8_t cached_block_length_ = 0;
CachedBlock** cached_blocks_ = nullptr;
- // Constructor is private as only New() should be used.
- inline SerialArena(Block* b, void* owner, ThreadSafeArenaStats* stats);
- void* AllocateAlignedFallback(size_t n, const AllocationPolicy* policy);
- std::pair<void*, CleanupNode*> AllocateAlignedWithCleanupFallback(
- size_t n, const AllocationPolicy* policy);
- void AllocateNewBlock(size_t n, const AllocationPolicy* policy);
+ // Helper getters/setters to handle relaxed operations on atomic variables.
+ ArenaBlock* head() { return head_.relaxed_get(); }
+ const ArenaBlock* head() const { return head_.relaxed_get(); }
+ void set_head(ArenaBlock* head) { return head_.relaxed_set(head); }
- std::pair<void*, CleanupNode*> CreatePair(void* ptr, CleanupNode* node) {
- return {ptr, node};
- }
+ char* ptr() { return ptr_.relaxed_get(); }
+ const char* ptr() const { return ptr_.relaxed_get(); }
+ void set_ptr(char* ptr) { return ptr_.relaxed_set(ptr); }
+
+ // Constructor is private as only New() should be used.
+ inline SerialArena(ArenaBlock* b, ThreadSafeArena& parent);
+
+ // Constructors to handle the first SerialArena.
+ inline explicit SerialArena(ThreadSafeArena& parent);
+ inline SerialArena(FirstSerialArena, ArenaBlock* b, ThreadSafeArena& parent);
+
+ void* AllocateAlignedFallback(size_t n);
+ void* AllocateAlignedWithCleanupFallback(size_t n, size_t align,
+ void (*destructor)(void*));
+ void AddCleanupFallback(void* elem, void (*destructor)(void*));
+ inline void AllocateNewBlock(size_t n);
+ inline void Init(ArenaBlock* b, size_t offset);
public:
- static constexpr size_t kBlockHeaderSize = AlignUpTo8(sizeof(Block));
- static constexpr size_t kCleanupSize = AlignUpTo8(sizeof(CleanupNode));
+ static constexpr size_t kBlockHeaderSize = AlignUpTo8(sizeof(ArenaBlock));
};
// Tag type used to invoke the constructor of message-owned arena.
@@ -455,19 +657,22 @@
// use #ifdef the select the best implementation based on hardware / OS.
class PROTOBUF_EXPORT ThreadSafeArena {
public:
- ThreadSafeArena() { Init(); }
+ ThreadSafeArena();
// Constructor solely used by message-owned arena.
- ThreadSafeArena(internal::MessageOwned) : tag_and_id_(kMessageOwnedArena) {
- Init();
- }
+ explicit ThreadSafeArena(internal::MessageOwned);
- ThreadSafeArena(char* mem, size_t size) { InitializeFrom(mem, size); }
+ ThreadSafeArena(char* mem, size_t size);
explicit ThreadSafeArena(void* mem, size_t size,
- const AllocationPolicy& policy) {
- InitializeWithPolicy(mem, size, policy);
- }
+ const AllocationPolicy& policy);
+
+ // All protos have pointers back to the arena hence Arena must have
+ // pointer stability.
+ ThreadSafeArena(const ThreadSafeArena&) = delete;
+ ThreadSafeArena& operator=(const ThreadSafeArena&) = delete;
+ ThreadSafeArena(ThreadSafeArena&&) = delete;
+ ThreadSafeArena& operator=(ThreadSafeArena&&) = delete;
// Destructor deletes all owned heap allocated objects, and destructs objects
// that have non-trivial destructors, except for proto2 message objects whose
@@ -481,13 +686,12 @@
uint64_t SpaceUsed() const;
template <AllocationClient alloc_client = AllocationClient::kDefault>
- void* AllocateAligned(size_t n, const std::type_info* type) {
+ void* AllocateAligned(size_t n) {
SerialArena* arena;
- if (PROTOBUF_PREDICT_TRUE(!alloc_policy_.should_record_allocs() &&
- GetSerialArenaFast(&arena))) {
- return arena->AllocateAligned<alloc_client>(n, AllocPolicy());
+ if (PROTOBUF_PREDICT_TRUE(GetSerialArenaFast(&arena))) {
+ return arena->AllocateAligned<alloc_client>(n);
} else {
- return AllocateAlignedFallback(n, type);
+ return AllocateAlignedFallback<alloc_client>(n);
}
}
@@ -505,15 +709,14 @@
// code for the happy path.
PROTOBUF_NDEBUG_INLINE bool MaybeAllocateAligned(size_t n, void** out) {
SerialArena* arena;
- if (PROTOBUF_PREDICT_TRUE(!alloc_policy_.should_record_allocs() &&
- GetSerialArenaFromThreadCache(&arena))) {
+ if (PROTOBUF_PREDICT_TRUE(GetSerialArenaFast(&arena))) {
return arena->MaybeAllocateAligned(n, out);
}
return false;
}
- std::pair<void*, SerialArena::CleanupNode*> AllocateAlignedWithCleanup(
- size_t n, const std::type_info* type);
+ void* AllocateAlignedWithCleanup(size_t n, size_t align,
+ void (*destructor)(void*));
// Add object pointer and cleanup function pointer to the list.
void AddCleanup(void* elem, void (*cleanup)(void*));
@@ -524,62 +727,73 @@
}
private:
+ friend class ArenaBenchmark;
+ friend class TcParser;
+ friend class SerialArena;
+ friend struct SerialArenaChunkHeader;
+ static uint64_t GetNextLifeCycleId();
+
+ class SerialArenaChunk;
+
+ // Returns a new SerialArenaChunk that has {id, serial} at slot 0. It may
+ // grow based on "prev_num_slots".
+ static SerialArenaChunk* NewSerialArenaChunk(uint32_t prev_capacity, void* id,
+ SerialArena* serial);
+ static SerialArenaChunk* SentrySerialArenaChunk();
+
+ // Returns the first ArenaBlock* for the first SerialArena. If users provide
+ // one, use it if it's acceptable. Otherwise returns a sentry block.
+ ArenaBlock* FirstBlock(void* buf, size_t size);
+ // Same as the above but returns a valid block if "policy" is not default.
+ ArenaBlock* FirstBlock(void* buf, size_t size,
+ const AllocationPolicy& policy);
+
+ // Adds SerialArena to the chunked list. May create a new chunk.
+ void AddSerialArena(void* id, SerialArena* serial);
+
+ // Members are declared here to track sizeof(ThreadSafeArena) and hotness
+ // centrally.
+
// Unique for each arena. Changes on Reset().
uint64_t tag_and_id_ = 0;
+
+ TaggedAllocationPolicyPtr alloc_policy_; // Tagged pointer to AllocPolicy.
+ ThreadSafeArenaStatsHandle arena_stats_;
+
+ // Adding a new chunk to head_ must be protected by mutex_.
+ absl::Mutex mutex_;
+ // Pointer to a linked list of SerialArenaChunk.
+ Atomic<SerialArenaChunk*> head_{nullptr};
+
+ void* first_owner_;
+ // Must be declared after alloc_policy_; otherwise, it may lose info on
+ // user-provided initial block.
+ SerialArena first_arena_;
+
// The LSB of tag_and_id_ indicates if the arena is message-owned.
enum : uint64_t { kMessageOwnedArena = 1 };
- TaggedAllocationPolicyPtr alloc_policy_; // Tagged pointer to AllocPolicy.
-
static_assert(std::is_trivially_destructible<SerialArena>{},
"SerialArena needs to be trivially destructible.");
- // Pointer to a linked list of SerialArena.
- std::atomic<SerialArena*> threads_;
- std::atomic<SerialArena*> hint_; // Fast thread-local block access
const AllocationPolicy* AllocPolicy() const { return alloc_policy_.get(); }
- void InitializeFrom(void* mem, size_t size);
- void InitializeWithPolicy(void* mem, size_t size, AllocationPolicy policy);
- void* AllocateAlignedFallback(size_t n, const std::type_info* type);
- std::pair<void*, SerialArena::CleanupNode*>
- AllocateAlignedWithCleanupFallback(size_t n, const std::type_info* type);
+ void InitializeWithPolicy(const AllocationPolicy& policy);
+ void* AllocateAlignedWithCleanupFallback(size_t n, size_t align,
+ void (*destructor)(void*));
void Init();
- void SetInitialBlock(void* mem, size_t size);
// Delete or Destruct all objects owned by the arena.
void CleanupList();
- inline uint64_t LifeCycleId() const {
- return tag_and_id_ & ~kMessageOwnedArena;
- }
-
inline void CacheSerialArena(SerialArena* serial) {
- thread_cache().last_serial_arena = serial;
- thread_cache().last_lifecycle_id_seen = tag_and_id_;
- // TODO(haberman): evaluate whether we would gain efficiency by getting rid
- // of hint_. It's the only write we do to ThreadSafeArena in the allocation
- // path, which will dirty the cache line.
-
- hint_.store(serial, std::memory_order_release);
+ if (!IsMessageOwned()) {
+ thread_cache().last_serial_arena = serial;
+ thread_cache().last_lifecycle_id_seen = tag_and_id_;
+ }
}
PROTOBUF_NDEBUG_INLINE bool GetSerialArenaFast(SerialArena** arena) {
- if (GetSerialArenaFromThreadCache(arena)) return true;
-
- // Check whether we own the last accessed SerialArena on this arena. This
- // fast path optimizes the case where a single thread uses multiple arenas.
- ThreadCache* tc = &thread_cache();
- SerialArena* serial = hint_.load(std::memory_order_acquire);
- if (PROTOBUF_PREDICT_TRUE(serial != nullptr && serial->owner() == tc)) {
- *arena = serial;
- return true;
- }
- return false;
- }
-
- PROTOBUF_NDEBUG_INLINE bool GetSerialArenaFromThreadCache(
- SerialArena** arena) {
// If this thread already owns a block in this arena then try to use that.
// This fast path optimizes the case where multiple threads allocate from
// the same arena.
@@ -590,16 +804,26 @@
}
return false;
}
- SerialArena* GetSerialArenaFallback(void* me);
+ // Finds SerialArena or creates one if not found.
+ SerialArena* GetSerialArenaFallback();
+
+ template <AllocationClient alloc_client = AllocationClient::kDefault>
+ void* AllocateAlignedFallback(size_t n);
+
+ // Executes callback function over SerialArenaChunk. Passes const
+ // SerialArenaChunk*.
template <typename Functor>
- void PerSerialArena(Functor fn) {
- // By omitting an Acquire barrier we ensure that any user code that doesn't
- // properly synchronize Reset() or the destructor will throw a TSAN warning.
- SerialArena* serial = threads_.load(std::memory_order_relaxed);
+ void WalkConstSerialArenaChunk(Functor fn) const;
- for (; serial; serial = serial->next()) fn(serial);
- }
+ // Executes callback function over SerialArenaChunk.
+ template <typename Functor>
+ void WalkSerialArenaChunk(Functor fn);
+
+ // Executes callback function over SerialArena in chunked list in reverse
+ // chronological order. Passes const SerialArena*.
+ template <typename Functor>
+ void PerConstSerialArenaInChunk(Functor fn) const;
// Releases all memory except the first block which it returns. The first
// block might be owned by the user and thus need some extra checks before
@@ -641,7 +865,9 @@
#pragma warning(disable : 4324)
#endif
struct alignas(kCacheAlignment) CacheAlignedLifecycleIdGenerator {
- std::atomic<LifecycleIdAtomic> id;
+ PROTOBUF_CONSTEXPR CacheAlignedLifecycleIdGenerator() : id{0} {}
+
+ Atomic<LifecycleIdAtomic> id;
};
static CacheAlignedLifecycleIdGenerator lifecycle_id_generator_;
#if defined(GOOGLE_PROTOBUF_NO_THREADLOCAL)
@@ -657,20 +883,14 @@
static ThreadCache& thread_cache() { return thread_cache_; }
#endif
- ThreadSafeArenaStatsHandle arena_stats_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ThreadSafeArena);
- // All protos have pointers back to the arena hence Arena must have
- // pointer stability.
- ThreadSafeArena(ThreadSafeArena&&) = delete;
- ThreadSafeArena& operator=(ThreadSafeArena&&) = delete;
-
public:
- // kBlockHeaderSize is sizeof(Block), aligned up to the nearest multiple of 8
- // to protect the invariant that pos is always at a multiple of 8.
+ // kBlockHeaderSize is sizeof(ArenaBlock), aligned up to the nearest multiple
+ // of 8 to protect the invariant that pos is always at a multiple of 8.
static constexpr size_t kBlockHeaderSize = SerialArena::kBlockHeaderSize;
static constexpr size_t kSerialArenaSize =
(sizeof(SerialArena) + 7) & static_cast<size_t>(-8);
+ static constexpr size_t kAllocPolicySize =
+ AlignUpTo8(sizeof(AllocationPolicy));
static_assert(kBlockHeaderSize % 8 == 0,
"kBlockHeaderSize must be a multiple of 8.");
static_assert(kSerialArenaSize % 8 == 0,
@@ -681,6 +901,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_ARENA_IMPL_H__
diff --git a/src/google/protobuf/arena_test_util.cc b/src/google/protobuf/arena_test_util.cc
index 2cb5075..50f20a1 100644
--- a/src/google/protobuf/arena_test_util.cc
+++ b/src/google/protobuf/arena_test_util.cc
@@ -28,10 +28,10 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/arena_test_util.h>
+#include "google/protobuf/arena_test_util.h"
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
#define EXPECT_EQ GOOGLE_CHECK_EQ
diff --git a/src/google/protobuf/arena_test_util.h b/src/google/protobuf/arena_test_util.h
index 6e42d4b..0c00e76 100644
--- a/src/google/protobuf/arena_test_util.h
+++ b/src/google/protobuf/arena_test_util.h
@@ -31,11 +31,11 @@
#ifndef GOOGLE_PROTOBUF_ARENA_TEST_UTIL_H__
#define GOOGLE_PROTOBUF_ARENA_TEST_UTIL_H__
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/arena.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/arena.h"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/io/zero_copy_stream_impl_lite.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/arena_unittest.cc b/src/google/protobuf/arena_unittest.cc
index 7539b4b..8d76d7f 100644
--- a/src/google/protobuf/arena_unittest.cc
+++ b/src/google/protobuf/arena_unittest.cc
@@ -28,7 +28,7 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/arena.h>
+#include "google/protobuf/arena.h"
#include <algorithm>
#include <cstddef>
@@ -39,28 +39,30 @@
#include <typeinfo>
#include <vector>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/unittest.pb.h>
-#include <google/protobuf/unittest_arena.pb.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/unittest.pb.h"
+#include "google/protobuf/unittest_arena.pb.h"
#include <gmock/gmock.h>
#include <gtest/gtest.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/arena_test_util.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/extension_set.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
-#include <google/protobuf/message.h>
-#include <google/protobuf/message_lite.h>
-#include <google/protobuf/repeated_field.h>
-#include <google/protobuf/test_util.h>
-#include <google/protobuf/unknown_field_set.h>
-#include <google/protobuf/wire_format_lite.h>
+#include "absl/strings/string_view.h"
+#include "absl/synchronization/barrier.h"
+#include "google/protobuf/arena_test_util.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/extension_set.h"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/io/zero_copy_stream_impl_lite.h"
+#include "google/protobuf/message.h"
+#include "google/protobuf/message_lite.h"
+#include "google/protobuf/repeated_field.h"
+#include "google/protobuf/test_util.h"
+#include "google/protobuf/unknown_field_set.h"
+#include "google/protobuf/wire_format_lite.h"
+#include "absl/synchronization/mutex.h"
// Must be included last
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
using proto2_arena_unittest::ArenaMessage;
using protobuf_unittest::ForeignMessage;
@@ -84,10 +86,10 @@
class SimpleDataType {
public:
- SimpleDataType() : notifier_(NULL) {}
+ SimpleDataType() : notifier_(nullptr) {}
void SetNotifier(Notifier* notifier) { notifier_ = notifier; }
virtual ~SimpleDataType() {
- if (notifier_ != NULL) {
+ if (notifier_ != nullptr) {
notifier_->Notify();
}
};
@@ -101,12 +103,13 @@
class PleaseDontCopyMe {
public:
explicit PleaseDontCopyMe(int value) : value_(value) {}
+ PleaseDontCopyMe(const PleaseDontCopyMe&) = delete;
+ PleaseDontCopyMe& operator=(const PleaseDontCopyMe&) = delete;
int value() const { return value_; }
private:
int value_;
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(PleaseDontCopyMe);
};
// A class that takes four different types as constructor arguments.
@@ -116,14 +119,15 @@
const std::string& three,
const PleaseDontCopyMe* four)
: one_(one), two_(two), three_(three), four_(four) {}
+ MustBeConstructedWithOneThroughFour(
+ const MustBeConstructedWithOneThroughFour&) = delete;
+ MustBeConstructedWithOneThroughFour& operator=(
+ const MustBeConstructedWithOneThroughFour&) = delete;
int one_;
const char* const two_;
std::string three_;
const PleaseDontCopyMe* four_;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MustBeConstructedWithOneThroughFour);
};
// A class that takes eight different types as constructor arguments.
@@ -143,6 +147,10 @@
six_(six),
seven_(seven),
eight_(eight) {}
+ MustBeConstructedWithOneThroughEight(
+ const MustBeConstructedWithOneThroughEight&) = delete;
+ MustBeConstructedWithOneThroughEight& operator=(
+ const MustBeConstructedWithOneThroughEight&) = delete;
int one_;
const char* const two_;
@@ -152,9 +160,6 @@
const char* const six_;
std::string seven_;
std::string eight_;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MustBeConstructedWithOneThroughEight);
};
TEST(ArenaTest, ArenaConstructable) {
@@ -171,17 +176,17 @@
TEST(ArenaTest, BasicCreate) {
Arena arena;
- EXPECT_TRUE(Arena::Create<int32_t>(&arena) != NULL);
- EXPECT_TRUE(Arena::Create<int64_t>(&arena) != NULL);
- EXPECT_TRUE(Arena::Create<float>(&arena) != NULL);
- EXPECT_TRUE(Arena::Create<double>(&arena) != NULL);
- EXPECT_TRUE(Arena::Create<std::string>(&arena) != NULL);
+ EXPECT_TRUE(Arena::Create<int32_t>(&arena) != nullptr);
+ EXPECT_TRUE(Arena::Create<int64_t>(&arena) != nullptr);
+ EXPECT_TRUE(Arena::Create<float>(&arena) != nullptr);
+ EXPECT_TRUE(Arena::Create<double>(&arena) != nullptr);
+ EXPECT_TRUE(Arena::Create<std::string>(&arena) != nullptr);
arena.Own(new int32_t);
arena.Own(new int64_t);
arena.Own(new float);
arena.Own(new double);
arena.Own(new std::string);
- arena.Own<int>(NULL);
+ arena.Own<int>(nullptr);
Notifier notifier;
SimpleDataType* data = Arena::Create<SimpleDataType>(&arena);
data->SetNotifier(¬ifier);
@@ -196,7 +201,7 @@
Arena arena;
const std::string s("foo");
const std::string* s_copy = Arena::Create<std::string>(&arena, s);
- EXPECT_TRUE(s_copy != NULL);
+ EXPECT_TRUE(s_copy != nullptr);
EXPECT_EQ("foo", s);
EXPECT_EQ("foo", *s_copy);
}
@@ -205,7 +210,7 @@
Arena arena;
std::string s("foo");
const std::string* s_copy = Arena::Create<std::string>(&arena, s);
- EXPECT_TRUE(s_copy != NULL);
+ EXPECT_TRUE(s_copy != nullptr);
EXPECT_EQ("foo", s);
EXPECT_EQ("foo", *s_copy);
}
@@ -214,7 +219,7 @@
Arena arena;
std::string s("foo");
const std::string* s_move = Arena::Create<std::string>(&arena, std::move(s));
- EXPECT_TRUE(s_move != NULL);
+ EXPECT_TRUE(s_move != nullptr);
EXPECT_TRUE(s.empty()); // NOLINT
EXPECT_EQ("foo", *s_move);
}
@@ -226,7 +231,7 @@
const MustBeConstructedWithOneThroughFour* new_object =
Arena::Create<MustBeConstructedWithOneThroughFour>(&arena, 1, "2", three,
&four);
- EXPECT_TRUE(new_object != NULL);
+ EXPECT_TRUE(new_object != nullptr);
ASSERT_EQ(1, new_object->one_);
ASSERT_STREQ("2", new_object->two_);
ASSERT_EQ("3", new_object->three_);
@@ -242,7 +247,7 @@
const MustBeConstructedWithOneThroughEight* new_object =
Arena::Create<MustBeConstructedWithOneThroughEight>(
&arena, 1, "2", three, &four, 5, "6", seven, eight);
- EXPECT_TRUE(new_object != NULL);
+ EXPECT_TRUE(new_object != nullptr);
ASSERT_EQ(1, new_object->one_);
ASSERT_STREQ("2", new_object->two_);
ASSERT_EQ("3", new_object->three_);
@@ -277,7 +282,8 @@
TEST(ArenaTest, InitialBlockTooSmall) {
// Construct a small blocks of memory to be used by the arena allocator; then,
// allocate an object which will not fit in the initial block.
- for (int size = 0; size <= Arena::kBlockOverhead + 32; size++) {
+ for (uint32_t size = 0; size <= internal::SerialArena::kBlockHeaderSize + 32;
+ size++) {
std::vector<char> arena_block(size);
ArenaOptions options;
options.initial_block = arena_block.data();
@@ -307,6 +313,26 @@
}
}
+TEST(ArenaTest, CreateDestroy) {
+ TestAllTypes original;
+ TestUtil::SetAllFields(&original);
+
+ // Test memory leak.
+ Arena arena;
+ TestAllTypes* heap_message = Arena::CreateMessage<TestAllTypes>(nullptr);
+ TestAllTypes* arena_message = Arena::CreateMessage<TestAllTypes>(&arena);
+
+ *heap_message = original;
+ *arena_message = original;
+
+ Arena::Destroy(heap_message);
+ Arena::Destroy(arena_message);
+
+ // The arena message should still exist.
+ EXPECT_EQ(strlen(original.optional_string().c_str()),
+ strlen(arena_message->optional_string().c_str()));
+}
+
TEST(ArenaTest, Parsing) {
TestAllTypes original;
TestUtil::SetAllFields(&original);
@@ -484,7 +510,7 @@
TestAllTypes::NestedMessage* released_null =
arena_message->release_optional_nested_message();
- EXPECT_EQ(NULL, released_null);
+ EXPECT_EQ(nullptr, released_null);
}
TEST(ArenaTest, SetAllocatedString) {
@@ -585,8 +611,8 @@
}
TEST(ArenaTest, ReleaseFromArenaMessageMakesCopy) {
- TestAllTypes::NestedMessage* nested_msg = NULL;
- std::string* nested_string = NULL;
+ TestAllTypes::NestedMessage* nested_msg = nullptr;
+ std::string* nested_string = nullptr;
{
Arena arena;
TestAllTypes* arena_message = Arena::CreateMessage<TestAllTypes>(&arena);
@@ -603,7 +629,7 @@
#if PROTOBUF_RTTI
TEST(ArenaTest, ReleaseFromArenaMessageUsingReflectionMakesCopy) {
- TestAllTypes::NestedMessage* nested_msg = NULL;
+ TestAllTypes::NestedMessage* nested_msg = nullptr;
// Note: no string: reflection API only supports releasing submessages.
{
Arena arena;
@@ -771,7 +797,7 @@
}
TEST(ArenaTest, RepeatedPtrFieldAddClearedTest) {
-#ifndef PROTOBUF_FUTURE_BREAKING_CHANGES
+#ifndef PROTOBUF_FUTURE_REMOVE_CLEARED_API
{
RepeatedPtrField<TestAllTypes> repeated_field;
EXPECT_TRUE(repeated_field.empty());
@@ -782,7 +808,7 @@
EXPECT_TRUE(repeated_field.empty());
EXPECT_EQ(0, repeated_field.size());
}
-#endif // !PROTOBUF_FUTURE_BREAKING_CHANGES
+#endif // !PROTOBUF_FUTURE_REMOVE_CLEARED_API
{
RepeatedPtrField<TestAllTypes> repeated_field;
EXPECT_TRUE(repeated_field.empty());
@@ -1078,7 +1104,7 @@
EXPECT_TRUE(refl->HasOneof(*message, oneof));
submsg = refl->ReleaseMessage(message, msg_field);
EXPECT_FALSE(refl->HasOneof(*message, oneof));
- EXPECT_TRUE(submsg->GetArena() == NULL);
+ EXPECT_TRUE(submsg->GetArena() == nullptr);
delete submsg;
}
@@ -1091,7 +1117,7 @@
TestAllTypes* t = Arena::CreateMessage<TestAllTypes>(arena1);
t->set_optional_string("field1");
t->set_optional_int32(i);
- if (arena1 != NULL) {
+ if (arena1 != nullptr) {
field1.UnsafeArenaAddAllocated(t);
} else {
field1.AddAllocated(t);
@@ -1101,7 +1127,7 @@
TestAllTypes* t = Arena::CreateMessage<TestAllTypes>(arena2);
t->set_optional_string("field2");
t->set_optional_int32(i);
- if (arena2 != NULL) {
+ if (arena2 != nullptr) {
field2.UnsafeArenaAddAllocated(t);
} else {
field2.AddAllocated(t);
@@ -1134,12 +1160,12 @@
TEST(ArenaTest, SwapRepeatedFieldWithNoArenaOnRightHandSide) {
Arena arena;
- TestSwapRepeatedField(&arena, NULL);
+ TestSwapRepeatedField(&arena, nullptr);
}
TEST(ArenaTest, SwapRepeatedFieldWithNoArenaOnLeftHandSide) {
Arena arena;
- TestSwapRepeatedField(NULL, &arena);
+ TestSwapRepeatedField(nullptr, &arena);
}
TEST(ArenaTest, ExtensionsOnArena) {
@@ -1198,11 +1224,11 @@
TestAllTypes* extracted_messages[5];
// ExtractSubrange should copy to the heap.
repeated_message.ExtractSubrange(0, 5, extracted_messages);
- EXPECT_EQ(NULL, extracted_messages[0]->GetArena());
+ EXPECT_EQ(nullptr, extracted_messages[0]->GetArena());
// We need to free the heap-allocated messages to prevent a leak.
for (int i = 0; i < 5; i++) {
delete extracted_messages[i];
- extracted_messages[i] = NULL;
+ extracted_messages[i] = nullptr;
}
}
@@ -1322,7 +1348,7 @@
{
MessageLite* generic_message = prototype->New(&arena);
- EXPECT_TRUE(generic_message != NULL);
+ EXPECT_TRUE(generic_message != nullptr);
EXPECT_EQ(&arena, generic_message->GetArena());
EXPECT_TRUE(generic_message->ParseFromString(serialized));
TestAllTypes* deserialized = static_cast<TestAllTypes*>(generic_message);
@@ -1383,6 +1409,31 @@
EXPECT_EQ(1024, arena_2.Reset());
}
+namespace {
+
+void VerifyArenaOverhead(Arena& arena, size_t overhead) {
+ EXPECT_EQ(0, arena.SpaceAllocated());
+
+ // Allocate a tiny block and record the allocation size.
+ constexpr size_t kTinySize = 8;
+ Arena::CreateArray<char>(&arena, kTinySize);
+ uint64_t space_allocated = arena.SpaceAllocated();
+
+ // Next allocation expects to fill up the block but no new block.
+ uint64_t next_size = space_allocated - overhead - kTinySize;
+ Arena::CreateArray<char>(&arena, next_size);
+
+ EXPECT_EQ(space_allocated, arena.SpaceAllocated());
+}
+
+} // namespace
+
+TEST(ArenaTest, FirstArenaOverhead) {
+ Arena arena;
+ VerifyArenaOverhead(arena, internal::SerialArena::kBlockHeaderSize);
+}
+
+
TEST(ArenaTest, BlockSizeDoubling) {
Arena arena;
EXPECT_EQ(0, arena.SpaceUsed());
@@ -1399,7 +1450,7 @@
ASSERT_GT(arena.SpaceAllocated(), first_block_size);
auto second_block_size = (arena.SpaceAllocated() - first_block_size);
- EXPECT_EQ(second_block_size, 2*first_block_size);
+ EXPECT_GE(second_block_size, 2*first_block_size);
}
TEST(ArenaTest, Alignment) {
@@ -1443,8 +1494,8 @@
TEST(ArenaTest, GetArenaShouldReturnNullForNonArenaAllocatedMessages) {
ArenaMessage message;
const ArenaMessage* const_pointer_to_message = &message;
- EXPECT_EQ(NULL, Arena::GetArena(&message));
- EXPECT_EQ(NULL, Arena::GetArena(const_pointer_to_message));
+ EXPECT_EQ(nullptr, Arena::GetArena(&message));
+ EXPECT_EQ(nullptr, Arena::GetArena(const_pointer_to_message));
}
TEST(ArenaTest, GetArenaShouldReturnNullForNonArenaCompatibleTypes) {
@@ -1510,14 +1561,19 @@
TEST(ArenaTest, SpaceReusePoisonsAndUnpoisonsMemory) {
#ifdef ADDRESS_SANITIZER
char buf[1024]{};
+ constexpr int kSize = 32;
{
Arena arena(buf, sizeof(buf));
std::vector<void*> pointers;
for (int i = 0; i < 100; ++i) {
- pointers.push_back(Arena::CreateArray<char>(&arena, 16));
+ void* p = Arena::CreateArray<char>(&arena, kSize);
+ // Simulate other ASan client managing shadow memory.
+ ASAN_POISON_MEMORY_REGION(p, kSize);
+ ASAN_UNPOISON_MEMORY_REGION(p, kSize - 4);
+ pointers.push_back(p);
}
for (void* p : pointers) {
- internal::ArenaTestPeer::ReturnArrayMemory(&arena, p, 16);
+ internal::ArenaTestPeer::ReturnArrayMemory(&arena, p, kSize);
// The first one is not poisoned because it becomes the freelist.
if (p != pointers[0]) EXPECT_TRUE(__asan_address_is_poisoned(p));
}
@@ -1542,93 +1598,8 @@
#endif // ADDRESS_SANITIZER
}
-namespace {
-uint32_t hooks_num_init = 0;
-uint32_t hooks_num_allocations = 0;
-uint32_t hooks_num_reset = 0;
-uint32_t hooks_num_destruct = 0;
-
-void ClearHookCounts() {
- hooks_num_init = 0;
- hooks_num_allocations = 0;
- hooks_num_reset = 0;
- hooks_num_destruct = 0;
-}
-} // namespace
-
-// A helper utility class that handles arena callbacks.
-class ArenaOptionsTestFriend final : public internal::ArenaMetricsCollector {
- public:
- static internal::ArenaMetricsCollector* NewWithAllocs() {
- return new ArenaOptionsTestFriend(true);
- }
-
- static internal::ArenaMetricsCollector* NewWithoutAllocs() {
- return new ArenaOptionsTestFriend(false);
- }
-
- static void Enable(ArenaOptions* options) {
- ClearHookCounts();
- options->make_metrics_collector = &ArenaOptionsTestFriend::NewWithAllocs;
- }
-
- static void EnableWithoutAllocs(ArenaOptions* options) {
- ClearHookCounts();
- options->make_metrics_collector = &ArenaOptionsTestFriend::NewWithoutAllocs;
- }
-
- explicit ArenaOptionsTestFriend(bool record_allocs)
- : ArenaMetricsCollector(record_allocs) {
- ++hooks_num_init;
- }
- void OnDestroy(uint64_t space_allocated) override {
- ++hooks_num_destruct;
- delete this;
- }
- void OnReset(uint64_t space_allocated) override { ++hooks_num_reset; }
- void OnAlloc(const std::type_info* allocated_type,
- uint64_t alloc_size) override {
- ++hooks_num_allocations;
- }
-};
-
-// Test the hooks are correctly called.
-TEST(ArenaTest, ArenaHooksSanity) {
- ArenaOptions options;
- ArenaOptionsTestFriend::Enable(&options);
-
- // Scope for defining the arena
- {
- Arena arena(options);
- EXPECT_EQ(1, hooks_num_init);
- EXPECT_EQ(0, hooks_num_allocations);
- Arena::Create<uint64_t>(&arena);
- if (std::is_trivially_destructible<uint64_t>::value) {
- EXPECT_EQ(1, hooks_num_allocations);
- } else {
- EXPECT_EQ(2, hooks_num_allocations);
- }
- arena.Reset();
- arena.Reset();
- EXPECT_EQ(2, hooks_num_reset);
- }
- EXPECT_EQ(2, hooks_num_reset);
- EXPECT_EQ(1, hooks_num_destruct);
-}
-
-// Test that allocation hooks are not called when we don't need them.
-TEST(ArenaTest, ArenaHooksWhenAllocationsNotNeeded) {
- ArenaOptions options;
- ArenaOptionsTestFriend::EnableWithoutAllocs(&options);
-
- Arena arena(options);
- EXPECT_EQ(0, hooks_num_allocations);
- Arena::Create<uint64_t>(&arena);
- EXPECT_EQ(0, hooks_num_allocations);
-}
-
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/arenastring.cc b/src/google/protobuf/arenastring.cc
index af0c9df..2a183d3 100644
--- a/src/google/protobuf/arenastring.cc
+++ b/src/google/protobuf/arenastring.cc
@@ -28,20 +28,21 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/arenastring.h>
+#include "google/protobuf/arenastring.h"
#include <cstddef>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/stubs/mutex.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/message_lite.h>
-#include <google/protobuf/parse_context.h>
-#include <google/protobuf/stubs/stl_util.h>
+
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/io/coded_stream.h"
+#include "absl/strings/string_view.h"
+#include "absl/synchronization/mutex.h"
+#include "google/protobuf/message_lite.h"
+#include "google/protobuf/parse_context.h"
+#include "google/protobuf/stubs/stl_util.h"
// clang-format off
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
// clang-format on
namespace google {
@@ -71,7 +72,7 @@
} // namespace
const std::string& LazyString::Init() const {
- static WrappedMutex mu{GOOGLE_PROTOBUF_LINKER_INITIALIZED};
+ static absl::Mutex mu{absl::kConstInit};
mu.Lock();
const std::string* res = inited_.load(std::memory_order_acquire);
if (res == nullptr) {
@@ -87,7 +88,7 @@
namespace {
-#if defined(NDEBUG) || !GOOGLE_PROTOBUF_INTERNAL_DONATE_STEAL
+#if defined(NDEBUG) || !defined(GOOGLE_PROTOBUF_INTERNAL_DONATE_STEAL)
class ScopedCheckPtrInvariants {
public:
@@ -97,16 +98,16 @@
#endif // NDEBUG || !GOOGLE_PROTOBUF_INTERNAL_DONATE_STEAL
// Creates a heap allocated std::string value.
-inline TaggedStringPtr CreateString(ConstStringParam value) {
+inline TaggedStringPtr CreateString(absl::string_view value) {
TaggedStringPtr res;
res.SetAllocated(new std::string(value.data(), value.length()));
return res;
}
-#if !GOOGLE_PROTOBUF_INTERNAL_DONATE_STEAL
+#ifndef GOOGLE_PROTOBUF_INTERNAL_DONATE_STEAL
// Creates an arena allocated std::string value.
-TaggedStringPtr CreateArenaString(Arena& arena, ConstStringParam s) {
+TaggedStringPtr CreateArenaString(Arena& arena, absl::string_view s) {
TaggedStringPtr res;
res.SetMutableArena(Arena::Create<std::string>(&arena, s.data(), s.length()));
return res;
@@ -116,7 +117,7 @@
} // namespace
-void ArenaStringPtr::Set(ConstStringParam value, Arena* arena) {
+void ArenaStringPtr::Set(absl::string_view value, Arena* arena) {
ScopedCheckPtrInvariants check(&tagged_ptr_);
if (IsDefault()) {
// If we're not on an arena, skip straight to a true string to avoid
@@ -124,7 +125,19 @@
tagged_ptr_ = arena != nullptr ? CreateArenaString(*arena, value)
: CreateString(value);
} else {
+#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
+ if (arena == nullptr) {
+ auto* old = tagged_ptr_.GetIfAllocated();
+ tagged_ptr_ = CreateString(value);
+ delete old;
+ } else {
+ auto* old = UnsafeMutablePointer();
+ tagged_ptr_ = CreateArenaString(*arena, value);
+ old->assign("garbagedata");
+ }
+#else // PROTOBUF_FORCE_COPY_DEFAULT_STRING
UnsafeMutablePointer()->assign(value.data(), value.length());
+#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
}
}
@@ -264,4 +277,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/arenastring.h b/src/google/protobuf/arenastring.h
index 6bc8395..519e50d 100644
--- a/src/google/protobuf/arenastring.h
+++ b/src/google/protobuf/arenastring.h
@@ -36,14 +36,15 @@
#include <type_traits>
#include <utility>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/arena.h>
-#include <google/protobuf/port.h>
-#include <google/protobuf/explicitly_constructed.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/arena.h"
+#include "google/protobuf/port.h"
+#include "absl/strings/string_view.h"
+#include "google/protobuf/explicitly_constructed.h"
// must be last:
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
#ifdef SWIG
#error "You cannot SWIG proto headers"
@@ -259,12 +260,12 @@
// instance known to not carry any heap allocated value.
inline void InitAllocated(std::string* str, Arena* arena);
- void Set(ConstStringParam value, Arena* arena);
+ void Set(absl::string_view value, Arena* arena);
void Set(std::string&& value, Arena* arena);
void Set(const char* s, Arena* arena);
void Set(const char* s, size_t n, Arena* arena);
- void SetBytes(ConstStringParam value, Arena* arena);
+ void SetBytes(absl::string_view value, Arena* arena);
void SetBytes(std::string&& value, Arena* arena);
void SetBytes(const char* s, Arena* arena);
void SetBytes(const void* p, size_t n, Arena* arena);
@@ -406,14 +407,14 @@
}
inline void ArenaStringPtr::Set(const char* s, Arena* arena) {
- Set(ConstStringParam{s}, arena);
+ Set(absl::string_view{s}, arena);
}
inline void ArenaStringPtr::Set(const char* s, size_t n, Arena* arena) {
- Set(ConstStringParam{s, n}, arena);
+ Set(absl::string_view{s, n}, arena);
}
-inline void ArenaStringPtr::SetBytes(ConstStringParam value, Arena* arena) {
+inline void ArenaStringPtr::SetBytes(absl::string_view value, Arena* arena) {
Set(value, arena);
}
@@ -426,7 +427,7 @@
}
inline void ArenaStringPtr::SetBytes(const void* p, size_t n, Arena* arena) {
- Set(ConstStringParam{static_cast<const char*>(p), n}, arena);
+ Set(absl::string_view{static_cast<const char*>(p), n}, arena);
}
// Make sure rhs_arena allocated rhs, and lhs_arena allocated lhs.
@@ -475,6 +476,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_ARENASTRING_H__
diff --git a/src/google/protobuf/arenastring_unittest.cc b/src/google/protobuf/arenastring_unittest.cc
index 0e5ea9b..efb4bf3 100644
--- a/src/google/protobuf/arenastring_unittest.cc
+++ b/src/google/protobuf/arenastring_unittest.cc
@@ -28,7 +28,7 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/arenastring.h>
+#include "google/protobuf/arenastring.h"
#include <algorithm>
#include <cstdlib>
@@ -37,18 +37,18 @@
#include <utility>
#include <vector>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/generated_message_util.h>
-#include <google/protobuf/message_lite.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/io/zero_copy_stream_impl.h"
+#include "google/protobuf/generated_message_util.h"
+#include "google/protobuf/message_lite.h"
#include <gtest/gtest.h>
-#include <google/protobuf/stubs/strutil.h>
+#include "absl/strings/string_view.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -151,4 +151,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/arenaz_sampler.cc b/src/google/protobuf/arenaz_sampler.cc
index 0eac693..44e53e5 100644
--- a/src/google/protobuf/arenaz_sampler.cc
+++ b/src/google/protobuf/arenaz_sampler.cc
@@ -28,15 +28,16 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/arenaz_sampler.h>
+#include "google/protobuf/arenaz_sampler.h"
#include <atomic>
#include <cstdint>
#include <limits>
+#include <utility>
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -56,64 +57,93 @@
PROTOBUF_CONSTINIT std::atomic<bool> g_arenaz_enabled{true};
PROTOBUF_CONSTINIT std::atomic<int32_t> g_arenaz_sample_parameter{1 << 10};
+PROTOBUF_CONSTINIT std::atomic<ThreadSafeArenazConfigListener>
+ g_arenaz_config_listener{nullptr};
PROTOBUF_THREAD_LOCAL absl::profiling_internal::ExponentialBiased
g_exponential_biased_generator;
+void TriggerThreadSafeArenazConfigListener() {
+ auto* listener = g_arenaz_config_listener.load(std::memory_order_acquire);
+ if (listener != nullptr) listener();
+}
+
} // namespace
-PROTOBUF_THREAD_LOCAL int64_t global_next_sample = 1LL << 10;
+PROTOBUF_THREAD_LOCAL SamplingState global_sampling_state = {
+ /*next_sample=*/0, /*sample_stride=*/0};
-ThreadSafeArenaStats::ThreadSafeArenaStats() { PrepareForSampling(); }
+ThreadSafeArenaStats::ThreadSafeArenaStats() { PrepareForSampling(0); }
ThreadSafeArenaStats::~ThreadSafeArenaStats() = default;
-void ThreadSafeArenaStats::PrepareForSampling() {
+void ThreadSafeArenaStats::BlockStats::PrepareForSampling() {
num_allocations.store(0, std::memory_order_relaxed);
- num_resets.store(0, std::memory_order_relaxed);
- bytes_requested.store(0, std::memory_order_relaxed);
bytes_allocated.store(0, std::memory_order_relaxed);
+ bytes_used.store(0, std::memory_order_relaxed);
bytes_wasted.store(0, std::memory_order_relaxed);
- max_bytes_allocated.store(0, std::memory_order_relaxed);
+}
+
+void ThreadSafeArenaStats::PrepareForSampling(int64_t stride) {
+ for (auto& blockstats : block_histogram) blockstats.PrepareForSampling();
+ max_block_size.store(0, std::memory_order_relaxed);
thread_ids.store(0, std::memory_order_relaxed);
+ weight = stride;
// The inliner makes hardcoded skip_count difficult (especially when combined
// with LTO). We use the ability to exclude stacks by regex when encoding
// instead.
depth = absl::GetStackTrace(stack, kMaxStackDepth, /* skip_count= */ 0);
}
-void RecordResetSlow(ThreadSafeArenaStats* info) {
- const size_t max_bytes =
- info->max_bytes_allocated.load(std::memory_order_relaxed);
- const size_t allocated_bytes =
- info->bytes_allocated.load(std::memory_order_relaxed);
- if (max_bytes < allocated_bytes) {
- info->max_bytes_allocated.store(allocated_bytes);
+size_t ThreadSafeArenaStats::FindBin(size_t bytes) {
+ if (bytes <= kMaxSizeForBinZero) return 0;
+ if (bytes <= kMaxSizeForPenultimateBin) {
+ // absl::bit_width() returns one plus the base-2 logarithm of x, with any
+ // fractional part discarded.
+ return absl::bit_width(absl::bit_ceil(bytes)) - kLogMaxSizeForBinZero - 1;
}
- info->bytes_requested.store(0, std::memory_order_relaxed);
- info->bytes_allocated.store(0, std::memory_order_relaxed);
- info->bytes_wasted.fetch_add(0, std::memory_order_relaxed);
- info->num_allocations.fetch_add(0, std::memory_order_relaxed);
- info->num_resets.fetch_add(1, std::memory_order_relaxed);
+ return kBlockHistogramBins - 1;
}
-void RecordAllocateSlow(ThreadSafeArenaStats* info, size_t requested,
+std::pair<size_t, size_t> ThreadSafeArenaStats::MinMaxBlockSizeForBin(
+ size_t bin) {
+ ABSL_ASSERT(bin < kBlockHistogramBins);
+ if (bin == 0) return {1, kMaxSizeForBinZero};
+ if (bin < kBlockHistogramBins - 1) {
+ return {(1 << (kLogMaxSizeForBinZero + bin - 1)) + 1,
+ 1 << (kLogMaxSizeForBinZero + bin)};
+ }
+ return {kMaxSizeForPenultimateBin + 1, std::numeric_limits<size_t>::max()};
+}
+
+void RecordAllocateSlow(ThreadSafeArenaStats* info, size_t used,
size_t allocated, size_t wasted) {
- info->bytes_requested.fetch_add(requested, std::memory_order_relaxed);
- info->bytes_allocated.fetch_add(allocated, std::memory_order_relaxed);
- info->bytes_wasted.fetch_add(wasted, std::memory_order_relaxed);
- info->num_allocations.fetch_add(1, std::memory_order_relaxed);
- const uint64_t tid = (1ULL << (GetCachedTID() % 63));
- const uint64_t thread_ids = info->thread_ids.load(std::memory_order_relaxed);
- if (!(thread_ids & tid)) {
- info->thread_ids.store(thread_ids | tid, std::memory_order_relaxed);
+ // Update the allocated bytes for the current block.
+ ThreadSafeArenaStats::BlockStats& curr =
+ info->block_histogram[ThreadSafeArenaStats::FindBin(allocated)];
+ curr.bytes_allocated.fetch_add(allocated, std::memory_order_relaxed);
+ curr.num_allocations.fetch_add(1, std::memory_order_relaxed);
+
+ // Update the used and wasted bytes for the previous block.
+ ThreadSafeArenaStats::BlockStats& prev =
+ info->block_histogram[ThreadSafeArenaStats::FindBin(used + wasted)];
+ prev.bytes_used.fetch_add(used, std::memory_order_relaxed);
+ prev.bytes_wasted.fetch_add(wasted, std::memory_order_relaxed);
+
+ if (info->max_block_size.load(std::memory_order_relaxed) < allocated) {
+ info->max_block_size.store(allocated, std::memory_order_relaxed);
}
+ const uint64_t tid = 1ULL << (GetCachedTID() % 63);
+ info->thread_ids.fetch_or(tid, std::memory_order_relaxed);
}
-ThreadSafeArenaStats* SampleSlow(int64_t* next_sample) {
- bool first = *next_sample < 0;
- *next_sample = g_exponential_biased_generator.GetStride(
+ThreadSafeArenaStats* SampleSlow(SamplingState& sampling_state) {
+ bool first = sampling_state.next_sample < 0;
+ const int64_t next_stride = g_exponential_biased_generator.GetStride(
g_arenaz_sample_parameter.load(std::memory_order_relaxed));
// Small values of interval are equivalent to just sampling next time.
- ABSL_ASSERT(*next_sample >= 1);
+ ABSL_ASSERT(next_stride >= 1);
+ sampling_state.next_sample = next_stride;
+ const int64_t old_stride =
+ absl::exchange(sampling_state.sample_stride, next_stride);
// g_arenaz_enabled can be dynamically flipped, we need to set a threshold low
// enough that we will start sampling in a reasonable time, so we just use the
@@ -122,18 +152,36 @@
// We will only be negative on our first count, so we should just retry in
// that case.
if (first) {
- if (PROTOBUF_PREDICT_TRUE(--*next_sample > 0)) return nullptr;
- return SampleSlow(next_sample);
+ if (PROTOBUF_PREDICT_TRUE(--sampling_state.next_sample > 0)) return nullptr;
+ return SampleSlow(sampling_state);
}
- return GlobalThreadSafeArenazSampler().Register();
+ return GlobalThreadSafeArenazSampler().Register(old_stride);
+}
+
+void SetThreadSafeArenazConfigListener(ThreadSafeArenazConfigListener l) {
+ g_arenaz_config_listener.store(l, std::memory_order_release);
+}
+
+bool IsThreadSafeArenazEnabled() {
+ return g_arenaz_enabled.load(std::memory_order_acquire);
}
void SetThreadSafeArenazEnabled(bool enabled) {
+ SetThreadSafeArenazEnabledInternal(enabled);
+ TriggerThreadSafeArenazConfigListener();
+}
+
+void SetThreadSafeArenazEnabledInternal(bool enabled) {
g_arenaz_enabled.store(enabled, std::memory_order_release);
}
void SetThreadSafeArenazSampleParameter(int32_t rate) {
+ SetThreadSafeArenazSampleParameterInternal(rate);
+ TriggerThreadSafeArenazConfigListener();
+}
+
+void SetThreadSafeArenazSampleParameterInternal(int32_t rate) {
if (rate > 0) {
g_arenaz_sample_parameter.store(rate, std::memory_order_release);
} else {
@@ -142,7 +190,16 @@
}
}
+int32_t ThreadSafeArenazSampleParameter() {
+ return g_arenaz_sample_parameter.load(std::memory_order_relaxed);
+}
+
void SetThreadSafeArenazMaxSamples(int32_t max) {
+ SetThreadSafeArenazMaxSamplesInternal(max);
+ TriggerThreadSafeArenazConfigListener();
+}
+
+void SetThreadSafeArenazMaxSamplesInternal(int32_t max) {
if (max > 0) {
GlobalThreadSafeArenazSampler().SetMaxSamples(max);
} else {
@@ -151,9 +208,14 @@
}
}
+size_t ThreadSafeArenazMaxSamples() {
+ return GlobalThreadSafeArenazSampler().GetMaxSamples();
+}
+
void SetThreadSafeArenazGlobalNextSample(int64_t next_sample) {
if (next_sample >= 0) {
- global_next_sample = next_sample;
+ global_sampling_state.next_sample = next_sample;
+ global_sampling_state.sample_stride = next_sample;
} else {
ABSL_RAW_LOG(ERROR, "Invalid thread safe arenaz next sample: %lld",
static_cast<long long>(next_sample)); // NOLINT(runtime/int)
@@ -166,9 +228,16 @@
return nullptr;
}
+void SetThreadSafeArenazConfigListener(ThreadSafeArenazConfigListener) {}
void SetThreadSafeArenazEnabled(bool enabled) {}
+void SetThreadSafeArenazEnabledInternal(bool enabled) {}
+bool IsThreadSafeArenazEnabled() { return false; }
void SetThreadSafeArenazSampleParameter(int32_t rate) {}
+void SetThreadSafeArenazSampleParameterInternal(int32_t rate) {}
+int32_t ThreadSafeArenazSampleParameter() { return 0; }
void SetThreadSafeArenazMaxSamples(int32_t max) {}
+void SetThreadSafeArenazMaxSamplesInternal(int32_t max) {}
+size_t ThreadSafeArenazMaxSamples() { return 0; }
void SetThreadSafeArenazGlobalNextSample(int64_t next_sample) {}
#endif // defined(PROTOBUF_ARENAZ_SAMPLE)
diff --git a/src/google/protobuf/arenaz_sampler.h b/src/google/protobuf/arenaz_sampler.h
index b04b0cc..23ab83a 100644
--- a/src/google/protobuf/arenaz_sampler.h
+++ b/src/google/protobuf/arenaz_sampler.h
@@ -31,13 +31,15 @@
#ifndef GOOGLE_PROTOBUF_SRC_GOOGLE_PROTOBUF_ARENAZ_SAMPLER_H__
#define GOOGLE_PROTOBUF_SRC_GOOGLE_PROTOBUF_ARENAZ_SAMPLER_H__
+#include <array>
#include <atomic>
#include <cstddef>
#include <cstdint>
+#include <utility>
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -45,8 +47,7 @@
#if defined(PROTOBUF_ARENAZ_SAMPLE)
struct ThreadSafeArenaStats;
-void RecordResetSlow(ThreadSafeArenaStats* info);
-void RecordAllocateSlow(ThreadSafeArenaStats* info, size_t requested,
+void RecordAllocateSlow(ThreadSafeArenaStats* info, size_t used,
size_t allocated, size_t wasted);
// Stores information about a sampled thread safe arena. All mutations to this
// *must* be made through `Record*` functions below. All reads from this *must*
@@ -58,20 +59,42 @@
~ThreadSafeArenaStats();
// Puts the object into a clean state, fills in the logically `const` members,
- // blocking for any readers that are currently sampling the object.
- void PrepareForSampling() ABSL_EXCLUSIVE_LOCKS_REQUIRED(init_mu);
+ // blocking for any readers that are currently sampling the object. The
+ // 'stride' parameter is the number of ThreadSafeArenas that were instantiated
+ // between this sample and the previous one.
+ void PrepareForSampling(int64_t stride)
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(init_mu);
// These fields are mutated by the various Record* APIs and need to be
// thread-safe.
- std::atomic<int> num_allocations;
- std::atomic<int> num_resets;
- std::atomic<size_t> bytes_requested;
- std::atomic<size_t> bytes_allocated;
- std::atomic<size_t> bytes_wasted;
- // Records the largest size an arena ever had. Maintained across resets.
- std::atomic<size_t> max_bytes_allocated;
- // Bit i when set to 1 indicates that a thread with tid % 63 = i accessed the
- // underlying arena. The field is maintained across resets.
+ struct BlockStats {
+ std::atomic<int> num_allocations;
+ std::atomic<size_t> bytes_allocated;
+ std::atomic<size_t> bytes_used;
+ std::atomic<size_t> bytes_wasted;
+
+ void PrepareForSampling();
+ };
+
+ // block_histogram is a kBlockHistogramBins sized histogram. The zeroth bin
+ // stores info about blocks of size \in [1, 1 << kLogMaxSizeForBinZero]. Bin
+ // i, where i > 0, stores info for blocks of size \in (max_size_bin (i-1),
+ // 1 << (kLogMaxSizeForBinZero + i)]. The final bin stores info about blocks
+ // of size \in [kMaxSizeForPenultimateBin + 1,
+ // std::numeric_limits<size_t>::max()].
+ static constexpr size_t kBlockHistogramBins = 15;
+ static constexpr size_t kLogMaxSizeForBinZero = 7;
+ static constexpr size_t kMaxSizeForBinZero = (1 << kLogMaxSizeForBinZero);
+ static constexpr size_t kMaxSizeForPenultimateBin =
+ 1 << (kLogMaxSizeForBinZero + kBlockHistogramBins - 2);
+ std::array<BlockStats, kBlockHistogramBins> block_histogram;
+
+ // Records the largest block allocated for the arena.
+ std::atomic<size_t> max_block_size;
+ // Bit `i` is set to 1 indicates that a thread with `tid % 63 = i` accessed
+ // the underlying arena. We use `% 63` as a rudimentary hash to ensure some
+ // bit mixing for thread-ids; `% 64` would only grab the low bits and might
+ // create sampling artifacts.
std::atomic<uint64_t> thread_ids;
// All of the fields below are set by `PrepareForSampling`, they must not
@@ -82,14 +105,32 @@
static constexpr int kMaxStackDepth = 64;
int32_t depth;
void* stack[kMaxStackDepth];
- static void RecordAllocateStats(ThreadSafeArenaStats* info, size_t requested,
+ static void RecordAllocateStats(ThreadSafeArenaStats* info, size_t used,
size_t allocated, size_t wasted) {
if (PROTOBUF_PREDICT_TRUE(info == nullptr)) return;
- RecordAllocateSlow(info, requested, allocated, wasted);
+ RecordAllocateSlow(info, used, allocated, wasted);
}
+
+ // Returns the bin for the provided size.
+ static size_t FindBin(size_t bytes);
+
+ // Returns the min and max bytes that can be stored in the histogram for
+ // blocks in the provided bin.
+ static std::pair<size_t, size_t> MinMaxBlockSizeForBin(size_t bin);
};
-ThreadSafeArenaStats* SampleSlow(int64_t* next_sample);
+struct SamplingState {
+ // Number of ThreadSafeArenas that should be instantiated before the next
+ // ThreadSafeArena is sampled. This variable is decremented with each
+ // instantiation.
+ int64_t next_sample;
+ // When we make a sampling decision, we record that distance between from the
+ // previous sample so we can weight each sample. 'distance' here is the
+ // number of instantiations of ThreadSafeArena.
+ int64_t sample_stride;
+};
+
+ThreadSafeArenaStats* SampleSlow(SamplingState& sampling_state);
void UnsampleSlow(ThreadSafeArenaStats* info);
class ThreadSafeArenaStatsHandle {
@@ -115,11 +156,6 @@
return *this;
}
- void RecordReset() {
- if (PROTOBUF_PREDICT_TRUE(info_ == nullptr)) return;
- RecordResetSlow(info_);
- }
-
ThreadSafeArenaStats* MutableStats() { return info_; }
friend void swap(ThreadSafeArenaStatsHandle& lhs,
@@ -136,24 +172,27 @@
using ThreadSafeArenazSampler =
::absl::profiling_internal::SampleRecorder<ThreadSafeArenaStats>;
-extern PROTOBUF_THREAD_LOCAL int64_t global_next_sample;
+extern PROTOBUF_THREAD_LOCAL SamplingState global_sampling_state;
// Returns an RAII sampling handle that manages registration and unregistation
// with the global sampler.
inline ThreadSafeArenaStatsHandle Sample() {
- if (PROTOBUF_PREDICT_TRUE(--global_next_sample > 0)) {
+ if (PROTOBUF_PREDICT_TRUE(--global_sampling_state.next_sample > 0)) {
return ThreadSafeArenaStatsHandle(nullptr);
}
- return ThreadSafeArenaStatsHandle(SampleSlow(&global_next_sample));
+ return ThreadSafeArenaStatsHandle(SampleSlow(global_sampling_state));
}
#else
+
+using SamplingState = int64_t;
+
struct ThreadSafeArenaStats {
static void RecordAllocateStats(ThreadSafeArenaStats*, size_t /*requested*/,
size_t /*allocated*/, size_t /*wasted*/) {}
};
-ThreadSafeArenaStats* SampleSlow(int64_t* next_sample);
+ThreadSafeArenaStats* SampleSlow(SamplingState& next_sample);
void UnsampleSlow(ThreadSafeArenaStats* info);
class ThreadSafeArenaStatsHandle {
@@ -187,14 +226,29 @@
// Returns a global Sampler.
ThreadSafeArenazSampler& GlobalThreadSafeArenazSampler();
+using ThreadSafeArenazConfigListener = void (*)();
+void SetThreadSafeArenazConfigListener(ThreadSafeArenazConfigListener l);
+
// Enables or disables sampling for thread safe arenas.
void SetThreadSafeArenazEnabled(bool enabled);
+void SetThreadSafeArenazEnabledInternal(bool enabled);
+
+// Returns true if sampling is on, false otherwise.
+bool IsThreadSafeArenazEnabled();
// Sets the rate at which thread safe arena will be sampled.
void SetThreadSafeArenazSampleParameter(int32_t rate);
+void SetThreadSafeArenazSampleParameterInternal(int32_t rate);
+
+// Returns the rate at which thread safe arena will be sampled.
+int32_t ThreadSafeArenazSampleParameter();
// Sets a soft max for the number of samples that will be kept.
void SetThreadSafeArenazMaxSamples(int32_t max);
+void SetThreadSafeArenazMaxSamplesInternal(int32_t max);
+
+// Returns the max number of samples that will be kept.
+size_t ThreadSafeArenazMaxSamples();
// Sets the current value for when arenas should be next sampled.
void SetThreadSafeArenazGlobalNextSample(int64_t next_sample);
@@ -203,5 +257,5 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_SRC_PROTOBUF_ARENAZ_SAMPLER_H__
diff --git a/src/google/protobuf/arenaz_sampler_test.cc b/src/google/protobuf/arenaz_sampler_test.cc
index 1bfec54..98ff042 100644
--- a/src/google/protobuf/arenaz_sampler_test.cc
+++ b/src/google/protobuf/arenaz_sampler_test.cc
@@ -28,19 +28,21 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/arenaz_sampler.h>
+#include "google/protobuf/arenaz_sampler.h"
+#include <atomic>
+#include <limits>
#include <memory>
#include <random>
+#include <utility>
#include <vector>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
-#include <google/protobuf/stubs/strutil.h>
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -56,18 +58,27 @@
return h->info_;
}
};
+
std::vector<size_t> GetBytesAllocated(ThreadSafeArenazSampler* s) {
std::vector<size_t> res;
s->Iterate([&](const ThreadSafeArenaStats& info) {
- res.push_back(info.bytes_allocated.load(std::memory_order_acquire));
+ for (const auto& block_stats : info.block_histogram) {
+ size_t bytes_allocated =
+ block_stats.bytes_allocated.load(std::memory_order_acquire);
+ if (bytes_allocated != 0) {
+ res.push_back(bytes_allocated);
+ }
+ }
});
return res;
}
-ThreadSafeArenaStats* Register(ThreadSafeArenazSampler* s, size_t size) {
- auto* info = s->Register();
+ThreadSafeArenaStats* Register(ThreadSafeArenazSampler* s, size_t size,
+ int64_t stride) {
+ auto* info = s->Register(stride);
assert(info != nullptr);
- info->bytes_allocated.store(size);
+ info->block_histogram[0].bytes_allocated.store(size,
+ std::memory_order_relaxed);
return info;
}
@@ -79,75 +90,148 @@
TEST(ThreadSafeArenaStatsTest, PrepareForSampling) {
ThreadSafeArenaStats info;
- MutexLock l(&info.init_mu);
- info.PrepareForSampling();
+ constexpr int64_t kTestStride = 107;
+ absl::MutexLock l(&info.init_mu);
+ info.PrepareForSampling(kTestStride);
- EXPECT_EQ(info.num_allocations.load(), 0);
- EXPECT_EQ(info.num_resets.load(), 0);
- EXPECT_EQ(info.bytes_requested.load(), 0);
- EXPECT_EQ(info.bytes_allocated.load(), 0);
- EXPECT_EQ(info.bytes_wasted.load(), 0);
- EXPECT_EQ(info.max_bytes_allocated.load(), 0);
+ for (const auto& block_stats : info.block_histogram) {
+ EXPECT_EQ(block_stats.num_allocations.load(std::memory_order_relaxed), 0);
+ EXPECT_EQ(block_stats.bytes_used.load(std::memory_order_relaxed), 0);
+ EXPECT_EQ(block_stats.bytes_allocated.load(std::memory_order_relaxed), 0);
+ EXPECT_EQ(block_stats.bytes_wasted.load(std::memory_order_relaxed), 0);
+ }
+ EXPECT_EQ(info.max_block_size.load(std::memory_order_relaxed), 0);
+ EXPECT_EQ(info.weight, kTestStride);
- info.num_allocations.store(1, std::memory_order_relaxed);
- info.num_resets.store(1, std::memory_order_relaxed);
- info.bytes_requested.store(1, std::memory_order_relaxed);
- info.bytes_allocated.store(1, std::memory_order_relaxed);
- info.bytes_wasted.store(1, std::memory_order_relaxed);
- info.max_bytes_allocated.store(1, std::memory_order_relaxed);
+ for (auto& block_stats : info.block_histogram) {
+ block_stats.num_allocations.store(1, std::memory_order_relaxed);
+ block_stats.bytes_used.store(1, std::memory_order_relaxed);
+ block_stats.bytes_allocated.store(1, std::memory_order_relaxed);
+ block_stats.bytes_wasted.store(1, std::memory_order_relaxed);
+ }
+ info.max_block_size.store(1, std::memory_order_relaxed);
- info.PrepareForSampling();
- EXPECT_EQ(info.num_allocations.load(), 0);
- EXPECT_EQ(info.num_resets.load(), 0);
- EXPECT_EQ(info.bytes_requested.load(), 0);
- EXPECT_EQ(info.bytes_allocated.load(), 0);
- EXPECT_EQ(info.bytes_wasted.load(), 0);
- EXPECT_EQ(info.max_bytes_allocated.load(), 0);
+ info.PrepareForSampling(2 * kTestStride);
+ for (auto& block_stats : info.block_histogram) {
+ EXPECT_EQ(block_stats.num_allocations.load(std::memory_order_relaxed), 0);
+ EXPECT_EQ(block_stats.bytes_used.load(std::memory_order_relaxed), 0);
+ EXPECT_EQ(block_stats.bytes_allocated.load(std::memory_order_relaxed), 0);
+ EXPECT_EQ(block_stats.bytes_wasted.load(std::memory_order_relaxed), 0);
+ }
+ EXPECT_EQ(info.max_block_size.load(std::memory_order_relaxed), 0);
+ EXPECT_EQ(info.weight, 2 * kTestStride);
+}
+
+TEST(ThreadSafeArenaStatsTest, FindBin) {
+ size_t current_bin = 0;
+ size_t bytes = 1;
+ while (current_bin < ThreadSafeArenaStats::kBlockHistogramBins - 1) {
+ size_t next_bin = ThreadSafeArenaStats::FindBin(bytes);
+ if (next_bin != current_bin) {
+ // Test the bins increase linearly.
+ EXPECT_EQ(next_bin, current_bin + 1);
+ // Test the bins change only at values of the form 2^k + 1.
+ EXPECT_EQ(absl::popcount(bytes - 1), 1);
+ current_bin = next_bin;
+ }
+ ++bytes;
+ }
+}
+
+TEST(ThreadSafeArenaStatsTest, MinMaxBlockSizeForBin) {
+ std::pair<size_t, size_t> current_limits =
+ ThreadSafeArenaStats::MinMaxBlockSizeForBin(0);
+ EXPECT_EQ(current_limits.first, 1);
+ EXPECT_LT(current_limits.first, current_limits.second);
+ for (size_t i = 1; i < ThreadSafeArenaStats::kBlockHistogramBins; ++i) {
+ std::pair<size_t, size_t> next_limits =
+ ThreadSafeArenaStats::MinMaxBlockSizeForBin(i);
+ EXPECT_LT(next_limits.first, next_limits.second);
+ // Test the limits do not have gaps.
+ EXPECT_EQ(next_limits.first, current_limits.second + 1);
+ if (i != ThreadSafeArenaStats::kBlockHistogramBins - 1) {
+ EXPECT_EQ(next_limits.second, 2 * current_limits.second);
+ }
+ current_limits = next_limits;
+ }
+ // Test the limits cover the entire range possible.
+ EXPECT_EQ(current_limits.second, std::numeric_limits<size_t>::max());
}
TEST(ThreadSafeArenaStatsTest, RecordAllocateSlow) {
ThreadSafeArenaStats info;
- MutexLock l(&info.init_mu);
- info.PrepareForSampling();
- RecordAllocateSlow(&info, /*requested=*/100, /*allocated=*/128, /*wasted=*/0);
- EXPECT_EQ(info.num_allocations.load(), 1);
- EXPECT_EQ(info.num_resets.load(), 0);
- EXPECT_EQ(info.bytes_requested.load(), 100);
- EXPECT_EQ(info.bytes_allocated.load(), 128);
- EXPECT_EQ(info.bytes_wasted.load(), 0);
- EXPECT_EQ(info.max_bytes_allocated.load(), 0);
+ constexpr int64_t kTestStride = 458;
+ absl::MutexLock l(&info.init_mu);
+ info.PrepareForSampling(kTestStride);
+ RecordAllocateSlow(&info, /*requested=*/0, /*allocated=*/128, /*wasted=*/0);
+ EXPECT_EQ(
+ info.block_histogram[0].num_allocations.load(std::memory_order_relaxed),
+ 1);
+ EXPECT_EQ(info.block_histogram[0].bytes_used.load(std::memory_order_relaxed),
+ 0);
+ EXPECT_EQ(
+ info.block_histogram[0].bytes_allocated.load(std::memory_order_relaxed),
+ 128);
+ EXPECT_EQ(
+ info.block_histogram[0].bytes_wasted.load(std::memory_order_relaxed), 0);
+ EXPECT_EQ(info.max_block_size.load(std::memory_order_relaxed), 128);
RecordAllocateSlow(&info, /*requested=*/100, /*allocated=*/256,
/*wasted=*/28);
- EXPECT_EQ(info.num_allocations.load(), 2);
- EXPECT_EQ(info.num_resets.load(), 0);
- EXPECT_EQ(info.bytes_requested.load(), 200);
- EXPECT_EQ(info.bytes_allocated.load(), 384);
- EXPECT_EQ(info.bytes_wasted.load(), 28);
- EXPECT_EQ(info.max_bytes_allocated.load(), 0);
+ EXPECT_EQ(info.block_histogram[0].bytes_used.load(std::memory_order_relaxed),
+ 100);
+ EXPECT_EQ(
+ info.block_histogram[0].bytes_wasted.load(std::memory_order_relaxed), 28);
+ EXPECT_EQ(
+ info.block_histogram[1].num_allocations.load(std::memory_order_relaxed),
+ 1);
+ EXPECT_EQ(
+ info.block_histogram[1].bytes_allocated.load(std::memory_order_relaxed),
+ 256);
+ EXPECT_EQ(info.max_block_size.load(std::memory_order_relaxed), 256);
}
-TEST(ThreadSafeArenaStatsTest, RecordResetSlow) {
+TEST(ThreadSafeArenaStatsTest, RecordAllocateSlowMaxBlockSizeTest) {
ThreadSafeArenaStats info;
- MutexLock l(&info.init_mu);
- info.PrepareForSampling();
- EXPECT_EQ(info.num_resets.load(), 0);
- EXPECT_EQ(info.bytes_allocated.load(), 0);
+ constexpr int64_t kTestStride = 458;
+ absl::MutexLock l(&info.init_mu);
+ info.PrepareForSampling(kTestStride);
RecordAllocateSlow(&info, /*requested=*/100, /*allocated=*/128, /*wasted=*/0);
- EXPECT_EQ(info.num_resets.load(), 0);
- EXPECT_EQ(info.bytes_allocated.load(), 128);
- RecordResetSlow(&info);
- EXPECT_EQ(info.num_resets.load(), 1);
- EXPECT_EQ(info.bytes_allocated.load(), 0);
+ EXPECT_EQ(info.max_block_size.load(std::memory_order_relaxed), 128);
+ RecordAllocateSlow(&info, /*requested=*/100, /*allocated=*/256,
+ /*wasted=*/28);
+ EXPECT_EQ(info.max_block_size.load(std::memory_order_relaxed), 256);
+ RecordAllocateSlow(&info, /*requested=*/100, /*allocated=*/128,
+ /*wasted=*/28);
+ EXPECT_EQ(info.max_block_size.load(std::memory_order_relaxed), 256);
+}
+
+TEST(ThreadSafeArenazSamplerTest, SamplingCorrectness) {
+ SetThreadSafeArenazEnabled(true);
+ for (int p = 0; p <= 15; ++p) {
+ SetThreadSafeArenazSampleParameter(1 << p);
+ SetThreadSafeArenazGlobalNextSample(1 << p);
+ const int kTrials = 1000 << p;
+ std::vector<ThreadSafeArenaStatsHandle> hv;
+ for (int i = 0; i < kTrials; ++i) {
+ ThreadSafeArenaStatsHandle h = Sample();
+ if (h.MutableStats() != nullptr) hv.push_back(std::move(h));
+ }
+ // Ideally samples << p should be very close to kTrials. But we keep a
+ // factor of two guard band.
+ EXPECT_GE(hv.size() << p, kTrials / 2);
+ EXPECT_LE(hv.size() << p, 2 * kTrials);
+ }
}
TEST(ThreadSafeArenazSamplerTest, SmallSampleParameter) {
SetThreadSafeArenazEnabled(true);
SetThreadSafeArenazSampleParameter(100);
+ constexpr int64_t kTestStride = 0;
for (int i = 0; i < 1000; ++i) {
- int64_t next_sample = 0;
- ThreadSafeArenaStats* sample = SampleSlow(&next_sample);
- EXPECT_GT(next_sample, 0);
+ SamplingState sampling_state = {kTestStride, kTestStride};
+ ThreadSafeArenaStats* sample = SampleSlow(sampling_state);
+ EXPECT_GT(sampling_state.next_sample, 0);
EXPECT_NE(sample, nullptr);
UnsampleSlow(sample);
}
@@ -156,11 +240,12 @@
TEST(ThreadSafeArenazSamplerTest, LargeSampleParameter) {
SetThreadSafeArenazEnabled(true);
SetThreadSafeArenazSampleParameter(std::numeric_limits<int32_t>::max());
+ constexpr int64_t kTestStride = 0;
for (int i = 0; i < 1000; ++i) {
- int64_t next_sample = 0;
- ThreadSafeArenaStats* sample = SampleSlow(&next_sample);
- EXPECT_GT(next_sample, 0);
+ SamplingState sampling_state = {kTestStride, kTestStride};
+ ThreadSafeArenaStats* sample = SampleSlow(sampling_state);
+ EXPECT_GT(sampling_state.next_sample, 0);
EXPECT_NE(sample, nullptr);
UnsampleSlow(sample);
}
@@ -187,14 +272,19 @@
TEST(ThreadSafeArenazSamplerTest, Handle) {
auto& sampler = GlobalThreadSafeArenazSampler();
- ThreadSafeArenaStatsHandle h(sampler.Register());
+ constexpr int64_t kTestStride = 17;
+ ThreadSafeArenaStatsHandle h(sampler.Register(kTestStride));
auto* info = ThreadSafeArenaStatsHandlePeer::GetInfo(&h);
- info->bytes_allocated.store(0x12345678, std::memory_order_relaxed);
+ info->block_histogram[0].bytes_allocated.store(0x12345678,
+ std::memory_order_relaxed);
bool found = false;
sampler.Iterate([&](const ThreadSafeArenaStats& h) {
if (&h == info) {
- EXPECT_EQ(h.bytes_allocated.load(), 0x12345678);
+ EXPECT_EQ(
+ h.block_histogram[0].bytes_allocated.load(std::memory_order_relaxed),
+ 0x12345678);
+ EXPECT_EQ(h.weight, kTestStride);
found = true;
}
});
@@ -206,7 +296,8 @@
if (&h == info) {
// this will only happen if some other thread has resurrected the info
// the old handle was using.
- if (h.bytes_allocated.load() == 0x12345678) {
+ if (h.block_histogram[0].bytes_allocated.load(
+ std::memory_order_relaxed) == 0x12345678) {
found = true;
}
}
@@ -216,12 +307,13 @@
TEST(ThreadSafeArenazSamplerTest, Registration) {
ThreadSafeArenazSampler sampler;
- auto* info1 = Register(&sampler, 1);
+ constexpr int64_t kTestStride = 100;
+ auto* info1 = Register(&sampler, 1, kTestStride);
EXPECT_THAT(GetBytesAllocated(&sampler), UnorderedElementsAre(1));
- auto* info2 = Register(&sampler, 2);
+ auto* info2 = Register(&sampler, 2, kTestStride);
EXPECT_THAT(GetBytesAllocated(&sampler), UnorderedElementsAre(1, 2));
- info1->bytes_allocated.store(3);
+ info1->block_histogram[0].bytes_allocated.store(3, std::memory_order_relaxed);
EXPECT_THAT(GetBytesAllocated(&sampler), UnorderedElementsAre(3, 2));
sampler.Unregister(info1);
@@ -231,19 +323,20 @@
TEST(ThreadSafeArenazSamplerTest, Unregistration) {
ThreadSafeArenazSampler sampler;
std::vector<ThreadSafeArenaStats*> infos;
+ constexpr int64_t kTestStride = 200;
for (size_t i = 0; i < 3; ++i) {
- infos.push_back(Register(&sampler, i));
+ infos.push_back(Register(&sampler, i + 1, kTestStride));
}
- EXPECT_THAT(GetBytesAllocated(&sampler), UnorderedElementsAre(0, 1, 2));
+ EXPECT_THAT(GetBytesAllocated(&sampler), UnorderedElementsAre(1, 2, 3));
sampler.Unregister(infos[1]);
- EXPECT_THAT(GetBytesAllocated(&sampler), UnorderedElementsAre(0, 2));
+ EXPECT_THAT(GetBytesAllocated(&sampler), UnorderedElementsAre(1, 3));
- infos.push_back(Register(&sampler, 3));
- infos.push_back(Register(&sampler, 4));
- EXPECT_THAT(GetBytesAllocated(&sampler), UnorderedElementsAre(0, 2, 3, 4));
+ infos.push_back(Register(&sampler, 3, kTestStride));
+ infos.push_back(Register(&sampler, 4, kTestStride));
+ EXPECT_THAT(GetBytesAllocated(&sampler), UnorderedElementsAre(1, 3, 3, 4));
sampler.Unregister(infos[3]);
- EXPECT_THAT(GetBytesAllocated(&sampler), UnorderedElementsAre(0, 2, 4));
+ EXPECT_THAT(GetBytesAllocated(&sampler), UnorderedElementsAre(1, 3, 4));
sampler.Unregister(infos[0]);
sampler.Unregister(infos[2]);
@@ -257,18 +350,19 @@
ThreadPool pool(10);
for (int i = 0; i < 10; ++i) {
- pool.Schedule([&sampler, &stop]() {
+ const int64_t sampling_stride = 11 + i % 3;
+ pool.Schedule([&sampler, &stop, sampling_stride]() {
std::random_device rd;
std::mt19937 gen(rd());
std::vector<ThreadSafeArenaStats*> infoz;
while (!stop.HasBeenNotified()) {
if (infoz.empty()) {
- infoz.push_back(sampler.Register());
+ infoz.push_back(sampler.Register(sampling_stride));
}
switch (std::uniform_int_distribution<>(0, 1)(gen)) {
case 0: {
- infoz.push_back(sampler.Register());
+ infoz.push_back(sampler.Register(sampling_stride));
break;
}
case 1: {
@@ -277,6 +371,7 @@
ThreadSafeArenaStats* info = infoz[p];
infoz[p] = infoz.back();
infoz.pop_back();
+ EXPECT_EQ(info->weight, sampling_stride);
sampler.Unregister(info);
break;
}
@@ -292,9 +387,10 @@
TEST(ThreadSafeArenazSamplerTest, Callback) {
ThreadSafeArenazSampler sampler;
+ constexpr int64_t kTestStride = 203;
- auto* info1 = Register(&sampler, 1);
- auto* info2 = Register(&sampler, 2);
+ auto* info1 = Register(&sampler, 1, kTestStride);
+ auto* info2 = Register(&sampler, 2, kTestStride);
static const ThreadSafeArenaStats* expected;
@@ -315,6 +411,33 @@
sampler.Unregister(info2);
}
+TEST(ThreadSafeArenazSamplerTest, InitialBlockReportsZeroUsedAndWasted) {
+ SetThreadSafeArenazEnabled(true);
+ // Setting 1 as the parameter value means one in every two arenas would be
+ // sampled, on average.
+ int32_t oldparam = ThreadSafeArenazSampleParameter();
+ SetThreadSafeArenazSampleParameter(1);
+ SetThreadSafeArenazGlobalNextSample(0);
+ constexpr int kSize = 571;
+ int count_found_allocation = 0;
+ auto& sampler = GlobalThreadSafeArenazSampler();
+ for (int i = 0; i < 10; ++i) {
+ char block[kSize];
+ google::protobuf::Arena arena(/*initial_block=*/block, /*initial_block_size=*/kSize);
+ sampler.Iterate([&](const ThreadSafeArenaStats& h) {
+ const auto& histbin =
+ h.block_histogram[ThreadSafeArenaStats::FindBin(kSize)];
+ if (histbin.bytes_allocated.load(std::memory_order_relaxed) == kSize) {
+ count_found_allocation++;
+ EXPECT_EQ(histbin.bytes_used, 0);
+ EXPECT_EQ(histbin.bytes_wasted, 0);
+ }
+ });
+ }
+ EXPECT_GT(count_found_allocation, 0);
+ SetThreadSafeArenazSampleParameter(oldparam);
+}
+
class ThreadSafeArenazSamplerTestThread : public Thread {
protected:
void Run() override {
@@ -332,7 +455,7 @@
public:
ThreadSafeArenazSamplerTestThread(const thread::Options& options,
- StringPiece name,
+ absl::string_view name,
google::protobuf::Arena* arena,
absl::Barrier* barrier)
: Thread(options, name), arena_(arena), barrier_(barrier) {}
@@ -346,6 +469,7 @@
SetThreadSafeArenazEnabled(true);
// Setting 1 as the parameter value means one in every two arenas would be
// sampled, on average.
+ int32_t oldparam = ThreadSafeArenazSampleParameter();
SetThreadSafeArenazSampleParameter(1);
SetThreadSafeArenazGlobalNextSample(0);
auto& sampler = GlobalThreadSafeArenazSampler();
@@ -359,7 +483,7 @@
std::vector<std::unique_ptr<ThreadSafeArenazSamplerTestThread>> threads;
for (int i = 0; i < kNumThreads; i++) {
auto t = std::make_unique<ThreadSafeArenazSamplerTestThread>(
- options, StrCat("thread", i), &arena, barrier);
+ options, absl::StrCat("thread", i), &arena, barrier);
t->Start();
threads.push_back(std::move(t));
}
@@ -373,6 +497,95 @@
}
}
EXPECT_GT(count, 0);
+ SetThreadSafeArenazSampleParameter(oldparam);
+}
+
+class SampleFirstArenaThread : public Thread {
+ protected:
+ void Run() override {
+ google::protobuf::Arena arena;
+ google::protobuf::ArenaSafeUniquePtr<
+ protobuf_test_messages::proto2::TestAllTypesProto2>
+ message = google::protobuf::MakeArenaSafeUnique<
+ protobuf_test_messages::proto2::TestAllTypesProto2>(&arena);
+ GOOGLE_CHECK(message != nullptr);
+ arena_created_.Notify();
+ samples_counted_.WaitForNotification();
+ }
+
+ public:
+ explicit SampleFirstArenaThread(const thread::Options& options)
+ : Thread(options, "SampleFirstArenaThread") {}
+
+ absl::Notification arena_created_;
+ absl::Notification samples_counted_;
+};
+
+// Test that the first arena created on a thread may and may not be chosen for
+// sampling.
+TEST(ThreadSafeArenazSamplerTest, SampleFirstArena) {
+ SetThreadSafeArenazEnabled(true);
+ auto& sampler = GlobalThreadSafeArenazSampler();
+
+ enum class SampleResult {
+ kSampled,
+ kUnsampled,
+ kSpoiled,
+ };
+
+ auto count_samples = [&]() {
+ int count = 0;
+ sampler.Iterate([&](const ThreadSafeArenaStats& h) { ++count; });
+ return count;
+ };
+
+ auto run_sample_experiment = [&]() {
+ int before = count_samples();
+ thread::Options options;
+ options.set_joinable(true);
+ SampleFirstArenaThread t(options);
+ t.Start();
+ t.arena_created_.WaitForNotification();
+ int during = count_samples();
+ t.samples_counted_.Notify();
+ t.Join();
+ int after = count_samples();
+
+ // If we didn't get back where we were, some other thread may have
+ // created an arena and produced an invalid experiment run.
+ if (before != after) return SampleResult::kSpoiled;
+
+ switch (during - before) {
+ case 1:
+ return SampleResult::kSampled;
+ case 0:
+ return SampleResult::kUnsampled;
+ default:
+ return SampleResult::kSpoiled;
+ }
+ };
+
+ constexpr int kTrials = 10000;
+ bool sampled = false;
+ bool unsampled = false;
+ for (int i = 0; i < kTrials; ++i) {
+ switch (run_sample_experiment()) {
+ case SampleResult::kSampled:
+ sampled = true;
+ break;
+ case SampleResult::kUnsampled:
+ unsampled = true;
+ break;
+ default:
+ break;
+ }
+
+ // This is the success criteria for the entire test. At some point
+ // we sampled the first arena and at some point we did not.
+ if (sampled && unsampled) return;
+ }
+ EXPECT_TRUE(sampled);
+ EXPECT_TRUE(unsampled);
}
#endif // defined(PROTOBUF_ARENAZ_SAMPLE)
diff --git a/src/google/protobuf/compiler/BUILD.bazel b/src/google/protobuf/compiler/BUILD.bazel
new file mode 100644
index 0000000..af05903
--- /dev/null
+++ b/src/google/protobuf/compiler/BUILD.bazel
@@ -0,0 +1,375 @@
+################################################################################
+# Protocol Buffers Compiler
+################################################################################
+
+load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library", "cc_test")
+load(
+ "@rules_pkg//:mappings.bzl",
+ "pkg_attributes",
+ "pkg_files",
+ "strip_prefix",
+)
+load("@rules_proto//proto:defs.bzl", "proto_library")
+load("//build_defs:arch_tests.bzl", "aarch64_test", "x86_64_test")
+load("//build_defs:cpp_opts.bzl", "COPTS", "LINK_OPTS", "PROTOC_LINK_OPTS")
+
+proto_library(
+ name = "plugin_proto",
+ srcs = ["plugin.proto"],
+ visibility = [
+ "//:__pkg__",
+ "//pkg:__pkg__",
+ ],
+ deps = ["//:descriptor_proto"],
+)
+
+cc_library(
+ name = "importer",
+ srcs = [
+ "importer.cc",
+ "parser.cc",
+ ],
+ hdrs = [
+ "importer.h",
+ "parser.h",
+ ],
+ copts = COPTS,
+ include_prefix = "google/protobuf/compiler",
+ visibility = ["//visibility:public"],
+ deps = [
+ "//src/google/protobuf:protobuf_nowkt",
+ "@com_google_absl//absl/strings",
+ ],
+)
+
+cc_library(
+ name = "code_generator",
+ srcs = [
+ "code_generator.cc",
+ "plugin.cc",
+ "plugin.pb.cc",
+ ],
+ hdrs = [
+ "code_generator.h",
+ "plugin.h",
+ "plugin.pb.h",
+ "scc.h",
+ ],
+ copts = COPTS,
+ include_prefix = "google/protobuf/compiler",
+ visibility = ["//visibility:public"],
+ deps = [
+ "//src/google/protobuf:protobuf_nowkt",
+ "@com_google_absl//absl/strings",
+ ],
+)
+
+cc_library(
+ name = "command_line_interface",
+ srcs = [
+ "command_line_interface.cc",
+ "subprocess.cc",
+ "zip_writer.cc",
+ ],
+ hdrs = [
+ "command_line_interface.h",
+ "subprocess.h",
+ "zip_writer.h",
+ ],
+ copts = COPTS,
+ include_prefix = "google/protobuf/compiler",
+ visibility = ["//visibility:public"],
+ deps = [
+ ":code_generator",
+ ":importer",
+ "//src/google/protobuf:protobuf_nowkt",
+ "@com_google_absl//absl/strings",
+ "@com_google_absl//absl/strings:str_format",
+ ],
+)
+
+cc_library(
+ name = "protoc_lib_nowkt",
+ srcs = [
+ "main.cc",
+ ],
+ copts = COPTS,
+ deps = [
+ ":code_generator",
+ ":command_line_interface",
+ ":importer",
+ "//src/google/protobuf:protobuf_nowkt",
+ "//src/google/protobuf/compiler/cpp",
+ "//src/google/protobuf/compiler/csharp",
+ "//src/google/protobuf/compiler/java",
+ "//src/google/protobuf/compiler/objectivec",
+ "//src/google/protobuf/compiler/php",
+ "//src/google/protobuf/compiler/python",
+ "//src/google/protobuf/compiler/ruby",
+ ],
+)
+
+cc_binary(
+ name = "protoc_nowkt",
+ copts = COPTS,
+ linkopts = LINK_OPTS + PROTOC_LINK_OPTS,
+ visibility = [
+ "//src/google/protobuf:__pkg__",
+ ],
+ deps = [":protoc_lib_nowkt"],
+)
+
+cc_library(
+ name = "protoc_lib",
+ copts = COPTS,
+ visibility = [
+ "//:__pkg__",
+ "//pkg:__pkg__",
+ ],
+ deps = [
+ ":protoc_lib_nowkt",
+ "//:protobuf",
+ ],
+)
+
+# Note: this is an alias for now. In the future, this rule will become the
+# cc_binary for protoc, and //:protoc will become an alias.
+alias(
+ name = "protoc",
+ actual = "//:protoc",
+ visibility = ["//visibility:public"],
+)
+
+# Test that the protoc binary is built for the correct architecture.
+aarch64_test(
+ name = "protoc_aarch64_test",
+ bazel_binaries = ["//:protoc"],
+)
+
+x86_64_test(
+ name = "protoc_x86_64_test",
+ bazel_binaries = ["//:protoc"],
+)
+
+################################################################################
+# Tests and support libraries
+################################################################################
+
+cc_library(
+ name = "annotation_test_util",
+ testonly = 1,
+ srcs = ["annotation_test_util.cc"],
+ hdrs = ["annotation_test_util.h"],
+ copts = COPTS,
+ strip_include_prefix = "/src",
+ visibility = ["//visibility:public"],
+ deps = [
+ ":code_generator",
+ ":command_line_interface",
+ "//:protobuf",
+ "//src/google/protobuf/io",
+ "//src/google/protobuf/testing",
+ ],
+)
+
+################################################################################
+# Tests
+################################################################################
+
+filegroup(
+ name = "plugin_proto_srcs",
+ testonly = 1,
+ srcs = [
+ "plugin.pb.cc",
+ "plugin.pb.h",
+ "plugin.proto",
+ ],
+ visibility = [
+ "//src/google/protobuf/compiler/cpp:__pkg__",
+ ],
+)
+
+exports_files(
+ srcs = ["plugin.proto"],
+ visibility = ["//:__pkg__"],
+)
+
+cc_library(
+ name = "mock_code_generator",
+ testonly = 1,
+ srcs = ["mock_code_generator.cc"],
+ hdrs = ["mock_code_generator.h"],
+ copts = COPTS,
+ strip_include_prefix = "/src",
+ visibility = ["//pkg:__pkg__"],
+ deps = [
+ ":code_generator",
+ "//src/google/protobuf/io",
+ "//src/google/protobuf/stubs",
+ "//src/google/protobuf/testing",
+ ],
+)
+
+cc_binary(
+ name = "test_plugin",
+ testonly = 1,
+ srcs = ["test_plugin.cc"],
+ copts = COPTS,
+ deps = [
+ ":code_generator",
+ ":mock_code_generator",
+ ],
+)
+
+cc_test(
+ name = "command_line_interface_unittest",
+ srcs = ["command_line_interface_unittest.cc"],
+ copts = COPTS + select({
+ "//build_defs:config_msvc": [],
+ "//conditions:default": [
+ "-Wno-deprecated",
+ "-Wno-deprecated-declarations",
+ ],
+ }) + [
+ # Note: This only works on Windows with symlinks and runfiles enabled.
+ "-DGOOGLE_PROTOBUF_TEST_PLUGIN_PATH=\\\"$(rootpath :test_plugin)\\\"",
+ ],
+ data = [
+ ":test_plugin",
+ "//:test_proto_srcs",
+ "//src/google/protobuf:testdata",
+ ],
+ deps = [
+ ":code_generator",
+ ":command_line_interface",
+ ":mock_code_generator",
+ "//:protobuf",
+ "//src/google/protobuf/compiler/cpp:names",
+ "//src/google/protobuf:cc_test_protos",
+ "//src/google/protobuf:test_util2",
+ "//src/google/protobuf/io",
+ "//src/google/protobuf/stubs",
+ "//src/google/protobuf/testing",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_test(
+ name = "importer_unittest",
+ srcs = ["importer_unittest.cc"],
+ copts = COPTS,
+ deps = [
+ ":importer",
+ "//:protobuf",
+ "//src/google/protobuf/io",
+ "//src/google/protobuf/stubs",
+ "//src/google/protobuf/testing",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_test(
+ name = "parser_unittest",
+ srcs = ["parser_unittest.cc"],
+ copts = COPTS + select({
+ "//build_defs:config_msvc": [],
+ "//conditions:default": [
+ "-Wno-deprecated",
+ "-Wno-deprecated-declarations",
+ ],
+ }),
+ deps = [
+ ":importer",
+ "//:protobuf",
+ "//src/google/protobuf:cc_test_protos",
+ "//src/google/protobuf:test_util2",
+ "//src/google/protobuf/io",
+ "//src/google/protobuf/stubs",
+ "//src/google/protobuf/testing",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+################################################################################
+# Generates protoc release artifacts.
+################################################################################
+
+genrule(
+ name = "protoc_readme",
+ outs = ["readme.txt"],
+ cmd = """
+echo "Protocol Buffers - Google's data interchange format
+Copyright 2008 Google Inc.
+https://developers.google.com/protocol-buffers/
+This package contains a precompiled binary version of the protocol buffer
+compiler (protoc). This binary is intended for users who want to use Protocol
+Buffers in languages other than C++ but do not want to compile protoc
+themselves. To install, simply place this binary somewhere in your PATH.
+If you intend to use the included well known types then don't forget to
+copy the contents of the 'include' directory somewhere as well, for example
+into '/usr/local/include/'.
+Please refer to our official github site for more installation instructions:
+ https://github.com/protocolbuffers/protobuf" > $@
+ """,
+ visibility = ["//:__pkg__"],
+)
+
+pkg_files(
+ name = "compiler_plugin_protos_files",
+ srcs = ["plugin.proto"],
+ prefix = "include/google/protobuf/compiler",
+ visibility = ["//pkg:__pkg__"],
+)
+
+pkg_files(
+ name = "protoc_files",
+ srcs = [":protoc"],
+ attributes = pkg_attributes(mode = "0555"),
+ prefix = "bin/",
+ visibility = ["//:__pkg__"],
+)
+
+################################################################################
+# Distribution packaging
+################################################################################
+
+pkg_files(
+ name = "dist_files",
+ srcs = glob(["**/*"]),
+ strip_prefix = strip_prefix.from_root(""),
+ visibility = ["//src:__pkg__"],
+)
+
+filegroup(
+ name = "test_srcs",
+ srcs = glob([
+ "*_test.cc",
+ "*unittest.cc",
+ ]) + [
+ "//src/google/protobuf/compiler/cpp:test_srcs",
+ "//src/google/protobuf/compiler/csharp:test_srcs",
+ "//src/google/protobuf/compiler/java:test_srcs",
+ "//src/google/protobuf/compiler/objectivec:test_srcs",
+ "//src/google/protobuf/compiler/php:test_srcs",
+ "//src/google/protobuf/compiler/python:test_srcs",
+ "//src/google/protobuf/compiler/ruby:test_srcs",
+ ],
+ visibility = ["//pkg:__pkg__"],
+)
+
+filegroup(
+ name = "test_plugin_srcs",
+ srcs = ["test_plugin.cc"],
+ visibility = ["//pkg:__pkg__"],
+)
+
+filegroup(
+ name = "test_proto_srcs",
+ srcs = [
+ "//src/google/protobuf/compiler/cpp:test_proto_srcs",
+ ],
+ visibility = ["//pkg:__pkg__"],
+)
diff --git a/src/google/protobuf/compiler/annotation_test_util.cc b/src/google/protobuf/compiler/annotation_test_util.cc
index f0815c5..76d39ab 100644
--- a/src/google/protobuf/compiler/annotation_test_util.cc
+++ b/src/google/protobuf/compiler/annotation_test_util.cc
@@ -28,20 +28,20 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/compiler/annotation_test_util.h>
+#include "google/protobuf/compiler/annotation_test_util.h"
#include <cstdint>
#include <memory>
-#include <google/protobuf/testing/file.h>
-#include <google/protobuf/testing/file.h>
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/compiler/command_line_interface.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/testing/googletest.h>
+#include "google/protobuf/testing/file.h"
+#include "google/protobuf/testing/file.h"
+#include "google/protobuf/compiler/code_generator.h"
+#include "google/protobuf/compiler/command_line_interface.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/io/zero_copy_stream.h"
+#include "google/protobuf/io/zero_copy_stream_impl_lite.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/testing/googletest.h"
#include <gtest/gtest.h>
namespace google {
diff --git a/src/google/protobuf/compiler/annotation_test_util.h b/src/google/protobuf/compiler/annotation_test_util.h
index b7c6ddd..b8356c2 100644
--- a/src/google/protobuf/compiler/annotation_test_util.h
+++ b/src/google/protobuf/compiler/annotation_test_util.h
@@ -31,8 +31,8 @@
#ifndef GOOGLE_PROTOBUF_COMPILER_ANNOTATION_TEST_UTIL_H__
#define GOOGLE_PROTOBUF_COMPILER_ANNOTATION_TEST_UTIL_H__
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/testing/googletest.h>
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/testing/googletest.h"
#include <gtest/gtest.h>
// Utilities that assist in writing tests for generator annotations.
diff --git a/src/google/protobuf/compiler/code_generator.cc b/src/google/protobuf/compiler/code_generator.cc
index dc9d450..3f48e37 100644
--- a/src/google/protobuf/compiler/code_generator.cc
+++ b/src/google/protobuf/compiler/code_generator.cc
@@ -32,13 +32,14 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/compiler/code_generator.h>
+#include "google/protobuf/compiler/code_generator.h"
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/compiler/plugin.pb.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/stubs/strutil.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/compiler/plugin.pb.h"
+#include "google/protobuf/descriptor.h"
+#include "absl/strings/str_split.h"
+#include "absl/strings/strip.h"
namespace google {
namespace protobuf {
@@ -107,7 +108,7 @@
void ParseGeneratorParameter(
const std::string& text,
std::vector<std::pair<std::string, std::string> >* output) {
- std::vector<std::string> parts = Split(text, ",", true);
+ std::vector<std::string> parts = absl::StrSplit(text, ",", absl::SkipEmpty());
for (int i = 0; i < parts.size(); i++) {
std::string::size_type equals_pos = parts[i].find_first_of('=');
@@ -125,10 +126,10 @@
// Strips ".proto" or ".protodevel" from the end of a filename.
std::string StripProto(const std::string& filename) {
- if (HasSuffixString(filename, ".protodevel")) {
- return StripSuffixString(filename, ".protodevel");
+ if (absl::EndsWith(filename, ".protodevel")) {
+ return std::string(absl::StripSuffix(filename, ".protodevel"));
} else {
- return StripSuffixString(filename, ".proto");
+ return std::string(absl::StripSuffix(filename, ".proto"));
}
}
diff --git a/src/google/protobuf/compiler/code_generator.h b/src/google/protobuf/compiler/code_generator.h
index 9c0b115..55b510a 100644
--- a/src/google/protobuf/compiler/code_generator.h
+++ b/src/google/protobuf/compiler/code_generator.h
@@ -41,10 +41,11 @@
#include <string>
#include <utility>
#include <vector>
-#include <google/protobuf/stubs/common.h>
+
+#include "google/protobuf/port.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -69,7 +70,9 @@
// be registered with CommandLineInterface to support various languages.
class PROTOC_EXPORT CodeGenerator {
public:
- inline CodeGenerator() {}
+ CodeGenerator() {}
+ CodeGenerator(const CodeGenerator&) = delete;
+ CodeGenerator& operator=(const CodeGenerator&) = delete;
virtual ~CodeGenerator();
// Generates code for the given proto file, generating one or more files in
@@ -120,9 +123,6 @@
// version of the library. When protobufs does a api breaking change, the
// method can be removed.
virtual bool HasGenerateAll() const { return true; }
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CodeGenerator);
};
// CodeGenerators generate one or more files in a given directory. This
@@ -131,8 +131,10 @@
// runs.
class PROTOC_EXPORT GeneratorContext {
public:
- inline GeneratorContext() {
+ GeneratorContext() {
}
+ GeneratorContext(const GeneratorContext&) = delete;
+ GeneratorContext& operator=(const GeneratorContext&) = delete;
virtual ~GeneratorContext();
// Opens the given file, truncating it if it exists, and returns a
@@ -177,9 +179,6 @@
// this GeneratorContext.
virtual void GetCompilerVersion(Version* version) const;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(GeneratorContext);
};
// The type GeneratorContext was once called OutputDirectory. This typedef
@@ -202,6 +201,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_COMPILER_CODE_GENERATOR_H__
diff --git a/src/google/protobuf/compiler/command_line_interface.cc b/src/google/protobuf/compiler/command_line_interface.cc
index 5e9a2c4..9595520 100644
--- a/src/google/protobuf/compiler/command_line_interface.cc
+++ b/src/google/protobuf/compiler/command_line_interface.cc
@@ -32,11 +32,12 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/compiler/command_line_interface.h>
+#include "google/protobuf/compiler/command_line_interface.h"
-#include <google/protobuf/stubs/platform_macros.h>
+#include "google/protobuf/stubs/platform_macros.h"
#include <stdio.h>
+#include <stdlib.h>
#include <sys/types.h>
#ifdef major
#undef major
@@ -58,6 +59,10 @@
#include <limits.h> // For PATH_MAX
#include <memory>
+#include <string>
+#include <unordered_set>
+#include <utility>
+#include <vector>
#if defined(__APPLE__)
#include <mach-o/dyld.h>
@@ -65,29 +70,31 @@
#include <sys/sysctl.h>
#endif
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/compiler/subprocess.h>
-#include <google/protobuf/compiler/plugin.pb.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/stringprintf.h>
-#include <google/protobuf/stubs/substitute.h>
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/compiler/importer.h>
-#include <google/protobuf/compiler/zip_writer.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/dynamic_message.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/io_win32.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/text_format.h>
-#include <google/protobuf/stubs/map_util.h>
-#include <google/protobuf/stubs/stl_util.h>
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/compiler/subprocess.h"
+#include "google/protobuf/compiler/plugin.pb.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "absl/strings/match.h"
+#include "absl/strings/str_format.h"
+#include "absl/strings/str_replace.h"
+#include "absl/strings/str_split.h"
+#include "absl/strings/substitute.h"
+#include "google/protobuf/compiler/code_generator.h"
+#include "google/protobuf/compiler/importer.h"
+#include "google/protobuf/compiler/zip_writer.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/dynamic_message.h"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/io/io_win32.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/io/zero_copy_stream_impl.h"
+#include "google/protobuf/text_format.h"
+#include "google/protobuf/stubs/stl_util.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -174,7 +181,7 @@
// Recursively create parent directories to the output file.
// On Windows, both '/' and '\' are valid path separators.
std::vector<std::string> parts =
- Split(filename, "/\\", true);
+ absl::StrSplit(filename, absl::ByAnyChar("/\\"), absl::SkipEmpty());
std::string path_so_far = prefix;
for (int i = 0; i < parts.size() - 1; i++) {
path_so_far += parts[i];
@@ -339,9 +346,12 @@
void AddErrorOrWarning(const std::string& filename, int line, int column,
const std::string& message, const std::string& type,
std::ostream& out) {
- // Print full path when running under MSVS
std::string dfile;
- if (format_ == CommandLineInterface::ERROR_FORMAT_MSVS &&
+ if (
+#ifndef PROTOBUF_OPENSOURCE
+ // Print full path when running under MSVS
+ format_ == CommandLineInterface::ERROR_FORMAT_MSVS &&
+#endif // !PROTOBUF_OPENSOURCE
tree_ != nullptr && tree_->VirtualFileToDiskFile(filename, &dfile)) {
out << dfile;
} else {
@@ -398,7 +408,6 @@
// Get name of all output files.
void GetOutputFilenames(std::vector<std::string>* output_filenames);
-
// implements GeneratorContext --------------------------------------
io::ZeroCopyOutputStream* Open(const std::string& filename) override;
io::ZeroCopyOutputStream* OpenForAppend(const std::string& filename) override;
@@ -815,7 +824,7 @@
// Find the insertion point.
std::string magic_string =
- strings::Substitute("@@protoc_insertion_point($0)", insertion_point_);
+ absl::Substitute("@@protoc_insertion_point($0)", insertion_point_);
std::string::size_type pos = target->find(magic_string);
if (pos == std::string::npos) {
@@ -963,6 +972,7 @@
int CommandLineInterface::Run(int argc, const char* const argv[]) {
Clear();
+
switch (ParseArguments(argc, argv)) {
case PARSE_ARGUMENT_DONE_AND_EXIT:
return 0;
@@ -1056,9 +1066,9 @@
if (mode_ == MODE_COMPILE) {
for (int i = 0; i < output_directives_.size(); i++) {
std::string output_location = output_directives_[i].output_location;
- if (!HasSuffixString(output_location, ".zip") &&
- !HasSuffixString(output_location, ".jar") &&
- !HasSuffixString(output_location, ".srcjar")) {
+ if (!absl::EndsWith(output_location, ".zip") &&
+ !absl::EndsWith(output_location, ".jar") &&
+ !absl::EndsWith(output_location, ".srcjar")) {
AddTrailingSlash(&output_location);
}
@@ -1076,16 +1086,15 @@
}
}
- // Write all output to disk.
for (const auto& pair : output_directories) {
const std::string& location = pair.first;
GeneratorContextImpl* directory = pair.second.get();
- if (HasSuffixString(location, "/")) {
+ if (absl::EndsWith(location, "/")) {
if (!directory->WriteAllToDisk(location)) {
return 1;
}
} else {
- if (HasSuffixString(location, ".jar")) {
+ if (absl::EndsWith(location, ".jar")) {
directory->AddJarManifest();
}
@@ -1151,7 +1160,6 @@
// Do not add a default case.
}
}
-
return 0;
}
@@ -1276,6 +1284,7 @@
}
parsed_files->push_back(parsed_file);
+
// Enforce --disallow_services.
if (disallow_services_ && parsed_file->service_count() > 0) {
std::cerr << parsed_file->name()
@@ -1295,9 +1304,9 @@
direct_dependencies_.end()) {
indirect_imports = true;
std::cerr << parsed_file->name() << ": "
- << StringReplace(direct_dependencies_violation_msg_, "%s",
- parsed_file->dependency(i)->name(),
- true /* replace_all */)
+ << absl::StrReplaceAll(
+ direct_dependencies_violation_msg_,
+ {{"%s", parsed_file->dependency(i)->name()}})
<< std::endl;
}
}
@@ -1679,8 +1688,7 @@
})) {
case google::protobuf::io::win32::ExpandWildcardsResult::kSuccess:
break;
- case google::protobuf::io::win32::ExpandWildcardsResult::
- kErrorNoMatchingFile:
+ case google::protobuf::io::win32::ExpandWildcardsResult::kErrorNoMatchingFile:
// Path does not exist, is not a file, or it's longer than MAX_PATH and
// long path handling is disabled.
std::cerr << "Invalid file name pattern or missing input file \""
@@ -1701,9 +1709,9 @@
// Java's -classpath (and some other languages) delimits path components
// with colons. Let's accept that syntax too just to make things more
// intuitive.
- std::vector<std::string> parts = Split(
- value, CommandLineInterface::kPathSeparator,
- true);
+ std::vector<std::string> parts = absl::StrSplit(
+ value, absl::ByAnyChar(CommandLineInterface::kPathSeparator),
+ absl::SkipEmpty());
for (int i = 0; i < parts.size(); i++) {
std::string virtual_path;
@@ -1757,7 +1765,7 @@
direct_dependencies_explicitly_set_ = true;
std::vector<std::string> direct =
- Split(value, ":", true);
+ absl::StrSplit(value, ":", absl::SkipEmpty());
GOOGLE_DCHECK(direct_dependencies_.empty());
direct_dependencies_.insert(direct.begin(), direct.end());
@@ -1783,9 +1791,9 @@
return PARSE_ARGUMENT_FAIL;
}
- descriptor_set_in_names_ = Split(
- value, CommandLineInterface::kPathSeparator,
- true);
+ descriptor_set_in_names_ = absl::StrSplit(
+ value, absl::ByAnyChar(CommandLineInterface::kPathSeparator),
+ absl::SkipEmpty());
} else if (name == "-o" || name == "--descriptor_set_out") {
if (!descriptor_set_out_name_.empty()) {
@@ -1843,7 +1851,7 @@
if (!version_info_.empty()) {
std::cout << version_info_ << std::endl;
}
- std::cout << "libprotoc " << internal::VersionString(PROTOBUF_VERSION)
+ std::cout << "libprotoc " << internal::ProtocVersionString(PROTOBUF_VERSION)
<< PROTOBUF_VERSION_SUFFIX << std::endl;
return PARSE_ARGUMENT_DONE_AND_EXIT; // Exit without running compiler.
@@ -1943,14 +1951,30 @@
}
mode_ = MODE_PRINT;
print_mode_ = PRINT_FREE_FIELDS;
+ } else if (name == "--enable_codegen_trace") {
+ // We use environment variables here so that subprocesses see this setting
+ // when we spawn them.
+ //
+ // Setting environment variables is more-or-less asking for a data race,
+ // because C got this wrong and did not mandate synchronization.
+ // In practice, this code path is "only" in the main thread of protoc, and
+ // it is common knowledge that touching setenv in a library is asking for
+ // life-ruining bugs *anyways*. As such, there is a reasonable probability
+ // that there isn't another thread kicking environment variables at this
+ // moment.
+
+#ifdef _WIN32
+ ::_putenv(absl::StrCat(io::Printer::kProtocCodegenTrace, "=yes").c_str());
+#else
+ ::setenv(io::Printer::kProtocCodegenTrace.data(), "yes", 0);
+#endif
} else {
// Some other flag. Look it up in the generators list.
- const GeneratorInfo* generator_info =
- FindOrNull(generators_by_flag_name_, name);
+ const GeneratorInfo* generator_info = FindGeneratorByFlag(name);
if (generator_info == nullptr &&
- (plugin_prefix_.empty() || !HasSuffixString(name, "_out"))) {
+ (plugin_prefix_.empty() || !absl::EndsWith(name, "_out"))) {
// Check if it's a generator option flag.
- generator_info = FindOrNull(generators_by_option_name_, name);
+ generator_info = FindGeneratorByOption(name);
if (generator_info != nullptr) {
std::string* parameters =
&generator_parameters_[generator_info->flag_name];
@@ -1958,7 +1982,7 @@
parameters->append(",");
}
parameters->append(value);
- } else if (HasPrefixString(name, "--") && HasSuffixString(name, "_opt")) {
+ } else if (absl::StartsWith(name, "--") && absl::EndsWith(name, "_opt")) {
std::string* parameters =
&plugin_parameters_[PluginName(plugin_prefix_, name)];
if (!parameters->empty()) {
@@ -2069,7 +2093,10 @@
defined in the given proto files. Groups share
the same field number space with the parent
message. Extension ranges are counted as
- occupied fields numbers.)";
+ occupied fields numbers.
+ --enable_codegen_trace Enables tracing which parts of protoc are
+ responsible for what codegen output. Not supported
+ by all backends or on all platforms.)";
if (!plugin_prefix_.empty()) {
std::cout << R"(
--plugin=EXECUTABLE Specifies a plugin executable to use.
@@ -2082,16 +2109,15 @@
the executable's own name differs.)";
}
- for (GeneratorMap::iterator iter = generators_by_flag_name_.begin();
- iter != generators_by_flag_name_.end(); ++iter) {
+ for (const auto& kv : generators_by_flag_name_) {
// FIXME(kenton): If the text is long enough it will wrap, which is ugly,
// but fixing this nicely (e.g. splitting on spaces) is probably more
// trouble than it's worth.
std::cout << std::endl
- << " " << iter->first << "=OUT_DIR "
- << std::string(19 - iter->first.size(),
+ << " " << kv.first << "=OUT_DIR "
+ << std::string(19 - kv.first.size(),
' ') // Spaces for alignment.
- << iter->second.help_text;
+ << kv.second.help_text;
}
std::cout << R"(
@<filename> Read options and filenames from file. If a
@@ -2123,7 +2149,8 @@
<< codegen_name
<< " hasn't been updated to support optional fields in "
"proto3. Please ask the owner of this code generator to "
- "support proto3 optional.";
+ "support proto3 optional."
+ << std::endl;
return false;
}
}
@@ -2139,8 +2166,8 @@
std::string error;
if (output_directive.generator == nullptr) {
// This is a plugin.
- GOOGLE_CHECK(HasPrefixString(output_directive.name, "--") &&
- HasSuffixString(output_directive.name, "_out"))
+ GOOGLE_CHECK(absl::StartsWith(output_directive.name, "--") &&
+ absl::EndsWith(output_directive.name, "_out"))
<< "Bad name for plugin generator: " << output_directive.name;
std::string plugin_name = PluginName(plugin_prefix_, output_directive.name);
@@ -2296,7 +2323,7 @@
std::string communicate_error;
if (!subprocess.Communicate(request, &response, &communicate_error)) {
- *error = strings::Substitute("$0: $1", plugin_name, communicate_error);
+ *error = absl::Substitute("$0: $1", plugin_name, communicate_error);
return false;
}
@@ -2323,7 +2350,7 @@
current_output.reset();
current_output.reset(generator_context->Open(output_file.name()));
} else if (current_output == nullptr) {
- *error = strings::Substitute(
+ *error = absl::Substitute(
"$0: First file chunk returned by plugin did not specify a file "
"name.",
plugin_name);
@@ -2506,6 +2533,20 @@
}
}
+const CommandLineInterface::GeneratorInfo*
+CommandLineInterface::FindGeneratorByFlag(const std::string& name) const {
+ auto it = generators_by_flag_name_.find(name);
+ if (it == generators_by_flag_name_.end()) return nullptr;
+ return &it->second;
+}
+
+const CommandLineInterface::GeneratorInfo*
+CommandLineInterface::FindGeneratorByOption(const std::string& option) const {
+ auto it = generators_by_option_name_.find(option);
+ if (it == generators_by_option_name_.end()) return nullptr;
+ return &it->second;
+}
+
namespace {
// Utility function for PrintFreeFieldNumbers.
@@ -2577,7 +2618,7 @@
void FormatFreeFieldNumbers(const std::string& name,
const std::set<FieldRange>& ranges) {
std::string output;
- StringAppendF(&output, "%-35s free:", name.c_str());
+ absl::StrAppendFormat(&output, "%-35s free:", name.c_str());
int next_free_number = 1;
for (std::set<FieldRange>::const_iterator i = ranges.begin();
i != ranges.end(); ++i) {
@@ -2588,17 +2629,17 @@
if (next_free_number < i->first) {
if (next_free_number + 1 == i->first) {
// Singleton
- StringAppendF(&output, " %d", next_free_number);
+ absl::StrAppendFormat(&output, " %d", next_free_number);
} else {
// Range
- StringAppendF(&output, " %d-%d", next_free_number,
+ absl::StrAppendFormat(&output, " %d-%d", next_free_number,
i->first - 1);
}
}
next_free_number = i->second;
}
if (next_free_number <= FieldDescriptor::kMaxNumber) {
- StringAppendF(&output, " %d-INF", next_free_number);
+ absl::StrAppendFormat(&output, " %d-INF", next_free_number);
}
std::cout << output << std::endl;
}
diff --git a/src/google/protobuf/compiler/command_line_interface.h b/src/google/protobuf/compiler/command_line_interface.h
index e842550..6965e1a 100644
--- a/src/google/protobuf/compiler/command_line_interface.h
+++ b/src/google/protobuf/compiler/command_line_interface.h
@@ -39,6 +39,7 @@
#define GOOGLE_PROTOBUF_COMPILER_COMMAND_LINE_INTERFACE_H__
#include <cstdint>
+#include <functional>
#include <map>
#include <memory>
#include <set>
@@ -48,10 +49,11 @@
#include <utility>
#include <vector>
-#include <google/protobuf/stubs/common.h>
+#include "absl/strings/string_view.h"
+#include "google/protobuf/port.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -115,6 +117,8 @@
static const char* const kPathSeparator;
CommandLineInterface();
+ CommandLineInterface(const CommandLineInterface&) = delete;
+ CommandLineInterface& operator=(const CommandLineInterface&) = delete;
~CommandLineInterface();
// Register a code generator for a language.
@@ -352,7 +356,11 @@
CodeGenerator* generator;
std::string help_text;
};
- typedef std::map<std::string, GeneratorInfo> GeneratorMap;
+
+ const GeneratorInfo* FindGeneratorByFlag(const std::string& name) const;
+ const GeneratorInfo* FindGeneratorByOption(const std::string& option) const;
+
+ using GeneratorMap = std::map<std::string, GeneratorInfo>;
GeneratorMap generators_by_flag_name_;
GeneratorMap generators_by_option_name_;
// A map from generator names to the parameters specified using the option
@@ -398,7 +406,7 @@
// True if we should treat warnings as errors that fail the compilation.
bool fatal_warnings_ = false;
- std::vector<std::pair<std::string, std::string> >
+ std::vector<std::pair<std::string, std::string>>
proto_path_; // Search path for proto files.
std::vector<std::string> input_files_; // Names of the input proto files.
@@ -451,14 +459,12 @@
// When using --encode, this will be passed to SetSerializationDeterministic.
bool deterministic_output_ = false;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CommandLineInterface);
};
} // namespace compiler
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_COMPILER_COMMAND_LINE_INTERFACE_H__
diff --git a/src/google/protobuf/compiler/command_line_interface_unittest.cc b/src/google/protobuf/compiler/command_line_interface_unittest.cc
index f48135e..9074c09 100644
--- a/src/google/protobuf/compiler/command_line_interface_unittest.cc
+++ b/src/google/protobuf/compiler/command_line_interface_unittest.cc
@@ -38,6 +38,8 @@
#include <cstdint>
+#include "absl/strings/str_format.h"
+
#ifndef _MSC_VER
#include <unistd.h>
#endif
@@ -45,31 +47,35 @@
#include <string>
#include <vector>
-#include <google/protobuf/stubs/stringprintf.h>
-#include <google/protobuf/testing/file.h>
-#include <google/protobuf/testing/file.h>
-#include <google/protobuf/testing/file.h>
-#include <google/protobuf/any.pb.h>
-#include <google/protobuf/test_util2.h>
-#include <google/protobuf/unittest.pb.h>
-#include <google/protobuf/unittest_custom_options.pb.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/testing/googletest.h>
+#include "google/protobuf/testing/file.h"
+#include "google/protobuf/testing/file.h"
+#include "google/protobuf/testing/file.h"
+#include "google/protobuf/any.pb.h"
+#include "google/protobuf/test_util2.h"
+#include "google/protobuf/unittest.pb.h"
+#include "google/protobuf/unittest_custom_options.pb.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/testing/googletest.h"
#include <gtest/gtest.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/substitute.h>
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/compiler/command_line_interface.h>
-#include <google/protobuf/compiler/mock_code_generator.h>
-#include <google/protobuf/compiler/subprocess.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/io/io_win32.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/io/zero_copy_stream.h>
+#include "absl/status/status.h"
+#include "absl/strings/str_replace.h"
+#include "absl/strings/str_split.h"
+#include "absl/strings/string_view.h"
+#include "absl/strings/substitute.h"
+#include "google/protobuf/compiler/code_generator.h"
+#include "google/protobuf/compiler/command_line_interface.h"
+#include "google/protobuf/compiler/mock_code_generator.h"
+#include "google/protobuf/compiler/subprocess.h"
+#include "google/protobuf/compiler/cpp/names.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/io/io_win32.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/io/zero_copy_stream.h"
+#include "google/protobuf/stubs/strutil.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -319,7 +325,7 @@
}
void CommandLineInterfaceTest::Run(const std::string& command) {
- RunWithArgs(Split(command, " ", true));
+ RunWithArgs(absl::StrSplit(command, " ", absl::SkipEmpty()));
}
void CommandLineInterfaceTest::RunWithArgs(std::vector<std::string> args) {
@@ -349,7 +355,7 @@
"test_plugin.exe", // Other Win32 (MSVC)
"test_plugin", // Unix
};
- for (int i = 0; i < GOOGLE_ARRAYSIZE(possible_paths); i++) {
+ for (int i = 0; i < ABSL_ARRAYSIZE(possible_paths); i++) {
if (access(possible_paths[i], F_OK) == 0) {
plugin_path = possible_paths[i];
break;
@@ -357,9 +363,10 @@
}
#endif
- if (plugin_path.empty()) {
+ if (plugin_path.empty() || !FileExists(plugin_path)) {
GOOGLE_LOG(ERROR)
- << "Plugin executable not found. Plugin tests are likely to fail.";
+ << "Plugin executable not found. Plugin tests are likely to fail."
+ << plugin_path;
} else {
args.push_back("--plugin=prefix-gen-plug=" + plugin_path);
}
@@ -367,8 +374,8 @@
std::unique_ptr<const char*[]> argv(new const char*[args.size()]);
- for (int i = 0; i < args.size(); i++) {
- args[i] = StringReplace(args[i], "$tmpdir", temp_directory_, true);
+ for (size_t i = 0; i < args.size(); i++) {
+ args[i] = absl::StrReplaceAll(args[i], {{"$tmpdir", temp_directory_}});
argv[i] = args[i].c_str();
}
@@ -405,7 +412,7 @@
// Write file.
std::string full_name = temp_directory_ + "/" + name;
GOOGLE_CHECK_OK(File::SetContents(
- full_name, StringReplace(contents, "$tmpdir", temp_directory_, true),
+ full_name, absl::StrReplaceAll(contents, {{"$tmpdir", temp_directory_}}),
true));
}
@@ -424,7 +431,7 @@
void CommandLineInterfaceTest::ExpectErrorText(
const std::string& expected_text) {
EXPECT_NE(0, return_code_);
- EXPECT_EQ(StringReplace(expected_text, "$tmpdir", temp_directory_, true),
+ EXPECT_EQ(absl::StrReplaceAll(expected_text, {{"$tmpdir", temp_directory_}}),
error_text_);
}
@@ -537,7 +544,7 @@
std::string file_contents;
GOOGLE_CHECK_OK(File::GetContents(path, &file_contents, true));
- EXPECT_EQ(StringReplace(content, "$tmpdir", temp_directory_, true),
+ EXPECT_EQ(absl::StrReplaceAll(content, {{"$tmpdir", temp_directory_}}),
file_contents);
}
@@ -789,6 +796,7 @@
"bar.proto", "Bar");
}
+
TEST_F(CommandLineInterfaceTest, MultipleInputsWithImport_DescriptorSetIn) {
// Test parsing multiple input files with an import of a separate file.
FileDescriptorSet file_descriptor_set;
@@ -825,7 +833,7 @@
field->set_number(1);
WriteDescriptorSet("baz_and_bat.bin", &file_descriptor_set);
- Run(strings::Substitute(
+ Run(absl::Substitute(
"protocol_compiler --test_out=$$tmpdir --plug_out=$$tmpdir "
"--descriptor_set_in=$0 foo.proto bar.proto",
std::string("$tmpdir/foo_and_bar.bin") +
@@ -841,7 +849,7 @@
ExpectGeneratedWithMultipleInputs("test_plugin", "foo.proto,bar.proto",
"bar.proto", "Bar");
- Run(strings::Substitute(
+ Run(absl::Substitute(
"protocol_compiler --test_out=$$tmpdir --plug_out=$$tmpdir "
"--descriptor_set_in=$0 baz.proto bat.proto",
std::string("$tmpdir/foo_and_bar.bin") +
@@ -899,7 +907,7 @@
field->set_number(1);
WriteDescriptorSet("foo_and_baz.bin", &file_descriptor_set);
- Run(strings::Substitute(
+ Run(absl::Substitute(
"protocol_compiler --test_out=$$tmpdir --plug_out=$$tmpdir "
"--descriptor_set_in=$0 bar.proto",
std::string("$tmpdir/foo_and_bar.bin") +
@@ -1305,7 +1313,7 @@
"}\n");
CreateTempFile("b/foo.proto", "this should not be parsed\n");
- Run(strings::Substitute(
+ Run(absl::Substitute(
"protocol_compiler --test_out=$$tmpdir --proto_path=$0 foo.proto",
std::string("$tmpdir/a") + CommandLineInterface::kPathSeparator +
"$tmpdir/b"));
@@ -2253,9 +2261,9 @@
Run("protocol_compiler --plug_out=$tmpdir --proto_path=$tmpdir foo.proto");
- ExpectErrorSubstring(StringPrintf("Saw compiler_version: %d %s",
- GOOGLE_PROTOBUF_VERSION,
- GOOGLE_PROTOBUF_VERSION_SUFFIX));
+ ExpectErrorSubstring(absl::StrFormat("Saw compiler_version: %d %s",
+ GOOGLE_PROTOBUF_VERSION,
+ GOOGLE_PROTOBUF_VERSION_SUFFIX));
}
TEST_F(CommandLineInterfaceTest, GeneratorPluginNotFound) {
@@ -2586,8 +2594,8 @@
bool Run(const std::string& command, bool specify_proto_files = true) {
std::vector<std::string> args;
args.push_back("protoc");
- for (StringPiece split_piece :
- Split(command, " ", true)) {
+ for (absl::string_view split_piece :
+ absl::StrSplit(command, " ", absl::SkipEmpty())) {
args.push_back(std::string(split_piece));
}
if (specify_proto_files) {
@@ -2596,7 +2604,7 @@
args.push_back("--proto_path=" + TestUtil::TestSourceDir());
break;
case DESCRIPTOR_SET_IN:
- args.push_back(StrCat("--descriptor_set_in=",
+ args.push_back(absl::StrCat("--descriptor_set_in=",
unittest_proto_descriptor_set_filename_));
break;
default:
@@ -2681,7 +2689,7 @@
TEST_P(EncodeDecodeTest, Encode) {
RedirectStdinFromFile(TestUtil::GetTestDataPath(
- "net/proto2/internal/"
+ "third_party/protobuf/"
"testdata/text_format_unittest_data_oneof_implemented.txt"));
std::string args;
if (GetParam() != DESCRIPTOR_SET_IN) {
@@ -2690,18 +2698,18 @@
}
EXPECT_TRUE(Run(args + " --encode=protobuf_unittest.TestAllTypes"));
ExpectStdoutMatchesBinaryFile(TestUtil::GetTestDataPath(
- "net/proto2/internal/testdata/golden_message_oneof_implemented"));
+ "third_party/protobuf/testdata/golden_message_oneof_implemented"));
ExpectStderrMatchesText("");
}
TEST_P(EncodeDecodeTest, Decode) {
RedirectStdinFromFile(TestUtil::GetTestDataPath(
- "net/proto2/internal/testdata/golden_message_oneof_implemented"));
+ "third_party/protobuf/testdata/golden_message_oneof_implemented"));
EXPECT_TRUE(
Run(TestUtil::MaybeTranslatePath("net/proto2/internal/unittest.proto") +
" --decode=protobuf_unittest.TestAllTypes"));
ExpectStdoutMatchesTextFile(TestUtil::GetTestDataPath(
- "net/proto2/internal/"
+ "third_party/protobuf/"
"testdata/text_format_unittest_data_oneof_implemented.txt"));
ExpectStderrMatchesText("");
}
@@ -2750,7 +2758,7 @@
TEST_P(EncodeDecodeTest, EncodeDeterministicOutput) {
RedirectStdinFromFile(TestUtil::GetTestDataPath(
- "net/proto2/internal/"
+ "third_party/protobuf/"
"testdata/text_format_unittest_data_oneof_implemented.txt"));
std::string args;
if (GetParam() != DESCRIPTOR_SET_IN) {
@@ -2760,13 +2768,13 @@
EXPECT_TRUE(Run(
args + " --encode=protobuf_unittest.TestAllTypes --deterministic_output"));
ExpectStdoutMatchesBinaryFile(TestUtil::GetTestDataPath(
- "net/proto2/internal/testdata/golden_message_oneof_implemented"));
+ "third_party/protobuf/testdata/golden_message_oneof_implemented"));
ExpectStderrMatchesText("");
}
TEST_P(EncodeDecodeTest, DecodeDeterministicOutput) {
RedirectStdinFromFile(TestUtil::GetTestDataPath(
- "net/proto2/internal/testdata/golden_message_oneof_implemented"));
+ "third_party/protobuf/testdata/golden_message_oneof_implemented"));
EXPECT_FALSE(
Run(TestUtil::MaybeTranslatePath("net/proto2/internal/unittest.proto") +
" --decode=protobuf_unittest.TestAllTypes --deterministic_output"));
@@ -2780,7 +2788,7 @@
#endif // !GOOGLE_PROTOBUF_HEAP_CHECK_DRACONIAN
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
} // namespace compiler
} // namespace protobuf
diff --git a/src/google/protobuf/compiler/cpp/BUILD.bazel b/src/google/protobuf/compiler/cpp/BUILD.bazel
new file mode 100644
index 0000000..7f0ef6a
--- /dev/null
+++ b/src/google/protobuf/compiler/cpp/BUILD.bazel
@@ -0,0 +1,260 @@
+################################################################################
+# Protocol Buffers Compiler - C++ code generator
+################################################################################
+
+load("@rules_cc//cc:defs.bzl", "cc_library", "cc_proto_library", "cc_test")
+load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
+load("@rules_proto//proto:defs.bzl", "proto_library")
+load("//build_defs:cpp_opts.bzl", "COPTS")
+
+cc_library(
+ name = "names",
+ hdrs = ["names.h"],
+ copts = COPTS,
+ include_prefix = "google/protobuf/compiler/cpp",
+ visibility = ["//visibility:public"],
+ deps = [
+ ":names_internal",
+ "//src/google/protobuf/compiler:code_generator",
+ "//src/google/protobuf:protobuf_nowkt",
+ ],
+)
+
+cc_library(
+ name = "names_internal",
+ hdrs = [
+ "helpers.h",
+ "names.h",
+ "options.h",
+ ],
+ srcs = [
+ "helpers.cc",
+ ],
+ copts = COPTS,
+ include_prefix = "google/protobuf/compiler/cpp",
+ visibility = ["//pkg:__pkg__"],
+ deps = [
+ "//src/google/protobuf/compiler:code_generator",
+ "//src/google/protobuf:protobuf_nowkt",
+ ],
+)
+
+cc_library(
+ name = "cpp",
+ srcs = [
+ "enum.cc",
+ "enum_field.cc",
+ "extension.cc",
+ "field.cc",
+ "file.cc",
+ "generator.cc",
+ "map_field.cc",
+ "message.cc",
+ "message_field.cc",
+ "padding_optimizer.cc",
+ "parse_function_generator.cc",
+ "primitive_field.cc",
+ "service.cc",
+ "string_field.cc",
+ ],
+ hdrs = [
+ "enum.h",
+ "enum_field.h",
+ "extension.h",
+ "field.h",
+ "file.h",
+ "generator.h",
+ "map_field.h",
+ "message.h",
+ "message_field.h",
+ "message_layout_helper.h",
+ "padding_optimizer.h",
+ "parse_function_generator.h",
+ "primitive_field.h",
+ "service.h",
+ "string_field.h",
+ ],
+ copts = COPTS,
+ include_prefix = "google/protobuf/compiler/cpp",
+ visibility = [
+ "//pkg:__pkg__",
+ "//src/google/protobuf/compiler:__pkg__",
+ ],
+ deps = [
+ ":names_internal",
+ ":names",
+ "//src/google/protobuf:protobuf_nowkt",
+ "//src/google/protobuf/compiler:code_generator",
+ "@com_google_absl//absl/base:core_headers",
+ "@com_google_absl//absl/container:btree",
+ "@com_google_absl//absl/container:flat_hash_map",
+ "@com_google_absl//absl/container:flat_hash_set",
+ "@com_google_absl//absl/container:layout",
+ "@com_google_absl//absl/strings",
+ "@com_google_absl//absl/synchronization",
+ ],
+)
+
+proto_library(
+ name = "test_bad_identifiers_proto",
+ testonly = 1,
+ srcs = ["test_bad_identifiers.proto"],
+ strip_import_prefix = "/src",
+)
+
+cc_proto_library(
+ name = "test_bad_identifiers_cc_proto",
+ testonly = 1,
+ deps = [":test_bad_identifiers_proto"],
+)
+
+proto_library(
+ name = "test_large_enum_value_proto",
+ testonly = 1,
+ srcs = ["test_large_enum_value.proto"],
+ strip_import_prefix = "/src",
+)
+
+cc_proto_library(
+ name = "test_large_enum_value_cc_proto",
+ testonly = 1,
+ deps = [":test_large_enum_value_proto"],
+)
+
+cc_library(
+ name = "unittest_lib",
+ hdrs = [
+ "unittest.h",
+ "unittest.inc",
+ ],
+ strip_include_prefix = "/src",
+ visibility = ["//pkg:__pkg__"],
+)
+
+cc_test(
+ name = "unittest",
+ srcs = ["unittest.cc"],
+ copts = COPTS,
+ data = [
+ "//:test_proto_srcs",
+ "//src/google/protobuf:testdata",
+ ],
+ deps = [
+ ":cpp",
+ ":test_bad_identifiers_cc_proto",
+ ":unittest_lib",
+ "//:protobuf",
+ "//src/google/protobuf:cc_test_protos",
+ "//src/google/protobuf:test_util",
+ "//src/google/protobuf:test_util2",
+ "//src/google/protobuf/compiler:importer",
+ "//src/google/protobuf/io",
+ "//src/google/protobuf/stubs",
+ "//src/google/protobuf/testing",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_test(
+ name = "bootstrap_unittest",
+ srcs = ["bootstrap_unittest.cc"],
+ data = [
+ "//:well_known_type_protos",
+ "//src/google/protobuf:descriptor_cc_srcs",
+ "//src/google/protobuf:descriptor_proto_srcs",
+ "//src/google/protobuf:testdata",
+ "//src/google/protobuf/compiler:plugin_proto_srcs",
+ ],
+ deps = [
+ ":cpp",
+ "//:protobuf",
+ "//src/google/protobuf:test_util2",
+ "//src/google/protobuf/compiler:importer",
+ "//src/google/protobuf/io",
+ "//src/google/protobuf/stubs",
+ "//src/google/protobuf/testing",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_test(
+ name = "message_size_unittest",
+ srcs = ["message_size_unittest.cc"],
+ deps = [
+ "//:protobuf",
+ "//src/google/protobuf:cc_test_protos",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_test(
+ name = "metadata_test",
+ srcs = ["metadata_test.cc"],
+ deps = [
+ ":cpp",
+ "//:protobuf",
+ "//src/google/protobuf/compiler:annotation_test_util",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_test(
+ name = "move_unittest",
+ srcs = ["move_unittest.cc"],
+ copts = COPTS,
+ deps = [
+ "//:protobuf",
+ "//src/google/protobuf:cc_test_protos",
+ "//src/google/protobuf:test_util",
+ "//src/google/protobuf/stubs:lite",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_test(
+ name = "plugin_unittest",
+ srcs = ["plugin_unittest.cc"],
+ deps = [
+ ":cpp",
+ "//:protobuf",
+ "//src/google/protobuf/compiler:command_line_interface",
+ "//src/google/protobuf/io",
+ "//src/google/protobuf/testing",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+################################################################################
+# Distribution packaging
+################################################################################
+
+pkg_files(
+ name = "dist_files",
+ srcs = glob(["**/*"]),
+ strip_prefix = strip_prefix.from_root(""),
+ visibility = ["//src:__pkg__"],
+)
+
+filegroup(
+ name = "test_srcs",
+ srcs = glob([
+ "*_test.cc",
+ "*unittest.cc",
+ ]),
+ visibility = ["//src/google/protobuf/compiler:__pkg__"],
+)
+
+filegroup(
+ name = "test_proto_srcs",
+ srcs = [
+ "test_bad_identifiers.proto",
+ "test_large_enum_value.proto",
+ ],
+ visibility = ["//src/google/protobuf/compiler:__pkg__"],
+)
diff --git a/src/google/protobuf/compiler/cpp/bootstrap_unittest.cc b/src/google/protobuf/compiler/cpp/bootstrap_unittest.cc
index 2619e60..4685c0a 100644
--- a/src/google/protobuf/compiler/cpp/bootstrap_unittest.cc
+++ b/src/google/protobuf/compiler/cpp/bootstrap_unittest.cc
@@ -42,29 +42,34 @@
// "generate_descriptor_proto.sh" and add
// descriptor.pb.{h,cc} to your changelist.
-#include <map>
+#include <string>
-#include <google/protobuf/testing/file.h>
-#include <google/protobuf/testing/file.h>
-#include <google/protobuf/compiler/cpp/generator.h>
-#include <google/protobuf/compiler/importer.h>
-#include <google/protobuf/test_util2.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/testing/googletest.h>
+#include "google/protobuf/testing/file.h"
+#include "google/protobuf/testing/file.h"
+#include "google/protobuf/compiler/cpp/generator.h"
+#include "google/protobuf/compiler/importer.h"
+#include "google/protobuf/test_util2.h"
+#include "google/protobuf/io/zero_copy_stream_impl.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/testing/googletest.h"
#include <gtest/gtest.h>
-#include <google/protobuf/stubs/substitute.h>
-#include <google/protobuf/compiler/cpp/helpers.h>
-#include <google/protobuf/stubs/map_util.h>
-#include <google/protobuf/stubs/stl_util.h>
+#include "absl/container/flat_hash_map.h"
+#include "absl/strings/substitute.h"
+#include "google/protobuf/compiler/cpp/helpers.h"
+#include "google/protobuf/stubs/stl_util.h"
namespace google {
namespace protobuf {
namespace compiler {
namespace cpp {
-
namespace {
+std::string FindWithDefault(
+ const absl::flat_hash_map<std::string, std::string>& m,
+ const std::string& k, const std::string& v) {
+ auto it = m.find(k);
+ if (it == m.end()) return v;
+ return it->second;
+}
class MockErrorCollector : public MultiFileErrorCollector {
public:
@@ -76,7 +81,7 @@
// implements ErrorCollector ---------------------------------------
void AddError(const std::string& filename, int line, int column,
const std::string& message) override {
- strings::SubstituteAndAppend(&text_, "$0:$1:$2: $3\n", filename, line, column,
+ absl::SubstituteAndAppend(&text_, "$0:$1:$2: $3\n", filename, line, column,
message);
}
};
@@ -95,7 +100,6 @@
File::GetContents(TestUtil::TestSourceDir() + "/" + physical_filename,
&actual_contents, true))
<< physical_filename;
- CleanStringLineEndings(&actual_contents, false);
#ifdef WRITE_FILES // Define to debug mismatched files.
GOOGLE_CHECK_OK(File::SetContents("/tmp/expected.cc", expected_contents,
@@ -135,8 +139,8 @@
TEST(BootstrapTest, GeneratedFilesMatch) {
// We need a mapping from the actual file to virtual and actual path
// of the data to compare to.
- std::map<std::string, std::string> vpath_map;
- std::map<std::string, std::string> rpath_map;
+ absl::flat_hash_map<std::string, std::string> vpath_map;
+ absl::flat_hash_map<std::string, std::string> rpath_map;
rpath_map["third_party/protobuf/test_messages_proto2"] =
"net/proto2/z_generated_example/test_messages_proto2";
rpath_map["third_party/protobuf/test_messages_proto3"] =
diff --git a/src/google/protobuf/compiler/cpp/cpp_generator.h b/src/google/protobuf/compiler/cpp/cpp_generator.h
index 1716ab2..b336453 100644
--- a/src/google/protobuf/compiler/cpp/cpp_generator.h
+++ b/src/google/protobuf/compiler/cpp/cpp_generator.h
@@ -1,6 +1,6 @@
#ifndef GOOGLE_PROTOBUF_COMPILER_CPP_CPP_GENERATOR_H_
#define GOOGLE_PROTOBUF_COMPILER_CPP_CPP_GENERATOR_H_
-#include <google/protobuf/compiler/cpp/generator.h>
+#include "google/protobuf/compiler/cpp/generator.h"
#endif // GOOGLE_PROTOBUF_COMPILER_CPP_CPP_GENERATOR_H_
diff --git a/src/google/protobuf/compiler/cpp/enum.cc b/src/google/protobuf/compiler/cpp/enum.cc
index 8124369..2cd152a 100644
--- a/src/google/protobuf/compiler/cpp/enum.cc
+++ b/src/google/protobuf/compiler/cpp/enum.cc
@@ -32,16 +32,18 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/compiler/cpp/enum.h>
+#include "google/protobuf/compiler/cpp/enum.h"
#include <cstdint>
#include <limits>
#include <map>
+#include <unordered_set>
+#include <utility>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/compiler/cpp/helpers.h>
-#include <google/protobuf/compiler/cpp/names.h>
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "google/protobuf/compiler/cpp/helpers.h"
+#include "google/protobuf/compiler/cpp/names.h"
namespace google {
namespace protobuf {
@@ -49,9 +51,9 @@
namespace cpp {
namespace {
-// The GOOGLE_ARRAYSIZE constant is the max enum value plus 1. If the max enum value
-// is kint32max, GOOGLE_ARRAYSIZE will overflow. In such cases we should omit the
-// generation of the GOOGLE_ARRAYSIZE constant.
+// The ARRAYSIZE constant is the max enum value plus 1. If the max enum value
+// is kint32max, ARRAYSIZE will overflow. In such cases we should omit the
+// generation of the ARRAYSIZE constant.
bool ShouldGenerateArraySize(const EnumDescriptor* descriptor) {
int32_t max_value = descriptor->value(0)->number();
for (int i = 0; i < descriptor->value_count(); i++) {
@@ -65,13 +67,44 @@
// Returns the number of unique numeric enum values. This is less than
// descriptor->value_count() when there are aliased values.
int CountUniqueValues(const EnumDescriptor* descriptor) {
- std::set<int> values;
+ std::unordered_set<int> values;
for (int i = 0; i < descriptor->value_count(); ++i) {
values.insert(descriptor->value(i)->number());
}
return values.size();
}
+struct MinMaxEnumDescriptors {
+ const EnumValueDescriptor* min;
+ const EnumValueDescriptor* max;
+};
+MinMaxEnumDescriptors EnumLimits(const EnumDescriptor* descriptor) {
+ const EnumValueDescriptor* min_desc = descriptor->value(0);
+ const EnumValueDescriptor* max_desc = descriptor->value(0);
+
+ for (int i = 1; i < descriptor->value_count(); ++i) {
+ if (descriptor->value(i)->number() < min_desc->number()) {
+ min_desc = descriptor->value(i);
+ }
+ if (descriptor->value(i)->number() > max_desc->number()) {
+ max_desc = descriptor->value(i);
+ }
+ }
+ return {min_desc, max_desc};
+}
+
+// Assumes that HasDescriptorMethods is true.
+bool ShouldCacheDenseEnum(const EnumDescriptor* descriptor,
+ MinMaxEnumDescriptors limits) {
+ // The conditions here for what is "sparse" are not rigorously
+ // chosen. We use unsigned values in case the subtraction of min from max
+ // exceeds the bounds of int.
+ const unsigned values_range = static_cast<unsigned>(limits.max->number()) -
+ static_cast<unsigned>(limits.min->number());
+ return (values_range < 16u ||
+ values_range < static_cast<unsigned>(descriptor->value_count()) * 2u);
+}
+
} // namespace
EnumGenerator::EnumGenerator(const EnumDescriptor* descriptor,
@@ -98,9 +131,6 @@
format("enum ${1$$classname$$}$ : int {\n", descriptor_);
format.Indent();
- const EnumValueDescriptor* min_value = descriptor_->value(0);
- const EnumValueDescriptor* max_value = descriptor_->value(0);
-
for (int i = 0; i < descriptor_->value_count(); i++) {
auto format_value = format;
format_value.Set("name", EnumValueName(descriptor_->value(i)));
@@ -114,13 +144,6 @@
if (i > 0) format_value(",\n");
format_value("${1$$prefix$$name$$}$ $deprecation$= $number$",
descriptor_->value(i));
-
- if (descriptor_->value(i)->number() < min_value->number()) {
- min_value = descriptor_->value(i);
- }
- if (descriptor_->value(i)->number() > max_value->number()) {
- max_value = descriptor_->value(i);
- }
}
if (descriptor_->file()->syntax() == FileDescriptor::SYNTAX_PROTO3) {
@@ -137,13 +160,15 @@
format.Outdent();
format("\n};\n");
+ MinMaxEnumDescriptors enum_limits = EnumLimits(descriptor_);
format(
"$dllexport_decl $bool $classname$_IsValid(int value);\n"
"constexpr $classname$ ${1$$prefix$$short_name$_MIN$}$ = "
"$prefix$$2$;\n"
"constexpr $classname$ ${1$$prefix$$short_name$_MAX$}$ = "
"$prefix$$3$;\n",
- descriptor_, EnumValueName(min_value), EnumValueName(max_value));
+ descriptor_, EnumValueName(enum_limits.min),
+ EnumValueName(enum_limits.max));
if (generate_array_size_) {
format(
@@ -172,9 +197,19 @@
" ::std::is_integral<T>::value,\n"
" \"Incorrect type passed to function $classname$_Name.\");\n");
if (HasDescriptorMethods(descriptor_->file(), options_)) {
- format(
- " return ::$proto_ns$::internal::NameOfEnum(\n"
- " $classname$_descriptor(), enum_t_value);\n");
+ if (ShouldCacheDenseEnum(descriptor_, enum_limits)) {
+ // Using the NameOfEnum routine can be slow, so we create a small
+ // cache of pointers to the std::string objects that reflection
+ // stores internally. This cache is a simple contiguous array of
+ // pointers, so if the enum values are sparse, it's not worth it.
+ format(
+ " return "
+ "$classname$_Name(static_cast<$classname$>(enum_t_value));\n");
+ } else {
+ format(
+ " return ::$proto_ns$::internal::NameOfEnum(\n"
+ " $classname$_descriptor(), enum_t_value);\n");
+ }
} else {
format(
" return $classname$_Name(static_cast<$classname$>(enum_t_value));\n");
@@ -182,9 +217,18 @@
format("}\n");
if (HasDescriptorMethods(descriptor_->file(), options_)) {
+ if (ShouldCacheDenseEnum(descriptor_, enum_limits)) {
+ format(
+ "template<>\n"
+ "inline const std::string& $classname$_Name($classname$ value) {\n"
+ " return ::$proto_ns$::internal::NameOfDenseEnum\n"
+ " <$classname$_descriptor, $1$, $2$>(static_cast<int>(value));\n"
+ "}\n",
+ enum_limits.min->number(), enum_limits.max->number());
+ }
format(
"inline bool $classname$_Parse(\n"
- " ::PROTOBUF_NAMESPACE_ID::ConstStringParam name, $classname$* "
+ " ::absl::string_view name, $classname$* "
"value) "
"{\n"
" return ::$proto_ns$::internal::ParseNamedEnum<$classname$>(\n"
@@ -193,7 +237,7 @@
} else {
format(
"bool $classname$_Parse(\n"
- " ::PROTOBUF_NAMESPACE_ID::ConstStringParam name, $classname$* "
+ " ::absl::string_view name, $classname$* "
"value);\n");
}
}
@@ -261,7 +305,7 @@
"}\n");
format(
"static inline bool "
- "$nested_name$_Parse(::PROTOBUF_NAMESPACE_ID::ConstStringParam name,\n"
+ "$nested_name$_Parse(::absl::string_view name,\n"
" $resolved_name$* value) {\n"
" return $classname$_Parse(name, value);\n"
"}\n");
@@ -391,7 +435,7 @@
CountUniqueValues(descriptor_));
format(
"bool $classname$_Parse(\n"
- " ::PROTOBUF_NAMESPACE_ID::ConstStringParam name, $classname$* "
+ " ::absl::string_view name, $classname$* "
"value) "
"{\n"
" int int_value;\n"
diff --git a/src/google/protobuf/compiler/cpp/enum.h b/src/google/protobuf/compiler/cpp/enum.h
index 610d4fc..33ec310 100644
--- a/src/google/protobuf/compiler/cpp/enum.h
+++ b/src/google/protobuf/compiler/cpp/enum.h
@@ -39,8 +39,8 @@
#include <set>
#include <string>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/compiler/cpp/options.h>
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/compiler/cpp/options.h"
namespace google {
namespace protobuf {
@@ -61,6 +61,8 @@
EnumGenerator(const EnumDescriptor* descriptor,
const std::map<std::string, std::string>& vars,
const Options& options);
+ EnumGenerator(const EnumGenerator&) = delete;
+ EnumGenerator& operator=(const EnumGenerator&) = delete;
~EnumGenerator();
// Generate header code defining the enum. This code should be placed
@@ -95,7 +97,6 @@
std::map<std::string, std::string> variables_;
friend class FileGenerator;
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumGenerator);
};
} // namespace cpp
diff --git a/src/google/protobuf/compiler/cpp/enum_field.cc b/src/google/protobuf/compiler/cpp/enum_field.cc
index 8ffb699..2a0397f 100644
--- a/src/google/protobuf/compiler/cpp/enum_field.cc
+++ b/src/google/protobuf/compiler/cpp/enum_field.cc
@@ -32,13 +32,13 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/compiler/cpp/enum_field.h>
+#include "google/protobuf/compiler/cpp/enum_field.h"
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/wire_format.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/compiler/cpp/field.h>
-#include <google/protobuf/compiler/cpp/helpers.h>
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/wire_format.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "google/protobuf/compiler/cpp/field.h"
+#include "google/protobuf/compiler/cpp/helpers.h"
namespace google {
namespace protobuf {
@@ -104,7 +104,7 @@
" return _internal_$name$();\n"
"}\n"
"inline void $classname$::_internal_set_$name$($type$ value) {\n");
- if (!HasPreservingUnknownEnumSemantics(descriptor_)) {
+ if (!internal::cpp::HasPreservingUnknownEnumSemantics(descriptor_)) {
format(" assert($type$_IsValid(value));\n");
}
format(
@@ -204,7 +204,7 @@
" return _internal_$name$();\n"
"}\n"
"inline void $classname$::_internal_set_$name$($type$ value) {\n");
- if (!HasPreservingUnknownEnumSemantics(descriptor_)) {
+ if (!internal::cpp::HasPreservingUnknownEnumSemantics(descriptor_)) {
format(" assert($type$_IsValid(value));\n");
}
format(
@@ -252,7 +252,9 @@
format("::$proto_ns$::RepeatedField<int> $name$_;\n");
if (descriptor_->is_packed() &&
HasGeneratedMethods(descriptor_->file(), options_)) {
- format("mutable std::atomic<int> $cached_byte_size_name$;\n");
+ format(
+ "mutable ::$proto_ns$::internal::CachedSize "
+ "$cached_byte_size_name$;\n");
}
}
@@ -289,7 +291,7 @@
" return _internal_$name$(index);\n"
"}\n"
"inline void $classname$::set_$name$(int index, $type$ value) {\n");
- if (!HasPreservingUnknownEnumSemantics(descriptor_)) {
+ if (!internal::cpp::HasPreservingUnknownEnumSemantics(descriptor_)) {
format(" assert($type$_IsValid(value));\n");
}
format(
@@ -298,7 +300,7 @@
" // @@protoc_insertion_point(field_set:$full_name$)\n"
"}\n"
"inline void $classname$::_internal_add_$name$($type$ value) {\n");
- if (!HasPreservingUnknownEnumSemantics(descriptor_)) {
+ if (!internal::cpp::HasPreservingUnknownEnumSemantics(descriptor_)) {
format(" assert($type$_IsValid(value));\n");
}
format(
@@ -364,7 +366,7 @@
format(
"{\n"
" int byte_size = "
- "$cached_byte_size_field$.load(std::memory_order_relaxed);\n"
+ "$cached_byte_size_field$.Get();\n"
" if (byte_size > 0) {\n"
" target = stream->WriteEnumPacked(\n"
" $number$, $field$, byte_size, target);\n"
@@ -402,8 +404,7 @@
"::_pbi::WireFormatLite::Int32Size(static_cast<$int32$>(data_size));\n"
"}\n"
"int cached_size = ::_pbi::ToCachedSize(data_size);\n"
- "$cached_byte_size_field$.store(cached_size,\n"
- " std::memory_order_relaxed);\n"
+ "$cached_byte_size_field$.Set(cached_size);\n"
"total_size += data_size;\n");
} else {
format("total_size += ($tag_size$UL * count) + data_size;\n");
diff --git a/src/google/protobuf/compiler/cpp/enum_field.h b/src/google/protobuf/compiler/cpp/enum_field.h
index 61bae85..e5d476c 100644
--- a/src/google/protobuf/compiler/cpp/enum_field.h
+++ b/src/google/protobuf/compiler/cpp/enum_field.h
@@ -38,7 +38,7 @@
#include <map>
#include <string>
-#include <google/protobuf/compiler/cpp/field.h>
+#include "google/protobuf/compiler/cpp/field.h"
namespace google {
namespace protobuf {
@@ -48,6 +48,8 @@
class EnumFieldGenerator : public FieldGenerator {
public:
EnumFieldGenerator(const FieldDescriptor* descriptor, const Options& options);
+ EnumFieldGenerator(const EnumFieldGenerator&) = delete;
+ EnumFieldGenerator& operator=(const EnumFieldGenerator&) = delete;
~EnumFieldGenerator() override;
// implements FieldGenerator ---------------------------------------
@@ -66,15 +68,14 @@
io::Printer* printer) const override;
void GenerateAggregateInitializer(io::Printer* printer) const override;
void GenerateCopyAggregateInitializer(io::Printer* printer) const override;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumFieldGenerator);
};
class EnumOneofFieldGenerator : public EnumFieldGenerator {
public:
EnumOneofFieldGenerator(const FieldDescriptor* descriptor,
const Options& options);
+ EnumOneofFieldGenerator(const EnumOneofFieldGenerator&) = delete;
+ EnumOneofFieldGenerator& operator=(const EnumOneofFieldGenerator&) = delete;
~EnumOneofFieldGenerator() override;
// implements FieldGenerator ---------------------------------------
@@ -82,9 +83,6 @@
void GenerateClearingCode(io::Printer* printer) const override;
void GenerateSwappingCode(io::Printer* printer) const override;
void GenerateConstructorCode(io::Printer* printer) const override;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumOneofFieldGenerator);
};
class RepeatedEnumFieldGenerator : public FieldGenerator {
@@ -92,6 +90,9 @@
RepeatedEnumFieldGenerator(const FieldDescriptor* descriptor,
const Options& options);
~RepeatedEnumFieldGenerator() override;
+ RepeatedEnumFieldGenerator(const RepeatedEnumFieldGenerator&) = delete;
+ RepeatedEnumFieldGenerator& operator=(const RepeatedEnumFieldGenerator&) =
+ delete;
// implements FieldGenerator ---------------------------------------
void GeneratePrivateMembers(io::Printer* printer) const override;
@@ -112,9 +113,6 @@
io::Printer* printer) const override;
void GenerateAggregateInitializer(io::Printer* printer) const override;
void GenerateCopyAggregateInitializer(io::Printer* printer) const override;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedEnumFieldGenerator);
};
} // namespace cpp
diff --git a/src/google/protobuf/compiler/cpp/extension.cc b/src/google/protobuf/compiler/cpp/extension.cc
index 950ed9e..4166b08 100644
--- a/src/google/protobuf/compiler/cpp/extension.cc
+++ b/src/google/protobuf/compiler/cpp/extension.cc
@@ -32,14 +32,16 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/compiler/cpp/extension.h>
+#include "google/protobuf/compiler/cpp/extension.h"
#include <map>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/compiler/cpp/helpers.h>
-#include <google/protobuf/descriptor.pb.h>
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/str_replace.h"
+#include "google/protobuf/compiler/cpp/helpers.h"
+#include "google/protobuf/descriptor.pb.h"
namespace google {
namespace protobuf {
@@ -77,7 +79,6 @@
type_traits_.append(" >");
break;
}
- SetCommonVars(options, &variables_);
SetCommonMessageDataVariables(descriptor_->containing_type(), &variables_);
variables_["extendee"] =
QualifiedClassName(descriptor_->containing_type(), options_);
@@ -86,14 +87,14 @@
variables_["name"] = ResolveKeyword(name);
variables_["constant_name"] = FieldConstantName(descriptor_);
variables_["field_type"] =
- StrCat(static_cast<int>(descriptor_->type()));
+ absl::StrCat(static_cast<int>(descriptor_->type()));
variables_["packed"] = descriptor_->is_packed() ? "true" : "false";
std::string scope =
IsScoped() ? ClassName(descriptor_->extension_scope(), false) + "::" : "";
variables_["scope"] = scope;
variables_["scoped_name"] = ExtensionName(descriptor_);
- variables_["number"] = StrCat(descriptor_->number());
+ variables_["number"] = absl::StrCat(descriptor_->number());
bool add_verify_fn =
// Only verify msgs.
@@ -104,7 +105,7 @@
variables_["verify_fn"] =
add_verify_fn
- ? StrCat("&", FieldMessageTypeName(descriptor_, options_),
+ ? absl::StrCat("&", FieldMessageTypeName(descriptor_, options_),
"::InternalVerify")
: "nullptr";
}
@@ -159,7 +160,8 @@
// it in the header which would be annoying for other reasons. So we
// replace :: with _ in the name and declare it as a global.
default_str =
- StringReplace(variables_["scoped_name"], "::", "_", true) + "_default";
+ absl::StrReplaceAll(variables_["scoped_name"], {{"::", "_"}}) +
+ "_default";
format("const std::string $1$($2$);\n", default_str,
DefaultValue(options_, descriptor_));
} else if (descriptor_->message_type()) {
diff --git a/src/google/protobuf/compiler/cpp/extension.h b/src/google/protobuf/compiler/cpp/extension.h
index 282931f..1c0e020 100644
--- a/src/google/protobuf/compiler/cpp/extension.h
+++ b/src/google/protobuf/compiler/cpp/extension.h
@@ -38,8 +38,8 @@
#include <map>
#include <string>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/compiler/cpp/options.h>
+#include "google/protobuf/compiler/cpp/options.h"
+#include "google/protobuf/port.h"
namespace google {
namespace protobuf {
@@ -66,6 +66,8 @@
explicit ExtensionGenerator(const FieldDescriptor* descriptor,
const Options& options,
MessageSCCAnalyzer* scc_analyzer);
+ ExtensionGenerator(const ExtensionGenerator&) = delete;
+ ExtensionGenerator& operator=(const ExtensionGenerator&) = delete;
~ExtensionGenerator();
// Header stuff.
@@ -83,8 +85,6 @@
MessageSCCAnalyzer* scc_analyzer_;
std::map<std::string, std::string> variables_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ExtensionGenerator);
};
} // namespace cpp
diff --git a/src/google/protobuf/compiler/cpp/field.cc b/src/google/protobuf/compiler/cpp/field.cc
index 90d2084..bc93afa 100644
--- a/src/google/protobuf/compiler/cpp/field.cc
+++ b/src/google/protobuf/compiler/cpp/field.cc
@@ -32,25 +32,27 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/compiler/cpp/field.h>
+#include "google/protobuf/compiler/cpp/field.h"
#include <cstdint>
#include <memory>
#include <string>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/substitute.h>
-#include <google/protobuf/compiler/cpp/helpers.h>
-#include <google/protobuf/compiler/cpp/primitive_field.h>
-#include <google/protobuf/compiler/cpp/string_field.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/wire_format.h>
-#include <google/protobuf/compiler/cpp/enum_field.h>
-#include <google/protobuf/compiler/cpp/map_field.h>
-#include <google/protobuf/compiler/cpp/message_field.h>
-#include <google/protobuf/descriptor.pb.h>
+#include "absl/strings/str_cat.h"
+#include "absl/strings/string_view.h"
+#include "absl/strings/substitute.h"
+#include "google/protobuf/compiler/cpp/helpers.h"
+#include "google/protobuf/compiler/cpp/primitive_field.h"
+#include "google/protobuf/compiler/cpp/string_field.h"
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/wire_format.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "google/protobuf/compiler/cpp/enum_field.h"
+#include "google/protobuf/compiler/cpp/map_field.h"
+#include "google/protobuf/compiler/cpp/message_field.h"
+#include "google/protobuf/descriptor.pb.h"
namespace google {
namespace protobuf {
@@ -62,22 +64,22 @@
namespace {
void MaySetAnnotationVariable(const Options& options,
- StringPiece annotation_name,
- StringPiece substitute_template_prefix,
- StringPiece prepared_template,
- int field_index, StringPiece access_type,
+ absl::string_view annotation_name,
+ absl::string_view substitute_template_prefix,
+ absl::string_view prepared_template,
+ int field_index, absl::string_view access_type,
std::map<std::string, std::string>* variables) {
if (options.field_listener_options.forbidden_field_listener_events.count(
std::string(annotation_name)))
return;
- (*variables)[StrCat("annotate_", annotation_name)] = strings::Substitute(
- StrCat(substitute_template_prefix, prepared_template, ");\n"),
+ (*variables)[absl::StrCat("annotate_", annotation_name)] = absl::Substitute(
+ absl::StrCat(substitute_template_prefix, prepared_template, ");\n"),
field_index, access_type);
}
std::string GenerateTemplateForOneofString(const FieldDescriptor* descriptor,
- StringPiece proto_ns,
- StringPiece field_member) {
+ absl::string_view proto_ns,
+ absl::string_view field_member) {
std::string field_name = google::protobuf::compiler::cpp::FieldName(descriptor);
std::string field_pointer =
descriptor->options().ctype() == google::protobuf::FieldOptions::STRING
@@ -85,13 +87,13 @@
: "$0";
if (descriptor->default_value_string().empty()) {
- return strings::Substitute(StrCat("_internal_has_", field_name, "() ? ",
+ return absl::Substitute(absl::StrCat("_internal_has_", field_name, "() ? ",
field_pointer, ": nullptr"),
field_member);
}
if (descriptor->options().ctype() == google::protobuf::FieldOptions::STRING_PIECE) {
- return strings::Substitute(StrCat("_internal_has_", field_name, "() ? ",
+ return absl::Substitute(absl::StrCat("_internal_has_", field_name, "() ? ",
field_pointer, ": nullptr"),
field_member);
}
@@ -100,25 +102,25 @@
descriptor->options().ctype() == google::protobuf::FieldOptions::STRING
? "&$1.get()"
: "&$1";
- return strings::Substitute(
- StrCat("_internal_has_", field_name, "() ? ", field_pointer, " : ",
+ return absl::Substitute(
+ absl::StrCat("_internal_has_", field_name, "() ? ", field_pointer, " : ",
default_value_pointer),
field_member, MakeDefaultFieldName(descriptor));
}
std::string GenerateTemplateForSingleString(const FieldDescriptor* descriptor,
- StringPiece field_member) {
+ absl::string_view field_member) {
if (descriptor->default_value_string().empty()) {
- return StrCat("&", field_member);
+ return absl::StrCat("&", field_member);
}
if (descriptor->options().ctype() == google::protobuf::FieldOptions::STRING) {
- return strings::Substitute(
+ return absl::Substitute(
"$0.IsDefault() ? &$1.get() : $0.UnsafeGetPointer()", field_member,
MakeDefaultFieldName(descriptor));
}
- return StrCat("&", field_member);
+ return absl::StrCat("&", field_member);
}
} // namespace
@@ -134,12 +136,12 @@
"annotate_release", "annotate_set", "annotate_size",
"annotate_clear", "annotate_add_mutable",
};
- for (size_t i = 0; i < GOOGLE_ARRAYSIZE(kAccessorsAnnotations); ++i) {
+ for (size_t i = 0; i < ABSL_ARRAYSIZE(kAccessorsAnnotations); ++i) {
(*variables)[kAccessorsAnnotations[i]] = "";
}
if (options.annotate_accessor) {
- for (size_t i = 0; i < GOOGLE_ARRAYSIZE(kAccessorsAnnotations); ++i) {
- (*variables)[kAccessorsAnnotations[i]] = StrCat(
+ for (size_t i = 0; i < ABSL_ARRAYSIZE(kAccessorsAnnotations); ++i) {
+ (*variables)[kAccessorsAnnotations[i]] = absl::StrCat(
" ", FieldName(descriptor), "_AccessedNoStrip = true;\n");
}
}
@@ -153,9 +155,8 @@
std::string field_member = (*variables)["field"];
const google::protobuf::OneofDescriptor* oneof_member =
descriptor->real_containing_oneof();
- const std::string proto_ns = (*variables)["proto_ns"];
const std::string substitute_template_prefix =
- StrCat(" ", (*variables)["tracker"], ".$1<$0>(this, ");
+ absl::StrCat(" ", (*variables)["tracker"], ".$1<$0>(this, ");
std::string prepared_template;
// Flat template is needed if the prepared one is introspecting the values
@@ -166,9 +167,9 @@
if (descriptor->is_repeated() && !descriptor->is_map()) {
if (descriptor->type() != FieldDescriptor::TYPE_MESSAGE &&
descriptor->type() != FieldDescriptor::TYPE_GROUP) {
- prepared_template = strings::Substitute("&$0.Get(index)", field_member);
+ prepared_template = absl::Substitute("&$0.Get(index)", field_member);
prepared_add_template =
- strings::Substitute("&$0.Get($0.size() - 1)", field_member);
+ absl::Substitute("&$0.Get($0.size() - 1)", field_member);
} else {
prepared_template = "nullptr";
prepared_add_template = "nullptr";
@@ -181,18 +182,18 @@
} else if (descriptor->cpp_type() == FieldDescriptor::CPPTYPE_STRING) {
if (oneof_member) {
prepared_template = GenerateTemplateForOneofString(
- descriptor, (*variables)["proto_ns"], field_member);
+ descriptor, ProtobufNamespace(options), field_member);
} else {
prepared_template =
GenerateTemplateForSingleString(descriptor, field_member);
}
} else {
- prepared_template = StrCat("&", field_member);
+ prepared_template = absl::StrCat("&", field_member);
}
if (descriptor->is_repeated() && !descriptor->is_map() &&
descriptor->type() != FieldDescriptor::TYPE_MESSAGE &&
descriptor->type() != FieldDescriptor::TYPE_GROUP) {
- prepared_flat_template = StrCat("&", field_member);
+ prepared_flat_template = absl::StrCat("&", field_member);
} else {
prepared_flat_template = prepared_template;
}
@@ -235,19 +236,18 @@
void SetCommonFieldVariables(const FieldDescriptor* descriptor,
std::map<std::string, std::string>* variables,
const Options& options) {
- SetCommonVars(options, variables);
SetCommonMessageDataVariables(descriptor->containing_type(), variables);
(*variables)["ns"] = Namespace(descriptor, options);
(*variables)["name"] = FieldName(descriptor);
- (*variables)["index"] = StrCat(descriptor->index());
- (*variables)["number"] = StrCat(descriptor->number());
+ (*variables)["index"] = absl::StrCat(descriptor->index());
+ (*variables)["number"] = absl::StrCat(descriptor->number());
(*variables)["classname"] = ClassName(FieldScope(descriptor), false);
(*variables)["declared_type"] = DeclaredTypeMethodName(descriptor->type());
bool split = ShouldSplit(descriptor, options);
(*variables)["field"] = FieldMemberName(descriptor, split);
- (*variables)["tag_size"] = StrCat(
+ (*variables)["tag_size"] = absl::StrCat(
WireFormat::TagSize(descriptor->number(), descriptor->type()));
(*variables)["deprecated_attr"] = DeprecatedAttribute(options, descriptor);
@@ -267,16 +267,16 @@
}
void FieldGenerator::SetHasBitIndex(int32_t has_bit_index) {
- if (!HasHasbit(descriptor_)) {
+ if (!internal::cpp::HasHasbit(descriptor_)) {
GOOGLE_CHECK_EQ(has_bit_index, -1);
return;
}
- variables_["set_hasbit"] = StrCat(
+ variables_["set_hasbit"] = absl::StrCat(
variables_["has_bits"], "[", has_bit_index / 32, "] |= 0x",
- strings::Hex(1u << (has_bit_index % 32), strings::ZERO_PAD_8), "u;");
- variables_["clear_hasbit"] = StrCat(
+ absl::Hex(1u << (has_bit_index % 32), absl::kZeroPad8), "u;");
+ variables_["clear_hasbit"] = absl::StrCat(
variables_["has_bits"], "[", has_bit_index / 32, "] &= ~0x",
- strings::Hex(1u << (has_bit_index % 32), strings::ZERO_PAD_8), "u;");
+ absl::Hex(1u << (has_bit_index % 32), absl::kZeroPad8), "u;");
}
void FieldGenerator::SetInlinedStringIndex(int32_t inlined_string_index) {
@@ -287,16 +287,16 @@
// The first bit is the tracking bit for on demand registering ArenaDtor.
GOOGLE_CHECK_GT(inlined_string_index, 0)
<< "_inlined_string_donated_'s bit 0 is reserved for arena dtor tracking";
- variables_["inlined_string_donated"] = StrCat(
+ variables_["inlined_string_donated"] = absl::StrCat(
"(", variables_["inlined_string_donated_array"], "[",
inlined_string_index / 32, "] & 0x",
- strings::Hex(1u << (inlined_string_index % 32), strings::ZERO_PAD_8),
+ absl::Hex(1u << (inlined_string_index % 32), absl::kZeroPad8),
"u) != 0;");
variables_["donating_states_word"] =
- StrCat(variables_["inlined_string_donated_array"], "[",
+ absl::StrCat(variables_["inlined_string_donated_array"], "[",
inlined_string_index / 32, "]");
- variables_["mask_for_undonate"] = StrCat(
- "~0x", strings::Hex(1u << (inlined_string_index % 32), strings::ZERO_PAD_8),
+ variables_["mask_for_undonate"] = absl::StrCat(
+ "~0x", absl::Hex(1u << (inlined_string_index % 32), absl::kZeroPad8),
"u");
}
diff --git a/src/google/protobuf/compiler/cpp/field.h b/src/google/protobuf/compiler/cpp/field.h
index dd2a51a..b23a2a6 100644
--- a/src/google/protobuf/compiler/cpp/field.h
+++ b/src/google/protobuf/compiler/cpp/field.h
@@ -40,9 +40,9 @@
#include <memory>
#include <string>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/compiler/cpp/helpers.h>
-#include <google/protobuf/compiler/cpp/options.h>
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/compiler/cpp/helpers.h"
+#include "google/protobuf/compiler/cpp/options.h"
namespace google {
namespace protobuf {
@@ -74,6 +74,8 @@
explicit FieldGenerator(const FieldDescriptor* descriptor,
const Options& options)
: descriptor_(descriptor), options_(options) {}
+ FieldGenerator(const FieldGenerator&) = delete;
+ FieldGenerator& operator=(const FieldGenerator&) = delete;
virtual ~FieldGenerator();
virtual void GenerateSerializeWithCachedSizes(
io::Printer* printer) const final{};
@@ -150,9 +152,6 @@
// method, invoked by each of the generated constructors.
virtual void GenerateConstructorCode(io::Printer* printer) const = 0;
- // Generate initialization code for private members in the cold struct.
- virtual void GenerateCreateSplitMessageCode(io::Printer* printer) const {}
-
// Generate any code that needs to go in the class's SharedDtor() method,
// invoked by the destructor.
// Most field types don't need this, so the default implementation is empty.
@@ -222,9 +221,6 @@
const FieldDescriptor* descriptor_;
const Options& options_;
std::map<std::string, std::string> variables_;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FieldGenerator);
};
// Convenience class which constructs FieldGenerators for a Descriptor.
@@ -232,6 +228,8 @@
public:
FieldGeneratorMap(const Descriptor* descriptor, const Options& options,
MessageSCCAnalyzer* scc_analyzer);
+ FieldGeneratorMap(const FieldGeneratorMap&) = delete;
+ FieldGeneratorMap& operator=(const FieldGeneratorMap&) = delete;
~FieldGeneratorMap();
const FieldGenerator& get(const FieldDescriptor* field) const;
@@ -258,8 +256,6 @@
static FieldGenerator* MakeGenerator(const FieldDescriptor* field,
const Options& options,
MessageSCCAnalyzer* scc_analyzer);
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FieldGeneratorMap);
};
} // namespace cpp
diff --git a/src/google/protobuf/compiler/cpp/file.cc b/src/google/protobuf/compiler/cpp/file.cc
index 838e0ab..dc07ed4 100644
--- a/src/google/protobuf/compiler/cpp/file.cc
+++ b/src/google/protobuf/compiler/cpp/file.cc
@@ -32,132 +32,142 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/compiler/cpp/file.h>
+#include "google/protobuf/compiler/cpp/file.h"
#include <iostream>
#include <map>
#include <memory>
#include <set>
+#include <string>
#include <unordered_map>
#include <unordered_set>
+#include <utility>
#include <vector>
-#include <google/protobuf/compiler/scc.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/compiler/cpp/enum.h>
-#include <google/protobuf/compiler/cpp/extension.h>
-#include <google/protobuf/compiler/cpp/field.h>
-#include <google/protobuf/compiler/cpp/helpers.h>
-#include <google/protobuf/compiler/cpp/message.h>
-#include <google/protobuf/compiler/cpp/service.h>
-#include <google/protobuf/descriptor.pb.h>
+#include "google/protobuf/compiler/scc.h"
+#include "absl/container/btree_map.h"
+#include "absl/container/btree_set.h"
+#include "absl/container/flat_hash_map.h"
+#include "absl/container/flat_hash_set.h"
+#include "absl/strings/escaping.h"
+#include "absl/strings/match.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/str_format.h"
+#include "absl/strings/str_replace.h"
+#include "absl/strings/string_view.h"
+#include "absl/strings/strip.h"
+#include "google/protobuf/compiler/cpp/enum.h"
+#include "google/protobuf/compiler/cpp/extension.h"
+#include "google/protobuf/compiler/cpp/helpers.h"
+#include "google/protobuf/compiler/cpp/message.h"
+#include "google/protobuf/compiler/cpp/names.h"
+#include "google/protobuf/compiler/cpp/service.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/io/printer.h"
// Must be last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
namespace compiler {
namespace cpp {
-
namespace {
-
-// When we forward-declare things, we want to create a sorted order so our
-// output is deterministic and minimizes namespace changes.
-template <class T>
-std::string GetSortKey(const T& val) {
- return val.full_name();
-}
-
-template <>
-std::string GetSortKey<FileDescriptor>(const FileDescriptor& val) {
- return val.name();
-}
-
-template <class T>
-bool CompareSortKeys(const T* a, const T* b) {
- return GetSortKey(*a) < GetSortKey(*b);
-}
-
-template <class T>
-std::vector<const T*> Sorted(const std::unordered_set<const T*>& vals) {
- std::vector<const T*> sorted(vals.begin(), vals.end());
- std::sort(sorted.begin(), sorted.end(), CompareSortKeys<T>);
- return sorted;
+absl::flat_hash_map<std::string, std::string> FileVars(
+ const FileDescriptor* file, const Options& options) {
+ return {
+ {"filename", file->name()},
+ {"package_ns", Namespace(file, options)},
+ {"tablename", UniqueName("TableStruct", file, options)},
+ {"desc_table", DescriptorTableName(file, options)},
+ {"dllexport_decl", options.dllexport_decl},
+ {"file_level_metadata", UniqueName("file_level_metadata", file, options)},
+ {"file_level_enum_descriptors",
+ UniqueName("file_level_enum_descriptors", file, options)},
+ {"file_level_service_descriptors",
+ UniqueName("file_level_service_descriptors", file, options)},
+ };
}
// TODO(b/203101078): remove pragmas that suppresses uninitialized warnings when
// clang bug is fixed.
-inline void MuteWuninitialized(Formatter& format) {
- format(
- "#if defined(__llvm__)\n"
- " #pragma clang diagnostic push\n"
- " #pragma clang diagnostic ignored \"-Wuninitialized\"\n"
- "#endif // __llvm__\n");
+void MuteWuninitialized(io::Printer* p) {
+ p->Emit(R"(
+ #if defined(__llvm__)
+ #pragma clang diagnostic push
+ #pragma clang diagnostic ignored "-Wuninitialized"
+ #endif // __llvm__
+ )");
}
-inline void UnmuteWuninitialized(Formatter& format) {
- format(
- "#if defined(__llvm__)\n"
- " #pragma clang diagnostic pop\n"
- "#endif // __llvm__\n");
+void UnmuteWuninitialized(io::Printer* p) {
+ p->Emit(R"(
+ #if defined(__llvm__)
+ #pragma clang diagnostic pop
+ #endif // __llvm__
+ )");
}
-
} // namespace
FileGenerator::FileGenerator(const FileDescriptor* file, const Options& options)
: file_(file), options_(options), scc_analyzer_(options) {
- // These variables are the same on a file level
- SetCommonVars(options, &variables_);
- variables_["dllexport_decl"] = options.dllexport_decl;
- variables_["tablename"] = UniqueName("TableStruct", file_, options_);
- variables_["file_level_metadata"] =
- UniqueName("file_level_metadata", file_, options_);
- variables_["desc_table"] = DescriptorTableName(file_, options_);
- variables_["file_level_enum_descriptors"] =
- UniqueName("file_level_enum_descriptors", file_, options_);
- variables_["file_level_service_descriptors"] =
- UniqueName("file_level_service_descriptors", file_, options_);
- variables_["filename"] = file_->name();
- variables_["package_ns"] = Namespace(file_, options);
-
std::vector<const Descriptor*> msgs = FlattenMessagesInFile(file);
- for (int i = 0; i < msgs.size(); i++) {
- // Deleted in destructor
- MessageGenerator* msg_gen =
- new MessageGenerator(msgs[i], variables_, i, options, &scc_analyzer_);
- message_generators_.emplace_back(msg_gen);
- msg_gen->AddGenerators(&enum_generators_, &extension_generators_);
+
+ for (int i = 0; i < msgs.size(); ++i) {
+ message_generators_.push_back(absl::make_unique<MessageGenerator>(
+ msgs[i], variables_, i, options, &scc_analyzer_));
+ message_generators_.back()->AddGenerators(&enum_generators_,
+ &extension_generators_);
}
- for (int i = 0; i < file->enum_type_count(); i++) {
- enum_generators_.emplace_back(
- new EnumGenerator(file->enum_type(i), variables_, options));
+ for (int i = 0; i < file->enum_type_count(); ++i) {
+ enum_generators_.push_back(absl::make_unique<EnumGenerator>(
+ file->enum_type(i), variables_, options));
}
- for (int i = 0; i < file->service_count(); i++) {
- service_generators_.emplace_back(
- new ServiceGenerator(file->service(i), variables_, options));
+ for (int i = 0; i < file->service_count(); ++i) {
+ service_generators_.push_back(absl::make_unique<ServiceGenerator>(
+ file->service(i), variables_, options));
}
if (HasGenericServices(file_, options_)) {
- for (int i = 0; i < service_generators_.size(); i++) {
+ for (int i = 0; i < service_generators_.size(); ++i) {
service_generators_[i]->index_in_metadata_ = i;
}
}
- for (int i = 0; i < file->extension_count(); i++) {
- extension_generators_.emplace_back(
- new ExtensionGenerator(file->extension(i), options, &scc_analyzer_));
+
+ for (int i = 0; i < file->extension_count(); ++i) {
+ extension_generators_.push_back(absl::make_unique<ExtensionGenerator>(
+ file->extension(i), options, &scc_analyzer_));
}
+
for (int i = 0; i < file->weak_dependency_count(); ++i) {
weak_deps_.insert(file->weak_dependency(i));
}
}
-FileGenerator::~FileGenerator() = default;
+void FileGenerator::GenerateFile(io::Printer* p, GeneratedFileType file_type,
+ std::function<void()> cb) {
+ auto v = p->WithVars(FileVars(file_, options_));
+ auto guard = IncludeGuard(file_, file_type, options_);
+ p->Emit({{"cb", cb}, {"guard", guard}}, R"(
+ // Generated by the protocol buffer compiler. DO NOT EDIT!
+ // source: $filename$
-void FileGenerator::GenerateMacroUndefs(io::Printer* printer) {
- Formatter format(printer, variables_);
+ #ifndef $guard$
+ #define $guard$
+
+ #include <limits>
+ #include <string>
+ #include <type_traits>
+
+ $cb$;
+
+ #endif // $guard$
+ )");
+}
+
+void FileGenerator::GenerateMacroUndefs(io::Printer* p) {
// Only do this for protobuf's own types. There are some google3 protos using
// macros as field names and the generated code compiles after the macro
// expansion. Undefing these macros actually breaks such code.
@@ -165,410 +175,471 @@
file_->name() != "google/protobuf/compiler/plugin.proto") {
return;
}
- std::vector<std::string> names_to_undef;
+
std::vector<const FieldDescriptor*> fields;
ListAllFields(file_, &fields);
- for (int i = 0; i < fields.size(); i++) {
- const std::string& name = fields[i]->name();
- static const char* kMacroNames[] = {"major", "minor"};
- for (int j = 0; j < GOOGLE_ARRAYSIZE(kMacroNames); ++j) {
- if (name == kMacroNames[j]) {
- names_to_undef.push_back(name);
- break;
- }
+
+ absl::flat_hash_set<absl::string_view> all_fields;
+ for (const FieldDescriptor* field : fields) {
+ all_fields.insert(field->name());
+ }
+
+ for (absl::string_view name : {"major", "minor"}) {
+ if (!all_fields.contains(name)) {
+ continue;
}
- }
- for (int i = 0; i < names_to_undef.size(); ++i) {
- format(
- "#ifdef $1$\n"
- "#undef $1$\n"
- "#endif\n",
- names_to_undef[i]);
+
+ p->Emit({{"name", std::string(name)}}, R"(
+ #ifdef $name$
+ #undef $name$
+ #endif // $name$
+ )");
}
}
-void FileGenerator::GenerateHeader(io::Printer* printer) {
- Formatter format(printer, variables_);
- // port_def.inc must be included after all other includes.
- IncludeFile("net/proto2/public/port_def.inc", printer);
- format("#define $1$$ dllexport_decl$\n", FileDllExport(file_, options_));
- GenerateMacroUndefs(printer);
+void FileGenerator::GenerateSharedHeaderCode(io::Printer* p) {
+ p->Emit(
+ {
+ {"port_def",
+ [&] { IncludeFile("net/proto2/public/port_def.inc", p); }},
+ {"port_undef",
+ [&] { IncludeFile("net/proto2/public/port_undef.inc", p); }},
+ {"dllexport_macro", FileDllExport(file_, options_)},
+ {"undefs", [&] { GenerateMacroUndefs(p); }},
+ {"global_state_decls",
+ [&] { GenerateGlobalStateFunctionDeclarations(p); }},
+ {"fwd_decls", [&] { GenerateForwardDeclarations(p); }},
+ {"proto2_ns_enums",
+ [&] { GenerateProto2NamespaceEnumSpecializations(p); }},
+ {"main_decls",
+ [&] {
+ NamespaceOpener ns(Namespace(file_, options_), p);
+ p->Emit(
+ {
+ {"enums", [&] { GenerateEnumDefinitions(p); }},
+ {"messages", [&] { GenerateMessageDefinitions(p); }},
+ {"services", [&] { GenerateServiceDefinitions(p); }},
+ {"extensions", [&] { GenerateExtensionIdentifiers(p); }},
+ {"inline_fns",
+ [&] { GenerateInlineFunctionDefinitions(p); }},
+ },
+ R"(
+ $enums$
- // For Any support with lite protos, we need to friend AnyMetadata, so we
- // forward-declare it here.
- format(
- "PROTOBUF_NAMESPACE_OPEN\n"
- "namespace internal {\n"
- "class AnyMetadata;\n"
- "} // namespace internal\n"
- "PROTOBUF_NAMESPACE_CLOSE\n");
+ $hrule_thick$
- GenerateGlobalStateFunctionDeclarations(printer);
+ $messages$
- GenerateForwardDeclarations(printer);
+ $hrule_thick$
- {
- NamespaceOpener ns(Namespace(file_, options_), format);
+ $services$
- format("\n");
+ $extensions$
- GenerateEnumDefinitions(printer);
+ $hrule_thick$
- format(kThickSeparator);
- format("\n");
+ $inline_fns$
- GenerateMessageDefinitions(printer);
+ // @@protoc_insertion_point(namespace_scope)
+ )");
+ }},
+ },
+ R"(
+ // Must be included last.
+ $port_def$
- format("\n");
- format(kThickSeparator);
- format("\n");
+ #define $dllexport_macro$$ dllexport_decl$
+ $undefs$
- GenerateServiceDefinitions(printer);
+ PROTOBUF_NAMESPACE_OPEN
+ namespace internal {
+ class AnyMetadata;
+ } // namespace internal
+ PROTOBUF_NAMESPACE_CLOSE
- GenerateExtensionIdentifiers(printer);
+ $global_state_decls$;
+ $fwd_decls$
- format("\n");
- format(kThickSeparator);
- format("\n");
+ $main_decls$
- GenerateInlineFunctionDefinitions(printer);
+ $proto2_ns_enums$
- format(
- "\n"
- "// @@protoc_insertion_point(namespace_scope)\n"
- "\n");
- }
+ // @@protoc_insertion_point(global_scope)
- // We need to specialize some templates in the ::google::protobuf namespace:
- GenerateProto2NamespaceEnumSpecializations(printer);
-
- format(
- "\n"
- "// @@protoc_insertion_point(global_scope)\n"
- "\n");
- IncludeFile("net/proto2/public/port_undef.inc", printer);
+ $port_undef$
+ )");
}
-void FileGenerator::GenerateProtoHeader(io::Printer* printer,
- const std::string& info_path) {
- Formatter format(printer, variables_);
+void FileGenerator::GenerateProtoHeader(io::Printer* p,
+ absl::string_view info_path) {
if (!options_.proto_h) {
return;
}
- GenerateTopHeaderGuard(printer, false);
-
- if (!options_.opensource_runtime) {
- format(
- "#ifdef SWIG\n"
- "#error \"Do not SWIG-wrap protobufs.\"\n"
- "#endif // SWIG\n"
- "\n");
- }
-
- if (IsBootstrapProto(options_, file_)) {
- format("// IWYU pragma: private, include \"$1$.proto.h\"\n\n",
- StripProto(file_->name()));
- }
-
- GenerateLibraryIncludes(printer);
-
- for (int i = 0; i < file_->public_dependency_count(); i++) {
- const FileDescriptor* dep = file_->public_dependency(i);
- format("#include \"$1$.proto.h\"\n", StripProto(dep->name()));
- }
-
- format("// @@protoc_insertion_point(includes)\n");
-
- GenerateMetadataPragma(printer, info_path);
-
- GenerateHeader(printer);
-
- GenerateBottomHeaderGuard(printer, false);
-}
-
-void FileGenerator::GeneratePBHeader(io::Printer* printer,
- const std::string& info_path) {
- Formatter format(printer, variables_);
- GenerateTopHeaderGuard(printer, true);
-
- if (options_.proto_h) {
- std::string target_basename = StripProto(file_->name());
+ GenerateFile(p, GeneratedFileType::kProtoH, [&] {
if (!options_.opensource_runtime) {
- GetBootstrapBasename(options_, target_basename, &target_basename);
+ p->Emit(R"(
+ #ifdef SWIG
+ #error "Do not SWIG-wrap protobufs."
+ #endif // SWIG
+ )");
}
- format("#include \"$1$.proto.h\" // IWYU pragma: export\n",
- target_basename);
- } else {
- GenerateLibraryIncludes(printer);
- }
-
- if (options_.transitive_pb_h) {
- GenerateDependencyIncludes(printer);
- }
-
- // This is unfortunately necessary for some plugins. I don't see why we
- // need two of the same insertion points.
- // TODO(gerbens) remove this.
- format("// @@protoc_insertion_point(includes)\n");
-
- GenerateMetadataPragma(printer, info_path);
-
- if (!options_.proto_h) {
- GenerateHeader(printer);
- } else {
- {
- NamespaceOpener ns(Namespace(file_, options_), format);
- format(
- "\n"
- "// @@protoc_insertion_point(namespace_scope)\n");
+ if (IsBootstrapProto(options_, file_)) {
+ p->Emit({{"name", StripProto(file_->name())}}, R"cc(
+ // IWYU pragma: private, include "$name$.proto.h"
+ )cc");
}
- format(
- "\n"
- "// @@protoc_insertion_point(global_scope)\n"
- "\n");
- }
- GenerateBottomHeaderGuard(printer, true);
+ p->Emit(
+ {
+ {"library_includes", [&] { GenerateLibraryIncludes(p); }},
+ {"proto_includes",
+ [&] {
+ for (int i = 0; i < file_->public_dependency_count(); ++i) {
+ const FileDescriptor* dep = file_->public_dependency(i);
+ p->Emit({{"name", StripProto(dep->name())}}, R"(
+ #include "$name$.proto.h"
+ )");
+ }
+ }},
+ {"metadata_pragma", [&] { GenerateMetadataPragma(p, info_path); }},
+ {"header_main", [&] { GenerateSharedHeaderCode(p); }},
+ },
+ R"cc(
+ $library_includes$;
+ $proto_includes$;
+ // @@protoc_insertion_point(includes)
+
+ $metadata_pragma$;
+ $header_main$;
+ )cc");
+ });
}
-void FileGenerator::DoIncludeFile(const std::string& google3_name,
- bool do_export, io::Printer* printer) {
- Formatter format(printer, variables_);
- const std::string prefix = "net/proto2/";
- GOOGLE_CHECK(google3_name.find(prefix) == 0) << google3_name;
+void FileGenerator::GeneratePBHeader(io::Printer* p,
+ absl::string_view info_path) {
+ GenerateFile(p, GeneratedFileType::kPbH, [&] {
+ p->Emit(
+ {
+ {"library_includes",
+ [&] {
+ if (options_.proto_h) {
+ std::string target_basename = StripProto(file_->name());
+ if (!options_.opensource_runtime) {
+ GetBootstrapBasename(options_, target_basename,
+ &target_basename);
+ }
+ p->Emit({{"name", target_basename}}, R"(
+ #include "$name$.proto.h" // IWYU pragma: export
+ )");
+ } else {
+ GenerateLibraryIncludes(p);
+ }
+ }},
+ {"proto_includes",
+ [&] {
+ if (options_.transitive_pb_h) {
+ GenerateDependencyIncludes(p);
+ }
+ }},
+ {"metadata_pragma", [&] { GenerateMetadataPragma(p, info_path); }},
+ {"header_main",
+ [&] {
+ if (!options_.proto_h) {
+ GenerateSharedHeaderCode(p);
+ return;
+ }
+
+ {
+ NamespaceOpener ns(Namespace(file_, options_), p);
+ p->Emit(R"cc(
+
+ // @@protoc_insertion_point(namespace_scope)
+ )cc");
+ }
+ p->Emit(R"cc(
+
+ // @@protoc_insertion_point(global_scope)
+ )cc");
+ }},
+ },
+ R"cc(
+ $library_includes$;
+ $proto_includes$;
+ // @@protoc_insertion_point(includes)
+
+ $metadata_pragma$;
+ $header_main$;
+ )cc");
+ });
+}
+
+void FileGenerator::DoIncludeFile(absl::string_view google3_name,
+ bool do_export, io::Printer* p) {
+ absl::string_view prefix = "net/proto2/";
+ GOOGLE_CHECK(absl::StartsWith(google3_name, prefix)) << google3_name;
+
+ auto v = p->WithVars(
+ {{"export_suffix", do_export ? "// IWYU pragma: export" : ""}});
if (options_.opensource_runtime) {
- std::string path = google3_name.substr(prefix.size());
+ absl::ConsumePrefix(&google3_name, prefix);
+ std::string path(google3_name);
path = StringReplace(path, "internal/", "", false);
path = StringReplace(path, "proto/", "", false);
path = StringReplace(path, "public/", "", false);
+
if (options_.runtime_include_base.empty()) {
- format("#include <google/protobuf/$1$>", path);
+ p->Emit({{"path", path}}, R"(
+ #include "google/protobuf/$path$"$ export_suffix$
+ )");
} else {
- format("#include \"$1$google/protobuf/$2$\"",
- options_.runtime_include_base, path);
+ p->Emit({{"base", options_.runtime_include_base}, {"path", path}}, R"(
+ #include "$base$google/protobuf/$path$"$ export_suffix$
+ )");
}
} else {
- std::string path = google3_name;
+ std::string path(google3_name);
// The bootstrapped proto generated code needs to use the
// third_party/protobuf header paths to avoid circular dependencies.
if (options_.bootstrap) {
- path = StringReplace(google3_name, "net/proto2/public",
- "third_party/protobuf", false);
+ path = StringReplace(path, "net/proto2/public", "third_party/protobuf",
+ false);
}
- format("#include \"$1$\"", path);
- }
- if (do_export) {
- format(" // IWYU pragma: export");
+ p->Emit({{"path", path}}, R"(
+ #include "$path$"$ export_suffix$
+ )");
}
-
- format("\n");
}
-std::string FileGenerator::CreateHeaderInclude(const std::string& basename,
+std::string FileGenerator::CreateHeaderInclude(absl::string_view basename,
const FileDescriptor* file) {
- bool use_system_include = false;
- std::string name = basename;
-
- if (options_.opensource_runtime) {
- if (IsWellKnownMessage(file)) {
- if (options_.runtime_include_base.empty()) {
- use_system_include = true;
- } else {
- name = options_.runtime_include_base + basename;
- }
- }
+ if (options_.opensource_runtime && IsWellKnownMessage(file) &&
+ !options_.runtime_include_base.empty()) {
+ return absl::StrCat("\"", options_.runtime_include_base, basename, "\"");
}
- std::string left = "\"";
- std::string right = "\"";
- if (use_system_include) {
- left = "<";
- right = ">";
- }
- return left + name + right;
+ return absl::StrCat("\"", basename, "\"");
}
-void FileGenerator::GenerateSourceIncludes(io::Printer* printer) {
- Formatter format(printer, variables_);
+void FileGenerator::GenerateSourceIncludes(io::Printer* p) {
std::string target_basename = StripProto(file_->name());
if (!options_.opensource_runtime) {
GetBootstrapBasename(options_, target_basename, &target_basename);
}
- target_basename += options_.proto_h ? ".proto.h" : ".pb.h";
- format(
- "// Generated by the protocol buffer compiler. DO NOT EDIT!\n"
- "// source: $filename$\n"
- "\n"
- "#include $1$\n"
- "\n"
- "#include <algorithm>\n" // for swap()
- "\n",
- CreateHeaderInclude(target_basename, file_));
- IncludeFile("net/proto2/io/public/coded_stream.h", printer);
+ absl::StrAppend(&target_basename, options_.proto_h ? ".proto.h" : ".pb.h");
+ p->Emit({{"h_include", CreateHeaderInclude(target_basename, file_)}},
+ R"(
+ // Generated by the protocol buffer compiler. DO NOT EDIT!
+ // source: $filename$
+
+ #include $h_include$
+
+ #include <algorithm>
+ )");
+
+ IncludeFile("net/proto2/io/public/coded_stream.h", p);
// TODO(gerbens) This is to include parse_context.h, we need a better way
- IncludeFile("net/proto2/public/extension_set.h", printer);
- IncludeFile("net/proto2/public/wire_format_lite.h", printer);
+ IncludeFile("net/proto2/public/extension_set.h", p);
+ IncludeFile("net/proto2/public/wire_format_lite.h", p);
// Unknown fields implementation in lite mode uses StringOutputStream
if (!UseUnknownFieldSet(file_, options_) && !message_generators_.empty()) {
- IncludeFile("net/proto2/io/public/zero_copy_stream_impl_lite.h", printer);
+ IncludeFile("net/proto2/io/public/zero_copy_stream_impl_lite.h", p);
}
if (HasDescriptorMethods(file_, options_)) {
- IncludeFile("net/proto2/public/descriptor.h", printer);
- IncludeFile("net/proto2/public/generated_message_reflection.h", printer);
- IncludeFile("net/proto2/public/reflection_ops.h", printer);
- IncludeFile("net/proto2/public/wire_format.h", printer);
+ IncludeFile("net/proto2/public/descriptor.h", p);
+ IncludeFile("net/proto2/public/generated_message_reflection.h", p);
+ IncludeFile("net/proto2/public/reflection_ops.h", p);
+ IncludeFile("net/proto2/public/wire_format.h", p);
}
if (HasGeneratedMethods(file_, options_) &&
options_.tctable_mode != Options::kTCTableNever) {
- IncludeFile("net/proto2/public/generated_message_tctable_impl.h", printer);
+ IncludeFile("net/proto2/public/generated_message_tctable_impl.h", p);
}
if (options_.proto_h) {
// Use the smaller .proto.h files.
- for (int i = 0; i < file_->dependency_count(); i++) {
+ for (int i = 0; i < file_->dependency_count(); ++i) {
const FileDescriptor* dep = file_->dependency(i);
- // Do not import weak deps.
- if (!options_.opensource_runtime && IsDepWeak(dep)) continue;
+
+ if (!options_.opensource_runtime &&
+ IsDepWeak(dep)) { // Do not import weak deps.
+ continue;
+ }
+
std::string basename = StripProto(dep->name());
if (IsBootstrapProto(options_, file_)) {
GetBootstrapBasename(options_, basename, &basename);
}
- format("#include \"$1$.proto.h\"\n", basename);
+ p->Emit({{"name", basename}}, R"(
+ #include "$name$.proto.h"
+ )");
}
}
+
if (HasCordFields(file_, options_)) {
- format(
- "#include \"third_party/absl/strings/internal/string_constant.h\"\n");
+ p->Emit(R"(
+ #include "third_party/absl/strings/internal/string_constant.h"
+ )");
}
- format("// @@protoc_insertion_point(includes)\n");
- IncludeFile("net/proto2/public/port_def.inc", printer);
+ p->Emit(R"cc(
+ // @@protoc_insertion_point(includes)
+
+ // Must be included last.
+ )cc");
+ IncludeFile("net/proto2/public/port_def.inc", p);
}
-void FileGenerator::GenerateSourcePrelude(io::Printer* printer) {
- Formatter format(printer, variables_);
-
+void FileGenerator::GenerateSourcePrelude(io::Printer* p) {
// For MSVC builds, we use #pragma init_seg to move the initialization of our
// libraries to happen before the user code.
// This worksaround the fact that MSVC does not do constant initializers when
// required by the standard.
- format("\nPROTOBUF_PRAGMA_INIT_SEG\n");
+ p->Emit(R"cc(
+ PROTOBUF_PRAGMA_INIT_SEG
+ namespace _pb = ::$proto_ns$;
+ namespace _pbi = ::$proto_ns$::internal;
+ )cc");
- // Generate convenience aliases.
- format(
- "\n"
- "namespace _pb = ::$1$;\n"
- "namespace _pbi = _pb::internal;\n",
- ProtobufNamespace(options_));
if (HasGeneratedMethods(file_, options_) &&
options_.tctable_mode != Options::kTCTableNever) {
- format("namespace _fl = _pbi::field_layout;\n");
+ p->Emit(R"cc(
+ namespace _fl = ::$proto_ns$::internal::field_layout;
+ )cc");
}
- format("\n");
}
-void FileGenerator::GenerateSourceDefaultInstance(int idx,
- io::Printer* printer) {
- Formatter format(printer, variables_);
+void FileGenerator::GenerateSourceDefaultInstance(int idx, io::Printer* p) {
MessageGenerator* generator = message_generators_[idx].get();
+
// Generate the split instance first because it's needed in the constexpr
// constructor.
if (ShouldSplit(generator->descriptor_, options_)) {
// Use a union to disable the destructor of the _instance member.
// We can constant initialize, but the object will still have a non-trivial
// destructor that we need to elide.
- format(
- "struct $1$ {\n"
- " PROTOBUF_CONSTEXPR $1$()\n"
- " : _instance{",
- DefaultInstanceType(generator->descriptor_, options_,
- /*split=*/true));
- generator->GenerateInitDefaultSplitInstance(printer);
- format(
- "} {}\n"
- " ~$1$() {}\n"
- " union {\n"
- " $2$ _instance;\n"
- " };\n"
- "};\n",
- DefaultInstanceType(generator->descriptor_, options_, /*split=*/true),
- StrCat(generator->classname_, "::Impl_::Split"));
+ //
// NO_DESTROY is not necessary for correctness. The empty destructor is
// enough. However, the empty destructor fails to be elided in some
// configurations (like non-opt or with certain sanitizers). NO_DESTROY is
// there just to improve performance and binary size in these builds.
- format(
- "PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT "
- "PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 $1$ $2$;\n",
- DefaultInstanceType(generator->descriptor_, options_, /*split=*/true),
- DefaultInstanceName(generator->descriptor_, options_, /*split=*/true));
+ p->Emit(
+ {
+ {"type", DefaultInstanceType(generator->descriptor_, options_,
+ /*split=*/true)},
+ {"name", DefaultInstanceName(generator->descriptor_, options_,
+ /*split=*/true)},
+ {"default",
+ [&] { generator->GenerateInitDefaultSplitInstance(p); }},
+ {"class", absl::StrCat(generator->classname_, "::Impl_::Split")},
+ },
+ R"cc(
+ struct $type$ {
+ PROTOBUF_CONSTEXPR $type$() : _instance{$default$} {}
+ union {
+ $class$ _instance;
+ };
+ };
+
+ PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 const $type$ $name$;
+ )cc");
}
- generator->GenerateConstexprConstructor(printer);
- format(
- "struct $1$ {\n"
- " PROTOBUF_CONSTEXPR $1$()\n"
- " : _instance(::_pbi::ConstantInitialized{}) {}\n"
- " ~$1$() {}\n"
- " union {\n"
- " $2$ _instance;\n"
- " };\n"
- "};\n",
- DefaultInstanceType(generator->descriptor_, options_),
- generator->classname_);
- format(
- "PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT "
- "PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 $1$ $2$;\n",
- DefaultInstanceType(generator->descriptor_, options_),
- DefaultInstanceName(generator->descriptor_, options_));
+ generator->GenerateConstexprConstructor(p);
- for (int i = 0; i < generator->descriptor_->field_count(); i++) {
+ p->Emit(
+ {
+ {"type", DefaultInstanceType(generator->descriptor_, options_)},
+ {"name", DefaultInstanceName(generator->descriptor_, options_)},
+ {"default", [&] { generator->GenerateInitDefaultSplitInstance(p); }},
+ {"class", generator->classname_},
+ },
+ R"cc(
+ struct $type$ {
+ PROTOBUF_CONSTEXPR $type$() : _instance(::_pbi::ConstantInitialized{}) {}
+ ~$type$() {}
+ union {
+ $class$ _instance;
+ };
+ };
+
+ PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 $type$ $name$;
+ )cc");
+
+ for (int i = 0; i < generator->descriptor_->field_count(); ++i) {
const FieldDescriptor* field = generator->descriptor_->field(i);
- if (IsStringInlined(field, options_)) {
- // Force the initialization of the inlined string in the default instance.
- format(
- "PROTOBUF_ATTRIBUTE_INIT_PRIORITY2 std::true_type "
- "$1$::Impl_::_init_inline_$2$_ = "
- "($3$._instance.$4$.Init(), std::true_type{});\n",
- ClassName(generator->descriptor_), FieldName(field),
- DefaultInstanceName(generator->descriptor_, options_),
- FieldMemberName(field, ShouldSplit(field, options_)));
+ if (!IsStringInlined(field, options_)) {
+ continue;
}
+
+ // Force the initialization of the inlined string in the default instance.
+ p->Emit(
+ {
+ {"class", ClassName(generator->descriptor_)},
+ {"field", FieldName(field)},
+ {"default", DefaultInstanceName(generator->descriptor_, options_)},
+ {"member", FieldMemberName(field, ShouldSplit(field, options_))},
+ },
+ R"cc(
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY2 std::true_type
+ $class$::Impl_::_init_inline_$field$_ =
+ ($default$._instance.$member$.Init(), std::true_type{});
+ )cc");
}
if (options_.lite_implicit_weak_fields) {
- format(
- "PROTOBUF_CONSTINIT const void* $1$ =\n"
- " &$2$;\n",
- DefaultInstancePtr(generator->descriptor_, options_),
- DefaultInstanceName(generator->descriptor_, options_));
+ p->Emit(
+ {
+ {"ptr", DefaultInstancePtr(generator->descriptor_, options_)},
+ {"name", DefaultInstanceName(generator->descriptor_, options_)},
+ },
+ R"cc(
+ PROTOBUF_CONSTINIT const void* $ptr$ = &$name$;
+ )cc");
}
}
// A list of things defined in one .pb.cc file that we need to reference from
// another .pb.cc file.
struct FileGenerator::CrossFileReferences {
+ // When we forward-declare things, we want to create a sorted order so our
+ // output is deterministic and minimizes namespace changes.
+ struct DescCompare {
+ template <typename T>
+ bool operator()(const T* const& a, const T* const& b) const {
+ return a->full_name() < b->full_name();
+ }
+
+ bool operator()(const FileDescriptor* const& a,
+ const FileDescriptor* const& b) const {
+ return a->name() < b->name();
+ }
+ };
+
// Populated if we are referencing from messages or files.
- std::unordered_set<const Descriptor*> weak_default_instances;
+ absl::btree_set<const Descriptor*, DescCompare> weak_default_instances;
// Only if we are referencing from files.
- std::unordered_set<const FileDescriptor*> strong_reflection_files;
- std::unordered_set<const FileDescriptor*> weak_reflection_files;
+ absl::btree_set<const FileDescriptor*, DescCompare> strong_reflection_files;
+ absl::btree_set<const FileDescriptor*, DescCompare> weak_reflection_files;
};
void FileGenerator::GetCrossFileReferencesForField(const FieldDescriptor* field,
CrossFileReferences* refs) {
const Descriptor* msg = field->message_type();
- if (msg == nullptr) return;
+ if (msg == nullptr) {
+ return;
+ }
if (IsImplicitWeakField(field, options_, &scc_analyzer_) ||
IsWeak(field, options_)) {
@@ -582,10 +653,13 @@
GetCrossFileReferencesForField(field, refs);
});
- if (!HasDescriptorMethods(file, options_)) return;
+ if (!HasDescriptorMethods(file, options_)) {
+ return;
+ }
- for (int i = 0; i < file->dependency_count(); i++) {
+ for (int i = 0; i < file->dependency_count(); ++i) {
const FileDescriptor* dep = file->dependency(i);
+
if (IsDepWeak(dep)) {
refs->weak_reflection_files.insert(dep);
} else {
@@ -596,119 +670,128 @@
// Generates references to variables defined in other files.
void FileGenerator::GenerateInternalForwardDeclarations(
- const CrossFileReferences& refs, io::Printer* printer) {
- Formatter format(printer, variables_);
-
+ const CrossFileReferences& refs, io::Printer* p) {
{
- NamespaceOpener ns(format);
- for (auto instance : Sorted(refs.weak_default_instances)) {
+ NamespaceOpener ns(p);
+ for (auto instance : refs.weak_default_instances) {
ns.ChangeTo(Namespace(instance, options_));
+
if (options_.lite_implicit_weak_fields) {
- format(
- "PROTOBUF_CONSTINIT __attribute__((weak)) const void* $1$ =\n"
- " &::_pbi::implicit_weak_message_default_instance;\n",
- DefaultInstancePtr(instance, options_));
+ p->Emit({{"ptr", DefaultInstancePtr(instance, options_)}}, R"cc(
+ PROTOBUF_CONSTINIT __attribute__((weak)) const void* $ptr$ =
+ &::_pbi::implicit_weak_message_default_instance;
+ )cc");
} else {
- format("extern __attribute__((weak)) $1$ $2$;\n",
- DefaultInstanceType(instance, options_),
- DefaultInstanceName(instance, options_));
+ p->Emit({{"type", DefaultInstanceType(instance, options_)},
+ {"name", DefaultInstanceName(instance, options_)}},
+ R"cc(
+ extern __attribute__((weak)) $type$ $name$;
+ )cc");
}
}
}
- for (auto file : Sorted(refs.weak_reflection_files)) {
- format(
- "extern __attribute__((weak)) const ::_pbi::DescriptorTable $1$;\n",
- DescriptorTableName(file, options_));
+ for (auto file : refs.weak_reflection_files) {
+ p->Emit({{"table", DescriptorTableName(file, options_)}}, R"cc(
+ extern __attribute__((weak)) const ::_pbi::DescriptorTable $table$;
+ )cc");
}
}
-void FileGenerator::GenerateSourceForMessage(int idx, io::Printer* printer) {
- Formatter format(printer, variables_);
- GenerateSourceIncludes(printer);
- GenerateSourcePrelude(printer);
+void FileGenerator::GenerateSourceForMessage(int idx, io::Printer* p) {
+ auto v = p->WithVars(FileVars(file_, options_));
- if (IsAnyMessage(file_, options_)) MuteWuninitialized(format);
+ GenerateSourceIncludes(p);
+ GenerateSourcePrelude(p);
+
+ if (IsAnyMessage(file_, options_)) {
+ MuteWuninitialized(p);
+ }
CrossFileReferences refs;
ForEachField(message_generators_[idx]->descriptor_,
[this, &refs](const FieldDescriptor* field) {
GetCrossFileReferencesForField(field, &refs);
});
- GenerateInternalForwardDeclarations(refs, printer);
- { // package namespace
- NamespaceOpener ns(Namespace(file_, options_), format);
-
- // Define default instances
- GenerateSourceDefaultInstance(idx, printer);
-
- // Generate classes.
- format("\n");
- message_generators_[idx]->GenerateClassMethods(printer);
-
- format(
- "\n"
- "// @@protoc_insertion_point(namespace_scope)\n");
- } // end package namespace
+ GenerateInternalForwardDeclarations(refs, p);
{
- NamespaceOpener proto_ns(ProtobufNamespace(options_), format);
- message_generators_[idx]->GenerateSourceInProto2Namespace(printer);
+ NamespaceOpener ns(Namespace(file_, options_), p);
+ p->Emit(
+ {
+ {"defaults", [&] { GenerateSourceDefaultInstance(idx, p); }},
+ {"class_methods",
+ [&] { message_generators_[idx]->GenerateClassMethods(p); }},
+ },
+ R"cc(
+ $defaults$;
+
+ $class_methods$;
+
+ // @@protoc_insertion_point(namespace_scope)
+ )cc");
}
- if (IsAnyMessage(file_, options_)) UnmuteWuninitialized(format);
+ {
+ NamespaceOpener proto_ns(ProtobufNamespace(options_), p);
+ message_generators_[idx]->GenerateSourceInProto2Namespace(p);
+ }
- format(
- "\n"
- "// @@protoc_insertion_point(global_scope)\n");
+ if (IsAnyMessage(file_, options_)) {
+ UnmuteWuninitialized(p);
+ }
+
+ p->Emit(R"cc(
+ // @@protoc_insertion_point(global_scope)
+ )cc");
}
-void FileGenerator::GenerateSourceForExtension(int idx, io::Printer* printer) {
- Formatter format(printer, variables_);
- GenerateSourceIncludes(printer);
- GenerateSourcePrelude(printer);
- NamespaceOpener ns(Namespace(file_, options_), format);
- extension_generators_[idx]->GenerateDefinition(printer);
+void FileGenerator::GenerateSourceForExtension(int idx, io::Printer* p) {
+ auto v = p->WithVars(FileVars(file_, options_));
+ GenerateSourceIncludes(p);
+ GenerateSourcePrelude(p);
+
+ NamespaceOpener ns(Namespace(file_, options_), p);
+ extension_generators_[idx]->GenerateDefinition(p);
}
-void FileGenerator::GenerateGlobalSource(io::Printer* printer) {
- Formatter format(printer, variables_);
- GenerateSourceIncludes(printer);
- GenerateSourcePrelude(printer);
+void FileGenerator::GenerateGlobalSource(io::Printer* p) {
+ auto v = p->WithVars(FileVars(file_, options_));
+ GenerateSourceIncludes(p);
+ GenerateSourcePrelude(p);
{
// Define the code to initialize reflection. This code uses a global
// constructor to register reflection data with the runtime pre-main.
if (HasDescriptorMethods(file_, options_)) {
- GenerateReflectionInitializationCode(printer);
+ GenerateReflectionInitializationCode(p);
}
}
- NamespaceOpener ns(Namespace(file_, options_), format);
-
- // Generate enums.
- for (int i = 0; i < enum_generators_.size(); i++) {
- enum_generators_[i]->GenerateMethods(i, printer);
+ NamespaceOpener ns(Namespace(file_, options_), p);
+ for (int i = 0; i < enum_generators_.size(); ++i) {
+ enum_generators_[i]->GenerateMethods(i, p);
}
}
-void FileGenerator::GenerateSource(io::Printer* printer) {
- Formatter format(printer, variables_);
- GenerateSourceIncludes(printer);
- GenerateSourcePrelude(printer);
+void FileGenerator::GenerateSource(io::Printer* p) {
+ auto v = p->WithVars(FileVars(file_, options_));
+
+ GenerateSourceIncludes(p);
+ GenerateSourcePrelude(p);
CrossFileReferences refs;
GetCrossFileReferencesForFile(file_, &refs);
- GenerateInternalForwardDeclarations(refs, printer);
+ GenerateInternalForwardDeclarations(refs, p);
- if (IsAnyMessage(file_, options_)) MuteWuninitialized(format);
+ if (IsAnyMessage(file_, options_)) {
+ MuteWuninitialized(p);
+ }
{
- NamespaceOpener ns(Namespace(file_, options_), format);
-
- // Define default instances
- for (int i = 0; i < message_generators_.size(); i++) {
- GenerateSourceDefaultInstance(i, printer);
+ NamespaceOpener ns(Namespace(file_, options_), p);
+ for (int i = 0; i < message_generators_.size(); ++i) {
+ GenerateSourceDefaultInstance(i, p);
}
}
@@ -716,144 +799,155 @@
if (HasDescriptorMethods(file_, options_)) {
// Define the code to initialize reflection. This code uses a global
// constructor to register reflection data with the runtime pre-main.
- GenerateReflectionInitializationCode(printer);
+ GenerateReflectionInitializationCode(p);
}
}
{
- NamespaceOpener ns(Namespace(file_, options_), format);
+ NamespaceOpener ns(Namespace(file_, options_), p);
// Actually implement the protos
// Generate enums.
- for (int i = 0; i < enum_generators_.size(); i++) {
- enum_generators_[i]->GenerateMethods(i, printer);
+ for (int i = 0; i < enum_generators_.size(); ++i) {
+ enum_generators_[i]->GenerateMethods(i, p);
}
// Generate classes.
- for (int i = 0; i < message_generators_.size(); i++) {
- format("\n");
- format(kThickSeparator);
- format("\n");
- message_generators_[i]->GenerateClassMethods(printer);
+ for (int i = 0; i < message_generators_.size(); ++i) {
+ p->Emit(R"(
+ $hrule_thick$
+ )");
+ message_generators_[i]->GenerateClassMethods(p);
}
if (HasGenericServices(file_, options_)) {
// Generate services.
- for (int i = 0; i < service_generators_.size(); i++) {
- if (i == 0) format("\n");
- format(kThickSeparator);
- format("\n");
- service_generators_[i]->GenerateImplementation(printer);
+ for (int i = 0; i < service_generators_.size(); ++i) {
+ p->Emit(R"(
+ $hrule_thick$
+ )");
+ service_generators_[i]->GenerateImplementation(p);
}
}
// Define extensions.
- for (int i = 0; i < extension_generators_.size(); i++) {
- extension_generators_[i]->GenerateDefinition(printer);
+ for (int i = 0; i < extension_generators_.size(); ++i) {
+ extension_generators_[i]->GenerateDefinition(p);
}
- format(
- "\n"
- "// @@protoc_insertion_point(namespace_scope)\n");
+ p->Emit(R"cc(
+ // @@protoc_insertion_point(namespace_scope)
+ )cc");
}
{
- NamespaceOpener proto_ns(ProtobufNamespace(options_), format);
- for (int i = 0; i < message_generators_.size(); i++) {
- message_generators_[i]->GenerateSourceInProto2Namespace(printer);
+ NamespaceOpener proto_ns(ProtobufNamespace(options_), p);
+ for (int i = 0; i < message_generators_.size(); ++i) {
+ message_generators_[i]->GenerateSourceInProto2Namespace(p);
}
}
- format(
- "\n"
- "// @@protoc_insertion_point(global_scope)\n");
+ p->Emit(R"cc(
+ // @@protoc_insertion_point(global_scope)
+ )cc");
- if (IsAnyMessage(file_, options_)) UnmuteWuninitialized(format);
+ if (IsAnyMessage(file_, options_)) {
+ UnmuteWuninitialized(p);
+ }
- IncludeFile("net/proto2/public/port_undef.inc", printer);
+ IncludeFile("net/proto2/public/port_undef.inc", p);
}
-void FileGenerator::GenerateReflectionInitializationCode(io::Printer* printer) {
- Formatter format(printer, variables_);
-
+void FileGenerator::GenerateReflectionInitializationCode(io::Printer* p) {
if (!message_generators_.empty()) {
- format("static ::_pb::Metadata $file_level_metadata$[$1$];\n",
- message_generators_.size());
+ p->Emit({{"len", message_generators_.size()}}, R"cc(
+ static ::_pb::Metadata $file_level_metadata$[$len$];
+ )cc");
}
+
if (!enum_generators_.empty()) {
- format(
- "static const ::_pb::EnumDescriptor* "
- "$file_level_enum_descriptors$[$1$];\n",
- enum_generators_.size());
+ p->Emit({{"len", enum_generators_.size()}}, R"cc(
+ static const ::_pb::EnumDescriptor* $file_level_enum_descriptors$[$len$];
+ )cc");
} else {
- format(
- "static "
- "constexpr ::_pb::EnumDescriptor const** "
- "$file_level_enum_descriptors$ = nullptr;\n");
+ p->Emit(R"cc(
+ static constexpr const ::_pb::EnumDescriptor**
+ $file_level_enum_descriptors$ = nullptr;
+ )cc");
}
+
if (HasGenericServices(file_, options_) && file_->service_count() > 0) {
- format(
- "static "
- "const ::_pb::ServiceDescriptor* "
- "$file_level_service_descriptors$[$1$];\n",
- file_->service_count());
+ p->Emit({{"len", file_->service_count()}}, R"cc(
+ static const ::_pb::ServiceDescriptor*
+ $file_level_service_descriptors$[$len$];
+ )cc");
} else {
- format(
- "static "
- "constexpr ::_pb::ServiceDescriptor const** "
- "$file_level_service_descriptors$ = nullptr;\n");
+ p->Emit(R"cc(
+ static constexpr const ::_pb::ServiceDescriptor**
+ $file_level_service_descriptors$ = nullptr;
+ )cc");
}
if (!message_generators_.empty()) {
- format(
- "\n"
- "const $uint32$ $tablename$::offsets[] "
- "PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {\n");
- format.Indent();
- std::vector<std::pair<size_t, size_t> > pairs;
- pairs.reserve(message_generators_.size());
- for (int i = 0; i < message_generators_.size(); i++) {
- pairs.push_back(message_generators_[i]->GenerateOffsets(printer));
- }
- format.Outdent();
- format(
- "};\n"
- "static const ::_pbi::MigrationSchema schemas[] "
- "PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {\n");
- format.Indent();
- {
- int offset = 0;
- for (int i = 0; i < message_generators_.size(); i++) {
- message_generators_[i]->GenerateSchema(printer, offset,
- pairs[i].second);
- offset += pairs[i].first;
- }
- }
- format.Outdent();
- format(
- "};\n"
- "\nstatic const ::_pb::Message* const file_default_instances[] = {\n");
- format.Indent();
- for (int i = 0; i < message_generators_.size(); i++) {
- const Descriptor* descriptor = message_generators_[i]->descriptor_;
- format("&$1$::_$2$_default_instance_._instance,\n",
- Namespace(descriptor, options_), // 1
- ClassName(descriptor)); // 2
- }
- format.Outdent();
- format(
- "};\n"
- "\n");
+ std::vector<std::pair<size_t, size_t>> offsets;
+ offsets.reserve(message_generators_.size());
+
+ p->Emit(
+ {
+ {"offsets",
+ [&] {
+ for (int i = 0; i < message_generators_.size(); ++i) {
+ offsets.push_back(message_generators_[i]->GenerateOffsets(p));
+ }
+ }},
+ {"schemas",
+ [&] {
+ int offset = 0;
+ for (int i = 0; i < message_generators_.size(); ++i) {
+ message_generators_[i]->GenerateSchema(p, offset,
+ offsets[i].second);
+ offset += offsets[i].first;
+ }
+ }},
+ {"defaults",
+ [&] {
+ for (auto& gen : message_generators_) {
+ p->Emit(
+ {
+ {"ns", Namespace(gen->descriptor_, options_)},
+ {"class", ClassName(gen->descriptor_)},
+ },
+ R"cc(
+ &$ns$::_$class$_default_instance_._instance,
+ )cc");
+ }
+ }},
+ },
+ R"cc(
+ const uint32_t $tablename$::offsets[] PROTOBUF_SECTION_VARIABLE(
+ protodesc_cold) = {
+ $offsets$,
+ };
+
+ static const ::_pbi::MigrationSchema
+ schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
+ $schemas$,
+ };
+
+ static const ::_pb::Message* const file_default_instances[] = {
+ $defaults$,
+ };
+ )cc");
} else {
- // we still need these symbols to exist
- format(
- // MSVC doesn't like empty arrays, so we add a dummy.
- "const $uint32$ $tablename$::offsets[1] = {};\n"
- "static constexpr ::_pbi::MigrationSchema* schemas = nullptr;\n"
- "static constexpr ::_pb::Message* const* "
- "file_default_instances = nullptr;\n"
- "\n");
+ // Ee still need these symbols to exist.
+ //
+ // MSVC doesn't like empty arrays, so we add a dummy.
+ p->Emit(R"cc(
+ const uint32_t $tablename$::offsets[1] = {};
+ static constexpr ::_pbi::MigrationSchema* schemas = nullptr;
+ static constexpr ::_pb::Message* const* file_default_instances = nullptr;
+ )cc");
}
// ---------------------------------------------------------------
@@ -861,63 +955,88 @@
// Embed the descriptor. We simply serialize the entire
// FileDescriptorProto/ and embed it as a string literal, which is parsed and
// built into real descriptors at initialization time.
- const std::string protodef_name =
- UniqueName("descriptor_table_protodef", file_, options_);
- format("const char $1$[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) =\n",
- protodef_name);
- format.Indent();
+
FileDescriptorProto file_proto;
file_->CopyTo(&file_proto);
std::string file_data;
file_proto.SerializeToString(&file_data);
- {
- if (file_data.size() > 65535) {
- // Workaround for MSVC: "Error C1091: compiler limit: string exceeds
- // 65535 bytes in length". Declare a static array of chars rather than
- // use a string literal. Only write 25 bytes per line.
- static const int kBytesPerLine = 25;
- format("{ ");
- for (int i = 0; i < file_data.size();) {
- for (int j = 0; j < kBytesPerLine && i < file_data.size(); ++i, ++j) {
- format("'$1$', ", CEscape(file_data.substr(i, 1)));
- }
- format("\n");
- }
- format("'\\0' }"); // null-terminate
- } else {
- // Only write 40 bytes per line.
- static const int kBytesPerLine = 40;
- for (int i = 0; i < file_data.size(); i += kBytesPerLine) {
- format(
- "\"$1$\"\n",
- EscapeTrigraphs(CEscape(file_data.substr(i, kBytesPerLine))));
- }
- }
- format(";\n");
- }
- format.Outdent();
+ auto desc_name = UniqueName("descriptor_table_protodef", file_, options_);
+ p->Emit(
+ {{"desc_name", desc_name},
+ {"encoded_file_proto",
+ [&] {
+ absl::string_view data = file_data;
+ if (data.size() <= 65535) {
+ static constexpr size_t kBytesPerLine = 40;
+ while (!data.empty()) {
+ auto to_write = std::min(kBytesPerLine, data.size());
+ auto chunk = data.substr(0, to_write);
+ data = data.substr(to_write);
+
+ p->Emit({{"text", EscapeTrigraphs(absl::CEscape(chunk))}}, R"cc(
+ "$text$"
+ )cc");
+ }
+ return;
+ }
+
+ // Workaround for MSVC: "Error C1091: compiler limit: string exceeds
+ // 65535 bytes in length". Declare a static array of chars rather than
+ // use a string literal. Only write 25 bytes per line.
+ static constexpr size_t kBytesPerLine = 25;
+ while (!data.empty()) {
+ auto to_write = std::min(kBytesPerLine, data.size());
+ auto chunk = data.substr(0, to_write);
+ data = data.substr(to_write);
+
+ std::string line;
+ for (char c : chunk) {
+ absl::StrAppend(&line, "'",
+ absl::CEscape(absl::string_view(&c, 1)), "', ");
+ }
+
+ p->Emit({{"line", line}}, R"cc(
+ $line$
+ )cc");
+ }
+ }}},
+ R"cc(
+ const char $desc_name$[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
+ $encoded_file_proto$,
+ };
+ )cc");
CrossFileReferences refs;
GetCrossFileReferencesForFile(file_, &refs);
- int num_deps =
+ size_t num_deps =
refs.strong_reflection_files.size() + refs.weak_reflection_files.size();
// Build array of DescriptorTable deps.
if (num_deps > 0) {
- format(
- "static const ::_pbi::DescriptorTable* const "
- "$desc_table$_deps[$1$] = {\n",
- num_deps);
-
- for (auto dep : Sorted(refs.strong_reflection_files)) {
- format(" &::$1$,\n", DescriptorTableName(dep, options_));
- }
- for (auto dep : Sorted(refs.weak_reflection_files)) {
- format(" &::$1$,\n", DescriptorTableName(dep, options_));
- }
-
- format("};\n");
+ p->Emit(
+ {
+ {"len", num_deps},
+ {"deps",
+ [&] {
+ for (auto dep : refs.strong_reflection_files) {
+ p->Emit({{"name", DescriptorTableName(dep, options_)}}, R"cc(
+ &::$name$,
+ )cc");
+ }
+ for (auto dep : refs.weak_reflection_files) {
+ p->Emit({{"name", DescriptorTableName(dep, options_)}}, R"cc(
+ &::$name$,
+ )cc");
+ }
+ }},
+ },
+ R"cc(
+ static const ::_pbi::DescriptorTable* const $desc_table$_deps[$len$] =
+ {
+ $deps$,
+ };
+ )cc");
}
// The DescriptorTable itself.
@@ -925,342 +1044,355 @@
// however this might cause a tsan failure in superroot b/148382879,
// so disable for now.
bool eager = false;
- format(
- "static ::_pbi::once_flag $desc_table$_once;\n"
- "const ::_pbi::DescriptorTable $desc_table$ = {\n"
- " false, $1$, $2$, $3$,\n"
- " \"$filename$\",\n"
- " &$desc_table$_once, $4$, $5$, $6$,\n"
- " schemas, file_default_instances, $tablename$::offsets,\n"
- " $7$, $file_level_enum_descriptors$,\n"
- " $file_level_service_descriptors$,\n"
- "};\n"
- // This function exists to be marked as weak.
- // It can significantly speed up compilation by breaking up LLVM's SCC in
- // the .pb.cc translation units. Large translation units see a reduction
- // of more than 35% of walltime for optimized builds.
- // Without the weak attribute all the messages in the file, including all
- // the vtables and everything they use become part of the same SCC through
- // a cycle like:
- // GetMetadata -> descriptor table -> default instances ->
- // vtables -> GetMetadata
- // By adding a weak function here we break the connection from the
- // individual vtables back into the descriptor table.
- "PROTOBUF_ATTRIBUTE_WEAK const ::_pbi::DescriptorTable* "
- "$desc_table$_getter() {\n"
- " return &$desc_table$;\n"
- "}\n"
- "\n",
- eager ? "true" : "false", file_data.size(), protodef_name,
- num_deps == 0 ? "nullptr" : variables_["desc_table"] + "_deps", num_deps,
- message_generators_.size(),
- message_generators_.empty() ? "nullptr"
- : variables_["file_level_metadata"]);
+ p->Emit(
+ {
+ {"eager", eager ? "true" : "false"},
+ {"file_proto_len", file_data.size()},
+ {"proto_name", desc_name},
+ {"deps_ptr", num_deps == 0
+ ? "nullptr"
+ : absl::StrCat(p->LookupVar("desc_table"), "_deps")},
+ {"num_deps", num_deps},
+ {"num_msgs", message_generators_.size()},
+ {"msgs_ptr", message_generators_.empty()
+ ? "nullptr"
+ : std::string(p->LookupVar("file_level_metadata"))},
+ },
+ R"cc(
+ static ::absl::once_flag $desc_table$_once;
+ const ::_pbi::DescriptorTable $desc_table$ = {
+ false,
+ $eager$,
+ $file_proto_len$,
+ $proto_name$,
+ "$filename$",
+ &$desc_table$_once,
+ $deps_ptr$,
+ $num_deps$,
+ $num_msgs$,
+ schemas,
+ file_default_instances,
+ $tablename$::offsets,
+ $msgs_ptr$,
+ $file_level_enum_descriptors$,
+ $file_level_service_descriptors$,
+ };
+
+ // This function exists to be marked as weak.
+ // It can significantly speed up compilation by breaking up LLVM's SCC
+ // in the .pb.cc translation units. Large translation units see a
+ // reduction of more than 35% of walltime for optimized builds. Without
+ // the weak attribute all the messages in the file, including all the
+ // vtables and everything they use become part of the same SCC through
+ // a cycle like:
+ // GetMetadata -> descriptor table -> default instances ->
+ // vtables -> GetMetadata
+ // By adding a weak function here we break the connection from the
+ // individual vtables back into the descriptor table.
+ PROTOBUF_ATTRIBUTE_WEAK const ::_pbi::DescriptorTable* $desc_table$_getter() {
+ return &$desc_table$;
+ }
+ )cc");
// For descriptor.proto we want to avoid doing any dynamic initialization,
// because in some situations that would otherwise pull in a lot of
// unnecessary code that can't be stripped by --gc-sections. Descriptor
// initialization will still be performed lazily when it's needed.
- if (file_->name() != "net/proto2/proto/descriptor.proto") {
- format(
- "// Force running AddDescriptors() at dynamic initialization time.\n"
- "PROTOBUF_ATTRIBUTE_INIT_PRIORITY2 "
- "static ::_pbi::AddDescriptorsRunner $1$(&$desc_table$);\n",
- UniqueName("dynamic_init_dummy", file_, options_));
+ if (file_->name() == "net/proto2/proto/descriptor.proto") {
+ return;
}
+
+ p->Emit({{"dummy", UniqueName("dynamic_init_dummy", file_, options_)}}, R"cc(
+ // Force running AddDescriptors() at dynamic initialization time.
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY2
+ static ::_pbi::AddDescriptorsRunner $dummy$(&$desc_table$);
+ )cc");
}
class FileGenerator::ForwardDeclarations {
public:
- void AddMessage(const Descriptor* d) { classes_[ClassName(d)] = d; }
- void AddEnum(const EnumDescriptor* d) { enums_[ClassName(d)] = d; }
- void AddSplit(const Descriptor* d) { splits_[ClassName(d)] = d; }
+ void AddMessage(const Descriptor* d) { classes_.emplace(ClassName(d), d); }
+ void AddEnum(const EnumDescriptor* d) { enums_.emplace(ClassName(d), d); }
+ void AddSplit(const Descriptor* d) { splits_.emplace(ClassName(d), d); }
- void Print(const Formatter& format, const Options& options) const {
- for (const auto& p : enums_) {
- const std::string& enumname = p.first;
- const EnumDescriptor* enum_desc = p.second;
- format(
- "enum ${1$$2$$}$ : int;\n"
- "bool $2$_IsValid(int value);\n",
- enum_desc, enumname);
+ void Print(io::Printer* p, const Options& options) const {
+ for (const auto& e : enums_) {
+ p->Emit({{"enum", e.first, e.second}}, R"cc(
+ enum $enum$ : int;
+ bool $enum$_IsValid(int value);
+ )cc");
}
- for (const auto& p : classes_) {
- const std::string& classname = p.first;
- const Descriptor* class_desc = p.second;
- format(
- "class ${1$$2$$}$;\n"
- "struct $3$;\n"
- "$dllexport_decl $extern $3$ $4$;\n",
- class_desc, classname, DefaultInstanceType(class_desc, options),
- DefaultInstanceName(class_desc, options));
+
+ for (const auto& c : classes_) {
+ const Descriptor* desc = c.second;
+ p->Emit(
+ {
+ {"class", c.first, desc},
+ {"default_type", DefaultInstanceType(desc, options)},
+ {"default_name", DefaultInstanceName(desc, options)},
+ },
+ R"cc(
+ class $class$;
+ struct $default_type$;
+ $dllexport_decl $extern $default_type$ $default_name$;
+ )cc");
}
- for (const auto& p : splits_) {
- const Descriptor* class_desc = p.second;
- format(
- "struct $1$;\n"
- "$dllexport_decl $extern $1$ $2$;\n",
- DefaultInstanceType(class_desc, options, /*split=*/true),
- DefaultInstanceName(class_desc, options, /*split=*/true));
+
+ for (const auto& s : splits_) {
+ const Descriptor* desc = s.second;
+ p->Emit(
+ {
+ {"default_type",
+ DefaultInstanceType(desc, options, /*split=*/true)},
+ {"default_name",
+ DefaultInstanceName(desc, options, /*split=*/true)},
+ },
+ R"cc(
+ struct $default_type$;
+ $dllexport_decl $extern const $default_type$ $default_name$;
+ )cc");
}
}
- void PrintTopLevelDecl(const Formatter& format,
- const Options& options) const {
- for (const auto& pair : classes_) {
- format(
- "template<> $dllexport_decl $"
- "$1$* Arena::CreateMaybeMessage<$1$>(Arena*);\n",
- QualifiedClassName(pair.second, options));
+ void PrintTopLevelDecl(io::Printer* p, const Options& options) const {
+ for (const auto& c : classes_) {
+ p->Emit({{"class", QualifiedClassName(c.second, options)}}, R"cc(
+ template <>
+ $dllexport_decl $$class$* Arena::CreateMaybeMessage<$class$>(Arena*);
+ )cc");
}
}
private:
- std::map<std::string, const Descriptor*> classes_;
- std::map<std::string, const EnumDescriptor*> enums_;
- std::map<std::string, const Descriptor*> splits_;
+ absl::btree_map<std::string, const Descriptor*> classes_;
+ absl::btree_map<std::string, const EnumDescriptor*> enums_;
+ absl::btree_map<std::string, const Descriptor*> splits_;
};
-static void PublicImportDFS(const FileDescriptor* fd,
- std::unordered_set<const FileDescriptor*>* fd_set) {
- for (int i = 0; i < fd->public_dependency_count(); i++) {
+static void PublicImportDFS(
+ const FileDescriptor* fd,
+ absl::flat_hash_set<const FileDescriptor*>& fd_set) {
+ for (int i = 0; i < fd->public_dependency_count(); ++i) {
const FileDescriptor* dep = fd->public_dependency(i);
- if (fd_set->insert(dep).second) PublicImportDFS(dep, fd_set);
+ if (fd_set.insert(dep).second) {
+ PublicImportDFS(dep, fd_set);
+ }
}
}
-void FileGenerator::GenerateForwardDeclarations(io::Printer* printer) {
- Formatter format(printer, variables_);
+void FileGenerator::GenerateForwardDeclarations(io::Printer* p) {
std::vector<const Descriptor*> classes;
- std::vector<const EnumDescriptor*> enums;
-
FlattenMessagesInFile(file_, &classes); // All messages need forward decls.
+ std::vector<const EnumDescriptor*> enums;
if (options_.proto_h) { // proto.h needs extra forward declarations.
// All classes / enums referred to as field members
std::vector<const FieldDescriptor*> fields;
ListAllFields(file_, &fields);
- for (int i = 0; i < fields.size(); i++) {
- classes.push_back(fields[i]->containing_type());
- classes.push_back(fields[i]->message_type());
- enums.push_back(fields[i]->enum_type());
+ for (const auto* field : fields) {
+ classes.push_back(field->containing_type());
+ classes.push_back(field->message_type());
+ enums.push_back(field->enum_type());
}
+
ListAllTypesForServices(file_, &classes);
}
// Calculate the set of files whose definitions we get through include.
// No need to forward declare types that are defined in these.
- std::unordered_set<const FileDescriptor*> public_set;
- PublicImportDFS(file_, &public_set);
+ absl::flat_hash_set<const FileDescriptor*> public_set;
+ PublicImportDFS(file_, public_set);
- std::map<std::string, ForwardDeclarations> decls;
- for (int i = 0; i < classes.size(); i++) {
- const Descriptor* d = classes[i];
- if (d && !public_set.count(d->file()))
+ absl::btree_map<std::string, ForwardDeclarations> decls;
+ for (const auto* d : classes) {
+ if (d != nullptr && !public_set.count(d->file()))
decls[Namespace(d, options_)].AddMessage(d);
}
- for (int i = 0; i < enums.size(); i++) {
- const EnumDescriptor* d = enums[i];
- if (d && !public_set.count(d->file()))
- decls[Namespace(d, options_)].AddEnum(d);
+ for (const auto* e : enums) {
+ if (e != nullptr && !public_set.count(e->file()))
+ decls[Namespace(e, options_)].AddEnum(e);
}
for (const auto& mg : message_generators_) {
const Descriptor* d = mg->descriptor_;
- if ((d != nullptr) && (public_set.count(d->file()) == 0u) &&
+ if (d != nullptr && public_set.count(d->file()) == 0u &&
ShouldSplit(mg->descriptor_, options_))
decls[Namespace(d, options_)].AddSplit(d);
}
- {
- NamespaceOpener ns(format);
- for (const auto& pair : decls) {
- ns.ChangeTo(pair.first);
- pair.second.Print(format, options_);
- }
+ NamespaceOpener ns(p);
+ for (const auto& decl : decls) {
+ ns.ChangeTo(decl.first);
+ decl.second.Print(p, options_);
}
- format("PROTOBUF_NAMESPACE_OPEN\n");
- for (const auto& pair : decls) {
- pair.second.PrintTopLevelDecl(format, options_);
+
+ ns.ChangeTo("PROTOBUF_NAMESPACE_ID");
+ for (const auto& decl : decls) {
+ decl.second.PrintTopLevelDecl(p, options_);
}
- format("PROTOBUF_NAMESPACE_CLOSE\n");
}
-void FileGenerator::GenerateTopHeaderGuard(io::Printer* printer, bool pb_h) {
- Formatter format(printer, variables_);
- // Generate top of header.
- format(
- "// Generated by the protocol buffer compiler. DO NOT EDIT!\n"
- "// source: $filename$\n"
- "\n"
- "#ifndef $1$\n"
- "#define $1$\n"
- "\n"
- "#include <limits>\n"
- "#include <string>\n",
- IncludeGuard(file_, pb_h, options_));
- if (!options_.opensource_runtime && !enum_generators_.empty()) {
- // Add header to provide std::is_integral for safe Enum_Name() function.
- format("#include <type_traits>\n");
- }
- format("\n");
-}
-
-void FileGenerator::GenerateBottomHeaderGuard(io::Printer* printer, bool pb_h) {
- Formatter format(printer, variables_);
- format("#endif // $GOOGLE_PROTOBUF$_INCLUDED_$1$\n",
- IncludeGuard(file_, pb_h, options_));
-}
-
-void FileGenerator::GenerateLibraryIncludes(io::Printer* printer) {
- Formatter format(printer, variables_);
+void FileGenerator::GenerateLibraryIncludes(io::Printer* p) {
if (UsingImplicitWeakFields(file_, options_)) {
- IncludeFile("net/proto2/public/implicit_weak_message.h", printer);
+ IncludeFile("net/proto2/public/implicit_weak_message.h", p);
}
if (HasWeakFields(file_, options_)) {
GOOGLE_CHECK(!options_.opensource_runtime);
- IncludeFile("net/proto2/public/weak_field_map.h", printer);
+ IncludeFile("net/proto2/public/weak_field_map.h", p);
}
if (HasLazyFields(file_, options_, &scc_analyzer_)) {
GOOGLE_CHECK(!options_.opensource_runtime);
- IncludeFile("net/proto2/public/lazy_field.h", printer);
+ IncludeFile("net/proto2/public/lazy_field.h", p);
}
if (ShouldVerify(file_, options_, &scc_analyzer_)) {
- IncludeFile("net/proto2/public/wire_format_verify.h", printer);
+ IncludeFile("net/proto2/public/wire_format_verify.h", p);
}
if (options_.opensource_runtime) {
// Verify the protobuf library header version is compatible with the protoc
// version before going any further.
- IncludeFile("net/proto2/public/port_def.inc", printer);
- format(
- "#if PROTOBUF_VERSION < $1$\n"
- "#error This file was generated by a newer version of protoc which is\n"
- "#error incompatible with your Protocol Buffer headers. Please update\n"
- "#error your headers.\n"
- "#endif\n"
- "#if $2$ < PROTOBUF_MIN_PROTOC_VERSION\n"
- "#error This file was generated by an older version of protoc which "
- "is\n"
- "#error incompatible with your Protocol Buffer headers. Please\n"
- "#error regenerate this file with a newer version of protoc.\n"
- "#endif\n"
- "\n",
- PROTOBUF_MIN_HEADER_VERSION_FOR_PROTOC, // 1
- PROTOBUF_VERSION); // 2
- IncludeFile("net/proto2/public/port_undef.inc", printer);
+ IncludeFile("net/proto2/public/port_def.inc", p);
+ p->Emit(
+ {
+ {"min_version", PROTOBUF_MIN_HEADER_VERSION_FOR_PROTOC},
+ {"version", PROTOBUF_VERSION},
+ },
+ R"(
+ #if PROTOBUF_VERSION < $min_version$
+ #error "This file was generated by a newer version of protoc which is"
+ #error "incompatible with your Protocol Buffer headers. Please update"
+ #error "your headers."
+ #endif // PROTOBUF_VERSION
+
+ #if $version$ < PROTOBUF_MIN_PROTOC_VERSION
+ #error "This file was generated by an older version of protoc which is"
+ #error "incompatible with your Protocol Buffer headers. Please"
+ #error "regenerate this file with a newer version of protoc."
+ #endif // PROTOBUF_MIN_PROTOC_VERSION
+ )");
+ IncludeFile("net/proto2/public/port_undef.inc", p);
}
// OK, it's now safe to #include other files.
- IncludeFile("net/proto2/io/public/coded_stream.h", printer);
- IncludeFile("net/proto2/public/arena.h", printer);
- IncludeFile("net/proto2/public/arenastring.h", printer);
+ IncludeFile("net/proto2/io/public/coded_stream.h", p);
+ IncludeFile("net/proto2/public/arena.h", p);
+ IncludeFile("net/proto2/public/arenastring.h", p);
if ((options_.force_inline_string || options_.profile_driven_inline_string) &&
!options_.opensource_runtime) {
- IncludeFile("net/proto2/public/inlined_string_field.h", printer);
+ IncludeFile("net/proto2/public/inlined_string_field.h", p);
}
if (HasSimpleBaseClasses(file_, options_)) {
- IncludeFile("net/proto2/public/generated_message_bases.h", printer);
+ IncludeFile("net/proto2/public/generated_message_bases.h", p);
}
if (HasGeneratedMethods(file_, options_) &&
options_.tctable_mode != Options::kTCTableNever) {
- IncludeFile("net/proto2/public/generated_message_tctable_decl.h", printer);
+ IncludeFile("net/proto2/public/generated_message_tctable_decl.h", p);
}
- IncludeFile("net/proto2/public/generated_message_util.h", printer);
- IncludeFile("net/proto2/public/metadata_lite.h", printer);
+ IncludeFile("net/proto2/public/generated_message_util.h", p);
+ IncludeFile("net/proto2/public/metadata_lite.h", p);
if (HasDescriptorMethods(file_, options_)) {
- IncludeFile("net/proto2/public/generated_message_reflection.h", printer);
+ IncludeFile("net/proto2/public/generated_message_reflection.h", p);
}
if (!message_generators_.empty()) {
if (HasDescriptorMethods(file_, options_)) {
- IncludeFile("net/proto2/public/message.h", printer);
+ IncludeFile("net/proto2/public/message.h", p);
} else {
- IncludeFile("net/proto2/public/message_lite.h", printer);
+ IncludeFile("net/proto2/public/message_lite.h", p);
}
}
if (options_.opensource_runtime) {
// Open-source relies on unconditional includes of these.
- IncludeFileAndExport("net/proto2/public/repeated_field.h", printer);
- IncludeFileAndExport("net/proto2/public/extension_set.h", printer);
+ IncludeFileAndExport("net/proto2/public/repeated_field.h", p);
+ IncludeFileAndExport("net/proto2/public/extension_set.h", p);
} else {
// Google3 includes these files only when they are necessary.
if (HasExtensionsOrExtendableMessage(file_)) {
- IncludeFileAndExport("net/proto2/public/extension_set.h", printer);
+ IncludeFileAndExport("net/proto2/public/extension_set.h", p);
}
if (HasRepeatedFields(file_)) {
- IncludeFileAndExport("net/proto2/public/repeated_field.h", printer);
+ IncludeFileAndExport("net/proto2/public/repeated_field.h", p);
}
if (HasStringPieceFields(file_, options_)) {
- IncludeFile("net/proto2/public/string_piece_field_support.h", printer);
+ IncludeFile("net/proto2/public/string_piece_field_support.h", p);
}
if (HasCordFields(file_, options_)) {
- format("#include \"third_party/absl/strings/cord.h\"\n");
+ p->Emit(R"(
+ #include "third_party/absl/strings/cord.h"
+ )");
}
}
if (HasMapFields(file_)) {
- IncludeFileAndExport("net/proto2/public/map.h", printer);
+ IncludeFileAndExport("net/proto2/public/map.h", p);
if (HasDescriptorMethods(file_, options_)) {
- IncludeFile("net/proto2/public/map_entry.h", printer);
- IncludeFile("net/proto2/public/map_field_inl.h", printer);
+ IncludeFile("net/proto2/public/map_entry.h", p);
+ IncludeFile("net/proto2/public/map_field_inl.h", p);
} else {
- IncludeFile("net/proto2/public/map_entry_lite.h", printer);
- IncludeFile("net/proto2/public/map_field_lite.h", printer);
+ IncludeFile("net/proto2/public/map_entry_lite.h", p);
+ IncludeFile("net/proto2/public/map_field_lite.h", p);
}
}
if (HasEnumDefinitions(file_)) {
if (HasDescriptorMethods(file_, options_)) {
- IncludeFile("net/proto2/public/generated_enum_reflection.h", printer);
+ IncludeFile("net/proto2/public/generated_enum_reflection.h", p);
} else {
- IncludeFile("net/proto2/public/generated_enum_util.h", printer);
+ IncludeFile("net/proto2/public/generated_enum_util.h", p);
}
}
if (HasGenericServices(file_, options_)) {
- IncludeFile("net/proto2/public/service.h", printer);
+ IncludeFile("net/proto2/public/service.h", p);
}
if (UseUnknownFieldSet(file_, options_) && !message_generators_.empty()) {
- IncludeFile("net/proto2/public/unknown_field_set.h", printer);
+ IncludeFile("net/proto2/public/unknown_field_set.h", p);
}
}
-void FileGenerator::GenerateMetadataPragma(io::Printer* printer,
- const std::string& info_path) {
- Formatter format(printer, variables_);
- if (!info_path.empty() && !options_.annotation_pragma_name.empty() &&
- !options_.annotation_guard_name.empty()) {
- format.Set("guard", options_.annotation_guard_name);
- format.Set("pragma", options_.annotation_pragma_name);
- format.Set("info_path", info_path);
- format(
- "#ifdef $guard$\n"
- "#pragma $pragma$ \"$info_path$\"\n"
- "#endif // $guard$\n");
+void FileGenerator::GenerateMetadataPragma(io::Printer* p,
+ absl::string_view info_path) {
+ if (info_path.empty() || options_.annotation_pragma_name.empty() ||
+ options_.annotation_guard_name.empty()) {
+ return;
}
+
+ p->Emit(
+ {
+ {"guard", options_.annotation_guard_name},
+ {"pragma", options_.annotation_pragma_name},
+ {"info_path", std::string(info_path)},
+ },
+ R"(
+ #ifdef $guard$
+ #pragma $pragma$ "$info_path$"
+ #endif // $guard$
+ )");
}
-void FileGenerator::GenerateDependencyIncludes(io::Printer* printer) {
- Formatter format(printer, variables_);
- for (int i = 0; i < file_->dependency_count(); i++) {
- std::string basename = StripProto(file_->dependency(i)->name());
+void FileGenerator::GenerateDependencyIncludes(io::Printer* p) {
+ for (int i = 0; i < file_->dependency_count(); ++i) {
+ const FileDescriptor* dep = file_->dependency(i);
// Do not import weak deps.
- if (IsDepWeak(file_->dependency(i))) continue;
+ if (IsDepWeak(dep)) {
+ continue;
+ }
+ std::string basename = StripProto(dep->name());
if (IsBootstrapProto(options_, file_)) {
GetBootstrapBasename(options_, basename, &basename);
}
- format("#include $1$\n",
- CreateHeaderInclude(basename + ".pb.h", file_->dependency(i)));
+ p->Emit(
+ {{"name", CreateHeaderInclude(absl::StrCat(basename, ".pb.h"), dep)}},
+ R"(
+ #include $name$
+ )");
}
}
-void FileGenerator::GenerateGlobalStateFunctionDeclarations(
- io::Printer* printer) {
- Formatter format(printer, variables_);
+void FileGenerator::GenerateGlobalStateFunctionDeclarations(io::Printer* p) {
// Forward-declare the DescriptorTable because this is referenced by .pb.cc
// files depending on this file.
//
@@ -1268,114 +1400,102 @@
// weak fields must refer to table struct but cannot include the header.
// Also it annotates extra weak attributes.
// TODO(gerbens) make sure this situation is handled better.
- format(
- "\n"
- "// Internal implementation detail -- do not use these members.\n"
- "struct $dllexport_decl $$tablename$ {\n"
- " static const $uint32$ offsets[];\n"
- "};\n");
+ p->Emit(R"cc(
+ // Internal implementation detail -- do not use these members.
+ struct $dllexport_decl $$tablename$ {
+ static const uint32_t offsets[];
+ };
+ )cc");
+
if (HasDescriptorMethods(file_, options_)) {
- format(
- "$dllexport_decl $extern const ::$proto_ns$::internal::DescriptorTable "
- "$desc_table$;\n");
+ p->Emit(R"cc(
+ $dllexport_decl $extern const ::$proto_ns$::internal::DescriptorTable
+ $desc_table$;
+ )cc");
}
}
-void FileGenerator::GenerateMessageDefinitions(io::Printer* printer) {
- Formatter format(printer, variables_);
- // Generate class definitions.
- for (int i = 0; i < message_generators_.size(); i++) {
- if (i > 0) {
- format("\n");
- format(kThinSeparator);
- format("\n");
- }
- message_generators_[i]->GenerateClassDefinition(printer);
+void FileGenerator::GenerateMessageDefinitions(io::Printer* p) {
+ for (int i = 0; i < message_generators_.size(); ++i) {
+ p->Emit(R"cc(
+ $hrule_thin$
+ )cc");
+ message_generators_[i]->GenerateClassDefinition(p);
}
}
-void FileGenerator::GenerateEnumDefinitions(io::Printer* printer) {
- // Generate enum definitions.
- for (int i = 0; i < enum_generators_.size(); i++) {
- enum_generators_[i]->GenerateDefinition(printer);
+void FileGenerator::GenerateEnumDefinitions(io::Printer* p) {
+ for (int i = 0; i < enum_generators_.size(); ++i) {
+ enum_generators_[i]->GenerateDefinition(p);
}
}
-void FileGenerator::GenerateServiceDefinitions(io::Printer* printer) {
- Formatter format(printer, variables_);
- if (HasGenericServices(file_, options_)) {
- // Generate service definitions.
- for (int i = 0; i < service_generators_.size(); i++) {
- if (i > 0) {
- format("\n");
- format(kThinSeparator);
- format("\n");
- }
- service_generators_[i]->GenerateDeclarations(printer);
- }
-
- format("\n");
- format(kThickSeparator);
- format("\n");
+void FileGenerator::GenerateServiceDefinitions(io::Printer* p) {
+ if (!HasGenericServices(file_, options_)) {
+ return;
}
+
+ for (int i = 0; i < service_generators_.size(); ++i) {
+ p->Emit(R"cc(
+ $hrule_thin$
+ )cc");
+ service_generators_[i]->GenerateDeclarations(p);
+ }
+
+ p->Emit(R"cc(
+ $hrule_thick$
+ )cc");
}
-void FileGenerator::GenerateExtensionIdentifiers(io::Printer* printer) {
+void FileGenerator::GenerateExtensionIdentifiers(io::Printer* p) {
// Declare extension identifiers. These are in global scope and so only
// the global scope extensions.
for (auto& extension_generator : extension_generators_) {
- if (extension_generator->IsScoped()) continue;
- extension_generator->GenerateDeclaration(printer);
+ if (extension_generator->IsScoped()) {
+ continue;
+ }
+ extension_generator->GenerateDeclaration(p);
}
}
-void FileGenerator::GenerateInlineFunctionDefinitions(io::Printer* printer) {
- Formatter format(printer, variables_);
+void FileGenerator::GenerateInlineFunctionDefinitions(io::Printer* p) {
// TODO(gerbens) remove pragmas when gcc is no longer used. Current version
// of gcc fires a bogus error when compiled with strict-aliasing.
- format(
- "#ifdef __GNUC__\n"
- " #pragma GCC diagnostic push\n"
- " #pragma GCC diagnostic ignored \"-Wstrict-aliasing\"\n"
- "#endif // __GNUC__\n");
- // Generate class inline methods.
- for (int i = 0; i < message_generators_.size(); i++) {
- if (i > 0) {
- format(kThinSeparator);
- format("\n");
- }
- message_generators_[i]->GenerateInlineMethods(printer);
- }
- format(
- "#ifdef __GNUC__\n"
- " #pragma GCC diagnostic pop\n"
- "#endif // __GNUC__\n");
+ p->Emit(R"(
+ #ifdef __GNUC__
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wstrict-aliasing"
+ #endif // __GNUC__
+ )");
- for (int i = 0; i < message_generators_.size(); i++) {
- if (i > 0) {
- format(kThinSeparator);
- format("\n");
- }
+ for (int i = 0; i < message_generators_.size(); ++i) {
+ p->Emit(R"cc(
+ $hrule_thin$
+ )cc");
+ message_generators_[i]->GenerateInlineMethods(p);
}
+
+ p->Emit(R"(
+ #ifdef __GNUC__
+ #pragma GCC diagnostic pop
+ #endif // __GNUC__
+ )");
}
-void FileGenerator::GenerateProto2NamespaceEnumSpecializations(
- io::Printer* printer) {
- Formatter format(printer, variables_);
- // Emit GetEnumDescriptor specializations into google::protobuf namespace:
- if (HasEnumDefinitions(file_)) {
- format("\n");
- {
- NamespaceOpener proto_ns(ProtobufNamespace(options_), format);
- format("\n");
- for (int i = 0; i < enum_generators_.size(); i++) {
- enum_generators_[i]->GenerateGetEnumDescriptorSpecializations(printer);
- }
- format("\n");
- }
+void FileGenerator::GenerateProto2NamespaceEnumSpecializations(io::Printer* p) {
+ // Emit GetEnumDescriptor specializations into google::protobuf namespace.
+ if (!HasEnumDefinitions(file_)) {
+ return;
}
-}
+ p->PrintRaw("\n");
+ NamespaceOpener ns(ProtobufNamespace(options_), p);
+ p->PrintRaw("\n");
+ for (auto& gen : enum_generators_) {
+ gen->GenerateGetEnumDescriptorSpecializations(p);
+ }
+ p->PrintRaw("\n");
+}
} // namespace cpp
} // namespace compiler
} // namespace protobuf
diff --git a/src/google/protobuf/compiler/cpp/file.h b/src/google/protobuf/compiler/cpp/file.h
index ca05361..cd38345 100644
--- a/src/google/protobuf/compiler/cpp/file.h
+++ b/src/google/protobuf/compiler/cpp/file.h
@@ -36,52 +36,47 @@
#define GOOGLE_PROTOBUF_COMPILER_CPP_FILE_H__
#include <algorithm>
+#include <functional>
#include <memory>
#include <set>
#include <string>
#include <vector>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/compiler/cpp/field.h>
-#include <google/protobuf/compiler/cpp/helpers.h>
-#include <google/protobuf/compiler/scc.h>
-#include <google/protobuf/compiler/cpp/options.h>
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/compiler/scc.h"
+#include "absl/container/flat_hash_set.h"
+#include "google/protobuf/compiler/cpp/enum.h"
+#include "google/protobuf/compiler/cpp/extension.h"
+#include "google/protobuf/compiler/cpp/field.h"
+#include "google/protobuf/compiler/cpp/helpers.h"
+#include "google/protobuf/compiler/cpp/message.h"
+#include "google/protobuf/compiler/cpp/options.h"
+#include "google/protobuf/compiler/cpp/service.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/port.h"
-namespace google {
-namespace protobuf {
-class FileDescriptor; // descriptor.h
-namespace io {
-class Printer; // printer.h
-}
-} // namespace protobuf
-} // namespace google
namespace google {
namespace protobuf {
namespace compiler {
namespace cpp {
-
-class EnumGenerator; // enum.h
-class MessageGenerator; // message.h
-class ServiceGenerator; // service.h
-class ExtensionGenerator; // extension.h
-
class FileGenerator {
public:
- // See generator.cc for the meaning of dllexport_decl.
FileGenerator(const FileDescriptor* file, const Options& options);
- ~FileGenerator();
- // Shared code between the two header generators below.
- void GenerateHeader(io::Printer* printer);
+ FileGenerator(const FileGenerator&) = delete;
+ FileGenerator& operator=(const FileGenerator&) = delete;
+
+ ~FileGenerator() = default;
// info_path, if non-empty, should be the path (relative to printer's
// output) to the metadata file describing this proto header.
- void GenerateProtoHeader(io::Printer* printer, const std::string& info_path);
+ void GenerateProtoHeader(io::Printer* p, absl::string_view info_path);
// info_path, if non-empty, should be the path (relative to printer's
// output) to the metadata file describing this PB header.
- void GeneratePBHeader(io::Printer* printer, const std::string& info_path);
- void GenerateSource(io::Printer* printer);
+ void GeneratePBHeader(io::Printer* p, absl::string_view info_path);
+ void GenerateSource(io::Printer* p);
// The following member functions are used when the lite_implicit_weak_fields
// option is set. In this mode the code is organized a bit differently to
@@ -92,78 +87,86 @@
int NumMessages() const { return message_generators_.size(); }
int NumExtensions() const { return extension_generators_.size(); }
// Generates the source file for one message.
- void GenerateSourceForMessage(int idx, io::Printer* printer);
+ void GenerateSourceForMessage(int idx, io::Printer* p);
// Generates the source file for one extension.
- void GenerateSourceForExtension(int idx, io::Printer* printer);
+ void GenerateSourceForExtension(int idx, io::Printer* p);
// Generates a source file containing everything except messages and
// extensions.
- void GenerateGlobalSource(io::Printer* printer);
+ void GenerateGlobalSource(io::Printer* p);
private:
+ // Generates a file, setting up the necessary accoutrements that start and
+ // end the file, calling `cb` in between.
+ //
+ // This includes header guards and file-global variables.
+ void GenerateFile(io::Printer* p, GeneratedFileType file_type,
+ std::function<void()> cb);
+
+ // Shared code between the two header generators.
+ void GenerateSharedHeaderCode(io::Printer* p);
+
// Internal type used by GenerateForwardDeclarations (defined in file.cc).
class ForwardDeclarations;
struct CrossFileReferences;
- void IncludeFile(const std::string& google3_name, io::Printer* printer) {
- DoIncludeFile(google3_name, false, printer);
+ void IncludeFile(absl::string_view google3_name, io::Printer* p) {
+ DoIncludeFile(google3_name, false, p);
}
- void IncludeFileAndExport(const std::string& google3_name,
- io::Printer* printer) {
- DoIncludeFile(google3_name, true, printer);
+ void IncludeFileAndExport(absl::string_view google3_name, io::Printer* p) {
+ DoIncludeFile(google3_name, true, p);
}
- void DoIncludeFile(const std::string& google3_name, bool do_export,
- io::Printer* printer);
+ void DoIncludeFile(absl::string_view google3_name, bool do_export,
+ io::Printer* p);
- std::string CreateHeaderInclude(const std::string& basename,
+ std::string CreateHeaderInclude(absl::string_view basename,
const FileDescriptor* file);
void GetCrossFileReferencesForField(const FieldDescriptor* field,
CrossFileReferences* refs);
void GetCrossFileReferencesForFile(const FileDescriptor* file,
CrossFileReferences* refs);
void GenerateInternalForwardDeclarations(const CrossFileReferences& refs,
- io::Printer* printer);
- void GenerateSourceIncludes(io::Printer* printer);
- void GenerateSourcePrelude(io::Printer* printer);
- void GenerateSourceDefaultInstance(int idx, io::Printer* printer);
+ io::Printer* p);
+ void GenerateSourceIncludes(io::Printer* p);
+ void GenerateSourcePrelude(io::Printer* p);
+ void GenerateSourceDefaultInstance(int idx, io::Printer* p);
void GenerateInitForSCC(const SCC* scc, const CrossFileReferences& refs,
- io::Printer* printer);
- void GenerateReflectionInitializationCode(io::Printer* printer);
+ io::Printer* p);
+ void GenerateReflectionInitializationCode(io::Printer* p);
// For other imports, generates their forward-declarations.
- void GenerateForwardDeclarations(io::Printer* printer);
+ void GenerateForwardDeclarations(io::Printer* p);
// Generates top or bottom of a header file.
- void GenerateTopHeaderGuard(io::Printer* printer, bool pb_h);
- void GenerateBottomHeaderGuard(io::Printer* printer, bool pb_h);
+ void GenerateTopHeaderGuard(io::Printer* p, GeneratedFileType file_type);
+ void GenerateBottomHeaderGuard(io::Printer* p, GeneratedFileType file_type);
// Generates #include directives.
- void GenerateLibraryIncludes(io::Printer* printer);
- void GenerateDependencyIncludes(io::Printer* printer);
+ void GenerateLibraryIncludes(io::Printer* p);
+ void GenerateDependencyIncludes(io::Printer* p);
// Generate a pragma to pull in metadata using the given info_path (if
// non-empty). info_path should be relative to printer's output.
- void GenerateMetadataPragma(io::Printer* printer,
- const std::string& info_path);
+ void GenerateMetadataPragma(io::Printer* p, absl::string_view info_path);
// Generates a couple of different pieces before definitions:
- void GenerateGlobalStateFunctionDeclarations(io::Printer* printer);
+ void GenerateGlobalStateFunctionDeclarations(io::Printer* p);
// Generates types for classes.
- void GenerateMessageDefinitions(io::Printer* printer);
+ void GenerateMessageDefinitions(io::Printer* p);
- void GenerateEnumDefinitions(io::Printer* printer);
+ void GenerateEnumDefinitions(io::Printer* p);
// Generates generic service definitions.
- void GenerateServiceDefinitions(io::Printer* printer);
+ void GenerateServiceDefinitions(io::Printer* p);
// Generates extension identifiers.
- void GenerateExtensionIdentifiers(io::Printer* printer);
+ void GenerateExtensionIdentifiers(io::Printer* p);
// Generates inline function definitions.
- void GenerateInlineFunctionDefinitions(io::Printer* printer);
+ void GenerateInlineFunctionDefinitions(io::Printer* p);
- void GenerateProto2NamespaceEnumSpecializations(io::Printer* printer);
+ void GenerateProto2NamespaceEnumSpecializations(io::Printer* p);
// Sometimes the names we use in a .proto file happen to be defined as
// macros on some platforms (e.g., macro/minor used in plugin.proto are
@@ -172,7 +175,7 @@
// undef the macro for these few platforms, or rename the field name for all
// platforms. Since these names are part of protobuf public API, renaming is
// generally a breaking change so we prefer the #undef approach.
- void GenerateMacroUndefs(io::Printer* printer);
+ void GenerateMacroUndefs(io::Printer* p);
bool IsDepWeak(const FileDescriptor* dep) const {
if (weak_deps_.count(dep) != 0) {
@@ -182,13 +185,16 @@
return false;
}
- std::set<const FileDescriptor*> weak_deps_;
+ absl::flat_hash_set<const FileDescriptor*> weak_deps_;
const FileDescriptor* file_;
- const Options options_;
+ Options options_;
MessageSCCAnalyzer scc_analyzer_;
+ // This member is unused and should be deleted once all old-style variable
+ // maps are gone.
+ // TODO(b/245791219)
std::map<std::string, std::string> variables_;
// Contains the post-order walk of all the messages (and child messages) in
@@ -197,8 +203,6 @@
std::vector<std::unique_ptr<EnumGenerator>> enum_generators_;
std::vector<std::unique_ptr<ServiceGenerator>> service_generators_;
std::vector<std::unique_ptr<ExtensionGenerator>> extension_generators_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FileGenerator);
};
} // namespace cpp
diff --git a/src/google/protobuf/compiler/cpp/generator.cc b/src/google/protobuf/compiler/cpp/generator.cc
index 63a2bce..8403312 100644
--- a/src/google/protobuf/compiler/cpp/generator.cc
+++ b/src/google/protobuf/compiler/cpp/generator.cc
@@ -32,31 +32,66 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/compiler/cpp/generator.h>
+#include "google/protobuf/compiler/cpp/generator.h"
#include <memory>
#include <string>
#include <utility>
#include <vector>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/compiler/cpp/file.h>
-#include <google/protobuf/compiler/cpp/helpers.h>
-#include <google/protobuf/descriptor.pb.h>
+#include "google/protobuf/stubs/strutil.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/io/zero_copy_stream.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/str_replace.h"
+#include "google/protobuf/compiler/cpp/file.h"
+#include "google/protobuf/compiler/cpp/helpers.h"
+#include "google/protobuf/descriptor.pb.h"
namespace google {
namespace protobuf {
namespace compiler {
namespace cpp {
-
-CppGenerator::CppGenerator() {}
-CppGenerator::~CppGenerator() {}
-
namespace {
-std::string NumberedCcFileName(const std::string& basename, int number) {
- return StrCat(basename, ".out/", number, ".cc");
+std::string NumberedCcFileName(absl::string_view basename, int number) {
+ return absl::StrCat(basename, ".out/", number, ".cc");
+}
+
+absl::flat_hash_map<std::string, std::string> CommonVars(
+ const Options& options) {
+ bool is_oss = options.opensource_runtime;
+ return {
+ {"proto_ns", ProtobufNamespace(options)},
+ {"string", "std::string"},
+ {"int8", "int8_t"},
+ {"int32", "int32_t"},
+ {"int64", "int64_t"},
+ {"uint8", "uint8_t"},
+ {"uint32", "uint32_t"},
+ {"uint64", "uint64_t"},
+
+ {"hrule_thick", kThickSeparator},
+ {"hrule_thin", kThinSeparator},
+
+ // Warning: there is some clever naming/splitting here to avoid extract
+ // script rewrites. The names of these variables must not be things that
+ // the extract script will rewrite. That's why we use "CHK" (for example)
+ // instead of "GOOGLE_CHECK".
+ //
+ // These values are things the extract script would rewrite if we did not
+ // split them. It might not strictly matter since we don't generate
+ // google3 code in open-source. But it's good to prevent surprising
+ // things from happening.
+ {"GOOGLE_PROTOBUF", is_oss ? "GOOGLE_PROTOBUF"
+ : "GOOGLE3_PROTOBU"
+ "F"},
+ {"CHK", is_oss ? "GOOGLE_CHECK"
+ : "CHEC"
+ "K"},
+ {"DCHK", is_oss ? "GOOGLE_DCHECK"
+ : "DCHEC"
+ "K"},
+ };
}
} // namespace
@@ -64,7 +99,7 @@
const std::string& parameter,
GeneratorContext* generator_context,
std::string* error) const {
- std::vector<std::pair<std::string, std::string> > options;
+ std::vector<std::pair<std::string, std::string>> options;
ParseGeneratorParameter(parameter, &options);
// -----------------------------------------------------------------
@@ -93,70 +128,70 @@
file_options.opensource_runtime = opensource_runtime_;
file_options.runtime_include_base = runtime_include_base_;
- for (int i = 0; i < options.size(); i++) {
- if (options[i].first == "dllexport_decl") {
- file_options.dllexport_decl = options[i].second;
- } else if (options[i].first == "safe_boundary_check") {
+ for (const auto& option : options) {
+ const auto& key = option.first;
+ const auto& value = option.second;
+
+ if (key == "dllexport_decl") {
+ file_options.dllexport_decl = value;
+ } else if (key == "safe_boundary_check") {
file_options.safe_boundary_check = true;
- } else if (options[i].first == "annotate_headers") {
+ } else if (key == "annotate_headers") {
file_options.annotate_headers = true;
- } else if (options[i].first == "annotation_pragma_name") {
- file_options.annotation_pragma_name = options[i].second;
- } else if (options[i].first == "annotation_guard_name") {
- file_options.annotation_guard_name = options[i].second;
- } else if (options[i].first == "speed") {
+ } else if (key == "annotation_pragma_name") {
+ file_options.annotation_pragma_name = value;
+ } else if (key == "annotation_guard_name") {
+ file_options.annotation_guard_name = value;
+ } else if (key == "speed") {
file_options.enforce_mode = EnforceOptimizeMode::kSpeed;
- } else if (options[i].first == "code_size") {
+ } else if (key == "code_size") {
file_options.enforce_mode = EnforceOptimizeMode::kCodeSize;
- } else if (options[i].first == "lite") {
+ } else if (key == "lite") {
file_options.enforce_mode = EnforceOptimizeMode::kLiteRuntime;
- } else if (options[i].first == "lite_implicit_weak_fields") {
+ } else if (key == "lite_implicit_weak_fields") {
file_options.enforce_mode = EnforceOptimizeMode::kLiteRuntime;
file_options.lite_implicit_weak_fields = true;
- if (!options[i].second.empty()) {
- file_options.num_cc_files =
- strto32(options[i].second.c_str(), nullptr, 10);
+ if (!value.empty()) {
+ file_options.num_cc_files = strto32(value.c_str(), nullptr, 10);
}
- } else if (options[i].first == "proto_h") {
+ } else if (key == "proto_h") {
file_options.proto_h = true;
- } else if (options[i].first == "annotate_accessor") {
+ } else if (key == "annotate_accessor") {
file_options.annotate_accessor = true;
- } else if (options[i].first == "inject_field_listener_events") {
+ } else if (key == "inject_field_listener_events") {
file_options.field_listener_options.inject_field_listener_events = true;
- } else if (options[i].first == "forbidden_field_listener_events") {
+ } else if (key == "forbidden_field_listener_events") {
std::size_t pos = 0;
do {
- std::size_t next_pos = options[i].second.find_first_of("+", pos);
+ std::size_t next_pos = value.find_first_of("+", pos);
if (next_pos == std::string::npos) {
- next_pos = options[i].second.size();
+ next_pos = value.size();
}
if (next_pos > pos)
file_options.field_listener_options.forbidden_field_listener_events
- .insert(options[i].second.substr(pos, next_pos - pos));
+ .insert(value.substr(pos, next_pos - pos));
pos = next_pos + 1;
- } while (pos < options[i].second.size());
- } else if (options[i].first == "verified_lazy") {
- file_options.unverified_lazy = false;
- } else if (options[i].first == "unverified_lazy_message_sets") {
+ } while (pos < value.size());
+ } else if (key == "unverified_lazy_message_sets") {
file_options.unverified_lazy_message_sets = true;
- } else if (options[i].first == "message_owned_arena_trial") {
+ } else if (key == "message_owned_arena_trial") {
file_options.message_owned_arena_trial = true;
- } else if (options[i].first == "force_eagerly_verified_lazy") {
+ } else if (key == "force_eagerly_verified_lazy") {
file_options.force_eagerly_verified_lazy = true;
- } else if (options[i].first == "experimental_tail_call_table_mode") {
- if (options[i].second == "never") {
+ } else if (key == "experimental_tail_call_table_mode") {
+ if (value == "never") {
file_options.tctable_mode = Options::kTCTableNever;
- } else if (options[i].second == "guarded") {
+ } else if (value == "guarded") {
file_options.tctable_mode = Options::kTCTableGuarded;
- } else if (options[i].second == "always") {
+ } else if (value == "always") {
file_options.tctable_mode = Options::kTCTableAlways;
} else {
- *error = "Unknown value for experimental_tail_call_table_mode: " +
- options[i].second;
+ *error =
+ "Unknown value for experimental_tail_call_table_mode: " + value;
return false;
}
} else {
- *error = "Unknown generator option: " + options[i].first;
+ *error = "Unknown generator option: " + key;
return false;
}
}
@@ -183,39 +218,51 @@
// Generate header(s).
if (file_options.proto_h) {
- std::unique_ptr<io::ZeroCopyOutputStream> output(
- generator_context->Open(basename + ".proto.h"));
+ auto output = absl::WrapUnique(
+ generator_context->Open(absl::StrCat(basename, ".proto.h")));
+
GeneratedCodeInfo annotations;
io::AnnotationProtoCollector<GeneratedCodeInfo> annotation_collector(
&annotations);
- std::string info_path = basename + ".proto.h.meta";
- io::Printer printer(
- output.get(), '$',
- file_options.annotate_headers ? &annotation_collector : nullptr);
- file_generator.GenerateProtoHeader(
- &printer, file_options.annotate_headers ? info_path : "");
+ io::Printer::Options options;
if (file_options.annotate_headers) {
- std::unique_ptr<io::ZeroCopyOutputStream> info_output(
- generator_context->Open(info_path));
+ options.annotation_collector = &annotation_collector;
+ }
+
+ io::Printer p(output.get(), options);
+ auto v = p.WithVars(CommonVars(file_options));
+
+ std::string info_path = absl::StrCat(basename, ".proto.h.meta");
+ file_generator.GenerateProtoHeader(
+ &p, file_options.annotate_headers ? info_path : "");
+
+ if (file_options.annotate_headers) {
+ auto info_output = absl::WrapUnique(generator_context->Open(info_path));
annotations.SerializeToZeroCopyStream(info_output.get());
}
}
{
- std::unique_ptr<io::ZeroCopyOutputStream> output(
- generator_context->Open(basename + ".pb.h"));
+ auto output = absl::WrapUnique(
+ generator_context->Open(absl::StrCat(basename, ".pb.h")));
+
GeneratedCodeInfo annotations;
io::AnnotationProtoCollector<GeneratedCodeInfo> annotation_collector(
&annotations);
- std::string info_path = basename + ".pb.h.meta";
- io::Printer printer(
- output.get(), '$',
- file_options.annotate_headers ? &annotation_collector : nullptr);
- file_generator.GeneratePBHeader(
- &printer, file_options.annotate_headers ? info_path : "");
+ io::Printer::Options options;
if (file_options.annotate_headers) {
- std::unique_ptr<io::ZeroCopyOutputStream> info_output(
- generator_context->Open(info_path));
+ options.annotation_collector = &annotation_collector;
+ }
+
+ io::Printer p(output.get(), options);
+ auto v = p.WithVars(CommonVars(file_options));
+
+ std::string info_path = absl::StrCat(basename, ".pb.h.meta");
+ file_generator.GeneratePBHeader(
+ &p, file_options.annotate_headers ? info_path : "");
+
+ if (file_options.annotate_headers) {
+ auto info_output = absl::WrapUnique(generator_context->Open(info_path));
annotations.SerializeToZeroCopyStream(info_output.get());
}
}
@@ -225,10 +272,12 @@
{
// This is the global .cc file, containing
// enum/services/tables/reflection
- std::unique_ptr<io::ZeroCopyOutputStream> output(
- generator_context->Open(basename + ".pb.cc"));
- io::Printer printer(output.get(), '$');
- file_generator.GenerateGlobalSource(&printer);
+ auto output = absl::WrapUnique(
+ generator_context->Open(absl::StrCat(basename, ".pb.cc")));
+ io::Printer p(output.get());
+ auto v = p.WithVars(CommonVars(file_options));
+
+ file_generator.GenerateGlobalSource(&p);
}
int num_cc_files =
@@ -244,35 +293,43 @@
"and extensions.";
num_cc_files = file_options.num_cc_files;
}
+
int cc_file_number = 0;
- for (int i = 0; i < file_generator.NumMessages(); i++) {
- std::unique_ptr<io::ZeroCopyOutputStream> output(generator_context->Open(
+ for (int i = 0; i < file_generator.NumMessages(); ++i) {
+ auto output = absl::WrapUnique(generator_context->Open(
NumberedCcFileName(basename, cc_file_number++)));
- io::Printer printer(output.get(), '$');
- file_generator.GenerateSourceForMessage(i, &printer);
+ io::Printer p(output.get());
+ auto v = p.WithVars(CommonVars(file_options));
+
+ file_generator.GenerateSourceForMessage(i, &p);
}
- for (int i = 0; i < file_generator.NumExtensions(); i++) {
- std::unique_ptr<io::ZeroCopyOutputStream> output(generator_context->Open(
+
+ for (int i = 0; i < file_generator.NumExtensions(); ++i) {
+ auto output = absl::WrapUnique(generator_context->Open(
NumberedCcFileName(basename, cc_file_number++)));
- io::Printer printer(output.get(), '$');
- file_generator.GenerateSourceForExtension(i, &printer);
+ io::Printer p(output.get());
+ auto v = p.WithVars(CommonVars(file_options));
+
+ file_generator.GenerateSourceForExtension(i, &p);
}
+
// Create empty placeholder files if necessary to match the expected number
// of files.
- for (; cc_file_number < num_cc_files; ++cc_file_number) {
- std::unique_ptr<io::ZeroCopyOutputStream> output(generator_context->Open(
- NumberedCcFileName(basename, cc_file_number)));
+ while (cc_file_number < num_cc_files) {
+ (void)absl::WrapUnique(generator_context->Open(
+ NumberedCcFileName(basename, cc_file_number++)));
}
} else {
- std::unique_ptr<io::ZeroCopyOutputStream> output(
- generator_context->Open(basename + ".pb.cc"));
- io::Printer printer(output.get(), '$');
- file_generator.GenerateSource(&printer);
+ auto output = absl::WrapUnique(
+ generator_context->Open(absl::StrCat(basename, ".pb.cc")));
+ io::Printer p(output.get());
+ auto v = p.WithVars(CommonVars(file_options));
+
+ file_generator.GenerateSource(&p);
}
return true;
}
-
} // namespace cpp
} // namespace compiler
} // namespace protobuf
diff --git a/src/google/protobuf/compiler/cpp/generator.h b/src/google/protobuf/compiler/cpp/generator.h
index 1a374b9..aa4ee82 100644
--- a/src/google/protobuf/compiler/cpp/generator.h
+++ b/src/google/protobuf/compiler/cpp/generator.h
@@ -38,24 +38,27 @@
#define GOOGLE_PROTOBUF_COMPILER_CPP_GENERATOR_H__
#include <string>
-#include <google/protobuf/compiler/code_generator.h>
+#include <utility>
+
+#include "google/protobuf/compiler/code_generator.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
namespace compiler {
namespace cpp {
-
// CodeGenerator implementation which generates a C++ source file and
// header. If you create your own protocol compiler binary and you want
// it to support C++ output, you can do so by registering an instance of this
// CodeGenerator with the CommandLineInterface in your main() function.
class PROTOC_EXPORT CppGenerator : public CodeGenerator {
public:
- CppGenerator();
- ~CppGenerator() override;
+ CppGenerator() = default;
+ CppGenerator(const CppGenerator&) = delete;
+ CppGenerator& operator=(const CppGenerator&) = delete;
+ ~CppGenerator() override = default;
enum class Runtime {
kGoogle3, // Use the internal google3 runtime.
@@ -74,34 +77,29 @@
// If set to a non-empty string, generated code will do:
// #include "<BASE>/google/protobuf/message.h"
// instead of:
- // #include <google/protobuf/message.h>
+ // #include "google/protobuf/message.h"
// This has no effect if opensource_runtime = false.
- void set_runtime_include_base(const std::string& base) {
- runtime_include_base_ = base;
+ void set_runtime_include_base(std::string base) {
+ runtime_include_base_ = std::move(base);
}
- // implements CodeGenerator ----------------------------------------
bool Generate(const FileDescriptor* file, const std::string& parameter,
GeneratorContext* generator_context,
std::string* error) const override;
uint64_t GetSupportedFeatures() const override {
- // We don't fully support this yet, but this is needed to unblock the tests,
- // and we will have full support before the experimental flag is removed.
return FEATURE_PROTO3_OPTIONAL;
}
private:
- bool opensource_runtime_ = true;
+ bool opensource_runtime_ = PROTO2_IS_OSS;
std::string runtime_include_base_;
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CppGenerator);
};
-
} // namespace cpp
} // namespace compiler
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_COMPILER_CPP_GENERATOR_H__
diff --git a/src/google/protobuf/compiler/cpp/helpers.cc b/src/google/protobuf/compiler/cpp/helpers.cc
index 4b7c5c9..c89a48d 100644
--- a/src/google/protobuf/compiler/cpp/helpers.cc
+++ b/src/google/protobuf/compiler/cpp/helpers.cc
@@ -32,35 +32,46 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/compiler/cpp/helpers.h>
+#include "google/protobuf/compiler/cpp/helpers.h"
+#include <algorithm>
#include <cstdint>
#include <functional>
#include <limits>
#include <map>
#include <memory>
#include <queue>
-#include <unordered_set>
+#include <set>
+#include <string>
+#include <utility>
#include <vector>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/compiler/cpp/names.h>
-#include <google/protobuf/compiler/cpp/options.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/compiler/scc.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/dynamic_message.h>
-#include <google/protobuf/wire_format.h>
-#include <google/protobuf/wire_format_lite.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/substitute.h>
-#include <google/protobuf/stubs/hash.h>
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/compiler/scc.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/io/zero_copy_stream.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/dynamic_message.h"
+#include "google/protobuf/wire_format.h"
+#include "google/protobuf/wire_format_lite.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "absl/container/flat_hash_map.h"
+#include "absl/container/flat_hash_set.h"
+#include "absl/strings/ascii.h"
+#include "absl/strings/escaping.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/str_replace.h"
+#include "absl/strings/string_view.h"
+#include "absl/strings/substitute.h"
+#include "absl/synchronization/mutex.h"
+#include "google/protobuf/compiler/cpp/names.h"
+#include "google/protobuf/compiler/cpp/options.h"
+#include "google/protobuf/descriptor.pb.h"
+
// Must be last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -72,11 +83,12 @@
static const char kAnyMessageName[] = "Any";
static const char kAnyProtoFile[] = "google/protobuf/any.proto";
-std::string DotsToColons(const std::string& name) {
- return StringReplace(name, ".", "::", true);
+std::string DotsToColons(absl::string_view name) {
+ return absl::StrReplaceAll(name, {{".", "::"}});
}
-static const char* const kKeywordList[] = { //
+static const char* const kKeywordList[] = {
+ //
"NULL",
"alignas",
"alignof",
@@ -159,48 +171,43 @@
"wchar_t",
"while",
"xor",
- "xor_eq"};
+ "xor_eq",
+#ifdef PROTOBUF_FUTURE_CPP20_KEYWORDS // C++20 keywords.
+ "char8_t",
+ "char16_t",
+ "char32_t",
+ "concept",
+ "consteval",
+ "constinit",
+ "co_await",
+ "co_return",
+ "co_yield",
+ "requires",
+#endif // !PROTOBUF_FUTURE_BREAKING_CHANGES
+};
-static std::unordered_set<std::string>* MakeKeywordsMap() {
- auto* result = new std::unordered_set<std::string>();
- for (const auto keyword : kKeywordList) {
- result->emplace(keyword);
- }
- return result;
+const absl::flat_hash_set<std::string>& Keywords() {
+ static const auto* keywords = [] {
+ auto* keywords = new absl::flat_hash_set<std::string>();
+
+ for (const auto keyword : kKeywordList) {
+ keywords->emplace(keyword);
+ }
+ return keywords;
+ }();
+ return *keywords;
}
-static std::unordered_set<std::string>& kKeywords = *MakeKeywordsMap();
-
std::string IntTypeName(const Options& options, const std::string& type) {
return type + "_t";
}
-void SetIntVar(const Options& options, const std::string& type,
- std::map<std::string, std::string>* variables) {
- (*variables)[type] = IntTypeName(options, type);
-}
-
// Returns true if the message can potentially allocate memory for its field.
// This is used to determine if message-owned arena will be useful.
bool AllocExpected(const Descriptor* descriptor) {
return false;
}
-// Describes different approaches to detect non-canonical int32 encoding. Only
-// kNever or kAlways is eligible for *simple* verification methods.
-enum class VerifyInt32Type {
- kCustom, // Only check if field number matches.
- kNever, // Do not check.
- kAlways, // Always check.
-};
-
-inline VerifySimpleType VerifyInt32TypeToVerifyCustom(VerifyInt32Type t) {
- static VerifySimpleType kCustomTypes[] = {
- VerifySimpleType::kCustom, VerifySimpleType::kCustomInt32Never,
- VerifySimpleType::kCustomInt32Always};
- return kCustomTypes[static_cast<int32_t>(t) -
- static_cast<int32_t>(VerifyInt32Type::kCustom)];
-}
} // namespace
@@ -228,43 +235,6 @@
return false;
}
-void SetCommonVars(const Options& options,
- std::map<std::string, std::string>* variables) {
- (*variables)["proto_ns"] = ProtobufNamespace(options);
-
- // Warning: there is some clever naming/splitting here to avoid extract script
- // rewrites. The names of these variables must not be things that the extract
- // script will rewrite. That's why we use "CHK" (for example) instead of
- // "GOOGLE_CHECK".
- if (options.opensource_runtime) {
- (*variables)["GOOGLE_PROTOBUF"] = "GOOGLE_PROTOBUF";
- (*variables)["CHK"] = "GOOGLE_CHECK";
- (*variables)["DCHK"] = "GOOGLE_DCHECK";
- } else {
- // These values are things the extract script would rewrite if we did not
- // split them. It might not strictly matter since we don't generate google3
- // code in open-source. But it's good to prevent surprising things from
- // happening.
- (*variables)["GOOGLE_PROTOBUF"] =
- "GOOGLE3"
- "_PROTOBUF";
- (*variables)["CHK"] =
- "CH"
- "ECK";
- (*variables)["DCHK"] =
- "DCH"
- "ECK";
- }
-
- SetIntVar(options, "int8", variables);
- SetIntVar(options, "uint8", variables);
- SetIntVar(options, "uint32", variables);
- SetIntVar(options, "uint64", variables);
- SetIntVar(options, "int32", variables);
- SetIntVar(options, "int64", variables);
- (*variables)["string"] = "std::string";
-}
-
void SetCommonMessageDataVariables(
const Descriptor* descriptor,
std::map<std::string, std::string>* variables) {
@@ -399,7 +369,7 @@
std::string ExtensionName(const FieldDescriptor* d) {
if (const Descriptor* scope = d->extension_scope())
- return StrCat(ClassName(scope), "::", ResolveKeyword(d->name()));
+ return absl::StrCat(ClassName(scope), "::", ResolveKeyword(d->name()));
return ResolveKeyword(d->name());
}
@@ -494,7 +464,7 @@
}
std::string ResolveKeyword(const std::string& name) {
- if (kKeywords.count(name) > 0) {
+ if (Keywords().count(name) > 0) {
return name + "_";
}
return name;
@@ -502,23 +472,23 @@
std::string FieldName(const FieldDescriptor* field) {
std::string result = field->name();
- LowerString(&result);
- if (kKeywords.count(result) > 0) {
+ absl::AsciiStrToLower(&result);
+ if (Keywords().count(result) > 0) {
result.append("_");
}
return result;
}
std::string FieldMemberName(const FieldDescriptor* field, bool split) {
- StringPiece prefix =
+ absl::string_view prefix =
IsMapEntryMessage(field->containing_type()) ? "" : "_impl_.";
- StringPiece split_prefix = split ? "_split_->" : "";
+ absl::string_view split_prefix = split ? "_split_->" : "";
if (field->real_containing_oneof() == nullptr) {
- return StrCat(prefix, split_prefix, FieldName(field), "_");
+ return absl::StrCat(prefix, split_prefix, FieldName(field), "_");
}
// Oneof fields are never split.
GOOGLE_CHECK(!split);
- return StrCat(prefix, field->containing_oneof()->name(), "_.",
+ return absl::StrCat(prefix, field->containing_oneof()->name(), "_.",
FieldName(field), "_");
}
@@ -532,12 +502,12 @@
GOOGLE_DCHECK(field->containing_oneof());
const std::string qualification =
QualifiedClassName(field->containing_type());
- return StrCat(qualification, "::", OneofCaseConstantName(field));
+ return absl::StrCat(qualification, "::", OneofCaseConstantName(field));
}
std::string EnumValueName(const EnumValueDescriptor* enum_value) {
std::string result = enum_value->name();
- if (kKeywords.count(result) > 0) {
+ if (Keywords().count(result) > 0) {
result.append("_");
}
return result;
@@ -577,7 +547,7 @@
// This field's camelcase name is not unique. As a hack, add the field
// number to the constant name. This makes the constant rather useless,
// but what can we do?
- result += "_" + StrCat(field->number());
+ result += "_" + absl::StrCat(field->number());
}
return result;
@@ -713,9 +683,9 @@
if (number == std::numeric_limits<int32_t>::min()) {
// This needs to be special-cased, see explanation here:
// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52661
- return StrCat(number + 1, " - 1");
+ return absl::StrCat(number + 1, " - 1");
} else {
- return StrCat(number);
+ return absl::StrCat(number);
}
}
@@ -723,13 +693,13 @@
if (number == std::numeric_limits<int64_t>::min()) {
// This needs to be special-cased, see explanation here:
// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52661
- return StrCat("int64_t{", number + 1, "} - 1");
+ return absl::StrCat("int64_t{", number + 1, "} - 1");
}
- return StrCat("int64_t{", number, "}");
+ return absl::StrCat("int64_t{", number, "}");
}
static std::string UInt64ToString(uint64_t number) {
- return StrCat("uint64_t{", number, "u}");
+ return absl::StrCat("uint64_t{", number, "u}");
}
std::string DefaultValue(const FieldDescriptor* field) {
@@ -741,7 +711,7 @@
case FieldDescriptor::CPPTYPE_INT32:
return Int32ToString(field->default_value_int32());
case FieldDescriptor::CPPTYPE_UINT32:
- return StrCat(field->default_value_uint32()) + "u";
+ return absl::StrCat(field->default_value_uint32()) + "u";
case FieldDescriptor::CPPTYPE_INT64:
return Int64ToString(field->default_value_int64());
case FieldDescriptor::CPPTYPE_UINT64:
@@ -782,12 +752,12 @@
case FieldDescriptor::CPPTYPE_ENUM:
// Lazy: Generate a static_cast because we don't have a helper function
// that constructs the full name of an enum value.
- return strings::Substitute(
+ return absl::Substitute(
"static_cast< $0 >($1)", ClassName(field->enum_type(), true),
Int32ToString(field->default_value_enum()->number()));
case FieldDescriptor::CPPTYPE_STRING:
return "\"" +
- EscapeTrigraphs(CEscape(field->default_value_string())) +
+ EscapeTrigraphs(absl::CEscape(field->default_value_string())) +
"\"";
case FieldDescriptor::CPPTYPE_MESSAGE:
return "*" + FieldMessageTypeName(field, options) +
@@ -804,13 +774,13 @@
std::string FilenameIdentifier(const std::string& filename) {
std::string result;
for (int i = 0; i < filename.size(); i++) {
- if (ascii_isalnum(filename[i])) {
+ if (absl::ascii_isalnum(filename[i])) {
result.push_back(filename[i]);
} else {
// Not alphanumeric. To avoid any possibility of name conflicts we
// use the hex code for the character.
- StrAppend(&result, "_",
- strings::Hex(static_cast<uint8_t>(filename[i])));
+ absl::StrAppend(&result, "_",
+ absl::Hex(static_cast<uint8_t>(filename[i])));
}
}
return result;
@@ -826,14 +796,14 @@
const std::string& name,
const Options& options) {
if (file->package().empty()) {
- return StrCat("::", name);
+ return absl::StrCat("::", name);
}
- return StrCat(Namespace(file, options), "::", name);
+ return absl::StrCat(Namespace(file, options), "::", name);
}
// Escape C++ trigraphs by escaping question marks to \?
-std::string EscapeTrigraphs(const std::string& to_escape) {
- return StringReplace(to_escape, "?", "\\?", true);
+std::string EscapeTrigraphs(absl::string_view to_escape) {
+ return absl::StrReplaceAll(to_escape, {{"?", "\\?"}});
}
// Escaped function name to eliminate naming conflict.
@@ -842,13 +812,13 @@
const std::string& prefix) {
// Do not use FieldName() since it will escape keywords.
std::string name = field->name();
- LowerString(&name);
+ absl::AsciiStrToLower(&name);
std::string function_name = prefix + name;
if (descriptor->FindFieldByName(function_name)) {
// Single underscore will also make it conflicting with the private data
// member. We use double underscore to escape function names.
function_name.append("__");
- } else if (kKeywords.count(name) > 0) {
+ } else if (Keywords().count(name) > 0) {
// If the field name is a keyword, we append the underscore back to keep it
// consistent with other function names.
function_name.append("_");
@@ -856,6 +826,9 @@
return function_name;
}
+bool IsProfileDriven(const Options& options) {
+ return options.access_info_map != nullptr;
+}
bool IsStringInlined(const FieldDescriptor* descriptor,
const Options& options) {
(void)descriptor;
@@ -903,6 +876,13 @@
bool ShouldSplit(const Descriptor*, const Options&) { return false; }
bool ShouldSplit(const FieldDescriptor*, const Options&) { return false; }
+bool ShouldForceAllocationOnConstruction(const Descriptor* desc,
+ const Options& options) {
+ (void)desc;
+ (void)options;
+ return false;
+}
+
static bool HasRepeatedFields(const Descriptor* descriptor) {
for (int i = 0; i < descriptor->field_count(); ++i) {
if (descriptor->field(i)->label() == FieldDescriptor::LABEL_REPEATED) {
@@ -1041,7 +1021,7 @@
bool IsUtf8String(const FieldDescriptor* field) {
return IsProto3(field->file()) &&
- field->type() == FieldDescriptor::TYPE_STRING;
+ field->type() == FieldDescriptor::TYPE_STRING;
}
VerifySimpleType ShouldVerifySimple(const Descriptor* descriptor) {
@@ -1091,7 +1071,7 @@
}
bool IsWellKnownMessage(const FileDescriptor* file) {
- static const std::unordered_set<std::string> well_known_files{
+ static const auto* well_known_files = new absl::flat_hash_set<std::string>{
"google/protobuf/any.proto",
"google/protobuf/api.proto",
"google/protobuf/compiler/plugin.proto",
@@ -1105,32 +1085,47 @@
"google/protobuf/type.proto",
"google/protobuf/wrappers.proto",
};
- return well_known_files.find(file->name()) != well_known_files.end();
+ return well_known_files->find(file->name()) != well_known_files->end();
}
-static bool FieldEnforceUtf8(const FieldDescriptor* field,
- const Options& options) {
- return true;
-}
-
-static bool FileUtf8Verification(const FileDescriptor* file,
- const Options& options) {
- return true;
-}
-
-// Which level of UTF-8 enforcemant is placed on this file.
-Utf8CheckMode GetUtf8CheckMode(const FieldDescriptor* field,
- const Options& options) {
- if (field->file()->syntax() == FileDescriptor::SYNTAX_PROTO3 &&
- FieldEnforceUtf8(field, options)) {
- return Utf8CheckMode::kStrict;
- } else if (GetOptimizeFor(field->file(), options) !=
- FileOptions::LITE_RUNTIME &&
- FileUtf8Verification(field->file(), options)) {
- return Utf8CheckMode::kVerify;
- } else {
- return Utf8CheckMode::kNone;
+void NamespaceOpener::ChangeTo(absl::string_view name) {
+ std::vector<std::string> new_stack =
+ absl::StrSplit(name, "::", absl::SkipEmpty());
+ size_t len = std::min(name_stack_.size(), new_stack.size());
+ size_t common_idx = 0;
+ while (common_idx < len) {
+ if (name_stack_[common_idx] != new_stack[common_idx]) {
+ break;
+ }
+ ++common_idx;
}
+
+ for (size_t i = name_stack_.size(); i > common_idx; i--) {
+ const auto& ns = name_stack_[i - 1];
+ if (ns == "PROTOBUF_NAMESPACE_ID") {
+ p_->Emit(R"cc(
+ PROTOBUF_NAMESPACE_CLOSE
+ )cc");
+ } else {
+ p_->Emit({{"ns", ns}}, R"(
+ } // namespace $ns$
+ )");
+ }
+ }
+ for (size_t i = common_idx; i < new_stack.size(); ++i) {
+ const auto& ns = new_stack[i];
+ if (ns == "PROTOBUF_NAMESPACE_ID") {
+ p_->Emit(R"cc(
+ PROTOBUF_NAMESPACE_OPEN
+ )cc");
+ } else {
+ p_->Emit({{"ns", ns}}, R"(
+ namespace $ns$ {
+ )");
+ }
+ }
+
+ name_stack_ = std::move(new_stack);
}
static void GenerateUtf8CheckCode(const FieldDescriptor* field,
@@ -1139,8 +1134,10 @@
const char* strict_function,
const char* verify_function,
const Formatter& format) {
- switch (GetUtf8CheckMode(field, options)) {
- case Utf8CheckMode::kStrict: {
+ switch (internal::cpp::GetUtf8CheckMode(
+ field,
+ GetOptimizeFor(field->file(), options) == FileOptions::LITE_RUNTIME)) {
+ case internal::cpp::Utf8CheckMode::kStrict: {
if (for_parse) {
format("DO_(");
}
@@ -1160,7 +1157,7 @@
format.Outdent();
break;
}
- case Utf8CheckMode::kVerify: {
+ case internal::cpp::Utf8CheckMode::kVerify: {
format("::$proto_ns$::internal::WireFormat::$1$(\n", verify_function);
format.Indent();
format(parameters);
@@ -1173,7 +1170,7 @@
format.Outdent();
break;
}
- case Utf8CheckMode::kNone:
+ case internal::cpp::Utf8CheckMode::kNone:
break;
}
}
@@ -1343,16 +1340,19 @@
return false;
}
- std::unordered_map<std::string, std::string> bootstrap_mapping{
- {"net/proto2/proto/descriptor",
- "third_party/protobuf/descriptor"},
- {"net/proto2/compiler/proto/plugin",
- "net/proto2/compiler/proto/plugin"},
- {"net/proto2/compiler/proto/profile",
- "net/proto2/compiler/proto/profile_bootstrap"},
- };
- auto iter = bootstrap_mapping.find(basename);
- if (iter == bootstrap_mapping.end()) {
+ static const auto* bootstrap_mapping =
+ // TODO(b/242858704) Replace these with string_view once we remove
+ // StringPiece.
+ new absl::flat_hash_map<std::string, std::string>{
+ {"net/proto2/proto/descriptor",
+ "third_party/protobuf/descriptor"},
+ {"net/proto2/compiler/proto/plugin",
+ "net/proto2/compiler/proto/plugin"},
+ {"net/proto2/compiler/proto/profile",
+ "net/proto2/compiler/proto/profile_bootstrap"},
+ };
+ auto iter = bootstrap_mapping->find(basename);
+ if (iter == bootstrap_mapping->end()) {
*bootstrap_basename = basename;
return false;
} else {
@@ -1377,70 +1377,64 @@
// Adjust basename, but don't abort code generation.
*basename = bootstrap_basename;
return false;
- } else {
- const std::string& forward_to_basename = bootstrap_basename;
-
- // Generate forwarding headers and empty .pb.cc.
- {
- std::unique_ptr<io::ZeroCopyOutputStream> output(
- generator_context->Open(*basename + ".pb.h"));
- io::Printer printer(output.get(), '$', nullptr);
- printer.Print(
- "#ifndef PROTOBUF_INCLUDED_$filename_identifier$_FORWARD_PB_H\n"
- "#define PROTOBUF_INCLUDED_$filename_identifier$_FORWARD_PB_H\n"
- "#include \"$forward_to_basename$.pb.h\" // IWYU pragma: export\n"
- "#endif // PROTOBUF_INCLUDED_$filename_identifier$_FORWARD_PB_H\n",
- "forward_to_basename", forward_to_basename, "filename_identifier",
- FilenameIdentifier(*basename));
-
- if (!options.opensource_runtime) {
- // HACK HACK HACK, tech debt from the deeps of proto1 and SWIG
- // protocoltype is SWIG'ed and we need to forward
- if (*basename == "net/proto/protocoltype") {
- printer.Print(
- "#ifdef SWIG\n"
- "%include \"$forward_to_basename$.pb.h\"\n"
- "#endif // SWIG\n",
- "forward_to_basename", forward_to_basename);
- }
- }
- }
-
- {
- std::unique_ptr<io::ZeroCopyOutputStream> output(
- generator_context->Open(*basename + ".proto.h"));
- io::Printer printer(output.get(), '$', nullptr);
- printer.Print(
- "#ifndef PROTOBUF_INCLUDED_$filename_identifier$_FORWARD_PROTO_H\n"
- "#define PROTOBUF_INCLUDED_$filename_identifier$_FORWARD_PROTO_H\n"
- "#include \"$forward_to_basename$.proto.h\" // IWYU pragma: "
- "export\n"
- "#endif // "
- "PROTOBUF_INCLUDED_$filename_identifier$_FORWARD_PROTO_H\n",
- "forward_to_basename", forward_to_basename, "filename_identifier",
- FilenameIdentifier(*basename));
- }
-
- {
- std::unique_ptr<io::ZeroCopyOutputStream> output(
- generator_context->Open(*basename + ".pb.cc"));
- io::Printer printer(output.get(), '$', nullptr);
- printer.Print("\n");
- }
-
- {
- std::unique_ptr<io::ZeroCopyOutputStream> output(
- generator_context->Open(*basename + ".pb.h.meta"));
- }
-
- {
- std::unique_ptr<io::ZeroCopyOutputStream> output(
- generator_context->Open(*basename + ".proto.h.meta"));
- }
-
- // Abort code generation.
- return true;
}
+
+ auto pb_h = absl::WrapUnique(
+ generator_context->Open(absl::StrCat(*basename, ".pb.h")));
+
+ io::Printer p(pb_h.get());
+ p.Emit(
+ {
+ {"fwd_to", bootstrap_basename},
+ {"file", FilenameIdentifier(*basename)},
+ {"fwd_to_suffix", options.opensource_runtime ? "pb" : "proto"},
+ {"swig_evil",
+ [&] {
+ if (options.opensource_runtime) {
+ return;
+ }
+ p.Emit(R"(
+ #ifdef SWIG
+ %include "$fwd_to$.pb.h"
+ #endif // SWIG
+ )");
+ }},
+ },
+ R"(
+ #ifndef PROTOBUF_INCLUDED_$file$_FORWARD_PB_H
+ #define PROTOBUF_INCLUDED_$file$_FORWARD_PB_H
+ #include "$fwd_to$.$fwd_to_suffix$.h" // IWYU pragma: export
+ #endif // PROTOBUF_INCLUDED_$file$_FORWARD_PB_H
+ $swig_evil$;
+ )");
+
+ auto proto_h = absl::WrapUnique(
+ generator_context->Open(absl::StrCat(*basename, ".proto.h")));
+ io::Printer(proto_h.get())
+ .Emit(
+ {
+ {"fwd_to", bootstrap_basename},
+ {"file", FilenameIdentifier(*basename)},
+ },
+ R"(
+ #ifndef PROTOBUF_INCLUDED_$file$_FORWARD_PROTO_H
+ #define PROTOBUF_INCLUDED_$file$_FORWARD_PROTO_H
+ #include "$fwd_to$.proto.h" // IWYU pragma: export
+ #endif // PROTOBUF_INCLUDED_$file$_FORWARD_PROTO_H
+ )");
+
+ auto pb_cc = absl::WrapUnique(
+ generator_context->Open(absl::StrCat(*basename, ".pb.cc")));
+ io::Printer(pb_cc.get()).PrintRaw("\n");
+
+ (void)absl::WrapUnique(
+ generator_context->Open(absl::StrCat(*basename, ".pb.h.meta")));
+
+ (void)absl::WrapUnique(
+ generator_context->Open(absl::StrCat(*basename, ".proto.h.meta")));
+
+ // Abort code generation.
+ return true;
}
static bool HasExtensionFromFile(const Message& msg, const FileDescriptor* file,
@@ -1488,9 +1482,18 @@
static bool HasBootstrapProblem(const FileDescriptor* file,
const Options& options,
bool* has_opt_codesize_extension) {
- static auto& cache = *new std::unordered_map<const FileDescriptor*, bool>;
- auto it = cache.find(file);
- if (it != cache.end()) return it->second;
+ struct BoostrapGlobals {
+ absl::Mutex mutex;
+ absl::flat_hash_set<const FileDescriptor*> cached ABSL_GUARDED_BY(mutex);
+ absl::flat_hash_set<const FileDescriptor*> non_cached
+ ABSL_GUARDED_BY(mutex);
+ };
+ static auto& bootstrap_cache = *new BoostrapGlobals();
+
+ absl::MutexLock lock(&bootstrap_cache.mutex);
+ if (bootstrap_cache.cached.contains(file)) return true;
+ if (bootstrap_cache.non_cached.contains(file)) return false;
+
// In order to build the data structures for the reflective parse, it needs
// to parse the serialized descriptor describing all the messages defined in
// this file. Obviously this presents a bootstrap problem for descriptor
@@ -1526,9 +1529,13 @@
Message* fd_proto = factory.GetPrototype(fd_proto_descriptor)->New();
fd_proto->ParseFromString(linkedin_fd_proto.SerializeAsString());
- bool& res = cache[file];
- res = HasExtensionFromFile(*fd_proto, file, options,
- has_opt_codesize_extension);
+ bool res = HasExtensionFromFile(*fd_proto, file, options,
+ has_opt_codesize_extension);
+ if (res) {
+ bootstrap_cache.cached.insert(file);
+ } else {
+ bootstrap_cache.non_cached.insert(file);
+ }
delete fd_proto;
return res;
}
diff --git a/src/google/protobuf/compiler/cpp/helpers.h b/src/google/protobuf/compiler/cpp/helpers.h
index d8dcda7..251214f 100644
--- a/src/google/protobuf/compiler/cpp/helpers.h
+++ b/src/google/protobuf/compiler/cpp/helpers.h
@@ -41,18 +41,22 @@
#include <map>
#include <string>
-#include <google/protobuf/compiler/scc.h>
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/compiler/cpp/names.h>
-#include <google/protobuf/compiler/cpp/options.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/port.h>
-#include <google/protobuf/stubs/strutil.h>
+#include "google/protobuf/compiler/scc.h"
+#include "google/protobuf/compiler/code_generator.h"
+#include "absl/container/flat_hash_map.h"
+#include "absl/strings/match.h"
+#include "absl/strings/str_split.h"
+#include "google/protobuf/compiler/cpp/names.h"
+#include "google/protobuf/compiler/cpp/options.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/port.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "absl/strings/str_cat.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -84,9 +88,6 @@
extern const char kThickSeparator[];
extern const char kThinSeparator[];
-void SetCommonVars(const Options& options,
- std::map<std::string, std::string>* variables);
-
// Variables to access message data from the message scope.
void SetCommonMessageDataVariables(
const Descriptor* descriptor,
@@ -220,7 +221,7 @@
std::string FieldMessageTypeName(const FieldDescriptor* field,
const Options& options);
-// Get the C++ type name for a primitive type (e.g. "double", "::google::protobuf::int32", etc.).
+// Get the C++ type name for a primitive type (e.g. "double", "::int32", etc.).
const char* PrimitiveTypeName(FieldDescriptor::CppType type);
std::string PrimitiveTypeName(const Options& options,
FieldDescriptor::CppType type);
@@ -296,7 +297,7 @@
const Options& options);
// Escape C++ trigraphs by escaping question marks to \?
-std::string EscapeTrigraphs(const std::string& to_escape);
+std::string EscapeTrigraphs(absl::string_view to_escape);
// Escaped function name to eliminate naming conflict.
std::string SafeFunctionName(const Descriptor* descriptor,
@@ -327,6 +328,8 @@
return false;
}
+bool IsProfileDriven(const Options& options);
+
bool IsStringInlined(const FieldDescriptor* descriptor, const Options& options);
// For a string field, returns the effective ctype. If the actual ctype is
@@ -377,6 +380,11 @@
// Is the given field being split out?
bool ShouldSplit(const FieldDescriptor* field, const Options& options);
+// Should we generate code that force creating an allocation in the constructor
+// of the given message?
+bool ShouldForceAllocationOnConstruction(const Descriptor* desc,
+ const Options& options);
+
inline bool IsFieldUsed(const FieldDescriptor* /* field */,
const Options& /* options */) {
return true;
@@ -455,35 +463,13 @@
return file->syntax() == FileDescriptor::SYNTAX_PROTO3;
}
-inline bool HasHasbit(const FieldDescriptor* field) {
- // This predicate includes proto3 message fields only if they have "optional".
- // Foo submsg1 = 1; // HasHasbit() == false
- // optional Foo submsg2 = 2; // HasHasbit() == true
- // This is slightly odd, as adding "optional" to a singular proto3 field does
- // not change the semantics or API. However whenever any field in a message
- // has a hasbit, it forces reflection to include hasbit offsets for *all*
- // fields, even if almost all of them are set to -1 (no hasbit). So to avoid
- // causing a sudden size regression for ~all proto3 messages, we give proto3
- // message fields a hasbit only if "optional" is present. If the user is
- // explicitly writing "optional", it is likely they are writing it on
- // primitive fields also.
- return (field->has_optional_keyword() || field->is_required()) &&
- !field->options().weak();
-}
-
-// Returns true if 'enum' semantics are such that unknown values are preserved
-// in the enum field itself, rather than going to the UnknownFieldSet.
-inline bool HasPreservingUnknownEnumSemantics(const FieldDescriptor* field) {
- return field->file()->syntax() == FileDescriptor::SYNTAX_PROTO3;
-}
-
inline bool IsCrossFileMessage(const FieldDescriptor* field) {
return field->type() == FieldDescriptor::TYPE_MESSAGE &&
field->message_type()->file() != field->file();
}
inline std::string MakeDefaultName(const FieldDescriptor* field) {
- return StrCat("_i_give_permission_to_break_this_code_default_",
+ return absl::StrCat("_i_give_permission_to_break_this_code_default_",
FieldName(field), "_");
}
@@ -498,11 +484,11 @@
// exists at some nested level like:
// internal_container_._i_give_permission_to_break_this_code_default_field_;
inline std::string MakeDefaultFieldName(const FieldDescriptor* field) {
- return StrCat("Impl_::", MakeDefaultName(field));
+ return absl::StrCat("Impl_::", MakeDefaultName(field));
}
inline std::string MakeVarintCachedSizeName(const FieldDescriptor* field) {
- return StrCat("_", FieldName(field), "_cached_byte_size_");
+ return absl::StrCat("_", FieldName(field), "_cached_byte_size_");
}
// Semantically distinct from MakeVarintCachedSizeName in that it gives the C++
@@ -518,7 +504,7 @@
// internal_container_._field_cached_byte_size_;
inline std::string MakeVarintCachedSizeFieldName(const FieldDescriptor* field,
bool split) {
- return StrCat("_impl_.", split ? "_split_->" : "", "_",
+ return absl::StrCat("_impl_.", split ? "_split_->" : "", "_",
FieldName(field), "_cached_byte_size_");
}
@@ -531,12 +517,26 @@
bool IsWellKnownMessage(const FileDescriptor* descriptor);
-inline std::string IncludeGuard(const FileDescriptor* file, bool pb_h,
+enum class GeneratedFileType : int { kPbH, kProtoH, kProtoStaticReflectionH };
+
+inline std::string IncludeGuard(const FileDescriptor* file,
+ GeneratedFileType file_type,
const Options& options) {
// If we are generating a .pb.h file and the proto_h option is enabled, then
// the .pb.h gets an extra suffix.
- std::string filename_identifier = FilenameIdentifier(
- file->name() + (pb_h && options.proto_h ? ".pb.h" : ""));
+ std::string extension;
+ switch (file_type) {
+ case GeneratedFileType::kPbH:
+ extension = ".pb.h";
+ break;
+ case GeneratedFileType::kProtoH:
+ extension = ".proto.h";
+ break;
+ case GeneratedFileType::kProtoStaticReflectionH:
+ extension = ".proto.static_reflection.h";
+ }
+ std::string filename_identifier =
+ FilenameIdentifier(file->name() + extension);
if (IsWellKnownMessage(file)) {
// For well-known messages we need third_party/protobuf and net/proto2 to
@@ -850,9 +850,9 @@
template <typename I, typename = typename std::enable_if<
std::is_integral<I>::value>::type>
static std::string ToString(I x) {
- return StrCat(x);
+ return absl::StrCat(x);
}
- static std::string ToString(strings::Hex x) { return StrCat(x); }
+ static std::string ToString(absl::Hex x) { return absl::StrCat(x); }
static std::string ToString(const FieldDescriptor* d) { return Payload(d); }
static std::string ToString(const Descriptor* d) { return Payload(d); }
static std::string ToString(const EnumDescriptor* d) { return Payload(d); }
@@ -888,55 +888,24 @@
class PROTOC_EXPORT NamespaceOpener {
public:
- explicit NamespaceOpener(const Formatter& format)
- : printer_(format.printer()) {}
- NamespaceOpener(const std::string& name, const Formatter& format)
+ explicit NamespaceOpener(io::Printer* p) : p_(p) {}
+ explicit NamespaceOpener(const Formatter& format) : p_(format.printer()) {}
+ NamespaceOpener(absl::string_view name, const Formatter& format)
: NamespaceOpener(format) {
ChangeTo(name);
}
+ NamespaceOpener(absl::string_view name, io::Printer* p) : NamespaceOpener(p) {
+ ChangeTo(name);
+ }
~NamespaceOpener() { ChangeTo(""); }
- void ChangeTo(const std::string& name) {
- std::vector<std::string> new_stack_ =
- Split(name, "::", true);
- size_t len = std::min(name_stack_.size(), new_stack_.size());
- size_t common_idx = 0;
- while (common_idx < len) {
- if (name_stack_[common_idx] != new_stack_[common_idx]) break;
- common_idx++;
- }
- for (auto it = name_stack_.crbegin();
- it != name_stack_.crend() - common_idx; ++it) {
- if (*it == "PROTOBUF_NAMESPACE_ID") {
- printer_->Print("PROTOBUF_NAMESPACE_CLOSE\n");
- } else {
- printer_->Print("} // namespace $ns$\n", "ns", *it);
- }
- }
- name_stack_.swap(new_stack_);
- for (size_t i = common_idx; i < name_stack_.size(); ++i) {
- if (name_stack_[i] == "PROTOBUF_NAMESPACE_ID") {
- printer_->Print("PROTOBUF_NAMESPACE_OPEN\n");
- } else {
- printer_->Print("namespace $ns$ {\n", "ns", name_stack_[i]);
- }
- }
- }
+ void ChangeTo(absl::string_view name);
private:
- io::Printer* printer_;
+ io::Printer* p_;
std::vector<std::string> name_stack_;
};
-enum class Utf8CheckMode {
- kStrict = 0, // Parsing will fail if non UTF-8 data is in string fields.
- kVerify = 1, // Only log an error but parsing will succeed.
- kNone = 2, // No UTF-8 check.
-};
-
-Utf8CheckMode GetUtf8CheckMode(const FieldDescriptor* field,
- const Options& options);
-
void GenerateUtf8CheckCodeForString(const FieldDescriptor* field,
const Options& options, bool for_parse,
const char* parameters,
@@ -947,43 +916,6 @@
const char* parameters,
const Formatter& format);
-template <typename T>
-struct FieldRangeImpl {
- struct Iterator {
- using iterator_category = std::forward_iterator_tag;
- using value_type = const FieldDescriptor*;
- using difference_type = int;
-
- value_type operator*() { return descriptor->field(idx); }
-
- friend bool operator==(const Iterator& a, const Iterator& b) {
- GOOGLE_DCHECK(a.descriptor == b.descriptor);
- return a.idx == b.idx;
- }
- friend bool operator!=(const Iterator& a, const Iterator& b) {
- return !(a == b);
- }
-
- Iterator& operator++() {
- idx++;
- return *this;
- }
-
- int idx;
- const T* descriptor;
- };
-
- Iterator begin() const { return {0, descriptor}; }
- Iterator end() const { return {descriptor->field_count(), descriptor}; }
-
- const T* descriptor;
-};
-
-template <typename T>
-FieldRangeImpl<T> FieldRange(const T* desc) {
- return {desc};
-}
-
struct OneOfRangeImpl {
struct Iterator {
using iterator_category = std::forward_iterator_tag;
@@ -1059,6 +991,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_COMPILER_CPP_HELPERS_H__
diff --git a/src/google/protobuf/compiler/cpp/map_field.cc b/src/google/protobuf/compiler/cpp/map_field.cc
index 3a55ef5..ab8501d 100644
--- a/src/google/protobuf/compiler/cpp/map_field.cc
+++ b/src/google/protobuf/compiler/cpp/map_field.cc
@@ -28,24 +28,19 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/compiler/cpp/map_field.h>
+#include "google/protobuf/compiler/cpp/map_field.h"
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/wire_format.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/compiler/cpp/helpers.h>
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/wire_format.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "absl/strings/ascii.h"
+#include "google/protobuf/compiler/cpp/helpers.h"
namespace google {
namespace protobuf {
namespace compiler {
namespace cpp {
-
-bool IsProto3Field(const FieldDescriptor* field_descriptor) {
- const FileDescriptor* file_descriptor = field_descriptor->file();
- return file_descriptor->syntax() == FileDescriptor::SYNTAX_PROTO3;
-}
-
void SetMessageVariables(const FieldDescriptor* descriptor,
std::map<std::string, std::string>* variables,
const Options& options) {
@@ -67,12 +62,12 @@
(*variables)["val_cpp"] = PrimitiveTypeName(options, val->cpp_type());
}
(*variables)["key_wire_type"] =
- "TYPE_" + ToUpper(DeclaredTypeMethodName(key->type()));
+ "TYPE_" + absl::AsciiStrToUpper(DeclaredTypeMethodName(key->type()));
(*variables)["val_wire_type"] =
- "TYPE_" + ToUpper(DeclaredTypeMethodName(val->type()));
+ "TYPE_" + absl::AsciiStrToUpper(DeclaredTypeMethodName(val->type()));
(*variables)["map_classname"] = ClassName(descriptor->message_type(), false);
- (*variables)["number"] = StrCat(descriptor->number());
- (*variables)["tag"] = StrCat(internal::WireFormat::MakeTag(descriptor));
+ (*variables)["number"] = absl::StrCat(descriptor->number());
+ (*variables)["tag"] = absl::StrCat(internal::WireFormat::MakeTag(descriptor));
if (HasDescriptorMethods(descriptor->file(), options)) {
(*variables)["lite"] = "";
diff --git a/src/google/protobuf/compiler/cpp/map_field.h b/src/google/protobuf/compiler/cpp/map_field.h
index 678a128..06f3e0a 100644
--- a/src/google/protobuf/compiler/cpp/map_field.h
+++ b/src/google/protobuf/compiler/cpp/map_field.h
@@ -34,8 +34,8 @@
#include <map>
#include <string>
-#include <google/protobuf/compiler/cpp/helpers.h>
-#include <google/protobuf/compiler/cpp/message_field.h>
+#include "google/protobuf/compiler/cpp/helpers.h"
+#include "google/protobuf/compiler/cpp/message_field.h"
namespace google {
namespace protobuf {
@@ -46,6 +46,8 @@
public:
MapFieldGenerator(const FieldDescriptor* descriptor, const Options& options,
MessageSCCAnalyzer* scc_analyzer);
+ MapFieldGenerator(const MapFieldGenerator&) = delete;
+ MapFieldGenerator& operator=(const MapFieldGenerator&) = delete;
~MapFieldGenerator() override;
// implements FieldGenerator ---------------------------------------
@@ -71,8 +73,6 @@
private:
const bool has_required_fields_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MapFieldGenerator);
};
} // namespace cpp
diff --git a/src/google/protobuf/compiler/cpp/message.cc b/src/google/protobuf/compiler/cpp/message.cc
index 69069da..f450f22 100644
--- a/src/google/protobuf/compiler/cpp/message.cc
+++ b/src/google/protobuf/compiler/cpp/message.cc
@@ -32,39 +32,46 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/compiler/cpp/message.h>
+#include "google/protobuf/compiler/cpp/message.h"
#include <algorithm>
#include <cstdint>
#include <functional>
+#include <limits>
#include <map>
#include <memory>
+#include <type_traits>
#include <unordered_map>
#include <utility>
#include <vector>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/generated_message_util.h>
-#include <google/protobuf/map_entry_lite.h>
-#include <google/protobuf/wire_format.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/stringprintf.h>
-#include <google/protobuf/stubs/substitute.h>
-#include <google/protobuf/compiler/cpp/enum.h>
-#include <google/protobuf/compiler/cpp/extension.h>
-#include <google/protobuf/compiler/cpp/field.h>
-#include <google/protobuf/compiler/cpp/helpers.h>
-#include <google/protobuf/compiler/cpp/padding_optimizer.h>
-#include <google/protobuf/compiler/cpp/parse_function_generator.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/stubs/hash.h>
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/generated_message_util.h"
+#include "google/protobuf/map_entry_lite.h"
+#include "google/protobuf/wire_format.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "absl/container/flat_hash_map.h"
+#include "absl/strings/ascii.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/str_format.h"
+#include "absl/strings/str_join.h"
+#include "absl/strings/string_view.h"
+#include "absl/strings/substitute.h"
+#include "google/protobuf/compiler/cpp/enum.h"
+#include "google/protobuf/compiler/cpp/extension.h"
+#include "google/protobuf/compiler/cpp/field.h"
+#include "google/protobuf/compiler/cpp/helpers.h"
+#include "google/protobuf/compiler/cpp/padding_optimizer.h"
+#include "google/protobuf/compiler/cpp/parse_function_generator.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/generated_message_tctable_gen.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -73,6 +80,8 @@
using internal::WireFormat;
using internal::WireFormatLite;
+using internal::cpp::HasHasbit;
+using internal::cpp::Utf8CheckMode;
namespace {
@@ -84,21 +93,21 @@
// masks must be non-zero.
std::string ConditionalToCheckBitmasks(
const std::vector<uint32_t>& masks, bool return_success = true,
- StringPiece has_bits_var = "_impl_._has_bits_") {
+ absl::string_view has_bits_var = "_impl_._has_bits_") {
std::vector<std::string> parts;
for (int i = 0; i < masks.size(); i++) {
if (masks[i] == 0) continue;
- std::string m = StrCat("0x", strings::Hex(masks[i], strings::ZERO_PAD_8));
+ std::string m = absl::StrCat("0x", absl::Hex(masks[i], absl::kZeroPad8));
// Each xor evaluates to 0 if the expected bits are present.
parts.push_back(
- StrCat("((", has_bits_var, "[", i, "] & ", m, ") ^ ", m, ")"));
+ absl::StrCat("((", has_bits_var, "[", i, "] & ", m, ") ^ ", m, ")"));
}
GOOGLE_CHECK(!parts.empty());
// If we have multiple parts, each expected to be 0, then bitwise-or them.
std::string result =
parts.size() == 1
? parts[0]
- : StrCat("(", Join(parts, "\n | "), ")");
+ : absl::StrCat("(", absl::StrJoin(parts, "\n | "), ")");
return result + (return_success ? " == 0" : " != 0");
}
@@ -112,7 +121,7 @@
format("cached_has_bits = $has_bits$[$1$];\n", *cached_has_word_index);
}
const std::string mask =
- StrCat(strings::Hex(1u << (has_bit_index % 32), strings::ZERO_PAD_8));
+ absl::StrCat(absl::Hex(1u << (has_bit_index % 32), absl::kZeroPad8));
format("if (cached_has_bits & 0x$1$u) {\n", mask);
} else {
format("if (has_$1$()) {\n", FieldName(field));
@@ -290,9 +299,9 @@
vars["val_cpp"] = PrimitiveTypeName(options, val->cpp_type());
}
vars["key_wire_type"] =
- "TYPE_" + ToUpper(DeclaredTypeMethodName(key->type()));
+ "TYPE_" + absl::AsciiStrToUpper(DeclaredTypeMethodName(key->type()));
vars["val_wire_type"] =
- "TYPE_" + ToUpper(DeclaredTypeMethodName(val->type()));
+ "TYPE_" + absl::AsciiStrToUpper(DeclaredTypeMethodName(val->type()));
}
// Does the given field have a private (internal helper only) has_$name$()
@@ -303,14 +312,6 @@
return IsProto3(field->file()) && field->real_containing_oneof();
}
-// TODO(ckennelly): Cull these exclusions if/when these protos do not have
-// their methods overridden by subclasses.
-
-bool ShouldMarkClassAsFinal(const Descriptor* descriptor,
- const Options& options) {
- return true;
-}
-
// Returns true to make the message serialize in order, decided by the following
// factors in the order of precedence.
@@ -411,7 +412,6 @@
has_bit_indices_(has_bit_indices),
access_info_map_(options.access_info_map),
cold_threshold_(cold_threshold) {
- SetCommonVars(options, &variables_);
SetCommonMessageDataVariables(descriptor, &variables_);
}
@@ -474,8 +474,7 @@
}
// Emit has_bit check for each has_bit_dword index.
- format("if (PROTOBUF_PREDICT_FALSE(");
- int first_word = HasbitWord(chunk, 0);
+ format("if (PROTOBUF_PREDICT_FALSE(false");
while (chunk < limit_chunk_) {
uint32_t mask = 0;
int this_word = HasbitWord(chunk, 0);
@@ -489,10 +488,8 @@
}
}
- if (this_word != first_word) {
- format(" ||\n ");
- }
- format.Set("mask", strings::Hex(mask, strings::ZERO_PAD_8));
+ format(" ||\n ");
+ format.Set("mask", absl::Hex(mask, absl::kZeroPad8));
if (this_word == cached_has_word_index) {
format("(cached_has_bits & 0x$mask$u) != 0");
} else {
@@ -514,15 +511,15 @@
}
void MaySetAnnotationVariable(const Options& options,
- StringPiece annotation_name,
- StringPiece injector_template_prefix,
- StringPiece injector_template_suffix,
+ absl::string_view annotation_name,
+ absl::string_view injector_template_prefix,
+ absl::string_view injector_template_suffix,
std::map<std::string, std::string>* variables) {
if (options.field_listener_options.forbidden_field_listener_events.count(
std::string(annotation_name)))
return;
- (*variables)[StrCat("annotate_", annotation_name)] = strings::Substitute(
- StrCat(injector_template_prefix, injector_template_suffix),
+ (*variables)[absl::StrCat("annotate_", annotation_name)] = absl::Substitute(
+ absl::StrCat(injector_template_prefix, injector_template_suffix),
(*variables)["classtype"]);
}
@@ -551,8 +548,8 @@
if (!HasTracker(descriptor, options)) {
return;
}
- StringPiece tracker = (*variables)["tracker"];
- StringPiece extensions = (*variables)["extensions"];
+ absl::string_view tracker = (*variables)["tracker"];
+ absl::string_view extensions = (*variables)["extensions"];
for (const auto& annotation : accessor_annotations_to_hooks) {
const std::string& annotation_name = annotation.first;
const std::string& listener_call = annotation.second;
@@ -561,7 +558,7 @@
!StrContains(annotation_name, "clear")) {
// Primitive fields accessors.
// "Has" is here as users calling "has" on a repeated field is a mistake.
- (*variables)[annotation_name] = StrCat(
+ (*variables)[annotation_name] = absl::StrCat(
" ", tracker, ".", listener_call,
"(this, id.number(), _proto_TypeTraits::GetPtr(id.number(), ",
extensions, ", id.default_value_ref()));");
@@ -571,17 +568,17 @@
// Repeated index accessors.
std::string str_index = "index";
if (StrContains(annotation_name, "add")) {
- str_index = StrCat(extensions, ".ExtensionSize(id.number()) - 1");
+ str_index = absl::StrCat(extensions, ".ExtensionSize(id.number()) - 1");
}
(*variables)[annotation_name] =
- StrCat(" ", tracker, ".", listener_call,
+ absl::StrCat(" ", tracker, ".", listener_call,
"(this, id.number(), "
"_proto_TypeTraits::GetPtr(id.number(), ",
extensions, ", ", str_index, "));");
} else if (StrContains(annotation_name, "list") ||
StrContains(annotation_name, "size")) {
// Repeated full accessors.
- (*variables)[annotation_name] = StrCat(
+ (*variables)[annotation_name] = absl::StrCat(
" ", tracker, ".", listener_call,
"(this, id.number(), _proto_TypeTraits::GetRepeatedPtr(id.number(), ",
extensions, "));");
@@ -631,7 +628,7 @@
if (HasTracker(descriptor_, options_)) {
const std::string injector_template =
- StrCat(" ", variables_["tracker"], ".");
+ absl::StrCat(" ", variables_["tracker"], ".");
MaySetAnnotationVariable(options, "serialize", injector_template,
"OnSerialize(this);\n", &variables_);
@@ -670,13 +667,46 @@
message_layout_helper_->OptimizeLayout(&optimized_order_, options_,
scc_analyzer_);
- // This message has hasbits iff one or more fields need one.
+ // Allocate has_bit_indices_ iff the message has a field that needs hasbits.
+ int has_bit_fields = 0;
for (auto field : optimized_order_) {
if (HasHasbit(field)) {
+ ++has_bit_fields;
if (has_bit_indices_.empty()) {
has_bit_indices_.resize(descriptor_->field_count(), kNoHasbit);
}
- has_bit_indices_[field->index()] = max_has_bit_index_++;
+ }
+ }
+ // For messages with more than 32 has bits, do a first pass which only
+ // allocates has bits to fields that might be in the fast table.
+ bool allocated_fast[32] = {};
+ if (has_bit_fields > 32) {
+ for (const auto* field : optimized_order_) {
+ if (HasHasbit(field)) {
+ if (!IsDescriptorEligibleForFastParsing(field)) continue;
+
+ // A fast-table with > 16 entries ends up incorporating
+ // the high-bit for VarInt encoding into the index for the table,
+ // so we have to incorporate it here also, when computing the
+ // index likely to be used for that table.
+ int fast_index = field->number();
+ if (fast_index >= 16) fast_index = 16 + (fast_index % 16);
+ GOOGLE_CHECK_GE(fast_index, 1);
+ GOOGLE_CHECK_LT(fast_index, 32);
+
+ if (allocated_fast[fast_index]) continue;
+ allocated_fast[fast_index] = true;
+
+ has_bit_indices_[field->index()] = max_has_bit_index_++;
+ }
+ }
+ }
+ // Then do a second pass which allocates all remaining has bits
+ for (const auto* field : optimized_order_) {
+ if (HasHasbit(field)) {
+ if (has_bit_indices_[field->index()] == kNoHasbit) {
+ has_bit_indices_[field->index()] = max_has_bit_index_++;
+ }
}
if (IsStringInlined(field, options_)) {
if (inlined_string_indices_.empty()) {
@@ -688,6 +718,7 @@
inlined_string_indices_[field->index()] = max_inlined_string_index_++;
}
}
+ GOOGLE_CHECK_EQ(max_has_bit_index_, has_bit_fields);
if (!has_bit_indices_.empty()) {
field_generators_.SetHasBitIndices(has_bit_indices_);
@@ -790,6 +821,7 @@
std::map<std::string, std::string> vars;
SetCommonFieldVariables(field, &vars, options_);
+
format.AddMap(vars);
if (field->is_repeated()) {
@@ -825,7 +857,6 @@
// Generate type-specific accessor declarations.
field_generators_.get(field).GenerateAccessorDeclarations(printer);
-
format("\n");
}
@@ -1073,7 +1104,7 @@
format.Set("has_array_index", has_bit_index / 32);
format.Set("has_mask",
- strings::Hex(1u << (has_bit_index % 32), strings::ZERO_PAD_8));
+ absl::Hex(1u << (has_bit_index % 32), absl::kZeroPad8));
format(
"inline bool $classname$::_internal_has_$name$() const {\n"
" bool value = "
@@ -1121,7 +1152,7 @@
for (auto oneof : OneOfRange(descriptor_)) {
format.Set("oneof_name", oneof->name());
format.Set("oneof_index", oneof->index());
- format.Set("cap_oneof_name", ToUpper(oneof->name()));
+ format.Set("cap_oneof_name", absl::AsciiStrToUpper(oneof->name()));
format(
"inline bool $classname$::has_$oneof_name$() const {\n"
" return $oneof_name$_case() != $cap_oneof_name$_NOT_SET;\n"
@@ -1210,7 +1241,7 @@
int has_bit_index = HasBitIndex(field);
format.Set("has_array_index", has_bit_index / 32);
format.Set("has_mask",
- strings::Hex(1u << (has_bit_index % 32), strings::ZERO_PAD_8));
+ absl::Hex(1u << (has_bit_index % 32), absl::kZeroPad8));
format("$has_bits$[$has_array_index$] &= ~0x$has_mask$u;\n");
}
}
@@ -1260,7 +1291,7 @@
format.Set("field_name", UnderscoresToCamelCase(field->name(), true));
format.Set("oneof_name", field->containing_oneof()->name());
format.Set("oneof_index",
- StrCat(field->containing_oneof()->index()));
+ absl::StrCat(field->containing_oneof()->index()));
GenerateOneofMemberHasBits(field, format);
} else {
// Singular field.
@@ -1270,7 +1301,6 @@
if (!IsCrossFileMaybeMap(field)) {
GenerateFieldClear(field, true, format);
}
-
// Generate type-specific accessors.
if (!IsFieldStripped(field, options_)) {
field_generators_.get(field).GenerateInlineAccessorDefinitions(printer);
@@ -1285,8 +1315,6 @@
void MessageGenerator::GenerateClassDefinition(io::Printer* printer) {
Formatter format(printer, variables_);
- format.Set("class_final",
- ShouldMarkClassAsFinal(descriptor_, options_) ? "final" : "");
if (IsMapEntryMessage(descriptor_)) {
std::map<std::string, std::string> vars;
@@ -1314,7 +1342,9 @@
" static const $classname$* internal_default_instance() { return "
"reinterpret_cast<const "
"$classname$*>(&_$classname$_default_instance_); }\n");
- auto utf8_check = GetUtf8CheckMode(descriptor_->field(0), options_);
+ auto utf8_check = internal::cpp::GetUtf8CheckMode(
+ descriptor_->field(0), GetOptimizeFor(descriptor_->file(), options_) ==
+ FileOptions::LITE_RUNTIME);
if (descriptor_->field(0)->type() == FieldDescriptor::TYPE_STRING &&
utf8_check != Utf8CheckMode::kNone) {
if (utf8_check == Utf8CheckMode::kStrict) {
@@ -1386,7 +1416,7 @@
}
format(
- "class $dllexport_decl $${1$$classname$$}$$ class_final$ :\n"
+ "class $dllexport_decl $${1$$classname$$}$ final :\n"
" public $superclass$ /* @@protoc_insertion_point("
"class_definition:$full_name$) */ {\n",
descriptor_);
@@ -1489,7 +1519,7 @@
format("$1$ = $2$,\n", OneofCaseConstantName(field), // 1
field->number()); // 2
}
- format("$1$_NOT_SET = 0,\n", ToUpper(oneof->name()));
+ format("$1$_NOT_SET = 0,\n", absl::AsciiStrToUpper(oneof->name()));
format.Outdent();
format(
"};\n"
@@ -1518,8 +1548,7 @@
" return $any_metadata$.PackFrom(GetArena(), message);\n"
"}\n"
"bool PackFrom(const ::$proto_ns$::Message& message,\n"
- " ::PROTOBUF_NAMESPACE_ID::ConstStringParam "
- "type_url_prefix) {\n"
+ " ::absl::string_view type_url_prefix) {\n"
" $DCHK$_NE(&message, this);\n"
" return $any_metadata$.PackFrom(GetArena(), message, "
"type_url_prefix);\n"
@@ -1541,8 +1570,7 @@
"!std::is_convertible<T, const ::$proto_ns$::Message&>"
"::value>::type>\n"
"bool PackFrom(const T& message,\n"
- " ::PROTOBUF_NAMESPACE_ID::ConstStringParam "
- "type_url_prefix) {\n"
+ " ::absl::string_view type_url_prefix) {\n"
" return $any_metadata$.PackFrom<T>(GetArena(), message, "
"type_url_prefix);"
"}\n"
@@ -1560,8 +1588,7 @@
"}\n"
"template <typename T>\n"
"bool PackFrom(const T& message,\n"
- " ::PROTOBUF_NAMESPACE_ID::ConstStringParam "
- "type_url_prefix) {\n"
+ " ::absl::string_view type_url_prefix) {\n"
" return $any_metadata$.PackFrom(GetArena(), message, "
"type_url_prefix);\n"
"}\n"
@@ -1574,8 +1601,7 @@
"template<typename T> bool Is() const {\n"
" return $any_metadata$.Is<T>();\n"
"}\n"
- "static bool ParseAnyTypeUrl(::PROTOBUF_NAMESPACE_ID::ConstStringParam "
- "type_url,\n"
+ "static bool ParseAnyTypeUrl(::absl::string_view type_url,\n"
" std::string* full_type_name);\n");
}
@@ -1693,11 +1719,9 @@
// Friend AnyMetadata so that it can call this FullMessageName() method.
"\nprivate:\n"
"friend class ::$proto_ns$::internal::AnyMetadata;\n"
- "static $1$ FullMessageName() {\n"
+ "static ::absl::string_view FullMessageName() {\n"
" return \"$full_name$\";\n"
- "}\n",
- options_.opensource_runtime ? "::PROTOBUF_NAMESPACE_ID::StringPiece"
- : "::StringPiece");
+ "}\n");
format(
// TODO(gerbens) Make this private! Currently people are deriving from
@@ -1758,7 +1782,7 @@
format(
"private:\n"
"inline bool IsSplitMessageDefault() const {\n"
- " return $split$ == reinterpret_cast<Impl_::Split*>(&$1$);\n"
+ " return $split$ == reinterpret_cast<const Impl_::Split*>(&$1$);\n"
"}\n"
"PROTOBUF_NOINLINE void PrepareSplitMessageForWrite();\n"
"public:\n",
@@ -1852,7 +1876,7 @@
const size_t sizeof_has_bits = HasBitsSize();
const std::string has_bits_decl =
sizeof_has_bits == 0 ? ""
- : StrCat("::$proto_ns$::internal::HasBits<",
+ : absl::StrCat("::$proto_ns$::internal::HasBits<",
sizeof_has_bits, "> _has_bits_;\n");
format(
@@ -1926,6 +1950,8 @@
" typedef void InternalArenaConstructable_;\n"
" typedef void DestructorSkippable_;\n"
"};\n"
+ "static_assert(std::is_trivially_copy_constructible<Split>::value);\n"
+ "static_assert(std::is_trivially_destructible<Split>::value);\n"
"Split* _split_;\n");
}
@@ -1986,9 +2012,6 @@
}
if (ShouldSplit(descriptor_, options_)) {
- format(
- "static Impl_::Split* CreateSplitMessage("
- "::$proto_ns$::Arena* arena);\n");
format("friend struct $1$;\n",
DefaultInstanceType(descriptor_, options_, /*split=*/true));
}
@@ -2036,7 +2059,6 @@
GOOGLE_DCHECK(!IsMapEntryMessage(descriptor_));
inlined_string_indices_offset = has_offset + has_bit_indices_.size();
}
-
format("{ $1$, $2$, $3$, sizeof($classtype$)},\n", offset, has_offset,
inlined_string_indices_offset);
}
@@ -2087,7 +2109,7 @@
}
format(
"bool $classname$::ParseAnyTypeUrl(\n"
- " ::PROTOBUF_NAMESPACE_ID::ConstStringParam type_url,\n"
+ " ::absl::string_view type_url,\n"
" std::string* full_type_name) {\n"
" return ::_pbi::ParseAnyTypeUrl(type_url, full_type_name);\n"
"}\n"
@@ -2101,7 +2123,14 @@
if (!has_bit_indices_.empty()) {
format(
"using HasBits = "
- "decltype(std::declval<$classname$>().$has_bits$);\n");
+ "decltype(std::declval<$classname$>().$has_bits$);\n"
+ "static constexpr int32_t kHasBitsOffset =\n"
+ " 8 * PROTOBUF_FIELD_OFFSET($classname$, _impl_._has_bits_);\n");
+ }
+ if (descriptor_->real_oneof_decl_count() > 0) {
+ format(
+ "static constexpr int32_t kOneofCaseOffset =\n"
+ " PROTOBUF_FIELD_OFFSET($classtype$, $oneof_case$);\n");
}
for (auto field : FieldRange(descriptor_)) {
field_generators_.get(field).GenerateInternalAccessorDeclarations(printer);
@@ -2132,8 +2161,7 @@
format("};\n\n");
for (auto field : FieldRange(descriptor_)) {
if (!IsFieldStripped(field, options_)) {
- field_generators_.get(field).GenerateInternalAccessorDefinitions(
- printer);
+ field_generators_.get(field).GenerateInternalAccessorDefinitions(printer);
}
}
@@ -2197,9 +2225,14 @@
format(
"void $classname$::PrepareSplitMessageForWrite() {\n"
" if (IsSplitMessageDefault()) {\n"
- " $split$ = CreateSplitMessage(GetArenaForAllocation());\n"
+ " void* chunk = "
+ "::PROTOBUF_NAMESPACE_ID::internal::CreateSplitMessageGeneric("
+ "GetArenaForAllocation(), &$1$, sizeof(Impl_::Split), this, &$2$);\n"
+ " $split$ = reinterpret_cast<Impl_::Split*>(chunk);\n"
" }\n"
- "}\n");
+ "}\n",
+ DefaultInstanceName(descriptor_, options_, /*split=*/true),
+ DefaultInstanceName(descriptor_, options_, /*split=*/false));
}
GenerateVerify(printer);
@@ -2274,7 +2307,16 @@
} else {
format("~0u, // no _inlined_string_donated_\n");
}
- const int kNumGenericOffsets = 6; // the number of fixed offsets above
+ if (ShouldSplit(descriptor_, options_)) {
+ format(
+ "PROTOBUF_FIELD_OFFSET($classtype$, $split$),\n"
+ "sizeof($classtype$::Impl_::Split),\n");
+ } else {
+ format(
+ "~0u, // no _split_\n"
+ "~0u, // no sizeof(Split)\n");
+ }
+ const int kNumGenericOffsets = 8; // the number of fixed offsets above
const size_t offsets = kNumGenericOffsets + descriptor_->field_count() +
descriptor_->real_oneof_decl_count();
size_t entries = offsets;
@@ -2302,12 +2344,17 @@
// offset of the field, so that the information is available when
// reflectively accessing the field at run time.
//
- // Embed whether the field is eagerly verified lazy or inlined string to the
- // LSB of the offset.
+ // We embed whether the field is cold to the MSB of the offset, and whether
+ // the field is eagerly verified lazy or inlined string to the LSB of the
+ // offset.
+
+ if (ShouldSplit(field, options_)) {
+ format(" | ::_pbi::kSplitFieldOffsetMask /*split*/");
+ }
if (IsEagerlyVerifiedLazy(field, options_, scc_analyzer_)) {
- format(" | 0x1u // eagerly verified lazy\n");
+ format(" | 0x1u /*eagerly verified lazy*/");
} else if (IsStringInlined(field, options_)) {
- format(" | 0x1u // inlined\n");
+ format(" | 0x1u /*inlined*/");
}
format(",\n");
}
@@ -2328,7 +2375,7 @@
entries += has_bit_indices_.size();
for (int i = 0; i < has_bit_indices_.size(); i++) {
const std::string index =
- has_bit_indices_[i] >= 0 ? StrCat(has_bit_indices_[i]) : "~0u";
+ has_bit_indices_[i] >= 0 ? absl::StrCat(has_bit_indices_[i]) : "~0u";
format("$1$,\n", index);
}
}
@@ -2337,7 +2384,7 @@
for (int inlined_string_index : inlined_string_indices_) {
const std::string index =
inlined_string_index >= 0
- ? StrCat(inlined_string_index, ", // inlined_string_index")
+ ? absl::StrCat(inlined_string_index, ", // inlined_string_index")
: "~0u,";
format("$1$\n", index);
}
@@ -2398,8 +2445,15 @@
}
if (ShouldSplit(descriptor_, options_)) {
put_sep();
- format("decltype($split$){reinterpret_cast<Impl_::Split*>(&$1$)}",
- DefaultInstanceName(descriptor_, options_, /*split=*/true));
+ // We can't assign the default split to this->split without the const_cast
+ // because the former is a const. The const_cast is safe because we don't
+ // intend to modify the default split through this pointer, and we also
+ // expect the default split to be in the rodata section which is protected
+ // from mutation.
+ format(
+ "decltype($split$){const_cast<Impl_::Split*>"
+ "(reinterpret_cast<const Impl_::Split*>(&$1$))}",
+ DefaultInstanceName(descriptor_, options_, /*split=*/true));
}
for (auto oneof : OneOfRange(descriptor_)) {
put_sep();
@@ -2460,6 +2514,13 @@
field_generators_.get(field).GenerateConstructorCode(printer);
}
+ if (ShouldForceAllocationOnConstruction(descriptor_, options_)) {
+ format(
+ "#ifdef PROTOBUF_FORCE_ALLOCATION_ON_CONSTRUCTION\n"
+ "$mutable_unknown_fields$;\n"
+ "#endif // PROTOBUF_FORCE_ALLOCATION_ON_CONSTRUCTION\n");
+ }
+
for (auto oneof : OneOfRange(descriptor_)) {
format("clear_has_$1$();\n", oneof->name());
}
@@ -2468,45 +2529,6 @@
format("}\n\n");
}
-void MessageGenerator::GenerateCreateSplitMessage(io::Printer* printer) {
- Formatter format(printer, variables_);
- format(
- "$classname$::Impl_::Split* "
- "$classname$::CreateSplitMessage(::$proto_ns$::Arena* arena) {\n");
- format.Indent();
- const char* field_sep = " ";
- const auto put_sep = [&] {
- format("\n$1$ ", field_sep);
- field_sep = ",";
- };
- format(
- "const size_t size = sizeof(Impl_::Split);\n"
- "void* chunk = (arena == nullptr) ?\n"
- " ::operator new(size) :\n"
- " arena->AllocateAligned(size, alignof(Impl_::Split));\n"
- "Impl_::Split* ptr = reinterpret_cast<Impl_::Split*>(chunk);\n"
- "new (ptr) Impl_::Split{");
- format.Indent();
- for (const FieldDescriptor* field : optimized_order_) {
- GOOGLE_DCHECK(!IsFieldStripped(field, options_));
- if (ShouldSplit(field, options_)) {
- put_sep();
- field_generators_.get(field).GenerateAggregateInitializer(printer);
- }
- }
- format.Outdent();
- format("};\n");
- for (const FieldDescriptor* field : optimized_order_) {
- GOOGLE_DCHECK(!IsFieldStripped(field, options_));
- if (ShouldSplit(field, options_)) {
- field_generators_.get(field).GenerateCreateSplitMessageCode(printer);
- }
- }
- format("return ptr;\n");
- format.Outdent();
- format("}\n");
-}
-
void MessageGenerator::GenerateInitDefaultSplitInstance(io::Printer* printer) {
if (!ShouldSplit(descriptor_, options_)) return;
@@ -2685,12 +2707,11 @@
continue;
}
put_sep();
- field_generators_.get(field).GenerateConstexprAggregateInitializer(
- printer);
+ field_generators_.get(field).GenerateConstexprAggregateInitializer(printer);
}
if (ShouldSplit(descriptor_, options_)) {
put_sep();
- format("/*decltype($split$)*/&$1$._instance",
+ format("/*decltype($split$)*/const_cast<Impl_::Split*>(&$1$._instance)",
DefaultInstanceName(descriptor_, options_, /*split=*/true));
}
@@ -2738,17 +2759,11 @@
" static_cast<size_t>(reinterpret_cast<char*>(&$last$) -\n"
" reinterpret_cast<char*>(&$first$)) + sizeof($last$));\n";
- if (ShouldSplit(descriptor_, options_)) {
- format("if (!from.IsSplitMessageDefault()) {\n");
- format.Indent();
- format("_this->PrepareSplitMessageForWrite();\n");
- for (auto field : optimized_order_) {
- if (ShouldSplit(field, options_)) {
- field_generators_.get(field).GenerateCopyConstructorCode(printer);
- }
- }
- format.Outdent();
- format("}\n");
+ if (ShouldForceAllocationOnConstruction(descriptor_, options_)) {
+ format(
+ "#ifdef PROTOBUF_FORCE_ALLOCATION_ON_CONSTRUCTION\n"
+ "$mutable_unknown_fields$;\n"
+ "#endif // PROTOBUF_FORCE_ALLOCATION_ON_CONSTRUCTION\n");
}
for (size_t i = 0; i < optimized_order_.size(); ++i) {
@@ -2779,6 +2794,20 @@
field_generators_.get(field).GenerateCopyConstructorCode(printer);
}
}
+
+ if (ShouldSplit(descriptor_, options_)) {
+ format("if (!from.IsSplitMessageDefault()) {\n");
+ format.Indent();
+ format("_this->PrepareSplitMessageForWrite();\n");
+ // TODO(b/122856539): cache the split pointers.
+ for (auto field : optimized_order_) {
+ if (ShouldSplit(field, options_)) {
+ field_generators_.get(field).GenerateCopyConstructorCode(printer);
+ }
+ }
+ format.Outdent();
+ format("}\n");
+ }
}
void MessageGenerator::GenerateStructors(io::Printer* printer) {
@@ -2867,8 +2896,10 @@
}
if (ShouldSplit(descriptor_, options_)) {
put_sep();
- format("decltype($split$){reinterpret_cast<Impl_::Split*>(&$1$)}",
- DefaultInstanceName(descriptor_, options_, /*split=*/true));
+ format(
+ "decltype($split$){const_cast<Impl_::Split*>"
+ "(reinterpret_cast<const Impl_::Split*>(&$1$))}",
+ DefaultInstanceName(descriptor_, options_, /*split=*/true));
}
for (auto oneof : OneOfRange(descriptor_)) {
put_sep();
@@ -2930,7 +2961,7 @@
"case $1$_NOT_SET: {\n"
" break;\n"
"}\n",
- ToUpper(oneof->name()));
+ absl::AsciiStrToUpper(oneof->name()));
format.Outdent();
format("}\n");
}
@@ -2945,10 +2976,6 @@
// Generate the shared constructor code.
GenerateSharedConstructorCode(printer);
- if (ShouldSplit(descriptor_, options_)) {
- GenerateCreateSplitMessage(printer);
- }
-
// Generate the destructor.
if (!HasSimpleBaseClass(descriptor_, options_)) {
format(
@@ -3057,15 +3084,26 @@
ColdChunkSkipper cold_skipper(descriptor_, options_, chunks, has_bit_indices_,
kColdRatio);
int cached_has_word_index = -1;
-
- for (int chunk_index = 0; chunk_index < chunks.size(); chunk_index++) {
+ bool first_split_chunk_processed = false;
+ for (size_t chunk_index = 0; chunk_index < chunks.size(); chunk_index++) {
std::vector<const FieldDescriptor*>& chunk = chunks[chunk_index];
cold_skipper.OnStartChunk(chunk_index, cached_has_word_index, "", printer);
const FieldDescriptor* memset_start = nullptr;
const FieldDescriptor* memset_end = nullptr;
bool saw_non_zero_init = false;
- bool chunk_is_cold = !chunk.empty() && ShouldSplit(chunk.front(), options_);
+ bool chunk_is_split =
+ !chunk.empty() && ShouldSplit(chunk.front(), options_);
+ // All chunks after the first split chunk should also be split.
+ GOOGLE_CHECK(!first_split_chunk_processed || chunk_is_split);
+ if (chunk_is_split && !first_split_chunk_processed) {
+ // Some fields are cleared without checking has_bit. So we add the
+ // condition here to avoid writing to the default split instance.
+ format("if (!IsSplitMessageDefault()) {\n");
+ format.Indent();
+ first_split_chunk_processed = true;
+ }
+
for (const auto& field : chunk) {
if (CanInitializeByZeroing(field)) {
GOOGLE_CHECK(!saw_non_zero_init);
@@ -3089,7 +3127,7 @@
// Emit an if() that will let us skip the whole chunk if none are set.
uint32_t chunk_mask = GenChunkMask(chunk, has_bit_indices_);
std::string chunk_mask_str =
- StrCat(strings::Hex(chunk_mask, strings::ZERO_PAD_8));
+ absl::StrCat(absl::Hex(chunk_mask, absl::kZeroPad8));
// Check (up to) 8 has_bits at a time if we have more than one field in
// this chunk. Due to field layout ordering, we may check
@@ -3105,25 +3143,20 @@
format.Indent();
}
- if (chunk_is_cold) {
- format("if (!IsSplitMessageDefault()) {\n");
- format.Indent();
- }
-
if (memset_start) {
if (memset_start == memset_end) {
// For clarity, do not memset a single field.
field_generators_.get(memset_start)
.GenerateMessageClearingCode(printer);
} else {
- GOOGLE_CHECK_EQ(chunk_is_cold, ShouldSplit(memset_start, options_));
- GOOGLE_CHECK_EQ(chunk_is_cold, ShouldSplit(memset_end, options_));
+ GOOGLE_CHECK_EQ(chunk_is_split, ShouldSplit(memset_start, options_));
+ GOOGLE_CHECK_EQ(chunk_is_split, ShouldSplit(memset_end, options_));
format(
"::memset(&$1$, 0, static_cast<size_t>(\n"
" reinterpret_cast<char*>(&$2$) -\n"
" reinterpret_cast<char*>(&$1$)) + sizeof($2$));\n",
- FieldMemberName(memset_start, chunk_is_cold),
- FieldMemberName(memset_end, chunk_is_cold));
+ FieldMemberName(memset_start, chunk_is_split),
+ FieldMemberName(memset_end, chunk_is_split));
}
}
@@ -3152,14 +3185,16 @@
}
}
- if (chunk_is_cold) {
+ if (have_outer_if) {
format.Outdent();
format("}\n");
}
- if (have_outer_if) {
- format.Outdent();
- format("}\n");
+ if (chunk_index == chunks.size() - 1) {
+ if (first_split_chunk_processed) {
+ format.Outdent();
+ format("}\n");
+ }
}
if (cold_skipper.OnEndChunk(chunk_index, printer)) {
@@ -3223,12 +3258,12 @@
"case $1$_NOT_SET: {\n"
" break;\n"
"}\n",
- ToUpper(oneof->name()));
+ absl::AsciiStrToUpper(oneof->name()));
format.Outdent();
format(
"}\n"
"$oneof_case$[$1$] = $2$_NOT_SET;\n",
- i, ToUpper(oneof->name()));
+ i, absl::AsciiStrToUpper(oneof->name()));
format.Outdent();
format(
"}\n"
@@ -3452,7 +3487,7 @@
// Emit an if() that will let us skip the whole chunk if none are set.
uint32_t chunk_mask = GenChunkMask(chunk, has_bit_indices_);
std::string chunk_mask_str =
- StrCat(strings::Hex(chunk_mask, strings::ZERO_PAD_8));
+ absl::StrCat(absl::Hex(chunk_mask, absl::kZeroPad8));
// Check (up to) 8 has_bits at a time if we have more than one field in
// this chunk. Due to field layout ordering, we may check
@@ -3500,8 +3535,8 @@
// Check hasbit, using cached bits.
GOOGLE_CHECK(HasHasbit(field));
int has_bit_index = has_bit_indices_[field->index()];
- const std::string mask = StrCat(
- strings::Hex(1u << (has_bit_index % 32), strings::ZERO_PAD_8));
+ const std::string mask = absl::StrCat(
+ absl::Hex(1u << (has_bit_index % 32), absl::kZeroPad8));
format("if (cached_has_bits & 0x$1$u) {\n", mask);
format.Indent();
@@ -3555,7 +3590,7 @@
"case $1$_NOT_SET: {\n"
" break;\n"
"}\n",
- ToUpper(oneof->name()));
+ absl::AsciiStrToUpper(oneof->name()));
format.Outdent();
format("}\n");
}
@@ -3690,7 +3725,7 @@
int has_bit_index = HasBitIndex(field);
if (cached_has_bits_index == has_bit_index / 32) {
const std::string mask =
- StrCat(strings::Hex(1u << (has_bit_index % 32), strings::ZERO_PAD_8));
+ absl::StrCat(absl::Hex(1u << (has_bit_index % 32), absl::kZeroPad8));
format("if (cached_has_bits & 0x$1$u) {\n", mask);
} else {
@@ -3715,8 +3750,8 @@
void MessageGenerator::GenerateSerializeOneExtensionRange(
io::Printer* printer, const Descriptor::ExtensionRange* range) {
std::map<std::string, std::string> vars = variables_;
- vars["start"] = StrCat(range->start);
- vars["end"] = StrCat(range->end);
+ vars["start"] = absl::StrCat(range->start);
+ vars["end"] = absl::StrCat(range->end);
Formatter format(printer, vars);
format("// Extension range [$start$, $end$)\n");
format(
@@ -4245,7 +4280,7 @@
// Emit an if() that will let us skip the whole chunk if none are set.
uint32_t chunk_mask = GenChunkMask(chunk, has_bit_indices_);
std::string chunk_mask_str =
- StrCat(strings::Hex(chunk_mask, strings::ZERO_PAD_8));
+ absl::StrCat(absl::Hex(chunk_mask, absl::kZeroPad8));
// Check (up to) 8 has_bits at a time if we have more than one field in
// this chunk. Due to field layout ordering, we may check
@@ -4328,7 +4363,7 @@
"case $1$_NOT_SET: {\n"
" break;\n"
"}\n",
- ToUpper(oneof->name()));
+ absl::AsciiStrToUpper(oneof->name()));
format.Outdent();
format("}\n");
}
@@ -4427,7 +4462,7 @@
"case $1$_NOT_SET: {\n"
" break;\n"
"}\n",
- ToUpper(oneof->name()));
+ absl::AsciiStrToUpper(oneof->name()));
format.Outdent();
format("}\n");
}
@@ -4443,4 +4478,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/compiler/cpp/message.h b/src/google/protobuf/compiler/cpp/message.h
index 5bdfcb3..3b087d3 100644
--- a/src/google/protobuf/compiler/cpp/message.h
+++ b/src/google/protobuf/compiler/cpp/message.h
@@ -36,15 +36,16 @@
#define GOOGLE_PROTOBUF_COMPILER_CPP_MESSAGE_H__
#include <cstdint>
+#include <limits>
#include <memory>
#include <set>
#include <string>
-#include <google/protobuf/compiler/cpp/field.h>
-#include <google/protobuf/compiler/cpp/helpers.h>
-#include <google/protobuf/compiler/cpp/message_layout_helper.h>
-#include <google/protobuf/compiler/cpp/options.h>
-#include <google/protobuf/compiler/cpp/parse_function_generator.h>
+#include "google/protobuf/compiler/cpp/field.h"
+#include "google/protobuf/compiler/cpp/helpers.h"
+#include "google/protobuf/compiler/cpp/message_layout_helper.h"
+#include "google/protobuf/compiler/cpp/options.h"
+#include "google/protobuf/compiler/cpp/parse_function_generator.h"
namespace google {
namespace protobuf {
@@ -69,6 +70,8 @@
const std::map<std::string, std::string>& vars,
int index_in_file_messages, const Options& options,
MessageSCCAnalyzer* scc_analyzer);
+ MessageGenerator(const MessageGenerator&) = delete;
+ MessageGenerator& operator=(const MessageGenerator&) = delete;
~MessageGenerator();
// Append the two types of nested generators to the corresponding vector.
@@ -119,7 +122,6 @@
// default instance.
void GenerateConstexprConstructor(io::Printer* printer);
- void GenerateCreateSplitMessage(io::Printer* printer);
void GenerateInitDefaultSplitInstance(io::Printer* printer);
// Generate standard Message methods.
@@ -221,7 +223,6 @@
std::map<std::string, std::string> variables_;
friend class FileGenerator;
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageGenerator);
};
} // namespace cpp
diff --git a/src/google/protobuf/compiler/cpp/message_field.cc b/src/google/protobuf/compiler/cpp/message_field.cc
index 7e87a07..74cca18 100644
--- a/src/google/protobuf/compiler/cpp/message_field.cc
+++ b/src/google/protobuf/compiler/cpp/message_field.cc
@@ -32,13 +32,13 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/compiler/cpp/message_field.h>
+#include "google/protobuf/compiler/cpp/message_field.h"
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/compiler/cpp/field.h>
-#include <google/protobuf/compiler/cpp/helpers.h>
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/compiler/cpp/field.h"
+#include "google/protobuf/compiler/cpp/helpers.h"
-#include <google/protobuf/stubs/strutil.h>
+#include "google/protobuf/stubs/strutil.h"
namespace google {
namespace protobuf {
@@ -73,7 +73,7 @@
QualifiedDefaultInstancePtr(descriptor->message_type(), options),
implicit_weak);
(*variables)["type_reference_function"] =
- implicit_weak ? (" ::" + (*variables)["proto_ns"] +
+ implicit_weak ? (" ::" + ProtobufNamespace(options) +
"::internal::StrongReference(reinterpret_cast<const " +
(*variables)["type"] + "&>(\n" +
(*variables)["type_default_instance"] + "));\n")
@@ -343,7 +343,7 @@
format(
"::$proto_ns$::MessageLite*\n"
"$classname$::_Internal::mutable_$name$($classname$* msg) {\n");
- if (HasHasbit(descriptor_)) {
+ if (internal::cpp::HasHasbit(descriptor_)) {
format(" msg->$set_hasbit$\n");
}
if (descriptor_->real_containing_oneof() == nullptr) {
@@ -376,7 +376,7 @@
GOOGLE_CHECK(!IsFieldStripped(descriptor_, options_));
Formatter format(printer, variables_);
- if (!HasHasbit(descriptor_)) {
+ if (!internal::cpp::HasHasbit(descriptor_)) {
// If we don't have has-bits, message presence is indicated only by ptr !=
// nullptr. Thus on clear, we need to delete the object.
format(
@@ -394,7 +394,7 @@
GOOGLE_CHECK(!IsFieldStripped(descriptor_, options_));
Formatter format(printer, variables_);
- if (!HasHasbit(descriptor_)) {
+ if (!internal::cpp::HasHasbit(descriptor_)) {
// If we don't have has-bits, message presence is indicated only by ptr !=
// nullptr. Thus on clear, we need to delete the object.
format(
diff --git a/src/google/protobuf/compiler/cpp/message_field.h b/src/google/protobuf/compiler/cpp/message_field.h
index 70c42c0..39efe28 100644
--- a/src/google/protobuf/compiler/cpp/message_field.h
+++ b/src/google/protobuf/compiler/cpp/message_field.h
@@ -38,8 +38,8 @@
#include <map>
#include <string>
-#include <google/protobuf/compiler/cpp/field.h>
-#include <google/protobuf/compiler/cpp/helpers.h>
+#include "google/protobuf/compiler/cpp/field.h"
+#include "google/protobuf/compiler/cpp/helpers.h"
namespace google {
namespace protobuf {
@@ -51,6 +51,8 @@
MessageFieldGenerator(const FieldDescriptor* descriptor,
const Options& options,
MessageSCCAnalyzer* scc_analyzer);
+ MessageFieldGenerator(const MessageFieldGenerator&) = delete;
+ MessageFieldGenerator& operator=(const MessageFieldGenerator&) = delete;
~MessageFieldGenerator() override;
// implements FieldGenerator ---------------------------------------
@@ -81,9 +83,6 @@
protected:
const bool implicit_weak_field_;
const bool has_required_fields_;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageFieldGenerator);
};
class MessageOneofFieldGenerator : public MessageFieldGenerator {
@@ -91,6 +90,9 @@
MessageOneofFieldGenerator(const FieldDescriptor* descriptor,
const Options& options,
MessageSCCAnalyzer* scc_analyzer);
+ MessageOneofFieldGenerator(const MessageOneofFieldGenerator&) = delete;
+ MessageOneofFieldGenerator& operator=(const MessageOneofFieldGenerator&) =
+ delete;
~MessageOneofFieldGenerator() override;
// implements FieldGenerator ---------------------------------------
@@ -106,9 +108,6 @@
void GenerateDestructorCode(io::Printer* printer) const override;
void GenerateConstructorCode(io::Printer* printer) const override;
void GenerateIsInitialized(io::Printer* printer) const override;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageOneofFieldGenerator);
};
class RepeatedMessageFieldGenerator : public FieldGenerator {
@@ -116,6 +115,9 @@
RepeatedMessageFieldGenerator(const FieldDescriptor* descriptor,
const Options& options,
MessageSCCAnalyzer* scc_analyzer);
+ RepeatedMessageFieldGenerator(const RepeatedMessageFieldGenerator&) = delete;
+ RepeatedMessageFieldGenerator& operator=(
+ const RepeatedMessageFieldGenerator&) = delete;
~RepeatedMessageFieldGenerator() override;
// implements FieldGenerator ---------------------------------------
@@ -136,8 +138,6 @@
private:
const bool implicit_weak_field_;
const bool has_required_fields_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedMessageFieldGenerator);
};
} // namespace cpp
diff --git a/src/google/protobuf/compiler/cpp/message_layout_helper.h b/src/google/protobuf/compiler/cpp/message_layout_helper.h
index a8813a1..7727e67 100644
--- a/src/google/protobuf/compiler/cpp/message_layout_helper.h
+++ b/src/google/protobuf/compiler/cpp/message_layout_helper.h
@@ -35,8 +35,8 @@
#ifndef GOOGLE_PROTOBUF_COMPILER_CPP_MESSAGE_LAYOUT_HELPER_H__
#define GOOGLE_PROTOBUF_COMPILER_CPP_MESSAGE_LAYOUT_HELPER_H__
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/compiler/cpp/options.h>
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/compiler/cpp/options.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/compiler/cpp/message_size_unittest.cc b/src/google/protobuf/compiler/cpp/message_size_unittest.cc
index 761988b..ed4a90e 100644
--- a/src/google/protobuf/compiler/cpp/message_size_unittest.cc
+++ b/src/google/protobuf/compiler/cpp/message_size_unittest.cc
@@ -28,10 +28,10 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/unittest.pb.h>
+#include "google/protobuf/unittest.pb.h"
#include <gmock/gmock.h>
#include <gtest/gtest.h>
-#include <google/protobuf/descriptor.h>
+#include "google/protobuf/descriptor.h"
namespace google {
namespace protobuf {
@@ -139,9 +139,9 @@
TEST(GeneratedMessageTest, MoreStringSize) {
struct MockGenerated : public MockMessageBase { // 16 bytes
- int has_bits[1]; // 4 bytes
int cached_size; // 4 bytes
MockRepeatedPtrField data; // 24 bytes
+ // + 4 bytes padding
};
GOOGLE_CHECK_MESSAGE_SIZE(MockGenerated, 48);
EXPECT_EQ(sizeof(protobuf_unittest::MoreString), sizeof(MockGenerated));
diff --git a/src/google/protobuf/compiler/cpp/metadata_test.cc b/src/google/protobuf/compiler/cpp/metadata_test.cc
index 1ffd357..2a51655 100644
--- a/src/google/protobuf/compiler/cpp/metadata_test.cc
+++ b/src/google/protobuf/compiler/cpp/metadata_test.cc
@@ -30,15 +30,15 @@
#include <memory>
-#include <google/protobuf/testing/file.h>
-#include <google/protobuf/testing/file.h>
-#include <google/protobuf/compiler/cpp/generator.h>
-#include <google/protobuf/compiler/command_line_interface.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/testing/googletest.h>
+#include "google/protobuf/testing/file.h"
+#include "google/protobuf/testing/file.h"
+#include "google/protobuf/compiler/cpp/generator.h"
+#include "google/protobuf/compiler/command_line_interface.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/testing/googletest.h"
#include <gtest/gtest.h>
-#include <google/protobuf/compiler/annotation_test_util.h>
-#include <google/protobuf/compiler/cpp/helpers.h>
+#include "google/protobuf/compiler/annotation_test_util.h"
+#include "google/protobuf/compiler/cpp/helpers.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/compiler/cpp/move_unittest.cc b/src/google/protobuf/compiler/cpp/move_unittest.cc
index eb7cd1c..e723346 100644
--- a/src/google/protobuf/compiler/cpp/move_unittest.cc
+++ b/src/google/protobuf/compiler/cpp/move_unittest.cc
@@ -28,9 +28,9 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/test_util.h>
-#include <google/protobuf/unittest.pb.h>
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/test_util.h"
+#include "google/protobuf/unittest.pb.h"
#include <gtest/gtest.h>
#if LANG_CXX11
diff --git a/src/google/protobuf/compiler/cpp/names.h b/src/google/protobuf/compiler/cpp/names.h
index 7404ac5..d83cabb 100644
--- a/src/google/protobuf/compiler/cpp/names.h
+++ b/src/google/protobuf/compiler/cpp/names.h
@@ -34,7 +34,7 @@
#include <string>
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -92,6 +92,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_COMPILER_CPP_NAMES_H__
diff --git a/src/google/protobuf/compiler/cpp/options.h b/src/google/protobuf/compiler/cpp/options.h
index 5d935e9..7aab669 100644
--- a/src/google/protobuf/compiler/cpp/options.h
+++ b/src/google/protobuf/compiler/cpp/options.h
@@ -40,6 +40,7 @@
namespace protobuf {
namespace compiler {
class AccessInfoMap;
+class SplitMap;
namespace cpp {
@@ -58,6 +59,7 @@
// Generator options (see generator.cc for a description of each):
struct Options {
const AccessInfoMap* access_info_map = nullptr;
+ const SplitMap* split_map = nullptr;
std::string dllexport_decl;
std::string runtime_include_base;
std::string annotation_pragma_name;
@@ -80,10 +82,10 @@
bool annotate_accessor = false;
bool unused_field_stripping = false;
bool unverified_lazy_message_sets = false;
- bool unverified_lazy = false;
bool profile_driven_inline_string = true;
bool message_owned_arena_trial = false;
bool force_split = false;
+ bool profile_driven_split = true;
#ifdef PROTOBUF_STABLE_EXPERIMENTS
bool force_eagerly_verified_lazy = true;
bool force_inline_string = true;
diff --git a/src/google/protobuf/compiler/cpp/padding_optimizer.cc b/src/google/protobuf/compiler/cpp/padding_optimizer.cc
index 2091052..74804b2 100644
--- a/src/google/protobuf/compiler/cpp/padding_optimizer.cc
+++ b/src/google/protobuf/compiler/cpp/padding_optimizer.cc
@@ -28,9 +28,9 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/compiler/cpp/padding_optimizer.h>
+#include "google/protobuf/compiler/cpp/padding_optimizer.h"
-#include <google/protobuf/compiler/cpp/helpers.h>
+#include "google/protobuf/compiler/cpp/helpers.h"
namespace google {
namespace protobuf {
@@ -85,41 +85,11 @@
} // namespace
-// Reorder 'fields' so that if the fields are output into a c++ class in the new
-// order, fields of similar family (see below) are together and within each
-// family, alignment padding is minimized.
-//
-// We try to do this while keeping each field as close as possible to its field
-// number order so that we don't reduce cache locality much for function that
-// access each field in order. Originally, OptimizePadding used declaration
-// order for its decisions, but generated code minus the serializer/parsers uses
-// the output of OptimizePadding as well (stored in
-// MessageGenerator::optimized_order_). Since the serializers use field number
-// order, we use that as a tie-breaker.
-//
-// We classify each field into a particular "family" of fields, that we perform
-// the same operation on in our generated functions.
-//
-// REPEATED is placed first, as the C++ compiler automatically initializes
-// these fields in layout order.
-//
-// STRING is grouped next, as our Clear/SharedCtor/SharedDtor walks it and
-// calls ArenaStringPtr::Destroy on each.
-//
-// LAZY_MESSAGE is grouped next, as it interferes with the ability to memset
-// non-repeated fields otherwise.
-//
-// MESSAGE is grouped next, as our Clear/SharedDtor code walks it and calls
-// delete on each. We initialize these fields with a NULL pointer (see
-// MessageFieldGenerator::GenerateConstructorCode), which allows them to be
-// memset.
-//
-// ZERO_INITIALIZABLE is memset in Clear/SharedCtor
-//
-// OTHER these fields are initialized one-by-one.
-void PaddingOptimizer::OptimizeLayout(
- std::vector<const FieldDescriptor*>* fields, const Options& options,
- MessageSCCAnalyzer* scc_analyzer) {
+static void OptimizeLayoutHelper(std::vector<const FieldDescriptor*>* fields,
+ const Options& options,
+ MessageSCCAnalyzer* scc_analyzer) {
+ if (fields->empty()) return;
+
// The sorted numeric order of Family determines the declaration order in the
// memory layout.
enum Family {
@@ -222,6 +192,61 @@
}
}
+// Reorder 'fields' so that if the fields are output into a c++ class in the new
+// order, fields of similar family (see below) are together and within each
+// family, alignment padding is minimized.
+//
+// We try to do this while keeping each field as close as possible to its field
+// number order so that we don't reduce cache locality much for function that
+// access each field in order. Originally, OptimizePadding used declaration
+// order for its decisions, but generated code minus the serializer/parsers uses
+// the output of OptimizePadding as well (stored in
+// MessageGenerator::optimized_order_). Since the serializers use field number
+// order, we use that as a tie-breaker.
+//
+// We classify each field into a particular "family" of fields, that we perform
+// the same operation on in our generated functions.
+//
+// REPEATED is placed first, as the C++ compiler automatically initializes
+// these fields in layout order.
+//
+// STRING is grouped next, as our Clear/SharedCtor/SharedDtor walks it and
+// calls ArenaStringPtr::Destroy on each.
+//
+// LAZY_MESSAGE is grouped next, as it interferes with the ability to memset
+// non-repeated fields otherwise.
+//
+// MESSAGE is grouped next, as our Clear/SharedDtor code walks it and calls
+// delete on each. We initialize these fields with a NULL pointer (see
+// MessageFieldGenerator::GenerateConstructorCode), which allows them to be
+// memset.
+//
+// ZERO_INITIALIZABLE is memset in Clear/SharedCtor
+//
+// OTHER these fields are initialized one-by-one.
+//
+// If there are split fields in `fields`, they will be placed at the end. The
+// order within split fields follows the same rule, aka classify and order by
+// "family".
+void PaddingOptimizer::OptimizeLayout(
+ std::vector<const FieldDescriptor*>* fields, const Options& options,
+ MessageSCCAnalyzer* scc_analyzer) {
+ std::vector<const FieldDescriptor*> normal;
+ std::vector<const FieldDescriptor*> split;
+ for (const auto* field : *fields) {
+ if (ShouldSplit(field, options)) {
+ split.push_back(field);
+ } else {
+ normal.push_back(field);
+ }
+ }
+ OptimizeLayoutHelper(&normal, options, scc_analyzer);
+ OptimizeLayoutHelper(&split, options, scc_analyzer);
+ fields->clear();
+ fields->insert(fields->end(), normal.begin(), normal.end());
+ fields->insert(fields->end(), split.begin(), split.end());
+}
+
} // namespace cpp
} // namespace compiler
} // namespace protobuf
diff --git a/src/google/protobuf/compiler/cpp/padding_optimizer.h b/src/google/protobuf/compiler/cpp/padding_optimizer.h
index 9c76f38..4f55e64 100644
--- a/src/google/protobuf/compiler/cpp/padding_optimizer.h
+++ b/src/google/protobuf/compiler/cpp/padding_optimizer.h
@@ -35,7 +35,7 @@
#ifndef GOOGLE_PROTOBUF_COMPILER_CPP_PADDING_OPTIMIZER_H__
#define GOOGLE_PROTOBUF_COMPILER_CPP_PADDING_OPTIMIZER_H__
-#include <google/protobuf/compiler/cpp/message_layout_helper.h>
+#include "google/protobuf/compiler/cpp/message_layout_helper.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/compiler/cpp/parse_function_generator.cc b/src/google/protobuf/compiler/cpp/parse_function_generator.cc
index 0f1d767..00f4823 100644
--- a/src/google/protobuf/compiler/cpp/parse_function_generator.cc
+++ b/src/google/protobuf/compiler/cpp/parse_function_generator.cc
@@ -28,15 +28,18 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/compiler/cpp/parse_function_generator.h>
+#include "google/protobuf/compiler/cpp/parse_function_generator.h"
#include <algorithm>
#include <limits>
#include <string>
#include <utility>
-#include <google/protobuf/wire_format.h>
-#include <google/protobuf/compiler/cpp/helpers.h>
+#include "google/protobuf/wire_format.h"
+#include "absl/strings/str_cat.h"
+#include "google/protobuf/compiler/cpp/helpers.h"
+#include "google/protobuf/generated_message_tctable_gen.h"
+#include "google/protobuf/generated_message_tctable_impl.h"
namespace google {
namespace protobuf {
@@ -44,9 +47,21 @@
namespace cpp {
namespace {
+using internal::TailCallTableInfo;
+using internal::cpp::Utf8CheckMode;
using google::protobuf::internal::WireFormat;
using google::protobuf::internal::WireFormatLite;
+bool UseDirectTcParserTable(const FieldDescriptor* field,
+ const Options& options) {
+ if (field->cpp_type() != field->CPPTYPE_MESSAGE) return false;
+ auto* m = field->message_type();
+ return !m->options().message_set_wire_format() &&
+ m->file()->options().optimize_for() != FileOptions::CODE_SIZE &&
+ !HasSimpleBaseClass(m, options) && !HasTracker(m, options)
+ ;
+}
+
std::vector<const FieldDescriptor*> GetOrderedFields(
const Descriptor* descriptor, const Options& options) {
std::vector<const FieldDescriptor*> ordered_fields;
@@ -66,364 +81,26 @@
return ctype == FieldOptions::STRING || ctype == FieldOptions::CORD;
}
-int TagSize(uint32_t field_number) {
- if (field_number < 16) return 1;
- GOOGLE_CHECK_LT(field_number, (1 << 14))
- << "coded tag for " << field_number << " too big for uint16_t";
- return 2;
-}
-
-std::string FieldParseFunctionName(
- const TailCallTableInfo::FieldEntryInfo& entry, const Options& options);
-
-bool IsFieldEligibleForFastParsing(
- const TailCallTableInfo::FieldEntryInfo& entry, const Options& options,
- MessageSCCAnalyzer* scc_analyzer) {
- const auto* field = entry.field;
- // Map, oneof, weak, and lazy fields are not handled on the fast path.
- if (field->is_map() || field->real_containing_oneof() ||
- field->options().weak() ||
- IsImplicitWeakField(field, options, scc_analyzer) ||
- IsLazy(field, options, scc_analyzer)) {
- return false;
- }
-
- // We will check for a valid auxiliary index range later. However, we might
- // want to change the value we check for inlined string fields.
- int aux_idx = entry.aux_idx;
-
- switch (field->type()) {
- case FieldDescriptor::TYPE_ENUM:
- // If enum values are not validated at parse time, then this field can be
- // handled on the fast path like an int32.
- if (HasPreservingUnknownEnumSemantics(field)) {
- break;
- }
- if (field->is_repeated() && field->is_packed()) {
- return false;
- }
- break;
-
- // Some bytes fields can be handled on fast path.
- case FieldDescriptor::TYPE_STRING:
- case FieldDescriptor::TYPE_BYTES:
- if (field->options().ctype() != FieldOptions::STRING) {
- return false;
- }
- if (IsStringInlined(field, options)) {
- GOOGLE_CHECK(!field->is_repeated());
- // For inlined strings, the donation state index is stored in the
- // `aux_idx` field of the fast parsing info. We need to check the range
- // of that value instead of the auxiliary index.
- aux_idx = entry.inlined_string_idx;
- }
- break;
-
- default:
- break;
- }
-
- if (HasHasbit(field)) {
- // The tailcall parser can only update the first 32 hasbits. Fields with
- // has-bits beyond the first 32 are handled by mini parsing/fallback.
- GOOGLE_CHECK_GE(entry.hasbit_idx, 0) << field->DebugString();
- if (entry.hasbit_idx >= 32) return false;
- }
-
- // If the field needs auxiliary data, then the aux index is needed. This
- // must fit in a uint8_t.
- if (aux_idx > std::numeric_limits<uint8_t>::max()) {
- return false;
- }
-
- // The largest tag that can be read by the tailcall parser is two bytes
- // when varint-coded. This allows 14 bits for the numeric tag value:
- // byte 0 byte 1
- // 1nnnnttt 0nnnnnnn
- // ^^^^^^^ ^^^^^^^
- if (field->number() >= 1 << 11) return false;
-
- return true;
-}
-
-std::vector<TailCallTableInfo::FastFieldInfo> SplitFastFieldsForSize(
- const std::vector<TailCallTableInfo::FieldEntryInfo>& field_entries,
- int table_size_log2, const Options& options,
- MessageSCCAnalyzer* scc_analyzer) {
- std::vector<TailCallTableInfo::FastFieldInfo> result(1 << table_size_log2);
- const uint32_t idx_mask = result.size() - 1;
-
- for (const auto& entry : field_entries) {
- if (!IsFieldEligibleForFastParsing(entry, options, scc_analyzer)) {
- continue;
- }
-
- const auto* field = entry.field;
- uint32_t tag = WireFormat::MakeTag(field);
-
- // Construct the varint-coded tag. If it is more than 7 bits, we need to
- // shift the high bits and add a continue bit.
- if (uint32_t hibits = tag & 0xFFFFFF80) {
- tag = tag + hibits + 128; // tag = lobits + 2*hibits + 128
- }
-
- // The field index is determined by the low bits of the field number, where
- // the table size determines the width of the mask. The largest table
- // supported is 32 entries. The parse loop uses these bits directly, so that
- // the dispatch does not require arithmetic:
- // byte 0 byte 1
- // tag: 1nnnnttt 0nnnnnnn
- // ^^^^^
- // idx (table_size_log2=5)
- // This means that any field number that does not fit in the lower 4 bits
- // will always have the top bit of its table index asserted.
- const uint32_t fast_idx = (tag >> 3) & idx_mask;
-
- TailCallTableInfo::FastFieldInfo& info = result[fast_idx];
- if (info.field != nullptr) {
- // This field entry is already filled.
- continue;
- }
-
- // Fill in this field's entry:
- GOOGLE_CHECK(info.func_name.empty()) << info.func_name;
- info.func_name = FieldParseFunctionName(entry, options);
- info.field = field;
- info.coded_tag = tag;
- // If this field does not have presence, then it can set an out-of-bounds
- // bit (tailcall parsing uses a uint64_t for hasbits, but only stores 32).
- info.hasbit_idx = HasHasbit(field) ? entry.hasbit_idx : 63;
- if (IsStringInlined(field, options)) {
- GOOGLE_CHECK(!field->is_repeated());
- info.aux_idx = static_cast<uint8_t>(entry.inlined_string_idx);
- } else {
- info.aux_idx = static_cast<uint8_t>(entry.aux_idx);
- }
- }
- return result;
-}
-
-// Filter out fields that will be handled by mini parsing.
-std::vector<const FieldDescriptor*> FilterMiniParsedFields(
- const std::vector<const FieldDescriptor*>& fields, const Options& options,
- MessageSCCAnalyzer* scc_analyzer) {
- std::vector<const FieldDescriptor*> generated_fallback_fields;
-
- for (const auto* field : fields) {
- bool handled = false;
- switch (field->type()) {
- case FieldDescriptor::TYPE_DOUBLE:
- case FieldDescriptor::TYPE_FLOAT:
- case FieldDescriptor::TYPE_FIXED32:
- case FieldDescriptor::TYPE_SFIXED32:
- case FieldDescriptor::TYPE_FIXED64:
- case FieldDescriptor::TYPE_SFIXED64:
- case FieldDescriptor::TYPE_BOOL:
- case FieldDescriptor::TYPE_UINT32:
- case FieldDescriptor::TYPE_SINT32:
- case FieldDescriptor::TYPE_INT32:
- case FieldDescriptor::TYPE_UINT64:
- case FieldDescriptor::TYPE_SINT64:
- case FieldDescriptor::TYPE_INT64:
- // These are handled by MiniParse, so we don't need any generated
- // fallback code.
- handled = true;
- break;
-
- case FieldDescriptor::TYPE_ENUM:
- if (field->is_repeated() && !HasPreservingUnknownEnumSemantics(field)) {
- // TODO(b/206890171): handle packed repeated closed enums
- // Non-packed repeated can be handled using tables, but we still
- // need to generate fallback code for all repeated enums in order to
- // handle packed encoding. This is because of the lite/full split
- // when handling invalid enum values in a packed field.
- handled = false;
- } else {
- handled = true;
- }
- break;
-
- case FieldDescriptor::TYPE_BYTES:
- case FieldDescriptor::TYPE_STRING:
- if (IsStringInlined(field, options)) {
- // TODO(b/198211897): support InilnedStringField.
- handled = false;
- } else {
- handled = true;
- }
- break;
-
- case FieldDescriptor::TYPE_MESSAGE:
- case FieldDescriptor::TYPE_GROUP:
- // TODO(b/210762816): support remaining field types.
- if (field->is_map() || IsWeak(field, options) ||
- IsImplicitWeakField(field, options, scc_analyzer) ||
- IsLazy(field, options, scc_analyzer)) {
- handled = false;
- } else {
- handled = true;
- }
- break;
-
- default:
- handled = false;
- break;
- }
- if (!handled) generated_fallback_fields.push_back(field);
- }
-
- return generated_fallback_fields;
-}
-
} // namespace
-TailCallTableInfo::TailCallTableInfo(
- const Descriptor* descriptor, const Options& options,
- const std::vector<const FieldDescriptor*>& ordered_fields,
- const std::vector<int>& has_bit_indices,
- const std::vector<int>& inlined_string_indices,
- MessageSCCAnalyzer* scc_analyzer) {
- int oneof_count = descriptor->real_oneof_decl_count();
- // If this message has any oneof fields, store the case offset in the first
- // auxiliary entry.
- if (oneof_count > 0) {
- GOOGLE_LOG_IF(DFATAL, ordered_fields.empty())
- << "Invalid message: " << descriptor->full_name() << " has "
- << oneof_count << " oneof declarations, but no fields";
- aux_entries.push_back(StrCat("_fl::Offset{offsetof(",
- ClassName(descriptor),
- ", _impl_._oneof_case_)}"));
+class ParseFunctionGenerator::GeneratedOptionProvider final
+ : public internal::TailCallTableInfo::OptionProvider {
+ public:
+ explicit GeneratedOptionProvider(ParseFunctionGenerator* gen) : gen_(gen) {}
+ TailCallTableInfo::PerFieldOptions GetForField(
+ const FieldDescriptor* field) const final {
+ return {IsLazy(field, gen_->options_, gen_->scc_analyzer_),
+ IsStringInlined(field, gen_->options_),
+ IsImplicitWeakField(field, gen_->options_, gen_->scc_analyzer_),
+ UseDirectTcParserTable(field, gen_->options_),
+ GetOptimizeFor(field->file(), gen_->options_) ==
+ FileOptions::LITE_RUNTIME,
+ ShouldSplit(field, gen_->options_)};
}
- // If this message has any inlined string fields, store the donation state
- // offset in the second auxiliary entry.
- if (!inlined_string_indices.empty()) {
- aux_entries.resize(2); // pad if necessary
- aux_entries[1] =
- StrCat("_fl::Offset{offsetof(", ClassName(descriptor),
- ", _impl_._inlined_string_donated_)}");
- }
-
- // Fill in mini table entries.
- for (const FieldDescriptor* field : ordered_fields) {
- field_entries.push_back(
- {field, (HasHasbit(field) ? has_bit_indices[field->index()] : -1)});
- auto& entry = field_entries.back();
-
- if (field->type() == FieldDescriptor::TYPE_MESSAGE ||
- field->type() == FieldDescriptor::TYPE_GROUP) {
- // Message-typed fields have a FieldAux with the default instance pointer.
- if (field->is_map()) {
- // TODO(b/205904770): generate aux entries for maps
- } else if (IsWeak(field, options)) {
- // Don't generate anything for weak fields. They are handled by the
- // generated fallback.
- } else if (IsImplicitWeakField(field, options, scc_analyzer)) {
- // Implicit weak fields don't need to store a default instance pointer.
- } else if (IsLazy(field, options, scc_analyzer)) {
- // Lazy fields are handled by the generated fallback function.
- } else {
- field_entries.back().aux_idx = aux_entries.size();
- const Descriptor* field_type = field->message_type();
- aux_entries.push_back(StrCat(
- "reinterpret_cast<const ", QualifiedClassName(field_type, options),
- "*>(&", QualifiedDefaultInstanceName(field_type, options), ")"));
- }
- } else if (field->type() == FieldDescriptor::TYPE_ENUM &&
- !HasPreservingUnknownEnumSemantics(field)) {
- // Enum fields which preserve unknown values (proto3 behavior) are
- // effectively int32 fields with respect to parsing -- i.e., the value
- // does not need to be validated at parse time.
- //
- // Enum fields which do not preserve unknown values (proto2 behavior) use
- // a FieldAux to store validation information. If the enum values are
- // sequential (and within a range we can represent), then the FieldAux
- // entry represents the range using the minimum value (which must fit in
- // an int16_t) and count (a uint16_t). Otherwise, the entry holds a
- // pointer to the generated Name_IsValid function.
-
- entry.aux_idx = aux_entries.size();
- const EnumDescriptor* enum_type = field->enum_type();
- GOOGLE_CHECK_GT(enum_type->value_count(), 0) << enum_type->DebugString();
-
- // Check if the enum values are a single, contiguous range.
- std::vector<int> enum_values;
- for (int i = 0, N = enum_type->value_count(); i < N; ++i) {
- enum_values.push_back(enum_type->value(i)->number());
- }
- auto values_begin = enum_values.begin();
- auto values_end = enum_values.end();
- std::sort(values_begin, values_end);
- enum_values.erase(std::unique(values_begin, values_end), values_end);
-
- if (enum_values.back() - enum_values[0] == enum_values.size() - 1 &&
- enum_values[0] >= std::numeric_limits<int16_t>::min() &&
- enum_values[0] <= std::numeric_limits<int16_t>::max() &&
- enum_values.size() <= std::numeric_limits<uint16_t>::max()) {
- entry.is_enum_range = true;
- aux_entries.push_back(
- StrCat(enum_values[0], ", ", enum_values.size()));
- } else {
- entry.is_enum_range = false;
- aux_entries.push_back(
- StrCat(QualifiedClassName(enum_type, options), "_IsValid"));
- }
- } else if ((field->type() == FieldDescriptor::TYPE_STRING ||
- field->type() == FieldDescriptor::TYPE_BYTES) &&
- IsStringInlined(field, options)) {
- GOOGLE_CHECK(!field->is_repeated());
- // Inlined strings have an extra marker to represent their donation state.
- int idx = inlined_string_indices[field->index()];
- // For mini parsing, the donation state index is stored as an `offset`
- // auxiliary entry.
- entry.aux_idx = aux_entries.size();
- aux_entries.push_back(StrCat("_fl::Offset{", idx, "}"));
- // For fast table parsing, the donation state index is stored instead of
- // the aux_idx (this will limit the range to 8 bits).
- entry.inlined_string_idx = idx;
- }
- }
-
- // Choose the smallest fast table that covers the maximum number of fields.
- table_size_log2 = 0; // fallback value
- int num_fast_fields = -1;
- for (int try_size_log2 : {0, 1, 2, 3, 4, 5}) {
- size_t try_size = 1 << try_size_log2;
- auto split_fields = SplitFastFieldsForSize(field_entries, try_size_log2,
- options, scc_analyzer);
- GOOGLE_CHECK_EQ(split_fields.size(), try_size);
- int try_num_fast_fields = 0;
- for (const auto& info : split_fields) {
- if (info.field != nullptr) ++try_num_fast_fields;
- }
- // Use this size if (and only if) it covers more fields.
- if (try_num_fast_fields > num_fast_fields) {
- fast_path_fields = std::move(split_fields);
- table_size_log2 = try_size_log2;
- num_fast_fields = try_num_fast_fields;
- }
- // The largest table we allow has the same number of entries as the message
- // has fields, rounded up to the next power of 2 (e.g., a message with 5
- // fields can have a fast table of size 8). A larger table *might* cover
- // more fields in certain cases, but a larger table in that case would have
- // mostly empty entries; so, we cap the size to avoid pathologically sparse
- // tables.
- if (try_size > ordered_fields.size()) {
- break;
- }
- }
-
- // Filter out fields that are handled by MiniParse. We don't need to generate
- // a fallback for these, which saves code size.
- fallback_fields = FilterMiniParsedFields(ordered_fields, options,
- scc_analyzer);
-
- // If there are no fallback fields, and at most one extension range, the
- // parser can use a generic fallback function. Otherwise, a message-specific
- // fallback routine is needed.
- use_generated_fallback =
- !fallback_fields.empty() || descriptor->extension_range_count() > 1;
-}
+ private:
+ ParseFunctionGenerator* gen_;
+};
ParseFunctionGenerator::ParseFunctionGenerator(
const Descriptor* descriptor, int max_has_bit_index,
@@ -440,10 +117,9 @@
num_hasbits_(max_has_bit_index) {
if (should_generate_tctable()) {
tc_table_info_.reset(new TailCallTableInfo(
- descriptor_, options_, ordered_fields_, has_bit_indices,
- inlined_string_indices, scc_analyzer));
+ descriptor_, ordered_fields_, GeneratedOptionProvider(this),
+ has_bit_indices, inlined_string_indices));
}
- SetCommonVars(options_, &variables_);
SetCommonMessageDataVariables(descriptor_, &variables_);
SetUnknownFieldsVariable(descriptor_, options_, &variables_);
variables_["classname"] = ClassName(descriptor, false);
@@ -518,6 +194,9 @@
if (options_.tctable_mode == Options::kTCTableNever) {
return false;
}
+ if (HasSimpleBaseClass(descriptor_, options_)) {
+ return false;
+ }
return true;
}
@@ -547,7 +226,7 @@
if (num_hasbits_ > 0) {
// Sync hasbits
- format("typed_msg->_impl_._has_bits_[0] = hasbits;\n");
+ format("typed_msg->_impl_._has_bits_[0] |= hasbits;\n");
}
format("uint32_t tag = data.tag();\n");
@@ -604,10 +283,14 @@
}
auto field_num_to_entry_table = MakeNumToEntryTable(ordered_fields_);
format(
+ "friend class ::$proto_ns$::internal::TcParser;\n"
"static const ::$proto_ns$::internal::"
"TcParseTable<$1$, $2$, $3$, $4$, $5$> _table_;\n",
tc_table_info_->table_size_log2, ordered_fields_.size(),
- tc_table_info_->aux_entries.size(), CalculateFieldNamesSize(),
+ tc_table_info_->aux_entries.size(),
+ // We add a +1 here to allow for a NUL termination character. It makes the
+ // codegen nicer.
+ tc_table_info_->field_name_data.size() + 1,
field_num_to_entry_table.size16());
if (should_generate_guarded_tctable()) {
format.Outdent();
@@ -761,12 +444,13 @@
// unknown fields and potentially an extension range.
auto field_num_to_entry_table = MakeNumToEntryTable(ordered_fields_);
format(
- "PROTOBUF_ATTRIBUTE_INIT_PRIORITY1\n"
+ "PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1\n"
"const ::_pbi::TcParseTable<$1$, $2$, $3$, $4$, $5$> "
"$classname$::_table_ = "
"{\n",
tc_table_info_->table_size_log2, ordered_fields_.size(),
- tc_table_info_->aux_entries.size(), CalculateFieldNamesSize(),
+ tc_table_info_->aux_entries.size(),
+ tc_table_info_->field_name_data.size() + 1, // See above for why +1
field_num_to_entry_table.size16());
{
auto table_scope = format.ScopedIndent();
@@ -874,8 +558,46 @@
{
// aux_entries[]
auto aux_scope = format.ScopedIndent();
- for (const std::string& aux_entry : tc_table_info_->aux_entries) {
- format("{$1$},\n", aux_entry);
+ for (const auto& aux_entry : tc_table_info_->aux_entries) {
+ switch (aux_entry.type) {
+ case TailCallTableInfo::kNothing:
+ format("{},\n");
+ break;
+ case TailCallTableInfo::kInlinedStringDonatedOffset:
+ format(
+ "{_fl::Offset{offsetof($classname$, "
+ "_impl_._inlined_string_donated_)}},\n");
+ break;
+ case TailCallTableInfo::kSplitOffset:
+ format(
+ "{_fl::Offset{offsetof($classname$, _impl_._split_)}},\n");
+ break;
+ case TailCallTableInfo::kSplitSizeof:
+ format("{_fl::Offset{sizeof($classname$::Impl_::Split)}},\n");
+ break;
+ case TailCallTableInfo::kSubMessage:
+ format("{::_pbi::FieldAuxDefaultMessage{}, &$1$},\n",
+ QualifiedDefaultInstanceName(
+ aux_entry.field->message_type(), options_));
+ break;
+ case TailCallTableInfo::kSubTable:
+ format("{::_pbi::TcParser::GetTable<$1$>()},\n",
+ QualifiedClassName(aux_entry.field->message_type(),
+ options_));
+ break;
+ case TailCallTableInfo::kEnumRange:
+ format("{$1$, $2$},\n", aux_entry.enum_range.start,
+ aux_entry.enum_range.size);
+ break;
+ case TailCallTableInfo::kEnumValidator:
+ format(
+ "{$1$_IsValid},\n",
+ QualifiedClassName(aux_entry.field->enum_type(), options_));
+ break;
+ case TailCallTableInfo::kNumericOffset:
+ format("{_fl::Offset{$1$}},\n", aux_entry.offset);
+ break;
+ }
}
}
format("}}, {{\n");
@@ -898,145 +620,171 @@
}
if (info.func_name.empty()) {
format("{::_pbi::TcParser::MiniParse, {}},\n");
+ } else if (info.field == nullptr) {
+ // Fast slot that is not associated with a field. Eg end group tags.
+ format("{$1$, {$2$, $3$}},\n", info.func_name, info.coded_tag,
+ info.nonfield_info);
} else {
- bool cold = ShouldSplit(info.field, options_);
+ GOOGLE_CHECK(!ShouldSplit(info.field, options_));
+
+ std::string func_name = info.func_name;
+ // For 1-byte tags we have a more optimized version of the varint parser
+ // that can hardcode the offset and has bit.
+ if (absl::EndsWith(func_name, "V8S1") ||
+ absl::EndsWith(func_name, "V32S1") ||
+ absl::EndsWith(func_name, "V64S1")) {
+ std::string field_type = absl::EndsWith(func_name, "V8S1") ? "bool"
+ : absl::EndsWith(func_name, "V32S1")
+ ? "uint32_t"
+ : "uint64_t";
+ func_name =
+ absl::StrCat("::_pbi::TcParser::SingularVarintNoZag1<", field_type,
+ ", offsetof(", //
+ ClassName(info.field->containing_type()), //
+ ", ", //
+ FieldMemberName(info.field, /*split=*/false), //
+ "), ", //
+ info.hasbit_idx, //
+ ">()");
+ }
+
format(
"{$1$,\n"
- " {$2$, $3$, $4$, PROTOBUF_FIELD_OFFSET($classname$$5$, $6$)}},\n",
- info.func_name, info.coded_tag, info.hasbit_idx, info.aux_idx,
- cold ? "::Impl_::Split" : "",
- cold ? FieldName(info.field) + "_"
- : FieldMemberName(info.field, /*cold=*/false));
+ " {$2$, $3$, $4$, PROTOBUF_FIELD_OFFSET($classname$, $5$)}},\n",
+ func_name, info.coded_tag, info.hasbit_idx, info.aux_idx,
+ FieldMemberName(info.field, /*split=*/false));
}
}
}
static void FormatFieldKind(Formatter& format,
- const TailCallTableInfo::FieldEntryInfo& entry,
- const Options& options,
- MessageSCCAnalyzer* scc_analyzer) {
- const FieldDescriptor* field = entry.field;
- // Spell the field kind in proto language declaration order, starting with
- // cardinality:
- format("(::_fl::kFc");
- if (HasHasbit(field)) {
- format("Optional");
- } else if (field->is_repeated()) {
- format("Repeated");
- } else if (field->real_containing_oneof()) {
- format("Oneof");
- } else {
- format("Singular");
- }
+ const TailCallTableInfo::FieldEntryInfo& entry) {
+ // In here we convert the runtime value of entry.type_card back into a
+ // sequence of literal enum labels. We use the mnenonic labels for nicer
+ // codegen.
+ namespace fl = internal::field_layout;
+ const uint16_t type_card = entry.type_card;
+ const int rep_index = (type_card & fl::kRepMask) >> fl::kRepShift;
+ const int tv_index = (type_card & fl::kTvMask) >> fl::kTvShift;
- // The rest of the type uses convenience aliases:
- format(" | ::_fl::k");
- if (field->is_repeated() && field->is_packed()) {
- format("Packed");
- }
- switch (field->type()) {
- case FieldDescriptor::TYPE_DOUBLE:
- format("Double");
- break;
- case FieldDescriptor::TYPE_FLOAT:
- format("Float");
- break;
- case FieldDescriptor::TYPE_FIXED32:
- format("Fixed32");
- break;
- case FieldDescriptor::TYPE_SFIXED32:
- format("SFixed32");
- break;
- case FieldDescriptor::TYPE_FIXED64:
- format("Fixed64");
- break;
- case FieldDescriptor::TYPE_SFIXED64:
- format("SFixed64");
- break;
- case FieldDescriptor::TYPE_BOOL:
- format("Bool");
- break;
- case FieldDescriptor::TYPE_ENUM:
- if (HasPreservingUnknownEnumSemantics(field)) {
- // No validation is required.
- format("OpenEnum");
- } else if (entry.is_enum_range) {
- // Validation is done by range check (start/length in FieldAux).
- format("EnumRange");
- } else {
- // Validation uses the generated _IsValid function.
- format("Enum");
- }
- break;
- case FieldDescriptor::TYPE_UINT32:
- format("UInt32");
- break;
- case FieldDescriptor::TYPE_SINT32:
- format("SInt32");
- break;
- case FieldDescriptor::TYPE_INT32:
- format("Int32");
- break;
- case FieldDescriptor::TYPE_UINT64:
- format("UInt64");
- break;
- case FieldDescriptor::TYPE_SINT64:
- format("SInt64");
- break;
- case FieldDescriptor::TYPE_INT64:
- format("Int64");
- break;
+ format("(");
+ static constexpr const char* kFieldCardNames[] = {"Singular", "Optional",
+ "Repeated", "Oneof"};
+ static_assert((fl::kFcSingular >> fl::kFcShift) == 0, "");
+ static_assert((fl::kFcOptional >> fl::kFcShift) == 1, "");
+ static_assert((fl::kFcRepeated >> fl::kFcShift) == 2, "");
+ static_assert((fl::kFcOneof >> fl::kFcShift) == 3, "");
- case FieldDescriptor::TYPE_BYTES:
- format("Bytes");
- break;
- case FieldDescriptor::TYPE_STRING: {
- auto mode = GetUtf8CheckMode(field, options);
- switch (mode) {
- case Utf8CheckMode::kStrict:
- format("Utf8String");
- break;
- case Utf8CheckMode::kVerify:
- format("RawString");
- break;
- case Utf8CheckMode::kNone:
- // Treat LITE_RUNTIME strings as bytes.
- format("Bytes");
- break;
+ format("::_fl::kFc$1$",
+ kFieldCardNames[(type_card & fl::kFcMask) >> fl::kFcShift]);
+
+#define PROTOBUF_INTERNAL_TYPE_CARD_CASE(x) \
+ case fl::k##x: \
+ format(" | ::_fl::k" #x); \
+ break
+
+ switch (type_card & fl::kFkMask) {
+ case fl::kFkString: {
+ switch (type_card & ~fl::kFcMask & ~fl::kRepMask & ~fl::kSplitMask) {
+ PROTOBUF_INTERNAL_TYPE_CARD_CASE(Bytes);
+ PROTOBUF_INTERNAL_TYPE_CARD_CASE(RawString);
+ PROTOBUF_INTERNAL_TYPE_CARD_CASE(Utf8String);
default:
- GOOGLE_LOG(FATAL) << "Invalid Utf8CheckMode (" << static_cast<int>(mode)
- << ") for " << field->DebugString();
+ GOOGLE_LOG(FATAL) << "Unknown type_card: 0x" << type_card;
+ }
+
+ static constexpr const char* kRepNames[] = {"AString", "IString", "Cord",
+ "SPiece", "SString"};
+ static_assert((fl::kRepAString >> fl::kRepShift) == 0, "");
+ static_assert((fl::kRepIString >> fl::kRepShift) == 1, "");
+ static_assert((fl::kRepCord >> fl::kRepShift) == 2, "");
+ static_assert((fl::kRepSPiece >> fl::kRepShift) == 3, "");
+ static_assert((fl::kRepSString >> fl::kRepShift) == 4, "");
+
+ format(" | ::_fl::kRep$1$", kRepNames[rep_index]);
+ break;
+ }
+
+ case fl::kFkMessage: {
+ format(" | ::_fl::kMessage");
+
+ static constexpr const char* kRepNames[] = {nullptr, "Group", "Lazy",
+ "IWeak"};
+ static_assert((fl::kRepGroup >> fl::kRepShift) == 1, "");
+ static_assert((fl::kRepLazy >> fl::kRepShift) == 2, "");
+ static_assert((fl::kRepIWeak >> fl::kRepShift) == 3, "");
+
+ if (auto* rep = kRepNames[rep_index]) {
+ format(" | ::_fl::kRep$1$", rep);
+ }
+
+ static constexpr const char* kXFormNames[] = {nullptr, "Default",
+ "Table"};
+ static_assert((fl::kTvDefault >> fl::kTvShift) == 1, "");
+ static_assert((fl::kTvTable >> fl::kTvShift) == 2, "");
+
+ if (auto* xform = kXFormNames[tv_index]) {
+ format(" | ::_fl::kTv$1$", xform);
}
break;
}
- case FieldDescriptor::TYPE_GROUP:
- format("Message | ::_fl::kRepGroup");
+ case fl::kFkMap:
+ format(" | ::_fl::kMap");
break;
- case FieldDescriptor::TYPE_MESSAGE:
- if (field->is_map()) {
- format("Map");
- } else {
- format("Message");
- if (IsLazy(field, options, scc_analyzer)) {
- format(" | ::_fl::kRepLazy");
- } else if (IsImplicitWeakField(field, options, scc_analyzer)) {
- format(" | ::_fl::kRepIWeak");
- }
- }
- break;
- }
- // Fill in extra information about string and bytes field representations.
- if (field->type() == FieldDescriptor::TYPE_BYTES ||
- field->type() == FieldDescriptor::TYPE_STRING) {
- if (field->is_repeated()) {
- format(" | ::_fl::kRepSString");
- } else {
- format(" | ::_fl::kRepAString");
+ case fl::kFkNone:
+ break;
+
+ case fl::kFkVarint:
+ case fl::kFkPackedVarint:
+ case fl::kFkFixed:
+ case fl::kFkPackedFixed: {
+ switch (type_card & ~fl::kFcMask & ~fl::kSplitMask) {
+ PROTOBUF_INTERNAL_TYPE_CARD_CASE(Bool);
+ PROTOBUF_INTERNAL_TYPE_CARD_CASE(Fixed32);
+ PROTOBUF_INTERNAL_TYPE_CARD_CASE(UInt32);
+ PROTOBUF_INTERNAL_TYPE_CARD_CASE(SFixed32);
+ PROTOBUF_INTERNAL_TYPE_CARD_CASE(Int32);
+ PROTOBUF_INTERNAL_TYPE_CARD_CASE(SInt32);
+ PROTOBUF_INTERNAL_TYPE_CARD_CASE(Float);
+ PROTOBUF_INTERNAL_TYPE_CARD_CASE(Enum);
+ PROTOBUF_INTERNAL_TYPE_CARD_CASE(EnumRange);
+ PROTOBUF_INTERNAL_TYPE_CARD_CASE(OpenEnum);
+ PROTOBUF_INTERNAL_TYPE_CARD_CASE(Fixed64);
+ PROTOBUF_INTERNAL_TYPE_CARD_CASE(UInt64);
+ PROTOBUF_INTERNAL_TYPE_CARD_CASE(SFixed64);
+ PROTOBUF_INTERNAL_TYPE_CARD_CASE(Int64);
+ PROTOBUF_INTERNAL_TYPE_CARD_CASE(SInt64);
+ PROTOBUF_INTERNAL_TYPE_CARD_CASE(Double);
+ PROTOBUF_INTERNAL_TYPE_CARD_CASE(PackedBool);
+ PROTOBUF_INTERNAL_TYPE_CARD_CASE(PackedFixed32);
+ PROTOBUF_INTERNAL_TYPE_CARD_CASE(PackedUInt32);
+ PROTOBUF_INTERNAL_TYPE_CARD_CASE(PackedSFixed32);
+ PROTOBUF_INTERNAL_TYPE_CARD_CASE(PackedInt32);
+ PROTOBUF_INTERNAL_TYPE_CARD_CASE(PackedSInt32);
+ PROTOBUF_INTERNAL_TYPE_CARD_CASE(PackedFloat);
+ PROTOBUF_INTERNAL_TYPE_CARD_CASE(PackedEnum);
+ PROTOBUF_INTERNAL_TYPE_CARD_CASE(PackedEnumRange);
+ PROTOBUF_INTERNAL_TYPE_CARD_CASE(PackedOpenEnum);
+ PROTOBUF_INTERNAL_TYPE_CARD_CASE(PackedFixed64);
+ PROTOBUF_INTERNAL_TYPE_CARD_CASE(PackedUInt64);
+ PROTOBUF_INTERNAL_TYPE_CARD_CASE(PackedSFixed64);
+ PROTOBUF_INTERNAL_TYPE_CARD_CASE(PackedInt64);
+ PROTOBUF_INTERNAL_TYPE_CARD_CASE(PackedSInt64);
+ PROTOBUF_INTERNAL_TYPE_CARD_CASE(PackedDouble);
+ default:
+ GOOGLE_LOG(FATAL) << "Unknown type_card: 0x" << type_card;
+ }
}
}
+ if (type_card & fl::kSplitMask) {
+ format(" | ::_fl::kSplitTrue");
+ }
+
+#undef PROTOBUF_INTERNAL_TYPE_CARD_CASE
+
format(")");
}
@@ -1051,78 +799,63 @@
format("/* weak */ 0, 0, 0, 0");
} else {
const OneofDescriptor* oneof = field->real_containing_oneof();
- bool cold = ShouldSplit(field, options_);
- format("PROTOBUF_FIELD_OFFSET($classname$$1$, $2$), $3$, $4$,\n ",
- cold ? "::Impl_::Split" : "",
- cold ? FieldName(field) + "_"
- : FieldMemberName(field, /*cold=*/false),
- (oneof ? oneof->index() : entry.hasbit_idx), entry.aux_idx);
- FormatFieldKind(format, entry, options_, scc_analyzer_);
+ bool split = ShouldSplit(field, options_);
+ if (split) {
+ format("PROTOBUF_FIELD_OFFSET($classname$::Impl_::Split, $1$), ",
+ FieldName(field) + "_");
+ } else {
+ format("PROTOBUF_FIELD_OFFSET($classname$, $1$), ",
+ FieldMemberName(field, /*cold=*/false));
+ }
+ if (oneof) {
+ format("_Internal::kOneofCaseOffset + $1$, ", 4 * oneof->index());
+ } else if (num_hasbits_ > 0 || IsMapEntryMessage(descriptor_)) {
+ if (entry.hasbit_idx >= 0) {
+ format("_Internal::kHasBitsOffset + $1$, ", entry.hasbit_idx);
+ } else {
+ format("$1$, ", entry.hasbit_idx);
+ }
+ } else {
+ format("0, ");
+ }
+ format("$1$,\n ", entry.aux_idx);
+ FormatFieldKind(format, entry);
}
format("},\n");
}
}
-static constexpr int kMaxNameLength = 255;
-
-int ParseFunctionGenerator::CalculateFieldNamesSize() const {
- // The full name of the message appears first.
- int size = std::min(static_cast<int>(descriptor_->full_name().size()),
- kMaxNameLength);
- int lengths_size = 1;
- for (const auto& entry : tc_table_info_->field_entries) {
- const FieldDescriptor* field = entry.field;
- GOOGLE_CHECK_LE(field->name().size(), kMaxNameLength);
- size += field->name().size();
- lengths_size += 1;
- }
- // align to an 8-byte boundary
- lengths_size = (lengths_size + 7) & -8;
- return size + lengths_size + 1;
-}
-
-static void FormatOctal(Formatter& format, int size) {
- int octal_size = ((size >> 6) & 3) * 100 + //
- ((size >> 3) & 7) * 10 + //
- ((size >> 0) & 7);
- format("\\$1$", octal_size);
-}
-
void ParseFunctionGenerator::GenerateFieldNames(Formatter& format) {
- // First, we output the size of each string, as an unsigned byte. The first
- // string is the message name.
- int count = 1;
+ // We could just output the bytes directly, but we want it to look better than
+ // that in the source code. Also, it is more efficient for compilation time to
+ // have a literal string than an initializer list of chars.
+
+ const int total_sizes =
+ static_cast<int>(((tc_table_info_->field_entries.size() + 1) + 7) & ~7);
+ const uint8_t* p = tc_table_info_->field_name_data.data();
+ const uint8_t* sizes = p;
+ const uint8_t* sizes_end = sizes + total_sizes;
+
+ // First print all the sizes as octal
format("\"");
- FormatOctal(format,
- std::min(static_cast<int>(descriptor_->full_name().size()), 255));
- for (const auto& entry : tc_table_info_->field_entries) {
- FormatOctal(format, entry.field->name().size());
- ++count;
- }
- while (count & 7) { // align to an 8-byte boundary
- format("\\0");
- ++count;
+ for (int i = 0; i < total_sizes; ++i) {
+ int size = *p++;
+ int octal_size = ((size >> 6) & 3) * 100 + //
+ ((size >> 3) & 7) * 10 + //
+ ((size >> 0) & 7);
+ format("\\$1$", octal_size);
}
format("\"\n");
- // The message name is stored at the beginning of the string
- std::string message_name = descriptor_->full_name();
- if (message_name.size() > kMaxNameLength) {
- static constexpr int kNameHalfLength = (kMaxNameLength - 3) / 2;
- message_name = StrCat(
- message_name.substr(0, kNameHalfLength), "...",
- message_name.substr(message_name.size() - kNameHalfLength));
- }
- format("\"$1$\"\n", message_name);
- // Then we output the actual field names
- for (const auto& entry : tc_table_info_->field_entries) {
- const FieldDescriptor* field = entry.field;
- format("\"$1$\"\n", field->name());
+
+ // Then print each name in a line of its own
+ for (; sizes < sizes_end && sizes[0] != 0; p += *sizes++) {
+ format("\"$1$\"\n", std::string(p, p + *sizes));
}
}
void ParseFunctionGenerator::GenerateArenaString(Formatter& format,
const FieldDescriptor* field) {
- if (HasHasbit(field)) {
+ if (internal::cpp::HasHasbit(field)) {
format("_Internal::set_has_$1$(&$has_bits$);\n", FieldName(field));
}
format(
@@ -1184,7 +917,9 @@
// to verify UTF8 when we already know parsing failed.
format("CHK_(ptr);\n");
if (!check_utf8) return; // return if this is a bytes field
- auto level = GetUtf8CheckMode(field, options_);
+ auto level = internal::cpp::GetUtf8CheckMode(
+ field,
+ GetOptimizeFor(field->file(), options_) == FileOptions::LITE_RUNTIME);
switch (level) {
case Utf8CheckMode::kNone:
return;
@@ -1198,7 +933,7 @@
std::string field_name;
field_name = "nullptr";
if (HasDescriptorMethods(field->file(), options_)) {
- field_name = StrCat("\"", field->full_name(), "\"");
+ field_name = absl::StrCat("\"", field->full_name(), "\"");
}
format("::_pbi::VerifyUTF8(str, $1$)", field_name);
switch (level) {
@@ -1219,7 +954,7 @@
const FieldDescriptor* field) {
if (field->is_packable()) {
if (field->type() == FieldDescriptor::TYPE_ENUM &&
- !HasPreservingUnknownEnumSemantics(field)) {
+ !internal::cpp::HasPreservingUnknownEnumSemantics(field)) {
std::string enum_type = QualifiedClassName(field->enum_type(), options_);
format(
"ptr = "
@@ -1248,7 +983,7 @@
const FieldDescriptor* val = field->message_type()->map_value();
GOOGLE_CHECK(val);
if (val->type() == FieldDescriptor::TYPE_ENUM &&
- !HasPreservingUnknownEnumSemantics(field)) {
+ !internal::cpp::HasPreservingUnknownEnumSemantics(field)) {
format(
"auto object = "
"::$proto_ns$::internal::InitEnumParseWrapper<"
@@ -1267,7 +1002,7 @@
format(
"ctx->set_lazy_eager_verify_func($1$);\n",
eager_verify
- ? StrCat("&", ClassName(field->message_type(), true),
+ ? absl::StrCat("&", ClassName(field->message_type(), true),
"::InternalVerify")
: "nullptr");
}
@@ -1282,7 +1017,7 @@
"}\n"
"auto* lazy_field = $msg$$field$;\n",
field->containing_oneof()->name());
- } else if (HasHasbit(field)) {
+ } else if (internal::cpp::HasHasbit(field)) {
format(
"_Internal::set_has_$name$(&$has_bits$);\n"
"auto* lazy_field = &$msg$$field$;\n");
@@ -1356,12 +1091,12 @@
{{"name", FieldName(field)},
{"primitive_type", PrimitiveTypeName(options_, field->cpp_type())}});
if (field->is_repeated()) {
- format.AddMap({{"put_field", StrCat("add_", FieldName(field))},
- {"mutable_field", StrCat("add_", FieldName(field))}});
+ format.AddMap({{"put_field", absl::StrCat("add_", FieldName(field))},
+ {"mutable_field", absl::StrCat("add_", FieldName(field))}});
} else {
format.AddMap(
- {{"put_field", StrCat("set_", FieldName(field))},
- {"mutable_field", StrCat("mutable_", FieldName(field))}});
+ {{"put_field", absl::StrCat("set_", FieldName(field))},
+ {"mutable_field", absl::StrCat("mutable_", FieldName(field))}});
}
uint32_t tag = WireFormatLite::MakeTag(field->number(), wiretype);
switch (wiretype) {
@@ -1371,14 +1106,17 @@
format.Set("enum_type",
QualifiedClassName(field->enum_type(), options_));
format(
- "$uint64$ val = ::$proto_ns$::internal::ReadVarint64(&ptr);\n"
+ "$uint32$ val = ::$proto_ns$::internal::ReadVarint32(&ptr);\n"
"CHK_(ptr);\n");
- if (!HasPreservingUnknownEnumSemantics(field)) {
- format("if (PROTOBUF_PREDICT_TRUE($enum_type$_IsValid(val))) {\n");
+ if (!internal::cpp::HasPreservingUnknownEnumSemantics(field)) {
+ format(
+ "if "
+ "(PROTOBUF_PREDICT_TRUE($enum_type$_IsValid(static_cast<int>(val)"
+ "))) {\n");
format.Indent();
}
format("$msg$_internal_$put_field$(static_cast<$enum_type$>(val));\n");
- if (!HasPreservingUnknownEnumSemantics(field)) {
+ if (!internal::cpp::HasPreservingUnknownEnumSemantics(field)) {
format.Outdent();
format(
"} else {\n"
@@ -1405,7 +1143,7 @@
"CHK_(ptr);\n",
zigzag, size);
} else {
- if (HasHasbit(field)) {
+ if (internal::cpp::HasHasbit(field)) {
format("_Internal::set_has_$name$(&$has_bits$);\n");
}
format(
@@ -1424,7 +1162,7 @@
"::$proto_ns$::internal::UnalignedLoad<$primitive_type$>(ptr));\n"
"ptr += sizeof($primitive_type$);\n");
} else {
- if (HasHasbit(field)) {
+ if (internal::cpp::HasHasbit(field)) {
format("_Internal::set_has_$name$(&$has_bits$);\n");
}
format(
@@ -1612,112 +1350,45 @@
format("} // switch\n");
}
-namespace {
-
-std::string FieldParseFunctionName(
- const TailCallTableInfo::FieldEntryInfo& entry, const Options& options) {
- const FieldDescriptor* field = entry.field;
- std::string name = "::_pbi::TcParser::Fast";
-
- switch (field->type()) {
- case FieldDescriptor::TYPE_FIXED32:
- case FieldDescriptor::TYPE_SFIXED32:
- case FieldDescriptor::TYPE_FLOAT:
- name.append("F32");
- break;
-
- case FieldDescriptor::TYPE_FIXED64:
- case FieldDescriptor::TYPE_SFIXED64:
- case FieldDescriptor::TYPE_DOUBLE:
- name.append("F64");
- break;
-
- case FieldDescriptor::TYPE_BOOL:
- name.append("V8");
- break;
- case FieldDescriptor::TYPE_INT32:
- case FieldDescriptor::TYPE_UINT32:
- name.append("V32");
- break;
- case FieldDescriptor::TYPE_INT64:
- case FieldDescriptor::TYPE_UINT64:
- name.append("V64");
- break;
-
- case FieldDescriptor::TYPE_ENUM:
- if (HasPreservingUnknownEnumSemantics(field)) {
- name.append("V32");
- break;
- }
- if (field->is_repeated() && field->is_packed()) {
- GOOGLE_LOG(DFATAL) << "Enum validation not handled: " << field->DebugString();
- return "";
- }
- name.append(entry.is_enum_range ? "Er" : "Ev");
- break;
-
- case FieldDescriptor::TYPE_SINT32:
- name.append("Z32");
- break;
- case FieldDescriptor::TYPE_SINT64:
- name.append("Z64");
- break;
-
- case FieldDescriptor::TYPE_BYTES:
- name.append("B");
- if (IsStringInlined(field, options)) {
- name.append("i");
- }
- break;
- case FieldDescriptor::TYPE_STRING:
- switch (GetUtf8CheckMode(field, options)) {
- case Utf8CheckMode::kNone:
- name.append("B");
- break;
- case Utf8CheckMode::kVerify:
- name.append("S");
- break;
- case Utf8CheckMode::kStrict:
- name.append("U");
- break;
- default:
- GOOGLE_LOG(DFATAL) << "Mode not handled: "
- << static_cast<int>(GetUtf8CheckMode(field, options));
- return "";
- }
- if (IsStringInlined(field, options)) {
- name.append("i");
- }
- break;
-
- case FieldDescriptor::TYPE_MESSAGE:
- name.append("M");
- break;
- case FieldDescriptor::TYPE_GROUP:
- name.append("G");
- break;
-
- default:
- GOOGLE_LOG(DFATAL) << "Type not handled: " << field->DebugString();
- return "";
+#if 0
+void PopulateFastFieldEntry(const Descriptor* descriptor,
+ const TailCallTableInfo::FieldEntryInfo& entry,
+ const Options& options,
+ TailCallTableInfo::FastFieldInfo& info) {
+ .....
+ if (name == "V8S1") {
+ info.func_name = absl::StrCat(
+ "::_pbi::TcParser::SingularVarintNoZag1<bool, offsetof(", //
+ ClassName(descriptor), //
+ ", ", //
+ FieldMemberName(field, /*split=*/false), //
+ "), ", //
+ HasHasbit(field) ? entry.hasbit_idx : 63, //
+ ">()");
+ } else if (name == "V32S1") {
+ info.func_name = absl::StrCat(
+ "::_pbi::TcParser::SingularVarintNoZag1<uint32_t, offsetof(", //
+ ClassName(descriptor), //
+ ", ", //
+ FieldMemberName(field, /*split=*/false), //
+ "), ", //
+ HasHasbit(field) ? entry.hasbit_idx : 63, //
+ ">()");
+ } else if (name == "V64S1") {
+ info.func_name = absl::StrCat(
+ "::_pbi::TcParser::SingularVarintNoZag1<uint64_t, offsetof(", //
+ ClassName(descriptor), //
+ ", ", //
+ FieldMemberName(field, /*split=*/false), //
+ "), ", //
+ HasHasbit(field) ? entry.hasbit_idx : 63, //
+ ">()");
+ } else {
+ info.func_name = absl::StrCat("::_pbi::TcParser::Fast", name);
}
-
- // The field implementation functions are prefixed by cardinality:
- // `S` for optional or implicit fields.
- // `R` for non-packed repeated.
- // `P` for packed repeated.
- name.append(field->is_packed() ? "P"
- : field->is_repeated() ? "R"
- : field->real_containing_oneof() ? "O"
- : "S");
-
- // Append the tag length. Fast parsing only handles 1- or 2-byte tags.
- name.append(TagSize(field->number()) == 1 ? "1" : "2");
-
- return name;
+ info.aux_idx = aux_idx;
}
-
-} // namespace
+#endif
} // namespace cpp
} // namespace compiler
diff --git a/src/google/protobuf/compiler/cpp/parse_function_generator.h b/src/google/protobuf/compiler/cpp/parse_function_generator.h
index 542a15a..b55feda 100644
--- a/src/google/protobuf/compiler/cpp/parse_function_generator.h
+++ b/src/google/protobuf/compiler/cpp/parse_function_generator.h
@@ -35,58 +35,18 @@
#include <string>
#include <vector>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/wire_format_lite.h>
-#include <google/protobuf/compiler/cpp/helpers.h>
-#include <google/protobuf/compiler/cpp/options.h>
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/wire_format_lite.h"
+#include "google/protobuf/compiler/cpp/helpers.h"
+#include "google/protobuf/compiler/cpp/options.h"
+#include "google/protobuf/generated_message_tctable_gen.h"
namespace google {
namespace protobuf {
namespace compiler {
namespace cpp {
-// Helper class for generating tailcall parsing functions.
-struct TailCallTableInfo {
- TailCallTableInfo(const Descriptor* descriptor, const Options& options,
- const std::vector<const FieldDescriptor*>& ordered_fields,
- const std::vector<int>& has_bit_indices,
- const std::vector<int>& inlined_string_indices,
- MessageSCCAnalyzer* scc_analyzer);
-
- // Fields parsed by the table fast-path.
- struct FastFieldInfo {
- std::string func_name;
- const FieldDescriptor* field;
- uint16_t coded_tag;
- uint8_t hasbit_idx;
- uint8_t aux_idx;
- };
- std::vector<FastFieldInfo> fast_path_fields;
-
- // Fields parsed by mini parsing routines.
- struct FieldEntryInfo {
- const FieldDescriptor* field;
- int hasbit_idx;
- int inlined_string_idx;
- uint16_t aux_idx;
- // True for enums entirely covered by the start/length fields of FieldAux:
- bool is_enum_range;
- };
- std::vector<FieldEntryInfo> field_entries;
- std::vector<std::string> aux_entries;
-
- // Fields parsed by generated fallback function.
- std::vector<const FieldDescriptor*> fallback_fields;
-
- // Table size.
- int table_size_log2;
- // Mask for has-bits of required fields.
- uint32_t has_hasbits_required_mask;
- // True if a generated fallback function is required instead of generic.
- bool use_generated_fallback;
-};
-
// ParseFunctionGenerator generates the _InternalParse function for a message
// (and any associated supporting members).
class ParseFunctionGenerator {
@@ -111,6 +71,8 @@
void GenerateDataDefinitions(io::Printer* printer);
private:
+ class GeneratedOptionProvider;
+
// Returns true if tailcall table code should be generated.
bool should_generate_tctable() const;
@@ -134,7 +96,6 @@
void GenerateTailCallTable(Formatter& format);
void GenerateFastFieldEntries(Formatter& format);
void GenerateFieldEntries(Formatter& format);
- int CalculateFieldNamesSize() const;
void GenerateFieldNames(Formatter& format);
// Generates parsing code for an `ArenaString` field.
@@ -166,7 +127,7 @@
MessageSCCAnalyzer* scc_analyzer_;
const Options& options_;
std::map<std::string, std::string> variables_;
- std::unique_ptr<TailCallTableInfo> tc_table_info_;
+ std::unique_ptr<internal::TailCallTableInfo> tc_table_info_;
std::vector<int> inlined_string_indices_;
const std::vector<const FieldDescriptor*> ordered_fields_;
int num_hasbits_;
diff --git a/src/google/protobuf/compiler/cpp/plugin_unittest.cc b/src/google/protobuf/compiler/cpp/plugin_unittest.cc
index f023dcf..30bd374 100644
--- a/src/google/protobuf/compiler/cpp/plugin_unittest.cc
+++ b/src/google/protobuf/compiler/cpp/plugin_unittest.cc
@@ -36,13 +36,13 @@
#include <memory>
-#include <google/protobuf/testing/file.h>
-#include <google/protobuf/testing/file.h>
-#include <google/protobuf/compiler/cpp/generator.h>
-#include <google/protobuf/compiler/command_line_interface.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/testing/googletest.h>
+#include "google/protobuf/testing/file.h"
+#include "google/protobuf/testing/file.h"
+#include "google/protobuf/compiler/cpp/generator.h"
+#include "google/protobuf/compiler/command_line_interface.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/io/zero_copy_stream.h"
+#include "google/protobuf/testing/googletest.h"
#include <gtest/gtest.h>
namespace google {
diff --git a/src/google/protobuf/compiler/cpp/primitive_field.cc b/src/google/protobuf/compiler/cpp/primitive_field.cc
index 6c92ede..bad8795 100644
--- a/src/google/protobuf/compiler/cpp/primitive_field.cc
+++ b/src/google/protobuf/compiler/cpp/primitive_field.cc
@@ -32,12 +32,13 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/compiler/cpp/primitive_field.h>
+#include "google/protobuf/compiler/cpp/primitive_field.h"
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/wire_format.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/compiler/cpp/helpers.h>
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/wire_format.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "absl/strings/str_cat.h"
+#include "google/protobuf/compiler/cpp/helpers.h"
namespace google {
namespace protobuf {
@@ -108,10 +109,10 @@
bool cold = ShouldSplit(descriptor, options);
(*variables)["cached_byte_size_field"] =
MakeVarintCachedSizeFieldName(descriptor, cold);
- (*variables)["tag"] = StrCat(internal::WireFormat::MakeTag(descriptor));
+ (*variables)["tag"] = absl::StrCat(internal::WireFormat::MakeTag(descriptor));
int fixed_size = FixedSize(descriptor->type());
if (fixed_size != -1) {
- (*variables)["fixed_size"] = StrCat(fixed_size);
+ (*variables)["fixed_size"] = absl::StrCat(fixed_size);
}
(*variables)["wire_format_field_type"] = FieldDescriptorProto_Type_Name(
static_cast<FieldDescriptorProto_Type>(descriptor->type()));
@@ -328,7 +329,9 @@
format("::$proto_ns$::RepeatedField< $type$ > $name$_;\n");
if (descriptor_->is_packed() && FixedSize(descriptor_->type()) == -1 &&
HasGeneratedMethods(descriptor_->file(), options_)) {
- format("mutable std::atomic<int> $cached_byte_size_name$;\n");
+ format(
+ "mutable ::$proto_ns$::internal::CachedSize "
+ "$cached_byte_size_name$;\n");
}
}
@@ -433,7 +436,7 @@
format(
"{\n"
" int byte_size = "
- "$cached_byte_size_field$.load(std::memory_order_relaxed);\n"
+ "$cached_byte_size_field$.Get();\n"
" if (byte_size > 0) {\n"
" target = stream->Write$declared_type$Packed(\n"
" $number$, _internal_$name$(), byte_size, target);\n"
@@ -484,8 +487,7 @@
if (FixedSize(descriptor_->type()) == -1) {
format(
"int cached_size = ::_pbi::ToCachedSize(data_size);\n"
- "$cached_byte_size_field$.store(cached_size,\n"
- " std::memory_order_relaxed);\n");
+ "$cached_byte_size_field$.Set(cached_size);\n");
}
format("total_size += data_size;\n");
} else {
diff --git a/src/google/protobuf/compiler/cpp/primitive_field.h b/src/google/protobuf/compiler/cpp/primitive_field.h
index bb8a08a..b39c846 100644
--- a/src/google/protobuf/compiler/cpp/primitive_field.h
+++ b/src/google/protobuf/compiler/cpp/primitive_field.h
@@ -38,7 +38,7 @@
#include <map>
#include <string>
-#include <google/protobuf/compiler/cpp/field.h>
+#include "google/protobuf/compiler/cpp/field.h"
namespace google {
namespace protobuf {
@@ -49,6 +49,8 @@
public:
PrimitiveFieldGenerator(const FieldDescriptor* descriptor,
const Options& options);
+ PrimitiveFieldGenerator(const PrimitiveFieldGenerator&) = delete;
+ PrimitiveFieldGenerator& operator=(const PrimitiveFieldGenerator&) = delete;
~PrimitiveFieldGenerator() override;
// implements FieldGenerator ---------------------------------------
@@ -67,15 +69,15 @@
io::Printer* printer) const override;
void GenerateAggregateInitializer(io::Printer* printer) const override;
void GenerateCopyAggregateInitializer(io::Printer* printer) const override;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(PrimitiveFieldGenerator);
};
class PrimitiveOneofFieldGenerator : public PrimitiveFieldGenerator {
public:
PrimitiveOneofFieldGenerator(const FieldDescriptor* descriptor,
const Options& options);
+ PrimitiveOneofFieldGenerator(const PrimitiveOneofFieldGenerator&) = delete;
+ PrimitiveOneofFieldGenerator& operator=(const PrimitiveOneofFieldGenerator&) =
+ delete;
~PrimitiveOneofFieldGenerator() override;
// implements FieldGenerator ---------------------------------------
@@ -83,15 +85,16 @@
void GenerateClearingCode(io::Printer* printer) const override;
void GenerateSwappingCode(io::Printer* printer) const override;
void GenerateConstructorCode(io::Printer* printer) const override;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(PrimitiveOneofFieldGenerator);
};
class RepeatedPrimitiveFieldGenerator : public FieldGenerator {
public:
RepeatedPrimitiveFieldGenerator(const FieldDescriptor* descriptor,
const Options& options);
+ RepeatedPrimitiveFieldGenerator(const RepeatedPrimitiveFieldGenerator&) =
+ delete;
+ RepeatedPrimitiveFieldGenerator& operator=(
+ const RepeatedPrimitiveFieldGenerator&) = delete;
~RepeatedPrimitiveFieldGenerator() override;
// implements FieldGenerator ---------------------------------------
@@ -113,9 +116,6 @@
io::Printer* printer) const override;
void GenerateAggregateInitializer(io::Printer* printer) const override;
void GenerateCopyAggregateInitializer(io::Printer* printer) const override;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedPrimitiveFieldGenerator);
};
} // namespace cpp
diff --git a/src/google/protobuf/compiler/cpp/service.cc b/src/google/protobuf/compiler/cpp/service.cc
index 7a0d480..baa58b9 100644
--- a/src/google/protobuf/compiler/cpp/service.cc
+++ b/src/google/protobuf/compiler/cpp/service.cc
@@ -32,293 +32,280 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/compiler/cpp/service.h>
+#include "google/protobuf/compiler/cpp/service.h"
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/compiler/cpp/helpers.h>
+#include <map>
+#include <string>
+
+#include "absl/strings/str_cat.h"
+#include "google/protobuf/compiler/cpp/helpers.h"
+#include "google/protobuf/io/printer.h"
namespace google {
namespace protobuf {
namespace compiler {
namespace cpp {
-
-namespace {
-
-void InitMethodVariables(const MethodDescriptor* method, const Options& options,
- Formatter* format) {
- format->Set("name", method->name());
- format->Set("input_type", QualifiedClassName(method->input_type(), options));
- format->Set("output_type",
- QualifiedClassName(method->output_type(), options));
-}
-
-} // namespace
-
-ServiceGenerator::ServiceGenerator(
- const ServiceDescriptor* descriptor,
- const std::map<std::string, std::string>& vars, const Options& options)
- : descriptor_(descriptor), vars_(vars), options_(options) {
- vars_["classname"] = descriptor_->name();
- vars_["full_name"] = descriptor_->full_name();
-}
-
-ServiceGenerator::~ServiceGenerator() {}
-
void ServiceGenerator::GenerateDeclarations(io::Printer* printer) {
- Formatter format(printer, vars_);
- // Forward-declare the stub type.
- format(
- "class $classname$_Stub;\n"
- "\n");
+ auto vars = printer->WithVars(&vars_);
+ printer->Emit(
+ {
+ {"virts", [&] { GenerateMethodSignatures(kVirtual, printer); }},
+ {"impls", [&] { GenerateMethodSignatures(kNonVirtual, printer); }},
+ },
+ R"cc(
+ class $classname$_Stub;
+ class $dllexport_decl $$classname$ : public ::$proto_ns$::Service {
+ protected:
+ $classname$() = default;
- GenerateInterface(printer);
- GenerateStubDefinition(printer);
+ public:
+ using Stub = $classname$_Stub;
+
+ $classname$(const $classname$&) = delete;
+ $classname$& operator=(const $classname$&) = delete;
+ virtual ~$classname$() = default;
+
+ static const ::$proto_ns$::ServiceDescriptor* descriptor();
+
+ $virts$;
+
+ // implements Service ----------------------------------------------
+ const ::$proto_ns$::ServiceDescriptor* GetDescriptor() override;
+
+ void CallMethod(const ::$proto_ns$::MethodDescriptor* method,
+ ::$proto_ns$::RpcController* controller,
+ const ::$proto_ns$::Message* request,
+ ::$proto_ns$::Message* response,
+ ::google::protobuf::Closure* done) override;
+
+ const ::$proto_ns$::Message& GetRequestPrototype(
+ const ::$proto_ns$::MethodDescriptor* method) const override;
+
+ const ::$proto_ns$::Message& GetResponsePrototype(
+ const ::$proto_ns$::MethodDescriptor* method) const override;
+ };
+
+ class $dllexport_decl $$classname$_Stub : public $classname$ {
+ public:
+ $classname$_Stub(::$proto_ns$::RpcChannel* channel);
+ $classname$_Stub(::$proto_ns$::RpcChannel* channel,
+ ::$proto_ns$::Service::ChannelOwnership ownership);
+
+ $classname$_Stub(const $classname$_Stub&) = delete;
+ $classname$_Stub& operator=(const $classname$_Stub&) = delete;
+
+ ~$classname$_Stub() override;
+
+ inline ::$proto_ns$::RpcChannel* channel() { return channel_; }
+
+ // implements $classname$ ------------------------------------------
+ $impls$;
+
+ private:
+ ::$proto_ns$::RpcChannel* channel_;
+ bool owns_channel_;
+ };
+ )cc");
}
-void ServiceGenerator::GenerateInterface(io::Printer* printer) {
- Formatter format(printer, vars_);
- format(
- "class $dllexport_decl $$classname$ : public ::$proto_ns$::Service {\n"
- " protected:\n"
- " // This class should be treated as an abstract interface.\n"
- " inline $classname$() {};\n"
- " public:\n"
- " virtual ~$classname$();\n");
- printer->Indent();
-
- format(
- "\n"
- "typedef $classname$_Stub Stub;\n"
- "\n"
- "static const ::$proto_ns$::ServiceDescriptor* descriptor();\n"
- "\n");
-
- GenerateMethodSignatures(VIRTUAL, printer);
-
- format(
- "\n"
- "// implements Service ----------------------------------------------\n"
- "\n"
- "const ::$proto_ns$::ServiceDescriptor* GetDescriptor();\n"
- "void CallMethod(const ::$proto_ns$::MethodDescriptor* method,\n"
- " ::$proto_ns$::RpcController* controller,\n"
- " const ::$proto_ns$::Message* request,\n"
- " ::$proto_ns$::Message* response,\n"
- " ::google::protobuf::Closure* done);\n"
- "const ::$proto_ns$::Message& GetRequestPrototype(\n"
- " const ::$proto_ns$::MethodDescriptor* method) const;\n"
- "const ::$proto_ns$::Message& GetResponsePrototype(\n"
- " const ::$proto_ns$::MethodDescriptor* method) const;\n");
-
- printer->Outdent();
- format(
- "\n"
- " private:\n"
- " GOOGLE_DISALLOW_EVIL_CONSTRUCTORS($classname$);\n"
- "};\n"
- "\n");
-}
-
-void ServiceGenerator::GenerateStubDefinition(io::Printer* printer) {
- Formatter format(printer, vars_);
- format(
- "class $dllexport_decl $$classname$_Stub : public $classname$ {\n"
- " public:\n");
-
- printer->Indent();
-
- format(
- "$classname$_Stub(::$proto_ns$::RpcChannel* channel);\n"
- "$classname$_Stub(::$proto_ns$::RpcChannel* channel,\n"
- " ::$proto_ns$::Service::ChannelOwnership ownership);\n"
- "~$classname$_Stub();\n"
- "\n"
- "inline ::$proto_ns$::RpcChannel* channel() { return channel_; }\n"
- "\n"
- "// implements $classname$ ------------------------------------------\n"
- "\n");
-
- GenerateMethodSignatures(NON_VIRTUAL, printer);
-
- printer->Outdent();
- format(
- " private:\n"
- " ::$proto_ns$::RpcChannel* channel_;\n"
- " bool owns_channel_;\n"
- " GOOGLE_DISALLOW_EVIL_CONSTRUCTORS($classname$_Stub);\n"
- "};\n"
- "\n");
-}
-
-void ServiceGenerator::GenerateMethodSignatures(VirtualOrNon virtual_or_non,
+void ServiceGenerator::GenerateMethodSignatures(VirtualOrNot virtual_or_not,
io::Printer* printer) {
- for (int i = 0; i < descriptor_->method_count(); i++) {
+ for (int i = 0; i < descriptor_->method_count(); ++i) {
const MethodDescriptor* method = descriptor_->method(i);
- Formatter format(printer, vars_);
- InitMethodVariables(method, options_, &format);
- format.Set("virtual", virtual_or_non == VIRTUAL ? "virtual " : "");
- format(
- "$virtual$void $name$(::$proto_ns$::RpcController* controller,\n"
- " const $input_type$* request,\n"
- " $output_type$* response,\n"
- " ::google::protobuf::Closure* done);\n");
+
+ printer->Emit(
+ {
+ {"name", method->name()},
+ {"input", QualifiedClassName(method->input_type(), *options_)},
+ {"output", QualifiedClassName(method->output_type(), *options_)},
+ {"virtual", virtual_or_not == kVirtual ? "virtual" : ""},
+ {"override", virtual_or_not != kVirtual ? "override" : ""},
+ },
+ // No cc, clang-format does not format this string well due to the
+ // $ override$ substitution.
+ R"(
+ $virtual $void $name$(::$proto_ns$::RpcController* controller,
+ const $input$* request,
+ $output$* response,
+ ::google::protobuf::Closure* done)$ override$;
+ )");
}
}
// ===================================================================
void ServiceGenerator::GenerateImplementation(io::Printer* printer) {
- Formatter format(printer, vars_);
- format(
- "$classname$::~$classname$() {}\n"
- "\n"
- "const ::$proto_ns$::ServiceDescriptor* $classname$::descriptor() {\n"
- " "
- "::$proto_ns$::internal::AssignDescriptors(&$desc_table$);\n"
- " return $file_level_service_descriptors$[$1$];\n"
- "}\n"
- "\n"
- "const ::$proto_ns$::ServiceDescriptor* $classname$::GetDescriptor() {\n"
- " return descriptor();\n"
- "}\n"
- "\n",
- index_in_metadata_);
+ auto vars = printer->WithVars(&vars_);
+ printer->Emit(
+ {
+ {"index", index_in_metadata_},
+ {"no_impl_methods", [&] { GenerateNotImplementedMethods(printer); }},
+ {"call_method", [&] { GenerateCallMethod(printer); }},
+ {"get_request", [&] { GenerateGetPrototype(kRequest, printer); }},
+ {"get_response", [&] { GenerateGetPrototype(kResponse, printer); }},
+ {"stub_methods", [&] { GenerateStubMethods(printer); }},
+ },
+ R"cc(
+ const ::$proto_ns$::ServiceDescriptor* $classname$::descriptor() {
+ ::$proto_ns$::internal::AssignDescriptors(&$desc_table$);
+ return $file_level_service_descriptors$[$index$];
+ }
- // Generate methods of the interface.
- GenerateNotImplementedMethods(printer);
- GenerateCallMethod(printer);
- GenerateGetPrototype(REQUEST, printer);
- GenerateGetPrototype(RESPONSE, printer);
+ const ::$proto_ns$::ServiceDescriptor* $classname$::GetDescriptor() {
+ return descriptor();
+ }
- // Generate stub implementation.
- format(
- "$classname$_Stub::$classname$_Stub(::$proto_ns$::RpcChannel* channel)\n"
- " : channel_(channel), owns_channel_(false) {}\n"
- "$classname$_Stub::$classname$_Stub(\n"
- " ::$proto_ns$::RpcChannel* channel,\n"
- " ::$proto_ns$::Service::ChannelOwnership ownership)\n"
- " : channel_(channel),\n"
- " owns_channel_(ownership == "
- "::$proto_ns$::Service::STUB_OWNS_CHANNEL) "
- "{}\n"
- "$classname$_Stub::~$classname$_Stub() {\n"
- " if (owns_channel_) delete channel_;\n"
- "}\n"
- "\n");
+ $no_impl_methods$;
- GenerateStubMethods(printer);
+ $call_method$;
+
+ $get_request$;
+
+ $get_response$;
+
+ $classname$_Stub::$classname$_Stub(::$proto_ns$::RpcChannel* channel)
+ : channel_(channel), owns_channel_(false) {}
+
+ $classname$_Stub::$classname$_Stub(
+ ::$proto_ns$::RpcChannel* channel,
+ ::$proto_ns$::Service::ChannelOwnership ownership)
+ : channel_(channel),
+ owns_channel_(ownership ==
+ ::$proto_ns$::Service::STUB_OWNS_CHANNEL) {}
+
+ $classname$_Stub::~$classname$_Stub() {
+ if (owns_channel_) delete channel_;
+ }
+
+ $stub_methods$;
+ )cc");
}
void ServiceGenerator::GenerateNotImplementedMethods(io::Printer* printer) {
- for (int i = 0; i < descriptor_->method_count(); i++) {
+ for (int i = 0; i < descriptor_->method_count(); ++i) {
const MethodDescriptor* method = descriptor_->method(i);
- Formatter format(printer, vars_);
- InitMethodVariables(method, options_, &format);
- format(
- "void $classname$::$name$(::$proto_ns$::RpcController* controller,\n"
- " const $input_type$*,\n"
- " $output_type$*,\n"
- " ::google::protobuf::Closure* done) {\n"
- " controller->SetFailed(\"Method $name$() not implemented.\");\n"
- " done->Run();\n"
- "}\n"
- "\n");
+
+ printer->Emit(
+ {
+ {"name", method->name()},
+ {"input", QualifiedClassName(method->input_type(), *options_)},
+ {"output", QualifiedClassName(method->output_type(), *options_)},
+ },
+ R"cc(
+ void $classname$::$name$(::$proto_ns$::RpcController* controller,
+ const $input$*, $output$*, ::google::protobuf::Closure* done) {
+ controller->SetFailed("Method $name$() not implemented.");
+ done->Run();
+ }
+ )cc");
}
}
void ServiceGenerator::GenerateCallMethod(io::Printer* printer) {
- Formatter format(printer, vars_);
- format(
- "void $classname$::CallMethod(const ::$proto_ns$::MethodDescriptor* "
- "method,\n"
- " ::$proto_ns$::RpcController* controller,\n"
- " const ::$proto_ns$::Message* request,\n"
- " ::$proto_ns$::Message* response,\n"
- " ::google::protobuf::Closure* done) {\n"
- " GOOGLE_DCHECK_EQ(method->service(), $file_level_service_descriptors$[$1$]);\n"
- " switch(method->index()) {\n",
- index_in_metadata_);
+ printer->Emit(
+ {
+ {"index", absl::StrCat(index_in_metadata_)},
+ {"cases", [&] { GenerateCallMethodCases(printer); }},
+ },
+ R"cc(
+ void $classname$::CallMethod(
+ const ::$proto_ns$::MethodDescriptor* method,
+ ::$proto_ns$::RpcController* controller,
+ const ::$proto_ns$::Message* request,
+ ::$proto_ns$::Message* response, ::google::protobuf::Closure* done) {
+ GOOGLE_DCHECK_EQ(method->service(), $file_level_service_descriptors$[$index$]);
+ switch (method->index()) {
+ $cases$;
- for (int i = 0; i < descriptor_->method_count(); i++) {
- const MethodDescriptor* method = descriptor_->method(i);
- Formatter format_method(printer, vars_);
- InitMethodVariables(method, options_, &format_method);
-
- // Note: down_cast does not work here because it only works on pointers,
- // not references.
- format_method(
- " case $1$:\n"
- " $name$(controller,\n"
- " ::$proto_ns$::internal::DownCast<const $input_type$*>(\n"
- " request),\n"
- " ::$proto_ns$::internal::DownCast<$output_type$*>(\n"
- " response),\n"
- " done);\n"
- " break;\n",
- i);
- }
-
- format(
- " default:\n"
- " GOOGLE_LOG(FATAL) << \"Bad method index; this should never happen.\";\n"
- " break;\n"
- " }\n"
- "}\n"
- "\n");
+ default:
+ GOOGLE_LOG(FATAL) << "Bad method index; this should never happen.";
+ break;
+ }
+ }
+ )cc");
}
void ServiceGenerator::GenerateGetPrototype(RequestOrResponse which,
io::Printer* printer) {
- Formatter format(printer, vars_);
- if (which == REQUEST) {
- format("const ::$proto_ns$::Message& $classname$::GetRequestPrototype(\n");
- } else {
- format("const ::$proto_ns$::Message& $classname$::GetResponsePrototype(\n");
- }
+ printer->Emit(
+ {
+ {"which", which == kRequest ? "Request" : "Response"},
+ {"which_type", which == kRequest ? "input" : "output"},
+ {"cases",
+ [&] {
+ for (int i = 0; i < descriptor_->method_count(); ++i) {
+ const MethodDescriptor* method = descriptor_->method(i);
+ const Descriptor* type = which == kRequest
+ ? method->input_type()
+ : method->output_type();
- format(
- " const ::$proto_ns$::MethodDescriptor* method) const {\n"
- " GOOGLE_DCHECK_EQ(method->service(), descriptor());\n"
- " switch(method->index()) {\n");
+ printer->Emit(
+ {
+ {"index", absl::StrCat(i)},
+ {"type", QualifiedClassName(type, *options_)},
+ },
+ R"cc(
+ case $index$:
+ return $type$::default_instance();
+ )cc");
+ }
+ }},
+ },
+ R"cc(
+ const ::$proto_ns$::Message& $classname$::Get$which$Prototype(
+ const ::$proto_ns$::MethodDescriptor* method) const {
+ GOOGLE_DCHECK_EQ(method->service(), descriptor());
+ switch (method->index()) {
+ $cases$;
- for (int i = 0; i < descriptor_->method_count(); i++) {
+ default:
+ GOOGLE_LOG(FATAL) << "Bad method index; this should never happen.";
+ return *::$proto_ns$::MessageFactory::generated_factory()
+ ->GetPrototype(method->$which_type$_type());
+ }
+ }
+ )cc");
+}
+
+void ServiceGenerator::GenerateCallMethodCases(io::Printer* printer) {
+ for (int i = 0; i < descriptor_->method_count(); ++i) {
const MethodDescriptor* method = descriptor_->method(i);
- const Descriptor* type =
- (which == REQUEST) ? method->input_type() : method->output_type();
-
- format(
- " case $1$:\n"
- " return $2$::default_instance();\n",
- i, QualifiedClassName(type, options_));
+ printer->Emit(
+ {
+ {"name", method->name()},
+ {"input", QualifiedClassName(method->input_type(), *options_)},
+ {"output", QualifiedClassName(method->output_type(), *options_)},
+ {"index", absl::StrCat(i)},
+ },
+ R"cc(
+ case $index$:
+ $name$(controller,
+ ::$proto_ns$::internal::DownCast<const $input$*>(request),
+ ::$proto_ns$::internal::DownCast<$output$*>(response), done);
+ break;
+ )cc");
}
-
- format(
- " default:\n"
- " GOOGLE_LOG(FATAL) << \"Bad method index; this should never happen.\";\n"
- " return *::$proto_ns$::MessageFactory::generated_factory()\n"
- " ->GetPrototype(method->$1$_type());\n"
- " }\n"
- "}\n"
- "\n",
- which == REQUEST ? "input" : "output");
}
void ServiceGenerator::GenerateStubMethods(io::Printer* printer) {
- for (int i = 0; i < descriptor_->method_count(); i++) {
+ for (int i = 0; i < descriptor_->method_count(); ++i) {
const MethodDescriptor* method = descriptor_->method(i);
- Formatter format(printer, vars_);
- InitMethodVariables(method, options_, &format);
- format(
- "void $classname$_Stub::$name$(::$proto_ns$::RpcController* "
- "controller,\n"
- " const $input_type$* request,\n"
- " $output_type$* response,\n"
- " ::google::protobuf::Closure* done) {\n"
- " channel_->CallMethod(descriptor()->method($1$),\n"
- " controller, request, response, done);\n"
- "}\n",
- i);
+
+ printer->Emit(
+ {
+ {"name", method->name()},
+ {"input", QualifiedClassName(method->input_type(), *options_)},
+ {"output", QualifiedClassName(method->output_type(), *options_)},
+ {"index", absl::StrCat(i)},
+ },
+ R"cc(
+ void $classname$_Stub::$name$(::$proto_ns$::RpcController* controller,
+ const $input$* request,
+ $output$* response, ::google::protobuf::Closure* done) {
+ channel_->CallMethod(descriptor()->method($index$), controller,
+ request, response, done);
+ }
+ )cc");
}
}
diff --git a/src/google/protobuf/compiler/cpp/service.h b/src/google/protobuf/compiler/cpp/service.h
index b3bd2d7..34b8914 100644
--- a/src/google/protobuf/compiler/cpp/service.h
+++ b/src/google/protobuf/compiler/cpp/service.h
@@ -38,60 +38,48 @@
#include <map>
#include <string>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/compiler/cpp/options.h>
-
-namespace google {
-namespace protobuf {
-namespace io {
-class Printer; // printer.h
-}
-} // namespace protobuf
-} // namespace google
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/compiler/cpp/options.h"
+#include "google/protobuf/io/printer.h"
namespace google {
namespace protobuf {
namespace compiler {
namespace cpp {
-
class ServiceGenerator {
public:
// See generator.cc for the meaning of dllexport_decl.
- explicit ServiceGenerator(const ServiceDescriptor* descriptor,
- const std::map<std::string, std::string>& vars,
- const Options& options);
- ~ServiceGenerator();
+ ServiceGenerator(const ServiceDescriptor* descriptor,
+ const std::map<std::string, std::string>& vars,
+ const Options& options)
+ : descriptor_(descriptor), options_(&options), vars_(vars) {
+ vars_["classname"] = descriptor_->name();
+ vars_["full_name"] = descriptor_->full_name();
+ }
- // Header stuff.
+ ServiceGenerator(const ServiceGenerator&) = delete;
+ ServiceGenerator& operator=(const ServiceGenerator&) = delete;
+ ServiceGenerator(ServiceGenerator&&) = delete;
+ ServiceGenerator& operator=(ServiceGenerator&&) = delete;
+
+ ~ServiceGenerator() = default;
// Generate the class definitions for the service's interface and the
// stub implementation.
void GenerateDeclarations(io::Printer* printer);
- // Source file stuff.
-
// Generate implementations of everything declared by
// GenerateDeclarations().
void GenerateImplementation(io::Printer* printer);
private:
- enum RequestOrResponse { REQUEST, RESPONSE };
- enum VirtualOrNon { VIRTUAL, NON_VIRTUAL };
-
- // Header stuff.
-
- // Generate the service abstract interface.
- void GenerateInterface(io::Printer* printer);
-
- // Generate the stub class definition.
- void GenerateStubDefinition(io::Printer* printer);
+ enum RequestOrResponse { kRequest, kResponse };
+ enum VirtualOrNot { kVirtual, kNonVirtual };
// Prints signatures for all methods in the
- void GenerateMethodSignatures(VirtualOrNon virtual_or_non,
+ void GenerateMethodSignatures(VirtualOrNot virtual_or_not,
io::Printer* printer);
- // Source file stuff.
-
// Generate the default implementations of the service methods, which
// produce a "not implemented" error.
void GenerateNotImplementedMethods(io::Printer* printer);
@@ -102,19 +90,20 @@
// Generate the Get{Request,Response}Prototype() methods.
void GenerateGetPrototype(RequestOrResponse which, io::Printer* printer);
+ // Generate the cases in CallMethod().
+ void GenerateCallMethodCases(io::Printer* printer);
+
// Generate the stub's implementations of the service methods.
void GenerateStubMethods(io::Printer* printer);
const ServiceDescriptor* descriptor_;
+ const Options* options_;
std::map<std::string, std::string> vars_;
- const Options& options_;
int index_in_metadata_;
friend class FileGenerator;
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ServiceGenerator);
};
-
} // namespace cpp
} // namespace compiler
} // namespace protobuf
diff --git a/src/google/protobuf/compiler/cpp/string_field.cc b/src/google/protobuf/compiler/cpp/string_field.cc
index 9e7c96d..3b05c36 100644
--- a/src/google/protobuf/compiler/cpp/string_field.cc
+++ b/src/google/protobuf/compiler/cpp/string_field.cc
@@ -32,12 +32,13 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/compiler/cpp/string_field.h>
+#include "google/protobuf/compiler/cpp/string_field.h"
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/compiler/cpp/helpers.h>
-#include <google/protobuf/descriptor.pb.h>
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "absl/strings/str_cat.h"
+#include "google/protobuf/compiler/cpp/helpers.h"
+#include "google/protobuf/descriptor.pb.h"
namespace google {
@@ -52,12 +53,12 @@
const Options& options) {
SetCommonFieldVariables(descriptor, variables, options);
- const std::string kNS = "::" + (*variables)["proto_ns"] + "::internal::";
+ const std::string kNS = "::" + ProtobufNamespace(options) + "::internal::";
const std::string kArenaStringPtr = kNS + "ArenaStringPtr";
(*variables)["default"] = DefaultValue(options, descriptor);
(*variables)["default_length"] =
- StrCat(descriptor->default_value_string().length());
+ absl::StrCat(descriptor->default_value_string().length());
(*variables)["default_variable_name"] = MakeDefaultName(descriptor);
(*variables)["default_variable_field"] = MakeDefaultFieldName(descriptor);
@@ -67,7 +68,7 @@
(*variables)["lazy_variable_args"] = "";
} else {
(*variables)["lazy_variable"] =
- StrCat(QualifiedClassName(descriptor->containing_type(), options),
+ absl::StrCat(QualifiedClassName(descriptor->containing_type(), options),
"::", MakeDefaultFieldName(descriptor));
(*variables)["default_string"] = (*variables)["lazy_variable"] + ".get()";
@@ -79,7 +80,6 @@
descriptor->type() == FieldDescriptor::TYPE_BYTES ? "void" : "char";
(*variables)["setter"] =
descriptor->type() == FieldDescriptor::TYPE_BYTES ? "SetBytes" : "Set";
- (*variables)["null_check"] = (*variables)["DCHK"] + "(value != nullptr);\n";
// NOTE: Escaped here to unblock proto1->proto2 migration.
// TODO(liujisi): Extend this to apply for other conflicting methods.
(*variables)["release_name"] =
@@ -89,7 +89,7 @@
if (options.opensource_runtime) {
(*variables)["string_piece"] = "::std::string";
} else {
- (*variables)["string_piece"] = "::StringPiece";
+ (*variables)["string_piece"] = "::absl::string_view";
}
}
@@ -286,7 +286,7 @@
"$maybe_prepare_split_message$"
" // @@protoc_insertion_point(field_release:$full_name$)\n");
- if (HasHasbit(descriptor_)) {
+ if (internal::cpp::HasHasbit(descriptor_)) {
format(
" if (!_internal_has_$name$()) {\n"
" return nullptr;\n"
@@ -297,9 +297,7 @@
if (descriptor_->default_value_string().empty()) {
format(
"#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING\n"
- " if ($field$.IsDefault()) {\n"
- " $field$.Set(\"\", GetArenaForAllocation());\n"
- " }\n"
+ " $field$.Set(\"\", GetArenaForAllocation());\n"
"#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING\n");
}
format(" return p;\n");
@@ -377,7 +375,7 @@
// If we have a hasbit, then the Clear() method of the protocol buffer
// will have checked that this field is set. If so, we can avoid redundant
// checks against the default variable.
- const bool must_be_present = HasHasbit(descriptor_);
+ const bool must_be_present = internal::cpp::HasHasbit(descriptor_);
if (inlined_ && must_be_present) {
// Calling mutable_$name$() gives us a string reference and sets the has bit
@@ -445,21 +443,6 @@
}
}
-void StringFieldGenerator::GenerateCreateSplitMessageCode(
- io::Printer* printer) const {
- GOOGLE_CHECK(ShouldSplit(descriptor_, options_));
- GOOGLE_CHECK(!inlined_);
- Formatter format(printer, variables_);
- format("ptr->$name$_.InitDefault();\n");
- if (IsString(descriptor_, options_) &&
- descriptor_->default_value_string().empty()) {
- format(
- "#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING\n"
- " ptr->$name$_.Set(\"\", GetArenaForAllocation());\n"
- "#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING\n");
- }
-}
-
void StringFieldGenerator::GenerateCopyConstructorCode(
io::Printer* printer) const {
Formatter format(printer, variables_);
@@ -468,7 +451,7 @@
format("new (&_this->$field$) ::_pbi::InlinedStringField();\n");
}
- if (HasHasbit(descriptor_)) {
+ if (internal::cpp::HasHasbit(descriptor_)) {
format("if (from._internal_has_$name$()) {\n");
} else {
format("if (!from._internal_$name$().empty()) {\n");
@@ -554,13 +537,9 @@
format("/*decltype($field$)*/{nullptr, false}");
return;
}
- if (descriptor_->default_value_string().empty()) {
- format(
- "/*decltype($field$)*/{&::_pbi::fixed_address_empty_string, "
- "::_pbi::ConstantInitialized{}}");
- } else {
- format("/*decltype($field$)*/{nullptr, ::_pbi::ConstantInitialized{}}");
- }
+ format(
+ "/*decltype($field$)*/{&::_pbi::fixed_address_empty_string, "
+ "::_pbi::ConstantInitialized{}}");
}
void StringFieldGenerator::GenerateAggregateInitializer(
@@ -592,7 +571,7 @@
SetCommonOneofFieldVariables(descriptor, &variables_);
variables_["field_name"] = UnderscoresToCamelCase(descriptor->name(), true);
variables_["oneof_index"] =
- StrCat(descriptor->containing_oneof()->index());
+ absl::StrCat(descriptor->containing_oneof()->index());
}
StringOneofFieldGenerator::~StringOneofFieldGenerator() {}
@@ -737,7 +716,7 @@
if (!options_.opensource_runtime) {
format(
"$deprecated_attr$void ${1$set_$name$$}$(int index, "
- "StringPiece value);\n",
+ "absl::string_view value);\n",
descriptor_);
}
format(
@@ -750,7 +729,7 @@
descriptor_);
if (!options_.opensource_runtime) {
format(
- "$deprecated_attr$void ${1$add_$name$$}$(StringPiece value);\n",
+ "$deprecated_attr$void ${1$add_$name$$}$(absl::string_view value);\n",
descriptor_);
}
format(
@@ -824,7 +803,7 @@
" // @@protoc_insertion_point(field_set:$full_name$)\n"
"}\n"
"inline void $classname$::set_$name$(int index, const char* value) {\n"
- " $null_check$"
+ " $DCHK$(value != nullptr);"
" $field$.Mutable(index)->assign(value);\n"
"$annotate_set$"
" // @@protoc_insertion_point(field_set_char:$full_name$)\n"
@@ -832,7 +811,7 @@
if (!options_.opensource_runtime) {
format(
"inline void "
- "$classname$::set_$name$(int index, StringPiece value) {\n"
+ "$classname$::set_$name$(int index, absl::string_view value) {\n"
" $field$.Mutable(index)->assign(value.data(), value.size());\n"
"$annotate_set$"
" // @@protoc_insertion_point(field_set_string_piece:$full_name$)\n"
@@ -861,14 +840,14 @@
" // @@protoc_insertion_point(field_add:$full_name$)\n"
"}\n"
"inline void $classname$::add_$name$(const char* value) {\n"
- " $null_check$"
+ " $DCHK$(value != nullptr);"
" $field$.Add()->assign(value);\n"
"$annotate_add$"
" // @@protoc_insertion_point(field_add_char:$full_name$)\n"
"}\n");
if (!options_.opensource_runtime) {
format(
- "inline void $classname$::add_$name$(StringPiece value) {\n"
+ "inline void $classname$::add_$name$(absl::string_view value) {\n"
" $field$.Add()->assign(value.data(), value.size());\n"
"$annotate_add$"
" // @@protoc_insertion_point(field_add_string_piece:$full_name$)\n"
diff --git a/src/google/protobuf/compiler/cpp/string_field.h b/src/google/protobuf/compiler/cpp/string_field.h
index db5f18b..02bee85 100644
--- a/src/google/protobuf/compiler/cpp/string_field.h
+++ b/src/google/protobuf/compiler/cpp/string_field.h
@@ -38,7 +38,7 @@
#include <map>
#include <string>
-#include <google/protobuf/compiler/cpp/field.h>
+#include "google/protobuf/compiler/cpp/field.h"
namespace google {
namespace protobuf {
@@ -49,6 +49,8 @@
public:
StringFieldGenerator(const FieldDescriptor* descriptor,
const Options& options);
+ StringFieldGenerator(const StringFieldGenerator&) = delete;
+ StringFieldGenerator& operator=(const StringFieldGenerator&) = delete;
~StringFieldGenerator() override;
// implements FieldGenerator ---------------------------------------
@@ -63,7 +65,6 @@
void GenerateMergingCode(io::Printer* printer) const override;
void GenerateSwappingCode(io::Printer* printer) const override;
void GenerateConstructorCode(io::Printer* printer) const override;
- void GenerateCreateSplitMessageCode(io::Printer* printer) const override;
void GenerateCopyConstructorCode(io::Printer* printer) const override;
void GenerateDestructorCode(io::Printer* printer) const override;
void GenerateArenaDestructorCode(io::Printer* printer) const override;
@@ -79,13 +80,15 @@
private:
bool inlined_;
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(StringFieldGenerator);
};
class StringOneofFieldGenerator : public StringFieldGenerator {
public:
StringOneofFieldGenerator(const FieldDescriptor* descriptor,
const Options& options);
+ StringOneofFieldGenerator(const StringOneofFieldGenerator&) = delete;
+ StringOneofFieldGenerator& operator=(const StringOneofFieldGenerator&) =
+ delete;
~StringOneofFieldGenerator() override;
// implements FieldGenerator ---------------------------------------
@@ -97,15 +100,15 @@
void GenerateMessageClearingCode(io::Printer* printer) const override;
void GenerateSwappingCode(io::Printer* printer) const override;
void GenerateConstructorCode(io::Printer* printer) const override;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(StringOneofFieldGenerator);
};
class RepeatedStringFieldGenerator : public FieldGenerator {
public:
RepeatedStringFieldGenerator(const FieldDescriptor* descriptor,
const Options& options);
+ RepeatedStringFieldGenerator(const RepeatedStringFieldGenerator&) = delete;
+ RepeatedStringFieldGenerator& operator=(const RepeatedStringFieldGenerator&) =
+ delete;
~RepeatedStringFieldGenerator() override;
// implements FieldGenerator ---------------------------------------
@@ -123,9 +126,6 @@
void GenerateSerializeWithCachedSizesToArray(
io::Printer* printer) const override;
void GenerateByteSize(io::Printer* printer) const override;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedStringFieldGenerator);
};
} // namespace cpp
diff --git a/src/google/protobuf/compiler/cpp/test_bad_identifiers.proto b/src/google/protobuf/compiler/cpp/test_bad_identifiers.proto
index 466a841..028248e 100644
--- a/src/google/protobuf/compiler/cpp/test_bad_identifiers.proto
+++ b/src/google/protobuf/compiler/cpp/test_bad_identifiers.proto
@@ -61,7 +61,9 @@
optional int32 total_size = 6;
optional int32 tag = 7;
- enum TestEnum { FOO = 0; }
+ enum TestEnum {
+ FOO = 0;
+ }
message Data1 {
repeated int32 data = 1;
}
diff --git a/src/google/protobuf/compiler/cpp/unittest.cc b/src/google/protobuf/compiler/cpp/unittest.cc
index e2730d7..a52280d 100644
--- a/src/google/protobuf/compiler/cpp/unittest.cc
+++ b/src/google/protobuf/compiler/cpp/unittest.cc
@@ -44,12 +44,12 @@
// correctly and produces the interfaces we expect, which is why this test
// is written this way.
-#include <google/protobuf/compiler/cpp/unittest.h>
+#include "google/protobuf/compiler/cpp/unittest.h"
-#include <google/protobuf/unittest.pb.h>
-#include <google/protobuf/unittest_embed_optimize_for.pb.h>
-#include <google/protobuf/unittest_optimize_for.pb.h>
-#include <google/protobuf/test_util.h>
+#include "google/protobuf/unittest.pb.h"
+#include "google/protobuf/unittest_embed_optimize_for.pb.h"
+#include "google/protobuf/unittest_optimize_for.pb.h"
+#include "google/protobuf/test_util.h"
#define MESSAGE_TEST_NAME MessageTest
#define GENERATED_DESCRIPTOR_TEST_NAME GeneratedDescriptorTest
@@ -64,7 +64,7 @@
#define UNITTEST_IMPORT ::protobuf_unittest_import
// Must include after the above macros.
-#include <google/protobuf/compiler/cpp/unittest.inc>
+#include "google/protobuf/compiler/cpp/unittest.inc"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/compiler/cpp/unittest.inc b/src/google/protobuf/compiler/cpp/unittest.inc
index 0b47176..2d65ead 100644
--- a/src/google/protobuf/compiler/cpp/unittest.inc
+++ b/src/google/protobuf/compiler/cpp/unittest.inc
@@ -49,37 +49,36 @@
#include <memory>
#include <vector>
-#include <google/protobuf/compiler/cpp/unittest.h>
-#include <google/protobuf/stubs/strutil.h>
+#include "google/protobuf/compiler/cpp/unittest.h"
+#include "absl/strings/string_view.h"
#ifndef _MSC_VER
// We exclude this large proto because it's too large for
// visual studio to compile (report internal errors).
-#include <google/protobuf/unittest_enormous_descriptor.pb.h>
+#include "google/protobuf/unittest_enormous_descriptor.pb.h"
#endif
-#include <google/protobuf/compiler/cpp/helpers.h>
-#include <google/protobuf/compiler/cpp/test_bad_identifiers.pb.h>
-#include <google/protobuf/unittest_no_generic_services.pb.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/arena.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/dynamic_message.h>
-#include <google/protobuf/compiler/scc.h>
-#include <google/protobuf/compiler/importer.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/test_util2.h>
-
-#include <google/protobuf/stubs/callback.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/testing/googletest.h>
+#include "google/protobuf/stubs/callback.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/compiler/cpp/helpers.h"
+#include "google/protobuf/unittest_no_generic_services.pb.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/testing/googletest.h"
#include <gtest/gtest.h>
-#include <google/protobuf/stubs/casts.h>
-#include <google/protobuf/stubs/substitute.h>
-#include <google/protobuf/stubs/stl_util.h>
+#include "absl/base/casts.h"
+#include "absl/strings/substitute.h"
+#include "google/protobuf/arena.h"
+#include "google/protobuf/compiler/cpp/test_bad_identifiers.pb.h"
+#include "google/protobuf/compiler/importer.h"
+#include "google/protobuf/compiler/scc.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/dynamic_message.h"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/io/zero_copy_stream_impl.h"
+#include "google/protobuf/test_util2.h"
+#include "google/protobuf/stubs/stl_util.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -102,7 +101,7 @@
// implements ErrorCollector ---------------------------------------
void AddError(const std::string& filename, int line, int column,
const std::string& message) override {
- strings::SubstituteAndAppend(&text_, "$0:$1:$2: $3\n", filename, line, column,
+ absl::SubstituteAndAppend(&text_, "$0:$1:$2: $3\n", filename, line, column,
message);
}
};
@@ -602,7 +601,7 @@
TestUtil::SetAllFields(&message1);
- const Message* source = implicit_cast<const Message*>(&message1);
+ const Message* source = absl::implicit_cast<const Message*>(&message1);
message2.CopyFrom(*source);
TestUtil::ExpectAllFieldsSet(message2);
@@ -1822,7 +1821,7 @@
message1.mutable_foogroup()->set_a(123);
EXPECT_TRUE(message1.has_foogroup());
- const Message* source = implicit_cast<const Message*>(&message1);
+ const Message* source = absl::implicit_cast<const Message*>(&message1);
message2.CopyFrom(*source);
EXPECT_TRUE(message2.has_foogroup());
@@ -2223,4 +2222,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/compiler/csharp/BUILD.bazel b/src/google/protobuf/compiler/csharp/BUILD.bazel
new file mode 100644
index 0000000..433e0b2
--- /dev/null
+++ b/src/google/protobuf/compiler/csharp/BUILD.bazel
@@ -0,0 +1,133 @@
+################################################################################
+# Protocol Buffers Compiler - C# code generator
+################################################################################
+
+load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test")
+load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
+load("//build_defs:cpp_opts.bzl", "COPTS")
+
+cc_library(
+ name = "names",
+ hdrs = ["names.h"],
+ srcs = ["names.cc"],
+ copts = COPTS,
+ include_prefix = "google/protobuf/compiler/csharp",
+ visibility = ["//visibility:public"],
+ deps = [
+ "//src/google/protobuf:protobuf_nowkt",
+ "@com_google_absl//absl/strings",
+ ],
+)
+
+cc_library(
+ name = "csharp",
+ srcs = [
+ "csharp_doc_comment.cc",
+ "csharp_enum.cc",
+ "csharp_enum_field.cc",
+ "csharp_field_base.cc",
+ "csharp_generator.cc",
+ "csharp_helpers.cc",
+ "csharp_map_field.cc",
+ "csharp_message.cc",
+ "csharp_message_field.cc",
+ "csharp_primitive_field.cc",
+ "csharp_reflection_class.cc",
+ "csharp_repeated_enum_field.cc",
+ "csharp_repeated_message_field.cc",
+ "csharp_repeated_primitive_field.cc",
+ "csharp_source_generator_base.cc",
+ "csharp_wrapper_field.cc",
+ ],
+ hdrs = [
+ "csharp_doc_comment.h",
+ "csharp_enum.h",
+ "csharp_enum_field.h",
+ "csharp_field_base.h",
+ "csharp_generator.h",
+ "csharp_helpers.h",
+ "csharp_map_field.h",
+ "csharp_message.h",
+ "csharp_message_field.h",
+ "csharp_options.h",
+ "csharp_primitive_field.h",
+ "csharp_reflection_class.h",
+ "csharp_repeated_enum_field.h",
+ "csharp_repeated_message_field.h",
+ "csharp_repeated_primitive_field.h",
+ "csharp_source_generator_base.h",
+ "csharp_wrapper_field.h",
+ ],
+ copts = COPTS + select({
+ "//build_defs:config_msvc": [],
+ "//conditions:default": ["-Wno-overloaded-virtual"],
+ }),
+ include_prefix = "google/protobuf/compiler/csharp",
+ visibility = [
+ "//pkg:__pkg__",
+ "//src/google/protobuf/compiler:__pkg__",
+ ],
+ deps = [
+ ":names",
+ "//src/google/protobuf:protobuf_nowkt",
+ "//src/google/protobuf/compiler:code_generator",
+ "@com_google_absl//absl/container:flat_hash_set",
+ "@com_google_absl//absl/strings",
+ ],
+)
+
+cc_test(
+ name = "bootstrap_unittest",
+ srcs = ["csharp_bootstrap_unittest.cc"],
+ data = [
+ "//:well_known_type_protos",
+ "//conformance:all_files",
+ "//conformance:conformance_proto",
+ "//csharp:wkt_cs_srcs",
+ "//src/google/protobuf:descriptor_proto_srcs",
+ "//src/google/protobuf:testdata",
+ ],
+ deps = [
+ ":csharp",
+ "//:protobuf",
+ "//src/google/protobuf/compiler:importer",
+ "//src/google/protobuf/io",
+ "//src/google/protobuf/stubs",
+ "//src/google/protobuf/testing",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_test(
+ name = "generator_unittest",
+ srcs = ["csharp_generator_unittest.cc"],
+ deps = [
+ ":csharp",
+ "//:protobuf",
+ "//src/google/protobuf/compiler:command_line_interface",
+ "//src/google/protobuf/io",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+################################################################################
+# Distribution packaging
+################################################################################
+
+pkg_files(
+ name = "dist_files",
+ srcs = glob(["**/*"]),
+ strip_prefix = strip_prefix.from_root(""),
+ visibility = ["//src:__pkg__"],
+)
+
+filegroup(
+ name = "test_srcs",
+ srcs = glob([
+ "*_test.cc",
+ "*unittest.cc",
+ ]),
+ visibility = ["//src/google/protobuf/compiler:__pkg__"],
+)
diff --git a/src/google/protobuf/compiler/csharp/csharp_bootstrap_unittest.cc b/src/google/protobuf/compiler/csharp/csharp_bootstrap_unittest.cc
index 84aacca..315f595 100644
--- a/src/google/protobuf/compiler/csharp/csharp_bootstrap_unittest.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_bootstrap_unittest.cc
@@ -39,19 +39,20 @@
#include <map>
-#include <google/protobuf/compiler/csharp/csharp_generator.h>
-#include <google/protobuf/compiler/importer.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/stubs/map_util.h>
-#include <google/protobuf/stubs/stl_util.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/substitute.h>
-
-#include <google/protobuf/testing/file.h>
-#include <google/protobuf/testing/file.h>
-#include <google/protobuf/testing/googletest.h>
+#include "google/protobuf/testing/file.h"
+#include "google/protobuf/testing/googletest.h"
+#include "google/protobuf/stubs/strutil.h"
#include <gtest/gtest.h>
+#include "absl/strings/ascii.h"
+#include "absl/strings/escaping.h"
+#include "absl/strings/str_replace.h"
+#include "absl/strings/str_split.h"
+#include "absl/strings/substitute.h"
+#include "google/protobuf/compiler/csharp/csharp_generator.h"
+#include "google/protobuf/compiler/importer.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/io/zero_copy_stream_impl.h"
+#include "google/protobuf/stubs/stl_util.h"
namespace google {
namespace protobuf {
@@ -70,8 +71,8 @@
// implements ErrorCollector ---------------------------------------
void AddError(const std::string& filename, int line, int column,
const std::string& message) {
- strings::SubstituteAndAppend(&text_, "$0:$1:$2: $3\n",
- filename, line, column, message);
+ absl::SubstituteAndAppend(&text_, "$0:$1:$2: $3\n", filename, line, column,
+ message);
}
};
@@ -178,12 +179,6 @@
"WellKnownTypes/Wrappers.cs",
"../csharp/src/Google.Protobuf/WellKnownTypes/Wrappers.cs");
- generate_test.SetParameter("");
- source_tree.MapPath("", TestSourceDir() + "/../conformance");
- generate_test.Run(importer.Import("conformance.proto"),
- "Conformance.cs",
- "../csharp/src/Google.Protobuf.Conformance/Conformance.cs");
-
EXPECT_EQ("", error_collector.text_);
}
diff --git a/src/google/protobuf/compiler/csharp/csharp_doc_comment.cc b/src/google/protobuf/compiler/csharp/csharp_doc_comment.cc
index 225d6dc..507b826 100644
--- a/src/google/protobuf/compiler/csharp/csharp_doc_comment.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_doc_comment.cc
@@ -31,10 +31,12 @@
// Author: kenton@google.com (Kenton Varda)
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/compiler/csharp/csharp_doc_comment.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/stubs/strutil.h>
+#include "google/protobuf/compiler/csharp/csharp_doc_comment.h"
+
+#include "absl/strings/str_replace.h"
+#include "absl/strings/str_split.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/io/printer.h"
namespace google {
namespace protobuf {
@@ -54,10 +56,9 @@
}
// XML escaping... no need for apostrophes etc as the whole text is going to be a child
// node of a summary element, not part of an attribute.
- comments = StringReplace(comments, "&", "&", true);
- comments = StringReplace(comments, "<", "<", true);
+ comments = absl::StrReplaceAll(comments, {{"&", "&"}, {"<", "<"}});
std::vector<std::string> lines;
- lines = Split(comments, "\n", false);
+ lines = absl::StrSplit(comments, "\n", absl::AllowEmpty());
// TODO: We really should work out which part to put in the summary and which to put in the remarks...
// but that needs to be part of a bigger effort to understand the markdown better anyway.
printer->Print("/// <summary>\n");
diff --git a/src/google/protobuf/compiler/csharp/csharp_doc_comment.h b/src/google/protobuf/compiler/csharp/csharp_doc_comment.h
index 75eb0ea..40c35ec 100644
--- a/src/google/protobuf/compiler/csharp/csharp_doc_comment.h
+++ b/src/google/protobuf/compiler/csharp/csharp_doc_comment.h
@@ -32,8 +32,8 @@
#ifndef GOOGLE_PROTOBUF_COMPILER_CSHARP_DOC_COMMENT_H__
#define GOOGLE_PROTOBUF_COMPILER_CSHARP_DOC_COMMENT_H__
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/descriptor.h>
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/descriptor.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/compiler/csharp/csharp_enum.cc b/src/google/protobuf/compiler/csharp/csharp_enum.cc
index 73679ca..846da9b 100644
--- a/src/google/protobuf/compiler/csharp/csharp_enum.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_enum.cc
@@ -28,19 +28,18 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#include "google/protobuf/compiler/csharp/csharp_enum.h"
+
#include <sstream>
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/stubs/strutil.h>
-
-#include <google/protobuf/compiler/csharp/csharp_doc_comment.h>
-#include <google/protobuf/compiler/csharp/csharp_enum.h>
-#include <google/protobuf/compiler/csharp/csharp_helpers.h>
-#include <google/protobuf/compiler/csharp/csharp_options.h>
+#include "google/protobuf/compiler/code_generator.h"
+#include "absl/strings/str_cat.h"
+#include "google/protobuf/compiler/csharp/csharp_doc_comment.h"
+#include "google/protobuf/compiler/csharp/csharp_helpers.h"
+#include "google/protobuf/compiler/csharp/csharp_options.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/io/printer.h"
namespace google {
namespace protobuf {
@@ -57,6 +56,9 @@
void EnumGenerator::Generate(io::Printer* printer) {
WriteEnumDocComment(printer, descriptor_);
+ if (descriptor_->options().deprecated()) {
+ printer->Print("[global::System.ObsoleteAttribute]\n");
+ }
printer->Print("$access_level$ enum $name$ {\n",
"access_level", class_access_level(),
"name", descriptor_->name());
@@ -65,6 +67,9 @@
std::set<int> used_number;
for (int i = 0; i < descriptor_->value_count(); i++) {
WriteEnumValueDocComment(printer, descriptor_->value(i));
+ if (descriptor_->value(i)->options().deprecated()) {
+ printer->Print("[global::System.ObsoleteAttribute]\n");
+ }
std::string original_name = descriptor_->value(i)->name();
std::string name =
GetEnumValueName(descriptor_->name(), descriptor_->value(i)->name());
@@ -80,12 +85,12 @@
printer->Print("[pbr::OriginalName(\"$original_name$\", PreferredAlias = false)] $name$ = $number$,\n",
"original_name", original_name,
"name", name,
- "number", StrCat(number));
+ "number", absl::StrCat(number));
} else {
printer->Print("[pbr::OriginalName(\"$original_name$\")] $name$ = $number$,\n",
"original_name", original_name,
"name", name,
- "number", StrCat(number));
+ "number", absl::StrCat(number));
}
}
printer->Outdent();
diff --git a/src/google/protobuf/compiler/csharp/csharp_enum.h b/src/google/protobuf/compiler/csharp/csharp_enum.h
index e409c2e..098102b 100644
--- a/src/google/protobuf/compiler/csharp/csharp_enum.h
+++ b/src/google/protobuf/compiler/csharp/csharp_enum.h
@@ -33,10 +33,10 @@
#include <string>
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/compiler/csharp/csharp_source_generator_base.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/io/printer.h>
+#include "google/protobuf/compiler/code_generator.h"
+#include "google/protobuf/compiler/csharp/csharp_source_generator_base.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/io/printer.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/compiler/csharp/csharp_enum_field.cc b/src/google/protobuf/compiler/csharp/csharp_enum_field.cc
index 55fb60c..065e1cc 100644
--- a/src/google/protobuf/compiler/csharp/csharp_enum_field.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_enum_field.cc
@@ -28,18 +28,18 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#include "google/protobuf/compiler/csharp/csharp_enum_field.h"
+
#include <sstream>
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-
-#include <google/protobuf/compiler/csharp/csharp_doc_comment.h>
-#include <google/protobuf/compiler/csharp/csharp_helpers.h>
-#include <google/protobuf/compiler/csharp/csharp_options.h>
-#include <google/protobuf/compiler/csharp/csharp_enum_field.h>
+#include "google/protobuf/compiler/code_generator.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/compiler/csharp/csharp_doc_comment.h"
+#include "google/protobuf/compiler/csharp/csharp_helpers.h"
+#include "google/protobuf/compiler/csharp/csharp_options.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/io/zero_copy_stream.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/compiler/csharp/csharp_enum_field.h b/src/google/protobuf/compiler/csharp/csharp_enum_field.h
index 0c6b023..c31d55f 100644
--- a/src/google/protobuf/compiler/csharp/csharp_enum_field.h
+++ b/src/google/protobuf/compiler/csharp/csharp_enum_field.h
@@ -31,8 +31,8 @@
#ifndef GOOGLE_PROTOBUF_COMPILER_CSHARP_ENUM_FIELD_H__
#define GOOGLE_PROTOBUF_COMPILER_CSHARP_ENUM_FIELD_H__
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/compiler/csharp/csharp_primitive_field.h>
+#include "google/protobuf/compiler/code_generator.h"
+#include "google/protobuf/compiler/csharp/csharp_primitive_field.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/compiler/csharp/csharp_field_base.cc b/src/google/protobuf/compiler/csharp/csharp_field_base.cc
index 17847e3..bc45d74 100644
--- a/src/google/protobuf/compiler/csharp/csharp_field_base.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_field_base.cc
@@ -28,22 +28,23 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#include "google/protobuf/compiler/csharp/csharp_field_base.h"
+
#include <cmath>
#include <limits>
#include <sstream>
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/wire_format.h>
+#include "google/protobuf/compiler/code_generator.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/wire_format.h"
+#include "google/protobuf/compiler/csharp/csharp_helpers.h"
+#include "google/protobuf/compiler/csharp/names.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/io/printer.h"
-#include <google/protobuf/compiler/csharp/csharp_field_base.h>
-#include <google/protobuf/compiler/csharp/csharp_helpers.h>
-#include <google/protobuf/compiler/csharp/csharp_names.h>
+// Must be last.
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -63,13 +64,13 @@
uint tag = internal::WireFormat::MakeTag(descriptor_);
uint8_t tag_array[5];
io::CodedOutputStream::WriteTagToArray(tag, tag_array);
- std::string tag_bytes = StrCat(tag_array[0]);
+ std::string tag_bytes = absl::StrCat(tag_array[0]);
for (int i = 1; i < part_tag_size; i++) {
- tag_bytes += ", " + StrCat(tag_array[i]);
+ tag_bytes += ", " + absl::StrCat(tag_array[i]);
}
- (*variables)["tag"] = StrCat(tag);
- (*variables)["tag_size"] = StrCat(tag_size);
+ (*variables)["tag"] = absl::StrCat(tag);
+ (*variables)["tag_size"] = absl::StrCat(tag_size);
(*variables)["tag_bytes"] = tag_bytes;
if (descriptor_->type() == FieldDescriptor::Type::TYPE_GROUP) {
@@ -77,12 +78,12 @@
descriptor_->number(),
internal::WireFormatLite::WIRETYPE_END_GROUP);
io::CodedOutputStream::WriteTagToArray(tag, tag_array);
- tag_bytes = StrCat(tag_array[0]);
+ tag_bytes = absl::StrCat(tag_array[0]);
for (int i = 1; i < part_tag_size; i++) {
- tag_bytes += ", " + StrCat(tag_array[i]);
+ tag_bytes += ", " + absl::StrCat(tag_array[i]);
}
- variables_["end_tag"] = StrCat(tag);
+ variables_["end_tag"] = absl::StrCat(tag);
variables_["end_tag_bytes"] = tag_bytes;
}
@@ -108,8 +109,8 @@
(*variables)["has_not_property_check"] = "!" + (*variables)["has_property_check"];
(*variables)["other_has_not_property_check"] = "!" + (*variables)["other_has_property_check"];
if (presenceIndex_ != -1) {
- std::string hasBitsNumber = StrCat(presenceIndex_ / 32);
- std::string hasBitsMask = StrCat(1 << (presenceIndex_ % 32));
+ std::string hasBitsNumber = absl::StrCat(presenceIndex_ / 32);
+ std::string hasBitsMask = absl::StrCat(1 << (presenceIndex_ % 32));
(*variables)["has_field_check"] = "(_hasBits" + hasBitsNumber + " & " + hasBitsMask + ") != 0";
(*variables)["set_has_field"] = "_hasBits" + hasBitsNumber + " |= " + hasBitsMask;
(*variables)["clear_has_field"] = "_hasBits" + hasBitsNumber + " &= ~" + hasBitsMask;
@@ -325,7 +326,7 @@
else
return "global::System.Text.Encoding.UTF8.GetString(global::System."
"Convert.FromBase64String(\"" +
- StringToBase64(descriptor->default_value_string()) + "\"), 0, " + StrCat(descriptor->default_value_string().length()) + ")";
+ StringToBase64(descriptor->default_value_string()) + "\"), 0, " + absl::StrCat(descriptor->default_value_string().length()) + ")";
}
std::string FieldGeneratorBase::GetBytesDefaultValueInternal(const FieldDescriptor* descriptor) {
@@ -361,7 +362,7 @@
} else if (std::isnan(value)) {
return "double.NaN";
}
- return StrCat(value) + "D";
+ return absl::StrCat(value) + "D";
}
case FieldDescriptor::TYPE_FLOAT: {
float value = descriptor->default_value_float();
@@ -372,18 +373,18 @@
} else if (std::isnan(value)) {
return "float.NaN";
}
- return StrCat(value) + "F";
+ return absl::StrCat(value) + "F";
}
case FieldDescriptor::TYPE_INT64:
- return StrCat(descriptor->default_value_int64()) + "L";
+ return absl::StrCat(descriptor->default_value_int64()) + "L";
case FieldDescriptor::TYPE_UINT64:
- return StrCat(descriptor->default_value_uint64()) + "UL";
+ return absl::StrCat(descriptor->default_value_uint64()) + "UL";
case FieldDescriptor::TYPE_INT32:
- return StrCat(descriptor->default_value_int32());
+ return absl::StrCat(descriptor->default_value_int32());
case FieldDescriptor::TYPE_FIXED64:
- return StrCat(descriptor->default_value_uint64()) + "UL";
+ return absl::StrCat(descriptor->default_value_uint64()) + "UL";
case FieldDescriptor::TYPE_FIXED32:
- return StrCat(descriptor->default_value_uint32());
+ return absl::StrCat(descriptor->default_value_uint32());
case FieldDescriptor::TYPE_BOOL:
if (descriptor->default_value_bool()) {
return "true";
@@ -395,15 +396,15 @@
case FieldDescriptor::TYPE_BYTES:
return GetBytesDefaultValueInternal(descriptor);
case FieldDescriptor::TYPE_UINT32:
- return StrCat(descriptor->default_value_uint32());
+ return absl::StrCat(descriptor->default_value_uint32());
case FieldDescriptor::TYPE_SFIXED32:
- return StrCat(descriptor->default_value_int32());
+ return absl::StrCat(descriptor->default_value_int32());
case FieldDescriptor::TYPE_SFIXED64:
- return StrCat(descriptor->default_value_int64()) + "L";
+ return absl::StrCat(descriptor->default_value_int64()) + "L";
case FieldDescriptor::TYPE_SINT32:
- return StrCat(descriptor->default_value_int32());
+ return absl::StrCat(descriptor->default_value_int32());
case FieldDescriptor::TYPE_SINT64:
- return StrCat(descriptor->default_value_int64()) + "L";
+ return absl::StrCat(descriptor->default_value_int64()) + "L";
default:
GOOGLE_LOG(FATAL)<< "Unknown field type.";
return "";
@@ -411,7 +412,7 @@
}
std::string FieldGeneratorBase::number() {
- return StrCat(descriptor_->number());
+ return absl::StrCat(descriptor_->number());
}
std::string FieldGeneratorBase::capitalized_type_name() {
@@ -462,3 +463,5 @@
} // namespace compiler
} // namespace protobuf
} // namespace google
+
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/compiler/csharp/csharp_field_base.h b/src/google/protobuf/compiler/csharp/csharp_field_base.h
index c7b7469..b2ad2c2 100644
--- a/src/google/protobuf/compiler/csharp/csharp_field_base.h
+++ b/src/google/protobuf/compiler/csharp/csharp_field_base.h
@@ -32,12 +32,16 @@
#define GOOGLE_PROTOBUF_COMPILER_CSHARP_FIELD_BASE_H__
#include <string>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/compiler/csharp/csharp_source_generator_base.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/io/printer.h>
+#include "google/protobuf/compiler/code_generator.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "absl/strings/ascii.h"
+#include "absl/strings/escaping.h"
+#include "absl/strings/str_replace.h"
+#include "absl/strings/str_split.h"
+#include "google/protobuf/compiler/csharp/csharp_source_generator_base.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/io/printer.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/compiler/csharp/csharp_generator.cc b/src/google/protobuf/compiler/csharp/csharp_generator.cc
index 5ce0651..0152072 100644
--- a/src/google/protobuf/compiler/csharp/csharp_generator.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_generator.cc
@@ -28,20 +28,19 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#include "google/protobuf/compiler/csharp/csharp_generator.h"
+
#include <sstream>
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/stubs/strutil.h>
-
-#include <google/protobuf/compiler/csharp/csharp_generator.h>
-#include <google/protobuf/compiler/csharp/csharp_helpers.h>
-#include <google/protobuf/compiler/csharp/csharp_names.h>
-#include <google/protobuf/compiler/csharp/csharp_options.h>
-#include <google/protobuf/compiler/csharp/csharp_reflection_class.h>
+#include "google/protobuf/compiler/code_generator.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/compiler/csharp/csharp_helpers.h"
+#include "google/protobuf/compiler/csharp/csharp_options.h"
+#include "google/protobuf/compiler/csharp/csharp_reflection_class.h"
+#include "google/protobuf/compiler/csharp/names.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/io/zero_copy_stream.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/compiler/csharp/csharp_generator.h b/src/google/protobuf/compiler/csharp/csharp_generator.h
index f41f9b8..ea2746e 100644
--- a/src/google/protobuf/compiler/csharp/csharp_generator.h
+++ b/src/google/protobuf/compiler/csharp/csharp_generator.h
@@ -35,9 +35,9 @@
#include <string>
-#include <google/protobuf/compiler/code_generator.h>
+#include "google/protobuf/compiler/code_generator.h"
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -65,6 +65,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_COMPILER_CSHARP_GENERATOR_H__
diff --git a/src/google/protobuf/compiler/csharp/csharp_generator_unittest.cc b/src/google/protobuf/compiler/csharp/csharp_generator_unittest.cc
index e21eff1..ca4fb9d 100644
--- a/src/google/protobuf/compiler/csharp/csharp_generator_unittest.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_generator_unittest.cc
@@ -30,14 +30,13 @@
#include <memory>
-#include <google/protobuf/any.pb.h>
-#include <google/protobuf/compiler/command_line_interface.h>
-#include <google/protobuf/compiler/csharp/csharp_helpers.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/io/printer.h>
-
+#include "google/protobuf/any.pb.h"
+#include "google/protobuf/compiler/command_line_interface.h"
#include <gtest/gtest.h>
+#include "google/protobuf/compiler/csharp/csharp_helpers.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/io/zero_copy_stream.h"
namespace google {
namespace protobuf {
@@ -74,6 +73,22 @@
EXPECT_FALSE(IsDescriptorOptionMessage(DescriptorProto::descriptor()));
}
+TEST(CSharpIdentifiers, UnderscoresToCamelCase) {
+ EXPECT_EQ("FooBar", UnderscoresToCamelCase("Foo_Bar", true));
+ EXPECT_EQ("fooBar", UnderscoresToCamelCase("FooBar", false));
+ EXPECT_EQ("foo123", UnderscoresToCamelCase("foo_123", false));
+ // remove leading underscores
+ EXPECT_EQ("Foo123", UnderscoresToCamelCase("_Foo_123", true));
+ // this one has slight unexpected output as it capitalises the first
+ // letter after consuming the underscores, but this was the existing
+ // behaviour so I have not changed it
+ EXPECT_EQ("FooBar", UnderscoresToCamelCase("___fooBar", false));
+ // leave a leading underscore for identifiers that would otherwise
+ // be invalid because they would start with a digit
+ EXPECT_EQ("_123Foo", UnderscoresToCamelCase("_123_foo", true));
+ EXPECT_EQ("_123Foo", UnderscoresToCamelCase("___123_foo", true));
+}
+
} // namespace
} // namespace csharp
} // namespace compiler
diff --git a/src/google/protobuf/compiler/csharp/csharp_helpers.cc b/src/google/protobuf/compiler/csharp/csharp_helpers.cc
index 73ca868..1ff5444 100644
--- a/src/google/protobuf/compiler/csharp/csharp_helpers.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_helpers.cc
@@ -32,28 +32,32 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
+#include "google/protobuf/compiler/csharp/csharp_helpers.h"
+
#include <algorithm>
#include <limits>
-#include <vector>
#include <sstream>
+#include <vector>
-#include <google/protobuf/compiler/csharp/csharp_helpers.h>
-#include <google/protobuf/compiler/csharp/csharp_names.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/wire_format.h>
-#include <google/protobuf/stubs/strutil.h>
+#include "absl/container/flat_hash_set.h"
+#include "absl/strings/ascii.h"
+#include "absl/strings/str_replace.h"
+#include "absl/strings/string_view.h"
+#include "google/protobuf/compiler/csharp/csharp_enum_field.h"
+#include "google/protobuf/compiler/csharp/csharp_field_base.h"
+#include "google/protobuf/compiler/csharp/csharp_map_field.h"
+#include "google/protobuf/compiler/csharp/csharp_message_field.h"
+#include "google/protobuf/compiler/csharp/csharp_options.h"
+#include "google/protobuf/compiler/csharp/csharp_primitive_field.h"
+#include "google/protobuf/compiler/csharp/csharp_repeated_enum_field.h"
+#include "google/protobuf/compiler/csharp/csharp_repeated_message_field.h"
+#include "google/protobuf/compiler/csharp/csharp_repeated_primitive_field.h"
+#include "google/protobuf/compiler/csharp/csharp_wrapper_field.h"
+#include "google/protobuf/compiler/csharp/names.h"
+#include "google/protobuf/descriptor.pb.h"
-#include <google/protobuf/compiler/csharp/csharp_field_base.h>
-#include <google/protobuf/compiler/csharp/csharp_enum_field.h>
-#include <google/protobuf/compiler/csharp/csharp_map_field.h>
-#include <google/protobuf/compiler/csharp/csharp_message_field.h>
-#include <google/protobuf/compiler/csharp/csharp_options.h>
-#include <google/protobuf/compiler/csharp/csharp_primitive_field.h>
-#include <google/protobuf/compiler/csharp/csharp_repeated_enum_field.h>
-#include <google/protobuf/compiler/csharp/csharp_repeated_message_field.h>
-#include <google/protobuf/compiler/csharp/csharp_repeated_primitive_field.h>
-#include <google/protobuf/compiler/csharp/csharp_wrapper_field.h>
+// Must be last.
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -106,84 +110,6 @@
return (CSharpType) -1;
}
-std::string StripDotProto(const std::string& proto_file) {
- int lastindex = proto_file.find_last_of(".");
- return proto_file.substr(0, lastindex);
-}
-
-std::string GetFileNamespace(const FileDescriptor* descriptor) {
- if (descriptor->options().has_csharp_namespace()) {
- return descriptor->options().csharp_namespace();
- }
- return UnderscoresToCamelCase(descriptor->package(), true, true);
-}
-
-// Returns the Pascal-cased last part of the proto file. For example,
-// input of "google/protobuf/foo_bar.proto" would result in "FooBar".
-std::string GetFileNameBase(const FileDescriptor* descriptor) {
- std::string proto_file = descriptor->name();
- int lastslash = proto_file.find_last_of("/");
- std::string base = proto_file.substr(lastslash + 1);
- return UnderscoresToPascalCase(StripDotProto(base));
-}
-
-std::string GetReflectionClassUnqualifiedName(const FileDescriptor* descriptor) {
- // TODO: Detect collisions with existing messages,
- // and append an underscore if necessary.
- return GetFileNameBase(descriptor) + "Reflection";
-}
-
-std::string GetExtensionClassUnqualifiedName(const FileDescriptor* descriptor) {
- // TODO: Detect collisions with existing messages,
- // and append an underscore if necessary.
- return GetFileNameBase(descriptor) + "Extensions";
-}
-
-// TODO(jtattermusch): can we reuse a utility function?
-std::string UnderscoresToCamelCase(const std::string& input,
- bool cap_next_letter,
- bool preserve_period) {
- std::string result;
- // Note: I distrust ctype.h due to locales.
- for (int i = 0; i < input.size(); i++) {
- if ('a' <= input[i] && input[i] <= 'z') {
- if (cap_next_letter) {
- result += input[i] + ('A' - 'a');
- } else {
- result += input[i];
- }
- cap_next_letter = false;
- } else if ('A' <= input[i] && input[i] <= 'Z') {
- if (i == 0 && !cap_next_letter) {
- // Force first letter to lower-case unless explicitly told to
- // capitalize it.
- result += input[i] + ('a' - 'A');
- } else {
- // Capital letters after the first are left as-is.
- result += input[i];
- }
- cap_next_letter = false;
- } else if ('0' <= input[i] && input[i] <= '9') {
- result += input[i];
- cap_next_letter = true;
- } else {
- cap_next_letter = true;
- if (input[i] == '.' && preserve_period) {
- result += '.';
- }
- }
- }
- // Add a trailing "_" if the name should be altered.
- if (input.size() > 0 && input[input.size() - 1] == '#') {
- result += '_';
- }
- return result;
-}
-
-std::string UnderscoresToPascalCase(const std::string& input) {
- return UnderscoresToCamelCase(input, true);
-}
-
// Convert a string which is expected to be SHOUTY_CASE (but may not be *precisely* shouty)
// into a PascalCase string. Precise rules implemented:
@@ -200,18 +126,18 @@
char previous = '_';
for (int i = 0; i < input.size(); i++) {
char current = input[i];
- if (!ascii_isalnum(current)) {
+ if (!absl::ascii_isalnum(current)) {
previous = current;
continue;
}
- if (!ascii_isalnum(previous)) {
- result += ascii_toupper(current);
- } else if (ascii_isdigit(previous)) {
- result += ascii_toupper(current);
- } else if (ascii_islower(previous)) {
+ if (!absl::ascii_isalnum(previous)) {
+ result += absl::ascii_toupper(current);
+ } else if (absl::ascii_isdigit(previous)) {
+ result += absl::ascii_toupper(current);
+ } else if (absl::ascii_islower(previous)) {
result += current;
} else {
- result += ascii_tolower(current);
+ result += absl::ascii_tolower(current);
}
previous = current;
}
@@ -229,7 +155,7 @@
std::string prefix_to_match = "";
for (size_t i = 0; i < prefix.size(); i++) {
if (prefix[i] != '_') {
- prefix_to_match += ascii_tolower(prefix[i]);
+ prefix_to_match += absl::ascii_tolower(prefix[i]);
}
}
@@ -242,7 +168,7 @@
if (value[value_index] == '_') {
continue;
}
- if (ascii_tolower(value[value_index]) != prefix_to_match[prefix_index++]) {
+ if (absl::ascii_tolower(value[value_index]) != prefix_to_match[prefix_index++]) {
// Failed to match the prefix - bail out early.
return value;
}
@@ -276,7 +202,7 @@
std::string result = ShoutyToPascalCase(stripped);
// Just in case we have an enum name of FOO and a value of FOO_2... make sure the returned
// string is a valid identifier.
- if (ascii_isdigit(result[0])) {
+ if (absl::ascii_isdigit(result[0])) {
result = "_" + result;
}
return result;
@@ -320,32 +246,6 @@
return 0;
}
-std::string ToCSharpName(const std::string& name, const FileDescriptor* file) {
- std::string result = GetFileNamespace(file);
- if (!result.empty()) {
- result += '.';
- }
- std::string classname;
- if (file->package().empty()) {
- classname = name;
- } else {
- // Strip the proto package from full_name since we've replaced it with
- // the C# namespace.
- classname = name.substr(file->package().size() + 1);
- }
- result += StringReplace(classname, ".", ".Types.", true);
- return "global::" + result;
-}
-
-std::string GetReflectionClassName(const FileDescriptor* descriptor) {
- std::string result = GetFileNamespace(descriptor);
- if (!result.empty()) {
- result += '.';
- }
- result += GetReflectionClassUnqualifiedName(descriptor);
- return "global::" + result;
-}
-
std::string GetFullExtensionName(const FieldDescriptor* descriptor) {
if (descriptor->extension_scope()) {
return GetClassName(descriptor->extension_scope()) + ".Extensions." + GetPropertyName(descriptor);
@@ -355,14 +255,6 @@
}
}
-std::string GetClassName(const Descriptor* descriptor) {
- return ToCSharpName(descriptor->full_name(), descriptor->file());
-}
-
-std::string GetClassName(const EnumDescriptor* descriptor) {
- return ToCSharpName(descriptor->full_name(), descriptor->file());
-}
-
// Groups are hacky: The name of the field is just the lower-cased name
// of the group type. In C#, though, we would like to retain the original
// capitalization of the type name.
@@ -379,15 +271,30 @@
}
std::string GetPropertyName(const FieldDescriptor* descriptor) {
+ // Names of members declared or overridden in the message.
+ static const auto& reserved_member_names = *new absl::flat_hash_set<absl::string_view>({
+ "Types",
+ "Descriptor",
+ "Equals",
+ "ToString",
+ "GetHashCode",
+ "WriteTo",
+ "Clone",
+ "CalculateSize",
+ "MergeFrom",
+ "OnConstruction",
+ "Parser"
+ });
+
// TODO(jtattermusch): consider introducing csharp_property_name field option
std::string property_name = UnderscoresToPascalCase(GetFieldName(descriptor));
- // Avoid either our own type name or reserved names. Note that not all names
- // are reserved - a field called to_string, write_to etc would still cause a problem.
+ // Avoid either our own type name or reserved names.
// There are various ways of ending up with naming collisions, but we try to avoid obvious
- // ones.
+ // ones. In particular, we avoid the names of all the members we generate.
+ // Note that we *don't* add an underscore for MemberwiseClone or GetType. Those generate
+ // warnings, but not errors; changing the name now could be a breaking change.
if (property_name == descriptor->containing_type()->name()
- || property_name == "Types"
- || property_name == "Descriptor") {
+ || reserved_member_names.find(property_name) != reserved_member_names.end()) {
property_name += "_";
}
return property_name;
@@ -400,40 +307,6 @@
return property_name == "None" ? "None_" : property_name;
}
-std::string GetOutputFile(const FileDescriptor* descriptor,
- const std::string file_extension,
- const bool generate_directories,
- const std::string base_namespace,
- std::string* error) {
- std::string relative_filename = GetFileNameBase(descriptor) + file_extension;
- if (!generate_directories) {
- return relative_filename;
- }
- std::string ns = GetFileNamespace(descriptor);
- std::string namespace_suffix = ns;
- if (!base_namespace.empty()) {
- // Check that the base_namespace is either equal to or a leading part of
- // the file namespace. This isn't just a simple prefix; "Foo.B" shouldn't
- // be regarded as a prefix of "Foo.Bar". The simplest option is to add "."
- // to both.
- std::string extended_ns = ns + ".";
- if (extended_ns.find(base_namespace + ".") != 0) {
- *error = "Namespace " + ns + " is not a prefix namespace of base namespace " + base_namespace;
- return ""; // This will be ignored, because we've set an error.
- }
- namespace_suffix = ns.substr(base_namespace.length());
- if (namespace_suffix.find(".") == 0) {
- namespace_suffix = namespace_suffix.substr(1);
- }
- }
-
- std::string namespace_dir = StringReplace(namespace_suffix, ".", "/", true);
- if (!namespace_dir.empty()) {
- namespace_dir += "/";
- }
- return namespace_dir + relative_filename;
-}
-
// TODO: c&p from Java protoc plugin
// For encodings with fixed sizes, returns that size in bytes. Otherwise
// returns -1.
@@ -597,3 +470,5 @@
} // namespace compiler
} // namespace protobuf
} // namespace google
+
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/compiler/csharp/csharp_helpers.h b/src/google/protobuf/compiler/csharp/csharp_helpers.h
index 836bd5d..b9aa556 100644
--- a/src/google/protobuf/compiler/csharp/csharp_helpers.h
+++ b/src/google/protobuf/compiler/csharp/csharp_helpers.h
@@ -36,14 +36,15 @@
#define GOOGLE_PROTOBUF_COMPILER_CSHARP_HELPERS_H__
#include <string>
-#include <google/protobuf/port.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/compiler/code_generator.h"
+#include "google/protobuf/compiler/csharp/names.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/port.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -72,15 +73,6 @@
// Converts field type to corresponding C# type.
CSharpType GetCSharpType(FieldDescriptor::Type type);
-std::string StripDotProto(const std::string& proto_file);
-
-// Gets unqualified name of the reflection class
-std::string GetReflectionClassUnqualifiedName(const FileDescriptor* descriptor);
-// Gets unqualified name of the extension class
-std::string GetExtensionClassUnqualifiedName(const FileDescriptor* descriptor);
-
-std::string GetClassName(const EnumDescriptor* descriptor);
-
std::string GetFieldName(const FieldDescriptor* descriptor);
std::string GetFieldConstantName(const FieldDescriptor* field);
@@ -91,16 +83,6 @@
int GetFixedSize(FieldDescriptor::Type type);
-std::string UnderscoresToCamelCase(const std::string& input,
- bool cap_next_letter,
- bool preserve_period);
-
-inline std::string UnderscoresToCamelCase(const std::string& input, bool cap_next_letter) {
- return UnderscoresToCamelCase(input, cap_next_letter, false);
-}
-
-std::string UnderscoresToPascalCase(const std::string& input);
-
// Note that we wouldn't normally want to export this (we're not expecting
// it to be used outside libprotoc itself) but this exposes it for testing.
std::string PROTOC_EXPORT GetEnumValueName(const std::string& enum_name,
@@ -193,6 +175,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_COMPILER_CSHARP_HELPERS_H__
diff --git a/src/google/protobuf/compiler/csharp/csharp_map_field.cc b/src/google/protobuf/compiler/csharp/csharp_map_field.cc
index a13b995..50d8b1d 100644
--- a/src/google/protobuf/compiler/csharp/csharp_map_field.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_map_field.cc
@@ -28,18 +28,16 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#include "google/protobuf/compiler/csharp/csharp_map_field.h"
+
#include <sstream>
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/stubs/strutil.h>
-
-#include <google/protobuf/compiler/csharp/csharp_doc_comment.h>
-#include <google/protobuf/compiler/csharp/csharp_helpers.h>
-#include <google/protobuf/compiler/csharp/csharp_map_field.h>
+#include "google/protobuf/compiler/code_generator.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/compiler/csharp/csharp_doc_comment.h"
+#include "google/protobuf/compiler/csharp/csharp_helpers.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/io/printer.h"
namespace google {
namespace protobuf {
@@ -90,7 +88,7 @@
void MapFieldGenerator::GenerateMergingCode(io::Printer* printer) {
printer->Print(
variables_,
- "$name$_.Add(other.$name$_);\n");
+ "$name$_.MergeFrom(other.$name$_);\n");
}
void MapFieldGenerator::GenerateParsingCode(io::Printer* printer) {
diff --git a/src/google/protobuf/compiler/csharp/csharp_map_field.h b/src/google/protobuf/compiler/csharp/csharp_map_field.h
index 23b3619..c4713d0 100644
--- a/src/google/protobuf/compiler/csharp/csharp_map_field.h
+++ b/src/google/protobuf/compiler/csharp/csharp_map_field.h
@@ -31,8 +31,8 @@
#ifndef GOOGLE_PROTOBUF_COMPILER_CSHARP_MAP_FIELD_H__
#define GOOGLE_PROTOBUF_COMPILER_CSHARP_MAP_FIELD_H__
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/compiler/csharp/csharp_field_base.h>
+#include "google/protobuf/compiler/code_generator.h"
+#include "google/protobuf/compiler/csharp/csharp_field_base.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/compiler/csharp/csharp_message.cc b/src/google/protobuf/compiler/csharp/csharp_message.cc
index a119bdd..bdbd480 100644
--- a/src/google/protobuf/compiler/csharp/csharp_message.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_message.cc
@@ -28,26 +28,28 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <sstream>
+#include "google/protobuf/compiler/csharp/csharp_message.h"
+
#include <algorithm>
#include <map>
+#include <sstream>
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/wire_format.h>
-#include <google/protobuf/wire_format_lite.h>
+#include "google/protobuf/compiler/code_generator.h"
+#include "absl/strings/str_cat.h"
+#include "google/protobuf/compiler/csharp/csharp_doc_comment.h"
+#include "google/protobuf/compiler/csharp/csharp_enum.h"
+#include "google/protobuf/compiler/csharp/csharp_field_base.h"
+#include "google/protobuf/compiler/csharp/csharp_helpers.h"
+#include "google/protobuf/compiler/csharp/names.h"
+#include "google/protobuf/compiler/csharp/csharp_options.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/wire_format.h"
+#include "google/protobuf/wire_format_lite.h"
-#include <google/protobuf/compiler/csharp/csharp_options.h>
-#include <google/protobuf/compiler/csharp/csharp_doc_comment.h>
-#include <google/protobuf/compiler/csharp/csharp_enum.h>
-#include <google/protobuf/compiler/csharp/csharp_field_base.h>
-#include <google/protobuf/compiler/csharp/csharp_helpers.h>
-#include <google/protobuf/compiler/csharp/csharp_message.h>
-#include <google/protobuf/compiler/csharp/csharp_names.h>
+// Must be last.
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -161,7 +163,7 @@
for (int i = 0; i < has_bit_field_count_; i++) {
// don't use arrays since all arrays are heap allocated, saving allocations
// use ints instead of bytes since bytes lack bitwise operators, saving casts
- printer->Print("private int _hasBits$i$;\n", "i", StrCat(i));
+ printer->Print("private int _hasBits$i$;\n", "i", absl::StrCat(i));
}
WriteGeneratedCodeAttributes(printer);
@@ -173,10 +175,10 @@
// Access the message descriptor via the relevant file descriptor or containing message descriptor.
if (!descriptor_->containing_type()) {
vars["descriptor_accessor"] = GetReflectionClassName(descriptor_->file())
- + ".Descriptor.MessageTypes[" + StrCat(descriptor_->index()) + "]";
+ + ".Descriptor.MessageTypes[" + absl::StrCat(descriptor_->index()) + "]";
} else {
vars["descriptor_accessor"] = GetClassName(descriptor_->containing_type())
- + ".Descriptor.NestedTypes[" + StrCat(descriptor_->index()) + "]";
+ + ".Descriptor.NestedTypes[" + absl::StrCat(descriptor_->index()) + "]";
}
WriteGeneratedCodeAttributes(printer);
@@ -216,7 +218,7 @@
"public const int $field_constant_name$ = $index$;\n",
"field_name", fieldDescriptor->name(),
"field_constant_name", GetFieldConstantName(fieldDescriptor),
- "index", StrCat(fieldDescriptor->number()));
+ "index", absl::StrCat(fieldDescriptor->number()));
std::unique_ptr<FieldGeneratorBase> generator(
CreateFieldGeneratorInternal(fieldDescriptor));
generator->GenerateMembers(printer);
@@ -240,7 +242,7 @@
const FieldDescriptor* field = oneof->field(j);
printer->Print("$oneof_case_name$ = $index$,\n",
"oneof_case_name", GetOneofCaseName(field),
- "index", StrCat(field->number()));
+ "index", absl::StrCat(field->number()));
}
printer->Outdent();
printer->Print("}\n");
@@ -382,7 +384,7 @@
"public $class_name$($class_name$ other) : this() {\n");
printer->Indent();
for (int i = 0; i < has_bit_field_count_; i++) {
- printer->Print("_hasBits$i$ = other._hasBits$i$;\n", "i", StrCat(i));
+ printer->Print("_hasBits$i$ = other._hasBits$i$;\n", "i", absl::StrCat(i));
}
// Clone non-oneof fields first (treating optional proto3 fields as non-oneof)
for (int i = 0; i < descriptor_->field_count(); i++) {
@@ -698,7 +700,7 @@
printer->Print(
"case $end_tag$:\n"
" return;\n",
- "end_tag", StrCat(end_tag_));
+ "end_tag", absl::StrCat(end_tag_));
}
if (has_extension_ranges_) {
printer->Print(vars,
@@ -727,13 +729,13 @@
printer->Print(
"case $packed_tag$:\n",
"packed_tag",
- StrCat(
+ absl::StrCat(
internal::WireFormatLite::MakeTag(
field->number(),
internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED)));
}
- printer->Print("case $tag$: {\n", "tag", StrCat(tag));
+ printer->Print("case $tag$: {\n", "tag", absl::StrCat(tag));
printer->Indent();
std::unique_ptr<FieldGeneratorBase> generator(
CreateFieldGeneratorInternal(field));
@@ -777,3 +779,5 @@
} // namespace compiler
} // namespace protobuf
} // namespace google
+
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/compiler/csharp/csharp_message.h b/src/google/protobuf/compiler/csharp/csharp_message.h
index d02767e..86025dc 100644
--- a/src/google/protobuf/compiler/csharp/csharp_message.h
+++ b/src/google/protobuf/compiler/csharp/csharp_message.h
@@ -34,9 +34,9 @@
#include <string>
#include <vector>
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/compiler/csharp/csharp_source_generator_base.h>
-#include <google/protobuf/compiler/csharp/csharp_helpers.h>
+#include "google/protobuf/compiler/code_generator.h"
+#include "google/protobuf/compiler/csharp/csharp_source_generator_base.h"
+#include "google/protobuf/compiler/csharp/csharp_helpers.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/compiler/csharp/csharp_message_field.cc b/src/google/protobuf/compiler/csharp/csharp_message_field.cc
index 487d01d..1f30bdc 100644
--- a/src/google/protobuf/compiler/csharp/csharp_message_field.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_message_field.cc
@@ -28,21 +28,17 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#include "google/protobuf/compiler/csharp/csharp_message_field.h"
+
#include <sstream>
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/wire_format.h>
-#include <google/protobuf/wire_format_lite.h>
-
-#include <google/protobuf/compiler/csharp/csharp_doc_comment.h>
-#include <google/protobuf/compiler/csharp/csharp_helpers.h>
-#include <google/protobuf/compiler/csharp/csharp_message_field.h>
-#include <google/protobuf/compiler/csharp/csharp_options.h>
+#include "google/protobuf/compiler/code_generator.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/compiler/csharp/csharp_doc_comment.h"
+#include "google/protobuf/compiler/csharp/csharp_helpers.h"
+#include "google/protobuf/compiler/csharp/csharp_options.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/io/printer.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/compiler/csharp/csharp_message_field.h b/src/google/protobuf/compiler/csharp/csharp_message_field.h
index e76dfd2..fbbe4c4 100644
--- a/src/google/protobuf/compiler/csharp/csharp_message_field.h
+++ b/src/google/protobuf/compiler/csharp/csharp_message_field.h
@@ -31,8 +31,8 @@
#ifndef GOOGLE_PROTOBUF_COMPILER_CSHARP_MESSAGE_FIELD_H__
#define GOOGLE_PROTOBUF_COMPILER_CSHARP_MESSAGE_FIELD_H__
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/compiler/csharp/csharp_field_base.h>
+#include "google/protobuf/compiler/code_generator.h"
+#include "google/protobuf/compiler/csharp/csharp_field_base.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/compiler/csharp/csharp_primitive_field.cc b/src/google/protobuf/compiler/csharp/csharp_primitive_field.cc
index e7d5116..1467bd3 100644
--- a/src/google/protobuf/compiler/csharp/csharp_primitive_field.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_primitive_field.cc
@@ -28,19 +28,18 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#include "google/protobuf/compiler/csharp/csharp_primitive_field.h"
+
#include <sstream>
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/stubs/strutil.h>
-
-#include <google/protobuf/compiler/csharp/csharp_doc_comment.h>
-#include <google/protobuf/compiler/csharp/csharp_helpers.h>
-#include <google/protobuf/compiler/csharp/csharp_options.h>
-#include <google/protobuf/compiler/csharp/csharp_primitive_field.h>
+#include "google/protobuf/compiler/code_generator.h"
+#include "absl/strings/str_cat.h"
+#include "google/protobuf/compiler/csharp/csharp_doc_comment.h"
+#include "google/protobuf/compiler/csharp/csharp_helpers.h"
+#include "google/protobuf/compiler/csharp/csharp_options.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/io/printer.h"
namespace google {
namespace protobuf {
@@ -215,7 +214,7 @@
} else {
printer->Print(
"size += $tag_size$ + $fixed_size$;\n",
- "fixed_size", StrCat(fixedSize),
+ "fixed_size", absl::StrCat(fixedSize),
"tag_size", variables_["tag_size"]);
}
printer->Outdent();
diff --git a/src/google/protobuf/compiler/csharp/csharp_primitive_field.h b/src/google/protobuf/compiler/csharp/csharp_primitive_field.h
index 6d495d5..d6fb715 100644
--- a/src/google/protobuf/compiler/csharp/csharp_primitive_field.h
+++ b/src/google/protobuf/compiler/csharp/csharp_primitive_field.h
@@ -31,8 +31,8 @@
#ifndef GOOGLE_PROTOBUF_COMPILER_CSHARP_PRIMITIVE_FIELD_H__
#define GOOGLE_PROTOBUF_COMPILER_CSHARP_PRIMITIVE_FIELD_H__
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/compiler/csharp/csharp_field_base.h>
+#include "google/protobuf/compiler/code_generator.h"
+#include "google/protobuf/compiler/csharp/csharp_field_base.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/compiler/csharp/csharp_reflection_class.cc b/src/google/protobuf/compiler/csharp/csharp_reflection_class.cc
index d9ab4b4..e23c48a 100644
--- a/src/google/protobuf/compiler/csharp/csharp_reflection_class.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_reflection_class.cc
@@ -28,23 +28,24 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#include "google/protobuf/compiler/csharp/csharp_reflection_class.h"
+
#include <sstream>
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/stubs/strutil.h>
+#include "google/protobuf/compiler/code_generator.h"
+#include "absl/strings/str_join.h"
+#include "google/protobuf/compiler/csharp/csharp_enum.h"
+#include "google/protobuf/compiler/csharp/csharp_field_base.h"
+#include "google/protobuf/compiler/csharp/csharp_helpers.h"
+#include "google/protobuf/compiler/csharp/csharp_message.h"
+#include "google/protobuf/compiler/csharp/names.h"
+#include "google/protobuf/compiler/csharp/csharp_options.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/io/printer.h"
-
-#include <google/protobuf/compiler/csharp/csharp_enum.h>
-#include <google/protobuf/compiler/csharp/csharp_helpers.h>
-#include <google/protobuf/compiler/csharp/csharp_field_base.h>
-#include <google/protobuf/compiler/csharp/csharp_message.h>
-#include <google/protobuf/compiler/csharp/csharp_names.h>
-#include <google/protobuf/compiler/csharp/csharp_options.h>
-#include <google/protobuf/compiler/csharp/csharp_reflection_class.h>
+// Must be last.
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -213,7 +214,7 @@
for (int i = 0; i < file_->extension_count(); i++) {
extensions.push_back(GetFullExtensionName(file_->extension(i)));
}
- printer->Print("new pb::Extension[] { $extensions$ }, ", "extensions", Join(extensions, ", "));
+ printer->Print("new pb::Extension[] { $extensions$ }, ", "extensions", absl::StrJoin(extensions, ", "));
}
else {
printer->Print("null, ");
@@ -265,7 +266,7 @@
for (int i = 0; i < descriptor->field_count(); i++) {
fields.push_back(GetPropertyName(descriptor->field(i)));
}
- printer->Print("new[]{ \"$fields$\" }, ", "fields", Join(fields, "\", \""));
+ printer->Print("new[]{ \"$fields$\" }, ", "fields", absl::StrJoin(fields, "\", \""));
}
else {
printer->Print("null, ");
@@ -278,7 +279,7 @@
for (int i = 0; i < descriptor->oneof_decl_count(); i++) {
oneofs.push_back(UnderscoresToCamelCase(descriptor->oneof_decl(i)->name(), true));
}
- printer->Print("new[]{ \"$oneofs$\" }, ", "oneofs", Join(oneofs, "\", \""));
+ printer->Print("new[]{ \"$oneofs$\" }, ", "oneofs", absl::StrJoin(oneofs, "\", \""));
}
else {
printer->Print("null, ");
@@ -291,7 +292,7 @@
for (int i = 0; i < descriptor->enum_type_count(); i++) {
enums.push_back(GetClassName(descriptor->enum_type(i)));
}
- printer->Print("new[]{ typeof($enums$) }, ", "enums", Join(enums, "), typeof("));
+ printer->Print("new[]{ typeof($enums$) }, ", "enums", absl::StrJoin(enums, "), typeof("));
}
else {
printer->Print("null, ");
@@ -303,7 +304,7 @@
for (int i = 0; i < descriptor->extension_count(); i++) {
extensions.push_back(GetFullExtensionName(descriptor->extension(i)));
}
- printer->Print("new pb::Extension[] { $extensions$ }, ", "extensions", Join(extensions, ", "));
+ printer->Print("new pb::Extension[] { $extensions$ }, ", "extensions", absl::StrJoin(extensions, ", "));
}
else {
printer->Print("null, ");
@@ -328,3 +329,5 @@
} // namespace compiler
} // namespace protobuf
} // namespace google
+
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/compiler/csharp/csharp_reflection_class.h b/src/google/protobuf/compiler/csharp/csharp_reflection_class.h
index 9554727..daffb32 100644
--- a/src/google/protobuf/compiler/csharp/csharp_reflection_class.h
+++ b/src/google/protobuf/compiler/csharp/csharp_reflection_class.h
@@ -33,10 +33,10 @@
#include <string>
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/compiler/csharp/csharp_source_generator_base.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/io/printer.h>
+#include "google/protobuf/compiler/code_generator.h"
+#include "google/protobuf/compiler/csharp/csharp_source_generator_base.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/io/printer.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.cc b/src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.cc
index 04bc7bb..1a9fd1d 100644
--- a/src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.cc
@@ -28,18 +28,18 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#include "google/protobuf/compiler/csharp/csharp_repeated_enum_field.h"
+
#include <sstream>
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/wire_format.h>
-
-#include <google/protobuf/compiler/csharp/csharp_doc_comment.h>
-#include <google/protobuf/compiler/csharp/csharp_helpers.h>
-#include <google/protobuf/compiler/csharp/csharp_repeated_enum_field.h>
+#include "google/protobuf/compiler/code_generator.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/wire_format.h"
+#include "google/protobuf/compiler/csharp/csharp_doc_comment.h"
+#include "google/protobuf/compiler/csharp/csharp_helpers.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/io/zero_copy_stream.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.h b/src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.h
index 2379f38..08ce992 100644
--- a/src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.h
+++ b/src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.h
@@ -31,8 +31,8 @@
#ifndef GOOGLE_PROTOBUF_COMPILER_CSHARP_REPEATED_ENUM_FIELD_H__
#define GOOGLE_PROTOBUF_COMPILER_CSHARP_REPEATED_ENUM_FIELD_H__
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/compiler/csharp/csharp_field_base.h>
+#include "google/protobuf/compiler/code_generator.h"
+#include "google/protobuf/compiler/csharp/csharp_field_base.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/compiler/csharp/csharp_repeated_message_field.cc b/src/google/protobuf/compiler/csharp/csharp_repeated_message_field.cc
index 8a93cd1..6ac7e2d 100644
--- a/src/google/protobuf/compiler/csharp/csharp_repeated_message_field.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_repeated_message_field.cc
@@ -28,19 +28,19 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#include "google/protobuf/compiler/csharp/csharp_repeated_message_field.h"
+
#include <sstream>
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-
-#include <google/protobuf/compiler/csharp/csharp_doc_comment.h>
-#include <google/protobuf/compiler/csharp/csharp_helpers.h>
-#include <google/protobuf/compiler/csharp/csharp_repeated_message_field.h>
-#include <google/protobuf/compiler/csharp/csharp_message_field.h>
-#include <google/protobuf/compiler/csharp/csharp_wrapper_field.h>
+#include "google/protobuf/compiler/code_generator.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/compiler/csharp/csharp_doc_comment.h"
+#include "google/protobuf/compiler/csharp/csharp_helpers.h"
+#include "google/protobuf/compiler/csharp/csharp_message_field.h"
+#include "google/protobuf/compiler/csharp/csharp_wrapper_field.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/io/zero_copy_stream.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/compiler/csharp/csharp_repeated_message_field.h b/src/google/protobuf/compiler/csharp/csharp_repeated_message_field.h
index 026efea..f2c935a 100644
--- a/src/google/protobuf/compiler/csharp/csharp_repeated_message_field.h
+++ b/src/google/protobuf/compiler/csharp/csharp_repeated_message_field.h
@@ -31,8 +31,8 @@
#ifndef GOOGLE_PROTOBUF_COMPILER_CSHARP_REPEATED_MESSAGE_FIELD_H__
#define GOOGLE_PROTOBUF_COMPILER_CSHARP_REPEATED_MESSAGE_FIELD_H__
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/compiler/csharp/csharp_field_base.h>
+#include "google/protobuf/compiler/code_generator.h"
+#include "google/protobuf/compiler/csharp/csharp_field_base.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc b/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc
index 0eacf91..df97ccf 100644
--- a/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc
@@ -28,18 +28,18 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#include "google/protobuf/compiler/csharp/csharp_repeated_primitive_field.h"
+
#include <sstream>
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/wire_format.h>
-
-#include <google/protobuf/compiler/csharp/csharp_doc_comment.h>
-#include <google/protobuf/compiler/csharp/csharp_helpers.h>
-#include <google/protobuf/compiler/csharp/csharp_repeated_primitive_field.h>
+#include "google/protobuf/compiler/code_generator.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/wire_format.h"
+#include "google/protobuf/compiler/csharp/csharp_doc_comment.h"
+#include "google/protobuf/compiler/csharp/csharp_helpers.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/io/zero_copy_stream.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.h b/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.h
index bdd12a0..92485a2 100644
--- a/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.h
+++ b/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.h
@@ -31,8 +31,8 @@
#ifndef GOOGLE_PROTOBUF_COMPILER_CSHARP_REPEATED_PRIMITIVE_FIELD_H__
#define GOOGLE_PROTOBUF_COMPILER_CSHARP_REPEATED_PRIMITIVE_FIELD_H__
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/compiler/csharp/csharp_field_base.h>
+#include "google/protobuf/compiler/code_generator.h"
+#include "google/protobuf/compiler/csharp/csharp_field_base.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/compiler/csharp/csharp_source_generator_base.cc b/src/google/protobuf/compiler/csharp/csharp_source_generator_base.cc
index 7157e6e..f12db82 100644
--- a/src/google/protobuf/compiler/csharp/csharp_source_generator_base.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_source_generator_base.cc
@@ -28,18 +28,18 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#include "google/protobuf/compiler/csharp/csharp_source_generator_base.h"
+
#include <sstream>
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-
-#include <google/protobuf/compiler/csharp/csharp_source_generator_base.h>
-#include <google/protobuf/compiler/csharp/csharp_helpers.h>
-#include <google/protobuf/compiler/csharp/csharp_names.h>
-#include <google/protobuf/compiler/csharp/csharp_options.h>
+#include "google/protobuf/compiler/code_generator.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/compiler/csharp/csharp_helpers.h"
+#include "google/protobuf/compiler/csharp/names.h"
+#include "google/protobuf/compiler/csharp/csharp_options.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/io/zero_copy_stream.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/compiler/csharp/csharp_source_generator_base.h b/src/google/protobuf/compiler/csharp/csharp_source_generator_base.h
index 17a5269..01b0187 100644
--- a/src/google/protobuf/compiler/csharp/csharp_source_generator_base.h
+++ b/src/google/protobuf/compiler/csharp/csharp_source_generator_base.h
@@ -33,8 +33,8 @@
#include <string>
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/io/printer.h>
+#include "google/protobuf/compiler/code_generator.h"
+#include "google/protobuf/io/printer.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/compiler/csharp/csharp_wrapper_field.cc b/src/google/protobuf/compiler/csharp/csharp_wrapper_field.cc
index e638dd8..2569082 100644
--- a/src/google/protobuf/compiler/csharp/csharp_wrapper_field.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_wrapper_field.cc
@@ -28,18 +28,18 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#include "google/protobuf/compiler/csharp/csharp_wrapper_field.h"
+
#include <sstream>
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-
-#include <google/protobuf/compiler/csharp/csharp_doc_comment.h>
-#include <google/protobuf/compiler/csharp/csharp_helpers.h>
-#include <google/protobuf/compiler/csharp/csharp_options.h>
-#include <google/protobuf/compiler/csharp/csharp_wrapper_field.h>
+#include "google/protobuf/compiler/code_generator.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/compiler/csharp/csharp_doc_comment.h"
+#include "google/protobuf/compiler/csharp/csharp_helpers.h"
+#include "google/protobuf/compiler/csharp/csharp_options.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/io/zero_copy_stream.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/compiler/csharp/csharp_wrapper_field.h b/src/google/protobuf/compiler/csharp/csharp_wrapper_field.h
index cc8a313..6b15aa0 100644
--- a/src/google/protobuf/compiler/csharp/csharp_wrapper_field.h
+++ b/src/google/protobuf/compiler/csharp/csharp_wrapper_field.h
@@ -31,8 +31,8 @@
#ifndef GOOGLE_PROTOBUF_COMPILER_CSHARP_WRAPPER_FIELD_H__
#define GOOGLE_PROTOBUF_COMPILER_CSHARP_WRAPPER_FIELD_H__
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/compiler/csharp/csharp_field_base.h>
+#include "google/protobuf/compiler/code_generator.h"
+#include "google/protobuf/compiler/csharp/csharp_field_base.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/compiler/csharp/names.cc b/src/google/protobuf/compiler/csharp/names.cc
new file mode 100644
index 0000000..b4ca408
--- /dev/null
+++ b/src/google/protobuf/compiler/csharp/names.cc
@@ -0,0 +1,225 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Author: kenton@google.com (Kenton Varda)
+// Based on original Protocol Buffers design by
+// Sanjay Ghemawat, Jeff Dean, and others.
+
+#include "google/protobuf/compiler/csharp/names.h"
+
+#include <string>
+
+#include "absl/strings/str_replace.h"
+#include "google/protobuf/compiler/csharp/names.h"
+#include "google/protobuf/descriptor.pb.h"
+
+// Must be last.
+#include "google/protobuf/port_def.inc"
+
+namespace google {
+namespace protobuf {
+namespace compiler {
+namespace csharp {
+
+namespace {
+
+std::string StripDotProto(const std::string& proto_file) {
+ int lastindex = proto_file.find_last_of('.');
+ return proto_file.substr(0, lastindex);
+}
+
+// Returns the Pascal-cased last part of the proto file. For example,
+// input of "google/protobuf/foo_bar.proto" would result in "FooBar".
+std::string GetFileNameBase(const FileDescriptor* descriptor) {
+ std::string proto_file = descriptor->name();
+ int lastslash = proto_file.find_last_of('/');
+ std::string base = proto_file.substr(lastslash + 1);
+ return UnderscoresToPascalCase(StripDotProto(base));
+}
+
+std::string ToCSharpName(const std::string& name, const FileDescriptor* file) {
+ std::string result = GetFileNamespace(file);
+ if (!result.empty()) {
+ result += '.';
+ }
+ std::string classname;
+ if (file->package().empty()) {
+ classname = name;
+ } else {
+ // Strip the proto package from full_name since we've replaced it with
+ // the C# namespace.
+ classname = name.substr(file->package().size() + 1);
+ }
+ result += absl::StrReplaceAll(classname, {{".", ".Types."}});
+ return "global::" + result;
+}
+
+} // namespace
+
+std::string GetFileNamespace(const FileDescriptor* descriptor) {
+ if (descriptor->options().has_csharp_namespace()) {
+ return descriptor->options().csharp_namespace();
+ }
+ return UnderscoresToCamelCase(descriptor->package(), true, true);
+}
+
+std::string GetClassName(const Descriptor* descriptor) {
+ return ToCSharpName(descriptor->full_name(), descriptor->file());
+}
+
+std::string GetClassName(const EnumDescriptor* descriptor) {
+ return ToCSharpName(descriptor->full_name(), descriptor->file());
+}
+
+std::string GetReflectionClassUnqualifiedName(const FileDescriptor* descriptor) {
+ // TODO: Detect collisions with existing messages,
+ // and append an underscore if necessary.
+ return GetFileNameBase(descriptor) + "Reflection";
+}
+
+std::string GetReflectionClassName(const FileDescriptor* descriptor) {
+ std::string result = GetFileNamespace(descriptor);
+ if (!result.empty()) {
+ result += '.';
+ }
+ result += GetReflectionClassUnqualifiedName(descriptor);
+ return "global::" + result;
+}
+
+std::string GetExtensionClassUnqualifiedName(const FileDescriptor* descriptor) {
+ // TODO: Detect collisions with existing messages,
+ // and append an underscore if necessary.
+ return GetFileNameBase(descriptor) + "Extensions";
+}
+
+std::string GetOutputFile(const FileDescriptor* descriptor,
+ const std::string file_extension,
+ const bool generate_directories,
+ const std::string base_namespace,
+ std::string* error) {
+ std::string relative_filename = GetFileNameBase(descriptor) + file_extension;
+ if (!generate_directories) {
+ return relative_filename;
+ }
+ std::string ns = GetFileNamespace(descriptor);
+ std::string namespace_suffix = ns;
+ if (!base_namespace.empty()) {
+ // Check that the base_namespace is either equal to or a leading part of
+ // the file namespace. This isn't just a simple prefix; "Foo.B" shouldn't
+ // be regarded as a prefix of "Foo.Bar". The simplest option is to add "."
+ // to both.
+ std::string extended_ns = ns + ".";
+ if (extended_ns.find(base_namespace + ".") != 0) {
+ *error = "Namespace " + ns + " is not a prefix namespace of base namespace " + base_namespace;
+ return ""; // This will be ignored, because we've set an error.
+ }
+ namespace_suffix = ns.substr(base_namespace.length());
+ if (namespace_suffix.find('.') == 0) {
+ namespace_suffix = namespace_suffix.substr(1);
+ }
+ }
+
+ std::string namespace_dir =
+ absl::StrReplaceAll(namespace_suffix, {{".", "/"}});
+ if (!namespace_dir.empty()) {
+ namespace_dir += "/";
+ }
+ return namespace_dir + relative_filename;
+}
+
+std::string UnderscoresToPascalCase(const std::string& input) {
+ return UnderscoresToCamelCase(input, true);
+}
+
+// TODO(jtattermusch): can we reuse a utility function?
+std::string UnderscoresToCamelCase(const std::string& input,
+ bool cap_next_letter,
+ bool preserve_period) {
+ std::string result;
+
+ // Note: I distrust ctype.h due to locales.
+ for (int i = 0; i < input.size(); i++) {
+ if ('a' <= input[i] && input[i] <= 'z') {
+ if (cap_next_letter) {
+ result += input[i] + ('A' - 'a');
+ } else {
+ result += input[i];
+ }
+ cap_next_letter = false;
+ } else if ('A' <= input[i] && input[i] <= 'Z') {
+ if (i == 0 && !cap_next_letter) {
+ // Force first letter to lower-case unless explicitly told to
+ // capitalize it.
+ result += input[i] + ('a' - 'A');
+ } else {
+ // Capital letters after the first are left as-is.
+ result += input[i];
+ }
+ cap_next_letter = false;
+ } else if ('0' <= input[i] && input[i] <= '9') {
+ result += input[i];
+ cap_next_letter = true;
+ } else {
+ cap_next_letter = true;
+ if (input[i] == '.' && preserve_period) {
+ result += '.';
+ }
+ }
+ }
+ // Add a trailing "_" if the name should be altered.
+ if (input.size() > 0 && input[input.size() - 1] == '#') {
+ result += '_';
+ }
+
+ // https://github.com/protocolbuffers/protobuf/issues/8101
+ // To avoid generating invalid identifiers - if the input string
+ // starts with _<digit> (or multiple underscores then digit) then
+ // we need to preserve the underscore as an identifier cannot start
+ // with a digit.
+ // This check is being done after the loop rather than before
+ // to handle the case where there are multiple underscores before the
+ // first digit. We let them all be consumed so we can see if we would
+ // start with a digit.
+ // Note: not preserving leading underscores for all otherwise valid identifiers
+ // so as to not break anything that relies on the existing behaviour
+ if (result.size() > 0 && ('0' <= result[0] && result[0] <= '9')
+ && input.size() > 0 && input[0] == '_')
+ {
+ result.insert(0, 1, '_');
+ }
+ return result;
+}
+
+} // namespace csharp
+} // namespace compiler
+} // namespace protobuf
+} // namespace google
+
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/compiler/csharp/csharp_names.h b/src/google/protobuf/compiler/csharp/names.h
similarity index 70%
rename from src/google/protobuf/compiler/csharp/csharp_names.h
rename to src/google/protobuf/compiler/csharp/names.h
index 67e53b6..4826ea0 100644
--- a/src/google/protobuf/compiler/csharp/csharp_names.h
+++ b/src/google/protobuf/compiler/csharp/names.h
@@ -39,10 +39,8 @@
#define GOOGLE_PROTOBUF_COMPILER_CSHARP_NAMES_H__
#include <string>
-#include <google/protobuf/port.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -73,9 +71,35 @@
// descriptor != NULL
//
// Returns:
-// The fully-qualified name of the C# class that provides
-// access to the file descriptor. Proto compiler generates
+// The fully-qualified C# enum class name.
+std::string GetClassName(const EnumDescriptor* descriptor);
+
+// Requires:
+// descriptor != NULL
+//
+// Returns:
+// The unqualified name of the C# class that provides access to the file
+// descriptor. Proto compiler generates
// such class for each .proto file processed.
+std::string GetReflectionClassUnqualifiedName(const FileDescriptor* descriptor);
+
+// Gets unqualified name of the extension class
+// Requires:
+// descriptor != NULL
+//
+// Returns:
+// The unqualified name of the generated C# extensions class that provide
+// access to extensions. Proto compiler generates such class for each
+// .proto file processed that contains extensions.
+std::string GetExtensionClassUnqualifiedName(const FileDescriptor* descriptor);
+
+// Requires:
+// descriptor != NULL
+//
+// Returns:
+// The fully-qualified name of the C# class that provides access to the file
+// descriptor. Proto compiler generates such class for each .proto file
+// processed.
std::string PROTOC_EXPORT
GetReflectionClassName(const FileDescriptor* descriptor);
@@ -99,11 +123,23 @@
const std::string base_namespace,
std::string* error);
+std::string UnderscoresToPascalCase(const std::string& input);
+
+// Note that we wouldn't normally want to export this (we're not expecting
+// it to be used outside libprotoc itself) but this exposes it for testing.
+std::string PROTOC_EXPORT UnderscoresToCamelCase(const std::string& input,
+ bool cap_next_letter,
+ bool preserve_period);
+
+inline std::string UnderscoresToCamelCase(const std::string& input, bool cap_next_letter) {
+ return UnderscoresToCamelCase(input, cap_next_letter, false);
+}
+
} // namespace csharp
} // namespace compiler
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_COMPILER_CSHARP_NAMES_H__
diff --git a/src/google/protobuf/compiler/importer.cc b/src/google/protobuf/compiler/importer.cc
index f1e26f8..a2de7e5 100644
--- a/src/google/protobuf/compiler/importer.cc
+++ b/src/google/protobuf/compiler/importer.cc
@@ -32,6 +32,8 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
+#include "google/protobuf/compiler/importer.h"
+
#ifdef _MSC_VER
#include <direct.h>
#else
@@ -44,13 +46,17 @@
#include <algorithm>
#include <memory>
+#include <vector>
-#include <google/protobuf/compiler/importer.h>
-#include <google/protobuf/compiler/parser.h>
-#include <google/protobuf/io/tokenizer.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/io/io_win32.h>
+#include "absl/strings/match.h"
+#include "absl/strings/str_join.h"
+#include "absl/strings/str_replace.h"
+#include "absl/strings/str_split.h"
+#include "absl/strings/string_view.h"
+#include "google/protobuf/compiler/parser.h"
+#include "google/protobuf/io/io_win32.h"
+#include "google/protobuf/io/tokenizer.h"
+#include "google/protobuf/io/zero_copy_stream_impl.h"
#ifdef _WIN32
#include <ctype.h>
@@ -70,7 +76,7 @@
// Returns true if the text looks like a Windows-style absolute path, starting
// with a drive letter. Example: "C:\foo". TODO(kenton): Share this with
// copy in command_line_interface.cc?
-static bool IsWindowsAbsolutePath(const std::string& text) {
+static bool IsWindowsAbsolutePath(absl::string_view text) {
#if defined(_WIN32) || defined(__CYGWIN__)
return text.size() >= 3 && text[1] == ':' && isalpha(text[0]) &&
(text[2] == '/' || text[2] == '\\') && text.find_last_of(':') == 1;
@@ -251,10 +257,6 @@
DiskSourceTree::~DiskSourceTree() {}
-static inline char LastChar(const std::string& str) {
- return str[str.size() - 1];
-}
-
// Given a path, returns an equivalent path with these changes:
// - On Windows, any backslashes are replaced with forward slashes.
// - Any instances of the directory "." are removed.
@@ -274,45 +276,38 @@
// then if foo/bar is a symbolic link, foo/bar/baz.proto will canonicalize
// to a path which does not appear to be under foo, and thus the compiler
// will complain that baz.proto is not inside the --proto_path.
-static std::string CanonicalizePath(std::string path) {
+static std::string CanonicalizePath(absl::string_view path) {
#ifdef _WIN32
// The Win32 API accepts forward slashes as a path delimiter even though
// backslashes are standard. Let's avoid confusion and use only forward
// slashes.
- if (HasPrefixString(path, "\\\\")) {
+ std::string path_str;
+ if (absl::StartsWith(path, "\\\\")) {
// Avoid converting two leading backslashes.
- path = "\\\\" + StringReplace(path.substr(2), "\\", "/", true);
+ path_str = "\\\\" + absl::StrReplaceAll(path.substr(2), {{"\\", "/"}});
} else {
- path = StringReplace(path, "\\", "/", true);
+ path_str = absl::StrReplaceAll(path, {{"\\", "/"}});
}
+ path = path_str;
#endif
- std::vector<std::string> canonical_parts;
- std::vector<std::string> parts = Split(
- path, "/", true); // Note: Removes empty parts.
- for (const std::string& part : parts) {
+ std::vector<absl::string_view> canonical_parts;
+ if (!path.empty() && path.front() == '/') canonical_parts.push_back("");
+ for (absl::string_view part : absl::StrSplit(path, '/', absl::SkipEmpty())) {
if (part == ".") {
// Ignore.
} else {
canonical_parts.push_back(part);
}
}
- std::string result = Join(canonical_parts, "/");
- if (!path.empty() && path[0] == '/') {
- // Restore leading slash.
- result = '/' + result;
- }
- if (!path.empty() && LastChar(path) == '/' && !result.empty() &&
- LastChar(result) != '/') {
- // Restore trailing slash.
- result += '/';
- }
- return result;
+ if (!path.empty() && path.back() == '/') canonical_parts.push_back("");
+
+ return absl::StrJoin(canonical_parts, "/");
}
-static inline bool ContainsParentReference(const std::string& path) {
- return path == ".." || HasPrefixString(path, "../") ||
- HasSuffixString(path, "/..") || path.find("/../") != std::string::npos;
+static inline bool ContainsParentReference(absl::string_view path) {
+ return path == ".." || absl::StartsWith(path, "../") ||
+ absl::EndsWith(path, "/..") || absl::StrContains(path, "/../");
}
// Maps a file from an old location to a new one. Typically, old_prefix is
@@ -332,28 +327,28 @@
// assert(!ApplyMapping("foo/bar", "baz", "qux", &result));
// assert(!ApplyMapping("foo/bar", "baz", "qux", &result));
// assert(!ApplyMapping("foobar", "foo", "baz", &result));
-static bool ApplyMapping(const std::string& filename,
- const std::string& old_prefix,
- const std::string& new_prefix, std::string* result) {
+static bool ApplyMapping(absl::string_view filename,
+ absl::string_view old_prefix,
+ absl::string_view new_prefix, std::string* result) {
if (old_prefix.empty()) {
// old_prefix matches any relative path.
if (ContainsParentReference(filename)) {
// We do not allow the file name to use "..".
return false;
}
- if (HasPrefixString(filename, "/") || IsWindowsAbsolutePath(filename)) {
+ if (absl::StartsWith(filename, "/") || IsWindowsAbsolutePath(filename)) {
// This is an absolute path, so it isn't matched by the empty string.
return false;
}
- result->assign(new_prefix);
+ result->assign(std::string(new_prefix));
if (!result->empty()) result->push_back('/');
- result->append(filename);
+ result->append(std::string(filename));
return true;
- } else if (HasPrefixString(filename, old_prefix)) {
+ } else if (absl::StartsWith(filename, old_prefix)) {
// old_prefix is a prefix of the filename. Is it the whole filename?
if (filename.size() == old_prefix.size()) {
// Yep, it's an exact match.
- *result = new_prefix;
+ *result = std::string(new_prefix);
return true;
} else {
// Not an exact match. Is the next character a '/'? Otherwise,
@@ -370,14 +365,14 @@
if (after_prefix_start != -1) {
// Yep. So the prefixes are directories and the filename is a file
// inside them.
- std::string after_prefix = filename.substr(after_prefix_start);
+ absl::string_view after_prefix = filename.substr(after_prefix_start);
if (ContainsParentReference(after_prefix)) {
// We do not allow the file name to use "..".
return false;
}
- result->assign(new_prefix);
+ result->assign(std::string(new_prefix));
if (!result->empty()) result->push_back('/');
- result->append(after_prefix);
+ result->append(std::string(after_prefix));
return true;
}
}
@@ -386,13 +381,14 @@
return false;
}
-void DiskSourceTree::MapPath(const std::string& virtual_path,
- const std::string& disk_path) {
- mappings_.push_back(Mapping(virtual_path, CanonicalizePath(disk_path)));
+void DiskSourceTree::MapPath(absl::string_view virtual_path,
+ absl::string_view disk_path) {
+ mappings_.push_back(
+ Mapping(std::string(virtual_path), CanonicalizePath(disk_path)));
}
DiskSourceTree::DiskFileToVirtualFileResult
-DiskSourceTree::DiskFileToVirtualFile(const std::string& disk_file,
+DiskSourceTree::DiskFileToVirtualFile(absl::string_view disk_file,
std::string* virtual_file,
std::string* shadowing_disk_file) {
int mapping_index = -1;
@@ -436,14 +432,14 @@
return SUCCESS;
}
-bool DiskSourceTree::VirtualFileToDiskFile(const std::string& virtual_file,
+bool DiskSourceTree::VirtualFileToDiskFile(absl::string_view virtual_file,
std::string* disk_file) {
std::unique_ptr<io::ZeroCopyInputStream> stream(
OpenVirtualFile(virtual_file, disk_file));
return stream != nullptr;
}
-io::ZeroCopyInputStream* DiskSourceTree::Open(const std::string& filename) {
+io::ZeroCopyInputStream* DiskSourceTree::Open(absl::string_view filename) {
return OpenVirtualFile(filename, nullptr);
}
@@ -452,7 +448,7 @@
}
io::ZeroCopyInputStream* DiskSourceTree::OpenVirtualFile(
- const std::string& virtual_file, std::string* disk_file) {
+ absl::string_view virtual_file, std::string* disk_file) {
if (virtual_file != CanonicalizePath(virtual_file) ||
ContainsParentReference(virtual_file)) {
// We do not allow importing of paths containing things like ".." or
@@ -489,11 +485,11 @@
}
io::ZeroCopyInputStream* DiskSourceTree::OpenDiskFile(
- const std::string& filename) {
+ absl::string_view filename) {
struct stat sb;
int ret = 0;
do {
- ret = stat(filename.c_str(), &sb);
+ ret = stat(std::string(filename).c_str(), &sb);
} while (ret != 0 && errno == EINTR);
#if defined(_WIN32)
if (ret == 0 && sb.st_mode & S_IFDIR) {
@@ -508,7 +504,7 @@
#endif
int file_descriptor;
do {
- file_descriptor = open(filename.c_str(), O_RDONLY);
+ file_descriptor = open(std::string(filename).c_str(), O_RDONLY);
} while (file_descriptor < 0 && errno == EINTR);
if (file_descriptor >= 0) {
io::FileInputStream* result = new io::FileInputStream(file_descriptor);
diff --git a/src/google/protobuf/compiler/importer.h b/src/google/protobuf/compiler/importer.h
index 2fb88b9..bab4b73 100644
--- a/src/google/protobuf/compiler/importer.h
+++ b/src/google/protobuf/compiler/importer.h
@@ -42,12 +42,12 @@
#include <utility>
#include <vector>
-#include <google/protobuf/compiler/parser.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/descriptor_database.h>
+#include "google/protobuf/compiler/parser.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/descriptor_database.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -159,6 +159,8 @@
class PROTOBUF_EXPORT Importer {
public:
Importer(SourceTree* source_tree, MultiFileErrorCollector* error_collector);
+ Importer(const Importer&) = delete;
+ Importer& operator=(const Importer&) = delete;
~Importer();
// Import the given file and build a FileDescriptor representing it. If
@@ -188,15 +190,15 @@
private:
SourceTreeDescriptorDatabase database_;
DescriptorPool pool_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Importer);
};
// If the importer encounters problems while trying to import the proto files,
// it reports them to a MultiFileErrorCollector.
class PROTOBUF_EXPORT MultiFileErrorCollector {
public:
- inline MultiFileErrorCollector() {}
+ MultiFileErrorCollector() {}
+ MultiFileErrorCollector(const MultiFileErrorCollector&) = delete;
+ MultiFileErrorCollector& operator=(const MultiFileErrorCollector&) = delete;
virtual ~MultiFileErrorCollector();
// Line and column numbers are zero-based. A line number of -1 indicates
@@ -206,9 +208,6 @@
virtual void AddWarning(const std::string& /* filename */, int /* line */,
int /* column */, const std::string& /* message */) {}
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MultiFileErrorCollector);
};
// Abstract interface which represents a directory tree containing proto files.
@@ -217,14 +216,22 @@
// below.
class PROTOBUF_EXPORT SourceTree {
public:
- inline SourceTree() {}
+ SourceTree() {}
+ SourceTree(const SourceTree&) = delete;
+ SourceTree& operator=(const SourceTree&) = delete;
virtual ~SourceTree();
+ // This is a temporary typedef alias to allow migrating the argument type of
+ // Open in an atomic change without touching certain directories which are
+ // restricted for various reasons. This must match the argument type used
+ // below.
+ using SourceTreeOpenArgumentType = absl::string_view;
+
// Open the given file and return a stream that reads it, or NULL if not
// found. The caller takes ownership of the returned object. The filename
// must be a path relative to the root of the source tree and must not
// contain "." or ".." components.
- virtual io::ZeroCopyInputStream* Open(const std::string& filename) = 0;
+ virtual io::ZeroCopyInputStream* Open(absl::string_view filename) = 0;
// If Open() returns NULL, calling this method immediately will return an
// description of the error.
@@ -232,9 +239,6 @@
// better error reporting.
// TODO(xiaofeng): change this to a pure virtual function.
virtual std::string GetLastErrorMessage();
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(SourceTree);
};
// An implementation of SourceTree which loads files from locations on disk.
@@ -243,6 +247,8 @@
class PROTOBUF_EXPORT DiskSourceTree : public SourceTree {
public:
DiskSourceTree();
+ DiskSourceTree(const DiskSourceTree&) = delete;
+ DiskSourceTree& operator=(const DiskSourceTree&) = delete;
~DiskSourceTree() override;
// Map a path on disk to a location in the SourceTree. The path may be
@@ -261,7 +267,7 @@
//
// disk_path may be an absolute path or relative to the current directory,
// just like a path you'd pass to open().
- void MapPath(const std::string& virtual_path, const std::string& disk_path);
+ void MapPath(absl::string_view virtual_path, absl::string_view disk_path);
// Return type for DiskFileToVirtualFile().
enum DiskFileToVirtualFileResult {
@@ -292,17 +298,17 @@
// * NO_MAPPING: Indicates that no mapping was found which contains this
// file.
DiskFileToVirtualFileResult DiskFileToVirtualFile(
- const std::string& disk_file, std::string* virtual_file,
+ absl::string_view disk_file, std::string* virtual_file,
std::string* shadowing_disk_file);
// Given a virtual path, find the path to the file on disk.
// Return true and update disk_file with the on-disk path if the file exists.
// Return false and leave disk_file untouched if the file doesn't exist.
- bool VirtualFileToDiskFile(const std::string& virtual_file,
+ bool VirtualFileToDiskFile(absl::string_view virtual_file,
std::string* disk_file);
// implements SourceTree -------------------------------------------
- io::ZeroCopyInputStream* Open(const std::string& filename) override;
+ io::ZeroCopyInputStream* Open(absl::string_view filename) override;
std::string GetLastErrorMessage() override;
@@ -311,28 +317,26 @@
std::string virtual_path;
std::string disk_path;
- inline Mapping(const std::string& virtual_path_param,
- const std::string& disk_path_param)
- : virtual_path(virtual_path_param), disk_path(disk_path_param) {}
+ inline Mapping(std::string virtual_path_param, std::string disk_path_param)
+ : virtual_path(std::move(virtual_path_param)),
+ disk_path(std::move(disk_path_param)) {}
};
std::vector<Mapping> mappings_;
std::string last_error_message_;
// Like Open(), but returns the on-disk path in disk_file if disk_file is
// non-NULL and the file could be successfully opened.
- io::ZeroCopyInputStream* OpenVirtualFile(const std::string& virtual_file,
+ io::ZeroCopyInputStream* OpenVirtualFile(absl::string_view virtual_file,
std::string* disk_file);
// Like Open() but given the actual on-disk path.
- io::ZeroCopyInputStream* OpenDiskFile(const std::string& filename);
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DiskSourceTree);
+ io::ZeroCopyInputStream* OpenDiskFile(absl::string_view filename);
};
} // namespace compiler
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_COMPILER_IMPORTER_H__
diff --git a/src/google/protobuf/compiler/importer_unittest.cc b/src/google/protobuf/compiler/importer_unittest.cc
index d2810ad..21044c7 100644
--- a/src/google/protobuf/compiler/importer_unittest.cc
+++ b/src/google/protobuf/compiler/importer_unittest.cc
@@ -32,23 +32,23 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/compiler/importer.h>
+#include "google/protobuf/compiler/importer.h"
#include <memory>
-#include <unordered_map>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/testing/file.h>
-#include <google/protobuf/testing/file.h>
-#include <google/protobuf/testing/file.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/testing/googletest.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/testing/file.h"
+#include "google/protobuf/testing/file.h"
+#include "google/protobuf/testing/file.h"
+#include "google/protobuf/io/zero_copy_stream_impl.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/testing/googletest.h"
#include <gtest/gtest.h>
-#include <google/protobuf/stubs/substitute.h>
-#include <google/protobuf/stubs/map_util.h>
-#include <google/protobuf/stubs/strutil.h>
+#include "absl/container/flat_hash_map.h"
+#include "absl/strings/substitute.h"
+
+#include "google/protobuf/stubs/strutil.h"
namespace google {
namespace protobuf {
@@ -74,13 +74,13 @@
// implements ErrorCollector ---------------------------------------
void AddError(const std::string& filename, int line, int column,
const std::string& message) override {
- strings::SubstituteAndAppend(&text_, "$0:$1:$2: $3\n", filename, line, column,
+ absl::SubstituteAndAppend(&text_, "$0:$1:$2: $3\n", filename, line, column,
message);
}
void AddWarning(const std::string& filename, int line, int column,
const std::string& message) override {
- strings::SubstituteAndAppend(&warning_text_, "$0:$1:$2: $3\n", filename, line,
+ absl::SubstituteAndAppend(&warning_text_, "$0:$1:$2: $3\n", filename, line,
column, message);
}
};
@@ -93,24 +93,22 @@
MockSourceTree() {}
~MockSourceTree() override {}
- void AddFile(const std::string& name, const char* contents) {
+ void AddFile(absl::string_view name, const char* contents) {
files_[name] = contents;
}
// implements SourceTree -------------------------------------------
- io::ZeroCopyInputStream* Open(const std::string& filename) override {
- const char* contents = FindPtrOrNull(files_, filename);
- if (contents == nullptr) {
- return nullptr;
- } else {
- return new io::ArrayInputStream(contents, strlen(contents));
- }
+ io::ZeroCopyInputStream* Open(absl::string_view filename) override {
+ auto it = files_.find(filename);
+ if (it == files_.end()) return nullptr;
+ return new io::ArrayInputStream(it->second,
+ static_cast<int>(strlen(it->second)));
}
std::string GetLastErrorMessage() override { return "File not found."; }
private:
- std::unordered_map<std::string, const char*> files_;
+ absl::flat_hash_map<std::string, const char*> files_;
};
// ===================================================================
diff --git a/src/google/protobuf/compiler/java/BUILD.bazel b/src/google/protobuf/compiler/java/BUILD.bazel
new file mode 100644
index 0000000..3ccc73d
--- /dev/null
+++ b/src/google/protobuf/compiler/java/BUILD.bazel
@@ -0,0 +1,171 @@
+################################################################################
+# Protocol Buffers Compiler - Java code generator
+################################################################################
+
+load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test")
+load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
+load("//build_defs:cpp_opts.bzl", "COPTS")
+
+cc_library(
+ name = "names",
+ hdrs = ["names.h"],
+ copts = COPTS,
+ include_prefix = "google/protobuf/compiler/java",
+ visibility = ["//visibility:public"],
+ deps = [
+ ":names_internal",
+ "//src/google/protobuf:protobuf_nowkt",
+ ],
+)
+
+cc_library(
+ name = "names_internal",
+ hdrs = [
+ "helpers.h",
+ "name_resolver.h",
+ "names.h",
+ "options.h",
+ ],
+ srcs = [
+ "helpers.cc",
+ "name_resolver.cc",
+ "names.cc",
+ ],
+ copts = COPTS,
+ include_prefix = "google/protobuf/compiler/java",
+ visibility = ["//pkg:__pkg__"],
+ deps = [
+ "//src/google/protobuf/compiler:code_generator",
+ "//src/google/protobuf:protobuf_nowkt",
+ "@com_google_absl//absl/container:flat_hash_set",
+ ],
+)
+
+cc_library(
+ name = "java",
+ srcs = [
+ "context.cc",
+ "doc_comment.cc",
+ "enum.cc",
+ "enum_field.cc",
+ "enum_field_lite.cc",
+ "enum_lite.cc",
+ "extension.cc",
+ "extension_lite.cc",
+ "field.cc",
+ "file.cc",
+ "generator.cc",
+ "generator_factory.cc",
+ "kotlin_generator.cc",
+ "map_field.cc",
+ "map_field_lite.cc",
+ "message.cc",
+ "message_builder.cc",
+ "message_builder_lite.cc",
+ "message_field.cc",
+ "message_field_lite.cc",
+ "message_lite.cc",
+ "message_serialization.cc",
+ "primitive_field.cc",
+ "primitive_field_lite.cc",
+ "service.cc",
+ "shared_code_generator.cc",
+ "string_field.cc",
+ "string_field_lite.cc",
+ ],
+ hdrs = [
+ "context.h",
+ "doc_comment.h",
+ "enum.h",
+ "enum_field.h",
+ "enum_field_lite.h",
+ "enum_lite.h",
+ "extension.h",
+ "extension_lite.h",
+ "field.h",
+ "file.h",
+ "generator.h",
+ "generator_factory.h",
+ "kotlin_generator.h",
+ "map_field.h",
+ "map_field_lite.h",
+ "message.h",
+ "message_builder.h",
+ "message_builder_lite.h",
+ "message_field.h",
+ "message_field_lite.h",
+ "message_lite.h",
+ "message_serialization.h",
+ "primitive_field.h",
+ "primitive_field_lite.h",
+ "service.h",
+ "shared_code_generator.h",
+ "string_field.h",
+ "string_field_lite.h",
+ ],
+ copts = COPTS,
+ include_prefix = "google/protobuf/compiler/java",
+ visibility = [
+ "//pkg:__pkg__",
+ "//src/google/protobuf/compiler:__pkg__",
+ ],
+ deps = [
+ ":names_internal",
+ ":names",
+ "//src/google/protobuf:protobuf_nowkt",
+ "//src/google/protobuf/compiler:code_generator",
+ "@com_google_absl//absl/container:flat_hash_set",
+ "@com_google_absl//absl/strings",
+ ],
+)
+
+cc_test(
+ name = "doc_comment_unittest",
+ srcs = ["doc_comment_unittest.cc"],
+ data = [
+ "//:well_known_type_protos",
+ "//conformance:conformance_proto",
+ "//src/google/protobuf:descriptor_proto_srcs",
+ ],
+ deps = [
+ ":java",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_test(
+ name = "plugin_unittest",
+ srcs = ["plugin_unittest.cc"],
+ deps = [
+ ":java",
+ "//:protobuf",
+ "//src/google/protobuf/compiler:command_line_interface",
+ "//src/google/protobuf/io",
+ "//src/google/protobuf/stubs:lite",
+ "//src/google/protobuf/testing",
+ "@com_google_absl//absl/strings",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+################################################################################
+# Distribution packaging
+################################################################################
+
+pkg_files(
+ name = "dist_files",
+ srcs = glob(["**/*"]),
+ strip_prefix = strip_prefix.from_root(""),
+ visibility = ["//src:__pkg__"],
+)
+
+filegroup(
+ name = "test_srcs",
+ srcs = glob([
+ "*_test.cc",
+ "*unittest.cc",
+ ]),
+ visibility = ["//src/google/protobuf/compiler:__pkg__"],
+)
diff --git a/src/google/protobuf/compiler/java/context.cc b/src/google/protobuf/compiler/java/context.cc
index cdc0d44..e750dcb 100644
--- a/src/google/protobuf/compiler/java/context.cc
+++ b/src/google/protobuf/compiler/java/context.cc
@@ -28,14 +28,14 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/compiler/java/context.h>
+#include "google/protobuf/compiler/java/context.h"
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/compiler/java/field.h>
-#include <google/protobuf/compiler/java/helpers.h>
-#include <google/protobuf/compiler/java/name_resolver.h>
-#include <google/protobuf/stubs/map_util.h>
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "absl/strings/str_cat.h"
+#include "google/protobuf/compiler/java/field.h"
+#include "google/protobuf/compiler/java/helpers.h"
+#include "google/protobuf/compiler/java/name_resolver.h"
namespace google {
namespace protobuf {
@@ -43,7 +43,7 @@
namespace java {
Context::Context(const FileDescriptor* file, const Options& options)
- : name_resolver_(new ClassNameResolver), options_(options) {
+ : name_resolver_(new ClassNameResolver(options)), options_(options) {
InitializeFieldGeneratorInfo(file);
}
@@ -131,10 +131,10 @@
std::vector<std::string> conflict_reason(fields.size());
for (int i = 0; i < fields.size(); ++i) {
const FieldDescriptor* field = fields[i];
- const std::string& name = UnderscoresToCapitalizedCamelCase(field);
+ const std::string& name = CapitalizedFieldName(field);
for (int j = i + 1; j < fields.size(); ++j) {
const FieldDescriptor* other = fields[j];
- const std::string& other_name = UnderscoresToCapitalizedCamelCase(other);
+ const std::string& other_name = CapitalizedFieldName(other);
if (name == other_name) {
is_conflict[i] = is_conflict[j] = true;
conflict_reason[i] = conflict_reason[j] =
@@ -155,12 +155,12 @@
const FieldDescriptor* field = fields[i];
FieldGeneratorInfo info;
info.name = CamelCaseFieldName(field);
- info.capitalized_name = UnderscoresToCapitalizedCamelCase(field);
+ info.capitalized_name = CapitalizedFieldName(field);
// For fields conflicting with some other fields, we append the field
// number to their field names in generated code to avoid conflicts.
if (is_conflict[i]) {
- info.name += StrCat(field->number());
- info.capitalized_name += StrCat(field->number());
+ info.name += absl::StrCat(field->number());
+ info.capitalized_name += absl::StrCat(field->number());
info.disambiguated_reason = conflict_reason[i];
}
field_generator_info_map_[field] = info;
@@ -169,24 +169,22 @@
const FieldGeneratorInfo* Context::GetFieldGeneratorInfo(
const FieldDescriptor* field) const {
- const FieldGeneratorInfo* result =
- FindOrNull(field_generator_info_map_, field);
- if (result == NULL) {
+ auto it = field_generator_info_map_.find(field);
+ if (it == field_generator_info_map_.end()) {
GOOGLE_LOG(FATAL) << "Can not find FieldGeneratorInfo for field: "
<< field->full_name();
}
- return result;
+ return &it->second;
}
const OneofGeneratorInfo* Context::GetOneofGeneratorInfo(
const OneofDescriptor* oneof) const {
- const OneofGeneratorInfo* result =
- FindOrNull(oneof_generator_info_map_, oneof);
- if (result == NULL) {
+ auto it = oneof_generator_info_map_.find(oneof);
+ if (it == oneof_generator_info_map_.end()) {
GOOGLE_LOG(FATAL) << "Can not find OneofGeneratorInfo for oneof: "
<< oneof->name();
}
- return result;
+ return &it->second;
}
// Does this message class have generated parsing, serialization, and other
diff --git a/src/google/protobuf/compiler/java/context.h b/src/google/protobuf/compiler/java/context.h
index c224ab7..2291cfa 100644
--- a/src/google/protobuf/compiler/java/context.h
+++ b/src/google/protobuf/compiler/java/context.h
@@ -31,12 +31,13 @@
#ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_CONTEXT_H__
#define GOOGLE_PROTOBUF_COMPILER_JAVA_CONTEXT_H__
-#include <map>
#include <memory>
#include <vector>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/compiler/java/options.h>
+#include "absl/container/flat_hash_map.h"
+#include "google/protobuf/compiler/java/helpers.h"
+#include "google/protobuf/compiler/java/options.h"
+#include "google/protobuf/port.h"
namespace google {
namespace protobuf {
@@ -65,6 +66,8 @@
class Context {
public:
Context(const FileDescriptor* file, const Options& options);
+ Context(const Context&) = delete;
+ Context& operator=(const Context&) = delete;
~Context();
// Get the name resolver associated with this context. The resolver
@@ -97,14 +100,27 @@
const std::vector<const FieldDescriptor*>& fields);
std::unique_ptr<ClassNameResolver> name_resolver_;
- std::map<const FieldDescriptor*, FieldGeneratorInfo>
+ absl::flat_hash_map<const FieldDescriptor*, FieldGeneratorInfo>
field_generator_info_map_;
- std::map<const OneofDescriptor*, OneofGeneratorInfo>
+ absl::flat_hash_map<const OneofDescriptor*, OneofGeneratorInfo>
oneof_generator_info_map_;
Options options_;
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Context);
};
+template <typename Descriptor>
+void MaybePrintGeneratedAnnotation(Context* context, io::Printer* printer,
+ Descriptor* descriptor, bool immutable,
+ const std::string& suffix = "") {
+ if (IsOwnFile(descriptor, immutable)) {
+ PrintGeneratedAnnotation(printer, '$',
+ context->options().annotate_code
+ ? AnnotationFileName(descriptor, suffix)
+ : "",
+ context->options());
+ }
+}
+
+
} // namespace java
} // namespace compiler
} // namespace protobuf
diff --git a/src/google/protobuf/compiler/java/doc_comment.cc b/src/google/protobuf/compiler/java/doc_comment.cc
index 066bff6..a515eb2 100644
--- a/src/google/protobuf/compiler/java/doc_comment.cc
+++ b/src/google/protobuf/compiler/java/doc_comment.cc
@@ -32,13 +32,16 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/compiler/java/doc_comment.h>
+#include "google/protobuf/compiler/java/doc_comment.h"
#include <vector>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/descriptor.pb.h>
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "absl/strings/str_split.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/io/printer.h"
namespace google {
namespace protobuf {
@@ -103,26 +106,65 @@
return result;
}
+static std::string EscapeKdoc(const std::string& input) {
+ std::string result;
+ result.reserve(input.size() * 2);
+
+ char prev = 'a';
+
+ for (char c : input) {
+ switch (c) {
+ case '*':
+ // Avoid "/*".
+ if (prev == '/') {
+ result.append("*");
+ } else {
+ result.push_back(c);
+ }
+ break;
+ case '/':
+ // Avoid "*/".
+ if (prev == '*') {
+ result.append("/");
+ } else {
+ result.push_back(c);
+ }
+ break;
+ default:
+ result.push_back(c);
+ break;
+ }
+
+ prev = c;
+ }
+
+ return result;
+}
+
static void WriteDocCommentBodyForLocation(io::Printer* printer,
- const SourceLocation& location) {
+ const SourceLocation& location,
+ const bool kdoc) {
std::string comments = location.leading_comments.empty()
? location.trailing_comments
: location.leading_comments;
if (!comments.empty()) {
- // TODO(kenton): Ideally we should parse the comment text as Markdown and
- // write it back as HTML, but this requires a Markdown parser. For now
- // we just use <pre> to get fixed-width text formatting.
+ if (kdoc) {
+ comments = EscapeKdoc(comments);
+ } else {
+ comments = EscapeJavadoc(comments);
+ }
- // If the comment itself contains block comment start or end markers,
- // HTML-escape them so that they don't accidentally close the doc comment.
- comments = EscapeJavadoc(comments);
-
- std::vector<std::string> lines = Split(comments, "\n");
+ std::vector<std::string> lines = absl::StrSplit(comments, "\n");
while (!lines.empty() && lines.back().empty()) {
lines.pop_back();
}
- printer->Print(" * <pre>\n");
+ if (kdoc) {
+ printer->Print(" * ```\n");
+ } else {
+ printer->Print(" * <pre>\n");
+ }
+
for (int i = 0; i < lines.size(); i++) {
// Most lines should start with a space. Watch out for lines that start
// with a /, since putting that right after the leading asterisk will
@@ -133,18 +175,23 @@
printer->Print(" *$line$\n", "line", lines[i]);
}
}
- printer->Print(
- " * </pre>\n"
- " *\n");
+
+ if (kdoc) {
+ printer->Print(" * ```\n");
+ } else {
+ printer->Print(" * </pre>\n");
+ }
+ printer->Print(" *\n");
}
}
template <typename DescriptorType>
static void WriteDocCommentBody(io::Printer* printer,
- const DescriptorType* descriptor) {
+ const DescriptorType* descriptor,
+ const bool kdoc) {
SourceLocation location;
if (descriptor->GetSourceLocation(&location)) {
- WriteDocCommentBodyForLocation(printer, location);
+ WriteDocCommentBodyForLocation(printer, location, kdoc);
}
}
@@ -164,16 +211,36 @@
return result;
}
-void WriteMessageDocComment(io::Printer* printer, const Descriptor* message) {
- printer->Print("/**\n");
- WriteDocCommentBody(printer, message);
- printer->Print(
- " * Protobuf type {@code $fullname$}\n"
- " */\n",
- "fullname", EscapeJavadoc(message->full_name()));
+static void WriteDebugString(io::Printer* printer, const FieldDescriptor* field,
+ const bool kdoc) {
+ if (kdoc) {
+ printer->Print(" * `$def$`\n", "def",
+ EscapeKdoc(FirstLineOf(field->DebugString())));
+ } else {
+ printer->Print(" * <code>$def$</code>\n", "def",
+ EscapeJavadoc(FirstLineOf(field->DebugString())));
+ }
}
-void WriteFieldDocComment(io::Printer* printer, const FieldDescriptor* field) {
+void WriteMessageDocComment(io::Printer* printer, const Descriptor* message,
+ const bool kdoc) {
+ printer->Print("/**\n");
+ WriteDocCommentBody(printer, message, kdoc);
+ if (kdoc) {
+ printer->Print(
+ " * Protobuf type `$fullname$`\n"
+ " */\n",
+ "fullname", EscapeKdoc(message->full_name()));
+ } else {
+ printer->Print(
+ " * Protobuf type {@code $fullname$}\n"
+ " */\n",
+ "fullname", EscapeJavadoc(message->full_name()));
+ }
+}
+
+void WriteFieldDocComment(io::Printer* printer, const FieldDescriptor* field,
+ const bool kdoc) {
// We start the comment with the main body based on the comments from the
// .proto file (if present). We then continue with the field declaration,
// e.g.:
@@ -181,9 +248,14 @@
// And then we end with the javadoc tags if applicable.
// If the field is a group, the debug string might end with {.
printer->Print("/**\n");
- WriteDocCommentBody(printer, field);
- printer->Print(" * <code>$def$</code>\n", "def",
- EscapeJavadoc(FirstLineOf(field->DebugString())));
+ WriteDocCommentBody(printer, field, kdoc);
+ if (kdoc) {
+ printer->Print(" * `$def$`\n", "def",
+ EscapeKdoc(FirstLineOf(field->DebugString())));
+ } else {
+ printer->Print(" * <code>$def$</code>\n", "def",
+ EscapeJavadoc(FirstLineOf(field->DebugString())));
+ }
printer->Print(" */\n");
}
@@ -214,12 +286,11 @@
void WriteFieldAccessorDocComment(io::Printer* printer,
const FieldDescriptor* field,
const FieldAccessorType type,
- const bool builder) {
+ const bool builder, const bool kdoc) {
printer->Print("/**\n");
- WriteDocCommentBody(printer, field);
- printer->Print(" * <code>$def$</code>\n", "def",
- EscapeJavadoc(FirstLineOf(field->DebugString())));
- WriteDeprecatedJavadoc(printer, field, type);
+ WriteDocCommentBody(printer, field, kdoc);
+ WriteDebugString(printer, field, kdoc);
+ if (!kdoc) WriteDeprecatedJavadoc(printer, field, type);
switch (type) {
case HAZZER:
printer->Print(" * @return Whether the $name$ field is set.\n", "name",
@@ -273,12 +344,12 @@
void WriteFieldEnumValueAccessorDocComment(io::Printer* printer,
const FieldDescriptor* field,
const FieldAccessorType type,
- const bool builder) {
+ const bool builder,
+ const bool kdoc) {
printer->Print("/**\n");
- WriteDocCommentBody(printer, field);
- printer->Print(" * <code>$def$</code>\n", "def",
- EscapeJavadoc(FirstLineOf(field->DebugString())));
- WriteDeprecatedJavadoc(printer, field, type);
+ WriteDocCommentBody(printer, field, kdoc);
+ WriteDebugString(printer, field, kdoc);
+ if (!kdoc) WriteDeprecatedJavadoc(printer, field, type);
switch (type) {
case HAZZER:
// Should never happen
@@ -343,12 +414,12 @@
void WriteFieldStringBytesAccessorDocComment(io::Printer* printer,
const FieldDescriptor* field,
const FieldAccessorType type,
- const bool builder) {
+ const bool builder,
+ const bool kdoc) {
printer->Print("/**\n");
- WriteDocCommentBody(printer, field);
- printer->Print(" * <code>$def$</code>\n", "def",
- EscapeJavadoc(FirstLineOf(field->DebugString())));
- WriteDeprecatedJavadoc(printer, field, type);
+ WriteDocCommentBody(printer, field, kdoc);
+ WriteDebugString(printer, field, kdoc);
+ if (!kdoc) WriteDeprecatedJavadoc(printer, field, type);
switch (type) {
case HAZZER:
// Should never happen
@@ -399,19 +470,28 @@
// Enum
-void WriteEnumDocComment(io::Printer* printer, const EnumDescriptor* enum_) {
+void WriteEnumDocComment(io::Printer* printer, const EnumDescriptor* enum_,
+ const bool kdoc) {
printer->Print("/**\n");
- WriteDocCommentBody(printer, enum_);
- printer->Print(
- " * Protobuf enum {@code $fullname$}\n"
- " */\n",
- "fullname", EscapeJavadoc(enum_->full_name()));
+ WriteDocCommentBody(printer, enum_, kdoc);
+ if (kdoc) {
+ printer->Print(
+ " * Protobuf enum `$fullname$`\n"
+ " */\n",
+ "fullname", EscapeKdoc(enum_->full_name()));
+ } else {
+ printer->Print(
+ " * Protobuf enum {@code $fullname$}\n"
+ " */\n",
+ "fullname", EscapeJavadoc(enum_->full_name()));
+ }
}
void WriteEnumValueDocComment(io::Printer* printer,
const EnumValueDescriptor* value) {
printer->Print("/**\n");
- WriteDocCommentBody(printer, value);
+ WriteDocCommentBody(printer, value, /* kdoc */ false);
+
printer->Print(
" * <code>$def$</code>\n"
" */\n",
@@ -421,7 +501,7 @@
void WriteServiceDocComment(io::Printer* printer,
const ServiceDescriptor* service) {
printer->Print("/**\n");
- WriteDocCommentBody(printer, service);
+ WriteDocCommentBody(printer, service, /* kdoc */ false);
printer->Print(
" * Protobuf service {@code $fullname$}\n"
" */\n",
@@ -431,7 +511,7 @@
void WriteMethodDocComment(io::Printer* printer,
const MethodDescriptor* method) {
printer->Print("/**\n");
- WriteDocCommentBody(printer, method);
+ WriteDocCommentBody(printer, method, /* kdoc */ false);
printer->Print(
" * <code>$def$</code>\n"
" */\n",
diff --git a/src/google/protobuf/compiler/java/doc_comment.h b/src/google/protobuf/compiler/java/doc_comment.h
index 7f68778..de8e6bf 100644
--- a/src/google/protobuf/compiler/java/doc_comment.h
+++ b/src/google/protobuf/compiler/java/doc_comment.h
@@ -35,10 +35,10 @@
#ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_DOC_COMMENT_H__
#define GOOGLE_PROTOBUF_COMPILER_JAVA_DOC_COMMENT_H__
-#include <google/protobuf/descriptor.h>
+#include "google/protobuf/descriptor.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -67,21 +67,27 @@
LIST_MULTI_ADDER
};
-void WriteMessageDocComment(io::Printer* printer, const Descriptor* message);
-void WriteFieldDocComment(io::Printer* printer, const FieldDescriptor* field);
+void WriteMessageDocComment(io::Printer* printer, const Descriptor* message,
+ const bool kdoc = false);
+void WriteFieldDocComment(io::Printer* printer, const FieldDescriptor* field,
+ const bool kdoc = false);
void WriteFieldAccessorDocComment(io::Printer* printer,
const FieldDescriptor* field,
const FieldAccessorType type,
- const bool builder = false);
+ const bool builder = false,
+ const bool kdoc = false);
void WriteFieldEnumValueAccessorDocComment(io::Printer* printer,
const FieldDescriptor* field,
const FieldAccessorType type,
- const bool builder = false);
+ const bool builder = false,
+ const bool kdoc = false);
void WriteFieldStringBytesAccessorDocComment(io::Printer* printer,
const FieldDescriptor* field,
const FieldAccessorType type,
- const bool builder = false);
-void WriteEnumDocComment(io::Printer* printer, const EnumDescriptor* enum_);
+ const bool builder = false,
+ const bool kdoc = false);
+void WriteEnumDocComment(io::Printer* printer, const EnumDescriptor* enum_,
+ const bool kdoc = false);
void WriteEnumValueDocComment(io::Printer* printer,
const EnumValueDescriptor* value);
void WriteServiceDocComment(io::Printer* printer,
@@ -90,6 +96,7 @@
const MethodDescriptor* method);
// Exposed for testing only.
+// Also called by proto1-Java code generator.
PROTOC_EXPORT std::string EscapeJavadoc(const std::string& input);
} // namespace java
@@ -97,6 +104,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_COMPILER_JAVA_DOC_COMMENT_H__
diff --git a/src/google/protobuf/compiler/java/doc_comment_unittest.cc b/src/google/protobuf/compiler/java/doc_comment_unittest.cc
index 3fcdf07..687b25f 100644
--- a/src/google/protobuf/compiler/java/doc_comment_unittest.cc
+++ b/src/google/protobuf/compiler/java/doc_comment_unittest.cc
@@ -30,7 +30,7 @@
// Author: kenton@google.com (Kenton Varda)
-#include <google/protobuf/compiler/java/doc_comment.h>
+#include "google/protobuf/compiler/java/doc_comment.h"
#include <gtest/gtest.h>
diff --git a/src/google/protobuf/compiler/java/enum.cc b/src/google/protobuf/compiler/java/enum.cc
index 0cab93c..f3e1b42 100644
--- a/src/google/protobuf/compiler/java/enum.cc
+++ b/src/google/protobuf/compiler/java/enum.cc
@@ -32,21 +32,22 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/compiler/java/enum.h>
+#include "google/protobuf/compiler/java/enum.h"
#include <map>
#include <string>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/compiler/java/context.h>
-#include <google/protobuf/compiler/java/doc_comment.h>
-#include <google/protobuf/compiler/java/helpers.h>
-#include <google/protobuf/compiler/java/name_resolver.h>
-#include <google/protobuf/descriptor.pb.h>
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "absl/strings/str_cat.h"
+#include "google/protobuf/compiler/java/context.h"
+#include "google/protobuf/compiler/java/doc_comment.h"
+#include "google/protobuf/compiler/java/helpers.h"
+#include "google/protobuf/compiler/java/name_resolver.h"
+#include "google/protobuf/descriptor.pb.h"
// Must be last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -80,6 +81,10 @@
void EnumGenerator::Generate(io::Printer* printer) {
WriteEnumDocComment(printer, descriptor_);
MaybePrintGeneratedAnnotation(context_, printer, descriptor_, immutable_api_);
+
+ if (!context_->options().opensource_runtime) {
+ printer->Print("@com.google.protobuf.Internal.ProtoNonnullApi\n");
+ }
printer->Print(
"$deprecation$public enum $classname$\n"
" implements com.google.protobuf.ProtocolMessageEnum {\n",
@@ -101,8 +106,8 @@
for (int i = 0; i < canonical_values_.size(); i++) {
std::map<std::string, std::string> vars;
vars["name"] = canonical_values_[i]->name();
- vars["index"] = StrCat(canonical_values_[i]->index());
- vars["number"] = StrCat(canonical_values_[i]->number());
+ vars["index"] = absl::StrCat(canonical_values_[i]->index());
+ vars["number"] = absl::StrCat(canonical_values_[i]->number());
WriteEnumValueDocComment(printer, canonical_values_[i]);
if (canonical_values_[i]->options().deprecated()) {
printer->Print("@java.lang.Deprecated\n");
@@ -144,7 +149,7 @@
for (int i = 0; i < descriptor_->value_count(); i++) {
std::map<std::string, std::string> vars;
vars["name"] = descriptor_->value(i)->name();
- vars["number"] = StrCat(descriptor_->value(i)->number());
+ vars["number"] = absl::StrCat(descriptor_->value(i)->number());
vars["{"] = "";
vars["}"] = "";
vars["deprecation"] = descriptor_->value(i)->options().deprecated()
@@ -181,23 +186,32 @@
printer->Print(
" return value;\n"
"}\n"
- "\n"
+ "\n");
+ if (context_->options().opensource_runtime) {
+ printer->Print(
+ "/**\n"
+ " * @param value The numeric wire value of the corresponding enum "
+ "entry.\n"
+ " * @return The enum associated with the given numeric wire value.\n"
+ " * @deprecated Use {@link #forNumber(int)} instead.\n"
+ " */\n"
+ "@java.lang.Deprecated\n"
+ "public static $classname$ valueOf(int value) {\n"
+ " return forNumber(value);\n"
+ "}\n"
+ "\n",
+ "classname", descriptor_->name());
+ }
+ printer->Print(
"/**\n"
" * @param value The numeric wire value of the corresponding enum "
"entry.\n"
" * @return The enum associated with the given numeric wire value.\n"
- " * @deprecated Use {@link #forNumber(int)} instead.\n"
- " */\n"
- "@java.lang.Deprecated\n"
- "public static $classname$ valueOf(int value) {\n"
- " return forNumber(value);\n"
- "}\n"
- "\n"
- "/**\n"
- " * @param value The numeric wire value of the corresponding enum "
- "entry.\n"
- " * @return The enum associated with the given numeric wire value.\n"
- " */\n"
+ " */\n");
+ if (!context_->options().opensource_runtime) {
+ printer->Print("@com.google.protobuf.Internal.ProtoMethodMayReturnNull\n");
+ }
+ printer->Print(
"public static $classname$ forNumber(int value) {\n"
" switch (value) {\n",
"classname", descriptor_->name());
@@ -207,7 +221,7 @@
for (int i = 0; i < canonical_values_.size(); i++) {
printer->Print("case $number$: return $name$;\n", "name",
canonical_values_[i]->name(), "number",
- StrCat(canonical_values_[i]->number()));
+ absl::StrCat(canonical_values_[i]->number()));
}
printer->Outdent();
@@ -277,7 +291,7 @@
" return $file$.getDescriptor().getEnumTypes().get($index$);\n",
"file",
name_resolver_->GetClassName(descriptor_->file(), immutable_api_),
- "index", StrCat(descriptor_->index()));
+ "index", absl::StrCat(descriptor_->index()));
} else {
printer->Print(
" return $parent$.$descriptor$.getEnumTypes().get($index$);\n",
@@ -290,7 +304,7 @@
.no_standard_descriptor_accessor()
? "getDefaultInstance().getDescriptorForType()"
: "getDescriptor()",
- "index", StrCat(descriptor_->index()));
+ "index", absl::StrCat(descriptor_->index()));
}
printer->Print(
@@ -394,4 +408,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/compiler/java/enum.h b/src/google/protobuf/compiler/java/enum.h
index 0a2c363..8868e47 100644
--- a/src/google/protobuf/compiler/java/enum.h
+++ b/src/google/protobuf/compiler/java/enum.h
@@ -37,7 +37,7 @@
#include <string>
#include <vector>
-#include <google/protobuf/descriptor.h>
+#include "google/protobuf/descriptor.h"
namespace google {
namespace protobuf {
@@ -62,6 +62,8 @@
public:
EnumGenerator(const EnumDescriptor* descriptor, bool immutable_api,
Context* context);
+ EnumGenerator(const EnumGenerator&) = delete;
+ EnumGenerator& operator=(const EnumGenerator&) = delete;
~EnumGenerator();
void Generate(io::Printer* printer);
@@ -88,8 +90,6 @@
ClassNameResolver* name_resolver_;
bool CanUseEnumValues();
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumGenerator);
};
} // namespace java
diff --git a/src/google/protobuf/compiler/java/enum_field.cc b/src/google/protobuf/compiler/java/enum_field.cc
index 8e8a28d..2f0828f 100644
--- a/src/google/protobuf/compiler/java/enum_field.cc
+++ b/src/google/protobuf/compiler/java/enum_field.cc
@@ -32,24 +32,24 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/compiler/java/enum_field.h>
+#include "google/protobuf/compiler/java/enum_field.h"
#include <cstdint>
#include <map>
#include <string>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/wire_format.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/compiler/java/context.h>
-#include <google/protobuf/compiler/java/doc_comment.h>
-#include <google/protobuf/compiler/java/helpers.h>
-#include <google/protobuf/compiler/java/name_resolver.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/wire_format.h"
+#include "absl/strings/str_cat.h"
+#include "google/protobuf/compiler/java/context.h"
+#include "google/protobuf/compiler/java/doc_comment.h"
+#include "google/protobuf/compiler/java/helpers.h"
+#include "google/protobuf/compiler/java/name_resolver.h"
// Must be last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -61,20 +61,22 @@
void SetEnumVariables(const FieldDescriptor* descriptor, int messageBitIndex,
int builderBitIndex, const FieldGeneratorInfo* info,
ClassNameResolver* name_resolver,
- std::map<std::string, std::string>* variables) {
+ std::map<std::string, std::string>* variables,
+ Context* context) {
SetCommonFieldVariables(descriptor, info, variables);
(*variables)["type"] =
name_resolver->GetImmutableClassName(descriptor->enum_type());
- (*variables)["kt_type"] = (*variables)["type"];
+ (*variables)["kt_type"] = EscapeKotlinKeywords((*variables)["type"]);
(*variables)["mutable_type"] =
name_resolver->GetMutableClassName(descriptor->enum_type());
- (*variables)["default"] = ImmutableDefaultValue(descriptor, name_resolver);
+ (*variables)["default"] =
+ ImmutableDefaultValue(descriptor, name_resolver, context->options());
(*variables)["default_number"] =
- StrCat(descriptor->default_value_enum()->number());
- (*variables)["tag"] = StrCat(
+ absl::StrCat(descriptor->default_value_enum()->number());
+ (*variables)["tag"] = absl::StrCat(
static_cast<int32_t>(internal::WireFormat::MakeTag(descriptor)));
- (*variables)["tag_size"] = StrCat(
+ (*variables)["tag_size"] = absl::StrCat(
internal::WireFormat::TagSize(descriptor->number(), GetType(descriptor)));
// TODO(birdo): Add @deprecated javadoc when generating javadoc is supported
// by the proto compiler
@@ -85,13 +87,6 @@
? "@kotlin.Deprecated(message = \"Field " + (*variables)["name"] +
" is deprecated\") "
: "";
- (*variables)["on_changed"] = "onChanged();";
- // Use deprecated valueOf() method to be compatible with old generated code
- // for v2.5.0/v2.6.1.
- // TODO(xiaofeng): Use "forNumber" when we no longer support compatibility
- // with v2.5.0/v2.6.1, and remove the @SuppressWarnings annotations.
- (*variables)["for_number"] = "valueOf";
-
if (HasHasbit(descriptor)) {
// For singular messages and builders, one bit is used for the hasField bit.
(*variables)["get_has_field_bit_message"] = GenerateGetBit(messageBitIndex);
@@ -143,7 +138,7 @@
: descriptor_(descriptor), name_resolver_(context->GetNameResolver()) {
SetEnumVariables(descriptor, messageBitIndex, builderBitIndex,
context->GetFieldGeneratorInfo(descriptor), name_resolver_,
- &variables_);
+ &variables_, context);
}
ImmutableEnumFieldGenerator::~ImmutableEnumFieldGenerator() {}
@@ -197,8 +192,7 @@
printer->Print(variables_,
"@java.lang.Override $deprecation$public $type$ "
"${$get$capitalized_name$$}$() {\n"
- " @SuppressWarnings(\"deprecation\")\n"
- " $type$ result = $type$.$for_number$($name$_);\n"
+ " $type$ result = $type$.forNumber($name$_);\n"
" return result == null ? $unknown$ : result;\n"
"}\n");
printer->Annotate("{", "}", descriptor_);
@@ -231,7 +225,7 @@
"${$set$capitalized_name$Value$}$(int value) {\n"
" $set_has_field_bit_builder$\n"
" $name$_ = value;\n"
- " $on_changed$\n"
+ " onChanged();\n"
" return this;\n"
"}\n");
printer->Annotate("{", "}", descriptor_);
@@ -240,8 +234,7 @@
printer->Print(variables_,
"@java.lang.Override\n"
"$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
- " @SuppressWarnings(\"deprecation\")\n"
- " $type$ result = $type$.$for_number$($name$_);\n"
+ " $type$ result = $type$.forNumber($name$_);\n"
" return result == null ? $unknown$ : result;\n"
"}\n");
printer->Annotate("{", "}", descriptor_);
@@ -255,7 +248,7 @@
" }\n"
" $set_has_field_bit_builder$\n"
" $name$_ = value.getNumber();\n"
- " $on_changed$\n"
+ " onChanged();\n"
" return this;\n"
"}\n");
printer->Annotate("{", "}", descriptor_);
@@ -266,7 +259,7 @@
"$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
" $clear_has_field_bit_builder$\n"
" $name$_ = $default_number$;\n"
- " $on_changed$\n"
+ " onChanged();\n"
" return this;\n"
"}\n");
printer->Annotate("{", "}", descriptor_);
@@ -274,9 +267,9 @@
void ImmutableEnumFieldGenerator::GenerateKotlinDslMembers(
io::Printer* printer) const {
- WriteFieldDocComment(printer, descriptor_);
+ WriteFieldDocComment(printer, descriptor_, /* kdoc */ true);
printer->Print(variables_,
- "$kt_deprecation$ var $kt_name$: $kt_type$\n"
+ "$kt_deprecation$public var $kt_name$: $kt_type$\n"
" @JvmName(\"${$get$kt_capitalized_name$$}$\")\n"
" get() = $kt_dsl_builder$.${$get$capitalized_name$$}$()\n"
" @JvmName(\"${$set$kt_capitalized_name$$}$\")\n"
@@ -284,18 +277,31 @@
" $kt_dsl_builder$.${$set$capitalized_name$$}$(value)\n"
" }\n");
+ if (SupportUnknownEnumValue(descriptor_->file())) {
+ printer->Print(
+ variables_,
+ "$kt_deprecation$public var $kt_name$Value: kotlin.Int\n"
+ " @JvmName(\"${$get$kt_capitalized_name$Value$}$\")\n"
+ " get() = $kt_dsl_builder$.${$get$capitalized_name$Value$}$()\n"
+ " @JvmName(\"${$set$kt_capitalized_name$Value$}$\")\n"
+ " set(value) {\n"
+ " $kt_dsl_builder$.${$set$capitalized_name$Value$}$(value)\n"
+ " }\n");
+ }
+
WriteFieldAccessorDocComment(printer, descriptor_, CLEARER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(variables_,
- "fun ${$clear$kt_capitalized_name$$}$() {\n"
+ "public fun ${$clear$kt_capitalized_name$$}$() {\n"
" $kt_dsl_builder$.${$clear$capitalized_name$$}$()\n"
"}\n");
if (HasHazzer(descriptor_)) {
- WriteFieldAccessorDocComment(printer, descriptor_, HAZZER);
+ WriteFieldAccessorDocComment(printer, descriptor_, HAZZER,
+ /* builder */ false, /* kdoc */ true);
printer->Print(
variables_,
- "fun ${$has$kt_capitalized_name$$}$(): kotlin.Boolean {\n"
+ "public fun ${$has$kt_capitalized_name$$}$(): kotlin.Boolean {\n"
" return $kt_dsl_builder$.${$has$capitalized_name$$}$()\n"
"}\n");
}
@@ -440,8 +446,7 @@
printer->Print(variables_,
"$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
" if ($has_oneof_case_message$) {\n"
- " @SuppressWarnings(\"deprecation\")\n"
- " $type$ result = $type$.$for_number$(\n"
+ " $type$ result = $type$.forNumber(\n"
" (java.lang.Integer) $oneof_name$_);\n"
" return result == null ? $unknown$ : result;\n"
" }\n"
@@ -480,7 +485,7 @@
"${$set$capitalized_name$Value$}$(int value) {\n"
" $set_oneof_case_message$;\n"
" $oneof_name$_ = value;\n"
- " $on_changed$\n"
+ " onChanged();\n"
" return this;\n"
"}\n");
printer->Annotate("{", "}", descriptor_);
@@ -490,8 +495,7 @@
"@java.lang.Override\n"
"$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
" if ($has_oneof_case_message$) {\n"
- " @SuppressWarnings(\"deprecation\")\n"
- " $type$ result = $type$.$for_number$(\n"
+ " $type$ result = $type$.forNumber(\n"
" (java.lang.Integer) $oneof_name$_);\n"
" return result == null ? $unknown$ : result;\n"
" }\n"
@@ -508,7 +512,7 @@
" }\n"
" $set_oneof_case_message$;\n"
" $oneof_name$_ = value.getNumber();\n"
- " $on_changed$\n"
+ " onChanged();\n"
" return this;\n"
"}\n");
printer->Annotate("{", "}", descriptor_);
@@ -520,7 +524,7 @@
" if ($has_oneof_case_message$) {\n"
" $clear_oneof_case_message$;\n"
" $oneof_name$_ = null;\n"
- " $on_changed$\n"
+ " onChanged();\n"
" }\n"
" return this;\n"
"}\n");
@@ -629,7 +633,7 @@
: descriptor_(descriptor), name_resolver_(context->GetNameResolver()) {
SetEnumVariables(descriptor, messageBitIndex, builderBitIndex,
context->GetFieldGeneratorInfo(descriptor), name_resolver_,
- &variables_);
+ &variables_, context);
}
RepeatedImmutableEnumFieldGenerator::~RepeatedImmutableEnumFieldGenerator() {}
@@ -677,8 +681,7 @@
" new com.google.protobuf.Internal.ListAdapter.Converter<\n"
" java.lang.Integer, $type$>() {\n"
" public $type$ convert(java.lang.Integer from) {\n"
- " @SuppressWarnings(\"deprecation\")\n"
- " $type$ result = $type$.$for_number$(from);\n"
+ " $type$ result = $type$.forNumber(from);\n"
" return result == null ? $unknown$ : result;\n"
" }\n"
" };\n");
@@ -794,7 +797,7 @@
" }\n"
" ensure$capitalized_name$IsMutable();\n"
" $name$_.set(index, value.getNumber());\n"
- " $on_changed$\n"
+ " onChanged();\n"
" return this;\n"
"}\n");
printer->Annotate("{", "}", descriptor_);
@@ -808,7 +811,7 @@
" }\n"
" ensure$capitalized_name$IsMutable();\n"
" $name$_.add(value.getNumber());\n"
- " $on_changed$\n"
+ " onChanged();\n"
" return this;\n"
"}\n");
printer->Annotate("{", "}", descriptor_);
@@ -821,7 +824,7 @@
" for ($type$ value : values) {\n"
" $name$_.add(value.getNumber());\n"
" }\n"
- " $on_changed$\n"
+ " onChanged();\n"
" return this;\n"
"}\n");
printer->Annotate("{", "}", descriptor_);
@@ -832,7 +835,7 @@
"$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
" $name$_ = java.util.Collections.emptyList();\n"
" $clear_mutable_bit_builder$;\n"
- " $on_changed$\n"
+ " onChanged();\n"
" return this;\n"
"}\n");
printer->Annotate("{", "}", descriptor_);
@@ -862,7 +865,7 @@
" int index, int value) {\n"
" ensure$capitalized_name$IsMutable();\n"
" $name$_.set(index, value);\n"
- " $on_changed$\n"
+ " onChanged();\n"
" return this;\n"
"}\n");
printer->Annotate("{", "}", descriptor_);
@@ -873,7 +876,7 @@
"${$add$capitalized_name$Value$}$(int value) {\n"
" ensure$capitalized_name$IsMutable();\n"
" $name$_.add(value);\n"
- " $on_changed$\n"
+ " onChanged();\n"
" return this;\n"
"}\n");
printer->Annotate("{", "}", descriptor_);
@@ -887,7 +890,7 @@
" for (int value : values) {\n"
" $name$_.add(value);\n"
" }\n"
- " $on_changed$\n"
+ " onChanged();\n"
" return this;\n"
"}\n");
printer->Annotate("{", "}", descriptor_);
@@ -927,7 +930,7 @@
" ensure$capitalized_name$IsMutable();\n"
" $name$_.addAll(other.$name$_);\n"
" }\n"
- " $on_changed$\n"
+ " onChanged();\n"
"}\n");
}
@@ -1061,12 +1064,12 @@
" */\n"
"@kotlin.OptIn"
"(com.google.protobuf.kotlin.OnlyForUseByGeneratedProtoCode::class)\n"
- "class ${$$kt_capitalized_name$Proxy$}$ private constructor()"
+ "public class ${$$kt_capitalized_name$Proxy$}$ private constructor()"
" : com.google.protobuf.kotlin.DslProxy()\n");
- WriteFieldDocComment(printer, descriptor_);
+ WriteFieldDocComment(printer, descriptor_, /* kdoc */ true);
printer->Print(variables_,
- "$kt_deprecation$ val $kt_name$: "
+ "$kt_deprecation$public val $kt_name$: "
"com.google.protobuf.kotlin.DslList"
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>\n"
" @kotlin.jvm.JvmSynthetic\n"
@@ -1075,70 +1078,70 @@
" )\n");
WriteFieldAccessorDocComment(printer, descriptor_, LIST_ADDER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"add$kt_capitalized_name$\")\n"
- "fun com.google.protobuf.kotlin.DslList"
+ "public fun com.google.protobuf.kotlin.DslList"
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>."
"add(value: $kt_type$) {\n"
" $kt_dsl_builder$.${$add$capitalized_name$$}$(value)\n"
"}");
WriteFieldAccessorDocComment(printer, descriptor_, LIST_ADDER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"plusAssign$kt_capitalized_name$\")\n"
"@Suppress(\"NOTHING_TO_INLINE\")\n"
- "inline operator fun com.google.protobuf.kotlin.DslList"
+ "public inline operator fun com.google.protobuf.kotlin.DslList"
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>."
"plusAssign(value: $kt_type$) {\n"
" add(value)\n"
"}");
WriteFieldAccessorDocComment(printer, descriptor_, LIST_MULTI_ADDER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"addAll$kt_capitalized_name$\")\n"
- "fun com.google.protobuf.kotlin.DslList"
+ "public fun com.google.protobuf.kotlin.DslList"
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>."
"addAll(values: kotlin.collections.Iterable<$kt_type$>) {\n"
" $kt_dsl_builder$.${$addAll$capitalized_name$$}$(values)\n"
"}");
WriteFieldAccessorDocComment(printer, descriptor_, LIST_MULTI_ADDER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(
variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"plusAssignAll$kt_capitalized_name$\")\n"
"@Suppress(\"NOTHING_TO_INLINE\")\n"
- "inline operator fun com.google.protobuf.kotlin.DslList"
+ "public inline operator fun com.google.protobuf.kotlin.DslList"
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>."
"plusAssign(values: kotlin.collections.Iterable<$kt_type$>) {\n"
" addAll(values)\n"
"}");
WriteFieldAccessorDocComment(printer, descriptor_, LIST_INDEXED_SETTER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(
variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"set$kt_capitalized_name$\")\n"
- "operator fun com.google.protobuf.kotlin.DslList"
+ "public operator fun com.google.protobuf.kotlin.DslList"
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>."
"set(index: kotlin.Int, value: $kt_type$) {\n"
" $kt_dsl_builder$.${$set$capitalized_name$$}$(index, value)\n"
"}");
WriteFieldAccessorDocComment(printer, descriptor_, CLEARER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"clear$kt_capitalized_name$\")\n"
- "fun com.google.protobuf.kotlin.DslList"
+ "public fun com.google.protobuf.kotlin.DslList"
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>."
"clear() {\n"
" $kt_dsl_builder$.${$clear$capitalized_name$$}$()\n"
@@ -1154,4 +1157,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/compiler/java/enum_field.h b/src/google/protobuf/compiler/java/enum_field.h
index df9ee98..25ab073 100644
--- a/src/google/protobuf/compiler/java/enum_field.h
+++ b/src/google/protobuf/compiler/java/enum_field.h
@@ -38,7 +38,7 @@
#include <map>
#include <string>
-#include <google/protobuf/compiler/java/field.h>
+#include "google/protobuf/compiler/java/field.h"
namespace google {
namespace protobuf {
@@ -61,6 +61,9 @@
explicit ImmutableEnumFieldGenerator(const FieldDescriptor* descriptor,
int messageBitIndex, int builderBitIndex,
Context* context);
+ ImmutableEnumFieldGenerator(const ImmutableEnumFieldGenerator&) = delete;
+ ImmutableEnumFieldGenerator& operator=(const ImmutableEnumFieldGenerator&) =
+ delete;
~ImmutableEnumFieldGenerator() override;
// implements ImmutableFieldGenerator
@@ -89,9 +92,6 @@
const FieldDescriptor* descriptor_;
std::map<std::string, std::string> variables_;
ClassNameResolver* name_resolver_;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableEnumFieldGenerator);
};
class ImmutableEnumOneofFieldGenerator : public ImmutableEnumFieldGenerator {
@@ -99,6 +99,10 @@
ImmutableEnumOneofFieldGenerator(const FieldDescriptor* descriptor,
int messageBitIndex, int builderBitIndex,
Context* context);
+ ImmutableEnumOneofFieldGenerator(const ImmutableEnumOneofFieldGenerator&) =
+ delete;
+ ImmutableEnumOneofFieldGenerator& operator=(
+ const ImmutableEnumOneofFieldGenerator&) = delete;
~ImmutableEnumOneofFieldGenerator() override;
void GenerateMembers(io::Printer* printer) const override;
@@ -111,9 +115,6 @@
void GenerateSerializedSizeCode(io::Printer* printer) const override;
void GenerateEqualsCode(io::Printer* printer) const override;
void GenerateHashCode(io::Printer* printer) const override;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableEnumOneofFieldGenerator);
};
class RepeatedImmutableEnumFieldGenerator : public ImmutableFieldGenerator {
@@ -121,6 +122,10 @@
explicit RepeatedImmutableEnumFieldGenerator(
const FieldDescriptor* descriptor, int messageBitIndex,
int builderBitIndex, Context* context);
+ RepeatedImmutableEnumFieldGenerator(
+ const RepeatedImmutableEnumFieldGenerator&) = delete;
+ RepeatedImmutableEnumFieldGenerator& operator=(
+ const RepeatedImmutableEnumFieldGenerator&) = delete;
~RepeatedImmutableEnumFieldGenerator() override;
// implements ImmutableFieldGenerator ---------------------------------------
@@ -150,8 +155,6 @@
const FieldDescriptor* descriptor_;
std::map<std::string, std::string> variables_;
ClassNameResolver* name_resolver_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedImmutableEnumFieldGenerator);
};
} // namespace java
diff --git a/src/google/protobuf/compiler/java/enum_field_lite.cc b/src/google/protobuf/compiler/java/enum_field_lite.cc
index 6fe683f..d3a7fb0 100644
--- a/src/google/protobuf/compiler/java/enum_field_lite.cc
+++ b/src/google/protobuf/compiler/java/enum_field_lite.cc
@@ -32,24 +32,25 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/compiler/java/enum_field_lite.h>
+#include "google/protobuf/compiler/java/enum_field_lite.h"
#include <cstdint>
#include <map>
#include <string>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/wire_format.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/compiler/java/context.h>
-#include <google/protobuf/compiler/java/doc_comment.h>
-#include <google/protobuf/compiler/java/helpers.h>
-#include <google/protobuf/compiler/java/name_resolver.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/wire_format.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "absl/strings/str_cat.h"
+#include "google/protobuf/compiler/java/context.h"
+#include "google/protobuf/compiler/java/doc_comment.h"
+#include "google/protobuf/compiler/java/helpers.h"
+#include "google/protobuf/compiler/java/name_resolver.h"
// Must be last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -68,20 +69,22 @@
void SetEnumVariables(const FieldDescriptor* descriptor, int messageBitIndex,
int builderBitIndex, const FieldGeneratorInfo* info,
ClassNameResolver* name_resolver,
- std::map<std::string, std::string>* variables) {
+ std::map<std::string, std::string>* variables,
+ Context* context) {
SetCommonFieldVariables(descriptor, info, variables);
(*variables)["type"] =
name_resolver->GetImmutableClassName(descriptor->enum_type());
- (*variables)["kt_type"] = (*variables)["type"];
+ (*variables)["kt_type"] = EscapeKotlinKeywords((*variables)["type"]);
(*variables)["mutable_type"] =
name_resolver->GetMutableClassName(descriptor->enum_type());
- (*variables)["default"] = ImmutableDefaultValue(descriptor, name_resolver);
+ (*variables)["default"] =
+ ImmutableDefaultValue(descriptor, name_resolver, context->options());
(*variables)["default_number"] =
- StrCat(descriptor->default_value_enum()->number());
- (*variables)["tag"] = StrCat(
+ absl::StrCat(descriptor->default_value_enum()->number());
+ (*variables)["tag"] = absl::StrCat(
static_cast<int32_t>(internal::WireFormat::MakeTag(descriptor)));
- (*variables)["tag_size"] = StrCat(
+ (*variables)["tag_size"] = absl::StrCat(
internal::WireFormat::TagSize(descriptor->number(), GetType(descriptor)));
// TODO(birdo): Add @deprecated javadoc when generating javadoc is supported
// by the proto compiler
@@ -95,6 +98,12 @@
(*variables)["required"] = descriptor->is_required() ? "true" : "false";
if (HasHasbit(descriptor)) {
+ if (!context->options().opensource_runtime) {
+ (*variables)["bit_field_id"] = absl::StrCat(messageBitIndex / 32);
+ (*variables)["bit_field_name"] = GetBitFieldNameForBit(messageBitIndex);
+ (*variables)["bit_field_mask"] =
+ absl::StrCat(1 << (messageBitIndex % 32));
+ }
// For singular messages and builders, one bit is used for the hasField bit.
(*variables)["get_has_field_bit_message"] = GenerateGetBit(messageBitIndex);
@@ -128,6 +137,9 @@
// We use `x.getClass()` as a null check because it generates less bytecode
// than an `if (x == null) { throw ... }` statement.
(*variables)["null_check"] = "value.getClass();\n";
+ // Calls to Annotate() use variable ranges to know which text to annotate.
+ (*variables)["{"] = "";
+ (*variables)["}"] = "";
}
} // namespace
@@ -142,7 +154,7 @@
name_resolver_(context->GetNameResolver()) {
SetEnumVariables(descriptor, messageBitIndex, 0,
context->GetFieldGeneratorInfo(descriptor), name_resolver_,
- &variables_);
+ &variables_, context);
}
ImmutableEnumFieldLiteGenerator::~ImmutableEnumFieldLiteGenerator() {}
@@ -156,19 +168,37 @@
if (HasHazzer(descriptor_)) {
WriteFieldAccessorDocComment(printer, descriptor_, HAZZER);
printer->Print(variables_,
- "$deprecation$boolean has$capitalized_name$();\n");
+ "$deprecation$boolean ${$has$capitalized_name$$}$();\n");
+ printer->Annotate("{", "}", descriptor_);
}
if (SupportUnknownEnumValue(descriptor_->file())) {
WriteFieldEnumValueAccessorDocComment(printer, descriptor_, GETTER);
printer->Print(variables_,
- "$deprecation$int get$capitalized_name$Value();\n");
+ "$deprecation$int ${$get$capitalized_name$Value$}$();\n");
+ printer->Annotate("{", "}", descriptor_);
}
WriteFieldAccessorDocComment(printer, descriptor_, GETTER);
- printer->Print(variables_, "$deprecation$$type$ get$capitalized_name$();\n");
+ printer->Print(variables_,
+ "$deprecation$$type$ ${$get$capitalized_name$$}$();\n");
+ printer->Annotate("{", "}", descriptor_);
}
void ImmutableEnumFieldLiteGenerator::GenerateMembers(
io::Printer* printer) const {
+ if (!context_->options().opensource_runtime) {
+ printer->Print(
+ variables_,
+ "@com.google.protobuf.ProtoField(\n"
+ " fieldNumber=$number$,\n"
+ " type=com.google.protobuf.FieldType.$annotation_field_type$,\n"
+ " isRequired=$required$)\n");
+ if (HasHazzer(descriptor_)) {
+ printer->Print(variables_,
+ "@com.google.protobuf.ProtoPresenceCheckedField(\n"
+ " presenceBitsId=$bit_field_id$,\n"
+ " mask=$bit_field_mask$)\n");
+ }
+ }
printer->Print(variables_, "private int $name$_;\n");
PrintExtraFieldInfo(variables_, printer);
if (HasHazzer(descriptor_)) {
@@ -286,9 +316,9 @@
void ImmutableEnumFieldLiteGenerator::GenerateKotlinDslMembers(
io::Printer* printer) const {
- WriteFieldDocComment(printer, descriptor_);
+ WriteFieldDocComment(printer, descriptor_, /* kdoc */ true);
printer->Print(variables_,
- "$kt_deprecation$var $kt_name$: $kt_type$\n"
+ "$kt_deprecation$public var $kt_name$: $kt_type$\n"
" @JvmName(\"${$get$kt_capitalized_name$$}$\")\n"
" get() = $kt_dsl_builder$.${$get$capitalized_name$$}$()\n"
" @JvmName(\"${$set$kt_capitalized_name$$}$\")\n"
@@ -296,18 +326,31 @@
" $kt_dsl_builder$.${$set$capitalized_name$$}$(value)\n"
" }\n");
+ if (SupportUnknownEnumValue(descriptor_->file())) {
+ printer->Print(
+ variables_,
+ "$kt_deprecation$public var $kt_name$Value: kotlin.Int\n"
+ " @JvmName(\"${$get$kt_capitalized_name$Value$}$\")\n"
+ " get() = $kt_dsl_builder$.${$get$capitalized_name$Value$}$()\n"
+ " @JvmName(\"${$set$kt_capitalized_name$Value$}$\")\n"
+ " set(value) {\n"
+ " $kt_dsl_builder$.${$set$capitalized_name$Value$}$(value)\n"
+ " }\n");
+ }
+
WriteFieldAccessorDocComment(printer, descriptor_, CLEARER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(variables_,
- "fun ${$clear$kt_capitalized_name$$}$() {\n"
+ "public fun ${$clear$kt_capitalized_name$$}$() {\n"
" $kt_dsl_builder$.${$clear$capitalized_name$$}$()\n"
"}\n");
if (HasHazzer(descriptor_)) {
- WriteFieldAccessorDocComment(printer, descriptor_, HAZZER);
+ WriteFieldAccessorDocComment(printer, descriptor_, HAZZER,
+ /* builder */ false, /* kdoc */ true);
printer->Print(
variables_,
- "fun ${$has$kt_capitalized_name$$}$(): kotlin.Boolean {\n"
+ "public fun ${$has$kt_capitalized_name$$}$(): kotlin.Boolean {\n"
" return $kt_dsl_builder$.${$has$capitalized_name$$}$()\n"
"}\n");
}
@@ -501,7 +544,7 @@
name_resolver_(context->GetNameResolver()) {
SetEnumVariables(descriptor, messageBitIndex, 0,
context->GetFieldGeneratorInfo(descriptor), name_resolver_,
- &variables_);
+ &variables_, context);
}
RepeatedImmutableEnumFieldLiteGenerator::
@@ -514,29 +557,43 @@
void RepeatedImmutableEnumFieldLiteGenerator::GenerateInterfaceMembers(
io::Printer* printer) const {
WriteFieldAccessorDocComment(printer, descriptor_, LIST_GETTER);
- printer->Print(
- variables_,
- "$deprecation$java.util.List<$type$> get$capitalized_name$List();\n");
+ printer->Print(variables_,
+ "$deprecation$java.util.List<$type$> "
+ "${$get$capitalized_name$List$}$();\n");
+ printer->Annotate("{", "}", descriptor_);
WriteFieldAccessorDocComment(printer, descriptor_, LIST_COUNT);
printer->Print(variables_,
- "$deprecation$int get$capitalized_name$Count();\n");
+ "$deprecation$int ${$get$capitalized_name$Count$}$();\n");
+ printer->Annotate("{", "}", descriptor_);
WriteFieldAccessorDocComment(printer, descriptor_, LIST_INDEXED_GETTER);
- printer->Print(variables_,
- "$deprecation$$type$ get$capitalized_name$(int index);\n");
+ printer->Print(
+ variables_,
+ "$deprecation$$type$ ${$get$capitalized_name$$}$(int index);\n");
+ printer->Annotate("{", "}", descriptor_);
if (SupportUnknownEnumValue(descriptor_->file())) {
WriteFieldEnumValueAccessorDocComment(printer, descriptor_, LIST_GETTER);
printer->Print(variables_,
"$deprecation$java.util.List<java.lang.Integer>\n"
- "get$capitalized_name$ValueList();\n");
+ "${$get$capitalized_name$ValueList$}$();\n");
+ printer->Annotate("{", "}", descriptor_);
WriteFieldEnumValueAccessorDocComment(printer, descriptor_,
LIST_INDEXED_GETTER);
- printer->Print(variables_,
- "$deprecation$int get$capitalized_name$Value(int index);\n");
+ printer->Print(
+ variables_,
+ "$deprecation$int ${$get$capitalized_name$Value$}$(int index);\n");
+ printer->Annotate("{", "}", descriptor_);
}
}
void RepeatedImmutableEnumFieldLiteGenerator::GenerateMembers(
io::Printer* printer) const {
+ if (!context_->options().opensource_runtime) {
+ printer->Print(
+ variables_,
+ "@com.google.protobuf.ProtoField(\n"
+ " fieldNumber=$number$,\n"
+ " type=com.google.protobuf.FieldType.$annotation_field_type$)\n");
+ }
printer->Print(
variables_,
"private com.google.protobuf.Internal.IntList $name$_;\n"
@@ -793,6 +850,7 @@
printer->Print(variables_,
"$deprecation$public Builder "
"${$add$capitalized_name$Value$}$(int value) {\n"
+ " copyOnWrite();\n"
" instance.add$capitalized_name$Value(value);\n"
" return this;\n"
"}\n");
@@ -827,12 +885,12 @@
" */\n"
"@kotlin.OptIn"
"(com.google.protobuf.kotlin.OnlyForUseByGeneratedProtoCode::class)\n"
- "class ${$$kt_capitalized_name$Proxy$}$ private constructor()"
+ "public class ${$$kt_capitalized_name$Proxy$}$ private constructor()"
" : com.google.protobuf.kotlin.DslProxy()\n");
- WriteFieldDocComment(printer, descriptor_);
+ WriteFieldDocComment(printer, descriptor_, /* kdoc */ true);
printer->Print(variables_,
- "$kt_deprecation$ val $kt_name$: "
+ "$kt_deprecation$ public val $kt_name$: "
"com.google.protobuf.kotlin.DslList"
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>\n"
" @kotlin.jvm.JvmSynthetic\n"
@@ -841,70 +899,70 @@
" )\n");
WriteFieldAccessorDocComment(printer, descriptor_, LIST_ADDER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"add$kt_capitalized_name$\")\n"
- "fun com.google.protobuf.kotlin.DslList"
+ "public fun com.google.protobuf.kotlin.DslList"
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>."
"add(value: $kt_type$) {\n"
" $kt_dsl_builder$.${$add$capitalized_name$$}$(value)\n"
"}");
WriteFieldAccessorDocComment(printer, descriptor_, LIST_ADDER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"plusAssign$kt_capitalized_name$\")\n"
"@Suppress(\"NOTHING_TO_INLINE\")\n"
- "inline operator fun com.google.protobuf.kotlin.DslList"
+ "public inline operator fun com.google.protobuf.kotlin.DslList"
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>."
"plusAssign(value: $kt_type$) {\n"
" add(value)\n"
"}");
WriteFieldAccessorDocComment(printer, descriptor_, LIST_MULTI_ADDER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"addAll$kt_capitalized_name$\")\n"
- "fun com.google.protobuf.kotlin.DslList"
+ "public fun com.google.protobuf.kotlin.DslList"
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>."
"addAll(values: kotlin.collections.Iterable<$kt_type$>) {\n"
" $kt_dsl_builder$.${$addAll$capitalized_name$$}$(values)\n"
"}");
WriteFieldAccessorDocComment(printer, descriptor_, LIST_MULTI_ADDER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(
variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"plusAssignAll$kt_capitalized_name$\")\n"
"@Suppress(\"NOTHING_TO_INLINE\")\n"
- "inline operator fun com.google.protobuf.kotlin.DslList"
+ "public inline operator fun com.google.protobuf.kotlin.DslList"
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>."
"plusAssign(values: kotlin.collections.Iterable<$kt_type$>) {\n"
" addAll(values)\n"
"}");
WriteFieldAccessorDocComment(printer, descriptor_, LIST_INDEXED_SETTER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(
variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"set$kt_capitalized_name$\")\n"
- "operator fun com.google.protobuf.kotlin.DslList"
+ "public operator fun com.google.protobuf.kotlin.DslList"
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>."
"set(index: kotlin.Int, value: $kt_type$) {\n"
" $kt_dsl_builder$.${$set$capitalized_name$$}$(index, value)\n"
"}");
WriteFieldAccessorDocComment(printer, descriptor_, CLEARER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"clear$kt_capitalized_name$\")\n"
- "fun com.google.protobuf.kotlin.DslList"
+ "public fun com.google.protobuf.kotlin.DslList"
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>."
"clear() {\n"
" $kt_dsl_builder$.${$clear$capitalized_name$$}$()\n"
@@ -920,4 +978,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/compiler/java/enum_field_lite.h b/src/google/protobuf/compiler/java/enum_field_lite.h
index 492b268..8d7a7d1 100644
--- a/src/google/protobuf/compiler/java/enum_field_lite.h
+++ b/src/google/protobuf/compiler/java/enum_field_lite.h
@@ -39,7 +39,7 @@
#include <map>
#include <string>
-#include <google/protobuf/compiler/java/field.h>
+#include "google/protobuf/compiler/java/field.h"
namespace google {
namespace protobuf {
@@ -62,6 +62,10 @@
explicit ImmutableEnumFieldLiteGenerator(const FieldDescriptor* descriptor,
int messageBitIndex,
Context* context);
+ ImmutableEnumFieldLiteGenerator(const ImmutableEnumFieldLiteGenerator&) =
+ delete;
+ ImmutableEnumFieldLiteGenerator& operator=(
+ const ImmutableEnumFieldLiteGenerator&) = delete;
~ImmutableEnumFieldLiteGenerator() override;
// implements ImmutableFieldLiteGenerator
@@ -83,9 +87,6 @@
const int messageBitIndex_;
Context* context_;
ClassNameResolver* name_resolver_;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableEnumFieldLiteGenerator);
};
class ImmutableEnumOneofFieldLiteGenerator
@@ -93,15 +94,16 @@
public:
ImmutableEnumOneofFieldLiteGenerator(const FieldDescriptor* descriptor,
int messageBitIndex, Context* context);
+ ImmutableEnumOneofFieldLiteGenerator(
+ const ImmutableEnumOneofFieldLiteGenerator&) = delete;
+ ImmutableEnumOneofFieldLiteGenerator& operator=(
+ const ImmutableEnumOneofFieldLiteGenerator&) = delete;
~ImmutableEnumOneofFieldLiteGenerator() override;
void GenerateMembers(io::Printer* printer) const override;
void GenerateBuilderMembers(io::Printer* printer) const override;
void GenerateFieldInfo(io::Printer* printer,
std::vector<uint16_t>* output) const override;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableEnumOneofFieldLiteGenerator);
};
class RepeatedImmutableEnumFieldLiteGenerator
@@ -109,6 +111,10 @@
public:
explicit RepeatedImmutableEnumFieldLiteGenerator(
const FieldDescriptor* descriptor, int messageBitIndex, Context* context);
+ RepeatedImmutableEnumFieldLiteGenerator(
+ const RepeatedImmutableEnumFieldLiteGenerator&) = delete;
+ RepeatedImmutableEnumFieldLiteGenerator& operator=(
+ const RepeatedImmutableEnumFieldLiteGenerator&) = delete;
~RepeatedImmutableEnumFieldLiteGenerator() override;
// implements ImmutableFieldLiteGenerator ------------------------------------
@@ -128,8 +134,6 @@
std::map<std::string, std::string> variables_;
Context* context_;
ClassNameResolver* name_resolver_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedImmutableEnumFieldLiteGenerator);
};
} // namespace java
diff --git a/src/google/protobuf/compiler/java/enum_lite.cc b/src/google/protobuf/compiler/java/enum_lite.cc
index 4387090..a04f814 100644
--- a/src/google/protobuf/compiler/java/enum_lite.cc
+++ b/src/google/protobuf/compiler/java/enum_lite.cc
@@ -32,19 +32,19 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/compiler/java/enum_lite.h>
+#include "google/protobuf/compiler/java/enum_lite.h"
#include <map>
#include <string>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/compiler/java/context.h>
-#include <google/protobuf/compiler/java/doc_comment.h>
-#include <google/protobuf/compiler/java/helpers.h>
-#include <google/protobuf/compiler/java/name_resolver.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/stubs/map_util.h>
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "absl/strings/str_cat.h"
+#include "google/protobuf/compiler/java/context.h"
+#include "google/protobuf/compiler/java/doc_comment.h"
+#include "google/protobuf/compiler/java/helpers.h"
+#include "google/protobuf/compiler/java/name_resolver.h"
+#include "google/protobuf/descriptor.pb.h"
namespace google {
namespace protobuf {
@@ -89,7 +89,7 @@
for (int i = 0; i < canonical_values_.size(); i++) {
std::map<std::string, std::string> vars;
vars["name"] = canonical_values_[i]->name();
- vars["number"] = StrCat(canonical_values_[i]->number());
+ vars["number"] = absl::StrCat(canonical_values_[i]->number());
WriteEnumValueDocComment(printer, canonical_values_[i]);
if (canonical_values_[i]->options().deprecated()) {
printer->Print("@java.lang.Deprecated\n");
@@ -123,7 +123,7 @@
for (int i = 0; i < descriptor_->value_count(); i++) {
std::map<std::string, std::string> vars;
vars["name"] = descriptor_->value(i)->name();
- vars["number"] = StrCat(descriptor_->value(i)->number());
+ vars["number"] = absl::StrCat(descriptor_->value(i)->number());
vars["{"] = "";
vars["}"] = "";
vars["deprecation"] = descriptor_->value(i)->options().deprecated()
@@ -153,17 +153,26 @@
printer->Print(
" return value;\n"
"}\n"
- "\n"
- "/**\n"
- " * @param value The number of the enum to look for.\n"
- " * @return The enum associated with the given number.\n"
- " * @deprecated Use {@link #forNumber(int)} instead.\n"
- " */\n"
- "@java.lang.Deprecated\n"
- "public static $classname$ valueOf(int value) {\n"
- " return forNumber(value);\n"
- "}\n"
- "\n"
+ "\n");
+ if (context_->options().opensource_runtime) {
+ printer->Print(
+ "/**\n"
+ " * @param value The number of the enum to look for.\n"
+ " * @return The enum associated with the given number.\n"
+ " * @deprecated Use {@link #forNumber(int)} instead.\n"
+ " */\n"
+ "@java.lang.Deprecated\n"
+ "public static $classname$ valueOf(int value) {\n"
+ " return forNumber(value);\n"
+ "}\n"
+ "\n",
+ "classname", descriptor_->name());
+ }
+
+ if (!context_->options().opensource_runtime) {
+ printer->Print("@com.google.protobuf.Internal.ProtoMethodMayReturnNull\n");
+ }
+ printer->Print(
"public static $classname$ forNumber(int value) {\n"
" switch (value) {\n",
"classname", descriptor_->name());
@@ -173,7 +182,7 @@
for (int i = 0; i < canonical_values_.size(); i++) {
printer->Print("case $number$: return $name$;\n", "name",
canonical_values_[i]->name(), "number",
- StrCat(canonical_values_[i]->number()));
+ absl::StrCat(canonical_values_[i]->number()));
}
printer->Outdent();
@@ -212,6 +221,35 @@
" };\n"
"\n",
"classname", descriptor_->name());
+ if (!context_->options().opensource_runtime) {
+ printer->Print(
+ "/**\n"
+ " * Override of toString that prints the number and name.\n"
+ " * This is primarily intended as a developer aid.\n"
+ " *\n"
+ " * <p>NOTE: This implementation is liable to change in the future,\n"
+ " * and should not be relied on in code.\n"
+ " */\n"
+ "@java.lang.Override\n"
+ "public java.lang.String toString() {\n"
+ " StringBuilder result = new StringBuilder(\"<\");\n"
+ " result.append(getClass().getName()).append('@')\n"
+ " .append(java.lang.Integer.toHexString(\n"
+ " java.lang.System.identityHashCode(this)));\n");
+ if (SupportUnknownEnumValue(descriptor_->file())) {
+ printer->Print(
+ " if (this != UNRECOGNIZED) {\n"
+ " result.append(\" number=\").append(getNumber());\n"
+ " }\n");
+ } else {
+ printer->Print(" result.append(\" number=\").append(getNumber());\n");
+ }
+ printer->Print(
+ " return result.append(\" name=\")\n"
+ " .append(name()).append('>').toString();\n"
+ "}\n"
+ "\n");
+ }
printer->Print(
"private final int value;\n\n"
diff --git a/src/google/protobuf/compiler/java/enum_lite.h b/src/google/protobuf/compiler/java/enum_lite.h
index 50f3fe7..13306b1 100644
--- a/src/google/protobuf/compiler/java/enum_lite.h
+++ b/src/google/protobuf/compiler/java/enum_lite.h
@@ -37,7 +37,7 @@
#include <string>
#include <vector>
-#include <google/protobuf/descriptor.h>
+#include "google/protobuf/descriptor.h"
namespace google {
namespace protobuf {
@@ -62,6 +62,8 @@
public:
EnumLiteGenerator(const EnumDescriptor* descriptor, bool immutable_api,
Context* context);
+ EnumLiteGenerator(const EnumLiteGenerator&) = delete;
+ EnumLiteGenerator& operator=(const EnumLiteGenerator&) = delete;
~EnumLiteGenerator();
void Generate(io::Printer* printer);
@@ -86,8 +88,6 @@
Context* context_;
ClassNameResolver* name_resolver_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumLiteGenerator);
};
} // namespace java
diff --git a/src/google/protobuf/compiler/java/extension.cc b/src/google/protobuf/compiler/java/extension.cc
index 8b93eb1..0e42a01 100644
--- a/src/google/protobuf/compiler/java/extension.cc
+++ b/src/google/protobuf/compiler/java/extension.cc
@@ -32,17 +32,18 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/compiler/java/extension.h>
+#include "google/protobuf/compiler/java/extension.h"
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/compiler/java/context.h>
-#include <google/protobuf/compiler/java/doc_comment.h>
-#include <google/protobuf/compiler/java/helpers.h>
-#include <google/protobuf/compiler/java/name_resolver.h>
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "absl/strings/str_cat.h"
+#include "google/protobuf/compiler/java/context.h"
+#include "google/protobuf/compiler/java/doc_comment.h"
+#include "google/protobuf/compiler/java/helpers.h"
+#include "google/protobuf/compiler/java/name_resolver.h"
// Must be last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -51,7 +52,9 @@
ImmutableExtensionGenerator::ImmutableExtensionGenerator(
const FieldDescriptor* descriptor, Context* context)
- : descriptor_(descriptor), name_resolver_(context->GetNameResolver()) {
+ : descriptor_(descriptor),
+ name_resolver_(context->GetNameResolver()),
+ context_(context) {
if (descriptor_->extension_scope() != NULL) {
scope_ =
name_resolver_->GetImmutableClassName(descriptor_->extension_scope());
@@ -66,18 +69,19 @@
void ExtensionGenerator::InitTemplateVars(
const FieldDescriptor* descriptor, const std::string& scope, bool immutable,
ClassNameResolver* name_resolver,
- std::map<std::string, std::string>* vars_pointer) {
+ std::map<std::string, std::string>* vars_pointer, Context* context) {
std::map<std::string, std::string>& vars = *vars_pointer;
vars["scope"] = scope;
vars["name"] = UnderscoresToCamelCaseCheckReserved(descriptor);
vars["containing_type"] =
name_resolver->GetClassName(descriptor->containing_type(), immutable);
- vars["number"] = StrCat(descriptor->number());
+ vars["number"] = absl::StrCat(descriptor->number());
vars["constant_name"] = FieldConstantName(descriptor);
- vars["index"] = StrCat(descriptor->index());
+ vars["index"] = absl::StrCat(descriptor->index());
vars["default"] = descriptor->is_repeated()
? ""
- : DefaultValue(descriptor, immutable, name_resolver);
+ : DefaultValue(descriptor, immutable, name_resolver,
+ context->options());
vars["type_constant"] = FieldTypeName(GetType(descriptor));
vars["packed"] = descriptor->is_packed() ? "true" : "false";
vars["enum_map"] = "null";
@@ -116,7 +120,7 @@
std::map<std::string, std::string> vars;
const bool kUseImmutableNames = true;
InitTemplateVars(descriptor_, scope_, kUseImmutableNames, name_resolver_,
- &vars);
+ &vars, context_);
printer->Print(vars, "public static final int $constant_name$ = $number$;\n");
WriteFieldDocComment(printer, descriptor_);
@@ -156,7 +160,7 @@
printer->Print(
"$name$.internalInit(descriptor.getExtensions().get($index$));\n",
"name", UnderscoresToCamelCaseCheckReserved(descriptor_), "index",
- StrCat(descriptor_->index()));
+ absl::StrCat(descriptor_->index()));
bytecode_estimate += 21;
}
return bytecode_estimate;
@@ -174,4 +178,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/compiler/java/extension.h b/src/google/protobuf/compiler/java/extension.h
index 318cfa4..b9dc995 100644
--- a/src/google/protobuf/compiler/java/extension.h
+++ b/src/google/protobuf/compiler/java/extension.h
@@ -38,7 +38,7 @@
#include <map>
#include <string>
-#include <google/protobuf/stubs/common.h>
+#include "google/protobuf/port.h"
namespace google {
namespace protobuf {
@@ -66,6 +66,8 @@
class ExtensionGenerator {
public:
explicit ExtensionGenerator() {}
+ ExtensionGenerator(const ExtensionGenerator&) = delete;
+ ExtensionGenerator& operator=(const ExtensionGenerator&) = delete;
virtual ~ExtensionGenerator() {}
virtual void Generate(io::Printer* printer) = 0;
@@ -79,19 +81,20 @@
virtual int GenerateRegistrationCode(io::Printer* printer) = 0;
protected:
- static void InitTemplateVars(
- const FieldDescriptor* descriptor, const std::string& scope,
- bool immutable, ClassNameResolver* name_resolver,
- std::map<std::string, std::string>* vars_pointer);
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ExtensionGenerator);
+ static void InitTemplateVars(const FieldDescriptor* descriptor,
+ const std::string& scope, bool immutable,
+ ClassNameResolver* name_resolver,
+ std::map<std::string, std::string>* vars_pointer,
+ Context* context);
};
class ImmutableExtensionGenerator : public ExtensionGenerator {
public:
explicit ImmutableExtensionGenerator(const FieldDescriptor* descriptor,
Context* context);
+ ImmutableExtensionGenerator(const ImmutableExtensionGenerator&) = delete;
+ ImmutableExtensionGenerator& operator=(const ImmutableExtensionGenerator&) =
+ delete;
~ImmutableExtensionGenerator() override;
void Generate(io::Printer* printer) override;
@@ -102,9 +105,7 @@
const FieldDescriptor* descriptor_;
ClassNameResolver* name_resolver_;
std::string scope_;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableExtensionGenerator);
+ Context* context_;
};
} // namespace java
diff --git a/src/google/protobuf/compiler/java/extension_lite.cc b/src/google/protobuf/compiler/java/extension_lite.cc
index bffb1d6..4c3b83a 100644
--- a/src/google/protobuf/compiler/java/extension_lite.cc
+++ b/src/google/protobuf/compiler/java/extension_lite.cc
@@ -28,17 +28,17 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/compiler/java/extension_lite.h>
+#include "google/protobuf/compiler/java/extension_lite.h"
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/compiler/java/context.h>
-#include <google/protobuf/compiler/java/doc_comment.h>
-#include <google/protobuf/compiler/java/helpers.h>
-#include <google/protobuf/compiler/java/name_resolver.h>
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "google/protobuf/compiler/java/context.h"
+#include "google/protobuf/compiler/java/doc_comment.h"
+#include "google/protobuf/compiler/java/helpers.h"
+#include "google/protobuf/compiler/java/name_resolver.h"
// Must be last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -47,7 +47,9 @@
ImmutableExtensionLiteGenerator::ImmutableExtensionLiteGenerator(
const FieldDescriptor* descriptor, Context* context)
- : descriptor_(descriptor), name_resolver_(context->GetNameResolver()) {
+ : descriptor_(descriptor),
+ name_resolver_(context->GetNameResolver()),
+ context_(context) {
if (descriptor_->extension_scope() != NULL) {
scope_ =
name_resolver_->GetImmutableClassName(descriptor_->extension_scope());
@@ -62,7 +64,7 @@
std::map<std::string, std::string> vars;
const bool kUseImmutableNames = true;
InitTemplateVars(descriptor_, scope_, kUseImmutableNames, name_resolver_,
- &vars);
+ &vars, context_);
printer->Print(vars, "public static final int $constant_name$ = $number$;\n");
WriteFieldDocComment(printer, descriptor_);
@@ -117,4 +119,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/compiler/java/extension_lite.h b/src/google/protobuf/compiler/java/extension_lite.h
index 264230c..015f2ee 100644
--- a/src/google/protobuf/compiler/java/extension_lite.h
+++ b/src/google/protobuf/compiler/java/extension_lite.h
@@ -34,8 +34,8 @@
#include <map>
#include <string>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/compiler/java/extension.h>
+#include "google/protobuf/compiler/java/extension.h"
+#include "google/protobuf/port.h"
namespace google {
namespace protobuf {
@@ -49,6 +49,10 @@
public:
explicit ImmutableExtensionLiteGenerator(const FieldDescriptor* descriptor,
Context* context);
+ ImmutableExtensionLiteGenerator(const ImmutableExtensionLiteGenerator&) =
+ delete;
+ ImmutableExtensionLiteGenerator& operator=(
+ const ImmutableExtensionLiteGenerator&) = delete;
~ImmutableExtensionLiteGenerator() override;
void Generate(io::Printer* printer) override;
@@ -63,8 +67,7 @@
const FieldDescriptor* descriptor_;
ClassNameResolver* name_resolver_;
std::string scope_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableExtensionLiteGenerator);
+ Context* context_;
};
} // namespace java
diff --git a/src/google/protobuf/compiler/java/field.cc b/src/google/protobuf/compiler/java/field.cc
index 3dd528f..13aed84 100644
--- a/src/google/protobuf/compiler/java/field.cc
+++ b/src/google/protobuf/compiler/java/field.cc
@@ -32,27 +32,28 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/compiler/java/field.h>
+#include "google/protobuf/compiler/java/field.h"
#include <memory>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/substitute.h>
-#include <google/protobuf/compiler/java/context.h>
-#include <google/protobuf/compiler/java/enum_field.h>
-#include <google/protobuf/compiler/java/enum_field_lite.h>
-#include <google/protobuf/compiler/java/helpers.h>
-#include <google/protobuf/compiler/java/map_field.h>
-#include <google/protobuf/compiler/java/map_field_lite.h>
-#include <google/protobuf/compiler/java/message_field.h>
-#include <google/protobuf/compiler/java/message_field_lite.h>
-#include <google/protobuf/compiler/java/primitive_field.h>
-#include <google/protobuf/compiler/java/primitive_field_lite.h>
-#include <google/protobuf/compiler/java/string_field.h>
-#include <google/protobuf/compiler/java/string_field_lite.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/substitute.h"
+#include "google/protobuf/compiler/java/context.h"
+#include "google/protobuf/compiler/java/enum_field.h"
+#include "google/protobuf/compiler/java/enum_field_lite.h"
+#include "google/protobuf/compiler/java/helpers.h"
+#include "google/protobuf/compiler/java/map_field.h"
+#include "google/protobuf/compiler/java/map_field_lite.h"
+#include "google/protobuf/compiler/java/message_field.h"
+#include "google/protobuf/compiler/java/message_field_lite.h"
+#include "google/protobuf/compiler/java/primitive_field.h"
+#include "google/protobuf/compiler/java/primitive_field_lite.h"
+#include "google/protobuf/compiler/java/string_field.h"
+#include "google/protobuf/compiler/java/string_field_lite.h"
namespace google {
@@ -250,7 +251,7 @@
(*variables)["capitalized_name"] = info->capitalized_name;
(*variables)["disambiguated_reason"] = info->disambiguated_reason;
(*variables)["constant_name"] = FieldConstantName(descriptor);
- (*variables)["number"] = StrCat(descriptor->number());
+ (*variables)["number"] = absl::StrCat(descriptor->number());
(*variables)["kt_dsl_builder"] = "_builder";
// These variables are placeholders to pick out the beginning and ends of
// identifiers for annotations (when doing so with existing variables would
@@ -285,13 +286,13 @@
(*variables)["oneof_name"] = info->name;
(*variables)["oneof_capitalized_name"] = info->capitalized_name;
(*variables)["oneof_index"] =
- StrCat(descriptor->containing_oneof()->index());
+ absl::StrCat(descriptor->containing_oneof()->index());
(*variables)["oneof_stored_type"] = GetOneofStoredType(descriptor);
(*variables)["set_oneof_case_message"] =
- info->name + "Case_ = " + StrCat(descriptor->number());
+ info->name + "Case_ = " + absl::StrCat(descriptor->number());
(*variables)["clear_oneof_case_message"] = info->name + "Case_ = 0";
(*variables)["has_oneof_case_message"] =
- info->name + "Case_ == " + StrCat(descriptor->number());
+ info->name + "Case_ == " + absl::StrCat(descriptor->number());
}
void PrintExtraFieldInfo(const std::map<std::string, std::string>& variables,
diff --git a/src/google/protobuf/compiler/java/field.h b/src/google/protobuf/compiler/java/field.h
index a9125f1..5ac57cd 100644
--- a/src/google/protobuf/compiler/java/field.h
+++ b/src/google/protobuf/compiler/java/field.h
@@ -40,9 +40,10 @@
#include <memory>
#include <string>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/descriptor.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/port.h"
namespace google {
namespace protobuf {
@@ -66,6 +67,8 @@
class ImmutableFieldGenerator {
public:
ImmutableFieldGenerator() {}
+ ImmutableFieldGenerator(const ImmutableFieldGenerator&) = delete;
+ ImmutableFieldGenerator& operator=(const ImmutableFieldGenerator&) = delete;
virtual ~ImmutableFieldGenerator();
virtual int GetNumBitsForMessage() const = 0;
@@ -89,14 +92,14 @@
virtual void GenerateHashCode(io::Printer* printer) const = 0;
virtual std::string GetBoxedType() const = 0;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableFieldGenerator);
};
class ImmutableFieldLiteGenerator {
public:
ImmutableFieldLiteGenerator() {}
+ ImmutableFieldLiteGenerator(const ImmutableFieldLiteGenerator&) = delete;
+ ImmutableFieldLiteGenerator& operator=(const ImmutableFieldLiteGenerator&) =
+ delete;
virtual ~ImmutableFieldLiteGenerator();
virtual int GetNumBitsForMessage() const = 0;
@@ -109,9 +112,6 @@
virtual void GenerateKotlinDslMembers(io::Printer* printer) const = 0;
virtual std::string GetBoxedType() const = 0;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableFieldLiteGenerator);
};
@@ -120,6 +120,8 @@
class FieldGeneratorMap {
public:
explicit FieldGeneratorMap(const Descriptor* descriptor, Context* context);
+ FieldGeneratorMap(const FieldGeneratorMap&) = delete;
+ FieldGeneratorMap& operator=(const FieldGeneratorMap&) = delete;
~FieldGeneratorMap();
const FieldGeneratorType& get(const FieldDescriptor* field) const;
@@ -127,8 +129,6 @@
private:
const Descriptor* descriptor_;
std::vector<std::unique_ptr<FieldGeneratorType>> field_generators_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FieldGeneratorMap);
};
template <typename FieldGeneratorType>
diff --git a/src/google/protobuf/compiler/java/file.cc b/src/google/protobuf/compiler/java/file.cc
index cf27703..20949d0 100644
--- a/src/google/protobuf/compiler/java/file.cc
+++ b/src/google/protobuf/compiler/java/file.cc
@@ -32,30 +32,31 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/compiler/java/file.h>
+#include "google/protobuf/compiler/java/file.h"
#include <memory>
#include <set>
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/dynamic_message.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/compiler/java/context.h>
-#include <google/protobuf/compiler/java/enum.h>
-#include <google/protobuf/compiler/java/enum_lite.h>
-#include <google/protobuf/compiler/java/extension.h>
-#include <google/protobuf/compiler/java/generator_factory.h>
-#include <google/protobuf/compiler/java/helpers.h>
-#include <google/protobuf/compiler/java/message.h>
-#include <google/protobuf/compiler/java/name_resolver.h>
-#include <google/protobuf/compiler/java/service.h>
-#include <google/protobuf/compiler/java/shared_code_generator.h>
-#include <google/protobuf/descriptor.pb.h>
+#include "google/protobuf/compiler/code_generator.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/io/zero_copy_stream.h"
+#include "google/protobuf/dynamic_message.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "absl/strings/str_cat.h"
+#include "google/protobuf/compiler/java/context.h"
+#include "google/protobuf/compiler/java/enum.h"
+#include "google/protobuf/compiler/java/enum_lite.h"
+#include "google/protobuf/compiler/java/extension.h"
+#include "google/protobuf/compiler/java/generator_factory.h"
+#include "google/protobuf/compiler/java/helpers.h"
+#include "google/protobuf/compiler/java/message.h"
+#include "google/protobuf/compiler/java/name_resolver.h"
+#include "google/protobuf/compiler/java/service.h"
+#include "google/protobuf/compiler/java/shared_code_generator.h"
+#include "google/protobuf/descriptor.pb.h"
// Must be last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -175,10 +176,10 @@
if ((*bytecode_estimate) > bytesPerMethod) {
++(*method_num);
- printer->Print(chain_statement, "method_num", StrCat(*method_num));
+ printer->Print(chain_statement, "method_num", absl::StrCat(*method_num));
printer->Outdent();
printer->Print("}\n");
- printer->Print(method_decl, "method_num", StrCat(*method_num));
+ printer->Print(method_decl, "method_num", absl::StrCat(*method_num));
printer->Indent();
*bytecode_estimate = 0;
}
@@ -188,7 +189,7 @@
FileGenerator::FileGenerator(const FileDescriptor* file, const Options& options,
bool immutable_api)
: file_(file),
- java_package_(FileJavaPackage(file, immutable_api)),
+ java_package_(FileJavaPackage(file, immutable_api, options)),
message_generators_(file->message_type_count()),
extension_generators_(file->extension_count()),
context_(new Context(file, options)),
@@ -196,7 +197,7 @@
options_(options),
immutable_api_(immutable_api) {
classname_ = name_resolver_->GetFileClassName(file, immutable_api);
- generator_factory_.reset(new ImmutableGeneratorFactory(context_.get()));
+ generator_factory_.reset(new ImmutableGeneratorFactory(context_.get()));
for (int i = 0; i < file_->message_type_count(); ++i) {
message_generators_[i].reset(
generator_factory_->NewMessageGenerator(file_->message_type(i)));
@@ -271,8 +272,12 @@
"package", java_package_);
}
PrintGeneratedAnnotation(
- printer, '$', options_.annotate_code ? classname_ + ".java.pb.meta" : "");
+ printer, '$', options_.annotate_code ? classname_ + ".java.pb.meta" : "",
+ options_);
+ if (!options_.opensource_runtime) {
+ printer->Print("@com.google.protobuf.Internal.ProtoNonnullApi\n");
+ }
printer->Print(
"$deprecation$public final class $classname$ {\n"
" private $ctor$() {}\n",
@@ -401,11 +406,14 @@
" descriptor;\n"
"static {\n",
// TODO(dweis): Mark this as final.
- "final", "");
+ "final", options_.opensource_runtime ? "" : "final");
printer->Indent();
- SharedCodeGenerator shared_code_generator(file_, options_);
- shared_code_generator.GenerateDescriptors(printer);
+ if (options_.opensource_runtime) {
+ SharedCodeGenerator shared_code_generator(file_, options_);
+ shared_code_generator.GenerateDescriptors(printer);
+ } else {
+ }
int bytecode_estimate = 0;
int method_num = 0;
@@ -499,8 +507,8 @@
printer->Print(
"descriptor = $immutable_package$.$descriptor_classname$.descriptor;\n",
- "immutable_package", FileJavaPackage(file_, true), "descriptor_classname",
- name_resolver_->GetDescriptorClassName(file_));
+ "immutable_package", FileJavaPackage(file_, true, options_),
+ "descriptor_classname", name_resolver_->GetDescriptorClassName(file_));
for (int i = 0; i < file_->message_type_count(); i++) {
message_generators_[i]->GenerateStaticVariableInitializers(printer);
@@ -547,7 +555,7 @@
scope = name_resolver_->GetMutableClassName(field->extension_scope()) +
".getDescriptor()";
} else {
- scope = FileJavaPackage(field->file(), true) + "." +
+ scope = FileJavaPackage(field->file(), true, options_) + "." +
name_resolver_->GetDescriptorClassName(field->file()) +
".descriptor";
}
@@ -560,11 +568,11 @@
" $scope$.getExtensions().get($index$),\n"
" (com.google.protobuf.Message) defaultExtensionInstance);\n"
"}\n",
- "scope", scope, "index", StrCat(field->index()), "class",
+ "scope", scope, "index", absl::StrCat(field->index()), "class",
name_resolver_->GetImmutableClassName(field->message_type()));
} else {
printer->Print("registry.add($scope$.getExtensions().get($index$));\n",
- "scope", scope, "index", StrCat(field->index()));
+ "scope", scope, "index", absl::StrCat(field->index()));
}
}
printer->Print(
@@ -704,15 +712,18 @@
options_.annotate_code ? &annotation_collector : nullptr);
printer.Print(
- "//Generated by the protocol buffer compiler. DO NOT EDIT!\n"
+ "// Generated by the protocol buffer compiler. DO NOT EDIT!\n"
"// source: $filename$\n"
"\n",
"filename", descriptor->file()->name());
+ printer.Print(
+ "// Generated files should ignore deprecation warnings\n"
+ "@file:Suppress(\"DEPRECATION\")");
if (!java_package_.empty()) {
printer.Print(
"package $package$;\n"
"\n",
- "package", java_package_);
+ "package", EscapeKotlinKeywords(java_package_));
}
generator->GenerateKotlinMembers(&printer);
@@ -736,4 +747,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/compiler/java/file.h b/src/google/protobuf/compiler/java/file.h
index b2e0373..bf1e23b 100644
--- a/src/google/protobuf/compiler/java/file.h
+++ b/src/google/protobuf/compiler/java/file.h
@@ -39,8 +39,8 @@
#include <string>
#include <vector>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/compiler/java/options.h>
+#include "google/protobuf/compiler/java/options.h"
+#include "google/protobuf/port.h"
namespace google {
namespace protobuf {
@@ -70,6 +70,8 @@
public:
FileGenerator(const FileDescriptor* file, const Options& options,
bool immutable_api = true);
+ FileGenerator(const FileGenerator&) = delete;
+ FileGenerator& operator=(const FileGenerator&) = delete;
~FileGenerator();
// Checks for problems that would otherwise lead to cryptic compile errors.
@@ -114,8 +116,6 @@
ClassNameResolver* name_resolver_;
const Options options_;
bool immutable_api_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FileGenerator);
};
} // namespace java
diff --git a/src/google/protobuf/compiler/java/generator.cc b/src/google/protobuf/compiler/java/generator.cc
index 85e3991..2f345ef 100644
--- a/src/google/protobuf/compiler/java/generator.cc
+++ b/src/google/protobuf/compiler/java/generator.cc
@@ -32,23 +32,23 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/compiler/java/generator.h>
+#include "google/protobuf/compiler/java/generator.h"
#include <memory>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/stubs/stringprintf.h>
-#include <google/protobuf/compiler/java/file.h>
-#include <google/protobuf/compiler/java/generator_factory.h>
-#include <google/protobuf/compiler/java/helpers.h>
-#include <google/protobuf/compiler/java/name_resolver.h>
-#include <google/protobuf/compiler/java/options.h>
-#include <google/protobuf/compiler/java/shared_code_generator.h>
-#include <google/protobuf/descriptor.pb.h>
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/io/zero_copy_stream.h"
+#include "absl/strings/str_format.h"
+#include "google/protobuf/compiler/java/file.h"
+#include "google/protobuf/compiler/java/generator_factory.h"
+#include "google/protobuf/compiler/java/helpers.h"
+#include "google/protobuf/compiler/java/name_resolver.h"
+#include "google/protobuf/compiler/java/options.h"
+#include "google/protobuf/compiler/java/shared_code_generator.h"
+#include "google/protobuf/descriptor.pb.h"
-#include <google/protobuf/stubs/strutil.h>
+#include "google/protobuf/stubs/strutil.h"
namespace google {
namespace protobuf {
@@ -74,6 +74,8 @@
ParseGeneratorParameter(parameter, &options);
Options file_options;
+ file_options.opensource_runtime = opensource_runtime_;
+
for (int i = 0; i < options.size(); i++) {
if (options[i].first == "output_list_file") {
file_options.output_list_file = options[i].second;
diff --git a/src/google/protobuf/compiler/java/generator.h b/src/google/protobuf/compiler/java/generator.h
index bbc7170..fc7755c 100644
--- a/src/google/protobuf/compiler/java/generator.h
+++ b/src/google/protobuf/compiler/java/generator.h
@@ -38,10 +38,10 @@
#define GOOGLE_PROTOBUF_COMPILER_JAVA_GENERATOR_H__
#include <string>
-#include <google/protobuf/compiler/code_generator.h>
+#include "google/protobuf/compiler/code_generator.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -55,6 +55,8 @@
class PROTOC_EXPORT JavaGenerator : public CodeGenerator {
public:
JavaGenerator();
+ JavaGenerator(const JavaGenerator&) = delete;
+ JavaGenerator& operator=(const JavaGenerator&) = delete;
~JavaGenerator() override;
// implements CodeGenerator ----------------------------------------
@@ -63,8 +65,12 @@
uint64_t GetSupportedFeatures() const override;
+ void set_opensource_runtime(bool opensource) {
+ opensource_runtime_ = opensource;
+ }
+
private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(JavaGenerator);
+ bool opensource_runtime_ = PROTO2_IS_OSS;
};
} // namespace java
@@ -72,6 +78,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_COMPILER_JAVA_GENERATOR_H__
diff --git a/src/google/protobuf/compiler/java/generator_factory.cc b/src/google/protobuf/compiler/java/generator_factory.cc
index dd526ba..86baf0b 100644
--- a/src/google/protobuf/compiler/java/generator_factory.cc
+++ b/src/google/protobuf/compiler/java/generator_factory.cc
@@ -30,17 +30,17 @@
// Author: liujisi@google.com (Pherl Liu)
-#include <google/protobuf/compiler/java/generator_factory.h>
+#include "google/protobuf/compiler/java/generator_factory.h"
-#include <google/protobuf/compiler/java/context.h>
-#include <google/protobuf/compiler/java/enum_field.h>
-#include <google/protobuf/compiler/java/extension.h>
-#include <google/protobuf/compiler/java/extension_lite.h>
-#include <google/protobuf/compiler/java/field.h>
-#include <google/protobuf/compiler/java/helpers.h>
-#include <google/protobuf/compiler/java/message.h>
-#include <google/protobuf/compiler/java/message_lite.h>
-#include <google/protobuf/compiler/java/service.h>
+#include "google/protobuf/compiler/java/context.h"
+#include "google/protobuf/compiler/java/enum_field.h"
+#include "google/protobuf/compiler/java/extension.h"
+#include "google/protobuf/compiler/java/extension_lite.h"
+#include "google/protobuf/compiler/java/field.h"
+#include "google/protobuf/compiler/java/helpers.h"
+#include "google/protobuf/compiler/java/message.h"
+#include "google/protobuf/compiler/java/message_lite.h"
+#include "google/protobuf/compiler/java/service.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/compiler/java/generator_factory.h b/src/google/protobuf/compiler/java/generator_factory.h
index 807bca3..b2fb054 100644
--- a/src/google/protobuf/compiler/java/generator_factory.h
+++ b/src/google/protobuf/compiler/java/generator_factory.h
@@ -33,7 +33,7 @@
#ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_GENERATOR_FACTORY_H__
#define GOOGLE_PROTOBUF_COMPILER_JAVA_GENERATOR_FACTORY_H__
-#include <google/protobuf/stubs/common.h>
+#include "google/protobuf/port.h"
namespace google {
namespace protobuf {
@@ -59,6 +59,8 @@
class GeneratorFactory {
public:
GeneratorFactory();
+ GeneratorFactory(const GeneratorFactory&) = delete;
+ GeneratorFactory& operator=(const GeneratorFactory&) = delete;
virtual ~GeneratorFactory();
virtual MessageGenerator* NewMessageGenerator(
@@ -69,15 +71,15 @@
virtual ServiceGenerator* NewServiceGenerator(
const ServiceDescriptor* descriptor) const = 0;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(GeneratorFactory);
};
// Factory that creates generators for immutable-default messages.
class ImmutableGeneratorFactory : public GeneratorFactory {
public:
ImmutableGeneratorFactory(Context* context);
+ ImmutableGeneratorFactory(const ImmutableGeneratorFactory&) = delete;
+ ImmutableGeneratorFactory& operator=(const ImmutableGeneratorFactory&) =
+ delete;
~ImmutableGeneratorFactory() override;
MessageGenerator* NewMessageGenerator(
@@ -91,7 +93,6 @@
private:
Context* context_;
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableGeneratorFactory);
};
diff --git a/src/google/protobuf/compiler/java/helpers.cc b/src/google/protobuf/compiler/java/helpers.cc
index 15ee8f5..553f004 100644
--- a/src/google/protobuf/compiler/java/helpers.cc
+++ b/src/google/protobuf/compiler/java/helpers.cc
@@ -32,25 +32,29 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/compiler/java/helpers.h>
+#include "google/protobuf/compiler/java/helpers.h"
#include <algorithm>
#include <cstdint>
#include <limits>
-#include <unordered_set>
#include <vector>
-#include <google/protobuf/wire_format.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/stringprintf.h>
-#include <google/protobuf/stubs/substitute.h>
-#include <google/protobuf/compiler/java/name_resolver.h>
-#include <google/protobuf/compiler/java/names.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/stubs/hash.h> // for hash<T *>
+#include "google/protobuf/wire_format.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "absl/container/flat_hash_set.h"
+#include "absl/strings/ascii.h"
+#include "absl/strings/escaping.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/str_format.h"
+#include "absl/strings/str_replace.h"
+#include "absl/strings/str_split.h"
+#include "absl/strings/string_view.h"
+#include "absl/strings/substitute.h"
+#include "google/protobuf/compiler/java/name_resolver.h"
+#include "google/protobuf/descriptor.pb.h"
// Must be last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -65,78 +69,9 @@
const char kThinSeparator[] =
"// -------------------------------------------------------------------\n";
-namespace {
-
-const char* kDefaultPackage = "";
-
-// Names that should be avoided (in UpperCamelCase format).
-// Using them will cause the compiler to generate accessors whose names
-// collide with methods defined in base classes.
-// Keep this list in sync with specialFieldNames in
-// java/core/src/main/java/com/google/protobuf/DescriptorMessageInfoFactory.java
-const char* kForbiddenWordList[] = {
- // java.lang.Object:
- "Class",
- // com.google.protobuf.MessageLiteOrBuilder:
- "DefaultInstanceForType",
- // com.google.protobuf.MessageLite:
- "ParserForType",
- "SerializedSize",
- // com.google.protobuf.MessageOrBuilder:
- "AllFields",
- "DescriptorForType",
- "InitializationErrorString",
- "UnknownFields",
- // obsolete. kept for backwards compatibility of generated code
- "CachedSize",
-};
-
-const std::unordered_set<std::string>* kReservedNames =
- new std::unordered_set<std::string>({
- "abstract", "assert", "boolean", "break", "byte",
- "case", "catch", "char", "class", "const",
- "continue", "default", "do", "double", "else",
- "enum", "extends", "final", "finally", "float",
- "for", "goto", "if", "implements", "import",
- "instanceof", "int", "interface", "long", "native",
- "new", "package", "private", "protected", "public",
- "return", "short", "static", "strictfp", "super",
- "switch", "synchronized", "this", "throw", "throws",
- "transient", "try", "void", "volatile", "while",
- });
-
-bool IsForbidden(const std::string& field_name) {
- for (int i = 0; i < GOOGLE_ARRAYSIZE(kForbiddenWordList); ++i) {
- if (UnderscoresToCamelCase(field_name, true) == kForbiddenWordList[i]) {
- return true;
- }
- }
- return false;
-}
-
-std::string FieldName(const FieldDescriptor* field) {
- std::string field_name;
- // Groups are hacky: The name of the field is just the lower-cased name
- // of the group type. In Java, though, we would like to retain the original
- // capitalization of the type name.
- if (GetType(field) == FieldDescriptor::TYPE_GROUP) {
- field_name = field->message_type()->name();
- } else {
- field_name = field->name();
- }
- if (IsForbidden(field_name)) {
- // Append a trailing "#" to indicate that the name should be decorated to
- // avoid collision with other names.
- field_name += "#";
- }
- return field_name;
-}
-
-
-} // namespace
-
void PrintGeneratedAnnotation(io::Printer* printer, char delimiter,
- const std::string& annotation_file) {
+ const std::string& annotation_file,
+ Options options) {
if (annotation_file.empty()) {
return;
}
@@ -155,8 +90,8 @@
const char* var_name,
const char* terminating_string, bool enforce_lite) {
std::string enum_verifier_string =
- enforce_lite ? StrCat(var_name, ".internalGetVerifier()")
- : StrCat(
+ enforce_lite ? absl::StrCat(var_name, ".internalGetVerifier()")
+ : absl::StrCat(
"new com.google.protobuf.Internal.EnumVerifier() {\n"
" @java.lang.Override\n"
" public boolean isInRange(int number) {\n"
@@ -167,7 +102,7 @@
" }");
printer->Print(
variables,
- StrCat(enum_verifier_string, terminating_string).c_str());
+ absl::StrCat(enum_verifier_string, terminating_string).c_str());
}
std::string UnderscoresToCamelCase(const std::string& input,
@@ -216,7 +151,7 @@
if (i == '_') {
capitalize_next = true;
} else if (capitalize_next) {
- result.push_back(ToUpperCh(i));
+ result.push_back(absl::ascii_toupper(i));
capitalize_next = false;
} else {
result.push_back(i);
@@ -225,62 +160,43 @@
// Lower-case the first letter.
if (lower_first && !result.empty()) {
- result[0] = ToLowerCh(result[0]);
+ result[0] = absl::ascii_tolower(result[0]);
}
return result;
}
-char ToUpperCh(char ch) {
- return (ch >= 'a' && ch <= 'z') ? (ch - 'a' + 'A') : ch;
-}
-
-char ToLowerCh(char ch) {
- return (ch >= 'A' && ch <= 'Z') ? (ch - 'A' + 'a') : ch;
-}
-
-std::string UnderscoresToCamelCase(const FieldDescriptor* field) {
- return UnderscoresToCamelCase(FieldName(field), false);
-}
-
-std::string UnderscoresToCapitalizedCamelCase(const FieldDescriptor* field) {
- return UnderscoresToCamelCase(FieldName(field), true);
-}
-
-std::string CapitalizedFieldName(const FieldDescriptor* field) {
- return UnderscoresToCapitalizedCamelCase(field);
-}
-
-std::string UnderscoresToCamelCase(const MethodDescriptor* method) {
- return UnderscoresToCamelCase(method->name(), false);
-}
-
-std::string UnderscoresToCamelCaseCheckReserved(const FieldDescriptor* field) {
- std::string name = UnderscoresToCamelCase(field);
- if (kReservedNames->find(name) != kReservedNames->end()) {
- return name + "_";
- }
- return name;
-}
-
// Names that should be avoided as field names in Kotlin.
// All Kotlin hard keywords are in this list.
-const std::unordered_set<std::string>* kKotlinForbiddenNames =
- new std::unordered_set<std::string>({
- "as", "as?", "break", "class", "continue", "do", "else",
- "false", "for", "fun", "if", "in", "!in", "interface",
- "is", "!is", "null", "object", "package", "return", "super",
- "this", "throw", "true", "try", "typealias", "typeof", "val",
- "var", "when", "while",
- });
+bool IsForbiddenKotlin(absl::string_view field_name) {
+ static const auto& kKotlinForbiddenNames =
+ *new absl::flat_hash_set<absl::string_view>({
+ "as", "as?", "break", "class", "continue", "do",
+ "else", "false", "for", "fun", "if", "in",
+ "!in", "interface", "is", "!is", "null", "object",
+ "package", "return", "super", "this", "throw", "true",
+ "try", "typealias", "typeof", "val", "var", "when",
+ "while",
+ });
-bool IsForbiddenKotlin(const std::string& field_name) {
- return kKotlinForbiddenNames->find(field_name) !=
- kKotlinForbiddenNames->end();
+ return kKotlinForbiddenNames.contains(field_name);
+}
+
+std::string EscapeKotlinKeywords(std::string name) {
+ std::vector<std::string> escaped_packages;
+ std::vector<std::string> packages = absl::StrSplit(name, "."); // NOLINT
+ for (const std::string& package : packages) {
+ if (IsForbiddenKotlin(package)) {
+ escaped_packages.push_back("`" + package + "`");
+ } else {
+ escaped_packages.push_back(package);
+ }
+ }
+ return absl::StrJoin(escaped_packages, ".");
}
std::string UniqueFileScopeIdentifier(const Descriptor* descriptor) {
- return "static_" + StringReplace(descriptor->full_name(), ".", "_", true);
+ return "static_" + absl::StrReplaceAll(descriptor->full_name(), {{".", "_"}});
}
std::string CamelCaseFieldName(const FieldDescriptor* field) {
@@ -292,57 +208,15 @@
}
std::string FileClassName(const FileDescriptor* file, bool immutable) {
- ClassNameResolver name_resolver;
- return name_resolver.GetFileClassName(file, immutable);
-}
-
-std::string FileJavaPackage(const FileDescriptor* file, bool immutable) {
- std::string result;
-
- if (file->options().has_java_package()) {
- result = file->options().java_package();
- } else {
- result = kDefaultPackage;
- if (!file->package().empty()) {
- if (!result.empty()) result += '.';
- result += file->package();
- }
- }
-
- return result;
-}
-
-std::string FileJavaPackage(const FileDescriptor* file) {
- return FileJavaPackage(file, true /* immutable */);
+ return ClassNameResolver().GetFileClassName(file, immutable);
}
std::string JavaPackageToDir(std::string package_name) {
- std::string package_dir = StringReplace(package_name, ".", "/", true);
+ std::string package_dir = absl::StrReplaceAll(package_name, {{".", "/"}});
if (!package_dir.empty()) package_dir += "/";
return package_dir;
}
-std::string ClassName(const Descriptor* descriptor) {
- ClassNameResolver name_resolver;
- return name_resolver.GetClassName(descriptor, true);
-}
-
-std::string ClassName(const EnumDescriptor* descriptor) {
- ClassNameResolver name_resolver;
- return name_resolver.GetClassName(descriptor, true);
-}
-
-std::string ClassName(const ServiceDescriptor* descriptor) {
- ClassNameResolver name_resolver;
- return name_resolver.GetClassName(descriptor, true);
-}
-
-std::string ClassName(const FileDescriptor* descriptor) {
- ClassNameResolver name_resolver;
- return name_resolver.GetClassName(descriptor, true);
-}
-
-
std::string ExtraMessageInterfaces(const Descriptor* descriptor) {
std::string interfaces = "// @@protoc_insertion_point(message_implements:" +
descriptor->full_name() + ")";
@@ -364,7 +238,7 @@
std::string FieldConstantName(const FieldDescriptor* field) {
std::string name = field->name() + "_FIELD_NUMBER";
- ToUpper(&name);
+ absl::AsciiStrToUpper(&name);
return name;
}
@@ -519,7 +393,7 @@
case JAVATYPE_ENUM:
return "java.lang.Integer";
case JAVATYPE_MESSAGE:
- return ClassName(field->message_type());
+ return ClassNameResolver().GetClassName(field->message_type(), true);
default:
return BoxedPrimitiveTypeName(javaType);
}
@@ -582,19 +456,19 @@
}
std::string DefaultValue(const FieldDescriptor* field, bool immutable,
- ClassNameResolver* name_resolver) {
+ ClassNameResolver* name_resolver, Options options) {
// Switch on CppType since we need to know which default_value_* method
// of FieldDescriptor to call.
switch (field->cpp_type()) {
case FieldDescriptor::CPPTYPE_INT32:
- return StrCat(field->default_value_int32());
+ return absl::StrCat(field->default_value_int32());
case FieldDescriptor::CPPTYPE_UINT32:
// Need to print as a signed int since Java has no unsigned.
- return StrCat(static_cast<int32_t>(field->default_value_uint32()));
+ return absl::StrCat(static_cast<int32_t>(field->default_value_uint32()));
case FieldDescriptor::CPPTYPE_INT64:
- return StrCat(field->default_value_int64()) + "L";
+ return absl::StrCat(field->default_value_int64()) + "L";
case FieldDescriptor::CPPTYPE_UINT64:
- return StrCat(static_cast<int64_t>(field->default_value_uint64())) +
+ return absl::StrCat(static_cast<int64_t>(field->default_value_uint64())) +
"L";
case FieldDescriptor::CPPTYPE_DOUBLE: {
double value = field->default_value_double();
@@ -626,21 +500,21 @@
if (GetType(field) == FieldDescriptor::TYPE_BYTES) {
if (field->has_default_value()) {
// See comments in Internal.java for gory details.
- return strings::Substitute(
+ return absl::Substitute(
"com.google.protobuf.Internal.bytesDefaultValue(\"$0\")",
- CEscape(field->default_value_string()));
+ absl::CEscape(field->default_value_string()));
} else {
return "com.google.protobuf.ByteString.EMPTY";
}
} else {
if (AllAscii(field->default_value_string())) {
// All chars are ASCII. In this case CEscape() works fine.
- return "\"" + CEscape(field->default_value_string()) + "\"";
+ return "\"" + absl::CEscape(field->default_value_string()) + "\"";
} else {
// See comments in Internal.java for gory details.
- return strings::Substitute(
+ return absl::Substitute(
"com.google.protobuf.Internal.stringDefaultValue(\"$0\")",
- CEscape(field->default_value_string()));
+ absl::CEscape(field->default_value_string()));
}
}
@@ -713,7 +587,7 @@
std::string GetBitFieldName(int index) {
std::string varName = "bitField";
- varName += StrCat(index);
+ varName += absl::StrCat(index);
varName += "_";
return varName;
}
@@ -806,7 +680,8 @@
return false;
}
-const char* GetCapitalizedType(const FieldDescriptor* field, bool immutable) {
+const char* GetCapitalizedType(const FieldDescriptor* field, bool immutable,
+ Options options) {
switch (GetType(field)) {
case FieldDescriptor::TYPE_INT32:
return "Int32";
@@ -923,7 +798,7 @@
// already_seen is used to avoid checking the same type multiple times
// (and also to protect against recursion).
bool HasRequiredFields(const Descriptor* type,
- std::unordered_set<const Descriptor*>* already_seen) {
+ absl::flat_hash_set<const Descriptor*>* already_seen) {
if (already_seen->count(type) > 0) {
// The type is already in cache. This means that either:
// a. The type has no required fields.
@@ -958,7 +833,7 @@
}
bool HasRequiredFields(const Descriptor* type) {
- std::unordered_set<const Descriptor*> already_seen;
+ absl::flat_hash_set<const Descriptor*> already_seen;
return HasRequiredFields(type, &already_seen);
}
@@ -1103,7 +978,7 @@
} else if (code >= 0x20 && code <= 0x7f) {
output->push_back(static_cast<char>(code));
} else {
- output->append(StringPrintf("\\u%04x", code));
+ output->append(absl::StrFormat("\\u%04x", code));
}
}
@@ -1112,4 +987,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/compiler/java/helpers.h b/src/google/protobuf/compiler/java/helpers.h
index 9f1a557..9273ae3 100644
--- a/src/google/protobuf/compiler/java/helpers.h
+++ b/src/google/protobuf/compiler/java/helpers.h
@@ -38,10 +38,15 @@
#include <cstdint>
#include <string>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/compiler/java/context.h>
-#include <google/protobuf/descriptor.pb.h>
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/descriptor.h"
+#include "absl/strings/string_view.h"
+#include "google/protobuf/compiler/java/names.h"
+#include "google/protobuf/compiler/java/options.h"
+#include "google/protobuf/descriptor.pb.h"
+
+// Must be last.
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -53,7 +58,7 @@
extern const char kThickSeparator[];
extern const char kThinSeparator[];
-bool IsForbiddenKotlin(const std::string& field_name);
+bool IsForbiddenKotlin(absl::string_view field_name);
// If annotation_file is non-empty, prints a javax.annotation.Generated
// annotation to the given Printer. annotation_file will be referenced in the
@@ -64,7 +69,8 @@
// annotation_file should be generated from the filename of the source file
// being annotated (which in turn must be a Java identifier plus ".java").
void PrintGeneratedAnnotation(io::Printer* printer, char delimiter = '$',
- const std::string& annotation_file = "");
+ const std::string& annotation_file = "",
+ Options options = {});
// If a GeneratedMessageLite contains non-lite enums, then its verifier
// must be instantiated inline, rather than retrieved from the enum class.
@@ -78,25 +84,6 @@
// first letter.
std::string ToCamelCase(const std::string& input, bool lower_first);
-char ToUpperCh(char ch);
-char ToLowerCh(char ch);
-
-// Converts a name to camel-case. If cap_first_letter is true, capitalize the
-// first letter.
-std::string UnderscoresToCamelCase(const std::string& name,
- bool cap_first_letter);
-// Converts the field's name to camel-case, e.g. "foo_bar_baz" becomes
-// "fooBarBaz" or "FooBarBaz", respectively.
-std::string UnderscoresToCamelCase(const FieldDescriptor* field);
-std::string UnderscoresToCapitalizedCamelCase(const FieldDescriptor* field);
-
-// Similar, but for method names. (Typically, this merely has the effect
-// of lower-casing the first letter of the name.)
-std::string UnderscoresToCamelCase(const MethodDescriptor* method);
-
-// Same as UnderscoresToCamelCase, but checks for reserved keywords
-std::string UnderscoresToCamelCaseCheckReserved(const FieldDescriptor* field);
-
// Similar to UnderscoresToCamelCase, but guarantees that the result is a
// complete Java identifier by adding a _ if needed.
std::string CamelCaseFieldName(const FieldDescriptor* field);
@@ -113,11 +100,15 @@
std::string FileClassName(const FileDescriptor* file, bool immutable = true);
// Returns the file's Java package name.
-std::string FileJavaPackage(const FileDescriptor* file, bool immutable);
+std::string FileJavaPackage(const FileDescriptor* file, bool immutable,
+ Options options = {});
// Returns output directory for the given package name.
std::string JavaPackageToDir(std::string package_name);
+// Returns the name with Kotlin keywords enclosed in backticks
+std::string EscapeKotlinKeywords(std::string name);
+
// Comma-separate list of option-specified interfaces implemented by the
// Message, to follow the "implements" declaration of the Message definition.
std::string ExtraMessageInterfaces(const Descriptor* descriptor);
@@ -198,18 +189,6 @@
return descriptor->name() + suffix + ".java.pb.meta";
}
-template <typename Descriptor>
-void MaybePrintGeneratedAnnotation(Context* context, io::Printer* printer,
- Descriptor* descriptor, bool immutable,
- const std::string& suffix = "") {
- if (IsOwnFile(descriptor, immutable)) {
- PrintGeneratedAnnotation(printer, '$',
- context->options().annotate_code
- ? AnnotationFileName(descriptor, suffix)
- : "");
- }
-}
-
// Get the unqualified name that should be used for a field's field
// number constant.
std::string FieldConstantName(const FieldDescriptor* field);
@@ -251,10 +230,12 @@
class ClassNameResolver;
std::string DefaultValue(const FieldDescriptor* field, bool immutable,
- ClassNameResolver* name_resolver);
+ ClassNameResolver* name_resolver,
+ Options options = {});
inline std::string ImmutableDefaultValue(const FieldDescriptor* field,
- ClassNameResolver* name_resolver) {
- return DefaultValue(field, true, name_resolver);
+ ClassNameResolver* name_resolver,
+ Options options = {}) {
+ return DefaultValue(field, true, name_resolver, options);
}
bool IsDefaultValueJavaDefault(const FieldDescriptor* field);
bool IsByteStringWithCustomDefaultValue(const FieldDescriptor* field);
@@ -333,7 +314,8 @@
// Returns the capitalized name for calling relative functions in
// CodedInputStream
-const char* GetCapitalizedType(const FieldDescriptor* field, bool immutable);
+const char* GetCapitalizedType(const FieldDescriptor* field, bool immutable,
+ Options options);
// For encodings with fixed sizes, returns that size in bytes. Otherwise
// returns -1.
@@ -471,4 +453,5 @@
} // namespace protobuf
} // namespace google
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_COMPILER_JAVA_HELPERS_H__
diff --git a/src/google/protobuf/compiler/java/java_generator.h b/src/google/protobuf/compiler/java/java_generator.h
index 294b1bd..2058371 100644
--- a/src/google/protobuf/compiler/java/java_generator.h
+++ b/src/google/protobuf/compiler/java/java_generator.h
@@ -1,6 +1,6 @@
#ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_JAVA_GENERATOR_H_
#define GOOGLE_PROTOBUF_COMPILER_JAVA_JAVA_GENERATOR_H_
-#include <google/protobuf/compiler/java/generator.h>
+#include "google/protobuf/compiler/java/generator.h"
#endif // GOOGLE_PROTOBUF_COMPILER_JAVA_JAVA_GENERATOR_H_
diff --git a/src/google/protobuf/compiler/java/kotlin_generator.cc b/src/google/protobuf/compiler/java/kotlin_generator.cc
index 1af548a..3470ccb 100644
--- a/src/google/protobuf/compiler/java/kotlin_generator.cc
+++ b/src/google/protobuf/compiler/java/kotlin_generator.cc
@@ -28,13 +28,13 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/compiler/java/kotlin_generator.h>
+#include "google/protobuf/compiler/java/kotlin_generator.h"
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/compiler/java/file.h>
-#include <google/protobuf/compiler/java/generator.h>
-#include <google/protobuf/compiler/java/helpers.h>
-#include <google/protobuf/compiler/java/options.h>
+#include "google/protobuf/compiler/code_generator.h"
+#include "google/protobuf/compiler/java/file.h"
+#include "google/protobuf/compiler/java/generator.h"
+#include "google/protobuf/compiler/java/helpers.h"
+#include "google/protobuf/compiler/java/options.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/compiler/java/kotlin_generator.h b/src/google/protobuf/compiler/java/kotlin_generator.h
index ccd9688..312b653 100644
--- a/src/google/protobuf/compiler/java/kotlin_generator.h
+++ b/src/google/protobuf/compiler/java/kotlin_generator.h
@@ -35,10 +35,10 @@
#include <string>
-#include <google/protobuf/compiler/code_generator.h>
+#include "google/protobuf/compiler/code_generator.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -52,6 +52,8 @@
class PROTOC_EXPORT KotlinGenerator : public CodeGenerator {
public:
KotlinGenerator();
+ KotlinGenerator(const KotlinGenerator&) = delete;
+ KotlinGenerator& operator=(const KotlinGenerator&) = delete;
~KotlinGenerator() override;
// implements CodeGenerator ----------------------------------------
@@ -59,9 +61,6 @@
GeneratorContext* context, std::string* error) const override;
uint64_t GetSupportedFeatures() const override;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(KotlinGenerator);
};
} // namespace java
@@ -69,6 +68,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_COMPILER_JAVA_KOTLIN_GENERATOR_H__
diff --git a/src/google/protobuf/compiler/java/map_field.cc b/src/google/protobuf/compiler/java/map_field.cc
index 89abbab..2f162af 100644
--- a/src/google/protobuf/compiler/java/map_field.cc
+++ b/src/google/protobuf/compiler/java/map_field.cc
@@ -28,16 +28,16 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/compiler/java/map_field.h>
+#include "google/protobuf/compiler/java/map_field.h"
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/compiler/java/context.h>
-#include <google/protobuf/compiler/java/doc_comment.h>
-#include <google/protobuf/compiler/java/helpers.h>
-#include <google/protobuf/compiler/java/name_resolver.h>
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/compiler/java/context.h"
+#include "google/protobuf/compiler/java/doc_comment.h"
+#include "google/protobuf/compiler/java/helpers.h"
+#include "google/protobuf/compiler/java/name_resolver.h"
// Must be last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -102,7 +102,12 @@
const JavaType keyJavaType = GetJavaType(key);
const JavaType valueJavaType = GetJavaType(value);
- std::string pass_through_nullness = "/* nullable */\n";
+ // The code that generates the open-source version appears not to understand
+ // #else, so we have an #ifndef instead.
+ std::string pass_through_nullness =
+ context->options().opensource_runtime
+ ? "/* nullable */\n"
+ : "@com.google.protobuf.Internal.ProtoPassThroughNullness ";
(*variables)["key_type"] = TypeName(key, name_resolver, false);
std::string boxed_key_type = TypeName(key, name_resolver, true);
@@ -113,7 +118,8 @@
(*variables)["short_key_type"] =
boxed_key_type.substr(boxed_key_type.rfind('.') + 1);
(*variables)["key_wire_type"] = WireType(key);
- (*variables)["key_default_value"] = DefaultValue(key, true, name_resolver);
+ (*variables)["key_default_value"] =
+ DefaultValue(key, true, name_resolver, context->options());
(*variables)["key_null_check"] =
IsReferenceType(keyJavaType)
? "if (key == null) { throw new NullPointerException(\"map key\"); }"
@@ -127,10 +133,13 @@
if (valueJavaType == JAVATYPE_ENUM) {
// We store enums as Integers internally.
(*variables)["value_type"] = "int";
+ (*variables)["value_type_pass_through_nullness"] =
+ (*variables)["value_type"];
(*variables)["boxed_value_type"] = "java.lang.Integer";
(*variables)["value_wire_type"] = WireType(value);
(*variables)["value_default_value"] =
- DefaultValue(value, true, name_resolver) + ".getNumber()";
+ DefaultValue(value, true, name_resolver, context->options()) +
+ ".getNumber()";
(*variables)["value_enum_type"] = TypeName(value, name_resolver, false);
@@ -144,7 +153,7 @@
} else {
// Map unknown values to the default value if we don't have UNRECOGNIZED.
(*variables)["unrecognized_value"] =
- DefaultValue(value, true, name_resolver);
+ DefaultValue(value, true, name_resolver, context->options());
}
} else {
(*variables)["value_type"] = TypeName(value, name_resolver, false);
@@ -156,7 +165,7 @@
(*variables)["boxed_value_type"] = TypeName(value, name_resolver, true);
(*variables)["value_wire_type"] = WireType(value);
(*variables)["value_default_value"] =
- DefaultValue(value, true, name_resolver);
+ DefaultValue(value, true, name_resolver, context->options());
}
(*variables)["type_parameters"] =
(*variables)["boxed_key_type"] + ", " + (*variables)["boxed_value_type"];
@@ -185,7 +194,9 @@
ImmutableMapFieldGenerator::ImmutableMapFieldGenerator(
const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex,
Context* context)
- : descriptor_(descriptor), name_resolver_(context->GetNameResolver()) {
+ : descriptor_(descriptor),
+ name_resolver_(context->GetNameResolver()),
+ context_(context) {
SetMessageVariables(descriptor, messageBitIndex, builderBitIndex,
context->GetFieldGeneratorInfo(descriptor), context,
&variables_);
@@ -209,14 +220,16 @@
" $key_type$ key);\n");
printer->Annotate("{", "}", descriptor_);
if (GetJavaType(ValueField(descriptor_)) == JAVATYPE_ENUM) {
- printer->Print(variables_,
- "/**\n"
- " * Use {@link #get$capitalized_name$Map()} instead.\n"
- " */\n"
- "@java.lang.Deprecated\n"
- "java.util.Map<$boxed_key_type$, $value_enum_type$>\n"
- "${$get$capitalized_name$$}$();\n");
- printer->Annotate("{", "}", descriptor_);
+ if (context_->options().opensource_runtime) {
+ printer->Print(variables_,
+ "/**\n"
+ " * Use {@link #get$capitalized_name$Map()} instead.\n"
+ " */\n"
+ "@java.lang.Deprecated\n"
+ "java.util.Map<$boxed_key_type$, $value_enum_type$>\n"
+ "${$get$capitalized_name$$}$();\n");
+ printer->Annotate("{", "}", descriptor_);
+ }
WriteFieldDocComment(printer, descriptor_);
printer->Print(
variables_,
@@ -255,9 +268,10 @@
WriteFieldDocComment(printer, descriptor_);
printer->Print(variables_,
"$deprecation$\n"
- "$value_type$ ${$get$capitalized_name$ValueOrDefault$}$(\n"
+ "$value_type_pass_through_nullness$ "
+ "${$get$capitalized_name$ValueOrDefault$}$(\n"
" $key_type$ key,\n"
- " $value_type$ defaultValue);\n");
+ " $value_type_pass_through_nullness$ defaultValue);\n");
printer->Annotate("{", "}", descriptor_);
WriteFieldDocComment(printer, descriptor_);
printer->Print(variables_,
@@ -267,14 +281,16 @@
printer->Annotate("{", "}", descriptor_);
}
} else {
- printer->Print(variables_,
- "/**\n"
- " * Use {@link #get$capitalized_name$Map()} instead.\n"
- " */\n"
- "@java.lang.Deprecated\n"
- "java.util.Map<$type_parameters$>\n"
- "${$get$capitalized_name$$}$();\n");
- printer->Annotate("{", "}", descriptor_);
+ if (context_->options().opensource_runtime) {
+ printer->Print(variables_,
+ "/**\n"
+ " * Use {@link #get$capitalized_name$Map()} instead.\n"
+ " */\n"
+ "@java.lang.Deprecated\n"
+ "java.util.Map<$type_parameters$>\n"
+ "${$get$capitalized_name$$}$();\n");
+ printer->Annotate("{", "}", descriptor_);
+ }
WriteFieldDocComment(printer, descriptor_);
printer->Print(variables_,
"$deprecation$java.util.Map<$type_parameters$>\n"
@@ -391,18 +407,20 @@
"}\n");
printer->Annotate("{", "}", descriptor_);
if (GetJavaType(ValueField(descriptor_)) == JAVATYPE_ENUM) {
- printer->Print(
- variables_,
- "/**\n"
- " * Use alternate mutation accessors instead.\n"
- " */\n"
- "@java.lang.Deprecated\n"
- "public java.util.Map<$boxed_key_type$, $value_enum_type$>\n"
- "${$getMutable$capitalized_name$$}$() {\n"
- " return internalGetAdapted$capitalized_name$Map(\n"
- " internalGetMutable$capitalized_name$().getMutableMap());\n"
- "}\n");
- printer->Annotate("{", "}", descriptor_);
+ if (context_->options().opensource_runtime) {
+ printer->Print(
+ variables_,
+ "/**\n"
+ " * Use alternate mutation accessors instead.\n"
+ " */\n"
+ "@java.lang.Deprecated\n"
+ "public java.util.Map<$boxed_key_type$, $value_enum_type$>\n"
+ "${$getMutable$capitalized_name$$}$() {\n"
+ " return internalGetAdapted$capitalized_name$Map(\n"
+ " internalGetMutable$capitalized_name$().getMutableMap());\n"
+ "}\n");
+ printer->Annotate("{", "}", descriptor_);
+ }
WriteFieldDocComment(printer, descriptor_);
printer->Print(variables_,
"$deprecation$public Builder ${$put$capitalized_name$$}$(\n"
@@ -427,17 +445,19 @@
"}\n");
printer->Annotate("{", "}", descriptor_);
if (SupportUnknownEnumValue(descriptor_->file())) {
- printer->Print(
- variables_,
- "/**\n"
- " * Use alternate mutation accessors instead.\n"
- " */\n"
- "@java.lang.Deprecated\n"
- "public java.util.Map<$boxed_key_type$, $boxed_value_type$>\n"
- "${$getMutable$capitalized_name$Value$}$() {\n"
- " return internalGetMutable$capitalized_name$().getMutableMap();\n"
- "}\n");
- printer->Annotate("{", "}", descriptor_);
+ if (context_->options().opensource_runtime) {
+ printer->Print(
+ variables_,
+ "/**\n"
+ " * Use alternate mutation accessors instead.\n"
+ " */\n"
+ "@java.lang.Deprecated\n"
+ "public java.util.Map<$boxed_key_type$, $boxed_value_type$>\n"
+ "${$getMutable$capitalized_name$Value$}$() {\n"
+ " return internalGetMutable$capitalized_name$().getMutableMap();\n"
+ "}\n");
+ printer->Annotate("{", "}", descriptor_);
+ }
WriteFieldDocComment(printer, descriptor_);
printer->Print(
variables_,
@@ -463,17 +483,19 @@
printer->Annotate("{", "}", descriptor_);
}
} else {
- printer->Print(
- variables_,
- "/**\n"
- " * Use alternate mutation accessors instead.\n"
- " */\n"
- "@java.lang.Deprecated\n"
- "public java.util.Map<$type_parameters$>\n"
- "${$getMutable$capitalized_name$$}$() {\n"
- " return internalGetMutable$capitalized_name$().getMutableMap();\n"
- "}\n");
- printer->Annotate("{", "}", descriptor_);
+ if (context_->options().opensource_runtime) {
+ printer->Print(
+ variables_,
+ "/**\n"
+ " * Use alternate mutation accessors instead.\n"
+ " */\n"
+ "@java.lang.Deprecated\n"
+ "public java.util.Map<$type_parameters$>\n"
+ "${$getMutable$capitalized_name$$}$() {\n"
+ " return internalGetMutable$capitalized_name$().getMutableMap();\n"
+ "}\n");
+ printer->Annotate("{", "}", descriptor_);
+ }
WriteFieldDocComment(printer, descriptor_);
printer->Print(variables_,
"$deprecation$"
@@ -520,17 +542,20 @@
"}\n");
printer->Annotate("{", "}", descriptor_);
if (GetJavaType(ValueField(descriptor_)) == JAVATYPE_ENUM) {
- printer->Print(variables_,
- "/**\n"
- " * Use {@link #get$capitalized_name$Map()} instead.\n"
- " */\n"
- "@java.lang.Override\n"
- "@java.lang.Deprecated\n"
- "public java.util.Map<$boxed_key_type$, $value_enum_type$>\n"
- "${$get$capitalized_name$$}$() {\n"
- " return get$capitalized_name$Map();\n"
- "}\n");
- printer->Annotate("{", "}", descriptor_);
+ if (context_->options().opensource_runtime) {
+ printer->Print(
+ variables_,
+ "/**\n"
+ " * Use {@link #get$capitalized_name$Map()} instead.\n"
+ " */\n"
+ "@java.lang.Override\n"
+ "@java.lang.Deprecated\n"
+ "public java.util.Map<$boxed_key_type$, $value_enum_type$>\n"
+ "${$get$capitalized_name$$}$() {\n"
+ " return get$capitalized_name$Map();\n"
+ "}\n");
+ printer->Annotate("{", "}", descriptor_);
+ }
WriteFieldDocComment(printer, descriptor_);
printer->Print(variables_,
"@java.lang.Override\n"
@@ -602,9 +627,10 @@
variables_,
"@java.lang.Override\n"
"$deprecation$\n"
- "public $value_type$ ${$get$capitalized_name$ValueOrDefault$}$(\n"
+ "public $value_type_pass_through_nullness$ "
+ "${$get$capitalized_name$ValueOrDefault$}$(\n"
" $key_type$ key,\n"
- " $value_type$ defaultValue) {\n"
+ " $value_type_pass_through_nullness$ defaultValue) {\n"
" $key_null_check$\n"
" java.util.Map<$boxed_key_type$, $boxed_value_type$> map =\n"
" internalGet$capitalized_name$().getMap();\n"
@@ -629,17 +655,19 @@
printer->Annotate("{", "}", descriptor_);
}
} else {
- printer->Print(variables_,
- "/**\n"
- " * Use {@link #get$capitalized_name$Map()} instead.\n"
- " */\n"
- "@java.lang.Override\n"
- "@java.lang.Deprecated\n"
- "public java.util.Map<$type_parameters$> "
- "${$get$capitalized_name$$}$() {\n"
- " return get$capitalized_name$Map();\n"
- "}\n");
- printer->Annotate("{", "}", descriptor_);
+ if (context_->options().opensource_runtime) {
+ printer->Print(variables_,
+ "/**\n"
+ " * Use {@link #get$capitalized_name$Map()} instead.\n"
+ " */\n"
+ "@java.lang.Override\n"
+ "@java.lang.Deprecated\n"
+ "public java.util.Map<$type_parameters$> "
+ "${$get$capitalized_name$$}$() {\n"
+ " return get$capitalized_name$Map();\n"
+ "}\n");
+ printer->Annotate("{", "}", descriptor_);
+ }
WriteFieldDocComment(printer, descriptor_);
printer->Print(variables_,
"@java.lang.Override\n"
@@ -654,9 +682,10 @@
variables_,
"@java.lang.Override\n"
"$deprecation$\n"
- "public $value_type$ ${$get$capitalized_name$OrDefault$}$(\n"
+ "public $value_type_pass_through_nullness$ "
+ "${$get$capitalized_name$OrDefault$}$(\n"
" $key_type$ key,\n"
- " $value_type$ defaultValue) {\n"
+ " $value_type_pass_through_nullness$ defaultValue) {\n"
" $key_null_check$\n"
" java.util.Map<$type_parameters$> map =\n"
" internalGet$capitalized_name$().getMap();\n"
@@ -691,13 +720,13 @@
" */\n"
"@kotlin.OptIn"
"(com.google.protobuf.kotlin.OnlyForUseByGeneratedProtoCode::class)\n"
- "class ${$$kt_capitalized_name$Proxy$}$ private constructor()"
+ "public class ${$$kt_capitalized_name$Proxy$}$ private constructor()"
" : com.google.protobuf.kotlin.DslProxy()\n");
- WriteFieldDocComment(printer, descriptor_);
+ WriteFieldDocComment(printer, descriptor_, /* kdoc */ true);
printer->Print(
variables_,
- "$kt_deprecation$ val $kt_name$: "
+ "$kt_deprecation$ public val $kt_name$: "
"com.google.protobuf.kotlin.DslMap"
"<$kt_key_type$, $kt_value_type$, ${$$kt_capitalized_name$Proxy$}$>\n"
" @kotlin.jvm.JvmSynthetic\n"
@@ -706,57 +735,57 @@
" $kt_dsl_builder$.${$get$capitalized_name$Map$}$()\n"
" )\n");
- WriteFieldDocComment(printer, descriptor_);
+ WriteFieldDocComment(printer, descriptor_, /* kdoc */ true);
printer->Print(
variables_,
"@JvmName(\"put$kt_capitalized_name$\")\n"
- "fun com.google.protobuf.kotlin.DslMap"
+ "public fun com.google.protobuf.kotlin.DslMap"
"<$kt_key_type$, $kt_value_type$, ${$$kt_capitalized_name$Proxy$}$>\n"
" .put(key: $kt_key_type$, value: $kt_value_type$) {\n"
" $kt_dsl_builder$.${$put$capitalized_name$$}$(key, value)\n"
" }\n");
- WriteFieldDocComment(printer, descriptor_);
+ WriteFieldDocComment(printer, descriptor_, /* kdoc */ true);
printer->Print(
variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@JvmName(\"set$kt_capitalized_name$\")\n"
"@Suppress(\"NOTHING_TO_INLINE\")\n"
- "inline operator fun com.google.protobuf.kotlin.DslMap"
+ "public inline operator fun com.google.protobuf.kotlin.DslMap"
"<$kt_key_type$, $kt_value_type$, ${$$kt_capitalized_name$Proxy$}$>\n"
" .set(key: $kt_key_type$, value: $kt_value_type$) {\n"
" put(key, value)\n"
" }\n");
- WriteFieldDocComment(printer, descriptor_);
+ WriteFieldDocComment(printer, descriptor_, /* kdoc */ true);
printer->Print(
variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@JvmName(\"remove$kt_capitalized_name$\")\n"
- "fun com.google.protobuf.kotlin.DslMap"
+ "public fun com.google.protobuf.kotlin.DslMap"
"<$kt_key_type$, $kt_value_type$, ${$$kt_capitalized_name$Proxy$}$>\n"
" .remove(key: $kt_key_type$) {\n"
" $kt_dsl_builder$.${$remove$capitalized_name$$}$(key)\n"
" }\n");
- WriteFieldDocComment(printer, descriptor_);
+ WriteFieldDocComment(printer, descriptor_, /* kdoc */ true);
printer->Print(
variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@JvmName(\"putAll$kt_capitalized_name$\")\n"
- "fun com.google.protobuf.kotlin.DslMap"
+ "public fun com.google.protobuf.kotlin.DslMap"
"<$kt_key_type$, $kt_value_type$, ${$$kt_capitalized_name$Proxy$}$>\n"
" .putAll(map: kotlin.collections.Map<$kt_key_type$, $kt_value_type$>) "
"{\n"
" $kt_dsl_builder$.${$putAll$capitalized_name$$}$(map)\n"
" }\n");
- WriteFieldDocComment(printer, descriptor_);
+ WriteFieldDocComment(printer, descriptor_, /* kdoc */ true);
printer->Print(
variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@JvmName(\"clear$kt_capitalized_name$\")\n"
- "fun com.google.protobuf.kotlin.DslMap"
+ "public fun com.google.protobuf.kotlin.DslMap"
"<$kt_key_type$, $kt_value_type$, ${$$kt_capitalized_name$Proxy$}$>\n"
" .clear() {\n"
" $kt_dsl_builder$.${$clear$capitalized_name$$}$()\n"
@@ -871,4 +900,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/compiler/java/map_field.h b/src/google/protobuf/compiler/java/map_field.h
index 3d699aa..4341508 100644
--- a/src/google/protobuf/compiler/java/map_field.h
+++ b/src/google/protobuf/compiler/java/map_field.h
@@ -31,7 +31,7 @@
#ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_MAP_FIELD_H__
#define GOOGLE_PROTOBUF_COMPILER_JAVA_MAP_FIELD_H__
-#include <google/protobuf/compiler/java/field.h>
+#include "google/protobuf/compiler/java/field.h"
namespace google {
namespace protobuf {
@@ -70,6 +70,7 @@
const FieldDescriptor* descriptor_;
std::map<std::string, std::string> variables_;
ClassNameResolver* name_resolver_;
+ Context* context_;
void GenerateMapGetters(io::Printer* printer) const;
};
diff --git a/src/google/protobuf/compiler/java/map_field_lite.cc b/src/google/protobuf/compiler/java/map_field_lite.cc
index 4f2766e..22bc306 100644
--- a/src/google/protobuf/compiler/java/map_field_lite.cc
+++ b/src/google/protobuf/compiler/java/map_field_lite.cc
@@ -28,18 +28,18 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/compiler/java/map_field_lite.h>
+#include "google/protobuf/compiler/java/map_field_lite.h"
#include <cstdint>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/compiler/java/context.h>
-#include <google/protobuf/compiler/java/doc_comment.h>
-#include <google/protobuf/compiler/java/helpers.h>
-#include <google/protobuf/compiler/java/name_resolver.h>
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/compiler/java/context.h"
+#include "google/protobuf/compiler/java/doc_comment.h"
+#include "google/protobuf/compiler/java/helpers.h"
+#include "google/protobuf/compiler/java/name_resolver.h"
// Must be last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -104,14 +104,18 @@
const JavaType keyJavaType = GetJavaType(key);
const JavaType valueJavaType = GetJavaType(value);
- std::string pass_through_nullness = "/* nullable */\n";
+ std::string pass_through_nullness =
+ context->options().opensource_runtime
+ ? "/* nullable */\n"
+ : "@com.google.protobuf.Internal.ProtoPassThroughNullness ";
(*variables)["key_type"] = TypeName(key, name_resolver, false);
(*variables)["boxed_key_type"] = TypeName(key, name_resolver, true);
(*variables)["kt_key_type"] = KotlinTypeName(key, name_resolver);
(*variables)["kt_value_type"] = KotlinTypeName(value, name_resolver);
(*variables)["key_wire_type"] = WireType(key);
- (*variables)["key_default_value"] = DefaultValue(key, true, name_resolver);
+ (*variables)["key_default_value"] =
+ DefaultValue(key, true, name_resolver, context->options());
// We use `x.getClass()` as a null check because it generates less bytecode
// than an `if (x == null) { throw ... }` statement.
(*variables)["key_null_check"] =
@@ -126,10 +130,13 @@
if (GetJavaType(value) == JAVATYPE_ENUM) {
// We store enums as Integers internally.
(*variables)["value_type"] = "int";
+ (*variables)["value_type_pass_through_nullness"] =
+ (*variables)["value_type"];
(*variables)["boxed_value_type"] = "java.lang.Integer";
(*variables)["value_wire_type"] = WireType(value);
(*variables)["value_default_value"] =
- DefaultValue(value, true, name_resolver) + ".getNumber()";
+ DefaultValue(value, true, name_resolver, context->options()) +
+ ".getNumber()";
(*variables)["value_enum_type"] = TypeName(value, name_resolver, false);
@@ -143,7 +150,7 @@
} else {
// Map unknown values to the default value if we don't have UNRECOGNIZED.
(*variables)["unrecognized_value"] =
- DefaultValue(value, true, name_resolver);
+ DefaultValue(value, true, name_resolver, context->options());
}
} else {
(*variables)["value_type"] = TypeName(value, name_resolver, false);
@@ -155,7 +162,7 @@
(*variables)["boxed_value_type"] = TypeName(value, name_resolver, true);
(*variables)["value_wire_type"] = WireType(value);
(*variables)["value_default_value"] =
- DefaultValue(value, true, name_resolver);
+ DefaultValue(value, true, name_resolver, context->options());
}
(*variables)["type_parameters"] =
(*variables)["boxed_key_type"] + ", " + (*variables)["boxed_value_type"];
@@ -171,6 +178,8 @@
(*variables)["default_entry"] =
(*variables)["capitalized_name"] + "DefaultEntryHolder.defaultEntry";
+ // { and } variables are used as delimiters when emitting annotations.
+ (*variables)["{"] = (*variables)["}"] = "";
}
} // namespace
@@ -201,14 +210,16 @@
" $key_type$ key);\n");
printer->Annotate("{", "}", descriptor_);
if (GetJavaType(ValueField(descriptor_)) == JAVATYPE_ENUM) {
- printer->Print(variables_,
- "/**\n"
- " * Use {@link #get$capitalized_name$Map()} instead.\n"
- " */\n"
- "@java.lang.Deprecated\n"
- "java.util.Map<$boxed_key_type$, $value_enum_type$>\n"
- "${$get$capitalized_name$$}$();\n");
- printer->Annotate("{", "}", descriptor_);
+ if (context_->options().opensource_runtime) {
+ printer->Print(variables_,
+ "/**\n"
+ " * Use {@link #get$capitalized_name$Map()} instead.\n"
+ " */\n"
+ "@java.lang.Deprecated\n"
+ "java.util.Map<$boxed_key_type$, $value_enum_type$>\n"
+ "${$get$capitalized_name$$}$();\n");
+ printer->Annotate("{", "}", descriptor_);
+ }
WriteFieldDocComment(printer, descriptor_);
printer->Print(
variables_,
@@ -247,9 +258,10 @@
WriteFieldDocComment(printer, descriptor_);
printer->Print(variables_,
"$deprecation$\n"
- "$value_type$ ${$get$capitalized_name$ValueOrDefault$}$(\n"
+ "$value_type_pass_through_nullness$ "
+ "${$get$capitalized_name$ValueOrDefault$}$(\n"
" $key_type$ key,\n"
- " $value_type$ defaultValue);\n");
+ " $value_type_pass_through_nullness$ defaultValue);\n");
printer->Annotate("{", "}", descriptor_);
WriteFieldDocComment(printer, descriptor_);
printer->Print(variables_,
@@ -259,14 +271,16 @@
printer->Annotate("{", "}", descriptor_);
}
} else {
- printer->Print(variables_,
- "/**\n"
- " * Use {@link #get$capitalized_name$Map()} instead.\n"
- " */\n"
- "@java.lang.Deprecated\n"
- "java.util.Map<$type_parameters$>\n"
- "${$get$capitalized_name$$}$();\n");
- printer->Annotate("{", "}", descriptor_);
+ if (context_->options().opensource_runtime) {
+ printer->Print(variables_,
+ "/**\n"
+ " * Use {@link #get$capitalized_name$Map()} instead.\n"
+ " */\n"
+ "@java.lang.Deprecated\n"
+ "java.util.Map<$type_parameters$>\n"
+ "${$get$capitalized_name$$}$();\n");
+ printer->Annotate("{", "}", descriptor_);
+ }
WriteFieldDocComment(printer, descriptor_);
printer->Print(variables_,
"$deprecation$java.util.Map<$type_parameters$>\n"
@@ -303,6 +317,12 @@
" $value_wire_type$,\n"
" $value_default_value$);\n"
"}\n");
+ if (!context_->options().opensource_runtime) {
+ printer->Print(variables_,
+ "@com.google.protobuf.ProtoField(\n"
+ " fieldNumber=$number$,\n"
+ " type=com.google.protobuf.FieldType.MAP)\n");
+ }
printer->Print(variables_,
"private com.google.protobuf.MapFieldLite<\n"
" $type_parameters$> $name$_ =\n"
@@ -344,16 +364,19 @@
" com.google.protobuf.Internal.MapAdapter.newEnumConverter(\n"
" $value_enum_type$.internalGetValueMap(),\n"
" $unrecognized_value$);\n");
- printer->Print(variables_,
- "/**\n"
- " * Use {@link #get$capitalized_name$Map()} instead.\n"
- " */\n"
- "@java.lang.Deprecated\n"
- "public java.util.Map<$boxed_key_type$, $value_enum_type$>\n"
- "${$get$capitalized_name$$}$() {\n"
- " return get$capitalized_name$Map();\n"
- "}\n");
- printer->Annotate("{", "}", descriptor_);
+ if (context_->options().opensource_runtime) {
+ printer->Print(
+ variables_,
+ "/**\n"
+ " * Use {@link #get$capitalized_name$Map()} instead.\n"
+ " */\n"
+ "@java.lang.Deprecated\n"
+ "public java.util.Map<$boxed_key_type$, $value_enum_type$>\n"
+ "${$get$capitalized_name$$}$() {\n"
+ " return get$capitalized_name$Map();\n"
+ "}\n");
+ printer->Annotate("{", "}", descriptor_);
+ }
WriteFieldDocComment(printer, descriptor_);
printer->Print(
variables_,
@@ -373,9 +396,10 @@
variables_,
"@java.lang.Override\n"
"$deprecation$\n"
- "public $value_enum_type$ ${$get$capitalized_name$OrDefault$}$(\n"
+ "public $value_enum_type_pass_through_nullness$ "
+ "${$get$capitalized_name$OrDefault$}$(\n"
" $key_type$ key,\n"
- " $value_enum_type$ defaultValue) {\n"
+ " $value_enum_type_pass_through_nullness$ defaultValue) {\n"
" $key_null_check$\n"
" java.util.Map<$boxed_key_type$, $boxed_value_type$> map =\n"
" internalGet$capitalized_name$();\n"
@@ -429,9 +453,10 @@
variables_,
"@java.lang.Override\n"
"$deprecation$\n"
- "public $value_type$ ${$get$capitalized_name$ValueOrDefault$}$(\n"
+ "public $value_type_pass_through_nullness$ "
+ "${$get$capitalized_name$ValueOrDefault$}$(\n"
" $key_type$ key,\n"
- " $value_type$ defaultValue) {\n"
+ " $value_type_pass_through_nullness$ defaultValue) {\n"
" $key_null_check$\n"
" java.util.Map<$boxed_key_type$, $boxed_value_type$> map =\n"
" internalGet$capitalized_name$();\n"
@@ -456,17 +481,19 @@
printer->Annotate("{", "}", descriptor_);
}
} else {
- printer->Print(variables_,
- "/**\n"
- " * Use {@link #get$capitalized_name$Map()} instead.\n"
- " */\n"
- "@java.lang.Override\n"
- "@java.lang.Deprecated\n"
- "public java.util.Map<$type_parameters$> "
- "${$get$capitalized_name$$}$() {\n"
- " return get$capitalized_name$Map();\n"
- "}\n");
- printer->Annotate("{", "}", descriptor_);
+ if (context_->options().opensource_runtime) {
+ printer->Print(variables_,
+ "/**\n"
+ " * Use {@link #get$capitalized_name$Map()} instead.\n"
+ " */\n"
+ "@java.lang.Override\n"
+ "@java.lang.Deprecated\n"
+ "public java.util.Map<$type_parameters$> "
+ "${$get$capitalized_name$$}$() {\n"
+ " return get$capitalized_name$Map();\n"
+ "}\n");
+ printer->Annotate("{", "}", descriptor_);
+ }
WriteFieldDocComment(printer, descriptor_);
printer->Print(variables_,
"@java.lang.Override\n"
@@ -482,9 +509,10 @@
variables_,
"@java.lang.Override\n"
"$deprecation$\n"
- "public $value_type$ ${$get$capitalized_name$OrDefault$}$(\n"
+ "public $value_type_pass_through_nullness$ "
+ "${$get$capitalized_name$OrDefault$}$(\n"
" $key_type$ key,\n"
- " $value_type$ defaultValue) {\n"
+ " $value_type_pass_through_nullness$ defaultValue) {\n"
" $key_null_check$\n"
" java.util.Map<$type_parameters$> map =\n"
" internalGet$capitalized_name$();\n"
@@ -596,16 +624,19 @@
"}\n");
printer->Annotate("{", "}", descriptor_);
if (GetJavaType(ValueField(descriptor_)) == JAVATYPE_ENUM) {
- printer->Print(variables_,
- "/**\n"
- " * Use {@link #get$capitalized_name$Map()} instead.\n"
- " */\n"
- "@java.lang.Deprecated\n"
- "public java.util.Map<$boxed_key_type$, $value_enum_type$>\n"
- "${$get$capitalized_name$$}$() {\n"
- " return get$capitalized_name$Map();\n"
- "}\n");
- printer->Annotate("{", "}", descriptor_);
+ if (context_->options().opensource_runtime) {
+ printer->Print(
+ variables_,
+ "/**\n"
+ " * Use {@link #get$capitalized_name$Map()} instead.\n"
+ " */\n"
+ "@java.lang.Deprecated\n"
+ "public java.util.Map<$boxed_key_type$, $value_enum_type$>\n"
+ "${$get$capitalized_name$$}$() {\n"
+ " return get$capitalized_name$Map();\n"
+ "}\n");
+ printer->Annotate("{", "}", descriptor_);
+ }
WriteFieldDocComment(printer, descriptor_);
printer->Print(variables_,
"@java.lang.Override\n"
@@ -701,9 +732,10 @@
variables_,
"@java.lang.Override\n"
"$deprecation$\n"
- "public $value_type$ ${$get$capitalized_name$ValueOrDefault$}$(\n"
+ "public $value_type_pass_through_nullness$ "
+ "${$get$capitalized_name$ValueOrDefault$}$(\n"
" $key_type$ key,\n"
- " $value_type$ defaultValue) {\n"
+ " $value_type_pass_through_nullness$ defaultValue) {\n"
" $key_null_check$\n"
" java.util.Map<$boxed_key_type$, $boxed_value_type$> map =\n"
" instance.get$capitalized_name$ValueMap();\n"
@@ -750,17 +782,19 @@
printer->Annotate("{", "}", descriptor_);
}
} else {
- printer->Print(variables_,
- "/**\n"
- " * Use {@link #get$capitalized_name$Map()} instead.\n"
- " */\n"
- "@java.lang.Override\n"
- "@java.lang.Deprecated\n"
- "public java.util.Map<$type_parameters$> "
- "${$get$capitalized_name$$}$() {\n"
- " return get$capitalized_name$Map();\n"
- "}\n");
- printer->Annotate("{", "}", descriptor_);
+ if (context_->options().opensource_runtime) {
+ printer->Print(variables_,
+ "/**\n"
+ " * Use {@link #get$capitalized_name$Map()} instead.\n"
+ " */\n"
+ "@java.lang.Override\n"
+ "@java.lang.Deprecated\n"
+ "public java.util.Map<$type_parameters$> "
+ "${$get$capitalized_name$$}$() {\n"
+ " return get$capitalized_name$Map();\n"
+ "}\n");
+ printer->Annotate("{", "}", descriptor_);
+ }
WriteFieldDocComment(printer, descriptor_);
printer->Print(variables_,
"@java.lang.Override\n"
@@ -776,9 +810,10 @@
variables_,
"@java.lang.Override\n"
"$deprecation$\n"
- "public $value_type$ ${$get$capitalized_name$OrDefault$}$(\n"
+ "public $value_type_pass_through_nullness$ "
+ "${$get$capitalized_name$OrDefault$}$(\n"
" $key_type$ key,\n"
- " $value_type$ defaultValue) {\n"
+ " $value_type_pass_through_nullness$ defaultValue) {\n"
" $key_null_check$\n"
" java.util.Map<$type_parameters$> map =\n"
" instance.get$capitalized_name$Map();\n"
@@ -838,13 +873,13 @@
" */\n"
"@kotlin.OptIn"
"(com.google.protobuf.kotlin.OnlyForUseByGeneratedProtoCode::class)\n"
- "class ${$$kt_capitalized_name$Proxy$}$ private constructor()"
+ "public class ${$$kt_capitalized_name$Proxy$}$ private constructor()"
" : com.google.protobuf.kotlin.DslProxy()\n");
- WriteFieldDocComment(printer, descriptor_);
+ WriteFieldDocComment(printer, descriptor_, /* kdoc */ true);
printer->Print(
variables_,
- "$kt_deprecation$ val $kt_name$: "
+ "$kt_deprecation$ public val $kt_name$: "
"com.google.protobuf.kotlin.DslMap"
"<$kt_key_type$, $kt_value_type$, ${$$kt_capitalized_name$Proxy$}$>\n"
" @kotlin.jvm.JvmSynthetic\n"
@@ -853,57 +888,57 @@
" $kt_dsl_builder$.${$get$capitalized_name$Map$}$()\n"
" )\n");
- WriteFieldDocComment(printer, descriptor_);
+ WriteFieldDocComment(printer, descriptor_, /* kdoc */ true);
printer->Print(
variables_,
"@JvmName(\"put$kt_capitalized_name$\")\n"
- "fun com.google.protobuf.kotlin.DslMap"
+ "public fun com.google.protobuf.kotlin.DslMap"
"<$kt_key_type$, $kt_value_type$, ${$$kt_capitalized_name$Proxy$}$>\n"
" .put(key: $kt_key_type$, value: $kt_value_type$) {\n"
" $kt_dsl_builder$.${$put$capitalized_name$$}$(key, value)\n"
" }\n");
- WriteFieldDocComment(printer, descriptor_);
+ WriteFieldDocComment(printer, descriptor_, /* kdoc */ true);
printer->Print(
variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@JvmName(\"set$kt_capitalized_name$\")\n"
"@Suppress(\"NOTHING_TO_INLINE\")\n"
- "inline operator fun com.google.protobuf.kotlin.DslMap"
+ "public inline operator fun com.google.protobuf.kotlin.DslMap"
"<$kt_key_type$, $kt_value_type$, ${$$kt_capitalized_name$Proxy$}$>\n"
" .set(key: $kt_key_type$, value: $kt_value_type$) {\n"
" put(key, value)\n"
" }\n");
- WriteFieldDocComment(printer, descriptor_);
+ WriteFieldDocComment(printer, descriptor_, /* kdoc */ true);
printer->Print(
variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@JvmName(\"remove$kt_capitalized_name$\")\n"
- "fun com.google.protobuf.kotlin.DslMap"
+ "public fun com.google.protobuf.kotlin.DslMap"
"<$kt_key_type$, $kt_value_type$, ${$$kt_capitalized_name$Proxy$}$>\n"
" .remove(key: $kt_key_type$) {\n"
" $kt_dsl_builder$.${$remove$capitalized_name$$}$(key)\n"
" }\n");
- WriteFieldDocComment(printer, descriptor_);
+ WriteFieldDocComment(printer, descriptor_, /* kdoc */ true);
printer->Print(
variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@JvmName(\"putAll$kt_capitalized_name$\")\n"
- "fun com.google.protobuf.kotlin.DslMap"
+ "public fun com.google.protobuf.kotlin.DslMap"
"<$kt_key_type$, $kt_value_type$, ${$$kt_capitalized_name$Proxy$}$>\n"
" .putAll(map: kotlin.collections.Map<$kt_key_type$, $kt_value_type$>) "
"{\n"
" $kt_dsl_builder$.${$putAll$capitalized_name$$}$(map)\n"
" }\n");
- WriteFieldDocComment(printer, descriptor_);
+ WriteFieldDocComment(printer, descriptor_, /* kdoc */ true);
printer->Print(
variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@JvmName(\"clear$kt_capitalized_name$\")\n"
- "fun com.google.protobuf.kotlin.DslMap"
+ "public fun com.google.protobuf.kotlin.DslMap"
"<$kt_key_type$, $kt_value_type$, ${$$kt_capitalized_name$Proxy$}$>\n"
" .clear() {\n"
" $kt_dsl_builder$.${$clear$capitalized_name$$}$()\n"
@@ -924,4 +959,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/compiler/java/map_field_lite.h b/src/google/protobuf/compiler/java/map_field_lite.h
index 964f098..46a2d9f 100644
--- a/src/google/protobuf/compiler/java/map_field_lite.h
+++ b/src/google/protobuf/compiler/java/map_field_lite.h
@@ -33,7 +33,7 @@
#include <cstdint>
-#include <google/protobuf/compiler/java/field.h>
+#include "google/protobuf/compiler/java/field.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/compiler/java/message.cc b/src/google/protobuf/compiler/java/message.cc
index 464cbe2..508e41f 100644
--- a/src/google/protobuf/compiler/java/message.cc
+++ b/src/google/protobuf/compiler/java/message.cc
@@ -32,7 +32,7 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/compiler/java/message.h>
+#include "google/protobuf/compiler/java/message.h"
#include <algorithm>
#include <cstdint>
@@ -40,25 +40,28 @@
#include <memory>
#include <vector>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/wire_format.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/substitute.h>
-#include <google/protobuf/compiler/java/context.h>
-#include <google/protobuf/compiler/java/doc_comment.h>
-#include <google/protobuf/compiler/java/enum.h>
-#include <google/protobuf/compiler/java/extension.h>
-#include <google/protobuf/compiler/java/generator_factory.h>
-#include <google/protobuf/compiler/java/helpers.h>
-#include <google/protobuf/compiler/java/message_builder.h>
-#include <google/protobuf/compiler/java/message_builder_lite.h>
-#include <google/protobuf/compiler/java/name_resolver.h>
-#include <google/protobuf/descriptor.pb.h>
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/wire_format.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "absl/strings/ascii.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/substitute.h"
+#include "google/protobuf/compiler/java/context.h"
+#include "google/protobuf/compiler/java/doc_comment.h"
+#include "google/protobuf/compiler/java/enum.h"
+#include "google/protobuf/compiler/java/extension.h"
+#include "google/protobuf/compiler/java/generator_factory.h"
+#include "google/protobuf/compiler/java/helpers.h"
+#include "google/protobuf/compiler/java/message_builder.h"
+#include "google/protobuf/compiler/java/message_builder_lite.h"
+#include "google/protobuf/compiler/java/message_serialization.h"
+#include "google/protobuf/compiler/java/name_resolver.h"
+#include "google/protobuf/descriptor.pb.h"
// Must be last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -115,7 +118,7 @@
std::map<std::string, std::string> vars;
vars["identifier"] = UniqueFileScopeIdentifier(descriptor_);
- vars["index"] = StrCat(descriptor_->index());
+ vars["index"] = absl::StrCat(descriptor_->index());
vars["classname"] = name_resolver_->GetImmutableClassName(descriptor_);
if (descriptor_->containing_type() != NULL) {
vars["parent"] = UniqueFileScopeIdentifier(descriptor_->containing_type());
@@ -159,7 +162,7 @@
int bytecode_estimate = 0;
std::map<std::string, std::string> vars;
vars["identifier"] = UniqueFileScopeIdentifier(descriptor_);
- vars["index"] = StrCat(descriptor_->index());
+ vars["index"] = absl::StrCat(descriptor_->index());
vars["classname"] = name_resolver_->GetImmutableClassName(descriptor_);
if (descriptor_->containing_type() != NULL) {
vars["parent"] = UniqueFileScopeIdentifier(descriptor_->containing_type());
@@ -261,6 +264,9 @@
void ImmutableMessageGenerator::GenerateInterface(io::Printer* printer) {
MaybePrintGeneratedAnnotation(context_, printer, descriptor_,
/* immutable = */ true, "OrBuilder");
+ if (!context_->options().opensource_runtime) {
+ printer->Print("@com.google.protobuf.Internal.ProtoNonnullApi\n");
+ }
if (descriptor_->extension_range_count() > 0) {
printer->Print(
"$deprecation$public interface ${$$classname$OrBuilder$}$ extends\n"
@@ -293,7 +299,7 @@
for (auto oneof : oneofs_) {
printer->Print(
"\n"
- "public $classname$.$oneof_capitalized_name$Case "
+ "$classname$.$oneof_capitalized_name$Case "
"get$oneof_capitalized_name$Case();\n",
"oneof_capitalized_name",
context_->GetOneofGeneratorInfo(oneof)->capitalized_name, "classname",
@@ -320,6 +326,10 @@
WriteMessageDocComment(printer, descriptor_);
MaybePrintGeneratedAnnotation(context_, printer, descriptor_,
/* immutable = */ true);
+ if (!context_->options().opensource_runtime) {
+ printer->Print("@com.google.protobuf.Internal.ProtoNonnullApi\n");
+ }
+
// The builder_type stores the super type name of the nested Builder class.
std::string builder_type;
if (descriptor_->extension_range_count() > 0) {
@@ -333,7 +343,7 @@
" $classname$> implements\n"
" $extra_interfaces$\n"
" $classname$OrBuilder {\n");
- builder_type = strings::Substitute(
+ builder_type = absl::Substitute(
"com.google.protobuf.GeneratedMessage$1.ExtendableBuilder<$0, ?>",
name_resolver_->GetImmutableClassName(descriptor_),
GeneratedCodeVersionSuffix());
@@ -347,7 +357,7 @@
" $extra_interfaces$\n"
" $classname$OrBuilder {\n");
builder_type =
- strings::Substitute("com.google.protobuf.GeneratedMessage$0.Builder<?>",
+ absl::Substitute("com.google.protobuf.GeneratedMessage$0.Builder<?>",
GeneratedCodeVersionSuffix());
}
printer->Print("private static final long serialVersionUID = 0L;\n");
@@ -422,7 +432,9 @@
vars["oneof_name"] = context_->GetOneofGeneratorInfo(oneof)->name;
vars["oneof_capitalized_name"] =
context_->GetOneofGeneratorInfo(oneof)->capitalized_name;
- vars["oneof_index"] = StrCat((oneof)->index());
+ vars["oneof_index"] = absl::StrCat((oneof)->index());
+ vars["{"] = "";
+ vars["}"] = "";
// oneofCase_ and oneof_
printer->Print(vars,
"private int $oneof_name$Case_ = 0;\n"
@@ -430,46 +442,52 @@
// OneofCase enum
printer->Print(
vars,
- "public enum $oneof_capitalized_name$Case\n"
+ "public enum ${$$oneof_capitalized_name$Case$}$\n"
// TODO(dweis): Remove EnumLite when we want to break compatibility with
// 3.x users
" implements com.google.protobuf.Internal.EnumLite,\n"
" com.google.protobuf.AbstractMessage.InternalOneOfEnum {\n");
+ printer->Annotate("{", "}", oneof);
printer->Indent();
for (int j = 0; j < (oneof)->field_count(); j++) {
const FieldDescriptor* field = (oneof)->field(j);
printer->Print(
"$deprecation$$field_name$($field_number$),\n", "deprecation",
field->options().deprecated() ? "@java.lang.Deprecated " : "",
- "field_name", ToUpper(field->name()), "field_number",
- StrCat(field->number()));
+ "field_name", absl::AsciiStrToUpper(field->name()), "field_number",
+ absl::StrCat(field->number()));
+ printer->Annotate("field_name", field);
}
printer->Print("$cap_oneof_name$_NOT_SET(0);\n", "cap_oneof_name",
- ToUpper(vars["oneof_name"]));
+ absl::AsciiStrToUpper(vars["oneof_name"]));
printer->Print(vars,
"private final int value;\n"
"private $oneof_capitalized_name$Case(int value) {\n"
" this.value = value;\n"
"}\n");
+ if (context_->options().opensource_runtime) {
+ printer->Print(
+ vars,
+ "/**\n"
+ " * @param value The number of the enum to look for.\n"
+ " * @return The enum associated with the given number.\n"
+ " * @deprecated Use {@link #forNumber(int)} instead.\n"
+ " */\n"
+ "@java.lang.Deprecated\n"
+ "public static $oneof_capitalized_name$Case valueOf(int value) {\n"
+ " return forNumber(value);\n"
+ "}\n"
+ "\n");
+ }
printer->Print(
vars,
- "/**\n"
- " * @param value The number of the enum to look for.\n"
- " * @return The enum associated with the given number.\n"
- " * @deprecated Use {@link #forNumber(int)} instead.\n"
- " */\n"
- "@java.lang.Deprecated\n"
- "public static $oneof_capitalized_name$Case valueOf(int value) {\n"
- " return forNumber(value);\n"
- "}\n"
- "\n"
"public static $oneof_capitalized_name$Case forNumber(int value) {\n"
" switch (value) {\n");
for (int j = 0; j < (oneof)->field_count(); j++) {
const FieldDescriptor* field = (oneof)->field(j);
printer->Print(" case $field_number$: return $field_name$;\n",
- "field_number", StrCat(field->number()),
- "field_name", ToUpper(field->name()));
+ "field_number", absl::StrCat(field->number()),
+ "field_name", absl::AsciiStrToUpper(field->name()));
}
printer->Print(
" case 0: return $cap_oneof_name$_NOT_SET;\n"
@@ -479,17 +497,18 @@
"public int getNumber() {\n"
" return this.value;\n"
"}\n",
- "cap_oneof_name", ToUpper(vars["oneof_name"]));
+ "cap_oneof_name", absl::AsciiStrToUpper(vars["oneof_name"]));
printer->Outdent();
printer->Print("};\n\n");
// oneofCase()
printer->Print(vars,
"public $oneof_capitalized_name$Case\n"
- "get$oneof_capitalized_name$Case() {\n"
+ "${$get$oneof_capitalized_name$Case$}$() {\n"
" return $oneof_capitalized_name$Case.forNumber(\n"
" $oneof_name$Case_);\n"
"}\n"
"\n");
+ printer->Annotate("{", "}", oneof);
}
if (IsAnyMessage(descriptor_)) {
@@ -500,7 +519,7 @@
for (int i = 0; i < descriptor_->field_count(); i++) {
printer->Print("public static final int $constant_name$ = $number$;\n",
"constant_name", FieldConstantName(descriptor_->field(i)),
- "number", StrCat(descriptor_->field(i)->number()));
+ "number", absl::StrCat(descriptor_->field(i)->number()));
printer->Annotate("constant_name", descriptor_->field(i));
field_generators_.get(descriptor_->field(i)).GenerateMembers(printer);
printer->Print("\n");
@@ -580,13 +599,6 @@
std::unique_ptr<const FieldDescriptor*[]> sorted_fields(
SortFieldsByNumber(descriptor_));
- std::vector<const Descriptor::ExtensionRange*> sorted_extensions;
- sorted_extensions.reserve(descriptor_->extension_range_count());
- for (int i = 0; i < descriptor_->extension_range_count(); ++i) {
- sorted_extensions.push_back(descriptor_->extension_range(i));
- }
- std::sort(sorted_extensions.begin(), sorted_extensions.end(),
- ExtensionRangeOrdering());
printer->Print(
"@java.lang.Override\n"
"public void writeTo(com.google.protobuf.CodedOutputStream output)\n"
@@ -621,19 +633,8 @@
}
}
- // Merge the fields and the extension ranges, both sorted by field number.
- for (int i = 0, j = 0;
- i < descriptor_->field_count() || j < sorted_extensions.size();) {
- if (i == descriptor_->field_count()) {
- GenerateSerializeOneExtensionRange(printer, sorted_extensions[j++]);
- } else if (j == sorted_extensions.size()) {
- GenerateSerializeOneField(printer, sorted_fields[i++]);
- } else if (sorted_fields[i]->number() < sorted_extensions[j]->start) {
- GenerateSerializeOneField(printer, sorted_fields[i++]);
- } else {
- GenerateSerializeOneExtensionRange(printer, sorted_extensions[j++]);
- }
- }
+ GenerateSerializeFieldsAndExtensions(printer, field_generators_, descriptor_,
+ sorted_fields.get());
if (descriptor_->options().message_set_wire_format()) {
printer->Print("getUnknownFields().writeAsMessageSetTo(output);\n");
@@ -764,17 +765,6 @@
GeneratedCodeVersionSuffix());
}
-void ImmutableMessageGenerator::GenerateSerializeOneField(
- io::Printer* printer, const FieldDescriptor* field) {
- field_generators_.get(field).GenerateSerializationCode(printer);
-}
-
-void ImmutableMessageGenerator::GenerateSerializeOneExtensionRange(
- io::Printer* printer, const Descriptor::ExtensionRange* range) {
- printer->Print("extensionWriter.writeUntil($end$, output);\n", "end",
- StrCat(range->end));
-}
-
// ===================================================================
void ImmutableMessageGenerator::GenerateBuilder(io::Printer* printer) {
@@ -846,7 +836,7 @@
printer->Print(
"case $number$:\n"
" return internalGet$capitalized_name$();\n",
- "number", StrCat(field->number()), "capitalized_name",
+ "number", absl::StrCat(field->number()), "capitalized_name",
info->capitalized_name);
}
printer->Print(
@@ -1004,6 +994,10 @@
printer->Print(
"@java.lang.Override\n"
"public boolean equals(");
+ if (!context_->options().opensource_runtime) {
+ printer->Print(
+ "@com.google.protobuf.Internal.ProtoMethodAcceptsNullParameter\n");
+ }
printer->Print("final java.lang.Object obj) {\n");
printer->Indent();
printer->Print(
@@ -1011,6 +1005,8 @@
" return true;\n"
"}\n"
"if (!(obj instanceof $classname$)) {\n"
+ // don't simply return false because mutable and immutable types
+ // can be equal
" return super.equals(obj);\n"
"}\n"
"$classname$ other = ($classname$) obj;\n"
@@ -1050,7 +1046,7 @@
for (int j = 0; j < (oneof)->field_count(); j++) {
const FieldDescriptor* field = (oneof)->field(j);
printer->Print("case $field_number$:\n", "field_number",
- StrCat(field->number()));
+ absl::StrCat(field->number()));
printer->Indent();
field_generators_.get(field).GenerateEqualsCode(printer);
printer->Print("break;\n");
@@ -1125,7 +1121,7 @@
for (int j = 0; j < (oneof)->field_count(); j++) {
const FieldDescriptor* field = (oneof)->field(j);
printer->Print("case $field_number$:\n", "field_number",
- StrCat(field->number()));
+ absl::StrCat(field->number()));
printer->Indent();
field_generators_.get(field).GenerateHashCode(printer);
printer->Print("break;\n");
@@ -1260,10 +1256,10 @@
"(com.google.protobuf.kotlin.OnlyForUseByGeneratedProtoCode::class)\n"
"@com.google.protobuf.kotlin.ProtoDslMarker\n");
printer->Print(
- "class Dsl private constructor(\n"
+ "public class Dsl private constructor(\n"
" private val _builder: $message$.Builder\n"
") {\n"
- " companion object {\n"
+ " public companion object {\n"
" @kotlin.jvm.JvmSynthetic\n"
" @kotlin.PublishedApi\n"
" internal fun _create(builder: $message$.Builder): Dsl = "
@@ -1273,7 +1269,8 @@
" @kotlin.jvm.JvmSynthetic\n"
" @kotlin.PublishedApi\n"
" internal fun _build(): $message$ = _builder.build()\n",
- "message", name_resolver_->GetClassName(descriptor_, true));
+ "message",
+ EscapeKotlinKeywords(name_resolver_->GetClassName(descriptor_, true)));
printer->Indent();
@@ -1285,16 +1282,16 @@
for (auto oneof : oneofs_) {
printer->Print(
- "val $oneof_name$Case: $message$.$oneof_capitalized_name$Case\n"
+ "public val $oneof_name$Case: $message$.$oneof_capitalized_name$Case\n"
" @JvmName(\"get$oneof_capitalized_name$Case\")\n"
" get() = _builder.get$oneof_capitalized_name$Case()\n\n"
- "fun clear$oneof_capitalized_name$() {\n"
+ "public fun clear$oneof_capitalized_name$() {\n"
" _builder.clear$oneof_capitalized_name$()\n"
"}\n",
"oneof_name", context_->GetOneofGeneratorInfo(oneof)->name,
"oneof_capitalized_name",
context_->GetOneofGeneratorInfo(oneof)->capitalized_name, "message",
- name_resolver_->GetClassName(descriptor_, true));
+ EscapeKotlinKeywords(name_resolver_->GetClassName(descriptor_, true)));
}
if (descriptor_->extension_range_count() > 0) {
@@ -1307,19 +1304,30 @@
void ImmutableMessageGenerator::GenerateKotlinMembers(
io::Printer* printer) const {
+ printer->Print("@kotlin.jvm.JvmName(\"-initialize$camelcase_name$\")\n",
+ "camelcase_name",
+ name_resolver_->GetKotlinFactoryName(descriptor_));
+
+ if (!context_->options().opensource_runtime) {
+ printer->Print("@com.google.errorprone.annotations.CheckReturnValue\n");
+ }
+
printer->Print(
- "@kotlin.jvm.JvmName(\"-initialize$camelcase_name$\")\n"
- "inline fun $camelcase_name$(block: $message_kt$.Dsl.() -> "
+ "public inline fun $camelcase_name$(block: $message_kt$.Dsl.() -> "
"kotlin.Unit): "
"$message$ "
"=\n"
" $message_kt$.Dsl._create($message$.newBuilder()).apply { block() "
"}._build()\n",
"camelcase_name", name_resolver_->GetKotlinFactoryName(descriptor_),
- "message_kt", name_resolver_->GetKotlinExtensionsClassName(descriptor_),
- "message", name_resolver_->GetClassName(descriptor_, true));
+ "message_kt",
+ EscapeKotlinKeywords(
+ name_resolver_->GetKotlinExtensionsClassName(descriptor_)),
+ "message",
+ EscapeKotlinKeywords(name_resolver_->GetClassName(descriptor_, true)));
- printer->Print("object $name$Kt {\n", "name", descriptor_->name());
+ WriteMessageDocComment(printer, descriptor_, /* kdoc */ true);
+ printer->Print("public object $name$Kt {\n", "name", descriptor_->name());
printer->Indent();
GenerateKotlinDsl(printer);
for (int i = 0; i < descriptor_->nested_type_count(); i++) {
@@ -1333,15 +1341,22 @@
void ImmutableMessageGenerator::GenerateTopLevelKotlinMembers(
io::Printer* printer) const {
+ printer->Print("@kotlin.jvm.JvmSynthetic\n");
+
+ if (context_->options().opensource_runtime) {
+ printer->Print("@com.google.errorprone.annotations.CheckReturnValue\n");
+ }
+
printer->Print(
- "@kotlin.jvm.JvmSynthetic\n"
- "inline fun $message$.copy(block: $message_kt$.Dsl.() -> "
- "kotlin.Unit): "
- "$message$ =\n"
+ "public inline fun $message$.copy(block: $message_kt$.Dsl.() -> "
+ "kotlin.Unit): $message$ =\n"
" $message_kt$.Dsl._create(this.toBuilder()).apply { block() "
"}._build()\n\n",
- "message", name_resolver_->GetClassName(descriptor_, true), "message_kt",
- name_resolver_->GetKotlinExtensionsClassName(descriptor_));
+ "message",
+ EscapeKotlinKeywords(name_resolver_->GetClassName(descriptor_, true)),
+ "message_kt",
+ EscapeKotlinKeywords(
+ name_resolver_->GetKotlinExtensionsClassName(descriptor_)));
for (int i = 0; i < descriptor_->nested_type_count(); i++) {
if (IsMapEntry(descriptor_->nested_type(i))) continue;
@@ -1357,25 +1372,28 @@
const FieldDescriptor* field = descriptor_->field(i);
if (field->has_presence() && GetJavaType(field) == JAVATYPE_MESSAGE) {
printer->Print(
- "val $full_classname$OrBuilder.$camelcase_name$OrNull: $full_name$?\n"
+ "public val $full_classname$OrBuilder.$camelcase_name$OrNull: $full_name$?\n"
" get() = if (has$name$()) get$name$() else null\n\n",
- "full_classname", name_resolver_->GetClassName(descriptor_, true),
+ "full_classname",
+ EscapeKotlinKeywords(name_resolver_->GetClassName(descriptor_, true)),
"camelcase_name", context_->GetFieldGeneratorInfo(field)->name,
"full_name",
- name_resolver_->GetImmutableClassName(field->message_type()), "name",
- context_->GetFieldGeneratorInfo(field)->capitalized_name);
+ EscapeKotlinKeywords(
+ name_resolver_->GetImmutableClassName(field->message_type())),
+ "name", context_->GetFieldGeneratorInfo(field)->capitalized_name);
}
}
}
void ImmutableMessageGenerator::GenerateKotlinExtensions(
io::Printer* printer) const {
- std::string message_name = name_resolver_->GetClassName(descriptor_, true);
+ std::string message_name =
+ EscapeKotlinKeywords(name_resolver_->GetClassName(descriptor_, true));
printer->Print(
"@Suppress(\"UNCHECKED_CAST\")\n"
"@kotlin.jvm.JvmSynthetic\n"
- "operator fun <T : kotlin.Any> get(extension: "
+ "public operator fun <T : kotlin.Any> get(extension: "
"com.google.protobuf.ExtensionLite<$message$, T>): T {\n"
" return if (extension.isRepeated) {\n"
" get(extension as com.google.protobuf.ExtensionLite<$message$, "
@@ -1391,7 +1409,7 @@
"@kotlin.OptIn"
"(com.google.protobuf.kotlin.OnlyForUseByGeneratedProtoCode::class)\n"
"@kotlin.jvm.JvmName(\"-getRepeatedExtension\")\n"
- "operator fun <E : kotlin.Any> get(\n"
+ "public operator fun <E : kotlin.Any> get(\n"
" extension: com.google.protobuf.ExtensionLite<$message$, List<E>>\n"
"): com.google.protobuf.kotlin.ExtensionList<E, $message$> {\n"
" return com.google.protobuf.kotlin.ExtensionList(extension, "
@@ -1401,7 +1419,7 @@
printer->Print(
"@kotlin.jvm.JvmSynthetic\n"
- "operator fun contains(extension: "
+ "public operator fun contains(extension: "
"com.google.protobuf.ExtensionLite<$message$, *>): "
"Boolean {\n"
" return _builder.hasExtension(extension)\n"
@@ -1410,7 +1428,7 @@
printer->Print(
"@kotlin.jvm.JvmSynthetic\n"
- "fun clear(extension: "
+ "public fun clear(extension: "
"com.google.protobuf.ExtensionLite<$message$, *>) "
"{\n"
" _builder.clearExtension(extension)\n"
@@ -1430,7 +1448,7 @@
printer->Print(
"@kotlin.jvm.JvmSynthetic\n"
"@Suppress(\"NOTHING_TO_INLINE\")\n"
- "inline operator fun <T : Comparable<T>> set(\n"
+ "public inline operator fun <T : Comparable<T>> set(\n"
" extension: com.google.protobuf.ExtensionLite<$message$, T>,\n"
" value: T\n"
") {\n"
@@ -1441,7 +1459,7 @@
printer->Print(
"@kotlin.jvm.JvmSynthetic\n"
"@Suppress(\"NOTHING_TO_INLINE\")\n"
- "inline operator fun set(\n"
+ "public inline operator fun set(\n"
" extension: com.google.protobuf.ExtensionLite<$message$, "
"com.google.protobuf.ByteString>,\n"
" value: com.google.protobuf.ByteString\n"
@@ -1453,7 +1471,7 @@
printer->Print(
"@kotlin.jvm.JvmSynthetic\n"
"@Suppress(\"NOTHING_TO_INLINE\")\n"
- "inline operator fun <T : com.google.protobuf.MessageLite> set(\n"
+ "public inline operator fun <T : com.google.protobuf.MessageLite> set(\n"
" extension: com.google.protobuf.ExtensionLite<$message$, T>,\n"
" value: T\n"
") {\n"
@@ -1463,7 +1481,7 @@
printer->Print(
"@kotlin.jvm.JvmSynthetic\n"
- "fun <E : kotlin.Any> com.google.protobuf.kotlin.ExtensionList<E, "
+ "public fun <E : kotlin.Any> com.google.protobuf.kotlin.ExtensionList<E, "
"$message$>.add(value: E) {\n"
" _builder.addExtension(this.extension, value)\n"
"}\n\n",
@@ -1472,7 +1490,7 @@
printer->Print(
"@kotlin.jvm.JvmSynthetic\n"
"@Suppress(\"NOTHING_TO_INLINE\")\n"
- "inline operator fun <E : kotlin.Any> "
+ "public inline operator fun <E : kotlin.Any> "
"com.google.protobuf.kotlin.ExtensionList<E, "
"$message$>.plusAssign"
"(value: E) {\n"
@@ -1482,7 +1500,7 @@
printer->Print(
"@kotlin.jvm.JvmSynthetic\n"
- "fun <E : kotlin.Any> com.google.protobuf.kotlin.ExtensionList<E, "
+ "public fun <E : kotlin.Any> com.google.protobuf.kotlin.ExtensionList<E, "
"$message$>.addAll(values: Iterable<E>) {\n"
" for (value in values) {\n"
" add(value)\n"
@@ -1493,7 +1511,7 @@
printer->Print(
"@kotlin.jvm.JvmSynthetic\n"
"@Suppress(\"NOTHING_TO_INLINE\")\n"
- "inline operator fun <E : kotlin.Any> "
+ "public inline operator fun <E : kotlin.Any> "
"com.google.protobuf.kotlin.ExtensionList<E, "
"$message$>.plusAssign(values: "
"Iterable<E>) {\n"
@@ -1503,7 +1521,7 @@
printer->Print(
"@kotlin.jvm.JvmSynthetic\n"
- "operator fun <E : kotlin.Any> "
+ "public operator fun <E : kotlin.Any> "
"com.google.protobuf.kotlin.ExtensionList<E, "
"$message$>.set(index: Int, value: "
"E) {\n"
@@ -1514,7 +1532,7 @@
printer->Print(
"@kotlin.jvm.JvmSynthetic\n"
"@Suppress(\"NOTHING_TO_INLINE\")\n"
- "inline fun com.google.protobuf.kotlin.ExtensionList<*, "
+ "public inline fun com.google.protobuf.kotlin.ExtensionList<*, "
"$message$>.clear() {\n"
" clear(extension)\n"
"}\n\n",
@@ -1574,7 +1592,8 @@
"@java.lang.SuppressWarnings(\"unchecked\")\n"
"public <T extends com.google.protobuf.Message> T unpack(\n"
" java.lang.Class<T> clazz)\n"
- " throws com.google.protobuf.InvalidProtocolBufferException {\n"
+ " throws com.google.protobuf.InvalidProtocolBufferException {\n");
+ printer->Print(
" boolean invalidClazz = false;\n"
" if (cachedUnpackValue != null) {\n"
" if (cachedUnpackValue.getClass() == clazz) {\n"
@@ -1600,4 +1619,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/compiler/java/message.h b/src/google/protobuf/compiler/java/message.h
index 2dbd0dd..0380eab 100644
--- a/src/google/protobuf/compiler/java/message.h
+++ b/src/google/protobuf/compiler/java/message.h
@@ -38,7 +38,7 @@
#include <map>
#include <string>
-#include <google/protobuf/compiler/java/field.h>
+#include "google/protobuf/compiler/java/field.h"
namespace google {
namespace protobuf {
@@ -64,6 +64,8 @@
class MessageGenerator {
public:
explicit MessageGenerator(const Descriptor* descriptor);
+ MessageGenerator(const MessageGenerator&) = delete;
+ MessageGenerator& operator=(const MessageGenerator&) = delete;
virtual ~MessageGenerator();
// All static variables have to be declared at the top-level of the file
@@ -93,14 +95,14 @@
protected:
const Descriptor* descriptor_;
std::set<const OneofDescriptor*> oneofs_;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageGenerator);
};
class ImmutableMessageGenerator : public MessageGenerator {
public:
ImmutableMessageGenerator(const Descriptor* descriptor, Context* context);
+ ImmutableMessageGenerator(const ImmutableMessageGenerator&) = delete;
+ ImmutableMessageGenerator& operator=(const ImmutableMessageGenerator&) =
+ delete;
~ImmutableMessageGenerator() override;
void Generate(io::Printer* printer) override;
@@ -123,10 +125,6 @@
void GenerateMessageSerializationMethods(io::Printer* printer);
void GenerateParseFromMethods(io::Printer* printer);
- void GenerateSerializeOneField(io::Printer* printer,
- const FieldDescriptor* field);
- void GenerateSerializeOneExtensionRange(
- io::Printer* printer, const Descriptor::ExtensionRange* range);
void GenerateBuilder(io::Printer* printer);
void GenerateIsInitialized(io::Printer* printer);
@@ -143,8 +141,6 @@
Context* context_;
ClassNameResolver* name_resolver_;
FieldGeneratorMap<ImmutableFieldGenerator> field_generators_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableMessageGenerator);
};
} // namespace java
diff --git a/src/google/protobuf/compiler/java/message_builder.cc b/src/google/protobuf/compiler/java/message_builder.cc
index 27e11ae..076b042 100644
--- a/src/google/protobuf/compiler/java/message_builder.cc
+++ b/src/google/protobuf/compiler/java/message_builder.cc
@@ -32,29 +32,31 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/compiler/java/message_builder.h>
+#include "google/protobuf/compiler/java/message_builder.h"
#include <algorithm>
#include <map>
#include <memory>
#include <vector>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/wire_format.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/substitute.h>
-#include <google/protobuf/compiler/java/context.h>
-#include <google/protobuf/compiler/java/doc_comment.h>
-#include <google/protobuf/compiler/java/enum.h>
-#include <google/protobuf/compiler/java/extension.h>
-#include <google/protobuf/compiler/java/generator_factory.h>
-#include <google/protobuf/compiler/java/helpers.h>
-#include <google/protobuf/compiler/java/name_resolver.h>
-#include <google/protobuf/descriptor.pb.h>
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/wire_format.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "absl/strings/ascii.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/substitute.h"
+#include "google/protobuf/compiler/java/context.h"
+#include "google/protobuf/compiler/java/doc_comment.h"
+#include "google/protobuf/compiler/java/enum.h"
+#include "google/protobuf/compiler/java/extension.h"
+#include "google/protobuf/compiler/java/generator_factory.h"
+#include "google/protobuf/compiler/java/helpers.h"
+#include "google/protobuf/compiler/java/name_resolver.h"
+#include "google/protobuf/descriptor.pb.h"
// Must be last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -130,7 +132,7 @@
vars["oneof_name"] = context_->GetOneofGeneratorInfo(oneof)->name;
vars["oneof_capitalized_name"] =
context_->GetOneofGeneratorInfo(oneof)->capitalized_name;
- vars["oneof_index"] = StrCat(oneof->index());
+ vars["oneof_index"] = absl::StrCat(oneof->index());
// oneofCase_ and oneof_
printer->Print(vars,
"private int $oneof_name$Case_ = 0;\n"
@@ -171,24 +173,26 @@
.GenerateBuilderMembers(printer);
}
- // Override methods declared in GeneratedMessage to return the concrete
- // generated type so callsites won't depend on GeneratedMessage. This
- // is needed to keep binary compatibility when we change generated code
- // to subclass a different GeneratedMessage class (e.g., in v3.0.0 release
- // we changed all generated code to subclass GeneratedMessageV3).
- printer->Print(
- "@java.lang.Override\n"
- "public final Builder setUnknownFields(\n"
- " final com.google.protobuf.UnknownFieldSet unknownFields) {\n"
- " return super.setUnknownFields(unknownFields);\n"
- "}\n"
- "\n"
- "@java.lang.Override\n"
- "public final Builder mergeUnknownFields(\n"
- " final com.google.protobuf.UnknownFieldSet unknownFields) {\n"
- " return super.mergeUnknownFields(unknownFields);\n"
- "}\n"
- "\n");
+ if (context_->options().opensource_runtime) {
+ // Override methods declared in GeneratedMessage to return the concrete
+ // generated type so callsites won't depend on GeneratedMessage. This
+ // is needed to keep binary compatibility when we change generated code
+ // to subclass a different GeneratedMessage class (e.g., in v3.0.0 release
+ // we changed all generated code to subclass GeneratedMessageV3).
+ printer->Print(
+ "@java.lang.Override\n"
+ "public final Builder setUnknownFields(\n"
+ " final com.google.protobuf.UnknownFieldSet unknownFields) {\n"
+ " return super.setUnknownFields(unknownFields);\n"
+ "}\n"
+ "\n"
+ "@java.lang.Override\n"
+ "public final Builder mergeUnknownFields(\n"
+ " final com.google.protobuf.UnknownFieldSet unknownFields) {\n"
+ " return super.mergeUnknownFields(unknownFields);\n"
+ "}\n"
+ "\n");
+ }
printer->Print(
"\n"
@@ -234,7 +238,7 @@
printer->Print(
"case $number$:\n"
" return internalGet$capitalized_name$();\n",
- "number", StrCat(field->number()), "capitalized_name",
+ "number", absl::StrCat(field->number()), "capitalized_name",
info->capitalized_name);
}
printer->Print(
@@ -259,7 +263,7 @@
printer->Print(
"case $number$:\n"
" return internalGetMutable$capitalized_name$();\n",
- "number", StrCat(field->number()), "capitalized_name",
+ "number", absl::StrCat(field->number()), "capitalized_name",
info->capitalized_name);
}
printer->Print(
@@ -464,75 +468,77 @@
"\n",
"classname", name_resolver_->GetImmutableClassName(descriptor_));
- // Override methods declared in GeneratedMessage to return the concrete
- // generated type so callsites won't depend on GeneratedMessage. This
- // is needed to keep binary compatibility when we change generated code
- // to subclass a different GeneratedMessage class (e.g., in v3.0.0 release
- // we changed all generated code to subclass GeneratedMessageV3).
- printer->Print(
- "@java.lang.Override\n"
- "public Builder clone() {\n"
- " return super.clone();\n"
- "}\n"
- "@java.lang.Override\n"
- "public Builder setField(\n"
- " com.google.protobuf.Descriptors.FieldDescriptor field,\n"
- " java.lang.Object value) {\n"
- " return super.setField(field, value);\n"
- "}\n"
- "@java.lang.Override\n"
- "public Builder clearField(\n"
- " com.google.protobuf.Descriptors.FieldDescriptor field) {\n"
- " return super.clearField(field);\n"
- "}\n"
- "@java.lang.Override\n"
- "public Builder clearOneof(\n"
- " com.google.protobuf.Descriptors.OneofDescriptor oneof) {\n"
- " return super.clearOneof(oneof);\n"
- "}\n"
- "@java.lang.Override\n"
- "public Builder setRepeatedField(\n"
- " com.google.protobuf.Descriptors.FieldDescriptor field,\n"
- " int index, java.lang.Object value) {\n"
- " return super.setRepeatedField(field, index, value);\n"
- "}\n"
- "@java.lang.Override\n"
- "public Builder addRepeatedField(\n"
- " com.google.protobuf.Descriptors.FieldDescriptor field,\n"
- " java.lang.Object value) {\n"
- " return super.addRepeatedField(field, value);\n"
- "}\n");
-
- if (descriptor_->extension_range_count() > 0) {
+ if (context_->options().opensource_runtime) {
+ // Override methods declared in GeneratedMessage to return the concrete
+ // generated type so callsites won't depend on GeneratedMessage. This
+ // is needed to keep binary compatibility when we change generated code
+ // to subclass a different GeneratedMessage class (e.g., in v3.0.0 release
+ // we changed all generated code to subclass GeneratedMessageV3).
printer->Print(
"@java.lang.Override\n"
- "public <Type> Builder setExtension(\n"
- " com.google.protobuf.GeneratedMessage.GeneratedExtension<\n"
- " $classname$, Type> extension,\n"
- " Type value) {\n"
- " return super.setExtension(extension, value);\n"
+ "public Builder clone() {\n"
+ " return super.clone();\n"
"}\n"
"@java.lang.Override\n"
- "public <Type> Builder setExtension(\n"
- " com.google.protobuf.GeneratedMessage.GeneratedExtension<\n"
- " $classname$, java.util.List<Type>> extension,\n"
- " int index, Type value) {\n"
- " return super.setExtension(extension, index, value);\n"
+ "public Builder setField(\n"
+ " com.google.protobuf.Descriptors.FieldDescriptor field,\n"
+ " java.lang.Object value) {\n"
+ " return super.setField(field, value);\n"
"}\n"
"@java.lang.Override\n"
- "public <Type> Builder addExtension(\n"
- " com.google.protobuf.GeneratedMessage.GeneratedExtension<\n"
- " $classname$, java.util.List<Type>> extension,\n"
- " Type value) {\n"
- " return super.addExtension(extension, value);\n"
+ "public Builder clearField(\n"
+ " com.google.protobuf.Descriptors.FieldDescriptor field) {\n"
+ " return super.clearField(field);\n"
"}\n"
"@java.lang.Override\n"
- "public <Type> Builder clearExtension(\n"
- " com.google.protobuf.GeneratedMessage.GeneratedExtension<\n"
- " $classname$, ?> extension) {\n"
- " return super.clearExtension(extension);\n"
- "}\n",
- "classname", name_resolver_->GetImmutableClassName(descriptor_));
+ "public Builder clearOneof(\n"
+ " com.google.protobuf.Descriptors.OneofDescriptor oneof) {\n"
+ " return super.clearOneof(oneof);\n"
+ "}\n"
+ "@java.lang.Override\n"
+ "public Builder setRepeatedField(\n"
+ " com.google.protobuf.Descriptors.FieldDescriptor field,\n"
+ " int index, java.lang.Object value) {\n"
+ " return super.setRepeatedField(field, index, value);\n"
+ "}\n"
+ "@java.lang.Override\n"
+ "public Builder addRepeatedField(\n"
+ " com.google.protobuf.Descriptors.FieldDescriptor field,\n"
+ " java.lang.Object value) {\n"
+ " return super.addRepeatedField(field, value);\n"
+ "}\n");
+
+ if (descriptor_->extension_range_count() > 0) {
+ printer->Print(
+ "@java.lang.Override\n"
+ "public <Type> Builder setExtension(\n"
+ " com.google.protobuf.GeneratedMessage.GeneratedExtension<\n"
+ " $classname$, Type> extension,\n"
+ " Type value) {\n"
+ " return super.setExtension(extension, value);\n"
+ "}\n"
+ "@java.lang.Override\n"
+ "public <Type> Builder setExtension(\n"
+ " com.google.protobuf.GeneratedMessage.GeneratedExtension<\n"
+ " $classname$, java.util.List<Type>> extension,\n"
+ " int index, Type value) {\n"
+ " return super.setExtension(extension, index, value);\n"
+ "}\n"
+ "@java.lang.Override\n"
+ "public <Type> Builder addExtension(\n"
+ " com.google.protobuf.GeneratedMessage.GeneratedExtension<\n"
+ " $classname$, java.util.List<Type>> extension,\n"
+ " Type value) {\n"
+ " return super.addExtension(extension, value);\n"
+ "}\n"
+ "@java.lang.Override\n"
+ "public <Type> Builder clearExtension(\n"
+ " com.google.protobuf.GeneratedMessage.GeneratedExtension<\n"
+ " $classname$, ?> extension) {\n"
+ " return super.clearExtension(extension);\n"
+ "}\n",
+ "classname", name_resolver_->GetImmutableClassName(descriptor_));
+ }
}
// -----------------------------------------------------------------
@@ -575,7 +581,7 @@
for (int j = 0; j < oneof->field_count(); j++) {
const FieldDescriptor* field = oneof->field(j);
printer->Print("case $field_name$: {\n", "field_name",
- ToUpper(field->name()));
+ absl::AsciiStrToUpper(field->name()));
printer->Indent();
field_generators_.get(field).GenerateMergingCode(printer);
printer->Print("break;\n");
@@ -587,7 +593,7 @@
" break;\n"
"}\n",
"cap_oneof_name",
- ToUpper(context_->GetOneofGeneratorInfo(oneof)->name));
+ absl::AsciiStrToUpper(context_->GetOneofGeneratorInfo(oneof)->name));
printer->Outdent();
printer->Print("}\n");
}
@@ -676,7 +682,7 @@
io::Printer* printer, const FieldDescriptor* field) {
uint32_t tag = WireFormatLite::MakeTag(
field->number(), WireFormat::WireTypeForFieldType(field->type()));
- std::string tagString = StrCat(static_cast<int32_t>(tag));
+ std::string tagString = absl::StrCat(static_cast<int32_t>(tag));
printer->Print("case $tag$: {\n", "tag", tagString);
printer->Indent();
@@ -695,7 +701,7 @@
// packed version of this field regardless of field->options().packed().
uint32_t tag = WireFormatLite::MakeTag(
field->number(), WireFormatLite::WIRETYPE_LENGTH_DELIMITED);
- std::string tagString = StrCat(static_cast<int32_t>(tag));
+ std::string tagString = absl::StrCat(static_cast<int32_t>(tag));
printer->Print("case $tag$: {\n", "tag", tagString);
printer->Indent();
@@ -807,4 +813,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/compiler/java/message_builder.h b/src/google/protobuf/compiler/java/message_builder.h
index 3b71b8c..5d37bb6 100644
--- a/src/google/protobuf/compiler/java/message_builder.h
+++ b/src/google/protobuf/compiler/java/message_builder.h
@@ -38,7 +38,7 @@
#include <map>
#include <string>
-#include <google/protobuf/compiler/java/field.h>
+#include "google/protobuf/compiler/java/field.h"
namespace google {
namespace protobuf {
@@ -63,6 +63,8 @@
public:
explicit MessageBuilderGenerator(const Descriptor* descriptor,
Context* context);
+ MessageBuilderGenerator(const MessageBuilderGenerator&) = delete;
+ MessageBuilderGenerator& operator=(const MessageBuilderGenerator&) = delete;
virtual ~MessageBuilderGenerator();
virtual void Generate(io::Printer* printer);
@@ -83,8 +85,6 @@
ClassNameResolver* name_resolver_;
FieldGeneratorMap<ImmutableFieldGenerator> field_generators_;
std::set<const OneofDescriptor*> oneofs_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageBuilderGenerator);
};
} // namespace java
diff --git a/src/google/protobuf/compiler/java/message_builder_lite.cc b/src/google/protobuf/compiler/java/message_builder_lite.cc
index 526f949..adff67e 100644
--- a/src/google/protobuf/compiler/java/message_builder_lite.cc
+++ b/src/google/protobuf/compiler/java/message_builder_lite.cc
@@ -32,29 +32,31 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/compiler/java/message_builder_lite.h>
+#include "google/protobuf/compiler/java/message_builder_lite.h"
#include <algorithm>
#include <map>
#include <memory>
+#include <string>
#include <vector>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/wire_format.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/substitute.h>
-#include <google/protobuf/compiler/java/context.h>
-#include <google/protobuf/compiler/java/doc_comment.h>
-#include <google/protobuf/compiler/java/enum.h>
-#include <google/protobuf/compiler/java/extension.h>
-#include <google/protobuf/compiler/java/generator_factory.h>
-#include <google/protobuf/compiler/java/helpers.h>
-#include <google/protobuf/compiler/java/name_resolver.h>
-#include <google/protobuf/descriptor.pb.h>
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/wire_format.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/substitute.h"
+#include "google/protobuf/compiler/java/context.h"
+#include "google/protobuf/compiler/java/doc_comment.h"
+#include "google/protobuf/compiler/java/enum.h"
+#include "google/protobuf/compiler/java/extension.h"
+#include "google/protobuf/compiler/java/generator_factory.h"
+#include "google/protobuf/compiler/java/helpers.h"
+#include "google/protobuf/compiler/java/name_resolver.h"
+#include "google/protobuf/descriptor.pb.h"
// Must be last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -81,41 +83,50 @@
void MessageBuilderLiteGenerator::Generate(io::Printer* printer) {
WriteMessageDocComment(printer, descriptor_);
+ std::map<std::string, std::string> vars = {
+ {"{", ""},
+ {"}", ""},
+ {"classname", name_resolver_->GetImmutableClassName(descriptor_)},
+ {"extra_interfaces", ExtraBuilderInterfaces(descriptor_)},
+ {"extendible",
+ descriptor_->extension_range_count() > 0 ? "Extendable" : ""},
+ };
printer->Print(
- "public static final class Builder extends\n"
+ vars,
+ "public static final class ${$Builder$}$ extends\n"
" com.google.protobuf.GeneratedMessageLite.$extendible$Builder<\n"
" $classname$, Builder> implements\n"
" $extra_interfaces$\n"
- " $classname$OrBuilder {\n",
- "classname", name_resolver_->GetImmutableClassName(descriptor_),
- "extra_interfaces", ExtraBuilderInterfaces(descriptor_), "extendible",
- descriptor_->extension_range_count() > 0 ? "Extendable" : "");
+ " $classname$OrBuilder {\n");
+ printer->Annotate("{", "}", descriptor_);
printer->Indent();
GenerateCommonBuilderMethods(printer);
// oneof
- std::map<std::string, std::string> vars;
for (auto oneof : oneofs_) {
vars["oneof_name"] = context_->GetOneofGeneratorInfo(oneof)->name;
vars["oneof_capitalized_name"] =
context_->GetOneofGeneratorInfo(oneof)->capitalized_name;
- vars["oneof_index"] = StrCat(oneof->index());
+ vars["oneof_index"] = absl::StrCat(oneof->index());
// oneofCase() and clearOneof()
printer->Print(vars,
"@java.lang.Override\n"
"public $oneof_capitalized_name$Case\n"
- " get$oneof_capitalized_name$Case() {\n"
+ " ${$get$oneof_capitalized_name$Case$}$() {\n"
" return instance.get$oneof_capitalized_name$Case();\n"
- "}\n"
+ "}\n");
+ printer->Annotate("{", "}", oneof);
+ printer->Print(vars,
"\n"
- "public Builder clear$oneof_capitalized_name$() {\n"
+ "public Builder ${$clear$oneof_capitalized_name$$}$() {\n"
" copyOnWrite();\n"
" instance.clear$oneof_capitalized_name$();\n"
" return this;\n"
"}\n"
"\n");
+ printer->Annotate("{", "}", oneof);
}
for (int i = 0; i < descriptor_->field_count(); i++) {
@@ -153,4 +164,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/compiler/java/message_builder_lite.h b/src/google/protobuf/compiler/java/message_builder_lite.h
index 0d895fc..f21aec6 100644
--- a/src/google/protobuf/compiler/java/message_builder_lite.h
+++ b/src/google/protobuf/compiler/java/message_builder_lite.h
@@ -38,7 +38,7 @@
#include <map>
#include <string>
-#include <google/protobuf/compiler/java/field.h>
+#include "google/protobuf/compiler/java/field.h"
namespace google {
namespace protobuf {
@@ -63,6 +63,9 @@
public:
explicit MessageBuilderLiteGenerator(const Descriptor* descriptor,
Context* context);
+ MessageBuilderLiteGenerator(const MessageBuilderLiteGenerator&) = delete;
+ MessageBuilderLiteGenerator& operator=(const MessageBuilderLiteGenerator&) =
+ delete;
virtual ~MessageBuilderLiteGenerator();
virtual void Generate(io::Printer* printer);
@@ -75,8 +78,6 @@
ClassNameResolver* name_resolver_;
FieldGeneratorMap<ImmutableFieldLiteGenerator> field_generators_;
std::set<const OneofDescriptor*> oneofs_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageBuilderLiteGenerator);
};
} // namespace java
diff --git a/src/google/protobuf/compiler/java/message_field.cc b/src/google/protobuf/compiler/java/message_field.cc
index 1ec372e..42905c3 100644
--- a/src/google/protobuf/compiler/java/message_field.cc
+++ b/src/google/protobuf/compiler/java/message_field.cc
@@ -32,21 +32,21 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/compiler/java/message_field.h>
+#include "google/protobuf/compiler/java/message_field.h"
#include <map>
#include <string>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/wire_format.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/compiler/java/context.h>
-#include <google/protobuf/compiler/java/doc_comment.h>
-#include <google/protobuf/compiler/java/helpers.h>
-#include <google/protobuf/compiler/java/name_resolver.h>
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/wire_format.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "google/protobuf/compiler/java/context.h"
+#include "google/protobuf/compiler/java/doc_comment.h"
+#include "google/protobuf/compiler/java/helpers.h"
+#include "google/protobuf/compiler/java/name_resolver.h"
// Must be last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -59,12 +59,13 @@
void SetMessageVariables(const FieldDescriptor* descriptor, int messageBitIndex,
int builderBitIndex, const FieldGeneratorInfo* info,
ClassNameResolver* name_resolver,
- std::map<std::string, std::string>* variables) {
+ std::map<std::string, std::string>* variables,
+ Context* context) {
SetCommonFieldVariables(descriptor, info, variables);
(*variables)["type"] =
name_resolver->GetImmutableClassName(descriptor->message_type());
- (*variables)["kt_type"] = (*variables)["type"];
+ (*variables)["kt_type"] = EscapeKotlinKeywords((*variables)["type"]);
(*variables)["mutable_type"] =
name_resolver->GetMutableClassName(descriptor->message_type());
(*variables)["group_or_message"] =
@@ -82,8 +83,10 @@
(*variables)["on_changed"] = "onChanged();";
(*variables)["ver"] = GeneratedCodeVersionSuffix();
(*variables)["get_parser"] =
- ExposePublicParser(descriptor->message_type()->file()) ? "PARSER"
- : "parser()";
+ ExposePublicParser(descriptor->message_type()->file()) &&
+ context->options().opensource_runtime
+ ? "PARSER"
+ : "parser()";
if (HasHasbit(descriptor)) {
// For singular messages and builders, one bit is used for the hasField bit.
@@ -126,10 +129,12 @@
ImmutableMessageFieldGenerator::ImmutableMessageFieldGenerator(
const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex,
Context* context)
- : descriptor_(descriptor), name_resolver_(context->GetNameResolver()) {
+ : descriptor_(descriptor),
+ name_resolver_(context->GetNameResolver()),
+ context_(context) {
SetMessageVariables(descriptor, messageBitIndex, builderBitIndex,
context->GetFieldGeneratorInfo(descriptor),
- name_resolver_, &variables_);
+ name_resolver_, &variables_, context);
}
ImmutableMessageFieldGenerator::~ImmutableMessageFieldGenerator() {}
@@ -412,9 +417,9 @@
void ImmutableMessageFieldGenerator::GenerateKotlinDslMembers(
io::Printer* printer) const {
- WriteFieldDocComment(printer, descriptor_);
+ WriteFieldDocComment(printer, descriptor_, /* kdoc */ true);
printer->Print(variables_,
- "$kt_deprecation$var $kt_name$: $kt_type$\n"
+ "$kt_deprecation$public var $kt_name$: $kt_type$\n"
" @JvmName(\"${$get$kt_capitalized_name$$}$\")\n"
" get() = $kt_dsl_builder$.${$get$capitalized_name$$}$()\n"
" @JvmName(\"${$set$kt_capitalized_name$$}$\")\n"
@@ -423,16 +428,17 @@
" }\n");
WriteFieldAccessorDocComment(printer, descriptor_, CLEARER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(variables_,
- "fun ${$clear$kt_capitalized_name$$}$() {\n"
+ "public fun ${$clear$kt_capitalized_name$$}$() {\n"
" $kt_dsl_builder$.${$clear$capitalized_name$$}$()\n"
"}\n");
- WriteFieldAccessorDocComment(printer, descriptor_, HAZZER);
+ WriteFieldAccessorDocComment(printer, descriptor_, HAZZER,
+ /* builder */ false, /* kdoc */ true);
printer->Print(
variables_,
- "fun ${$has$kt_capitalized_name$$}$(): kotlin.Boolean {\n"
+ "public fun ${$has$kt_capitalized_name$$}$(): kotlin.Boolean {\n"
" return $kt_dsl_builder$.${$has$capitalized_name$$}$()\n"
"}\n");
@@ -442,7 +448,7 @@
void ImmutableMessageFieldGenerator::GenerateKotlinOrNull(io::Printer* printer) const {
if (descriptor_->has_optional_keyword()) {
printer->Print(variables_,
- "val $classname$Kt.Dsl.$name$OrNull: $kt_type$?\n"
+ "public val $classname$Kt.Dsl.$name$OrNull: $kt_type$?\n"
" get() = $kt_dsl_builder$.$name$OrNull\n");
}
}
@@ -837,7 +843,7 @@
: descriptor_(descriptor), name_resolver_(context->GetNameResolver()) {
SetMessageVariables(descriptor, messageBitIndex, builderBitIndex,
context->GetFieldGeneratorInfo(descriptor),
- name_resolver_, &variables_);
+ name_resolver_, &variables_, context);
}
RepeatedImmutableMessageFieldGenerator::
@@ -1389,12 +1395,12 @@
" */\n"
"@kotlin.OptIn"
"(com.google.protobuf.kotlin.OnlyForUseByGeneratedProtoCode::class)\n"
- "class ${$$kt_capitalized_name$Proxy$}$ private constructor()"
+ "public class ${$$kt_capitalized_name$Proxy$}$ private constructor()"
" : com.google.protobuf.kotlin.DslProxy()\n");
- WriteFieldDocComment(printer, descriptor_);
+ WriteFieldDocComment(printer, descriptor_, /* kdoc */ true);
printer->Print(variables_,
- "$kt_deprecation$ val $kt_name$: "
+ "$kt_deprecation$ public val $kt_name$: "
"com.google.protobuf.kotlin.DslList"
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>\n"
" @kotlin.jvm.JvmSynthetic\n"
@@ -1403,70 +1409,70 @@
" )\n");
WriteFieldAccessorDocComment(printer, descriptor_, LIST_ADDER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"add$kt_capitalized_name$\")\n"
- "fun com.google.protobuf.kotlin.DslList"
+ "public fun com.google.protobuf.kotlin.DslList"
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>."
"add(value: $kt_type$) {\n"
" $kt_dsl_builder$.${$add$capitalized_name$$}$(value)\n"
"}\n");
WriteFieldAccessorDocComment(printer, descriptor_, LIST_ADDER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"plusAssign$kt_capitalized_name$\")\n"
"@Suppress(\"NOTHING_TO_INLINE\")\n"
- "inline operator fun com.google.protobuf.kotlin.DslList"
+ "public inline operator fun com.google.protobuf.kotlin.DslList"
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>."
"plusAssign(value: $kt_type$) {\n"
" add(value)\n"
"}\n");
WriteFieldAccessorDocComment(printer, descriptor_, LIST_MULTI_ADDER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"addAll$kt_capitalized_name$\")\n"
- "fun com.google.protobuf.kotlin.DslList"
+ "public fun com.google.protobuf.kotlin.DslList"
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>."
"addAll(values: kotlin.collections.Iterable<$kt_type$>) {\n"
" $kt_dsl_builder$.${$addAll$capitalized_name$$}$(values)\n"
"}\n");
WriteFieldAccessorDocComment(printer, descriptor_, LIST_MULTI_ADDER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(
variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"plusAssignAll$kt_capitalized_name$\")\n"
"@Suppress(\"NOTHING_TO_INLINE\")\n"
- "inline operator fun com.google.protobuf.kotlin.DslList"
+ "public inline operator fun com.google.protobuf.kotlin.DslList"
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>."
"plusAssign(values: kotlin.collections.Iterable<$kt_type$>) {\n"
" addAll(values)\n"
"}\n");
WriteFieldAccessorDocComment(printer, descriptor_, LIST_INDEXED_SETTER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(
variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"set$kt_capitalized_name$\")\n"
- "operator fun com.google.protobuf.kotlin.DslList"
+ "public operator fun com.google.protobuf.kotlin.DslList"
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>."
"set(index: kotlin.Int, value: $kt_type$) {\n"
" $kt_dsl_builder$.${$set$capitalized_name$$}$(index, value)\n"
"}\n");
WriteFieldAccessorDocComment(printer, descriptor_, CLEARER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"clear$kt_capitalized_name$\")\n"
- "fun com.google.protobuf.kotlin.DslList"
+ "public fun com.google.protobuf.kotlin.DslList"
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>."
"clear() {\n"
" $kt_dsl_builder$.${$clear$capitalized_name$$}$()\n"
@@ -1478,4 +1484,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/compiler/java/message_field.h b/src/google/protobuf/compiler/java/message_field.h
index 3ff53ab..4fe5ac7 100644
--- a/src/google/protobuf/compiler/java/message_field.h
+++ b/src/google/protobuf/compiler/java/message_field.h
@@ -38,7 +38,7 @@
#include <map>
#include <string>
-#include <google/protobuf/compiler/java/field.h>
+#include "google/protobuf/compiler/java/field.h"
namespace google {
namespace protobuf {
@@ -62,6 +62,10 @@
int messageBitIndex,
int builderBitIndex,
Context* context);
+ ImmutableMessageFieldGenerator(const ImmutableMessageFieldGenerator&) =
+ delete;
+ ImmutableMessageFieldGenerator& operator=(
+ const ImmutableMessageFieldGenerator&) = delete;
~ImmutableMessageFieldGenerator() override;
// implements ImmutableFieldGenerator
@@ -90,6 +94,7 @@
const FieldDescriptor* descriptor_;
std::map<std::string, std::string> variables_;
ClassNameResolver* name_resolver_;
+ Context* context_;
void PrintNestedBuilderCondition(io::Printer* printer,
const char* regular_case,
@@ -101,7 +106,6 @@
const char* trailing_code) const;
private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableMessageFieldGenerator);
void GenerateKotlinOrNull(io::Printer* printer) const;
};
@@ -111,6 +115,10 @@
ImmutableMessageOneofFieldGenerator(const FieldDescriptor* descriptor,
int messageBitIndex, int builderBitIndex,
Context* context);
+ ImmutableMessageOneofFieldGenerator(
+ const ImmutableMessageOneofFieldGenerator&) = delete;
+ ImmutableMessageOneofFieldGenerator& operator=(
+ const ImmutableMessageOneofFieldGenerator&) = delete;
~ImmutableMessageOneofFieldGenerator() override;
void GenerateMembers(io::Printer* printer) const override;
@@ -121,9 +129,6 @@
void GenerateBuilderParsingCode(io::Printer* printer) const override;
void GenerateSerializationCode(io::Printer* printer) const override;
void GenerateSerializedSizeCode(io::Printer* printer) const override;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableMessageOneofFieldGenerator);
};
class RepeatedImmutableMessageFieldGenerator : public ImmutableFieldGenerator {
@@ -131,6 +136,10 @@
explicit RepeatedImmutableMessageFieldGenerator(
const FieldDescriptor* descriptor, int messageBitIndex,
int builderBitIndex, Context* context);
+ RepeatedImmutableMessageFieldGenerator(
+ const RepeatedImmutableMessageFieldGenerator&) = delete;
+ RepeatedImmutableMessageFieldGenerator& operator=(
+ const RepeatedImmutableMessageFieldGenerator&) = delete;
~RepeatedImmutableMessageFieldGenerator() override;
// implements ImmutableFieldGenerator ---------------------------------------
@@ -167,9 +176,6 @@
const char* regular_case,
const char* nested_builder_case,
const char* trailing_code) const;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedImmutableMessageFieldGenerator);
};
} // namespace java
diff --git a/src/google/protobuf/compiler/java/message_field_lite.cc b/src/google/protobuf/compiler/java/message_field_lite.cc
index eb37ca6..bc7c99f 100644
--- a/src/google/protobuf/compiler/java/message_field_lite.cc
+++ b/src/google/protobuf/compiler/java/message_field_lite.cc
@@ -32,22 +32,23 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/compiler/java/message_field_lite.h>
+#include "google/protobuf/compiler/java/message_field_lite.h"
#include <cstdint>
#include <map>
#include <string>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/wire_format.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/compiler/java/context.h>
-#include <google/protobuf/compiler/java/doc_comment.h>
-#include <google/protobuf/compiler/java/helpers.h>
-#include <google/protobuf/compiler/java/name_resolver.h>
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/wire_format.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "absl/strings/str_cat.h"
+#include "google/protobuf/compiler/java/context.h"
+#include "google/protobuf/compiler/java/doc_comment.h"
+#include "google/protobuf/compiler/java/helpers.h"
+#include "google/protobuf/compiler/java/name_resolver.h"
// Must be last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -59,12 +60,13 @@
void SetMessageVariables(const FieldDescriptor* descriptor, int messageBitIndex,
int builderBitIndex, const FieldGeneratorInfo* info,
ClassNameResolver* name_resolver,
- std::map<std::string, std::string>* variables) {
+ std::map<std::string, std::string>* variables,
+ Context* context) {
SetCommonFieldVariables(descriptor, info, variables);
(*variables)["type"] =
name_resolver->GetImmutableClassName(descriptor->message_type());
- (*variables)["kt_type"] = (*variables)["type"];
+ (*variables)["kt_type"] = EscapeKotlinKeywords((*variables)["type"]);
(*variables)["mutable_type"] =
name_resolver->GetMutableClassName(descriptor->message_type());
(*variables)["group_or_message"] =
@@ -108,6 +110,9 @@
// We use `x.getClass()` as a null check because it generates less bytecode
// than an `if (x == null) { throw ... }` statement.
(*variables)["null_check"] = "value.getClass();\n";
+ // Annotations often use { and } to determine ranges.
+ (*variables)["{"] = "";
+ (*variables)["}"] = "";
}
} // namespace
@@ -118,10 +123,11 @@
const FieldDescriptor* descriptor, int messageBitIndex, Context* context)
: descriptor_(descriptor),
messageBitIndex_(messageBitIndex),
- name_resolver_(context->GetNameResolver()) {
+ name_resolver_(context->GetNameResolver()),
+ context_(context) {
SetMessageVariables(descriptor, messageBitIndex, 0,
context->GetFieldGeneratorInfo(descriptor),
- name_resolver_, &variables_);
+ name_resolver_, &variables_, context);
}
ImmutableMessageFieldLiteGenerator::~ImmutableMessageFieldLiteGenerator() {}
@@ -137,9 +143,13 @@
void ImmutableMessageFieldLiteGenerator::GenerateInterfaceMembers(
io::Printer* printer) const {
WriteFieldAccessorDocComment(printer, descriptor_, HAZZER);
- printer->Print(variables_, "$deprecation$boolean has$capitalized_name$();\n");
+ printer->Print(variables_,
+ "$deprecation$boolean ${$has$capitalized_name$$}$();\n");
+ printer->Annotate("{", "}", descriptor_);
WriteFieldAccessorDocComment(printer, descriptor_, GETTER);
- printer->Print(variables_, "$deprecation$$type$ get$capitalized_name$();\n");
+ printer->Print(variables_,
+ "$deprecation$$type$ ${$get$capitalized_name$$}$();\n");
+ printer->Annotate("{", "}", descriptor_);
}
void ImmutableMessageFieldLiteGenerator::GenerateMembers(
@@ -288,9 +298,9 @@
void ImmutableMessageFieldLiteGenerator::GenerateKotlinDslMembers(
io::Printer* printer) const {
- WriteFieldDocComment(printer, descriptor_);
+ WriteFieldDocComment(printer, descriptor_, /* kdoc */ true);
printer->Print(variables_,
- "$kt_deprecation$var $kt_name$: $kt_type$\n"
+ "$kt_deprecation$public var $kt_name$: $kt_type$\n"
" @JvmName(\"${$get$kt_capitalized_name$$}$\")\n"
" get() = $kt_dsl_builder$.${$get$capitalized_name$$}$()\n"
" @JvmName(\"${$set$kt_capitalized_name$$}$\")\n"
@@ -299,16 +309,17 @@
" }\n");
WriteFieldAccessorDocComment(printer, descriptor_, CLEARER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(variables_,
- "fun ${$clear$kt_capitalized_name$$}$() {\n"
+ "public fun ${$clear$kt_capitalized_name$$}$() {\n"
" $kt_dsl_builder$.${$clear$capitalized_name$$}$()\n"
"}\n");
- WriteFieldAccessorDocComment(printer, descriptor_, HAZZER);
+ WriteFieldAccessorDocComment(printer, descriptor_, HAZZER,
+ /* builder */ false, /* kdoc */ true);
printer->Print(
variables_,
- "fun ${$has$kt_capitalized_name$$}$(): kotlin.Boolean {\n"
+ "public fun ${$has$kt_capitalized_name$$}$(): kotlin.Boolean {\n"
" return $kt_dsl_builder$.${$has$capitalized_name$$}$()\n"
"}\n");
GenerateKotlinOrNull(printer);
@@ -317,7 +328,7 @@
void ImmutableMessageFieldLiteGenerator::GenerateKotlinOrNull(io::Printer* printer) const {
if (descriptor_->has_optional_keyword()) {
printer->Print(variables_,
- "val $classname$Kt.Dsl.$name$OrNull: $kt_type$?\n"
+ "public val $classname$Kt.Dsl.$name$OrNull: $kt_type$?\n"
" get() = $kt_dsl_builder$.$name$OrNull\n");
}
}
@@ -495,10 +506,12 @@
RepeatedImmutableMessageFieldLiteGenerator(
const FieldDescriptor* descriptor, int messageBitIndex,
Context* context)
- : descriptor_(descriptor), name_resolver_(context->GetNameResolver()) {
+ : descriptor_(descriptor),
+ name_resolver_(context->GetNameResolver()),
+ context_(context) {
SetMessageVariables(descriptor, messageBitIndex, 0,
context->GetFieldGeneratorInfo(descriptor),
- name_resolver_, &variables_);
+ name_resolver_, &variables_, context);
}
RepeatedImmutableMessageFieldLiteGenerator::
@@ -517,17 +530,28 @@
WriteFieldDocComment(printer, descriptor_);
printer->Print(variables_,
"$deprecation$java.util.List<$type$> \n"
- " get$capitalized_name$List();\n");
+ " ${$get$capitalized_name$List$}$();\n");
+ printer->Annotate("{", "}", descriptor_);
+ WriteFieldDocComment(printer, descriptor_);
+ printer->Print(
+ variables_,
+ "$deprecation$$type$ ${$get$capitalized_name$$}$(int index);\n");
+ printer->Annotate("{", "}", descriptor_);
WriteFieldDocComment(printer, descriptor_);
printer->Print(variables_,
- "$deprecation$$type$ get$capitalized_name$(int index);\n");
- WriteFieldDocComment(printer, descriptor_);
- printer->Print(variables_,
- "$deprecation$int get$capitalized_name$Count();\n");
+ "$deprecation$int ${$get$capitalized_name$Count$}$();\n");
+ printer->Annotate("{", "}", descriptor_);
}
void RepeatedImmutableMessageFieldLiteGenerator::GenerateMembers(
io::Printer* printer) const {
+ if (!context_->options().opensource_runtime) {
+ printer->Print(
+ variables_,
+ "@com.google.protobuf.ProtoField(\n"
+ " fieldNumber=$number$,\n"
+ " type=com.google.protobuf.FieldType.$annotation_field_type$)\n");
+ }
printer->Print(
variables_,
"private com.google.protobuf.Internal.ProtobufList<$type$> $name$_;\n");
@@ -806,12 +830,12 @@
" */\n"
"@kotlin.OptIn"
"(com.google.protobuf.kotlin.OnlyForUseByGeneratedProtoCode::class)\n"
- "class ${$$kt_capitalized_name$Proxy$}$ private constructor()"
+ "public class ${$$kt_capitalized_name$Proxy$}$ private constructor()"
" : com.google.protobuf.kotlin.DslProxy()\n");
- WriteFieldDocComment(printer, descriptor_);
+ WriteFieldDocComment(printer, descriptor_, /* kdoc */ true);
printer->Print(variables_,
- "$kt_deprecation$ val $kt_name$: "
+ "$kt_deprecation$ public val $kt_name$: "
"com.google.protobuf.kotlin.DslList"
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>\n"
" @kotlin.jvm.JvmSynthetic\n"
@@ -820,70 +844,70 @@
" )\n");
WriteFieldAccessorDocComment(printer, descriptor_, LIST_ADDER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"add$kt_capitalized_name$\")\n"
- "fun com.google.protobuf.kotlin.DslList"
+ "public fun com.google.protobuf.kotlin.DslList"
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>."
"add(value: $kt_type$) {\n"
" $kt_dsl_builder$.${$add$capitalized_name$$}$(value)\n"
"}\n");
WriteFieldAccessorDocComment(printer, descriptor_, LIST_ADDER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"plusAssign$kt_capitalized_name$\")\n"
"@Suppress(\"NOTHING_TO_INLINE\")\n"
- "inline operator fun com.google.protobuf.kotlin.DslList"
+ "public inline operator fun com.google.protobuf.kotlin.DslList"
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>."
"plusAssign(value: $kt_type$) {\n"
" add(value)\n"
"}\n");
WriteFieldAccessorDocComment(printer, descriptor_, LIST_MULTI_ADDER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"addAll$kt_capitalized_name$\")\n"
- "fun com.google.protobuf.kotlin.DslList"
+ "public fun com.google.protobuf.kotlin.DslList"
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>."
"addAll(values: kotlin.collections.Iterable<$kt_type$>) {\n"
" $kt_dsl_builder$.${$addAll$capitalized_name$$}$(values)\n"
"}\n");
WriteFieldAccessorDocComment(printer, descriptor_, LIST_MULTI_ADDER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(
variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"plusAssignAll$kt_capitalized_name$\")\n"
"@Suppress(\"NOTHING_TO_INLINE\")\n"
- "inline operator fun com.google.protobuf.kotlin.DslList"
+ "public inline operator fun com.google.protobuf.kotlin.DslList"
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>."
"plusAssign(values: kotlin.collections.Iterable<$kt_type$>) {\n"
" addAll(values)\n"
"}\n");
WriteFieldAccessorDocComment(printer, descriptor_, LIST_INDEXED_SETTER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(
variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"set$kt_capitalized_name$\")\n"
- "operator fun com.google.protobuf.kotlin.DslList"
+ "public operator fun com.google.protobuf.kotlin.DslList"
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>."
"set(index: kotlin.Int, value: $kt_type$) {\n"
" $kt_dsl_builder$.${$set$capitalized_name$$}$(index, value)\n"
"}\n");
WriteFieldAccessorDocComment(printer, descriptor_, CLEARER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"clear$kt_capitalized_name$\")\n"
- "fun com.google.protobuf.kotlin.DslList"
+ "public fun com.google.protobuf.kotlin.DslList"
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>."
"clear() {\n"
" $kt_dsl_builder$.${$clear$capitalized_name$$}$()\n"
@@ -895,4 +919,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/compiler/java/message_field_lite.h b/src/google/protobuf/compiler/java/message_field_lite.h
index 4253acc..c5387a6 100644
--- a/src/google/protobuf/compiler/java/message_field_lite.h
+++ b/src/google/protobuf/compiler/java/message_field_lite.h
@@ -39,7 +39,7 @@
#include <map>
#include <string>
-#include <google/protobuf/compiler/java/field.h>
+#include "google/protobuf/compiler/java/field.h"
namespace google {
namespace protobuf {
@@ -62,6 +62,10 @@
explicit ImmutableMessageFieldLiteGenerator(const FieldDescriptor* descriptor,
int messageBitIndex,
Context* context);
+ ImmutableMessageFieldLiteGenerator(
+ const ImmutableMessageFieldLiteGenerator&) = delete;
+ ImmutableMessageFieldLiteGenerator& operator=(
+ const ImmutableMessageFieldLiteGenerator&) = delete;
~ImmutableMessageFieldLiteGenerator() override;
// implements ImmutableFieldLiteGenerator
@@ -82,9 +86,9 @@
std::map<std::string, std::string> variables_;
const int messageBitIndex_;
ClassNameResolver* name_resolver_;
+ Context* context_;
private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableMessageFieldLiteGenerator);
void GenerateKotlinOrNull(io::Printer* printer) const;
};
@@ -94,6 +98,10 @@
ImmutableMessageOneofFieldLiteGenerator(const FieldDescriptor* descriptor,
int messageBitIndex,
Context* context);
+ ImmutableMessageOneofFieldLiteGenerator(
+ const ImmutableMessageOneofFieldLiteGenerator&) = delete;
+ ImmutableMessageOneofFieldLiteGenerator& operator=(
+ const ImmutableMessageOneofFieldLiteGenerator&) = delete;
~ImmutableMessageOneofFieldLiteGenerator() override;
void GenerateMembers(io::Printer* printer) const override;
@@ -101,8 +109,6 @@
void GenerateFieldInfo(io::Printer* printer,
std::vector<uint16_t>* output) const override;
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableMessageOneofFieldLiteGenerator);
};
class RepeatedImmutableMessageFieldLiteGenerator
@@ -110,6 +116,10 @@
public:
explicit RepeatedImmutableMessageFieldLiteGenerator(
const FieldDescriptor* descriptor, int messageBitIndex, Context* context);
+ RepeatedImmutableMessageFieldLiteGenerator(
+ const RepeatedImmutableMessageFieldLiteGenerator&) = delete;
+ RepeatedImmutableMessageFieldLiteGenerator& operator=(
+ const RepeatedImmutableMessageFieldLiteGenerator&) = delete;
~RepeatedImmutableMessageFieldLiteGenerator() override;
// implements ImmutableFieldLiteGenerator ------------------------------------
@@ -128,9 +138,7 @@
const FieldDescriptor* descriptor_;
std::map<std::string, std::string> variables_;
ClassNameResolver* name_resolver_;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedImmutableMessageFieldLiteGenerator);
+ Context* context_;
};
} // namespace java
diff --git a/src/google/protobuf/compiler/java/message_lite.cc b/src/google/protobuf/compiler/java/message_lite.cc
index a42ae3f..b087728 100644
--- a/src/google/protobuf/compiler/java/message_lite.cc
+++ b/src/google/protobuf/compiler/java/message_lite.cc
@@ -32,32 +32,35 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/compiler/java/message_lite.h>
+#include "google/protobuf/compiler/java/message_lite.h"
#include <algorithm>
#include <cstdint>
#include <map>
#include <memory>
+#include <string>
#include <vector>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/wire_format.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/substitute.h>
-#include <google/protobuf/compiler/java/context.h>
-#include <google/protobuf/compiler/java/doc_comment.h>
-#include <google/protobuf/compiler/java/enum_lite.h>
-#include <google/protobuf/compiler/java/extension_lite.h>
-#include <google/protobuf/compiler/java/generator_factory.h>
-#include <google/protobuf/compiler/java/helpers.h>
-#include <google/protobuf/compiler/java/message_builder.h>
-#include <google/protobuf/compiler/java/message_builder_lite.h>
-#include <google/protobuf/compiler/java/name_resolver.h>
-#include <google/protobuf/descriptor.pb.h>
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/wire_format.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "absl/strings/ascii.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/substitute.h"
+#include "google/protobuf/compiler/java/context.h"
+#include "google/protobuf/compiler/java/doc_comment.h"
+#include "google/protobuf/compiler/java/enum_lite.h"
+#include "google/protobuf/compiler/java/extension_lite.h"
+#include "google/protobuf/compiler/java/generator_factory.h"
+#include "google/protobuf/compiler/java/helpers.h"
+#include "google/protobuf/compiler/java/message_builder.h"
+#include "google/protobuf/compiler/java/message_builder_lite.h"
+#include "google/protobuf/compiler/java/name_resolver.h"
+#include "google/protobuf/descriptor.pb.h"
// Must be last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -114,26 +117,33 @@
void ImmutableMessageLiteGenerator::GenerateInterface(io::Printer* printer) {
MaybePrintGeneratedAnnotation(context_, printer, descriptor_,
/* immutable = */ true, "OrBuilder");
+
+ std::map<std::string, std::string> variables = {
+ {"{", ""},
+ {"}", ""},
+ {"deprecation",
+ descriptor_->options().deprecated() ? "@java.lang.Deprecated " : ""},
+ {"extra_interfaces", ExtraMessageOrBuilderInterfaces(descriptor_)},
+ {"classname", descriptor_->name()},
+ };
+
+ if (!context_->options().opensource_runtime) {
+ printer->Print("@com.google.protobuf.Internal.ProtoNonnullApi\n");
+ }
if (descriptor_->extension_range_count() > 0) {
printer->Print(
+ variables,
"$deprecation$public interface ${$$classname$OrBuilder$}$ extends \n"
" $extra_interfaces$\n"
" com.google.protobuf.GeneratedMessageLite.\n"
" ExtendableMessageOrBuilder<\n"
- " $classname$, $classname$.Builder> {\n",
- "deprecation",
- descriptor_->options().deprecated() ? "@java.lang.Deprecated " : "",
- "extra_interfaces", ExtraMessageOrBuilderInterfaces(descriptor_),
- "classname", descriptor_->name(), "{", "", "}", "");
+ " $classname$, $classname$.Builder> {\n");
} else {
printer->Print(
+ variables,
"$deprecation$public interface ${$$classname$OrBuilder$}$ extends\n"
" $extra_interfaces$\n"
- " com.google.protobuf.MessageLiteOrBuilder {\n",
- "deprecation",
- descriptor_->options().deprecated() ? "@java.lang.Deprecated " : "",
- "extra_interfaces", ExtraMessageOrBuilderInterfaces(descriptor_),
- "classname", descriptor_->name(), "{", "", "}", "");
+ " com.google.protobuf.MessageLiteOrBuilder {\n");
}
printer->Annotate("{", "}", descriptor_);
@@ -144,13 +154,15 @@
.GenerateInterfaceMembers(printer);
}
for (auto oneof : oneofs_) {
- printer->Print(
- "\n"
- "public $classname$.$oneof_capitalized_name$Case "
- "get$oneof_capitalized_name$Case();\n",
- "oneof_capitalized_name",
- context_->GetOneofGeneratorInfo(oneof)->capitalized_name, "classname",
- context_->GetNameResolver()->GetImmutableClassName(descriptor_));
+ variables["oneof_capitalized_name"] =
+ context_->GetOneofGeneratorInfo(oneof)->capitalized_name;
+ variables["classname"] =
+ context_->GetNameResolver()->GetImmutableClassName(descriptor_);
+ printer->Print(variables,
+ "\n"
+ "public ${$$classname$.$oneof_capitalized_name$Case$}$ "
+ "get$oneof_capitalized_name$Case();\n");
+ printer->Annotate("{", "}", oneof);
}
printer->Outdent();
@@ -162,7 +174,7 @@
void ImmutableMessageLiteGenerator::Generate(io::Printer* printer) {
bool is_own_file = IsOwnFile(descriptor_, /* immutable = */ true);
- std::map<std::string, std::string> variables;
+ std::map<std::string, std::string> variables = {{"{", ""}, {"}", ""}};
variables["static"] = is_own_file ? " " : " static ";
variables["classname"] = descriptor_->name();
variables["extra_interfaces"] = ExtraMessageInterfaces(descriptor_);
@@ -179,18 +191,18 @@
if (descriptor_->extension_range_count() > 0) {
printer->Print(
variables,
- "$deprecation$public $static$final class $classname$ extends\n"
+ "$deprecation$public $static$final class ${$$classname$$}$ extends\n"
" com.google.protobuf.GeneratedMessageLite.ExtendableMessage<\n"
" $classname$, $classname$.Builder> implements\n"
" $extra_interfaces$\n"
" $classname$OrBuilder {\n");
- builder_type = strings::Substitute(
+ builder_type = absl::Substitute(
"com.google.protobuf.GeneratedMessageLite.ExtendableBuilder<$0, ?>",
name_resolver_->GetImmutableClassName(descriptor_));
} else {
printer->Print(
variables,
- "$deprecation$public $static$final class $classname$ extends\n"
+ "$deprecation$public $static$final class ${$$classname$$}$ extends\n"
" com.google.protobuf.GeneratedMessageLite<\n"
" $classname$, $classname$.Builder> implements\n"
" $extra_interfaces$\n"
@@ -198,6 +210,7 @@
builder_type = "com.google.protobuf.GeneratedMessageLite.Builder";
}
+ printer->Annotate("{", "}", descriptor_);
printer->Indent();
GenerateConstructor(printer);
@@ -230,49 +243,57 @@
}
// oneof
- std::map<std::string, std::string> vars;
+ std::map<std::string, std::string> vars = {{"{", ""}, {"}", ""}};
for (auto oneof : oneofs_) {
vars["oneof_name"] = context_->GetOneofGeneratorInfo(oneof)->name;
vars["oneof_capitalized_name"] =
context_->GetOneofGeneratorInfo(oneof)->capitalized_name;
- vars["oneof_index"] = StrCat((oneof)->index());
- // oneofCase_ and oneof_
- printer->Print(vars,
- "private int $oneof_name$Case_ = 0;\n"
- "private java.lang.Object $oneof_name$_;\n");
+ vars["oneof_index"] = absl::StrCat((oneof)->index());
+ if (context_->options().opensource_runtime) {
+ // oneofCase_ and oneof_
+ printer->Print(vars,
+ "private int $oneof_name$Case_ = 0;\n"
+ "private java.lang.Object $oneof_name$_;\n");
+ }
// OneofCase enum
- printer->Print(vars, "public enum $oneof_capitalized_name$Case {\n");
+ printer->Print(vars, "public enum ${$$oneof_capitalized_name$Case$}$ {\n");
+ printer->Annotate("{", "}", oneof);
printer->Indent();
for (int j = 0; j < (oneof)->field_count(); j++) {
const FieldDescriptor* field = (oneof)->field(j);
printer->Print("$field_name$($field_number$),\n", "field_name",
- ToUpper(field->name()), "field_number",
- StrCat(field->number()));
+ absl::AsciiStrToUpper(field->name()), "field_number",
+ absl::StrCat(field->number()));
+ printer->Annotate("field_name", field);
}
printer->Print("$cap_oneof_name$_NOT_SET(0);\n", "cap_oneof_name",
- ToUpper(vars["oneof_name"]));
+ absl::AsciiStrToUpper(vars["oneof_name"]));
printer->Print(vars,
"private final int value;\n"
"private $oneof_capitalized_name$Case(int value) {\n"
" this.value = value;\n"
"}\n");
+ if (context_->options().opensource_runtime) {
+ printer->Print(
+ vars,
+ "/**\n"
+ " * @deprecated Use {@link #forNumber(int)} instead.\n"
+ " */\n"
+ "@java.lang.Deprecated\n"
+ "public static $oneof_capitalized_name$Case valueOf(int value) {\n"
+ " return forNumber(value);\n"
+ "}\n"
+ "\n");
+ }
printer->Print(
vars,
- "/**\n"
- " * @deprecated Use {@link #forNumber(int)} instead.\n"
- " */\n"
- "@java.lang.Deprecated\n"
- "public static $oneof_capitalized_name$Case valueOf(int value) {\n"
- " return forNumber(value);\n"
- "}\n"
- "\n"
"public static $oneof_capitalized_name$Case forNumber(int value) {\n"
" switch (value) {\n");
for (int j = 0; j < (oneof)->field_count(); j++) {
const FieldDescriptor* field = (oneof)->field(j);
printer->Print(" case $field_number$: return $field_name$;\n",
- "field_number", StrCat(field->number()),
- "field_name", ToUpper(field->name()));
+ "field_number", absl::StrCat(field->number()),
+ "field_name", absl::AsciiStrToUpper(field->name()));
}
printer->Print(
" case 0: return $cap_oneof_name$_NOT_SET;\n"
@@ -284,30 +305,34 @@
"public int getNumber() {\n"
" return this.value;\n"
"}\n",
- "cap_oneof_name", ToUpper(vars["oneof_name"]));
+ "cap_oneof_name", absl::AsciiStrToUpper(vars["oneof_name"]));
printer->Outdent();
printer->Print("};\n\n");
// oneofCase()
printer->Print(vars,
"@java.lang.Override\n"
"public $oneof_capitalized_name$Case\n"
- "get$oneof_capitalized_name$Case() {\n"
+ "${$get$oneof_capitalized_name$Case$}$() {\n"
" return $oneof_capitalized_name$Case.forNumber(\n"
" $oneof_name$Case_);\n"
- "}\n"
+ "}\n");
+ printer->Annotate("{", "}", oneof);
+ printer->Print(vars,
"\n"
- "private void clear$oneof_capitalized_name$() {\n"
+ "private void ${$clear$oneof_capitalized_name$$}$() {\n"
" $oneof_name$Case_ = 0;\n"
" $oneof_name$_ = null;\n"
"}\n"
"\n");
+ printer->Annotate("{", "}", oneof);
}
// Fields
for (int i = 0; i < descriptor_->field_count(); i++) {
printer->Print("public static final int $constant_name$ = $number$;\n",
"constant_name", FieldConstantName(descriptor_->field(i)),
- "number", StrCat(descriptor_->field(i)->number()));
+ "number", absl::StrCat(descriptor_->field(i)->number()));
+ printer->Annotate("constant_name", descriptor_->field(i));
field_generators_.get(descriptor_->field(i)).GenerateMembers(printer);
printer->Print("\n");
}
@@ -734,10 +759,10 @@
"(com.google.protobuf.kotlin.OnlyForUseByGeneratedProtoCode::class)\n"
"@com.google.protobuf.kotlin.ProtoDslMarker\n");
printer->Print(
- "class Dsl private constructor(\n"
+ "public class Dsl private constructor(\n"
" private val _builder: $message$.Builder\n"
") {\n"
- " companion object {\n"
+ " public companion object {\n"
" @kotlin.jvm.JvmSynthetic\n"
" @kotlin.PublishedApi\n"
" internal fun _create(builder: $message$.Builder): Dsl = "
@@ -747,7 +772,8 @@
" @kotlin.jvm.JvmSynthetic\n"
" @kotlin.PublishedApi\n"
" internal fun _build(): $message$ = _builder.build()\n",
- "message", name_resolver_->GetClassName(descriptor_, true));
+ "message",
+ EscapeKotlinKeywords(name_resolver_->GetClassName(descriptor_, true)));
printer->Indent();
@@ -759,16 +785,16 @@
for (auto oneof : oneofs_) {
printer->Print(
- "val $oneof_name$Case: $message$.$oneof_capitalized_name$Case\n"
+ "public val $oneof_name$Case: $message$.$oneof_capitalized_name$Case\n"
" @JvmName(\"get$oneof_capitalized_name$Case\")\n"
" get() = _builder.get$oneof_capitalized_name$Case()\n\n"
- "fun clear$oneof_capitalized_name$() {\n"
+ "public fun clear$oneof_capitalized_name$() {\n"
" _builder.clear$oneof_capitalized_name$()\n"
"}\n",
"oneof_name", context_->GetOneofGeneratorInfo(oneof)->name,
"oneof_capitalized_name",
context_->GetOneofGeneratorInfo(oneof)->capitalized_name, "message",
- name_resolver_->GetClassName(descriptor_, true));
+ EscapeKotlinKeywords(name_resolver_->GetClassName(descriptor_, true)));
}
if (descriptor_->extension_range_count() > 0) {
@@ -781,18 +807,27 @@
void ImmutableMessageLiteGenerator::GenerateKotlinMembers(
io::Printer* printer) const {
+ printer->Print("@kotlin.jvm.JvmName(\"-initialize$camelcase_name$\")\n",
+ "camelcase_name",
+ name_resolver_->GetKotlinFactoryName(descriptor_));
+
+ if (!context_->options().opensource_runtime) {
+ printer->Print("@com.google.errorprone.annotations.CheckReturnValue\n");
+ }
printer->Print(
- "@kotlin.jvm.JvmName(\"-initialize$camelcase_name$\")\n"
- "inline fun $camelcase_name$(block: $message_kt$.Dsl.() -> "
- "kotlin.Unit): "
- "$message$ =\n"
+ "public inline fun $camelcase_name$(block: $message_kt$.Dsl.() -> "
+ "kotlin.Unit): $message$ =\n"
" $message_kt$.Dsl._create($message$.newBuilder()).apply { block() "
"}._build()\n",
"camelcase_name", name_resolver_->GetKotlinFactoryName(descriptor_),
- "message_kt", name_resolver_->GetKotlinExtensionsClassName(descriptor_),
- "message", name_resolver_->GetClassName(descriptor_, true));
+ "message_kt",
+ EscapeKotlinKeywords(
+ name_resolver_->GetKotlinExtensionsClassName(descriptor_)),
+ "message",
+ EscapeKotlinKeywords(name_resolver_->GetClassName(descriptor_, true)));
- printer->Print("object $name$Kt {\n", "name", descriptor_->name());
+ WriteMessageDocComment(printer, descriptor_, /* kdoc */ true);
+ printer->Print("public object $name$Kt {\n", "name", descriptor_->name());
printer->Indent();
GenerateKotlinDsl(printer);
for (int i = 0; i < descriptor_->nested_type_count(); i++) {
@@ -806,14 +841,19 @@
void ImmutableMessageLiteGenerator::GenerateTopLevelKotlinMembers(
io::Printer* printer) const {
+ if (!context_->options().opensource_runtime) {
+ printer->Print("@com.google.errorprone.annotations.CheckReturnValue\n");
+ }
printer->Print(
- "inline fun $message$.copy(block: $message_kt$.Dsl.() -> "
- "kotlin.Unit): "
- "$message$ =\n"
+ "public inline fun $message$.copy(block: $message_kt$.Dsl.() -> "
+ "kotlin.Unit): $message$ =\n"
" $message_kt$.Dsl._create(this.toBuilder()).apply { block() "
"}._build()\n\n",
- "message", name_resolver_->GetClassName(descriptor_, true), "message_kt",
- name_resolver_->GetKotlinExtensionsClassName(descriptor_));
+ "message",
+ EscapeKotlinKeywords(name_resolver_->GetClassName(descriptor_, true)),
+ "message_kt",
+ EscapeKotlinKeywords(
+ name_resolver_->GetKotlinExtensionsClassName(descriptor_)));
for (int i = 0; i < descriptor_->nested_type_count(); i++) {
if (IsMapEntry(descriptor_->nested_type(i))) continue;
@@ -830,26 +870,29 @@
const FieldDescriptor* field = descriptor_->field(i);
if (field->has_presence() && GetJavaType(field) == JAVATYPE_MESSAGE) {
printer->Print(
- "val $full_classname$OrBuilder.$camelcase_name$OrNull: "
+ "public val $full_classname$OrBuilder.$camelcase_name$OrNull: "
"$full_name$?\n"
" get() = if (has$name$()) get$name$() else null\n\n",
- "full_classname", name_resolver_->GetClassName(descriptor_, true),
+ "full_classname",
+ EscapeKotlinKeywords(name_resolver_->GetClassName(descriptor_, true)),
"camelcase_name", context_->GetFieldGeneratorInfo(field)->name,
"full_name",
- name_resolver_->GetImmutableClassName(field->message_type()), "name",
- context_->GetFieldGeneratorInfo(field)->capitalized_name);
+ EscapeKotlinKeywords(
+ name_resolver_->GetImmutableClassName(field->message_type())),
+ "name", context_->GetFieldGeneratorInfo(field)->capitalized_name);
}
}
}
void ImmutableMessageLiteGenerator::GenerateKotlinExtensions(
io::Printer* printer) const {
- std::string message_name = name_resolver_->GetClassName(descriptor_, true);
+ std::string message_name =
+ EscapeKotlinKeywords(name_resolver_->GetClassName(descriptor_, true));
printer->Print(
"@Suppress(\"UNCHECKED_CAST\")\n"
"@kotlin.jvm.JvmSynthetic\n"
- "operator fun <T : kotlin.Any> get(extension: "
+ "public operator fun <T : kotlin.Any> get(extension: "
"com.google.protobuf.ExtensionLite<$message$, T>): T {\n"
" return if (extension.isRepeated) {\n"
" get(extension as com.google.protobuf.ExtensionLite<$message$, "
@@ -865,7 +908,7 @@
"@kotlin.OptIn"
"(com.google.protobuf.kotlin.OnlyForUseByGeneratedProtoCode::class)\n"
"@kotlin.jvm.JvmName(\"-getRepeatedExtension\")\n"
- "operator fun <E : kotlin.Any> get(\n"
+ "public operator fun <E : kotlin.Any> get(\n"
" extension: com.google.protobuf.ExtensionLite<$message$, List<E>>\n"
"): com.google.protobuf.kotlin.ExtensionList<E, $message$> {\n"
" return com.google.protobuf.kotlin.ExtensionList(extension, "
@@ -875,7 +918,7 @@
printer->Print(
"@kotlin.jvm.JvmSynthetic\n"
- "operator fun contains(extension: "
+ "public operator fun contains(extension: "
"com.google.protobuf.ExtensionLite<$message$, *>): "
"Boolean {\n"
" return _builder.hasExtension(extension)\n"
@@ -884,7 +927,7 @@
printer->Print(
"@kotlin.jvm.JvmSynthetic\n"
- "fun clear(extension: "
+ "public fun clear(extension: "
"com.google.protobuf.ExtensionLite<$message$, *>) "
"{\n"
" _builder.clearExtension(extension)\n"
@@ -904,7 +947,7 @@
printer->Print(
"@kotlin.jvm.JvmSynthetic\n"
"@Suppress(\"NOTHING_TO_INLINE\")\n"
- "inline operator fun <T : Comparable<T>> set(\n"
+ "public inline operator fun <T : Comparable<T>> set(\n"
" extension: com.google.protobuf.ExtensionLite<$message$, T>,\n"
" value: T\n"
") {\n"
@@ -915,7 +958,7 @@
printer->Print(
"@kotlin.jvm.JvmSynthetic\n"
"@Suppress(\"NOTHING_TO_INLINE\")\n"
- "inline operator fun set(\n"
+ "public inline operator fun set(\n"
" extension: com.google.protobuf.ExtensionLite<$message$, "
"com.google.protobuf.ByteString>,\n"
" value: com.google.protobuf.ByteString\n"
@@ -927,7 +970,7 @@
printer->Print(
"@kotlin.jvm.JvmSynthetic\n"
"@Suppress(\"NOTHING_TO_INLINE\")\n"
- "inline operator fun <T : com.google.protobuf.MessageLite> set(\n"
+ "public inline operator fun <T : com.google.protobuf.MessageLite> set(\n"
" extension: com.google.protobuf.ExtensionLite<$message$, T>,\n"
" value: T\n"
") {\n"
@@ -937,7 +980,7 @@
printer->Print(
"@kotlin.jvm.JvmSynthetic\n"
- "fun<E : kotlin.Any> com.google.protobuf.kotlin.ExtensionList<E, "
+ "public fun<E : kotlin.Any> com.google.protobuf.kotlin.ExtensionList<E, "
"$message$>.add(value: E) {\n"
" _builder.addExtension(this.extension, value)\n"
"}\n\n",
@@ -946,7 +989,7 @@
printer->Print(
"@kotlin.jvm.JvmSynthetic\n"
"@Suppress(\"NOTHING_TO_INLINE\")\n"
- "inline operator fun <E : kotlin.Any> "
+ "public inline operator fun <E : kotlin.Any> "
"com.google.protobuf.kotlin.ExtensionList<E, "
"$message$>.plusAssign"
"(value: E) {\n"
@@ -956,7 +999,7 @@
printer->Print(
"@kotlin.jvm.JvmSynthetic\n"
- "fun<E : kotlin.Any> com.google.protobuf.kotlin.ExtensionList<E, "
+ "public fun<E : kotlin.Any> com.google.protobuf.kotlin.ExtensionList<E, "
"$message$>.addAll(values: Iterable<E>) {\n"
" for (value in values) {\n"
" add(value)\n"
@@ -967,7 +1010,7 @@
printer->Print(
"@kotlin.jvm.JvmSynthetic\n"
"@Suppress(\"NOTHING_TO_INLINE\")\n"
- "inline operator fun <E : kotlin.Any> "
+ "public inline operator fun <E : kotlin.Any> "
"com.google.protobuf.kotlin.ExtensionList<E, "
"$message$>.plusAssign(values: "
"Iterable<E>) {\n"
@@ -977,7 +1020,7 @@
printer->Print(
"@kotlin.jvm.JvmSynthetic\n"
- "operator fun <E : kotlin.Any> "
+ "public operator fun <E : kotlin.Any> "
"com.google.protobuf.kotlin.ExtensionList<E, "
"$message$>.set(index: Int, value: "
"E) {\n"
@@ -988,7 +1031,7 @@
printer->Print(
"@kotlin.jvm.JvmSynthetic\n"
"@Suppress(\"NOTHING_TO_INLINE\")\n"
- "inline fun com.google.protobuf.kotlin.ExtensionList<*, "
+ "public inline fun com.google.protobuf.kotlin.ExtensionList<*, "
"$message$>.clear() {\n"
" clear(extension)\n"
"}\n\n",
@@ -1000,4 +1043,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/compiler/java/message_lite.h b/src/google/protobuf/compiler/java/message_lite.h
index d1e4b68..2794040 100644
--- a/src/google/protobuf/compiler/java/message_lite.h
+++ b/src/google/protobuf/compiler/java/message_lite.h
@@ -35,8 +35,8 @@
#ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_LITE_H__
#define GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_LITE_H__
-#include <google/protobuf/compiler/java/field.h>
-#include <google/protobuf/compiler/java/message.h>
+#include "google/protobuf/compiler/java/field.h"
+#include "google/protobuf/compiler/java/message.h"
namespace google {
namespace protobuf {
@@ -46,6 +46,9 @@
class ImmutableMessageLiteGenerator : public MessageGenerator {
public:
ImmutableMessageLiteGenerator(const Descriptor* descriptor, Context* context);
+ ImmutableMessageLiteGenerator(const ImmutableMessageLiteGenerator&) = delete;
+ ImmutableMessageLiteGenerator& operator=(
+ const ImmutableMessageLiteGenerator&) = delete;
~ImmutableMessageLiteGenerator() override;
void Generate(io::Printer* printer) override;
@@ -73,8 +76,6 @@
Context* context_;
ClassNameResolver* name_resolver_;
FieldGeneratorMap<ImmutableFieldLiteGenerator> field_generators_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableMessageLiteGenerator);
};
} // namespace java
diff --git a/src/google/protobuf/stubs/statusor.cc b/src/google/protobuf/compiler/java/message_serialization.cc
similarity index 76%
copy from src/google/protobuf/stubs/statusor.cc
copy to src/google/protobuf/compiler/java/message_serialization.cc
index 9c0a178..d0a0fe2 100644
--- a/src/google/protobuf/stubs/statusor.cc
+++ b/src/google/protobuf/compiler/java/message_serialization.cc
@@ -28,21 +28,24 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/stubs/statusor.h>
+#include "google/protobuf/compiler/java/message_serialization.h"
-#include <google/protobuf/stubs/logging.h>
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/descriptor.h"
+#include "absl/strings/str_cat.h"
namespace google {
namespace protobuf {
-namespace util {
-namespace statusor_internal {
+namespace compiler {
+namespace java {
-void StatusOrHelper::Crash(const Status& status) {
- GOOGLE_LOG(FATAL) << "Attempting to fetch value instead of handling error "
- << status.ToString();
+void GenerateSerializeExtensionRange(io::Printer* printer,
+ const Descriptor::ExtensionRange* range) {
+ printer->Print("extensionWriter.writeUntil($end$, output);\n", "end",
+ absl::StrCat(range->end));
}
-} // namespace statusor_internal
-} // namespace util
+} // namespace java
+} // namespace compiler
} // namespace protobuf
} // namespace google
diff --git a/src/google/protobuf/compiler/java/message_serialization.h b/src/google/protobuf/compiler/java/message_serialization.h
new file mode 100644
index 0000000..3b11c47
--- /dev/null
+++ b/src/google/protobuf/compiler/java/message_serialization.h
@@ -0,0 +1,103 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_SERIALIZATION_H__
+#define GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_SERIALIZATION_H__
+
+#include <algorithm>
+#include <cstddef>
+#include <vector>
+
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/compiler/java/field.h"
+#include "google/protobuf/compiler/java/helpers.h"
+
+namespace google {
+namespace protobuf {
+namespace compiler {
+namespace java {
+
+// Generates code to serialize a single extension range.
+void GenerateSerializeExtensionRange(io::Printer* printer,
+ const Descriptor::ExtensionRange* range);
+
+// Generates code to serialize all fields and extension ranges for the specified
+// message descriptor, sorting serialization calls in increasing order by field
+// number.
+//
+// Templatized to support different field generator implementations.
+template <typename FieldGenerator>
+void GenerateSerializeFieldsAndExtensions(
+ io::Printer* printer,
+ const FieldGeneratorMap<FieldGenerator>& field_generators,
+ const Descriptor* descriptor, const FieldDescriptor** sorted_fields) {
+ std::vector<const Descriptor::ExtensionRange*> sorted_extensions;
+ sorted_extensions.reserve(descriptor->extension_range_count());
+ for (int i = 0; i < descriptor->extension_range_count(); ++i) {
+ sorted_extensions.push_back(descriptor->extension_range(i));
+ }
+ std::sort(sorted_extensions.begin(), sorted_extensions.end(),
+ ExtensionRangeOrdering());
+
+ std::size_t range_idx = 0;
+
+ // Merge the fields and the extension ranges, both sorted by field number.
+ for (int i = 0; i < descriptor->field_count(); ++i) {
+ const FieldDescriptor* field = sorted_fields[i];
+
+ // Collapse all extension ranges up until the next field. This leads to
+ // shorter and more efficient codegen for messages containing a large
+ // number of extension ranges without fields in between them.
+ const Descriptor::ExtensionRange* range = nullptr;
+ while (range_idx < sorted_extensions.size() &&
+ sorted_extensions[range_idx]->end <= field->number()) {
+ range = sorted_extensions[range_idx++];
+ }
+
+ if (range != nullptr) {
+ GenerateSerializeExtensionRange(printer, range);
+ }
+ field_generators.get(field).GenerateSerializationCode(printer);
+ }
+
+ // After serializing all fields, serialize any remaining extensions via a
+ // single writeUntil call.
+ if (range_idx < sorted_extensions.size()) {
+ GenerateSerializeExtensionRange(printer, sorted_extensions.back());
+ }
+}
+
+} // namespace java
+} // namespace compiler
+} // namespace protobuf
+} // namespace google
+
+#endif // GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_SERIALIZATION_H__
diff --git a/src/google/protobuf/compiler/java/message_serialization_unittest.cc b/src/google/protobuf/compiler/java/message_serialization_unittest.cc
new file mode 100644
index 0000000..2ef7309
--- /dev/null
+++ b/src/google/protobuf/compiler/java/message_serialization_unittest.cc
@@ -0,0 +1,125 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include <cstddef>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/testing/file.h"
+#include "google/protobuf/testing/file.h"
+#include <gmock/gmock.h>
+#include "google/protobuf/testing/googletest.h"
+#include <gtest/gtest.h>
+#include "absl/strings/str_cat.h"
+#include "absl/strings/str_split.h"
+#include "google/protobuf/compiler/command_line_interface.h"
+#include "google/protobuf/compiler/java/generator.h"
+#include "google/protobuf/test_util2.h"
+
+namespace google {
+namespace protobuf {
+namespace compiler {
+namespace java {
+namespace {
+
+using ::testing::ElementsAre;
+
+// Generates Java code for the specified Java proto, returning the compiler's
+// exit status.
+int CompileJavaProto(std::string proto_file_name) {
+ JavaGenerator java_generator;
+
+ CommandLineInterface cli;
+ cli.RegisterGenerator("--java_out", &java_generator, /*help_text=*/"");
+
+ std::string proto_path = absl::StrCat(
+ "--proto_path=",
+ TestUtil::GetTestDataPath("third_party/protobuf/compiler/java"));
+ std::string java_out = absl::StrCat("--java_out=", TestTempDir());
+
+ const char* argv[] = {
+ "protoc",
+ proto_path.c_str(),
+ java_out.c_str(),
+ proto_file_name.c_str(),
+ };
+
+ return cli.Run(4, argv);
+}
+
+TEST(MessageSerializationTest, CollapseAdjacentExtensionRanges) {
+ GOOGLE_CHECK_EQ(CompileJavaProto("message_serialization_unittest.proto"), 0);
+
+ std::string java_source;
+ GOOGLE_CHECK_OK(File::GetContents(
+ // Open-source codebase does not support file::JoinPath, so we manually
+ // concatenate instead.
+ absl::StrCat(TestTempDir(),
+ "/TestMessageWithManyExtensionRanges.java"),
+ &java_source, true));
+
+ // Open-source codebase does not support constexpr absl::string_view.
+ static constexpr const char kWriteUntilCall[] = "extensionWriter.writeUntil(";
+
+ std::vector<std::string> range_ends;
+
+ // Open-source codebase does not have absl::StrSplit overload taking a single
+ // char delimiter.
+ //
+ // NOLINTNEXTLINE(abseil-faster-strsplit-delimiter)
+ for (const auto& line : absl::StrSplit(java_source, "\n")) {
+ // Extract end position from writeUntil call. (Open-source codebase does not
+ // support RE2.)
+ std::size_t write_until_pos = line.find(kWriteUntilCall);
+ if (write_until_pos == std::string::npos) {
+ continue;
+ }
+ write_until_pos += (sizeof(kWriteUntilCall) - 1);
+
+ std::size_t comma_pos = line.find(',', write_until_pos);
+ if (comma_pos == std::string::npos) {
+ continue;
+ }
+
+ range_ends.push_back(
+ std::string(line.substr(write_until_pos, comma_pos - write_until_pos)));
+ }
+
+ EXPECT_THAT(range_ends, ElementsAre("3", "13", "43"));
+}
+
+} // namespace
+} // namespace java
+} // namespace compiler
+} // namespace protobuf
+} // namespace google
diff --git a/src/google/protobuf/stubs/once.h b/src/google/protobuf/compiler/java/message_serialization_unittest.proto
similarity index 71%
copy from src/google/protobuf/stubs/once.h
copy to src/google/protobuf/compiler/java/message_serialization_unittest.proto
index 070d36d..9cfdf42 100644
--- a/src/google/protobuf/stubs/once.h
+++ b/src/google/protobuf/compiler/java/message_serialization_unittest.proto
@@ -28,28 +28,29 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#ifndef GOOGLE_PROTOBUF_STUBS_ONCE_H__
-#define GOOGLE_PROTOBUF_STUBS_ONCE_H__
+syntax = "proto2";
-#include <mutex>
-#include <utility>
+package protobuf_unittest;
-#include <google/protobuf/port_def.inc>
+option java_multiple_files = true;
+option java_package = "";
-namespace google {
-namespace protobuf {
-namespace internal {
+// Each batch of extension ranges not separated by a non-extension field should
+// be serialized using a single ExtensionWriter#writeUntil call.
+message TestMessageWithManyExtensionRanges {
+ // First extension range: ends at field number 3 (exclusive)
+ extensions 1 to 2;
-using once_flag = std::once_flag;
-template <typename... Args>
-void call_once(Args&&... args ) {
- std::call_once(std::forward<Args>(args)...);
+ optional int32 foo = 3;
+ optional int32 bar = 5;
+
+ // Second extension range: ends at field number 13 (exclusive)
+ extensions 6;
+ extensions 8;
+ extensions 10 to 12;
+
+ optional int32 baz = 23;
+
+ // Third extension range: ends at field number 43 (exclusive)
+ extensions 42;
}
-
-} // namespace internal
-} // namespace protobuf
-} // namespace google
-
-#include <google/protobuf/port_undef.inc>
-
-#endif // GOOGLE_PROTOBUF_STUBS_ONCE_H__
diff --git a/src/google/protobuf/compiler/java/name_resolver.cc b/src/google/protobuf/compiler/java/name_resolver.cc
index 06a637e..84e74ff 100644
--- a/src/google/protobuf/compiler/java/name_resolver.cc
+++ b/src/google/protobuf/compiler/java/name_resolver.cc
@@ -28,18 +28,21 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/compiler/java/name_resolver.h>
+#include "google/protobuf/compiler/java/name_resolver.h"
#include <map>
#include <string>
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/stubs/substitute.h>
-#include <google/protobuf/compiler/java/helpers.h>
-#include <google/protobuf/compiler/java/names.h>
+#include "google/protobuf/compiler/code_generator.h"
+#include "absl/strings/ascii.h"
+#include "absl/strings/str_replace.h"
+#include "absl/strings/substitute.h"
+#include "google/protobuf/compiler/java/helpers.h"
+#include "google/protobuf/compiler/java/names.h"
+
// Must be last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -108,7 +111,7 @@
// Return true if a and b are equals (case insensitive).
NameEquality CheckNameEquality(const std::string& a, const std::string& b) {
- if (ToUpper(a) == ToUpper(b)) {
+ if (absl::AsciiStrToUpper(a) == absl::AsciiStrToUpper(b)) {
if (a == b) {
return NameEquality::EXACT_EQUAL;
}
@@ -141,10 +144,6 @@
} // namespace
-ClassNameResolver::ClassNameResolver() {}
-
-ClassNameResolver::~ClassNameResolver() {}
-
std::string ClassNameResolver::GetFileDefaultImmutableClassName(
const FileDescriptor* file) {
std::string basename;
@@ -217,8 +216,12 @@
}
std::string ClassNameResolver::GetDescriptorClassName(
- const FileDescriptor* descriptor) {
- return GetFileImmutableClassName(descriptor);
+ const FileDescriptor* file) {
+ if (options_.opensource_runtime) {
+ return GetFileImmutableClassName(file);
+ } else {
+ return GetFileImmutableClassName(file) + "InternalDescriptors";
+ }
}
std::string ClassNameResolver::GetClassName(const FileDescriptor* descriptor,
@@ -228,7 +231,7 @@
std::string ClassNameResolver::GetClassName(const FileDescriptor* descriptor,
bool immutable, bool kotlin) {
- std::string result = FileJavaPackage(descriptor, immutable);
+ std::string result = FileJavaPackage(descriptor, immutable, options_);
if (!result.empty()) result += '.';
result += GetFileClassName(descriptor, immutable, kotlin);
return result;
@@ -248,7 +251,7 @@
bool immutable, bool is_own_file, bool kotlin) {
std::string result;
if (is_own_file) {
- result = FileJavaPackage(file, immutable);
+ result = FileJavaPackage(file, immutable, options_);
} else {
result = GetClassName(file, immutable, kotlin);
}
@@ -308,13 +311,13 @@
bool immutable, bool kotlin) {
std::string result;
if (MultipleJavaFiles(file, immutable)) {
- result = FileJavaPackage(file, immutable);
+ result = FileJavaPackage(file, immutable, options_);
if (!result.empty()) result += '.';
} else {
result = GetClassName(file, immutable, kotlin);
if (!result.empty()) result += '$';
}
- result += StringReplace(name_without_package, ".", "$", true);
+ result += absl::StrReplaceAll(name_without_package, {{".", "$"}});
return result;
}
@@ -372,7 +375,7 @@
std::string ClassNameResolver::GetDowngradedClassName(
const Descriptor* descriptor) {
- return FileJavaPackage(descriptor->file()) + "." +
+ return FileJavaPackage(descriptor->file(), true, options_) + "." +
GetDowngradedFileClassName(descriptor->file()) + "." +
ClassNameWithoutPackage(descriptor, false);
}
@@ -382,4 +385,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/compiler/java/name_resolver.h b/src/google/protobuf/compiler/java/name_resolver.h
index 103cace..d73b355 100644
--- a/src/google/protobuf/compiler/java/name_resolver.h
+++ b/src/google/protobuf/compiler/java/name_resolver.h
@@ -34,10 +34,13 @@
#include <map>
#include <string>
-#include <google/protobuf/stubs/common.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/compiler/java/options.h"
+#include "google/protobuf/port.h"
// Must be last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -58,8 +61,11 @@
// Thread-safety note: This class is *not* thread-safe.
class ClassNameResolver {
public:
- ClassNameResolver();
- ~ClassNameResolver();
+ explicit ClassNameResolver(const Options& options = {}) : options_(options) {}
+ ~ClassNameResolver() = default;
+
+ ClassNameResolver(const ClassNameResolver&) = delete;
+ ClassNameResolver& operator=(const ClassNameResolver&) = delete;
// Gets the unqualified outer class name for the file.
std::string GetFileClassName(const FileDescriptor* file, bool immutable);
@@ -135,6 +141,8 @@
const FileDescriptor* file, bool immutable,
bool is_own_file, bool kotlin);
+ Options options_;
+
private:
// Get the Java Class style full name of a message.
std::string GetJavaClassFullName(const std::string& name_without_package,
@@ -145,8 +153,6 @@
// Caches the result to provide better performance.
std::map<const FileDescriptor*, std::string>
file_immutable_outer_class_names_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ClassNameResolver);
};
} // namespace java
@@ -154,6 +160,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_COMPILER_JAVA_NAME_RESOLVER_H__
diff --git a/src/google/protobuf/compiler/java/names.cc b/src/google/protobuf/compiler/java/names.cc
new file mode 100644
index 0000000..7d6ec92
--- /dev/null
+++ b/src/google/protobuf/compiler/java/names.cc
@@ -0,0 +1,194 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Author: kenton@google.com (Kenton Varda)
+// Based on original Protocol Buffers design by
+// Sanjay Ghemawat, Jeff Dean, and others.
+
+#include "google/protobuf/compiler/java/names.h"
+
+#include <string>
+
+#include "absl/container/flat_hash_set.h"
+#include "google/protobuf/compiler/java/helpers.h"
+#include "google/protobuf/compiler/java/name_resolver.h"
+#include "google/protobuf/compiler/java/names.h"
+#include "google/protobuf/compiler/java/options.h"
+#include "google/protobuf/descriptor.pb.h"
+
+// Must be last.
+#include "google/protobuf/port_def.inc"
+
+namespace google {
+namespace protobuf {
+namespace compiler {
+namespace java {
+
+namespace {
+
+const char* DefaultPackage(Options options) {
+ return options.opensource_runtime ? "" : "com.google.protos";
+}
+
+bool IsReservedName(absl::string_view name) {
+ static const auto& kReservedNames =
+ *new absl::flat_hash_set<absl::string_view>({
+ "abstract", "assert", "boolean", "break", "byte",
+ "case", "catch", "char", "class", "const",
+ "continue", "default", "do", "double", "else",
+ "enum", "extends", "final", "finally", "float",
+ "for", "goto", "if", "implements", "import",
+ "instanceof", "int", "interface", "long", "native",
+ "new", "package", "private", "protected", "public",
+ "return", "short", "static", "strictfp", "super",
+ "switch", "synchronized", "this", "throw", "throws",
+ "transient", "try", "void", "volatile", "while",
+ });
+ return kReservedNames.contains(name);
+}
+
+bool IsForbidden(const std::string& field_name) {
+ // Names that should be avoided (in UpperCamelCase format).
+ // Using them will cause the compiler to generate accessors whose names
+ // collide with methods defined in base classes.
+ // Keep this list in sync with specialFieldNames in
+ // java/core/src/main/java/com/google/protobuf/DescriptorMessageInfoFactory.java
+ static const auto& kForbiddenNames =
+ *new absl::flat_hash_set<absl::string_view>({
+ // java.lang.Object:
+ "Class",
+ // com.google.protobuf.MessageLiteOrBuilder:
+ "DefaultInstanceForType",
+ // com.google.protobuf.MessageLite:
+ "ParserForType",
+ "SerializedSize",
+ // com.google.protobuf.MessageOrBuilder:
+ "AllFields",
+ "DescriptorForType",
+ "InitializationErrorString",
+ "UnknownFields",
+ // obsolete. kept for backwards compatibility of generated code
+ "CachedSize",
+ });
+ return kForbiddenNames.contains(UnderscoresToCamelCase(field_name, true));
+}
+
+std::string FieldName(const FieldDescriptor* field) {
+ std::string field_name;
+ // Groups are hacky: The name of the field is just the lower-cased name
+ // of the group type. In Java, though, we would like to retain the original
+ // capitalization of the type name.
+ if (GetType(field) == FieldDescriptor::TYPE_GROUP) {
+ field_name = field->message_type()->name();
+ } else {
+ field_name = field->name();
+ }
+ if (IsForbidden(field_name)) {
+ // Append a trailing "#" to indicate that the name should be decorated to
+ // avoid collision with other names.
+ field_name += "#";
+ }
+ return field_name;
+}
+
+} // namespace
+
+std::string ClassName(const Descriptor* descriptor) {
+ ClassNameResolver name_resolver;
+ return name_resolver.GetClassName(descriptor, true);
+}
+
+std::string ClassName(const EnumDescriptor* descriptor) {
+ ClassNameResolver name_resolver;
+ return name_resolver.GetClassName(descriptor, true);
+}
+
+std::string ClassName(const ServiceDescriptor* descriptor) {
+ ClassNameResolver name_resolver;
+ return name_resolver.GetClassName(descriptor, true);
+}
+
+std::string ClassName(const FileDescriptor* descriptor) {
+ ClassNameResolver name_resolver;
+ return name_resolver.GetClassName(descriptor, true);
+}
+
+
+std::string FileJavaPackage(const FileDescriptor* file, bool immutable,
+ Options options) {
+ std::string result;
+
+ if (file->options().has_java_package()) {
+ result = file->options().java_package();
+ } else {
+ result = DefaultPackage(options);
+ if (!file->package().empty()) {
+ if (!result.empty()) result += '.';
+ result += file->package();
+ }
+ }
+
+ return result;
+}
+
+std::string FileJavaPackage(const FileDescriptor* file, Options options) {
+ return FileJavaPackage(file, true /* immutable */, options);
+}
+
+std::string CapitalizedFieldName(const FieldDescriptor* field) {
+ return UnderscoresToCamelCase(FieldName(field), true);
+}
+
+std::string UnderscoresToCamelCase(const FieldDescriptor* field) {
+ return UnderscoresToCamelCase(FieldName(field), false);
+}
+
+std::string UnderscoresToCapitalizedCamelCase(const FieldDescriptor* field) {
+ return UnderscoresToCamelCase(FieldName(field), true);
+}
+
+std::string UnderscoresToCamelCase(const MethodDescriptor* method) {
+ return UnderscoresToCamelCase(method->name(), false);
+}
+
+std::string UnderscoresToCamelCaseCheckReserved(const FieldDescriptor* field) {
+ std::string name = UnderscoresToCamelCase(field);
+ if (IsReservedName(name)) {
+ return name + "_";
+ }
+ return name;
+}
+
+} // namespace java
+} // namespace compiler
+} // namespace protobuf
+} // namespace google
+
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/compiler/java/names.h b/src/google/protobuf/compiler/java/names.h
index 313ace4..73c78fb 100644
--- a/src/google/protobuf/compiler/java/names.h
+++ b/src/google/protobuf/compiler/java/names.h
@@ -40,6 +40,9 @@
#include <string>
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/compiler/java/options.h"
+
namespace google {
namespace protobuf {
@@ -85,7 +88,8 @@
//
// Returns:
// Java package name.
-std::string FileJavaPackage(const FileDescriptor* descriptor);
+std::string FileJavaPackage(const FileDescriptor* descriptor,
+ Options options = {});
// Requires:
// descriptor != NULL
@@ -93,6 +97,31 @@
// Capitalized camel case name field name.
std::string CapitalizedFieldName(const FieldDescriptor* descriptor);
+// Returns:
+// Converts a name to camel-case. If cap_first_letter is true, capitalize the
+// first letter.
+std::string UnderscoresToCamelCase(const std::string& name,
+ bool cap_first_letter);
+// Requires:
+// field != NULL
+// Returns:
+// Converts the field's name to camel-case, e.g. "foo_bar_baz" becomes
+// "fooBarBaz" or "FooBarBaz", respectively.
+std::string UnderscoresToCamelCase(const FieldDescriptor* field);
+
+// Requires:
+// method != NULL
+// Returns:
+// Similar, but for method names. (Typically, this merely has the effect
+// of lower-casing the first letter of the name.)
+std::string UnderscoresToCamelCase(const MethodDescriptor* method);
+
+// Requires:
+// field != NULL
+// Returns:
+// Same as UnderscoresToCamelCase, but checks for reserved keywords
+std::string UnderscoresToCamelCaseCheckReserved(const FieldDescriptor* field);
+
} // namespace java
} // namespace compiler
} // namespace protobuf
diff --git a/src/google/protobuf/compiler/java/options.h b/src/google/protobuf/compiler/java/options.h
index 6c29be1..79d90fd 100644
--- a/src/google/protobuf/compiler/java/options.h
+++ b/src/google/protobuf/compiler/java/options.h
@@ -33,6 +33,8 @@
#include <string>
+#include "google/protobuf/port_def.inc"
+
namespace google {
namespace protobuf {
namespace compiler {
@@ -54,6 +56,7 @@
// When set, the protoc will generate the current files and all the transitive
// dependencies as lite runtime.
bool enforce_lite;
+ bool opensource_runtime = PROTO2_IS_OSS;
// If true, we should build .meta files and emit @Generated annotations into
// generated code.
bool annotate_code;
@@ -70,4 +73,5 @@
} // namespace protobuf
} // namespace google
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_COMPILER_JAVA_OPTIONS_H__
diff --git a/src/google/protobuf/compiler/java/plugin_unittest.cc b/src/google/protobuf/compiler/java/plugin_unittest.cc
index 8135f86..7fcfd87 100644
--- a/src/google/protobuf/compiler/java/plugin_unittest.cc
+++ b/src/google/protobuf/compiler/java/plugin_unittest.cc
@@ -33,15 +33,15 @@
#include <memory>
#include <string>
-#include <google/protobuf/testing/file.h>
-#include <google/protobuf/testing/file.h>
-#include <google/protobuf/compiler/java/generator.h>
-#include <google/protobuf/compiler/command_line_interface.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/testing/googletest.h>
+#include "google/protobuf/testing/file.h"
+#include "google/protobuf/testing/file.h"
+#include "google/protobuf/compiler/java/generator.h"
+#include "google/protobuf/compiler/command_line_interface.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/io/zero_copy_stream.h"
+#include "google/protobuf/testing/googletest.h"
#include <gtest/gtest.h>
+#include "absl/strings/str_split.h"
namespace google {
namespace protobuf {
@@ -114,7 +114,7 @@
std::string output;
GOOGLE_CHECK_OK(File::GetContents(TestTempDir() + "/Test.java", &output,
true));
- std::vector<std::string> lines = Split(output, "\n");
+ std::vector<std::string> lines = absl::StrSplit(output, "\n");
bool found_generated_annotation = false;
bool found_do_not_edit = false;
for (const auto& line : lines) {
diff --git a/src/google/protobuf/compiler/java/primitive_field.cc b/src/google/protobuf/compiler/java/primitive_field.cc
index 6ed47d7..cc9255c 100644
--- a/src/google/protobuf/compiler/java/primitive_field.cc
+++ b/src/google/protobuf/compiler/java/primitive_field.cc
@@ -32,21 +32,22 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/compiler/java/primitive_field.h>
+#include "google/protobuf/compiler/java/primitive_field.h"
#include <cstdint>
#include <map>
#include <string>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/wire_format.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/compiler/java/context.h>
-#include <google/protobuf/compiler/java/doc_comment.h>
-#include <google/protobuf/compiler/java/helpers.h>
-#include <google/protobuf/compiler/java/name_resolver.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/wire_format.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "absl/strings/str_cat.h"
+#include "google/protobuf/compiler/java/context.h"
+#include "google/protobuf/compiler/java/doc_comment.h"
+#include "google/protobuf/compiler/java/helpers.h"
+#include "google/protobuf/compiler/java/name_resolver.h"
namespace google {
namespace protobuf {
@@ -61,7 +62,8 @@
int messageBitIndex, int builderBitIndex,
const FieldGeneratorInfo* info,
ClassNameResolver* name_resolver,
- std::map<std::string, std::string>* variables) {
+ std::map<std::string, std::string>* variables,
+ Context* context) {
SetCommonFieldVariables(descriptor, info, variables);
JavaType javaType = GetJavaType(descriptor);
@@ -106,16 +108,18 @@
(*variables)["repeated_set"] = (*variables)["name"] + "_.set";
}
- (*variables)["default"] = ImmutableDefaultValue(descriptor, name_resolver);
+ (*variables)["default"] =
+ ImmutableDefaultValue(descriptor, name_resolver, context->options());
(*variables)["default_init"] =
IsDefaultValueJavaDefault(descriptor)
? ""
- : ("= " + ImmutableDefaultValue(descriptor, name_resolver));
- (*variables)["capitalized_type"] =
- GetCapitalizedType(descriptor, /* immutable = */ true);
+ : ("= " + ImmutableDefaultValue(descriptor, name_resolver,
+ context->options()));
+ (*variables)["capitalized_type"] = GetCapitalizedType(
+ descriptor, /* immutable = */ true, context->options());
(*variables)["tag"] =
- StrCat(static_cast<int32_t>(WireFormat::MakeTag(descriptor)));
- (*variables)["tag_size"] = StrCat(
+ absl::StrCat(static_cast<int32_t>(WireFormat::MakeTag(descriptor)));
+ (*variables)["tag_size"] = absl::StrCat(
WireFormat::TagSize(descriptor->number(), GetType(descriptor)));
if (IsReferenceType(GetJavaType(descriptor))) {
(*variables)["null_check"] =
@@ -136,7 +140,7 @@
: "";
int fixed_size = FixedSize(GetType(descriptor));
if (fixed_size != -1) {
- (*variables)["fixed_size"] = StrCat(fixed_size);
+ (*variables)["fixed_size"] = absl::StrCat(fixed_size);
}
(*variables)["on_changed"] = "onChanged();";
@@ -202,7 +206,7 @@
: descriptor_(descriptor), name_resolver_(context->GetNameResolver()) {
SetPrimitiveVariables(descriptor, messageBitIndex, builderBitIndex,
context->GetFieldGeneratorInfo(descriptor),
- name_resolver_, &variables_);
+ name_resolver_, &variables_, context);
}
ImmutablePrimitiveFieldGenerator::~ImmutablePrimitiveFieldGenerator() {}
@@ -311,9 +315,9 @@
void ImmutablePrimitiveFieldGenerator::GenerateKotlinDslMembers(
io::Printer* printer) const {
- WriteFieldDocComment(printer, descriptor_);
+ WriteFieldDocComment(printer, descriptor_, /* kdoc */ true);
printer->Print(variables_,
- "$kt_deprecation$var $kt_name$: $kt_type$\n"
+ "$kt_deprecation$public var $kt_name$: $kt_type$\n"
" @JvmName(\"${$get$kt_capitalized_name$$}$\")\n"
" get() = $kt_dsl_builder$.${$get$capitalized_name$$}$()\n"
" @JvmName(\"${$set$kt_capitalized_name$$}$\")\n"
@@ -322,17 +326,18 @@
" }\n");
WriteFieldAccessorDocComment(printer, descriptor_, CLEARER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(variables_,
- "fun ${$clear$kt_capitalized_name$$}$() {\n"
+ "public fun ${$clear$kt_capitalized_name$$}$() {\n"
" $kt_dsl_builder$.${$clear$capitalized_name$$}$()\n"
"}\n");
if (HasHazzer(descriptor_)) {
- WriteFieldAccessorDocComment(printer, descriptor_, HAZZER);
+ WriteFieldAccessorDocComment(printer, descriptor_, HAZZER,
+ /* builder */ false, /* kdoc */ true);
printer->Print(
variables_,
- "fun ${$has$kt_capitalized_name$$}$(): kotlin.Boolean {\n"
+ "public fun ${$has$kt_capitalized_name$$}$(): kotlin.Boolean {\n"
" return $kt_dsl_builder$.${$has$capitalized_name$$}$()\n"
"}\n");
}
@@ -674,7 +679,7 @@
: descriptor_(descriptor), name_resolver_(context->GetNameResolver()) {
SetPrimitiveVariables(descriptor, messageBitIndex, builderBitIndex,
context->GetFieldGeneratorInfo(descriptor),
- name_resolver_, &variables_);
+ name_resolver_, &variables_, context);
}
RepeatedImmutablePrimitiveFieldGenerator::
@@ -843,12 +848,12 @@
" */\n"
"@kotlin.OptIn"
"(com.google.protobuf.kotlin.OnlyForUseByGeneratedProtoCode::class)\n"
- "class ${$$kt_capitalized_name$Proxy$}$ private constructor()"
+ "public class ${$$kt_capitalized_name$Proxy$}$ private constructor()"
" : com.google.protobuf.kotlin.DslProxy()\n");
- WriteFieldDocComment(printer, descriptor_);
+ WriteFieldDocComment(printer, descriptor_, /* kdoc */ true);
printer->Print(variables_,
- "$kt_deprecation$ val $kt_name$: "
+ "$kt_deprecation$ public val $kt_name$: "
"com.google.protobuf.kotlin.DslList"
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>\n"
" @kotlin.jvm.JvmSynthetic\n"
@@ -857,70 +862,70 @@
" )\n");
WriteFieldAccessorDocComment(printer, descriptor_, LIST_ADDER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"add$kt_capitalized_name$\")\n"
- "fun com.google.protobuf.kotlin.DslList"
+ "public fun com.google.protobuf.kotlin.DslList"
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>."
"add(value: $kt_type$) {\n"
" $kt_dsl_builder$.${$add$capitalized_name$$}$(value)\n"
"}");
WriteFieldAccessorDocComment(printer, descriptor_, LIST_ADDER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"plusAssign$kt_capitalized_name$\")\n"
"@Suppress(\"NOTHING_TO_INLINE\")\n"
- "inline operator fun com.google.protobuf.kotlin.DslList"
+ "public inline operator fun com.google.protobuf.kotlin.DslList"
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>."
"plusAssign(value: $kt_type$) {\n"
" add(value)\n"
"}");
WriteFieldAccessorDocComment(printer, descriptor_, LIST_MULTI_ADDER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"addAll$kt_capitalized_name$\")\n"
- "fun com.google.protobuf.kotlin.DslList"
+ "public fun com.google.protobuf.kotlin.DslList"
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>."
"addAll(values: kotlin.collections.Iterable<$kt_type$>) {\n"
" $kt_dsl_builder$.${$addAll$capitalized_name$$}$(values)\n"
"}");
WriteFieldAccessorDocComment(printer, descriptor_, LIST_MULTI_ADDER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(
variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"plusAssignAll$kt_capitalized_name$\")\n"
"@Suppress(\"NOTHING_TO_INLINE\")\n"
- "inline operator fun com.google.protobuf.kotlin.DslList"
+ "public inline operator fun com.google.protobuf.kotlin.DslList"
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>."
"plusAssign(values: kotlin.collections.Iterable<$kt_type$>) {\n"
" addAll(values)\n"
"}");
WriteFieldAccessorDocComment(printer, descriptor_, LIST_INDEXED_SETTER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(
variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"set$kt_capitalized_name$\")\n"
- "operator fun com.google.protobuf.kotlin.DslList"
+ "public operator fun com.google.protobuf.kotlin.DslList"
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>."
"set(index: kotlin.Int, value: $kt_type$) {\n"
" $kt_dsl_builder$.${$set$capitalized_name$$}$(index, value)\n"
"}");
WriteFieldAccessorDocComment(printer, descriptor_, CLEARER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"clear$kt_capitalized_name$\")\n"
- "fun com.google.protobuf.kotlin.DslList"
+ "public fun com.google.protobuf.kotlin.DslList"
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>."
"clear() {\n"
" $kt_dsl_builder$.${$clear$capitalized_name$$}$()\n"
diff --git a/src/google/protobuf/compiler/java/primitive_field.h b/src/google/protobuf/compiler/java/primitive_field.h
index d3a6c2a..d8104ba 100644
--- a/src/google/protobuf/compiler/java/primitive_field.h
+++ b/src/google/protobuf/compiler/java/primitive_field.h
@@ -38,7 +38,7 @@
#include <map>
#include <string>
-#include <google/protobuf/compiler/java/field.h>
+#include "google/protobuf/compiler/java/field.h"
namespace google {
namespace protobuf {
@@ -62,6 +62,10 @@
int messageBitIndex,
int builderBitIndex,
Context* context);
+ ImmutablePrimitiveFieldGenerator(const ImmutablePrimitiveFieldGenerator&) =
+ delete;
+ ImmutablePrimitiveFieldGenerator& operator=(
+ const ImmutablePrimitiveFieldGenerator&) = delete;
~ImmutablePrimitiveFieldGenerator() override;
// implements ImmutableFieldGenerator
@@ -90,9 +94,6 @@
const FieldDescriptor* descriptor_;
std::map<std::string, std::string> variables_;
ClassNameResolver* name_resolver_;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutablePrimitiveFieldGenerator);
};
class ImmutablePrimitiveOneofFieldGenerator
@@ -101,6 +102,10 @@
ImmutablePrimitiveOneofFieldGenerator(const FieldDescriptor* descriptor,
int messageBitIndex,
int builderBitIndex, Context* context);
+ ImmutablePrimitiveOneofFieldGenerator(
+ const ImmutablePrimitiveOneofFieldGenerator&) = delete;
+ ImmutablePrimitiveOneofFieldGenerator& operator=(
+ const ImmutablePrimitiveOneofFieldGenerator&) = delete;
~ImmutablePrimitiveOneofFieldGenerator() override;
void GenerateMembers(io::Printer* printer) const override;
@@ -111,9 +116,6 @@
void GenerateBuilderParsingCode(io::Printer* printer) const override;
void GenerateSerializationCode(io::Printer* printer) const override;
void GenerateSerializedSizeCode(io::Printer* printer) const override;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutablePrimitiveOneofFieldGenerator);
};
class RepeatedImmutablePrimitiveFieldGenerator
@@ -122,6 +124,10 @@
explicit RepeatedImmutablePrimitiveFieldGenerator(
const FieldDescriptor* descriptor, int messageBitIndex,
int builderBitIndex, Context* context);
+ RepeatedImmutablePrimitiveFieldGenerator(
+ const RepeatedImmutablePrimitiveFieldGenerator&) = delete;
+ RepeatedImmutablePrimitiveFieldGenerator& operator=(
+ const RepeatedImmutablePrimitiveFieldGenerator&) = delete;
~RepeatedImmutablePrimitiveFieldGenerator() override;
// implements ImmutableFieldGenerator ---------------------------------------
@@ -151,8 +157,6 @@
const FieldDescriptor* descriptor_;
std::map<std::string, std::string> variables_;
ClassNameResolver* name_resolver_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedImmutablePrimitiveFieldGenerator);
};
} // namespace java
diff --git a/src/google/protobuf/compiler/java/primitive_field_lite.cc b/src/google/protobuf/compiler/java/primitive_field_lite.cc
index e323fef..6db3a8c 100644
--- a/src/google/protobuf/compiler/java/primitive_field_lite.cc
+++ b/src/google/protobuf/compiler/java/primitive_field_lite.cc
@@ -32,21 +32,23 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/compiler/java/primitive_field_lite.h>
+#include "google/protobuf/compiler/java/primitive_field_lite.h"
#include <cstdint>
#include <map>
#include <string>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/wire_format.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/compiler/java/context.h>
-#include <google/protobuf/compiler/java/doc_comment.h>
-#include <google/protobuf/compiler/java/helpers.h>
-#include <google/protobuf/compiler/java/name_resolver.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/wire_format.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "absl/strings/ascii.h"
+#include "absl/strings/str_cat.h"
+#include "google/protobuf/compiler/java/context.h"
+#include "google/protobuf/compiler/java/doc_comment.h"
+#include "google/protobuf/compiler/java/helpers.h"
+#include "google/protobuf/compiler/java/name_resolver.h"
namespace google {
namespace protobuf {
@@ -69,19 +71,21 @@
int messageBitIndex, int builderBitIndex,
const FieldGeneratorInfo* info,
ClassNameResolver* name_resolver,
- std::map<std::string, std::string>* variables) {
+ std::map<std::string, std::string>* variables,
+ Context* context) {
SetCommonFieldVariables(descriptor, info, variables);
JavaType javaType = GetJavaType(descriptor);
(*variables)["type"] = PrimitiveTypeName(javaType);
(*variables)["boxed_type"] = BoxedPrimitiveTypeName(javaType);
(*variables)["kt_type"] = KotlinTypeName(javaType);
(*variables)["field_type"] = (*variables)["type"];
- (*variables)["default"] = ImmutableDefaultValue(descriptor, name_resolver);
- (*variables)["capitalized_type"] =
- GetCapitalizedType(descriptor, /* immutable = */ true);
+ (*variables)["default"] =
+ ImmutableDefaultValue(descriptor, name_resolver, context->options());
+ (*variables)["capitalized_type"] = GetCapitalizedType(
+ descriptor, /* immutable = */ true, context->options());
(*variables)["tag"] =
- StrCat(static_cast<int32_t>(WireFormat::MakeTag(descriptor)));
- (*variables)["tag_size"] = StrCat(
+ absl::StrCat(static_cast<int32_t>(WireFormat::MakeTag(descriptor)));
+ (*variables)["tag_size"] = absl::StrCat(
WireFormat::TagSize(descriptor->number(), GetType(descriptor)));
(*variables)["required"] = descriptor->is_required() ? "true" : "false";
@@ -123,7 +127,7 @@
if (javaType == JAVATYPE_BYTES) {
(*variables)["bytes_default"] =
- ToUpper((*variables)["name"]) + "_DEFAULT_VALUE";
+ absl::AsciiStrToUpper((*variables)["name"]) + "_DEFAULT_VALUE";
}
if (IsReferenceType(javaType)) {
@@ -145,7 +149,7 @@
: "";
int fixed_size = FixedSize(GetType(descriptor));
if (fixed_size != -1) {
- (*variables)["fixed_size"] = StrCat(fixed_size);
+ (*variables)["fixed_size"] = absl::StrCat(fixed_size);
}
if (HasHasbit(descriptor)) {
@@ -189,6 +193,8 @@
GenerateGetBitFromLocal(builderBitIndex);
(*variables)["set_has_field_bit_to_local"] =
GenerateSetBitToLocal(messageBitIndex);
+ // Annotations often use { and } variables to denote ranges.
+ (*variables)["{"] = (*variables)["}"] = "";
}
} // namespace
@@ -199,10 +205,11 @@
const FieldDescriptor* descriptor, int messageBitIndex, Context* context)
: descriptor_(descriptor),
messageBitIndex_(messageBitIndex),
+ context_(context),
name_resolver_(context->GetNameResolver()) {
SetPrimitiveVariables(descriptor, messageBitIndex, 0,
context->GetFieldGeneratorInfo(descriptor),
- name_resolver_, &variables_);
+ name_resolver_, &variables_, context);
}
ImmutablePrimitiveFieldLiteGenerator::~ImmutablePrimitiveFieldLiteGenerator() {}
@@ -219,7 +226,9 @@
"$deprecation$boolean has$capitalized_name$();\n");
}
WriteFieldAccessorDocComment(printer, descriptor_, GETTER);
- printer->Print(variables_, "$deprecation$$type$ get$capitalized_name$();\n");
+ printer->Print(variables_,
+ "$deprecation$$type$ ${$get$capitalized_name$$}$();\n");
+ printer->Annotate("{", "}", descriptor_);
}
void ImmutablePrimitiveFieldLiteGenerator::GenerateMembers(
@@ -231,6 +240,20 @@
variables_,
"private static final $field_type$ $bytes_default$ = $default$;\n");
}
+ if (!context_->options().opensource_runtime) {
+ printer->Print(
+ variables_,
+ "@com.google.protobuf.ProtoField(\n"
+ " fieldNumber=$number$,\n"
+ " type=com.google.protobuf.FieldType.$annotation_field_type$,\n"
+ " isRequired=$required$)\n");
+ if (HasHazzer(descriptor_)) {
+ printer->Print(variables_,
+ "@com.google.protobuf.ProtoPresenceCheckedField(\n"
+ " presenceBitsId=$bit_field_id$,\n"
+ " mask=$bit_field_mask$)\n");
+ }
+ }
printer->Print(variables_, "private $field_type$ $name$_;\n");
PrintExtraFieldInfo(variables_, printer);
if (HasHazzer(descriptor_)) {
@@ -325,7 +348,7 @@
io::Printer* printer) const {
WriteFieldDocComment(printer, descriptor_);
printer->Print(variables_,
- "$kt_deprecation$var $kt_name$: $kt_type$\n"
+ "$kt_deprecation$public var $kt_name$: $kt_type$\n"
" @JvmName(\"${$get$kt_capitalized_name$$}$\")\n"
" get() = $kt_dsl_builder$.${$get$capitalized_name$$}$()\n"
" @JvmName(\"${$set$kt_capitalized_name$$}$\")\n"
@@ -334,17 +357,18 @@
" }\n");
WriteFieldAccessorDocComment(printer, descriptor_, CLEARER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(variables_,
- "fun ${$clear$kt_capitalized_name$$}$() {\n"
+ "public fun ${$clear$kt_capitalized_name$$}$() {\n"
" $kt_dsl_builder$.${$clear$capitalized_name$$}$()\n"
"}\n");
if (HasHazzer(descriptor_)) {
- WriteFieldAccessorDocComment(printer, descriptor_, HAZZER);
+ WriteFieldAccessorDocComment(printer, descriptor_, HAZZER,
+ /* builder */ false, /* kdoc */ true);
printer->Print(
variables_,
- "fun ${$has$kt_capitalized_name$$}$(): kotlin.Boolean {\n"
+ "public fun ${$has$kt_capitalized_name$$}$(): kotlin.Boolean {\n"
" return $kt_dsl_builder$.${$has$capitalized_name$$}$()\n"
"}\n");
}
@@ -492,7 +516,7 @@
name_resolver_(context->GetNameResolver()) {
SetPrimitiveVariables(descriptor, messageBitIndex, 0,
context->GetFieldGeneratorInfo(descriptor),
- name_resolver_, &variables_);
+ name_resolver_, &variables_, context);
}
RepeatedImmutablePrimitiveFieldLiteGenerator::
@@ -507,13 +531,17 @@
WriteFieldAccessorDocComment(printer, descriptor_, LIST_GETTER);
printer->Print(variables_,
"$deprecation$java.util.List<$boxed_type$> "
- "get$capitalized_name$List();\n");
+ "${$get$capitalized_name$List$}$();\n");
+ printer->Annotate("{", "}", descriptor_);
WriteFieldAccessorDocComment(printer, descriptor_, LIST_COUNT);
printer->Print(variables_,
- "$deprecation$int get$capitalized_name$Count();\n");
+ "$deprecation$int ${$get$capitalized_name$Count$}$();\n");
+ printer->Annotate("{", "}", descriptor_);
WriteFieldAccessorDocComment(printer, descriptor_, LIST_INDEXED_GETTER);
- printer->Print(variables_,
- "$deprecation$$type$ get$capitalized_name$(int index);\n");
+ printer->Print(
+ variables_,
+ "$deprecation$$type$ ${$get$capitalized_name$$}$(int index);\n");
+ printer->Annotate("{", "}", descriptor_);
}
void RepeatedImmutablePrimitiveFieldLiteGenerator::GenerateMembers(
@@ -671,12 +699,12 @@
" */\n"
"@kotlin.OptIn"
"(com.google.protobuf.kotlin.OnlyForUseByGeneratedProtoCode::class)\n"
- "class ${$$kt_capitalized_name$Proxy$}$ private constructor()"
+ "public class ${$$kt_capitalized_name$Proxy$}$ private constructor()"
" : com.google.protobuf.kotlin.DslProxy()\n");
WriteFieldDocComment(printer, descriptor_);
printer->Print(variables_,
- "$kt_deprecation$ val $kt_name$: "
+ "$kt_deprecation$ public val $kt_name$: "
"com.google.protobuf.kotlin.DslList"
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>\n"
" @kotlin.jvm.JvmSynthetic\n"
@@ -685,70 +713,70 @@
" )\n");
WriteFieldAccessorDocComment(printer, descriptor_, LIST_ADDER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"add$kt_capitalized_name$\")\n"
- "fun com.google.protobuf.kotlin.DslList"
+ "public fun com.google.protobuf.kotlin.DslList"
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>."
"add(value: $kt_type$) {\n"
" $kt_dsl_builder$.${$add$capitalized_name$$}$(value)\n"
"}");
WriteFieldAccessorDocComment(printer, descriptor_, LIST_ADDER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"plusAssign$kt_capitalized_name$\")\n"
"@Suppress(\"NOTHING_TO_INLINE\")\n"
- "inline operator fun com.google.protobuf.kotlin.DslList"
+ "public inline operator fun com.google.protobuf.kotlin.DslList"
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>."
"plusAssign(value: $kt_type$) {\n"
" add(value)\n"
"}");
WriteFieldAccessorDocComment(printer, descriptor_, LIST_MULTI_ADDER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"addAll$kt_capitalized_name$\")\n"
- "fun com.google.protobuf.kotlin.DslList"
+ "public fun com.google.protobuf.kotlin.DslList"
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>."
"addAll(values: kotlin.collections.Iterable<$kt_type$>) {\n"
" $kt_dsl_builder$.${$addAll$capitalized_name$$}$(values)\n"
"}");
WriteFieldAccessorDocComment(printer, descriptor_, LIST_MULTI_ADDER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(
variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"plusAssignAll$kt_capitalized_name$\")\n"
"@Suppress(\"NOTHING_TO_INLINE\")\n"
- "inline operator fun com.google.protobuf.kotlin.DslList"
+ "public inline operator fun com.google.protobuf.kotlin.DslList"
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>."
"plusAssign(values: kotlin.collections.Iterable<$kt_type$>) {\n"
" addAll(values)\n"
"}");
WriteFieldAccessorDocComment(printer, descriptor_, LIST_INDEXED_SETTER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(
variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"set$kt_capitalized_name$\")\n"
- "operator fun com.google.protobuf.kotlin.DslList"
+ "public operator fun com.google.protobuf.kotlin.DslList"
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>."
"set(index: kotlin.Int, value: $kt_type$) {\n"
" $kt_dsl_builder$.${$set$capitalized_name$$}$(index, value)\n"
"}");
WriteFieldAccessorDocComment(printer, descriptor_, CLEARER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"clear$kt_capitalized_name$\")\n"
- "fun com.google.protobuf.kotlin.DslList"
+ "public fun com.google.protobuf.kotlin.DslList"
"<$kt_type$, ${$$kt_capitalized_name$Proxy$}$>."
"clear() {\n"
" $kt_dsl_builder$.${$clear$capitalized_name$$}$()\n"
diff --git a/src/google/protobuf/compiler/java/primitive_field_lite.h b/src/google/protobuf/compiler/java/primitive_field_lite.h
index 2da0cd8..410b7d6 100644
--- a/src/google/protobuf/compiler/java/primitive_field_lite.h
+++ b/src/google/protobuf/compiler/java/primitive_field_lite.h
@@ -39,7 +39,7 @@
#include <map>
#include <string>
-#include <google/protobuf/compiler/java/field.h>
+#include "google/protobuf/compiler/java/field.h"
namespace google {
namespace protobuf {
@@ -62,6 +62,10 @@
public:
explicit ImmutablePrimitiveFieldLiteGenerator(
const FieldDescriptor* descriptor, int messageBitIndex, Context* context);
+ ImmutablePrimitiveFieldLiteGenerator(
+ const ImmutablePrimitiveFieldLiteGenerator&) = delete;
+ ImmutablePrimitiveFieldLiteGenerator& operator=(
+ const ImmutablePrimitiveFieldLiteGenerator&) = delete;
~ImmutablePrimitiveFieldLiteGenerator() override;
// implements ImmutableFieldLiteGenerator
@@ -81,10 +85,8 @@
const FieldDescriptor* descriptor_;
std::map<std::string, std::string> variables_;
const int messageBitIndex_;
+ Context* context_;
ClassNameResolver* name_resolver_;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutablePrimitiveFieldLiteGenerator);
};
class ImmutablePrimitiveOneofFieldLiteGenerator
@@ -93,6 +95,10 @@
ImmutablePrimitiveOneofFieldLiteGenerator(const FieldDescriptor* descriptor,
int messageBitIndex,
Context* context);
+ ImmutablePrimitiveOneofFieldLiteGenerator(
+ const ImmutablePrimitiveOneofFieldLiteGenerator&) = delete;
+ ImmutablePrimitiveOneofFieldLiteGenerator& operator=(
+ const ImmutablePrimitiveOneofFieldLiteGenerator&) = delete;
~ImmutablePrimitiveOneofFieldLiteGenerator() override;
void GenerateMembers(io::Printer* printer) const override;
@@ -100,9 +106,6 @@
void GenerateFieldInfo(io::Printer* printer,
std::vector<uint16_t>* output) const override;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutablePrimitiveOneofFieldLiteGenerator);
};
class RepeatedImmutablePrimitiveFieldLiteGenerator
@@ -110,6 +113,10 @@
public:
explicit RepeatedImmutablePrimitiveFieldLiteGenerator(
const FieldDescriptor* descriptor, int messageBitIndex, Context* context);
+ RepeatedImmutablePrimitiveFieldLiteGenerator(
+ const RepeatedImmutablePrimitiveFieldLiteGenerator&) = delete;
+ RepeatedImmutablePrimitiveFieldLiteGenerator& operator=(
+ const RepeatedImmutablePrimitiveFieldLiteGenerator&) = delete;
~RepeatedImmutablePrimitiveFieldLiteGenerator() override;
// implements ImmutableFieldLiteGenerator ------------------------------------
@@ -129,8 +136,6 @@
std::map<std::string, std::string> variables_;
Context* context_;
ClassNameResolver* name_resolver_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedImmutablePrimitiveFieldLiteGenerator);
};
} // namespace java
diff --git a/src/google/protobuf/compiler/java/service.cc b/src/google/protobuf/compiler/java/service.cc
index 9e20620..ab1d52c 100644
--- a/src/google/protobuf/compiler/java/service.cc
+++ b/src/google/protobuf/compiler/java/service.cc
@@ -32,17 +32,18 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/compiler/java/service.h>
+#include "google/protobuf/compiler/java/service.h"
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/compiler/java/context.h>
-#include <google/protobuf/compiler/java/doc_comment.h>
-#include <google/protobuf/compiler/java/helpers.h>
-#include <google/protobuf/compiler/java/name_resolver.h>
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "absl/strings/str_cat.h"
+#include "google/protobuf/compiler/java/context.h"
+#include "google/protobuf/compiler/java/doc_comment.h"
+#include "google/protobuf/compiler/java/helpers.h"
+#include "google/protobuf/compiler/java/name_resolver.h"
// Must be last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -68,6 +69,10 @@
WriteServiceDocComment(printer, descriptor_);
MaybePrintGeneratedAnnotation(context_, printer, descriptor_,
/* immutable = */ true);
+ if (!context_->options().opensource_runtime) {
+ printer->Print("@com.google.protobuf.Internal.ProtoNonnullApi\n");
+ }
+
printer->Print(
"public $static$ abstract class $classname$\n"
" implements com.google.protobuf.Service {\n",
@@ -92,7 +97,7 @@
" return $file$.getDescriptor().getServices().get($index$);\n"
"}\n",
"file", name_resolver_->GetImmutableClassName(descriptor_->file()),
- "index", StrCat(descriptor_->index()));
+ "index", absl::StrCat(descriptor_->index()));
GenerateGetDescriptorForType(printer);
// Generate more stuff.
@@ -212,7 +217,7 @@
for (int i = 0; i < descriptor_->method_count(); i++) {
const MethodDescriptor* method = descriptor_->method(i);
std::map<std::string, std::string> vars;
- vars["index"] = StrCat(i);
+ vars["index"] = absl::StrCat(i);
vars["method"] = UnderscoresToCamelCase(method);
vars["input"] = name_resolver_->GetImmutableClassName(method->input_type());
vars["output"] = GetOutput(method);
@@ -259,7 +264,7 @@
for (int i = 0; i < descriptor_->method_count(); i++) {
const MethodDescriptor* method = descriptor_->method(i);
std::map<std::string, std::string> vars;
- vars["index"] = StrCat(i);
+ vars["index"] = absl::StrCat(i);
vars["method"] = UnderscoresToCamelCase(method);
vars["input"] = name_resolver_->GetImmutableClassName(method->input_type());
vars["output"] = GetOutput(method);
@@ -304,7 +309,7 @@
for (int i = 0; i < descriptor_->method_count(); i++) {
const MethodDescriptor* method = descriptor_->method(i);
std::map<std::string, std::string> vars;
- vars["index"] = StrCat(i);
+ vars["index"] = absl::StrCat(i);
vars["type"] =
(which == REQUEST)
? name_resolver_->GetImmutableClassName(method->input_type())
@@ -359,7 +364,7 @@
printer->Indent();
std::map<std::string, std::string> vars;
- vars["index"] = StrCat(i);
+ vars["index"] = absl::StrCat(i);
vars["output"] = GetOutput(method);
printer->Print(vars,
"channel.callMethod(\n"
@@ -423,7 +428,7 @@
printer->Indent();
std::map<std::string, std::string> vars;
- vars["index"] = StrCat(i);
+ vars["index"] = absl::StrCat(i);
vars["output"] = GetOutput(method);
printer->Print(vars,
"return ($output$) channel.callBlockingMethod(\n"
@@ -476,4 +481,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/compiler/java/service.h b/src/google/protobuf/compiler/java/service.h
index 9cb9021..06f50ff 100644
--- a/src/google/protobuf/compiler/java/service.h
+++ b/src/google/protobuf/compiler/java/service.h
@@ -36,7 +36,7 @@
#define GOOGLE_PROTOBUF_COMPILER_JAVA_SERVICE_H__
#include <map>
-#include <google/protobuf/descriptor.h>
+#include "google/protobuf/descriptor.h"
namespace google {
namespace protobuf {
@@ -60,6 +60,8 @@
class ServiceGenerator {
public:
explicit ServiceGenerator(const ServiceDescriptor* descriptor);
+ ServiceGenerator(const ServiceGenerator&) = delete;
+ ServiceGenerator& operator=(const ServiceGenerator&) = delete;
virtual ~ServiceGenerator();
virtual void Generate(io::Printer* printer) = 0;
@@ -69,15 +71,15 @@
protected:
const ServiceDescriptor* descriptor_;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ServiceGenerator);
};
class ImmutableServiceGenerator : public ServiceGenerator {
public:
ImmutableServiceGenerator(const ServiceDescriptor* descriptor,
Context* context);
+ ImmutableServiceGenerator(const ImmutableServiceGenerator&) = delete;
+ ImmutableServiceGenerator& operator=(const ImmutableServiceGenerator&) =
+ delete;
~ImmutableServiceGenerator() override;
void Generate(io::Printer* printer) override;
@@ -128,7 +130,6 @@
Context* context_;
ClassNameResolver* name_resolver_;
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableServiceGenerator);
};
} // namespace java
diff --git a/src/google/protobuf/compiler/java/shared_code_generator.cc b/src/google/protobuf/compiler/java/shared_code_generator.cc
index 39b96ee..c70b61c 100644
--- a/src/google/protobuf/compiler/java/shared_code_generator.cc
+++ b/src/google/protobuf/compiler/java/shared_code_generator.cc
@@ -30,19 +30,19 @@
// Author: xiaofeng@google.com (Feng Xiao)
-#include <google/protobuf/compiler/java/shared_code_generator.h>
+#include "google/protobuf/compiler/java/shared_code_generator.h"
#include <memory>
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/compiler/java/helpers.h>
-#include <google/protobuf/compiler/java/name_resolver.h>
-#include <google/protobuf/compiler/java/names.h>
-#include <google/protobuf/descriptor.pb.h>
+#include "google/protobuf/compiler/code_generator.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/io/zero_copy_stream.h"
+#include "google/protobuf/descriptor.h"
+#include "absl/strings/escaping.h"
+#include "google/protobuf/compiler/java/helpers.h"
+#include "google/protobuf/compiler/java/name_resolver.h"
+#include "google/protobuf/compiler/java/names.h"
+#include "google/protobuf/descriptor.pb.h"
namespace google {
namespace protobuf {
@@ -51,14 +51,16 @@
SharedCodeGenerator::SharedCodeGenerator(const FileDescriptor* file,
const Options& options)
- : name_resolver_(new ClassNameResolver), file_(file), options_(options) {}
+ : name_resolver_(new ClassNameResolver(options)),
+ file_(file),
+ options_(options) {}
SharedCodeGenerator::~SharedCodeGenerator() {}
void SharedCodeGenerator::Generate(
GeneratorContext* context, std::vector<std::string>* file_list,
std::vector<std::string>* annotation_file_list) {
- std::string java_package = FileJavaPackage(file_);
+ std::string java_package = FileJavaPackage(file_, true, options_);
std::string package_dir = JavaPackageToDir(java_package);
if (HasDescriptorMethods(file_, options_.enforce_lite)) {
@@ -87,7 +89,12 @@
"package", java_package);
}
PrintGeneratedAnnotation(printer.get(), '$',
- options_.annotate_code ? info_relative_path : "");
+ options_.annotate_code ? info_relative_path : "",
+ options_);
+
+ if (!options_.opensource_runtime) {
+ printer->Print("@com.google.protobuf.Internal.ProtoNonnullApi\n");
+ }
printer->Print(
"public final class $classname$ {\n"
" public static com.google.protobuf.Descriptors.FileDescriptor\n"
@@ -152,7 +159,7 @@
}
}
printer->Print("\"$data$\"", "data",
- CEscape(file_data.substr(i, kBytesPerLine)));
+ absl::CEscape(file_data.substr(i, kBytesPerLine)));
}
printer->Outdent();
@@ -163,7 +170,7 @@
std::vector<std::pair<std::string, std::string> > dependencies;
for (int i = 0; i < file_->dependency_count(); i++) {
std::string filename = file_->dependency(i)->name();
- std::string package = FileJavaPackage(file_->dependency(i));
+ std::string package = FileJavaPackage(file_->dependency(i), true, options_);
std::string classname =
name_resolver_->GetDescriptorClassName(file_->dependency(i));
std::string full_name;
@@ -180,13 +187,15 @@
printer->Print(
"descriptor = com.google.protobuf.Descriptors.FileDescriptor\n"
" .internalBuildGeneratedFileFrom(descriptorData,\n");
- printer->Print(
- " new com.google.protobuf.Descriptors.FileDescriptor[] {\n");
+ if (options_.opensource_runtime) {
+ printer->Print(
+ " new com.google.protobuf.Descriptors.FileDescriptor[] {\n");
- for (int i = 0; i < dependencies.size(); i++) {
- const std::string& dependency = dependencies[i].second;
- printer->Print(" $dependency$.getDescriptor(),\n", "dependency",
- dependency);
+ for (int i = 0; i < dependencies.size(); i++) {
+ const std::string& dependency = dependencies[i].second;
+ printer->Print(" $dependency$.getDescriptor(),\n", "dependency",
+ dependency);
+ }
}
printer->Print(" });\n");
diff --git a/src/google/protobuf/compiler/java/shared_code_generator.h b/src/google/protobuf/compiler/java/shared_code_generator.h
index b1f6eb3..fdb4f0e 100644
--- a/src/google/protobuf/compiler/java/shared_code_generator.h
+++ b/src/google/protobuf/compiler/java/shared_code_generator.h
@@ -39,8 +39,8 @@
#include <string>
#include <vector>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/compiler/java/options.h>
+#include "google/protobuf/compiler/java/options.h"
+#include "google/protobuf/port.h"
namespace google {
namespace protobuf {
@@ -67,6 +67,8 @@
class SharedCodeGenerator {
public:
SharedCodeGenerator(const FileDescriptor* file, const Options& options);
+ SharedCodeGenerator(const SharedCodeGenerator&) = delete;
+ SharedCodeGenerator& operator=(const SharedCodeGenerator&) = delete;
~SharedCodeGenerator();
void Generate(GeneratorContext* generator_context,
@@ -79,7 +81,6 @@
std::unique_ptr<ClassNameResolver> name_resolver_;
const FileDescriptor* file_;
const Options options_;
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(SharedCodeGenerator);
};
} // namespace java
diff --git a/src/google/protobuf/compiler/java/string_field.cc b/src/google/protobuf/compiler/java/string_field.cc
index e77a8ee..4ad529c 100644
--- a/src/google/protobuf/compiler/java/string_field.cc
+++ b/src/google/protobuf/compiler/java/string_field.cc
@@ -33,21 +33,22 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/compiler/java/string_field.h>
+#include "google/protobuf/compiler/java/string_field.h"
#include <cstdint>
#include <map>
#include <string>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/wire_format.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/compiler/java/context.h>
-#include <google/protobuf/compiler/java/doc_comment.h>
-#include <google/protobuf/compiler/java/helpers.h>
-#include <google/protobuf/compiler/java/name_resolver.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/wire_format.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "absl/strings/str_cat.h"
+#include "google/protobuf/compiler/java/context.h"
+#include "google/protobuf/compiler/java/doc_comment.h"
+#include "google/protobuf/compiler/java/helpers.h"
+#include "google/protobuf/compiler/java/name_resolver.h"
namespace google {
namespace protobuf {
@@ -63,18 +64,21 @@
int messageBitIndex, int builderBitIndex,
const FieldGeneratorInfo* info,
ClassNameResolver* name_resolver,
- std::map<std::string, std::string>* variables) {
+ std::map<std::string, std::string>* variables,
+ Context* context) {
SetCommonFieldVariables(descriptor, info, variables);
(*variables)["empty_list"] = "com.google.protobuf.LazyStringArrayList.EMPTY";
- (*variables)["default"] = ImmutableDefaultValue(descriptor, name_resolver);
+ (*variables)["default"] =
+ ImmutableDefaultValue(descriptor, name_resolver, context->options());
(*variables)["default_init"] =
- "= " + ImmutableDefaultValue(descriptor, name_resolver);
+ "= " +
+ ImmutableDefaultValue(descriptor, name_resolver, context->options());
(*variables)["capitalized_type"] = "String";
(*variables)["tag"] =
- StrCat(static_cast<int32_t>(WireFormat::MakeTag(descriptor)));
- (*variables)["tag_size"] = StrCat(
+ absl::StrCat(static_cast<int32_t>(WireFormat::MakeTag(descriptor)));
+ (*variables)["tag_size"] = absl::StrCat(
WireFormat::TagSize(descriptor->number(), GetType(descriptor)));
(*variables)["null_check"] =
" if (value == null) {\n"
@@ -144,7 +148,7 @@
: descriptor_(descriptor), name_resolver_(context->GetNameResolver()) {
SetPrimitiveVariables(descriptor, messageBitIndex, builderBitIndex,
context->GetFieldGeneratorInfo(descriptor),
- name_resolver_, &variables_);
+ name_resolver_, &variables_, context);
}
ImmutableStringFieldGenerator::~ImmutableStringFieldGenerator() {}
@@ -370,9 +374,9 @@
void ImmutableStringFieldGenerator::GenerateKotlinDslMembers(
io::Printer* printer) const {
- WriteFieldDocComment(printer, descriptor_);
+ WriteFieldDocComment(printer, descriptor_, /* kdoc */ true);
printer->Print(variables_,
- "$kt_deprecation$var $kt_name$: kotlin.String\n"
+ "$kt_deprecation$public var $kt_name$: kotlin.String\n"
" @JvmName(\"${$get$kt_capitalized_name$$}$\")\n"
" get() = $kt_dsl_builder$.${$get$capitalized_name$$}$()\n"
" @JvmName(\"${$set$kt_capitalized_name$$}$\")\n"
@@ -381,17 +385,18 @@
" }\n");
WriteFieldAccessorDocComment(printer, descriptor_, CLEARER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(variables_,
- "fun ${$clear$kt_capitalized_name$$}$() {\n"
+ "public fun ${$clear$kt_capitalized_name$$}$() {\n"
" $kt_dsl_builder$.${$clear$capitalized_name$$}$()\n"
"}\n");
if (HasHazzer(descriptor_)) {
- WriteFieldAccessorDocComment(printer, descriptor_, HAZZER);
+ WriteFieldAccessorDocComment(printer, descriptor_, HAZZER,
+ /* builder */ false, /* kdoc */ true);
printer->Print(
variables_,
- "fun ${$has$kt_capitalized_name$$}$(): kotlin.Boolean {\n"
+ "public fun ${$has$kt_capitalized_name$$}$(): kotlin.Boolean {\n"
" return $kt_dsl_builder$.${$has$capitalized_name$$}$()\n"
"}\n");
}
@@ -743,7 +748,7 @@
: descriptor_(descriptor), name_resolver_(context->GetNameResolver()) {
SetPrimitiveVariables(descriptor, messageBitIndex, builderBitIndex,
context->GetFieldGeneratorInfo(descriptor),
- name_resolver_, &variables_);
+ name_resolver_, &variables_, context);
}
RepeatedImmutableStringFieldGenerator::
@@ -954,13 +959,14 @@
" */\n"
"@kotlin.OptIn"
"(com.google.protobuf.kotlin.OnlyForUseByGeneratedProtoCode::class)\n"
- "class ${$$kt_capitalized_name$Proxy$}$ private constructor()"
+ "public class ${$$kt_capitalized_name$Proxy$}$ private constructor()"
" : com.google.protobuf.kotlin.DslProxy()\n");
// property for List<String>
- WriteFieldAccessorDocComment(printer, descriptor_, LIST_GETTER);
+ WriteFieldAccessorDocComment(printer, descriptor_, LIST_GETTER,
+ /* builder */ false, /* kdoc */ true);
printer->Print(variables_,
- "$kt_deprecation$ val $kt_name$: "
+ "$kt_deprecation$public val $kt_name$: "
"com.google.protobuf.kotlin.DslList"
"<kotlin.String, ${$$kt_capitalized_name$Proxy$}$>\n"
" @kotlin.jvm.JvmSynthetic\n"
@@ -970,11 +976,11 @@
// List<String>.add(String)
WriteFieldAccessorDocComment(printer, descriptor_, LIST_ADDER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"add$kt_capitalized_name$\")\n"
- "fun com.google.protobuf.kotlin.DslList"
+ "public fun com.google.protobuf.kotlin.DslList"
"<kotlin.String, ${$$kt_capitalized_name$Proxy$}$>."
"add(value: kotlin.String) {\n"
" $kt_dsl_builder$.${$add$capitalized_name$$}$(value)\n"
@@ -982,12 +988,12 @@
// List<String> += String
WriteFieldAccessorDocComment(printer, descriptor_, LIST_ADDER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"plusAssign$kt_capitalized_name$\")\n"
"@Suppress(\"NOTHING_TO_INLINE\")\n"
- "inline operator fun com.google.protobuf.kotlin.DslList"
+ "public inline operator fun com.google.protobuf.kotlin.DslList"
"<kotlin.String, ${$$kt_capitalized_name$Proxy$}$>."
"plusAssign(value: kotlin.String) {\n"
" add(value)\n"
@@ -995,12 +1001,12 @@
// List<String>.addAll(Iterable<String>)
WriteFieldAccessorDocComment(printer, descriptor_, LIST_MULTI_ADDER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(
variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"addAll$kt_capitalized_name$\")\n"
- "fun com.google.protobuf.kotlin.DslList"
+ "public fun com.google.protobuf.kotlin.DslList"
"<kotlin.String, ${$$kt_capitalized_name$Proxy$}$>."
"addAll(values: kotlin.collections.Iterable<kotlin.String>) {\n"
" $kt_dsl_builder$.${$addAll$capitalized_name$$}$(values)\n"
@@ -1008,13 +1014,13 @@
// List<String> += Iterable<String>
WriteFieldAccessorDocComment(printer, descriptor_, LIST_MULTI_ADDER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(
variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"plusAssignAll$kt_capitalized_name$\")\n"
"@Suppress(\"NOTHING_TO_INLINE\")\n"
- "inline operator fun com.google.protobuf.kotlin.DslList"
+ "public inline operator fun com.google.protobuf.kotlin.DslList"
"<kotlin.String, ${$$kt_capitalized_name$Proxy$}$>."
"plusAssign(values: kotlin.collections.Iterable<kotlin.String>) {\n"
" addAll(values)\n"
@@ -1022,23 +1028,23 @@
// List<String>[Int] = String
WriteFieldAccessorDocComment(printer, descriptor_, LIST_INDEXED_SETTER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(
variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"set$kt_capitalized_name$\")\n"
- "operator fun com.google.protobuf.kotlin.DslList"
+ "public operator fun com.google.protobuf.kotlin.DslList"
"<kotlin.String, ${$$kt_capitalized_name$Proxy$}$>."
"set(index: kotlin.Int, value: kotlin.String) {\n"
" $kt_dsl_builder$.${$set$capitalized_name$$}$(index, value)\n"
"}");
WriteFieldAccessorDocComment(printer, descriptor_, CLEARER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"clear$kt_capitalized_name$\")\n"
- "fun com.google.protobuf.kotlin.DslList"
+ "public fun com.google.protobuf.kotlin.DslList"
"<kotlin.String, ${$$kt_capitalized_name$Proxy$}$>."
"clear() {\n"
" $kt_dsl_builder$.${$clear$capitalized_name$$}$()\n"
diff --git a/src/google/protobuf/compiler/java/string_field.h b/src/google/protobuf/compiler/java/string_field.h
index 8c2dc5f..c9b6256 100644
--- a/src/google/protobuf/compiler/java/string_field.h
+++ b/src/google/protobuf/compiler/java/string_field.h
@@ -39,7 +39,7 @@
#include <map>
#include <string>
-#include <google/protobuf/compiler/java/field.h>
+#include "google/protobuf/compiler/java/field.h"
namespace google {
namespace protobuf {
@@ -62,6 +62,9 @@
explicit ImmutableStringFieldGenerator(const FieldDescriptor* descriptor,
int messageBitIndex,
int builderBitIndex, Context* context);
+ ImmutableStringFieldGenerator(const ImmutableStringFieldGenerator&) = delete;
+ ImmutableStringFieldGenerator& operator=(
+ const ImmutableStringFieldGenerator&) = delete;
~ImmutableStringFieldGenerator() override;
// implements ImmutableFieldGenerator
@@ -90,9 +93,6 @@
const FieldDescriptor* descriptor_;
std::map<std::string, std::string> variables_;
ClassNameResolver* name_resolver_;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableStringFieldGenerator);
};
class ImmutableStringOneofFieldGenerator
@@ -101,6 +101,10 @@
ImmutableStringOneofFieldGenerator(const FieldDescriptor* descriptor,
int messageBitIndex, int builderBitIndex,
Context* context);
+ ImmutableStringOneofFieldGenerator(
+ const ImmutableStringOneofFieldGenerator&) = delete;
+ ImmutableStringOneofFieldGenerator& operator=(
+ const ImmutableStringOneofFieldGenerator&) = delete;
~ImmutableStringOneofFieldGenerator() override;
private:
@@ -112,8 +116,6 @@
void GenerateBuilderParsingCode(io::Printer* printer) const override;
void GenerateSerializationCode(io::Printer* printer) const override;
void GenerateSerializedSizeCode(io::Printer* printer) const override;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableStringOneofFieldGenerator);
};
class RepeatedImmutableStringFieldGenerator : public ImmutableFieldGenerator {
@@ -121,6 +123,10 @@
explicit RepeatedImmutableStringFieldGenerator(
const FieldDescriptor* descriptor, int messageBitIndex,
int builderBitIndex, Context* context);
+ RepeatedImmutableStringFieldGenerator(
+ const RepeatedImmutableStringFieldGenerator&) = delete;
+ RepeatedImmutableStringFieldGenerator& operator=(
+ const RepeatedImmutableStringFieldGenerator&) = delete;
~RepeatedImmutableStringFieldGenerator() override;
// implements ImmutableFieldGenerator ---------------------------------------
@@ -148,8 +154,6 @@
const FieldDescriptor* descriptor_;
std::map<std::string, std::string> variables_;
ClassNameResolver* name_resolver_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedImmutableStringFieldGenerator);
};
} // namespace java
diff --git a/src/google/protobuf/compiler/java/string_field_lite.cc b/src/google/protobuf/compiler/java/string_field_lite.cc
index 8e5b230..13fb929 100644
--- a/src/google/protobuf/compiler/java/string_field_lite.cc
+++ b/src/google/protobuf/compiler/java/string_field_lite.cc
@@ -33,21 +33,22 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/compiler/java/string_field_lite.h>
+#include "google/protobuf/compiler/java/string_field_lite.h"
#include <cstdint>
#include <map>
#include <string>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/wire_format.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/compiler/java/context.h>
-#include <google/protobuf/compiler/java/doc_comment.h>
-#include <google/protobuf/compiler/java/helpers.h>
-#include <google/protobuf/compiler/java/name_resolver.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/wire_format.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "absl/strings/str_cat.h"
+#include "google/protobuf/compiler/java/context.h"
+#include "google/protobuf/compiler/java/doc_comment.h"
+#include "google/protobuf/compiler/java/helpers.h"
+#include "google/protobuf/compiler/java/name_resolver.h"
namespace google {
namespace protobuf {
@@ -63,19 +64,22 @@
int messageBitIndex, int builderBitIndex,
const FieldGeneratorInfo* info,
ClassNameResolver* name_resolver,
- std::map<std::string, std::string>* variables) {
+ std::map<std::string, std::string>* variables,
+ Context* context) {
SetCommonFieldVariables(descriptor, info, variables);
(*variables)["empty_list"] =
"com.google.protobuf.GeneratedMessageLite.emptyProtobufList()";
- (*variables)["default"] = ImmutableDefaultValue(descriptor, name_resolver);
+ (*variables)["default"] =
+ ImmutableDefaultValue(descriptor, name_resolver, context->options());
(*variables)["default_init"] =
- "= " + ImmutableDefaultValue(descriptor, name_resolver);
+ "= " +
+ ImmutableDefaultValue(descriptor, name_resolver, context->options());
(*variables)["capitalized_type"] = "java.lang.String";
(*variables)["tag"] =
- StrCat(static_cast<int32_t>(WireFormat::MakeTag(descriptor)));
- (*variables)["tag_size"] = StrCat(
+ absl::StrCat(static_cast<int32_t>(WireFormat::MakeTag(descriptor)));
+ (*variables)["tag_size"] = absl::StrCat(
WireFormat::TagSize(descriptor->number(), GetType(descriptor)));
// We use `x.getClass()` as a null check because it generates less bytecode
// than an `if (x == null) { throw ... }` statement.
@@ -92,8 +96,17 @@
" is deprecated\") "
: "";
(*variables)["required"] = descriptor->is_required() ? "true" : "false";
+ if (!context->options().opensource_runtime) {
+ (*variables)["enforce_utf8"] = CheckUtf8(descriptor) ? "true" : "false";
+ }
if (HasHasbit(descriptor)) {
+ if (!context->options().opensource_runtime) {
+ (*variables)["bit_field_id"] = absl::StrCat(messageBitIndex / 32);
+ (*variables)["bit_field_name"] = GetBitFieldNameForBit(messageBitIndex);
+ (*variables)["bit_field_mask"] =
+ absl::StrCat(1 << (messageBitIndex % 32));
+ }
// For singular messages and builders, one bit is used for the hasField bit.
(*variables)["get_has_field_bit_message"] = GenerateGetBit(messageBitIndex);
@@ -116,6 +129,8 @@
GenerateGetBitFromLocal(builderBitIndex);
(*variables)["set_has_field_bit_to_local"] =
GenerateSetBitToLocal(messageBitIndex);
+ // Annotations often use { and } variables to denote text ranges.
+ (*variables)["{"] = (*variables)["}"] = "";
}
} // namespace
@@ -126,10 +141,11 @@
const FieldDescriptor* descriptor, int messageBitIndex, Context* context)
: descriptor_(descriptor),
messageBitIndex_(messageBitIndex),
- name_resolver_(context->GetNameResolver()) {
+ name_resolver_(context->GetNameResolver()),
+ context_(context) {
SetPrimitiveVariables(descriptor, messageBitIndex, 0,
context->GetFieldGeneratorInfo(descriptor),
- name_resolver_, &variables_);
+ name_resolver_, &variables_, context);
}
ImmutableStringFieldLiteGenerator::~ImmutableStringFieldLiteGenerator() {}
@@ -168,19 +184,38 @@
if (HasHazzer(descriptor_)) {
WriteFieldAccessorDocComment(printer, descriptor_, HAZZER);
printer->Print(variables_,
- "$deprecation$boolean has$capitalized_name$();\n");
+ "$deprecation$boolean ${$has$capitalized_name$$}$();\n");
+ printer->Annotate("{", "}", descriptor_);
}
WriteFieldAccessorDocComment(printer, descriptor_, GETTER);
- printer->Print(variables_,
- "$deprecation$java.lang.String get$capitalized_name$();\n");
+ printer->Print(
+ variables_,
+ "$deprecation$java.lang.String ${$get$capitalized_name$$}$();\n");
+ printer->Annotate("{", "}", descriptor_);
WriteFieldStringBytesAccessorDocComment(printer, descriptor_, GETTER);
printer->Print(variables_,
"$deprecation$com.google.protobuf.ByteString\n"
- " get$capitalized_name$Bytes();\n");
+ " ${$get$capitalized_name$Bytes$}$();\n");
+ printer->Annotate("{", "}", descriptor_);
}
void ImmutableStringFieldLiteGenerator::GenerateMembers(
io::Printer* printer) const {
+ if (!context_->options().opensource_runtime) {
+ printer->Print(
+ variables_,
+ "@com.google.protobuf.ProtoField(\n"
+ " fieldNumber=$number$,\n"
+ " type=com.google.protobuf.FieldType.$annotation_field_type$,\n"
+ " isRequired=$required$,\n"
+ " isEnforceUtf8=$enforce_utf8$)\n");
+ if (HasHazzer(descriptor_)) {
+ printer->Print(variables_,
+ "@com.google.protobuf.ProtoPresenceCheckedField(\n"
+ " presenceBitsId=$bit_field_id$,\n"
+ " mask=$bit_field_mask$)\n");
+ }
+ }
printer->Print(variables_, "private java.lang.String $name$_;\n");
PrintExtraFieldInfo(variables_, printer);
@@ -311,9 +346,9 @@
void ImmutableStringFieldLiteGenerator::GenerateKotlinDslMembers(
io::Printer* printer) const {
- WriteFieldDocComment(printer, descriptor_);
+ WriteFieldDocComment(printer, descriptor_, /* kdoc */ true);
printer->Print(variables_,
- "$kt_deprecation$var $kt_name$: kotlin.String\n"
+ "$kt_deprecation$public var $kt_name$: kotlin.String\n"
" @JvmName(\"${$get$kt_capitalized_name$$}$\")\n"
" get() = $kt_dsl_builder$.${$get$capitalized_name$$}$()\n"
" @JvmName(\"${$set$kt_capitalized_name$$}$\")\n"
@@ -322,17 +357,18 @@
" }\n");
WriteFieldAccessorDocComment(printer, descriptor_, CLEARER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(variables_,
- "fun ${$clear$kt_capitalized_name$$}$() {\n"
+ "public fun ${$clear$kt_capitalized_name$$}$() {\n"
" $kt_dsl_builder$.${$clear$capitalized_name$$}$()\n"
"}\n");
if (HasHazzer(descriptor_)) {
- WriteFieldAccessorDocComment(printer, descriptor_, HAZZER);
+ WriteFieldAccessorDocComment(printer, descriptor_, HAZZER,
+ /* builder */ false, /* kdoc */ true);
printer->Print(
variables_,
- "fun ${$has$kt_capitalized_name$$}$(): kotlin.Boolean {\n"
+ "public fun ${$has$kt_capitalized_name$$}$(): kotlin.Boolean {\n"
" return $kt_dsl_builder$.${$has$capitalized_name$$}$()\n"
"}\n");
}
@@ -519,10 +555,12 @@
RepeatedImmutableStringFieldLiteGenerator(const FieldDescriptor* descriptor,
int messageBitIndex,
Context* context)
- : descriptor_(descriptor), name_resolver_(context->GetNameResolver()) {
+ : descriptor_(descriptor),
+ name_resolver_(context->GetNameResolver()),
+ context_(context) {
SetPrimitiveVariables(descriptor, messageBitIndex, 0,
context->GetFieldGeneratorInfo(descriptor),
- name_resolver_, &variables_);
+ name_resolver_, &variables_, context);
}
RepeatedImmutableStringFieldLiteGenerator::
@@ -537,22 +575,34 @@
WriteFieldAccessorDocComment(printer, descriptor_, LIST_GETTER);
printer->Print(variables_,
"$deprecation$java.util.List<java.lang.String>\n"
- " get$capitalized_name$List();\n");
+ " ${$get$capitalized_name$List$}$();\n");
+ printer->Annotate("{", "}", descriptor_);
WriteFieldAccessorDocComment(printer, descriptor_, LIST_COUNT);
printer->Print(variables_,
- "$deprecation$int get$capitalized_name$Count();\n");
+ "$deprecation$int ${$get$capitalized_name$Count$}$();\n");
+ printer->Annotate("{", "}", descriptor_);
WriteFieldAccessorDocComment(printer, descriptor_, LIST_INDEXED_GETTER);
- printer->Print(
- variables_,
- "$deprecation$java.lang.String get$capitalized_name$(int index);\n");
+ printer->Print(variables_,
+ "$deprecation$java.lang.String "
+ "${$get$capitalized_name$$}$(int index);\n");
+ printer->Annotate("{", "}", descriptor_);
WriteFieldAccessorDocComment(printer, descriptor_, LIST_INDEXED_GETTER);
printer->Print(variables_,
"$deprecation$com.google.protobuf.ByteString\n"
- " get$capitalized_name$Bytes(int index);\n");
+ " ${$get$capitalized_name$Bytes$}$(int index);\n");
+ printer->Annotate("{", "}", descriptor_);
}
void RepeatedImmutableStringFieldLiteGenerator::GenerateMembers(
io::Printer* printer) const {
+ if (!context_->options().opensource_runtime) {
+ printer->Print(
+ variables_,
+ "@com.google.protobuf.ProtoField(\n"
+ " fieldNumber=$number$,\n"
+ " type=com.google.protobuf.FieldType.$annotation_field_type$,\n"
+ " isEnforceUtf8=$enforce_utf8$)\n");
+ }
printer->Print(
variables_,
"private com.google.protobuf.Internal.ProtobufList<java.lang.String> "
@@ -748,14 +798,15 @@
" */\n"
"@kotlin.OptIn"
"(com.google.protobuf.kotlin.OnlyForUseByGeneratedProtoCode::class)\n"
- "class ${$$kt_capitalized_name$Proxy$}$ private constructor()"
+ "public class ${$$kt_capitalized_name$Proxy$}$ private constructor()"
" : com.google.protobuf.kotlin.DslProxy()\n");
// property for List<String>
- WriteFieldAccessorDocComment(printer, descriptor_, LIST_GETTER);
+ WriteFieldAccessorDocComment(printer, descriptor_, LIST_GETTER,
+ /* builder */ false, /* kdoc */ true);
printer->Print(
variables_,
- "$kt_deprecation$ val $kt_name$: "
+ "$kt_deprecation$public val $kt_name$: "
"com.google.protobuf.kotlin.DslList"
"<kotlin.String, ${$$kt_capitalized_name$Proxy$}$>\n"
"@kotlin.OptIn"
@@ -766,11 +817,11 @@
// List<String>.add(String)
WriteFieldAccessorDocComment(printer, descriptor_, LIST_ADDER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"add$kt_capitalized_name$\")\n"
- "fun com.google.protobuf.kotlin.DslList"
+ "public fun com.google.protobuf.kotlin.DslList"
"<kotlin.String, ${$$kt_capitalized_name$Proxy$}$>."
"add(value: kotlin.String) {\n"
" $kt_dsl_builder$.${$add$capitalized_name$$}$(value)\n"
@@ -778,12 +829,12 @@
// List<String> += String
WriteFieldAccessorDocComment(printer, descriptor_, LIST_ADDER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"plusAssign$kt_capitalized_name$\")\n"
"@Suppress(\"NOTHING_TO_INLINE\")\n"
- "inline operator fun com.google.protobuf.kotlin.DslList"
+ "public inline operator fun com.google.protobuf.kotlin.DslList"
"<kotlin.String, ${$$kt_capitalized_name$Proxy$}$>."
"plusAssign(value: kotlin.String) {\n"
" add(value)\n"
@@ -791,12 +842,12 @@
// List<String>.addAll(Iterable<String>)
WriteFieldAccessorDocComment(printer, descriptor_, LIST_MULTI_ADDER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(
variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"addAll$kt_capitalized_name$\")\n"
- "fun com.google.protobuf.kotlin.DslList"
+ "public fun com.google.protobuf.kotlin.DslList"
"<kotlin.String, ${$$kt_capitalized_name$Proxy$}$>."
"addAll(values: kotlin.collections.Iterable<kotlin.String>) {\n"
" $kt_dsl_builder$.${$addAll$capitalized_name$$}$(values)\n"
@@ -804,13 +855,13 @@
// List<String> += Iterable<String>
WriteFieldAccessorDocComment(printer, descriptor_, LIST_MULTI_ADDER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(
variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"plusAssignAll$kt_capitalized_name$\")\n"
"@Suppress(\"NOTHING_TO_INLINE\")\n"
- "inline operator fun com.google.protobuf.kotlin.DslList"
+ "public inline operator fun com.google.protobuf.kotlin.DslList"
"<kotlin.String, ${$$kt_capitalized_name$Proxy$}$>."
"plusAssign(values: kotlin.collections.Iterable<kotlin.String>) {\n"
" addAll(values)\n"
@@ -818,23 +869,23 @@
// List<String>[Int] = String
WriteFieldAccessorDocComment(printer, descriptor_, LIST_INDEXED_SETTER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(
variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"set$kt_capitalized_name$\")\n"
- "operator fun com.google.protobuf.kotlin.DslList"
+ "public operator fun com.google.protobuf.kotlin.DslList"
"<kotlin.String, ${$$kt_capitalized_name$Proxy$}$>."
"set(index: kotlin.Int, value: kotlin.String) {\n"
" $kt_dsl_builder$.${$set$capitalized_name$$}$(index, value)\n"
"}");
WriteFieldAccessorDocComment(printer, descriptor_, CLEARER,
- /* builder */ false);
+ /* builder */ false, /* kdoc */ true);
printer->Print(variables_,
"@kotlin.jvm.JvmSynthetic\n"
"@kotlin.jvm.JvmName(\"clear$kt_capitalized_name$\")\n"
- "fun com.google.protobuf.kotlin.DslList"
+ "public fun com.google.protobuf.kotlin.DslList"
"<kotlin.String, ${$$kt_capitalized_name$Proxy$}$>."
"clear() {\n"
" $kt_dsl_builder$.${$clear$capitalized_name$$}$()\n"
diff --git a/src/google/protobuf/compiler/java/string_field_lite.h b/src/google/protobuf/compiler/java/string_field_lite.h
index b6ad1ea..f35da28 100644
--- a/src/google/protobuf/compiler/java/string_field_lite.h
+++ b/src/google/protobuf/compiler/java/string_field_lite.h
@@ -40,7 +40,7 @@
#include <map>
#include <string>
-#include <google/protobuf/compiler/java/field.h>
+#include "google/protobuf/compiler/java/field.h"
namespace google {
namespace protobuf {
@@ -63,6 +63,10 @@
explicit ImmutableStringFieldLiteGenerator(const FieldDescriptor* descriptor,
int messageBitIndex,
Context* context);
+ ImmutableStringFieldLiteGenerator(const ImmutableStringFieldLiteGenerator&) =
+ delete;
+ ImmutableStringFieldLiteGenerator& operator=(
+ const ImmutableStringFieldLiteGenerator&) = delete;
~ImmutableStringFieldLiteGenerator() override;
// implements ImmutableFieldLiteGenerator
@@ -83,9 +87,7 @@
std::map<std::string, std::string> variables_;
const int messageBitIndex_;
ClassNameResolver* name_resolver_;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableStringFieldLiteGenerator);
+ Context* context_;
};
class ImmutableStringOneofFieldLiteGenerator
@@ -93,6 +95,10 @@
public:
ImmutableStringOneofFieldLiteGenerator(const FieldDescriptor* descriptor,
int messageBitIndex, Context* context);
+ ImmutableStringOneofFieldLiteGenerator(
+ const ImmutableStringOneofFieldLiteGenerator&) = delete;
+ ImmutableStringOneofFieldLiteGenerator& operator=(
+ const ImmutableStringOneofFieldLiteGenerator&) = delete;
~ImmutableStringOneofFieldLiteGenerator() override;
private:
@@ -100,8 +106,6 @@
void GenerateBuilderMembers(io::Printer* printer) const override;
void GenerateFieldInfo(io::Printer* printer,
std::vector<uint16_t>* output) const override;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableStringOneofFieldLiteGenerator);
};
class RepeatedImmutableStringFieldLiteGenerator
@@ -109,6 +113,10 @@
public:
explicit RepeatedImmutableStringFieldLiteGenerator(
const FieldDescriptor* descriptor, int messageBitIndex, Context* context);
+ RepeatedImmutableStringFieldLiteGenerator(
+ const RepeatedImmutableStringFieldLiteGenerator&) = delete;
+ RepeatedImmutableStringFieldLiteGenerator& operator=(
+ const RepeatedImmutableStringFieldLiteGenerator&) = delete;
~RepeatedImmutableStringFieldLiteGenerator() override;
// implements ImmutableFieldLiteGenerator ------------------------------------
@@ -127,8 +135,7 @@
const FieldDescriptor* descriptor_;
std::map<std::string, std::string> variables_;
ClassNameResolver* name_resolver_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedImmutableStringFieldLiteGenerator);
+ Context* context_;
};
} // namespace java
diff --git a/src/google/protobuf/compiler/main.cc b/src/google/protobuf/compiler/main.cc
index 3960946..ecaf76b 100644
--- a/src/google/protobuf/compiler/main.cc
+++ b/src/google/protobuf/compiler/main.cc
@@ -28,19 +28,19 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/compiler/cpp/generator.h>
-#include <google/protobuf/compiler/java/generator.h>
-#include <google/protobuf/compiler/java/kotlin_generator.h>
-#include <google/protobuf/compiler/command_line_interface.h>
-#include <google/protobuf/compiler/csharp/csharp_generator.h>
-#include <google/protobuf/compiler/objectivec/objectivec_generator.h>
-#include <google/protobuf/compiler/php/php_generator.h>
-#include <google/protobuf/compiler/python/generator.h>
-#include <google/protobuf/compiler/python/pyi_generator.h>
-#include <google/protobuf/compiler/ruby/ruby_generator.h>
+#include "google/protobuf/compiler/cpp/generator.h"
+#include "google/protobuf/compiler/java/generator.h"
+#include "google/protobuf/compiler/java/kotlin_generator.h"
+#include "google/protobuf/compiler/command_line_interface.h"
+#include "google/protobuf/compiler/csharp/csharp_generator.h"
+#include "google/protobuf/compiler/objectivec/objectivec_generator.h"
+#include "google/protobuf/compiler/php/php_generator.h"
+#include "google/protobuf/compiler/python/generator.h"
+#include "google/protobuf/compiler/python/pyi_generator.h"
+#include "google/protobuf/compiler/ruby/ruby_generator.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -66,6 +66,10 @@
cli.RegisterGenerator("--java_out", "--java_opt", &java_generator,
"Generate Java source file.");
+#ifdef GOOGLE_PROTOBUF_RUNTIME_INCLUDE_BASE
+ java_generator.set_opensource_runtime(true);
+#endif
+
// Proto2 Kotlin
java::KotlinGenerator kt_generator;
cli.RegisterGenerator("--kotlin_out", "--kotlin_opt", &kt_generator,
@@ -76,6 +80,11 @@
python::Generator py_generator;
cli.RegisterGenerator("--python_out", "--python_opt", &py_generator,
"Generate Python source file.");
+
+#ifdef GOOGLE_PROTOBUF_RUNTIME_INCLUDE_BASE
+ py_generator.set_opensource_runtime(true);
+#endif
+
// Python pyi
python::PyiGenerator pyi_generator;
cli.RegisterGenerator("--pyi_out", &pyi_generator,
diff --git a/src/google/protobuf/compiler/mock_code_generator.cc b/src/google/protobuf/compiler/mock_code_generator.cc
index 4d04511..a4cc9e6 100644
--- a/src/google/protobuf/compiler/mock_code_generator.cc
+++ b/src/google/protobuf/compiler/mock_code_generator.cc
@@ -30,7 +30,7 @@
// Author: kenton@google.com (Kenton Varda)
-#include <google/protobuf/compiler/mock_code_generator.h>
+#include "google/protobuf/compiler/mock_code_generator.h"
#include <stdlib.h>
@@ -39,21 +39,23 @@
#include <memory>
#include <vector>
-#include <google/protobuf/stubs/strutil.h>
-
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/testing/file.h>
-#include <google/protobuf/testing/file.h>
-#include <google/protobuf/testing/file.h>
-#include <google/protobuf/compiler/plugin.pb.h>
-#include <google/protobuf/descriptor.pb.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/testing/file.h"
+#include "google/protobuf/testing/file.h"
+#include "google/protobuf/compiler/plugin.pb.h"
+#include "google/protobuf/descriptor.pb.h"
#include <gtest/gtest.h>
-#include <google/protobuf/stubs/substitute.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/text_format.h>
+#include "absl/strings/str_join.h"
+#include "absl/strings/str_replace.h"
+#include "absl/strings/str_split.h"
+#include "absl/strings/string_view.h"
+#include "absl/strings/strip.h"
+#include "absl/strings/substitute.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/io/zero_copy_stream.h"
+#include "google/protobuf/text_format.h"
#ifdef major
#undef major
@@ -74,7 +76,7 @@
for (size_t i = 0; i < all_files.size(); i++) {
names.push_back(all_files[i]->name());
}
- return Join(names, ",");
+ return absl::StrJoin(names, ",");
}
static const char* kFirstInsertionPointName = "first_mock_insertion_point";
@@ -109,7 +111,7 @@
&content, true));
std::vector<std::string> lines =
- Split(content, "\n", true);
+ absl::StrSplit(content, "\n", absl::SkipEmpty());
while (!lines.empty() && lines.back().empty()) {
lines.pop_back();
@@ -120,7 +122,7 @@
std::vector<std::string> insertion_list;
if (!insertions.empty()) {
- insertion_list = Split(insertions, ",", true);
+ insertion_list = absl::StrSplit(insertions, ",", absl::SkipEmpty());
}
EXPECT_EQ(lines.size(), 3 + insertion_list.size() * 2);
@@ -205,8 +207,8 @@
std::string* error) const {
bool annotate = false;
for (int i = 0; i < file->message_type_count(); i++) {
- if (HasPrefixString(file->message_type(i)->name(), "MockCodeGenerator_")) {
- std::string command = StripPrefixString(
+ if (absl::StartsWith(file->message_type(i)->name(), "MockCodeGenerator_")) {
+ absl::string_view command = absl::StripPrefix(
file->message_type(i)->name(), "MockCodeGenerator_");
if (command == "Error") {
*error = "Saw message type MockCodeGenerator_Error.";
@@ -249,12 +251,12 @@
}
}
- bool insert_endlines = HasPrefixString(parameter, "insert_endlines=");
- if (insert_endlines || HasPrefixString(parameter, "insert=")) {
- std::vector<std::string> insert_into = Split(
- StripPrefixString(
- parameter, insert_endlines ? "insert_endlines=" : "insert="),
- ",", true);
+ bool insert_endlines = absl::StartsWith(parameter, "insert_endlines=");
+ if (insert_endlines || absl::StartsWith(parameter, "insert=")) {
+ std::vector<std::string> insert_into = absl::StrSplit(
+ absl::StripPrefix(parameter,
+ insert_endlines ? "insert_endlines=" : "insert="),
+ ',', absl::SkipEmpty());
for (size_t i = 0; i < insert_into.size(); i++) {
{
@@ -262,7 +264,7 @@
std::string content =
GetOutputFileContent(name_, "first_insert", file, context);
if (insert_endlines) {
- GlobalReplaceSubstring(",", ",\n", &content);
+ absl::StrReplaceAll({{",", ",\n"}}, &content);
}
if (annotate) {
auto* annotation = info.add_annotation();
@@ -287,7 +289,7 @@
std::string content =
GetOutputFileContent(name_, "second_insert", file, context);
if (insert_endlines) {
- GlobalReplaceSubstring(",", ",\n", &content);
+ absl::StrReplaceAll({{",", ",\n"}}, &content);
}
if (annotate) {
auto* annotation = info.add_annotation();
@@ -375,7 +377,7 @@
const std::string& generator_name, const std::string& parameter,
const std::string& file, const std::string& parsed_file_list,
const std::string& first_message_name) {
- return strings::Substitute("$0: $1, $2, $3, $4\n", generator_name, parameter,
+ return absl::Substitute("$0: $1, $2, $3, $4\n", generator_name, parameter,
file, first_message_name, parsed_file_list);
}
diff --git a/src/google/protobuf/compiler/mock_code_generator.h b/src/google/protobuf/compiler/mock_code_generator.h
index 45d735a..f91b7bc 100644
--- a/src/google/protobuf/compiler/mock_code_generator.h
+++ b/src/google/protobuf/compiler/mock_code_generator.h
@@ -36,7 +36,7 @@
#include <cstdint>
#include <string>
-#include <google/protobuf/compiler/code_generator.h>
+#include "google/protobuf/compiler/code_generator.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/compiler/objectivec/BUILD.bazel b/src/google/protobuf/compiler/objectivec/BUILD.bazel
new file mode 100644
index 0000000..248e2ab
--- /dev/null
+++ b/src/google/protobuf/compiler/objectivec/BUILD.bazel
@@ -0,0 +1,111 @@
+################################################################################
+# Protocol Buffers Compiler - ObjC code generator
+################################################################################
+
+load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test")
+load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
+load("//build_defs:cpp_opts.bzl", "COPTS")
+
+cc_library(
+ name = "names",
+ hdrs = ["names.h"],
+ copts = COPTS,
+ include_prefix = "google/protobuf/compiler/objectivec",
+ visibility = ["//visibility:public"],
+ deps = [
+ ":names_internal",
+ ],
+)
+
+cc_library(
+ name = "names_internal",
+ hdrs = [
+ "names.h",
+ "objectivec_nsobject_methods.h",
+ ],
+ srcs = [
+ "names.cc",
+ ],
+ copts = COPTS,
+ include_prefix = "google/protobuf/compiler/objectivec",
+ visibility = ["//pkg:__pkg__"],
+ deps = [
+ "//src/google/protobuf/compiler:code_generator",
+ "//src/google/protobuf:protobuf_nowkt",
+ ],
+)
+
+cc_library(
+ name = "objectivec",
+ srcs = [
+ "objectivec_enum.cc",
+ "objectivec_enum_field.cc",
+ "objectivec_extension.cc",
+ "objectivec_field.cc",
+ "objectivec_file.cc",
+ "objectivec_generator.cc",
+ "objectivec_map_field.cc",
+ "objectivec_message.cc",
+ "objectivec_message_field.cc",
+ "objectivec_oneof.cc",
+ "objectivec_primitive_field.cc",
+ ],
+ hdrs = [
+ "objectivec_enum.h",
+ "objectivec_enum_field.h",
+ "objectivec_extension.h",
+ "objectivec_field.h",
+ "objectivec_file.h",
+ "objectivec_generator.h",
+ "objectivec_helpers.h",
+ "objectivec_map_field.h",
+ "objectivec_message.h",
+ "objectivec_message_field.h",
+ "objectivec_oneof.h",
+ "objectivec_options.h",
+ "objectivec_primitive_field.h",
+ ],
+ copts = COPTS,
+ include_prefix = "google/protobuf/compiler/objectivec",
+ visibility = [
+ "//pkg:__pkg__",
+ "//src/google/protobuf/compiler:__pkg__",
+ ],
+ deps = [
+ ":names",
+ "//src/google/protobuf:protobuf_nowkt",
+ "//src/google/protobuf/compiler:code_generator",
+ "@com_google_absl//absl/strings",
+ ],
+)
+
+cc_test(
+ name = "helpers_unittest",
+ srcs = ["objectivec_helpers_unittest.cc"],
+ deps = [
+ ":objectivec",
+ "//src/google/protobuf/io",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+################################################################################
+# Distribution packaging
+################################################################################
+
+pkg_files(
+ name = "dist_files",
+ srcs = glob(["**/*"]),
+ strip_prefix = strip_prefix.from_root(""),
+ visibility = ["//src:__pkg__"],
+)
+
+filegroup(
+ name = "test_srcs",
+ srcs = glob([
+ "*_test.cc",
+ "*unittest.cc",
+ ]),
+ visibility = ["//src/google/protobuf/compiler:__pkg__"],
+)
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_helpers.cc b/src/google/protobuf/compiler/objectivec/names.cc
similarity index 86%
rename from src/google/protobuf/compiler/objectivec/objectivec_helpers.cc
rename to src/google/protobuf/compiler/objectivec/names.cc
index b15f580..5ae447f 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_helpers.cc
+++ b/src/google/protobuf/compiler/objectivec/names.cc
@@ -31,27 +31,33 @@
#ifndef _MSC_VER
#include <unistd.h>
#endif
-#include <climits>
#include <errno.h>
#include <fcntl.h>
+#include <stdlib.h>
+
+#include <climits>
#include <fstream>
#include <iostream>
#include <sstream>
-#include <stdlib.h>
#include <unordered_set>
#include <vector>
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/compiler/objectivec/objectivec_helpers.h>
-#include <google/protobuf/compiler/objectivec/objectivec_nsobject_methods.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/io/io_win32.h>
-#include <google/protobuf/port.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/strutil.h>
+#include "google/protobuf/compiler/code_generator.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "absl/strings/ascii.h"
+#include "absl/strings/escaping.h"
+#include "absl/strings/str_replace.h"
+#include "absl/strings/str_split.h"
+#include "absl/strings/strip.h"
+#include "google/protobuf/compiler/objectivec/names.h"
+#include "google/protobuf/compiler/objectivec/objectivec_nsobject_methods.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/io/io_win32.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/io/zero_copy_stream_impl.h"
+#include "google/protobuf/port.h"
+#include "google/protobuf/stubs/common.h"
// NOTE: src/google/protobuf/compiler/plugin.cc makes use of cerr for some
// error cases, so it seems to be ok to use as a back door for errors.
@@ -65,28 +71,28 @@
// in this port namespace to avoid ambiguous definition.
namespace posix {
#ifdef _WIN32
-using ::google::protobuf::io::win32::open;
-#else
+using google::protobuf::io::win32::open;
+#else // !_WIN32
using ::open;
-#endif
-} // namespace port
+#endif // _WIN32
+} // namespace posix
namespace {
bool BoolFromEnvVar(const char* env_var, bool default_value) {
const char* value = getenv(env_var);
if (value) {
- return std::string("YES") == ToUpper(value);
+ return std::string("YES") == absl::AsciiStrToUpper(value);
}
return default_value;
}
class SimpleLineCollector : public LineConsumer {
public:
- SimpleLineCollector(std::unordered_set<std::string>* inout_set)
+ explicit SimpleLineCollector(std::unordered_set<std::string>* inout_set)
: set_(inout_set) {}
- virtual bool ConsumeLine(const StringPiece& line, std::string* out_error) override {
+ virtual bool ConsumeLine(const absl::string_view& line, std::string* out_error) override {
set_->insert(std::string(line));
return true;
}
@@ -101,7 +107,7 @@
std::map<std::string, std::string>* inout_package_to_prefix_map)
: usage_(usage), prefix_map_(inout_package_to_prefix_map) {}
- virtual bool ConsumeLine(const StringPiece& line, std::string* out_error) override;
+ virtual bool ConsumeLine(const absl::string_view& line, std::string* out_error) override;
private:
const std::string usage_;
@@ -112,7 +118,7 @@
public:
PrefixModeStorage();
- const std::string package_to_prefix_mappings_path() const { return package_to_prefix_mappings_path_; }
+ std::string package_to_prefix_mappings_path() const { return package_to_prefix_mappings_path_; }
void set_package_to_prefix_mappings_path(const std::string& path) {
package_to_prefix_mappings_path_ = path;
package_to_prefix_map_.clear();
@@ -123,7 +129,7 @@
bool use_package_name() const { return use_package_name_; }
void set_use_package_name(bool on_or_off) { use_package_name_ = on_or_off; }
- const std::string exception_path() const { return exception_path_; }
+ std::string exception_path() const { return exception_path_; }
void set_exception_path(const std::string& path) {
exception_path_ = path;
exceptions_.clear();
@@ -134,6 +140,7 @@
// When using a proto package as the prefix, this should be added as the
// prefix in front of it.
const std::string& forced_package_prefix() const { return forced_prefix_; }
+ void set_forced_package_prefix(const std::string& prefix) { forced_prefix_ = prefix; }
private:
bool use_package_name_;
@@ -155,8 +162,6 @@
exception_path_ = exception_path;
}
- // This one is a not expected to be common, so it doesn't get a generation
- // option, just the env var.
const char* prefix = getenv("GPB_OBJC_USE_PACKAGE_AS_PREFIX_PREFIX");
if (prefix) {
forced_prefix_ = prefix;
@@ -196,7 +201,7 @@
if (prefix_lookup != package_to_prefix_map_.end()) {
return prefix_lookup->second;
- }
+ }
return "";
}
@@ -254,6 +259,14 @@
g_prefix_mode.set_exception_path(file_path);
}
+std::string GetForcedPackagePrefix() {
+ return g_prefix_mode.forced_package_prefix();
+}
+
+void SetForcedPackagePrefix(const std::string& prefix) {
+ g_prefix_mode.set_forced_package_prefix(prefix);
+}
+
Options::Options() {
// While there are generator options, also support env variables to help with
// build systems where it isn't as easy to hook in for add the generation
@@ -265,7 +278,7 @@
const char* suppressions = getenv("GPB_OBJC_EXPECTED_PACKAGE_PREFIXES_SUPPRESSIONS");
if (suppressions) {
expected_prefixes_suppressions =
- Split(suppressions, ";", true);
+ absl::StrSplit(suppressions, ";", absl::SkipEmpty());
}
prefixes_must_be_registered =
BoolFromEnvVar("GPB_OBJC_PREFIXES_MUST_BE_REGISTERED", false);
@@ -286,7 +299,7 @@
const char* const kUpperSegmentsList[] = {"url", "http", "https"};
std::unordered_set<std::string> kUpperSegments =
- MakeWordsMap(kUpperSegmentsList, GOOGLE_ARRAYSIZE(kUpperSegmentsList));
+ MakeWordsMap(kUpperSegmentsList, ABSL_ARRAYSIZE(kUpperSegmentsList));
bool ascii_isnewline(char c) {
return c == '\n' || c == '\r';
@@ -305,7 +318,7 @@
bool last_char_was_upper = false;
for (int i = 0; i < input.size(); i++) {
char c = input[i];
- if (ascii_isdigit(c)) {
+ if (absl::ascii_isdigit(c)) {
if (!last_char_was_number) {
values.push_back(current);
current = "";
@@ -313,7 +326,7 @@
current += c;
last_char_was_number = last_char_was_lower = last_char_was_upper = false;
last_char_was_number = true;
- } else if (ascii_islower(c)) {
+ } else if (absl::ascii_islower(c)) {
// lowercase letter can follow a lowercase or uppercase letter
if (!last_char_was_lower && !last_char_was_upper) {
values.push_back(current);
@@ -322,12 +335,12 @@
current += c; // already lower
last_char_was_number = last_char_was_lower = last_char_was_upper = false;
last_char_was_lower = true;
- } else if (ascii_isupper(c)) {
+ } else if (absl::ascii_isupper(c)) {
if (!last_char_was_upper) {
values.push_back(current);
current = "";
}
- current += ascii_tolower(c);
+ current += absl::ascii_tolower(c);
last_char_was_number = last_char_was_lower = last_char_was_upper = false;
last_char_was_upper = true;
} else {
@@ -347,7 +360,7 @@
}
for (int j = 0; j < value.length(); j++) {
if (j == 0 || all_upper) {
- value[j] = ascii_toupper(value[j]);
+ value[j] = absl::ascii_toupper(value[j]);
} else {
// Nothing, already in lower.
}
@@ -357,7 +370,7 @@
if ((result.length() != 0) &&
!first_capitalized &&
!first_segment_forces_upper) {
- result[0] = ascii_tolower(result[0]);
+ result[0] = absl::ascii_tolower(result[0]);
}
return result;
}
@@ -446,17 +459,17 @@
const std::string& extension,
std::string* out_suffix_added) {
static const std::unordered_set<std::string> kReservedWords =
- MakeWordsMap(kReservedWordList, GOOGLE_ARRAYSIZE(kReservedWordList));
+ MakeWordsMap(kReservedWordList, ABSL_ARRAYSIZE(kReservedWordList));
static const std::unordered_set<std::string> kNSObjectMethods =
- MakeWordsMap(kNSObjectMethodsList, GOOGLE_ARRAYSIZE(kNSObjectMethodsList));
+ MakeWordsMap(kNSObjectMethodsList, ABSL_ARRAYSIZE(kNSObjectMethodsList));
std::string sanitized;
// We add the prefix in the cases where the string is missing a prefix.
// We define "missing a prefix" as where 'input':
// a) Doesn't start with the prefix or
// b) Isn't equivalent to the prefix or
// c) Has the prefix, but the letter after the prefix is lowercase
- if (HasPrefixString(input, prefix)) {
- if (input.length() == prefix.length() || !ascii_isupper(input[prefix.length()])) {
+ if (absl::StartsWith(input, prefix)) {
+ if (input.length() == prefix.length() || !absl::ascii_isupper(input[prefix.length()])) {
sanitized = prefix + input;
} else {
sanitized = input;
@@ -502,16 +515,17 @@
}
}
-bool IsSpecialName(const std::string& name, const std::string* special_names,
- size_t count) {
+bool IsSpecialNamePrefix(const std::string& name,
+ const std::string* special_names,
+ size_t count) {
for (size_t i = 0; i < count; ++i) {
- size_t length = special_names[i].length();
+ const size_t length = special_names[i].length();
if (name.compare(0, length, special_names[i]) == 0) {
if (name.length() > length) {
- // If name is longer than the retained_name[i] that it matches
+ // If name is longer than the special_names[i] that it matches
// the next character must be not lower case (newton vs newTon vs
// new_ton).
- return !ascii_islower(name[length]);
+ return !absl::ascii_islower(name[length]);
} else {
return true;
}
@@ -548,7 +562,7 @@
}
}
-void MaybeUnQuote(StringPiece* input) {
+void MaybeUnQuote(absl::string_view* input) {
if ((input->length() >= 2) &&
((*input->data() == '\'' || *input->data() == '"')) &&
((*input)[input->length() - 1] == *input->data())) {
@@ -560,15 +574,15 @@
} // namespace
// Escape C++ trigraphs by escaping question marks to \?
-std::string EscapeTrigraphs(const std::string& to_escape) {
- return StringReplace(to_escape, "?", "\\?", true);
+std::string EscapeTrigraphs(absl::string_view to_escape) {
+ return absl::StrReplaceAll(to_escape, {{"?", "\\?"}});
}
-void TrimWhitespace(StringPiece* input) {
- while (!input->empty() && ascii_isspace(*input->data())) {
+void TrimWhitespace(absl::string_view* input) {
+ while (!input->empty() && absl::ascii_isspace(*input->data())) {
input->remove_prefix(1);
}
- while (!input->empty() && ascii_isspace((*input)[input->length() - 1])) {
+ while (!input->empty() && absl::ascii_isspace((*input)[input->length() - 1])) {
input->remove_suffix(1);
}
}
@@ -578,14 +592,46 @@
// http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html
static const std::string retained_names[] = {"new", "alloc", "copy",
"mutableCopy"};
- return IsSpecialName(name, retained_names,
- sizeof(retained_names) / sizeof(retained_names[0]));
+ return IsSpecialNamePrefix(name, retained_names,
+ sizeof(retained_names) / sizeof(retained_names[0]));
}
bool IsInitName(const std::string& name) {
static const std::string init_names[] = {"init"};
- return IsSpecialName(name, init_names,
- sizeof(init_names) / sizeof(init_names[0]));
+ return IsSpecialNamePrefix(name, init_names,
+ sizeof(init_names) / sizeof(init_names[0]));
+}
+
+bool IsCreateName(const std::string& name) {
+ // List of segments from
+ // https://developer.apple.com/library/archive/documentation/CoreFoundation/Conceptual/CFMemoryMgmt/Concepts/Ownership.html#//apple_ref/doc/uid/20001148-103029
+ static const std::string create_names[] = {"Create", "Copy"};
+ const size_t count = sizeof(create_names) / sizeof(create_names[0]);
+
+ for (size_t i = 0; i < count; ++i) {
+ const size_t length = create_names[i].length();
+ size_t pos = name.find(create_names[i]);
+ if (pos != std::string::npos) {
+ // The above docs don't actually call out anything about the characters
+ // before the special words. So it's not clear if something like
+ // "FOOCreate" would or would not match the "The Create Rule", but by not
+ // checking, and claiming it does match, then callers will annotate with
+ // `cf_returns_not_retained` which will ensure things work as desired.
+ //
+ // The footnote here is the docs do have a passing reference to "NoCopy",
+ // but again, not looking for that and just returning `true` will cause
+ // callers to annotate the api as not being a Create Rule function.
+
+ // If name is longer than the create_names[i] that it matches the next
+ // character must be not lower case (Copyright vs CopyFoo vs Copy_Foo).
+ if (name.length() > pos + length) {
+ return !absl::ascii_islower(name[pos + length]);
+ } else {
+ return true;
+ }
+ }
+ }
+ return false;
}
std::string BaseFileName(const FileDescriptor* file) {
@@ -620,7 +666,7 @@
// camelcase each one and then join them with underscores, and add an
// underscore at the end.
std::string result;
- const std::vector<std::string> segments = Split(file->package(), ".", true);
+ const std::vector<std::string> segments = absl::StrSplit(file->package(), ".", absl::SkipEmpty());
for (const auto& segment : segments) {
const std::string part = UnderscoresToCamelCase(segment, true);
if (part.empty()) {
@@ -753,17 +799,17 @@
const std::string class_name = EnumName(descriptor->type());
const std::string long_name_prefix = class_name + "_";
const std::string long_name = EnumValueName(descriptor);
- return StripPrefixString(long_name, long_name_prefix);
+ return std::string(absl::StripPrefix(long_name, long_name_prefix));
}
std::string UnCamelCaseEnumShortName(const std::string& name) {
std::string result;
for (int i = 0; i < name.size(); i++) {
char c = name[i];
- if (i > 0 && ascii_isupper(c)) {
+ if (i > 0 && absl::ascii_isupper(c)) {
result += '_';
}
- result += ascii_toupper(c);
+ result += absl::ascii_toupper(c);
}
return result;
}
@@ -782,7 +828,7 @@
result += "Array";
} else {
// If it wasn't repeated, but ends in "Array", force on the _p suffix.
- if (HasSuffixString(result, "Array")) {
+ if (absl::EndsWith(result, "Array")) {
result += "_p";
}
}
@@ -794,7 +840,7 @@
// name.
std::string result = FieldName(field);
if (result.length() > 0) {
- result[0] = ascii_toupper(result[0]);
+ result[0] = absl::ascii_toupper(result[0]);
}
return result;
}
@@ -818,7 +864,7 @@
// Use the common handling and then up-case the first letter.
std::string result = OneofName(descriptor);
if (result.length() > 0) {
- result[0] = ascii_toupper(result[0]);
+ result[0] = absl::ascii_toupper(result[0]);
}
return result;
}
@@ -832,29 +878,31 @@
}
std::string UnCamelCaseFieldName(const std::string& name, const FieldDescriptor* field) {
- std::string worker(name);
- if (HasSuffixString(worker, "_p")) {
- worker = StripSuffixString(worker, "_p");
+ absl::string_view worker(name);
+ if (absl::EndsWith(worker, "_p")) {
+ worker = absl::StripSuffix(worker, "_p");
}
- if (field->is_repeated() && HasSuffixString(worker, "Array")) {
- worker = StripSuffixString(worker, "Array");
+ if (field->is_repeated() && absl::EndsWith(worker, "Array")) {
+ worker = absl::StripSuffix(worker, "Array");
}
if (field->type() == FieldDescriptor::TYPE_GROUP) {
if (worker.length() > 0) {
- if (ascii_islower(worker[0])) {
- worker[0] = ascii_toupper(worker[0]);
+ if (absl::ascii_islower(worker[0])) {
+ std::string copy(worker);
+ copy[0] = absl::ascii_toupper(worker[0]);
+ return copy;
}
}
- return worker;
+ return std::string(worker);
} else {
std::string result;
for (int i = 0; i < worker.size(); i++) {
char c = worker[i];
- if (ascii_isupper(c)) {
+ if (absl::ascii_isupper(c)) {
if (i > 0) {
result += '_';
}
- result += ascii_tolower(c);
+ result += absl::ascii_tolower(c);
} else {
result += c;
}
@@ -990,9 +1038,9 @@
return "-INFINITY";
} else {
// float strings with ., e or E need to have f appended
- if (add_float_suffix && (val.find(".") != std::string::npos ||
- val.find("e") != std::string::npos ||
- val.find("E") != std::string::npos)) {
+ if (add_float_suffix && (val.find('.') != std::string::npos ||
+ val.find('e') != std::string::npos ||
+ val.find('E') != std::string::npos)) {
val += "f";
}
return val;
@@ -1053,17 +1101,17 @@
if (field->default_value_int32() == INT_MIN) {
return "-0x80000000";
}
- return StrCat(field->default_value_int32());
+ return absl::StrCat(field->default_value_int32());
case FieldDescriptor::CPPTYPE_UINT32:
- return StrCat(field->default_value_uint32()) + "U";
+ return absl::StrCat(field->default_value_uint32()) + "U";
case FieldDescriptor::CPPTYPE_INT64:
// gcc and llvm reject the decimal form of kint32min and kint64min.
if (field->default_value_int64() == LLONG_MIN) {
return "-0x8000000000000000LL";
}
- return StrCat(field->default_value_int64()) + "LL";
+ return absl::StrCat(field->default_value_int64()) + "LL";
case FieldDescriptor::CPPTYPE_UINT64:
- return StrCat(field->default_value_uint64()) + "ULL";
+ return absl::StrCat(field->default_value_uint64()) + "ULL";
case FieldDescriptor::CPPTYPE_DOUBLE:
return HandleExtremeFloatingPoint(
SimpleDtoa(field->default_value_double()), false);
@@ -1093,9 +1141,9 @@
uint32_t length = ghtonl(default_string.length());
std::string bytes((const char*)&length, sizeof(length));
bytes.append(default_string);
- return "(NSData*)\"" + EscapeTrigraphs(CEscape(bytes)) + "\"";
+ return "(NSData*)\"" + EscapeTrigraphs(absl::CEscape(bytes)) + "\"";
} else {
- return "@\"" + EscapeTrigraphs(CEscape(default_string)) + "\"";
+ return "@\"" + EscapeTrigraphs(absl::CEscape(default_string)) + "\"";
}
}
case FieldDescriptor::CPPTYPE_ENUM:
@@ -1179,7 +1227,7 @@
? location.trailing_comments
: location.leading_comments;
std::vector<std::string> lines;
- lines = Split(comments, "\n", false);
+ lines = absl::StrSplit(comments, "\n", absl::AllowEmpty());
while (!lines.empty() && lines.back().empty()) {
lines.pop_back();
}
@@ -1206,18 +1254,19 @@
add_leading_space = true;
}
- for (int i = 0; i < lines.size(); i++) {
- std::string line = StripPrefixString(lines[i], " ");
- // HeaderDoc and appledoc use '\' and '@' for markers; escape them.
- line = StringReplace(line, "\\", "\\\\", true);
- line = StringReplace(line, "@", "\\@", true);
- // Decouple / from * to not have inline comments inside comments.
- line = StringReplace(line, "/*", "/\\*", true);
- line = StringReplace(line, "*/", "*\\/", true);
+ for (size_t i = 0; i < lines.size(); i++) {
+ std::string line = absl::StrReplaceAll(
+ absl::StripPrefix(lines[i], " "),
+ {// HeaderDoc and appledoc use '\' and '@' for markers; escape them.
+ {"\\", "\\\\"},
+ {"@", "\\@"},
+ // Decouple / from * to not have inline comments inside comments.
+ {"/*", "/\\*"},
+ {"*/", "*\\/"}});
line = prefix + line;
- StripWhitespace(&line);
+ absl::StripAsciiWhitespace(&line);
// If not a one line, need to add the first space before *, as
- // StripWhitespace would have removed it.
+ // absl::StripAsciiWhitespace would have removed it.
line = (add_leading_space ? " " : "") + line;
final_comments += line + suffix;
}
@@ -1234,7 +1283,7 @@
std::string ProtobufFrameworkImportSymbol(const std::string& framework_name) {
// GPB_USE_[framework_name]_FRAMEWORK_IMPORTS
std::string result = std::string("GPB_USE_");
- result += ToUpper(framework_name);
+ result += absl::AsciiStrToUpper(framework_name);
result += "_FRAMEWORK_IMPORTS";
return result;
}
@@ -1259,21 +1308,21 @@
return false;
}
-bool ReadLine(StringPiece* input, StringPiece* line) {
+bool ReadLine(absl::string_view* input, absl::string_view* line) {
for (int len = 0; len < input->size(); ++len) {
if (ascii_isnewline((*input)[len])) {
- *line = StringPiece(input->data(), len);
+ *line = absl::string_view(input->data(), len);
++len; // advance over the newline
- *input = StringPiece(input->data() + len, input->size() - len);
+ *input = absl::string_view(input->data() + len, input->size() - len);
return true;
}
}
return false; // Ran out of input with no newline.
}
-void RemoveComment(StringPiece* input) {
+void RemoveComment(absl::string_view* input) {
int offset = input->find('#');
- if (offset != StringPiece::npos) {
+ if (offset != absl::string_view::npos) {
input->remove_suffix(input->length() - offset);
}
}
@@ -1281,14 +1330,14 @@
namespace {
bool PackageToPrefixesCollector::ConsumeLine(
- const StringPiece& line, std::string* out_error) {
+ const absl::string_view& line, std::string* out_error) {
int offset = line.find('=');
- if (offset == StringPiece::npos) {
- *out_error = usage_ + " file line without equal sign: '" + StrCat(line) + "'.";
+ if (offset == absl::string_view::npos) {
+ *out_error = usage_ + " file line without equal sign: '" + absl::StrCat(line) + "'.";
return false;
}
- StringPiece package = line.substr(0, offset);
- StringPiece prefix = line.substr(offset + 1);
+ absl::string_view package = line.substr(0, offset);
+ absl::string_view prefix = line.substr(offset + 1);
TrimWhitespace(&package);
TrimWhitespace(&prefix);
MaybeUnQuote(&prefix);
@@ -1380,7 +1429,7 @@
other_package_for_prefix = i->first;
// Stop on the first real package listing, if it was a no_package file
// specific entry, keep looking to try and find a package one.
- if (!HasPrefixString(other_package_for_prefix, no_package_prefix)) {
+ if (!absl::StartsWith(other_package_for_prefix, no_package_prefix)) {
break;
}
}
@@ -1393,16 +1442,19 @@
*out_error =
"error: Found 'option objc_class_prefix = \"" + prefix +
"\";' in '" + file->name() + "'; that prefix is already used for ";
- if (HasPrefixString(other_package_for_prefix, no_package_prefix)) {
- *out_error += "file '" +
- StripPrefixString(other_package_for_prefix, no_package_prefix) +
- "'.";
+ if (absl::StartsWith(other_package_for_prefix, no_package_prefix)) {
+ absl::StrAppend(
+ out_error, "file '",
+ absl::StripPrefix(other_package_for_prefix, no_package_prefix),
+ "'.");
} else {
- *out_error += "'package " + other_package_for_prefix + ";'.";
+ absl::StrAppend(out_error, "'package ",
+ other_package_for_prefix + ";'.");
}
- *out_error +=
- " It can only be reused by adding '" + lookup_key + " = " + prefix +
- "' to the expected prefixes file (" + expected_prefixes_path + ").";
+ absl::StrAppend(out_error, " It can only be reused by adding '",
+ lookup_key, " = ", prefix,
+ "' to the expected prefixes file (",
+ expected_prefixes_path, ").");
return false; // Only report first usage of the prefix.
}
} // !prefix.empty() && have_expected_prefix_file
@@ -1410,7 +1462,7 @@
// Check: Warning - Make sure the prefix is is a reasonable value according
// to Apple's rules (the checks above implicitly whitelist anything that
// doesn't meet these rules).
- if (!prefix.empty() && !ascii_isupper(prefix[0])) {
+ if (!prefix.empty() && !absl::ascii_isupper(prefix[0])) {
std::cerr
<< "protoc:0: warning: Invalid 'option objc_class_prefix = \""
<< prefix << "\";' in '" << file->name() << "';"
@@ -1573,7 +1625,7 @@
void AddChar(const char desired) {
++segment_len_;
- is_all_upper_ &= ascii_isupper(desired);
+ is_all_upper_ &= absl::ascii_isupper(desired);
}
void Push() {
@@ -1588,9 +1640,9 @@
bool AddFirst(const char desired, const char input) {
if (desired == input) {
op_ = kOpAsIs;
- } else if (desired == ascii_toupper(input)) {
+ } else if (desired == absl::ascii_toupper(input)) {
op_ = kOpFirstUpper;
- } else if (desired == ascii_tolower(input)) {
+ } else if (desired == absl::ascii_tolower(input)) {
op_ = kOpFirstLower;
} else {
// Can't be transformed to match.
@@ -1628,7 +1680,7 @@
if (desired == input) {
// If we aren't transforming it, or we're upper casing it and it is
// supposed to be uppercase; just add it to the segment.
- if ((op_ != kOpAllUpper) || ascii_isupper(desired)) {
+ if ((op_ != kOpAllUpper) || absl::ascii_isupper(desired)) {
AddChar(desired);
return true;
}
@@ -1640,7 +1692,7 @@
// If we need to uppercase, and everything so far has been uppercase,
// promote op to AllUpper.
- if ((desired == ascii_toupper(input)) && is_all_upper_) {
+ if ((desired == absl::ascii_toupper(input)) && is_all_upper_) {
op_ = kOpAllUpper;
AddChar(desired);
return true;
@@ -1676,8 +1728,8 @@
if ((input_for_decode.find('\0') != std::string::npos) ||
(desired_output.find('\0') != std::string::npos)) {
std::cerr << "error: got a null char in a string for making TextFormat data,"
- << " input: \"" << CEscape(input_for_decode) << "\", desired: \""
- << CEscape(desired_output) << "\"." << std::endl;
+ << " input: \"" << absl::CEscape(input_for_decode) << "\", desired: \""
+ << absl::CEscape(desired_output) << "\"." << std::endl;
std::cerr.flush();
abort();
}
@@ -1723,7 +1775,7 @@
// Feeds in some input, parse what it can, returning success/failure. Calling
// again after an error is undefined.
- bool ParseChunk(StringPiece chunk, std::string* out_error);
+ bool ParseChunk(absl::string_view chunk, std::string* out_error);
// Should be called to finish parsing (after all input has been provided via
// successful calls to ParseChunk(), calling after a ParseChunk() failure is
@@ -1738,16 +1790,16 @@
std::string leftover_;
};
-bool Parser::ParseChunk(StringPiece chunk, std::string* out_error) {
- StringPiece full_chunk;
+bool Parser::ParseChunk(absl::string_view chunk, std::string* out_error) {
+ absl::string_view full_chunk;
if (!leftover_.empty()) {
leftover_ += std::string(chunk);
- full_chunk = StringPiece(leftover_);
+ full_chunk = absl::string_view(leftover_);
} else {
full_chunk = chunk;
}
- StringPiece line;
+ absl::string_view line;
while (ReadLine(&full_chunk, &line)) {
++line_;
RemoveComment(&line);
@@ -1783,7 +1835,7 @@
}
std::string FullErrorString(const std::string& name, int line_num, const std::string& msg) {
- return std::string("error: ") + name + " Line " + StrCat(line_num) + ", " + msg;
+ return std::string("error: ") + name + " Line " + absl::StrCat(line_num) + ", " + msg;
}
} // namespace
@@ -1822,7 +1874,7 @@
continue;
}
- if (!parser.ParseChunk(StringPiece(static_cast<const char*>(buf), buf_len),
+ if (!parser.ParseChunk(absl::string_view(static_cast<const char*>(buf), buf_len),
&local_error)) {
*out_error = FullErrorString(stream_name, parser.last_line(), local_error);
return false;
@@ -1989,26 +2041,26 @@
}
bool ImportWriter::ProtoFrameworkCollector::ConsumeLine(
- const StringPiece& line, std::string* out_error) {
+ const absl::string_view& line, std::string* out_error) {
int offset = line.find(':');
- if (offset == StringPiece::npos) {
+ if (offset == absl::string_view::npos) {
*out_error =
std::string("Framework/proto file mapping line without colon sign: '") +
std::string(line) + "'.";
return false;
}
- StringPiece framework_name = line.substr(0, offset);
- StringPiece proto_file_list = line.substr(offset + 1);
+ absl::string_view framework_name = line.substr(0, offset);
+ absl::string_view proto_file_list = line.substr(offset + 1);
TrimWhitespace(&framework_name);
int start = 0;
while (start < proto_file_list.length()) {
offset = proto_file_list.find(',', start);
- if (offset == StringPiece::npos) {
+ if (offset == absl::string_view::npos) {
offset = proto_file_list.length();
}
- StringPiece proto_file = proto_file_list.substr(start, offset - start);
+ absl::string_view proto_file = proto_file_list.substr(start, offset - start);
TrimWhitespace(&proto_file);
if (!proto_file.empty()) {
std::map<std::string, std::string>::iterator existing_entry =
@@ -2021,7 +2073,7 @@
std::cerr.flush();
}
- if (proto_file.find(' ') != StringPiece::npos) {
+ if (proto_file.find(' ') != absl::string_view::npos) {
std::cerr << "note: framework mapping file had a proto file with a "
"space in, hopefully that isn't a missing comma: '"
<< std::string(proto_file) << "'" << std::endl;
diff --git a/src/google/protobuf/compiler/objectivec/names.h b/src/google/protobuf/compiler/objectivec/names.h
new file mode 100644
index 0000000..e75738f
--- /dev/null
+++ b/src/google/protobuf/compiler/objectivec/names.h
@@ -0,0 +1,363 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Helper functions for generating ObjectiveC code.
+
+#ifndef GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_NAMES_H__
+#define GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_NAMES_H__
+
+#include <string>
+#include <vector>
+
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/io/zero_copy_stream.h"
+
+// clang-format off
+#include "google/protobuf/port_def.inc"
+// clang-format on
+
+namespace google {
+namespace protobuf {
+namespace compiler {
+namespace objectivec {
+
+// Get/Set the path to a file to load for objc class prefix lookups.
+std::string PROTOC_EXPORT GetPackageToPrefixMappingsPath();
+void PROTOC_EXPORT SetPackageToPrefixMappingsPath(
+ const std::string& file_path);
+// Get/Set if the proto package should be used to make the default prefix for
+// symbols. This will then impact most of the type naming apis below. It is done
+// as a global to not break any other generator reusing the methods since they
+// are exported.
+bool PROTOC_EXPORT UseProtoPackageAsDefaultPrefix();
+void PROTOC_EXPORT SetUseProtoPackageAsDefaultPrefix(bool on_or_off);
+// Get/Set the path to a file to load as exceptions when
+// `UseProtoPackageAsDefaultPrefix()` is `true`. An empty string means there
+// should be no exceptions.
+std::string PROTOC_EXPORT GetProtoPackagePrefixExceptionList();
+void PROTOC_EXPORT SetProtoPackagePrefixExceptionList(
+ const std::string& file_path);
+// Get/Set a prefix to add before the prefix generated from the package name.
+// This is only used when UseProtoPackageAsDefaultPrefix() is True.
+std::string PROTOC_EXPORT GetForcedPackagePrefix();
+void PROTOC_EXPORT SetForcedPackagePrefix(const std::string& prefix);
+
+// Generator Prefix Validation Options (see objectivec_generator.cc for a
+// description of each):
+struct Options {
+ Options();
+ std::string expected_prefixes_path;
+ std::vector<std::string> expected_prefixes_suppressions;
+ bool prefixes_must_be_registered;
+ bool require_prefixes;
+};
+
+// Escape C++ trigraphs by escaping question marks to "\?".
+std::string PROTOC_EXPORT EscapeTrigraphs(absl::string_view to_escape);
+
+// Remove white space from either end of a absl::string_view.
+void PROTOC_EXPORT TrimWhitespace(absl::string_view* input);
+
+// Returns true if the name requires a ns_returns_not_retained attribute applied
+// to it.
+bool PROTOC_EXPORT IsRetainedName(const std::string& name);
+
+// Returns true if the name starts with "init" and will need to have special
+// handling under ARC.
+bool PROTOC_EXPORT IsInitName(const std::string& name);
+
+// Returns true if the name requires a cf_returns_not_retained attribute applied
+// to it.
+bool PROTOC_EXPORT IsCreateName(const std::string& name);
+
+// Gets the objc_class_prefix or the prefix made from the proto package.
+std::string PROTOC_EXPORT FileClassPrefix(const FileDescriptor* file);
+
+// Gets the path of the file we're going to generate (sans the .pb.h
+// extension). The path will be dependent on the objectivec package
+// declared in the proto package.
+std::string PROTOC_EXPORT FilePath(const FileDescriptor* file);
+
+// Just like FilePath(), but without the directory part.
+std::string PROTOC_EXPORT FilePathBasename(const FileDescriptor* file);
+
+// Gets the name of the root class we'll generate in the file. This class
+// is not meant for external consumption, but instead contains helpers that
+// the rest of the classes need
+std::string PROTOC_EXPORT FileClassName(const FileDescriptor* file);
+
+// These return the fully-qualified class name corresponding to the given
+// descriptor.
+std::string PROTOC_EXPORT ClassName(const Descriptor* descriptor);
+std::string PROTOC_EXPORT ClassName(const Descriptor* descriptor,
+ std::string* out_suffix_added);
+std::string PROTOC_EXPORT EnumName(const EnumDescriptor* descriptor);
+
+// Returns the fully-qualified name of the enum value corresponding to the
+// the descriptor.
+std::string PROTOC_EXPORT EnumValueName(const EnumValueDescriptor* descriptor);
+
+// Returns the name of the enum value corresponding to the descriptor.
+std::string PROTOC_EXPORT EnumValueShortName(const EnumValueDescriptor* descriptor);
+
+// Reverse what an enum does.
+std::string PROTOC_EXPORT UnCamelCaseEnumShortName(const std::string& name);
+
+// Returns the name to use for the extension (used as the method off the file's
+// Root class).
+std::string PROTOC_EXPORT ExtensionMethodName(const FieldDescriptor* descriptor);
+
+// Returns the transformed field name.
+std::string PROTOC_EXPORT FieldName(const FieldDescriptor* field);
+std::string PROTOC_EXPORT FieldNameCapitalized(const FieldDescriptor* field);
+
+// Returns the transformed oneof name.
+std::string PROTOC_EXPORT OneofEnumName(const OneofDescriptor* descriptor);
+std::string PROTOC_EXPORT OneofName(const OneofDescriptor* descriptor);
+std::string PROTOC_EXPORT OneofNameCapitalized(const OneofDescriptor* descriptor);
+
+// Returns a symbol that can be used in C code to refer to an Objective C
+// class without initializing the class.
+std::string PROTOC_EXPORT ObjCClass(const std::string& class_name);
+
+// Declares an Objective C class without initializing the class so that it can
+// be refrerred to by ObjCClass.
+std::string PROTOC_EXPORT ObjCClassDeclaration(const std::string& class_name);
+
+inline bool HasPreservingUnknownEnumSemantics(const FileDescriptor* file) {
+ return file->syntax() == FileDescriptor::SYNTAX_PROTO3;
+}
+
+inline bool IsMapEntryMessage(const Descriptor* descriptor) {
+ return descriptor->options().map_entry();
+}
+
+// Reverse of the above.
+std::string PROTOC_EXPORT UnCamelCaseFieldName(const std::string& name,
+ const FieldDescriptor* field);
+
+enum ObjectiveCType {
+ OBJECTIVECTYPE_INT32,
+ OBJECTIVECTYPE_UINT32,
+ OBJECTIVECTYPE_INT64,
+ OBJECTIVECTYPE_UINT64,
+ OBJECTIVECTYPE_FLOAT,
+ OBJECTIVECTYPE_DOUBLE,
+ OBJECTIVECTYPE_BOOLEAN,
+ OBJECTIVECTYPE_STRING,
+ OBJECTIVECTYPE_DATA,
+ OBJECTIVECTYPE_ENUM,
+ OBJECTIVECTYPE_MESSAGE
+};
+
+enum FlagType {
+ FLAGTYPE_DESCRIPTOR_INITIALIZATION,
+ FLAGTYPE_EXTENSION,
+ FLAGTYPE_FIELD
+};
+
+template <class TDescriptor>
+std::string GetOptionalDeprecatedAttribute(const TDescriptor* descriptor,
+ const FileDescriptor* file = NULL,
+ bool preSpace = true,
+ bool postNewline = false) {
+ bool isDeprecated = descriptor->options().deprecated();
+ // The file is only passed when checking Messages & Enums, so those types
+ // get tagged. At the moment, it doesn't seem to make sense to tag every
+ // field or enum value with when the file is deprecated.
+ bool isFileLevelDeprecation = false;
+ if (!isDeprecated && file) {
+ isFileLevelDeprecation = file->options().deprecated();
+ isDeprecated = isFileLevelDeprecation;
+ }
+ if (isDeprecated) {
+ std::string message;
+ const FileDescriptor* sourceFile = descriptor->file();
+ if (isFileLevelDeprecation) {
+ message = sourceFile->name() + " is deprecated.";
+ } else {
+ message = descriptor->full_name() + " is deprecated (see " +
+ sourceFile->name() + ").";
+ }
+
+ std::string result = std::string("GPB_DEPRECATED_MSG(\"") + message + "\")";
+ if (preSpace) {
+ result.insert(0, " ");
+ }
+ if (postNewline) {
+ result.append("\n");
+ }
+ return result;
+ } else {
+ return "";
+ }
+}
+
+std::string PROTOC_EXPORT GetCapitalizedType(const FieldDescriptor* field);
+
+ObjectiveCType PROTOC_EXPORT
+GetObjectiveCType(FieldDescriptor::Type field_type);
+
+inline ObjectiveCType GetObjectiveCType(const FieldDescriptor* field) {
+ return GetObjectiveCType(field->type());
+}
+
+bool PROTOC_EXPORT IsPrimitiveType(const FieldDescriptor* field);
+bool PROTOC_EXPORT IsReferenceType(const FieldDescriptor* field);
+
+std::string PROTOC_EXPORT
+GPBGenericValueFieldName(const FieldDescriptor* field);
+std::string PROTOC_EXPORT DefaultValue(const FieldDescriptor* field);
+bool PROTOC_EXPORT HasNonZeroDefaultValue(const FieldDescriptor* field);
+
+std::string PROTOC_EXPORT
+BuildFlagsString(const FlagType type, const std::vector<std::string>& strings);
+
+// Builds HeaderDoc/appledoc style comments out of the comments in the .proto
+// file.
+std::string PROTOC_EXPORT BuildCommentsString(const SourceLocation& location,
+ bool prefer_single_line);
+
+// The name the commonly used by the library when built as a framework.
+// This lines up to the name used in the CocoaPod.
+extern PROTOC_EXPORT const char* const ProtobufLibraryFrameworkName;
+// Returns the CPP symbol name to use as the gate for framework style imports
+// for the given framework name to use.
+std::string PROTOC_EXPORT
+ProtobufFrameworkImportSymbol(const std::string& framework_name);
+
+// Checks if the file is one of the proto's bundled with the library.
+bool PROTOC_EXPORT
+IsProtobufLibraryBundledProtoFile(const FileDescriptor* file);
+
+// Checks the prefix for the given files and outputs any warnings as needed. If
+// there are flat out errors, then out_error is filled in with the first error
+// and the result is false.
+bool PROTOC_EXPORT ValidateObjCClassPrefixes(
+ const std::vector<const FileDescriptor*>& files,
+ const Options& validation_options, std::string* out_error);
+// Same was the other ValidateObjCClassPrefixes() calls, but the options all
+// come from the environment variables.
+bool PROTOC_EXPORT ValidateObjCClassPrefixes(
+ const std::vector<const FileDescriptor*>& files, std::string* out_error);
+
+// Generate decode data needed for ObjC's GPBDecodeTextFormatName() to transform
+// the input into the expected output.
+class PROTOC_EXPORT TextFormatDecodeData {
+ public:
+ TextFormatDecodeData();
+ ~TextFormatDecodeData();
+
+ TextFormatDecodeData(const TextFormatDecodeData&) = delete;
+ TextFormatDecodeData& operator=(const TextFormatDecodeData&) = delete;
+
+ void AddString(int32_t key, const std::string& input_for_decode,
+ const std::string& desired_output);
+ size_t num_entries() const { return entries_.size(); }
+ std::string Data() const;
+
+ static std::string DecodeDataForString(const std::string& input_for_decode,
+ const std::string& desired_output);
+
+ private:
+ typedef std::pair<int32_t, std::string> DataEntry;
+ std::vector<DataEntry> entries_;
+};
+
+// Helper for parsing simple files.
+class PROTOC_EXPORT LineConsumer {
+ public:
+ LineConsumer();
+ virtual ~LineConsumer();
+ virtual bool ConsumeLine(const absl::string_view& line, std::string* out_error) = 0;
+};
+
+bool PROTOC_EXPORT ParseSimpleFile(const std::string& path,
+ LineConsumer* line_consumer,
+ std::string* out_error);
+
+bool PROTOC_EXPORT ParseSimpleStream(io::ZeroCopyInputStream& input_stream,
+ const std::string& stream_name,
+ LineConsumer* line_consumer,
+ std::string* out_error);
+
+// Helper class for parsing framework import mappings and generating
+// import statements.
+class PROTOC_EXPORT ImportWriter {
+ public:
+ ImportWriter(const std::string& generate_for_named_framework,
+ const std::string& named_framework_to_proto_path_mappings_path,
+ const std::string& runtime_import_prefix,
+ bool include_wkt_imports);
+ ~ImportWriter();
+
+ void AddFile(const FileDescriptor* file, const std::string& header_extension);
+ void Print(io::Printer* printer) const;
+
+ static void PrintRuntimeImports(io::Printer* printer,
+ const std::vector<std::string>& header_to_import,
+ const std::string& runtime_import_prefix,
+ bool default_cpp_symbol = false);
+
+ private:
+ class ProtoFrameworkCollector : public LineConsumer {
+ public:
+ ProtoFrameworkCollector(std::map<std::string, std::string>* inout_proto_file_to_framework_name)
+ : map_(inout_proto_file_to_framework_name) {}
+
+ virtual bool ConsumeLine(const absl::string_view& line, std::string* out_error) override;
+
+ private:
+ std::map<std::string, std::string>* map_;
+ };
+
+ void ParseFrameworkMappings();
+
+ const std::string generate_for_named_framework_;
+ const std::string named_framework_to_proto_path_mappings_path_;
+ const std::string runtime_import_prefix_;
+ const bool include_wkt_imports_;
+ std::map<std::string, std::string> proto_file_to_framework_name_;
+ bool need_to_parse_mapping_file_;
+
+ std::vector<std::string> protobuf_imports_;
+ std::vector<std::string> other_framework_imports_;
+ std::vector<std::string> other_imports_;
+};
+
+} // namespace objectivec
+} // namespace compiler
+} // namespace protobuf
+} // namespace google
+
+#include "google/protobuf/port_undef.inc"
+
+#endif // GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_NAMES_H__
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_enum.cc b/src/google/protobuf/compiler/objectivec/objectivec_enum.cc
index ea8f394..13954ca 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_enum.cc
+++ b/src/google/protobuf/compiler/objectivec/objectivec_enum.cc
@@ -28,19 +28,32 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#include "google/protobuf/compiler/objectivec/objectivec_enum.h"
+
+#include <algorithm>
#include <map>
#include <string>
-#include <google/protobuf/compiler/objectivec/objectivec_enum.h>
-#include <google/protobuf/compiler/objectivec/objectivec_helpers.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <algorithm> // std::find()
+#include "absl/strings/escaping.h"
+#include "absl/strings/str_cat.h"
+#include "google/protobuf/compiler/objectivec/objectivec_helpers.h"
+#include "google/protobuf/io/printer.h"
namespace google {
namespace protobuf {
namespace compiler {
namespace objectivec {
+namespace {
+std::string SafelyPrintIntToCode(int v) {
+ if (v == std::numeric_limits<int>::min()) {
+ // Some compilers try to parse -2147483648 as two tokens and then get spicy
+ // about the fact that +2147483648 cannot be represented as an int.
+ return absl::StrCat(v + 1, " - 1");
+ } else {
+ return absl::StrCat(v);
+ }
+}
+} // namespace
EnumGenerator::EnumGenerator(const EnumDescriptor* descriptor)
: descriptor_(descriptor),
@@ -128,7 +141,7 @@
continue;
}
if (all_values_[i]->GetSourceLocation(&location)) {
- std::string comments = BuildCommentsString(location, true).c_str();
+ std::string comments = BuildCommentsString(location, true);
if (comments.length() > 0) {
if (i > 0) {
printer->Print("\n");
@@ -141,7 +154,7 @@
"$name$$deprecated_attribute$ = $value$,\n",
"name", EnumValueName(all_values_[i]),
"deprecated_attribute", GetOptionalDeprecatedAttribute(all_values_[i]),
- "value", StrCat(all_values_[i]->number()));
+ "value", SafelyPrintIntToCode(all_values_[i]->number()));
}
printer->Outdent();
printer->Print(
@@ -195,7 +208,7 @@
for (int i = 0; i < text_blob.size(); i += kBytesPerLine) {
printer->Print(
"\n \"$data$\"",
- "data", EscapeTrigraphs(CEscape(text_blob.substr(i, kBytesPerLine))));
+ "data", EscapeTrigraphs(absl::CEscape(text_blob.substr(i, kBytesPerLine))));
}
printer->Print(
";\n"
@@ -225,7 +238,7 @@
" enumVerifier:$name$_IsValidValue\n"
" extraTextFormatInfo:extraTextFormatInfo];\n",
"name", name_,
- "extraTextFormatInfo", CEscape(text_format_decode_data.Data()));
+ "extraTextFormatInfo", absl::CEscape(text_format_decode_data.Data()));
}
printer->Print(
" GPBEnumDescriptor *expected = nil;\n"
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_enum.h b/src/google/protobuf/compiler/objectivec/objectivec_enum.h
index 1d5741a..0759ae5 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_enum.h
+++ b/src/google/protobuf/compiler/objectivec/objectivec_enum.h
@@ -34,8 +34,8 @@
#include <string>
#include <set>
#include <vector>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/io/printer.h>
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/io/printer.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_enum_field.cc b/src/google/protobuf/compiler/objectivec/objectivec_enum_field.cc
index 6e0d69b..049ff47 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_enum_field.cc
+++ b/src/google/protobuf/compiler/objectivec/objectivec_enum_field.cc
@@ -31,9 +31,9 @@
#include <map>
#include <string>
-#include <google/protobuf/compiler/objectivec/objectivec_enum_field.h>
-#include <google/protobuf/compiler/objectivec/objectivec_helpers.h>
-#include <google/protobuf/io/printer.h>
+#include "google/protobuf/compiler/objectivec/objectivec_enum_field.h"
+#include "google/protobuf/compiler/objectivec/objectivec_helpers.h"
+#include "google/protobuf/io/printer.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_enum_field.h b/src/google/protobuf/compiler/objectivec/objectivec_enum_field.h
index f0d685c..7bd3c32 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_enum_field.h
+++ b/src/google/protobuf/compiler/objectivec/objectivec_enum_field.h
@@ -33,7 +33,7 @@
#include <map>
#include <string>
-#include <google/protobuf/compiler/objectivec/objectivec_field.h>
+#include "google/protobuf/compiler/objectivec/objectivec_field.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_extension.cc b/src/google/protobuf/compiler/objectivec/objectivec_extension.cc
index 9cebcb2..c97c9fe 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_extension.cc
+++ b/src/google/protobuf/compiler/objectivec/objectivec_extension.cc
@@ -28,13 +28,14 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#include "google/protobuf/compiler/objectivec/objectivec_extension.h"
+
#include <iostream>
-#include <google/protobuf/compiler/objectivec/objectivec_extension.h>
-#include <google/protobuf/compiler/objectivec/objectivec_helpers.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/io/printer.h>
+#include "absl/strings/str_cat.h"
+#include "google/protobuf/compiler/objectivec/objectivec_helpers.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/io/printer.h"
namespace google {
namespace protobuf {
@@ -86,7 +87,7 @@
vars["root_class_and_method_name"] = root_class_and_method_name_;
const std::string containing_type = ClassName(descriptor_->containing_type());
vars["extended_type"] = ObjCClass(containing_type);
- vars["number"] = StrCat(descriptor_->number());
+ vars["number"] = absl::StrCat(descriptor_->number());
std::vector<std::string> options;
if (descriptor_->is_repeated()) options.push_back("GPBExtensionRepeated");
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_extension.h b/src/google/protobuf/compiler/objectivec/objectivec_extension.h
index d412f4a..cfdf718 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_extension.h
+++ b/src/google/protobuf/compiler/objectivec/objectivec_extension.h
@@ -31,8 +31,8 @@
#ifndef GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_EXTENSION_H__
#define GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_EXTENSION_H__
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/io/printer.h>
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/io/printer.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_field.cc b/src/google/protobuf/compiler/objectivec/objectivec_field.cc
index 004ea19..b98955b 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_field.cc
+++ b/src/google/protobuf/compiler/objectivec/objectivec_field.cc
@@ -28,16 +28,17 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#include "google/protobuf/compiler/objectivec/objectivec_field.h"
+
#include <iostream>
-#include <google/protobuf/compiler/objectivec/objectivec_field.h>
-#include <google/protobuf/compiler/objectivec/objectivec_helpers.h>
-#include <google/protobuf/compiler/objectivec/objectivec_enum_field.h>
-#include <google/protobuf/compiler/objectivec/objectivec_map_field.h>
-#include <google/protobuf/compiler/objectivec/objectivec_message_field.h>
-#include <google/protobuf/compiler/objectivec/objectivec_primitive_field.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/stubs/strutil.h>
+#include "absl/strings/str_cat.h"
+#include "google/protobuf/compiler/objectivec/objectivec_enum_field.h"
+#include "google/protobuf/compiler/objectivec/objectivec_helpers.h"
+#include "google/protobuf/compiler/objectivec/objectivec_map_field.h"
+#include "google/protobuf/compiler/objectivec/objectivec_message_field.h"
+#include "google/protobuf/compiler/objectivec/objectivec_primitive_field.h"
+#include "google/protobuf/io/printer.h"
namespace google {
namespace protobuf {
@@ -74,7 +75,7 @@
(*variables)["raw_field_name"] = raw_field_name;
(*variables)["field_number_name"] =
classname + "_FieldNumber_" + capitalized_name;
- (*variables)["field_number"] = StrCat(descriptor->number());
+ (*variables)["field_number"] = absl::StrCat(descriptor->number());
(*variables)["field_type"] = GetCapitalizedType(descriptor);
(*variables)["deprecated_attribute"] = GetOptionalDeprecatedAttribute(descriptor);
std::vector<std::string> field_flags;
@@ -224,7 +225,7 @@
}
void FieldGenerator::SetRuntimeHasBit(int has_index) {
- variables_["has_index"] = StrCat(has_index);
+ variables_["has_index"] = absl::StrCat(has_index);
}
void FieldGenerator::SetNoHasBit(void) {
@@ -248,7 +249,7 @@
if (oneof != NULL) {
int index = oneof->index() + index_base;
// Flip the sign to mark it as a oneof.
- variables_["has_index"] = StrCat(-index);
+ variables_["has_index"] = absl::StrCat(-index);
}
}
@@ -388,7 +389,7 @@
"$comments$"
"$array_comment$"
"@property(nonatomic, readwrite, strong, null_resettable) $array_property_type$ *$name$$storage_attribute$$deprecated_attribute$;\n"
- "/** The number of items in @c $name$ without causing the array to be created. */\n"
+ "/** The number of items in @c $name$ without causing the container to be created. */\n"
"@property(nonatomic, readonly) NSUInteger $name$_Count$deprecated_attribute$;\n");
if (IsInitName(variables_.find("name")->second)) {
// If property name starts with init we need to annotate it to get past ARC.
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_field.h b/src/google/protobuf/compiler/objectivec/objectivec_field.h
index 759ef80..6750b51 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_field.h
+++ b/src/google/protobuf/compiler/objectivec/objectivec_field.h
@@ -33,8 +33,8 @@
#include <map>
#include <string>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/io/printer.h>
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/io/printer.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_file.cc b/src/google/protobuf/compiler/objectivec/objectivec_file.cc
index 50b4285..fc51baf 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_file.cc
+++ b/src/google/protobuf/compiler/objectivec/objectivec_file.cc
@@ -28,20 +28,20 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/compiler/objectivec/objectivec_file.h>
-#include <google/protobuf/compiler/objectivec/objectivec_enum.h>
-#include <google/protobuf/compiler/objectivec/objectivec_extension.h>
-#include <google/protobuf/compiler/objectivec/objectivec_helpers.h>
-#include <google/protobuf/compiler/objectivec/objectivec_message.h>
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/stubs/stl_util.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <algorithm> // std::find()
+#include "google/protobuf/compiler/objectivec/objectivec_file.h"
+
+#include <algorithm>
#include <iostream>
#include <sstream>
+#include "google/protobuf/compiler/code_generator.h"
+#include "absl/strings/str_cat.h"
+#include "google/protobuf/compiler/objectivec/objectivec_enum.h"
+#include "google/protobuf/compiler/objectivec/objectivec_extension.h"
+#include "google/protobuf/compiler/objectivec/objectivec_helpers.h"
+#include "google/protobuf/compiler/objectivec/objectivec_message.h"
+#include "google/protobuf/io/printer.h"
+
// NOTE: src/google/protobuf/compiler/plugin.cc makes use of cerr for some
// error cases, so it seems to be ok to use as a back door for errors.
@@ -145,9 +145,9 @@
return it->second;
}
- std::set<const FileDescriptor*> min_deps_collector;
- std::set<const FileDescriptor*> covered_deps_collector;
- std::set<const FileDescriptor*> to_prune;
+ std::unordered_set<const FileDescriptor*> min_deps_collector;
+ std::unordered_set<const FileDescriptor*> covered_deps_collector;
+ std::unordered_set<const FileDescriptor*> to_prune;
for (int i = 0; i < file->dependency_count(); i++) {
const FileDescriptor* dep = file->dependency(i);
MinDepsEntry dep_info =
@@ -180,7 +180,7 @@
{file, {file_has_exts, min_deps_collector, covered_deps_collector}}).first->second;
}
- std::set<const FileDescriptor*> min_deps;
+ std::unordered_set<const FileDescriptor*> min_deps;
std::copy_if(min_deps_collector.begin(), min_deps_collector.end(),
std::inserter(min_deps, min_deps.end()),
[&](const FileDescriptor* value){
@@ -202,7 +202,7 @@
const std::vector<const FileDescriptor*>
FileGenerator::CommonState::CollectMinimalFileDepsContainingExtensions(
const FileDescriptor* file) {
- std::set<const FileDescriptor*> min_deps =
+ std::unordered_set<const FileDescriptor*> min_deps =
CollectMinimalFileDepsContainingExtensionsInternal(file).min_deps;
// Sort the list since pointer order isn't stable across runs.
std::vector<const FileDescriptor*> result(min_deps.begin(), min_deps.end());
@@ -267,7 +267,7 @@
"#error This file was generated by an older version of protoc which is incompatible with your Protocol Buffer library sources.\n"
"#endif\n"
"\n",
- "google_protobuf_objc_version", StrCat(GOOGLE_PROTOBUF_OBJC_VERSION));
+ "google_protobuf_objc_version", absl::StrCat(GOOGLE_PROTOBUF_OBJC_VERSION));
// The bundled protos (WKTs) don't use of forward declarations.
bool headers_use_forward_declarations =
@@ -377,7 +377,9 @@
"\n"
"#pragma clang diagnostic pop\n"
"\n"
- "// @@protoc_insertion_point(global_scope)\n");
+ "// @@protoc_insertion_point(global_scope)\n"
+ "\n"
+ "// clange-format on\n");
}
void FileGenerator::GenerateSource(io::Printer* printer) {
@@ -638,7 +640,9 @@
"\n"
"#pragma clang diagnostic pop\n"
"\n"
- "// @@protoc_insertion_point(global_scope)\n");
+ "// @@protoc_insertion_point(global_scope)\n"
+ "\n"
+ "// clange-format on\n");
}
// Helper to print the import of the runtime support at the top of generated
@@ -650,6 +654,8 @@
printer->Print(
"// Generated by the protocol buffer compiler. DO NOT EDIT!\n"
"// source: $filename$\n"
+ "\n"
+ "// clang-format off\n"
"\n",
"filename", file_->name());
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_file.h b/src/google/protobuf/compiler/objectivec/objectivec_file.h
index ef49cf8..5063611 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_file.h
+++ b/src/google/protobuf/compiler/objectivec/objectivec_file.h
@@ -31,12 +31,13 @@
#ifndef GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_FILE_H__
#define GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_FILE_H__
-#include <map>
-#include <set>
#include <string>
+#include <unordered_map>
+#include <unordered_set>
#include <vector>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/io/printer.h>
+#include "google/protobuf/compiler/objectivec/objectivec_options.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/io/printer.h"
namespace google {
namespace protobuf {
@@ -49,17 +50,6 @@
class FileGenerator {
public:
- struct GenerationOptions {
- GenerationOptions()
- // TODO(thomasvl): Eventually flip this default to false for better
- // interop with Swift if proto usages span modules made from ObjC sources.
- : headers_use_forward_declarations(true) {}
- std::string generate_for_named_framework;
- std::string named_framework_to_proto_path_mappings_path;
- std::string runtime_import_prefix;
- bool headers_use_forward_declarations;
- };
-
// Wrapper for some common state that is shared between file generations to
// improve performance when more than one file is generated at a time.
struct CommonState {
@@ -71,13 +61,13 @@
private:
struct MinDepsEntry {
bool has_extensions;
- std::set<const FileDescriptor*> min_deps;
+ std::unordered_set<const FileDescriptor*> min_deps;
// `covered_deps` are the transtive deps of `min_deps_w_exts` that also
// have extensions.
- std::set<const FileDescriptor*> covered_deps;
+ std::unordered_set<const FileDescriptor*> covered_deps;
};
const MinDepsEntry& CollectMinimalFileDepsContainingExtensionsInternal(const FileDescriptor* file);
- std::map<const FileDescriptor*, MinDepsEntry> deps_info_cache_;
+ std::unordered_map<const FileDescriptor*, MinDepsEntry> deps_info_cache_;
};
FileGenerator(const FileDescriptor* file,
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_generator.cc b/src/google/protobuf/compiler/objectivec/objectivec_generator.cc
index 9dccf14..e5f2fb3 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_generator.cc
+++ b/src/google/protobuf/compiler/objectivec/objectivec_generator.cc
@@ -28,16 +28,20 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#include "google/protobuf/compiler/objectivec/objectivec_generator.h"
+
#include <fstream>
#include <iostream>
#include <string>
#include <unordered_set>
-#include <google/protobuf/compiler/objectivec/objectivec_generator.h>
-#include <google/protobuf/compiler/objectivec/objectivec_file.h>
-#include <google/protobuf/compiler/objectivec/objectivec_helpers.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/stubs/strutil.h>
+
+#include "absl/strings/ascii.h"
+#include "absl/strings/str_split.h"
+#include "absl/strings/strip.h"
+#include "google/protobuf/compiler/objectivec/objectivec_file.h"
+#include "google/protobuf/compiler/objectivec/objectivec_helpers.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/io/zero_copy_stream.h"
namespace google {
namespace protobuf {
@@ -51,7 +55,7 @@
// invalid, `result` is unchanged.
bool StringToBool(const std::string& value, bool* result) {
std::string upper_value(value);
- UpperString(&upper_value);
+ absl::AsciiStrToUpper(&upper_value);
if (upper_value == "NO") {
*result = false;
return true;
@@ -95,11 +99,11 @@
// e.g. protoc ... --objc_opt=expected_prefixes=file.txt,generate_for_named_framework=MyFramework
Options validation_options;
- FileGenerator::GenerationOptions generation_options;
+ GenerationOptions generation_options;
std::vector<std::pair<std::string, std::string> > options;
ParseGeneratorParameter(parameter, &options);
- for (int i = 0; i < options.size(); i++) {
+ for (size_t i = 0; i < options.size(); i++) {
if (options[i].first == "expected_prefixes_path") {
// Path to find a file containing the expected prefixes
// (objc_class_prefix "PREFIX") for proto packages (package NAME). The
@@ -122,8 +126,8 @@
// A semicolon delimited string that lists the paths of .proto files to
// exclude from the package prefix validations (expected_prefixes_path).
// This is provided as an "out", to skip some files being checked.
- for (StringPiece split_piece : Split(
- options[i].second, ";", true)) {
+ for (absl::string_view split_piece : absl::StrSplit(
+ options[i].second, ";", absl::SkipEmpty())) {
validation_options.expected_prefixes_suppressions.push_back(
std::string(split_piece));
}
@@ -189,7 +193,8 @@
// generated files. When integrating ObjC protos into a build system,
// this can be used to avoid having to add the runtime directory to the
// header search path since the generate #import will be more complete.
- generation_options.runtime_import_prefix = StripSuffixString(options[i].second, "/");
+ generation_options.runtime_import_prefix =
+ std::string(absl::StripSuffix(options[i].second, "/"));
} else if (options[i].first == "package_to_prefix_mappings_path") {
// Path to use for when loading the objc class prefix mappings to use.
// The `objc_class_prefix` file option is always honored first if one is present.
@@ -230,6 +235,10 @@
// - A comment can go on a line after a expected package/prefix pair.
// (i.e. - "some.proto.package # comment")
SetProtoPackagePrefixExceptionList(options[i].second);
+ } else if (options[i].first == "package_as_prefix_forced_prefix") {
+ // String to use as the prefix when deriving a prefix from the package
+ // name. So this only applies when use_package_as_prefix is also used.
+ SetForcedPackagePrefix(options[i].second);
} else if (options[i].first == "headers_use_forward_declarations") {
if (!StringToBool(options[i].second,
&generation_options.headers_use_forward_declarations)) {
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_generator.h b/src/google/protobuf/compiler/objectivec/objectivec_generator.h
index 1dbc666..acd9ce8 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_generator.h
+++ b/src/google/protobuf/compiler/objectivec/objectivec_generator.h
@@ -34,10 +34,12 @@
#define GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_GENERATOR_H__
#include <string>
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/descriptor.h>
+#include "google/protobuf/compiler/code_generator.h"
+#include "google/protobuf/descriptor.h"
-#include <google/protobuf/port_def.inc>
+// clang-format off
+#include "google/protobuf/port_def.inc"
+// clang-format on
namespace google {
namespace protobuf {
@@ -74,6 +76,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_GENERATOR_H__
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_helpers.h b/src/google/protobuf/compiler/objectivec/objectivec_helpers.h
index d21fed2..9c61dfa 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_helpers.h
+++ b/src/google/protobuf/compiler/objectivec/objectivec_helpers.h
@@ -33,321 +33,25 @@
#ifndef GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_HELPERS_H__
#define GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_HELPERS_H__
-#include <string>
-#include <vector>
+#include "google/protobuf/compiler/objectivec/names.h"
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-
-#include <google/protobuf/port_def.inc>
+// clang-format off
+#include "google/protobuf/port_def.inc"
+// clang-format on
namespace google {
namespace protobuf {
namespace compiler {
namespace objectivec {
-// Get/Set the path to a file to load for objc class prefix lookups.
-std::string PROTOC_EXPORT GetPackageToPrefixMappingsPath();
-void PROTOC_EXPORT SetPackageToPrefixMappingsPath(
- const std::string& file_path);
-// Get/Set if the proto package should be used to make the default prefix for
-// symbols. This will then impact most of the type naming apis below. It is done
-// as a global to not break any other generator reusing the methods since they
-// are exported.
-bool PROTOC_EXPORT UseProtoPackageAsDefaultPrefix();
-void PROTOC_EXPORT SetUseProtoPackageAsDefaultPrefix(bool on_or_off);
-// Get/Set the path to a file to load as exceptions when
-// `UseProtoPackageAsDefaultPrefix()` is `true`. An empty string means there
-// should be no exceptions.
-std::string PROTOC_EXPORT GetProtoPackagePrefixExceptionList();
-void PROTOC_EXPORT SetProtoPackagePrefixExceptionList(
- const std::string& file_path);
-
-// Generator Prefix Validation Options (see objectivec_generator.cc for a
-// description of each):
-struct Options {
- Options();
- std::string expected_prefixes_path;
- std::vector<std::string> expected_prefixes_suppressions;
- bool prefixes_must_be_registered;
- bool require_prefixes;
-};
-
-// Escape C++ trigraphs by escaping question marks to "\?".
-std::string PROTOC_EXPORT EscapeTrigraphs(const std::string& to_escape);
-
-// Remove white space from either end of a StringPiece.
-void PROTOC_EXPORT TrimWhitespace(StringPiece* input);
-
-// Returns true if the name requires a ns_returns_not_retained attribute applied
-// to it.
-bool PROTOC_EXPORT IsRetainedName(const std::string& name);
-
-// Returns true if the name starts with "init" and will need to have special
-// handling under ARC.
-bool PROTOC_EXPORT IsInitName(const std::string& name);
-
-// Gets the objc_class_prefix or the prefix made from the proto package.
-std::string PROTOC_EXPORT FileClassPrefix(const FileDescriptor* file);
-
-// Gets the path of the file we're going to generate (sans the .pb.h
-// extension). The path will be dependent on the objectivec package
-// declared in the proto package.
-std::string PROTOC_EXPORT FilePath(const FileDescriptor* file);
-
-// Just like FilePath(), but without the directory part.
-std::string PROTOC_EXPORT FilePathBasename(const FileDescriptor* file);
-
-// Gets the name of the root class we'll generate in the file. This class
-// is not meant for external consumption, but instead contains helpers that
-// the rest of the classes need
-std::string PROTOC_EXPORT FileClassName(const FileDescriptor* file);
-
-// These return the fully-qualified class name corresponding to the given
-// descriptor.
-std::string PROTOC_EXPORT ClassName(const Descriptor* descriptor);
-std::string PROTOC_EXPORT ClassName(const Descriptor* descriptor,
- std::string* out_suffix_added);
-std::string PROTOC_EXPORT EnumName(const EnumDescriptor* descriptor);
-
-// Returns the fully-qualified name of the enum value corresponding to the
-// the descriptor.
-std::string PROTOC_EXPORT EnumValueName(const EnumValueDescriptor* descriptor);
-
-// Returns the name of the enum value corresponding to the descriptor.
-std::string PROTOC_EXPORT EnumValueShortName(const EnumValueDescriptor* descriptor);
-
-// Reverse what an enum does.
-std::string PROTOC_EXPORT UnCamelCaseEnumShortName(const std::string& name);
-
-// Returns the name to use for the extension (used as the method off the file's
-// Root class).
-std::string PROTOC_EXPORT ExtensionMethodName(const FieldDescriptor* descriptor);
-
-// Returns the transformed field name.
-std::string PROTOC_EXPORT FieldName(const FieldDescriptor* field);
-std::string PROTOC_EXPORT FieldNameCapitalized(const FieldDescriptor* field);
-
-// Returns the transformed oneof name.
-std::string PROTOC_EXPORT OneofEnumName(const OneofDescriptor* descriptor);
-std::string PROTOC_EXPORT OneofName(const OneofDescriptor* descriptor);
-std::string PROTOC_EXPORT OneofNameCapitalized(const OneofDescriptor* descriptor);
-
-// Returns a symbol that can be used in C code to refer to an Objective C
-// class without initializing the class.
-std::string PROTOC_EXPORT ObjCClass(const std::string& class_name);
-
-// Declares an Objective C class without initializing the class so that it can
-// be refrerred to by ObjCClass.
-std::string PROTOC_EXPORT ObjCClassDeclaration(const std::string& class_name);
-
-inline bool HasPreservingUnknownEnumSemantics(const FileDescriptor* file) {
- return file->syntax() == FileDescriptor::SYNTAX_PROTO3;
-}
-
-inline bool IsMapEntryMessage(const Descriptor* descriptor) {
- return descriptor->options().map_entry();
-}
-
-// Reverse of the above.
-std::string PROTOC_EXPORT UnCamelCaseFieldName(const std::string& name,
- const FieldDescriptor* field);
-
-enum ObjectiveCType {
- OBJECTIVECTYPE_INT32,
- OBJECTIVECTYPE_UINT32,
- OBJECTIVECTYPE_INT64,
- OBJECTIVECTYPE_UINT64,
- OBJECTIVECTYPE_FLOAT,
- OBJECTIVECTYPE_DOUBLE,
- OBJECTIVECTYPE_BOOLEAN,
- OBJECTIVECTYPE_STRING,
- OBJECTIVECTYPE_DATA,
- OBJECTIVECTYPE_ENUM,
- OBJECTIVECTYPE_MESSAGE
-};
-
-enum FlagType {
- FLAGTYPE_DESCRIPTOR_INITIALIZATION,
- FLAGTYPE_EXTENSION,
- FLAGTYPE_FIELD
-};
-
-template <class TDescriptor>
-std::string GetOptionalDeprecatedAttribute(const TDescriptor* descriptor,
- const FileDescriptor* file = NULL,
- bool preSpace = true,
- bool postNewline = false) {
- bool isDeprecated = descriptor->options().deprecated();
- // The file is only passed when checking Messages & Enums, so those types
- // get tagged. At the moment, it doesn't seem to make sense to tag every
- // field or enum value with when the file is deprecated.
- bool isFileLevelDeprecation = false;
- if (!isDeprecated && file) {
- isFileLevelDeprecation = file->options().deprecated();
- isDeprecated = isFileLevelDeprecation;
- }
- if (isDeprecated) {
- std::string message;
- const FileDescriptor* sourceFile = descriptor->file();
- if (isFileLevelDeprecation) {
- message = sourceFile->name() + " is deprecated.";
- } else {
- message = descriptor->full_name() + " is deprecated (see " +
- sourceFile->name() + ").";
- }
-
- std::string result = std::string("GPB_DEPRECATED_MSG(\"") + message + "\")";
- if (preSpace) {
- result.insert(0, " ");
- }
- if (postNewline) {
- result.append("\n");
- }
- return result;
- } else {
- return "";
- }
-}
-
-std::string PROTOC_EXPORT GetCapitalizedType(const FieldDescriptor* field);
-
-ObjectiveCType PROTOC_EXPORT
-GetObjectiveCType(FieldDescriptor::Type field_type);
-
-inline ObjectiveCType GetObjectiveCType(const FieldDescriptor* field) {
- return GetObjectiveCType(field->type());
-}
-
-bool PROTOC_EXPORT IsPrimitiveType(const FieldDescriptor* field);
-bool PROTOC_EXPORT IsReferenceType(const FieldDescriptor* field);
-
-std::string PROTOC_EXPORT
-GPBGenericValueFieldName(const FieldDescriptor* field);
-std::string PROTOC_EXPORT DefaultValue(const FieldDescriptor* field);
-bool PROTOC_EXPORT HasNonZeroDefaultValue(const FieldDescriptor* field);
-
-std::string PROTOC_EXPORT
-BuildFlagsString(const FlagType type, const std::vector<std::string>& strings);
-
-// Builds HeaderDoc/appledoc style comments out of the comments in the .proto
-// file.
-std::string PROTOC_EXPORT BuildCommentsString(const SourceLocation& location,
- bool prefer_single_line);
-
-// The name the commonly used by the library when built as a framework.
-// This lines up to the name used in the CocoaPod.
-extern PROTOC_EXPORT const char* const ProtobufLibraryFrameworkName;
-// Returns the CPP symbol name to use as the gate for framework style imports
-// for the given framework name to use.
-std::string PROTOC_EXPORT
-ProtobufFrameworkImportSymbol(const std::string& framework_name);
-
-// Checks if the file is one of the proto's bundled with the library.
-bool PROTOC_EXPORT
-IsProtobufLibraryBundledProtoFile(const FileDescriptor* file);
-
-// Checks the prefix for the given files and outputs any warnings as needed. If
-// there are flat out errors, then out_error is filled in with the first error
-// and the result is false.
-bool PROTOC_EXPORT ValidateObjCClassPrefixes(
- const std::vector<const FileDescriptor*>& files,
- const Options& validation_options, std::string* out_error);
-// Same was the other ValidateObjCClassPrefixes() calls, but the options all
-// come from the environment variables.
-bool PROTOC_EXPORT ValidateObjCClassPrefixes(
- const std::vector<const FileDescriptor*>& files, std::string* out_error);
-
-// Generate decode data needed for ObjC's GPBDecodeTextFormatName() to transform
-// the input into the expected output.
-class PROTOC_EXPORT TextFormatDecodeData {
- public:
- TextFormatDecodeData();
- ~TextFormatDecodeData();
-
- TextFormatDecodeData(const TextFormatDecodeData&) = delete;
- TextFormatDecodeData& operator=(const TextFormatDecodeData&) = delete;
-
- void AddString(int32_t key, const std::string& input_for_decode,
- const std::string& desired_output);
- size_t num_entries() const { return entries_.size(); }
- std::string Data() const;
-
- static std::string DecodeDataForString(const std::string& input_for_decode,
- const std::string& desired_output);
-
- private:
- typedef std::pair<int32_t, std::string> DataEntry;
- std::vector<DataEntry> entries_;
-};
-
-// Helper for parsing simple files.
-class PROTOC_EXPORT LineConsumer {
- public:
- LineConsumer();
- virtual ~LineConsumer();
- virtual bool ConsumeLine(const StringPiece& line, std::string* out_error) = 0;
-};
-
-bool PROTOC_EXPORT ParseSimpleFile(const std::string& path,
- LineConsumer* line_consumer,
- std::string* out_error);
-
-bool PROTOC_EXPORT ParseSimpleStream(io::ZeroCopyInputStream& input_stream,
- const std::string& stream_name,
- LineConsumer* line_consumer,
- std::string* out_error);
-
-// Helper class for parsing framework import mappings and generating
-// import statements.
-class PROTOC_EXPORT ImportWriter {
- public:
- ImportWriter(const std::string& generate_for_named_framework,
- const std::string& named_framework_to_proto_path_mappings_path,
- const std::string& runtime_import_prefix,
- bool include_wkt_imports);
- ~ImportWriter();
-
- void AddFile(const FileDescriptor* file, const std::string& header_extension);
- void Print(io::Printer* printer) const;
-
- static void PrintRuntimeImports(io::Printer* printer,
- const std::vector<std::string>& header_to_import,
- const std::string& runtime_import_prefix,
- bool default_cpp_symbol = false);
-
- private:
- class ProtoFrameworkCollector : public LineConsumer {
- public:
- ProtoFrameworkCollector(std::map<std::string, std::string>* inout_proto_file_to_framework_name)
- : map_(inout_proto_file_to_framework_name) {}
-
- virtual bool ConsumeLine(const StringPiece& line, std::string* out_error) override;
-
- private:
- std::map<std::string, std::string>* map_;
- };
-
- void ParseFrameworkMappings();
-
- const std::string generate_for_named_framework_;
- const std::string named_framework_to_proto_path_mappings_path_;
- const std::string runtime_import_prefix_;
- const bool include_wkt_imports_;
- std::map<std::string, std::string> proto_file_to_framework_name_;
- bool need_to_parse_mapping_file_;
-
- std::vector<std::string> protobuf_imports_;
- std::vector<std::string> other_framework_imports_;
- std::vector<std::string> other_imports_;
-};
+// TODO(thomasvl) Move internal helpers in names.h back to here. Currently
+// the dependencies are too interwoven to easily split up.
} // namespace objectivec
} // namespace compiler
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_HELPERS_H__
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_helpers_unittest.cc b/src/google/protobuf/compiler/objectivec/objectivec_helpers_unittest.cc
index 7ae6a92..e6d0a7c 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_helpers_unittest.cc
+++ b/src/google/protobuf/compiler/objectivec/objectivec_helpers_unittest.cc
@@ -28,8 +28,8 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/compiler/objectivec/objectivec_helpers.h>
-#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
+#include "google/protobuf/compiler/objectivec/objectivec_helpers.h"
+#include "google/protobuf/io/zero_copy_stream_impl_lite.h"
#include <gtest/gtest.h>
namespace google {
@@ -101,10 +101,12 @@
// Long name so multiple decode ops are needed.
+ // clang-format off
input_for_decode =
"longFieldNameIsLooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong1000";
desired_output_for_decode =
"long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_1000";
+ // clang-format on
expected = std::string("\x04\xA5\xA4\xA2\xBF\x1F\x0E\x84\x0", 9);
result = TextFormatDecodeData::DecodeDataForString(input_for_decode,
desired_output_for_decode);
@@ -154,11 +156,13 @@
EXPECT_EQ(4, decode_data.num_entries());
uint8_t expected_data[] = {
+ // clang-format off
0x4,
0x1, 0x0, 'z', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'I', 'J', 0x0,
0x3, 0x0, 'a', 'b', 'c', 'd', 'e', 'z', 'g', 'h', 'I', 'J', 0x0,
0x2, 0x0, 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'I', 0x0,
0x4, 0x0, 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'I', 'J', 'z', 0x0,
+ // clang-format on
};
std::string expected((const char*)expected_data, sizeof(expected_data));
@@ -172,12 +176,15 @@
decode_data.AddString(3, "abcdefghIJ", "_AbcdefghIJ");
decode_data.AddString(2, "abcdefghIJ", "Abcd_EfghIJ");
decode_data.AddString(4, "abcdefghIJ", "ABCD__EfghI_j");
+ // clang-format off
decode_data.AddString(1000,
"longFieldNameIsLooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong1000",
"long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_1000");
+ // clang-format on
EXPECT_EQ(5, decode_data.num_entries());
+ // clang-format off
uint8_t expected_data[] = {
0x5,
// All as is (00 op)
@@ -196,6 +203,7 @@
// underscore, as is + 3 (00 op)
0xE8, 0x07, 0x04, 0xA5, 0xA4, 0xA2, 0xBF, 0x1F, 0x0E, 0x84, 0x0,
};
+ // clang-format on
std::string expected((const char*)expected_data, sizeof(expected_data));
EXPECT_EQ(expected, decode_data.Data());
@@ -244,12 +252,12 @@
class TestLineCollector : public LineConsumer {
public:
- TestLineCollector(std::vector<std::string>* inout_lines,
+ explicit TestLineCollector(std::vector<std::string>* inout_lines,
const std::string* reject_line = nullptr,
bool skip_msg = false)
: lines_(inout_lines), reject_(reject_line), skip_msg_(skip_msg) {}
- bool ConsumeLine(const StringPiece& line, std::string* out_error) override {
+ bool ConsumeLine(const absl::string_view& line, std::string* out_error) override {
if (reject_ && *reject_ == line) {
if (!skip_msg_) {
*out_error = std::string("Rejected '") + *reject_ + "'";
@@ -269,7 +277,7 @@
};
const int kBlockSizes[] = {-1, 1, 2, 5, 64};
-const int kBlockSizeCount = GOOGLE_ARRAYSIZE(kBlockSizes);
+const int kBlockSizeCount = ABSL_ARRAYSIZE(kBlockSizes);
TEST(ObjCHelper, ParseSimple_BasicsSuccess) {
const std::vector<std::pair<std::string, std::vector<std::string>>> tests = {
@@ -340,7 +348,7 @@
TestLineCollector collector(nullptr, &std::get<1>(test));
EXPECT_FALSE(ParseSimpleStream(input, "dummy", &collector, &err_str));
std::string expected_err =
- StrCat("error: dummy Line ", std::get<2>(test), ", Rejected '", std::get<1>(test), "'");
+ absl::StrCat("error: dummy Line ", std::get<2>(test), ", Rejected '", std::get<1>(test), "'");
EXPECT_EQ(err_str, expected_err);
}
}
@@ -362,13 +370,97 @@
TestLineCollector collector(nullptr, &std::get<1>(test), true /* skip msg */);
EXPECT_FALSE(ParseSimpleStream(input, "dummy", &collector, &err_str));
std::string expected_err =
- StrCat("error: dummy Line ", std::get<2>(test),
+ absl::StrCat("error: dummy Line ", std::get<2>(test),
", ConsumeLine failed without setting an error.");
EXPECT_EQ(err_str, expected_err);
}
}
}
+TEST(ObjCHelper, IsRetainedName) {
+ EXPECT_TRUE(IsRetainedName("new"));
+ EXPECT_TRUE(IsRetainedName("alloc"));
+ EXPECT_TRUE(IsRetainedName("copy"));
+ EXPECT_TRUE(IsRetainedName("mutableCopy"));
+ EXPECT_TRUE(IsRetainedName("newFoo"));
+ EXPECT_TRUE(IsRetainedName("allocFoo"));
+ EXPECT_TRUE(IsRetainedName("copyFoo"));
+ EXPECT_TRUE(IsRetainedName("mutableCopyFoo"));
+ EXPECT_TRUE(IsRetainedName("new_foo"));
+ EXPECT_TRUE(IsRetainedName("alloc_foo"));
+ EXPECT_TRUE(IsRetainedName("copy_foo"));
+ EXPECT_TRUE(IsRetainedName("mutableCopy_foo"));
+
+ EXPECT_FALSE(IsRetainedName(""));
+ EXPECT_FALSE(IsRetainedName("ne"));
+ EXPECT_FALSE(IsRetainedName("all"));
+ EXPECT_FALSE(IsRetainedName("co"));
+ EXPECT_FALSE(IsRetainedName("mutable"));
+ EXPECT_FALSE(IsRetainedName("New"));
+ EXPECT_FALSE(IsRetainedName("Alloc"));
+ EXPECT_FALSE(IsRetainedName("Copy"));
+ EXPECT_FALSE(IsRetainedName("MutableCopy"));
+ EXPECT_FALSE(IsRetainedName("newer"));
+ EXPECT_FALSE(IsRetainedName("alloced"));
+ EXPECT_FALSE(IsRetainedName("copying"));
+ EXPECT_FALSE(IsRetainedName("mutableCopying"));
+
+ EXPECT_FALSE(IsRetainedName("init"));
+ EXPECT_FALSE(IsRetainedName("Create"));
+ EXPECT_FALSE(IsRetainedName("Copy"));
+}
+
+TEST(ObjCHelper, IsInitName) {
+ EXPECT_TRUE(IsInitName("init"));
+ EXPECT_TRUE(IsInitName("initFoo"));
+ EXPECT_TRUE(IsInitName("init_foo"));
+
+ EXPECT_FALSE(IsInitName(""));
+ EXPECT_FALSE(IsInitName("in"));
+ EXPECT_FALSE(IsInitName("Init"));
+ EXPECT_FALSE(IsInitName("inIt"));
+ EXPECT_FALSE(IsInitName("initial"));
+ EXPECT_FALSE(IsInitName("initiAl"));
+ EXPECT_FALSE(IsInitName("fooInit"));
+ EXPECT_FALSE(IsInitName("foo_init"));
+
+ EXPECT_FALSE(IsInitName("new"));
+ EXPECT_FALSE(IsInitName("alloc"));
+ EXPECT_FALSE(IsInitName("copy"));
+ EXPECT_FALSE(IsInitName("mutableCopy"));
+ EXPECT_FALSE(IsInitName("Create"));
+ EXPECT_FALSE(IsInitName("Copy"));
+}
+
+TEST(ObjCHelper, IsCreateName) {
+ EXPECT_TRUE(IsCreateName("Create"));
+ EXPECT_TRUE(IsCreateName("Copy"));
+ EXPECT_TRUE(IsCreateName("CreateFoo"));
+ EXPECT_TRUE(IsCreateName("CopyFoo"));
+ EXPECT_TRUE(IsCreateName("Create_foo"));
+ EXPECT_TRUE(IsCreateName("Copy_foo"));
+ EXPECT_TRUE(IsCreateName("ReCreate"));
+ EXPECT_TRUE(IsCreateName("ReCopy"));
+ EXPECT_TRUE(IsCreateName("FOOCreate"));
+ EXPECT_TRUE(IsCreateName("FOOCopy"));
+ EXPECT_TRUE(IsCreateName("CreateWithCopy"));
+
+ EXPECT_FALSE(IsCreateName(""));
+ EXPECT_FALSE(IsCreateName("Crea"));
+ EXPECT_FALSE(IsCreateName("Co"));
+ EXPECT_FALSE(IsCreateName("create"));
+ EXPECT_FALSE(IsCreateName("recreate"));
+ EXPECT_FALSE(IsCreateName("recopy"));
+ EXPECT_FALSE(IsCreateName("ReCreated"));
+ EXPECT_FALSE(IsCreateName("ReCopying"));
+
+ EXPECT_FALSE(IsCreateName("init"));
+ EXPECT_FALSE(IsCreateName("new"));
+ EXPECT_FALSE(IsCreateName("alloc"));
+ EXPECT_FALSE(IsCreateName("copy"));
+ EXPECT_TRUE(IsCreateName("mutableCopy"));
+}
+
// TODO(thomasvl): Should probably add some unittests for all the special cases
// of name mangling (class name, field name, enum names). Rather than doing
// this with an ObjC test in the objectivec directory, we should be able to
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_map_field.cc b/src/google/protobuf/compiler/objectivec/objectivec_map_field.cc
index 99d7581..087bd8f 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_map_field.cc
+++ b/src/google/protobuf/compiler/objectivec/objectivec_map_field.cc
@@ -31,9 +31,9 @@
#include <map>
#include <string>
-#include <google/protobuf/compiler/objectivec/objectivec_map_field.h>
-#include <google/protobuf/compiler/objectivec/objectivec_helpers.h>
-#include <google/protobuf/io/printer.h>
+#include "google/protobuf/compiler/objectivec/objectivec_map_field.h"
+#include "google/protobuf/compiler/objectivec/objectivec_helpers.h"
+#include "google/protobuf/io/printer.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_map_field.h b/src/google/protobuf/compiler/objectivec/objectivec_map_field.h
index d9aa387..20c538e 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_map_field.h
+++ b/src/google/protobuf/compiler/objectivec/objectivec_map_field.h
@@ -33,7 +33,8 @@
#include <map>
#include <string>
-#include <google/protobuf/compiler/objectivec/objectivec_field.h>
+
+#include "google/protobuf/compiler/objectivec/objectivec_field.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_message.cc b/src/google/protobuf/compiler/objectivec/objectivec_message.cc
index 4ebb75c..9816149 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_message.cc
+++ b/src/google/protobuf/compiler/objectivec/objectivec_message.cc
@@ -28,20 +28,19 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#include "google/protobuf/compiler/objectivec/objectivec_message.h"
+
#include <algorithm>
#include <iostream>
#include <sstream>
-#include <google/protobuf/compiler/objectivec/objectivec_message.h>
-#include <google/protobuf/compiler/objectivec/objectivec_enum.h>
-#include <google/protobuf/compiler/objectivec/objectivec_extension.h>
-#include <google/protobuf/compiler/objectivec/objectivec_helpers.h>
-#include <google/protobuf/stubs/stl_util.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/descriptor.pb.h>
+#include "absl/strings/escaping.h"
+#include "absl/strings/str_cat.h"
+#include "google/protobuf/compiler/objectivec/objectivec_enum.h"
+#include "google/protobuf/compiler/objectivec/objectivec_extension.h"
+#include "google/protobuf/compiler/objectivec/objectivec_helpers.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/io/printer.h"
namespace google {
namespace protobuf {
@@ -449,7 +448,7 @@
"typedef struct $classname$__storage_ {\n"
" uint32_t _has_storage_[$sizeof_has_storage$];\n",
"classname", class_name_,
- "sizeof_has_storage", StrCat(sizeof_has_storage));
+ "sizeof_has_storage", absl::StrCat(sizeof_has_storage));
printer->Indent();
for (int i = 0; i < descriptor_->field_count(); i++) {
@@ -558,7 +557,7 @@
printer->Print(
"\n \"$data$\"",
"data", EscapeTrigraphs(
- CEscape(text_format_data_str.substr(i, kBytesPerLine))));
+ absl::CEscape(text_format_data_str.substr(i, kBytesPerLine))));
}
printer->Print(
";\n"
@@ -570,8 +569,8 @@
" static const GPBExtensionRange ranges[] = {\n");
for (int i = 0; i < sorted_extensions.size(); i++) {
printer->Print(" { .start = $start$, .end = $end$ },\n",
- "start", StrCat(sorted_extensions[i]->start),
- "end", StrCat(sorted_extensions[i]->end));
+ "start", absl::StrCat(sorted_extensions[i]->start),
+ "end", absl::StrCat(sorted_extensions[i]->end));
}
printer->Print(
" };\n"
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_message.h b/src/google/protobuf/compiler/objectivec/objectivec_message.h
index 9d14430..641a518 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_message.h
+++ b/src/google/protobuf/compiler/objectivec/objectivec_message.h
@@ -34,10 +34,10 @@
#include <string>
#include <set>
#include <vector>
-#include <google/protobuf/compiler/objectivec/objectivec_field.h>
-#include <google/protobuf/compiler/objectivec/objectivec_oneof.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/io/printer.h>
+#include "google/protobuf/compiler/objectivec/objectivec_field.h"
+#include "google/protobuf/compiler/objectivec/objectivec_oneof.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/io/printer.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_message_field.cc b/src/google/protobuf/compiler/objectivec/objectivec_message_field.cc
index 2ff0b44..e889c6e 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_message_field.cc
+++ b/src/google/protobuf/compiler/objectivec/objectivec_message_field.cc
@@ -31,9 +31,9 @@
#include <map>
#include <string>
-#include <google/protobuf/compiler/objectivec/objectivec_message_field.h>
-#include <google/protobuf/compiler/objectivec/objectivec_helpers.h>
-#include <google/protobuf/io/printer.h>
+#include "google/protobuf/compiler/objectivec/objectivec_message_field.h"
+#include "google/protobuf/compiler/objectivec/objectivec_helpers.h"
+#include "google/protobuf/io/printer.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_message_field.h b/src/google/protobuf/compiler/objectivec/objectivec_message_field.h
index 49a84fb..19f23a2 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_message_field.h
+++ b/src/google/protobuf/compiler/objectivec/objectivec_message_field.h
@@ -33,7 +33,8 @@
#include <map>
#include <string>
-#include <google/protobuf/compiler/objectivec/objectivec_field.h>
+
+#include "google/protobuf/compiler/objectivec/objectivec_field.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_oneof.cc b/src/google/protobuf/compiler/objectivec/objectivec_oneof.cc
index 1bef293..279928b 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_oneof.cc
+++ b/src/google/protobuf/compiler/objectivec/objectivec_oneof.cc
@@ -28,13 +28,14 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#include "google/protobuf/compiler/objectivec/objectivec_oneof.h"
+
#include <map>
#include <string>
-#include <google/protobuf/compiler/objectivec/objectivec_oneof.h>
-#include <google/protobuf/compiler/objectivec/objectivec_helpers.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/stubs/strutil.h>
+#include "absl/strings/str_cat.h"
+#include "google/protobuf/compiler/objectivec/objectivec_helpers.h"
+#include "google/protobuf/io/printer.h"
namespace google {
namespace protobuf {
@@ -46,7 +47,7 @@
variables_["enum_name"] = OneofEnumName(descriptor_);
variables_["name"] = OneofName(descriptor_);
variables_["capitalized_name"] = OneofNameCapitalized(descriptor_);
- variables_["raw_index"] = StrCat(descriptor_->index());
+ variables_["raw_index"] = absl::StrCat(descriptor_->index());
const Descriptor* msg_descriptor = descriptor_->containing_type();
variables_["owning_message_class"] = ClassName(msg_descriptor);
@@ -65,7 +66,7 @@
void OneofGenerator::SetOneofIndexBase(int index_base) {
int index = descriptor_->index() + index_base;
// Flip the sign to mark it as a oneof.
- variables_["index"] = StrCat(-index);
+ variables_["index"] = absl::StrCat(-index);
}
void OneofGenerator::GenerateCaseEnum(io::Printer* printer) {
@@ -84,7 +85,7 @@
"$enum_name$_$field_name$ = $field_number$,\n",
"enum_name", enum_name,
"field_name", field_name,
- "field_number", StrCat(field->number()));
+ "field_number", absl::StrCat(field->number()));
}
printer->Outdent();
printer->Print(
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_oneof.h b/src/google/protobuf/compiler/objectivec/objectivec_oneof.h
index 034f07f..c89cdd9 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_oneof.h
+++ b/src/google/protobuf/compiler/objectivec/objectivec_oneof.h
@@ -31,11 +31,12 @@
#ifndef GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_ONEOF_H__
#define GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_ONEOF_H__
-#include <string>
#include <set>
+#include <string>
#include <vector>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/io/printer.h>
+
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/io/printer.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/stubs/statusor.cc b/src/google/protobuf/compiler/objectivec/objectivec_options.h
similarity index 70%
copy from src/google/protobuf/stubs/statusor.cc
copy to src/google/protobuf/compiler/objectivec/objectivec_options.h
index 9c0a178..07b90b3 100644
--- a/src/google/protobuf/stubs/statusor.cc
+++ b/src/google/protobuf/compiler/objectivec/objectivec_options.h
@@ -28,21 +28,29 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/stubs/statusor.h>
+#ifndef GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_OPTIONS_H__
+#define GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_OPTIONS_H__
-#include <google/protobuf/stubs/logging.h>
+#include <string>
namespace google {
namespace protobuf {
-namespace util {
-namespace statusor_internal {
+namespace compiler {
+namespace objectivec {
-void StatusOrHelper::Crash(const Status& status) {
- GOOGLE_LOG(FATAL) << "Attempting to fetch value instead of handling error "
- << status.ToString();
-}
+// Generation options, documented within objectivec_generator.cc.
+struct GenerationOptions {
+ std::string generate_for_named_framework;
+ std::string named_framework_to_proto_path_mappings_path;
+ std::string runtime_import_prefix;
+ // TODO(thomasvl): Eventually flip this default to false for better interop
+ // with Swift if proto usages span modules made from ObjC sources.
+ bool headers_use_forward_declarations = true;
+};
-} // namespace statusor_internal
-} // namespace util
+} // namespace objectivec
+} // namespace compiler
} // namespace protobuf
} // namespace google
+
+#endif // GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_OPTIONS_H__
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_primitive_field.cc b/src/google/protobuf/compiler/objectivec/objectivec_primitive_field.cc
index 1fefde5..c9339a5 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_primitive_field.cc
+++ b/src/google/protobuf/compiler/objectivec/objectivec_primitive_field.cc
@@ -28,13 +28,14 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#include "google/protobuf/compiler/objectivec/objectivec_primitive_field.h"
+
#include <map>
#include <string>
-#include <google/protobuf/compiler/objectivec/objectivec_helpers.h>
-#include <google/protobuf/compiler/objectivec/objectivec_primitive_field.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/stubs/strutil.h>
+#include "absl/strings/str_cat.h"
+#include "google/protobuf/compiler/objectivec/objectivec_helpers.h"
+#include "google/protobuf/io/printer.h"
namespace google {
namespace protobuf {
@@ -150,7 +151,7 @@
void PrimitiveFieldGenerator::SetExtraRuntimeHasBitsBase(int has_base) {
if (GetObjectiveCType(descriptor_) == OBJECTIVECTYPE_BOOLEAN) {
// Set into the offset the has bit to use for the actual value.
- variables_["storage_offset_value"] = StrCat(has_base);
+ variables_["storage_offset_value"] = absl::StrCat(has_base);
variables_["storage_offset_comment"] =
" // Stored in _has_storage_ to save space.";
}
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_primitive_field.h b/src/google/protobuf/compiler/objectivec/objectivec_primitive_field.h
index 06a1528..8948b48 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_primitive_field.h
+++ b/src/google/protobuf/compiler/objectivec/objectivec_primitive_field.h
@@ -31,7 +31,7 @@
#ifndef GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_PRIMITIVE_FIELD_H__
#define GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_PRIMITIVE_FIELD_H__
-#include <google/protobuf/compiler/objectivec/objectivec_field.h>
+#include "google/protobuf/compiler/objectivec/objectivec_field.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/compiler/parser.cc b/src/google/protobuf/compiler/parser.cc
index 5bd37d1..8a60bdb 100644
--- a/src/google/protobuf/compiler/parser.cc
+++ b/src/google/protobuf/compiler/parser.cc
@@ -34,34 +34,37 @@
//
// Recursive descent FTW.
-#include <google/protobuf/compiler/parser.h>
+#include "google/protobuf/compiler/parser.h"
#include <float.h>
#include <cstdint>
#include <limits>
+#include <tuple>
#include <unordered_map>
#include <unordered_set>
-#include <google/protobuf/stubs/casts.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/io/tokenizer.h>
-#include <google/protobuf/wire_format.h>
-#include <google/protobuf/stubs/map_util.h>
-#include <google/protobuf/stubs/hash.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "absl/base/casts.h"
+#include "absl/strings/ascii.h"
+#include "absl/strings/escaping.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/str_format.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/io/tokenizer.h"
+#include "google/protobuf/port.h"
+#include "google/protobuf/wire_format.h"
namespace google {
namespace protobuf {
namespace compiler {
-
-using internal::WireFormat;
-
namespace {
+using ::google::protobuf::internal::DownCast;
+
typedef std::unordered_map<std::string, FieldDescriptorProto::Type> TypeNameMap;
const TypeNameMap& GetTypeNameTable() {
@@ -286,6 +289,16 @@
}
}
+bool Parser::TryConsumeInteger64(uint64_t max_value, uint64_t* output) {
+ if (LookingAtType(io::Tokenizer::TYPE_INTEGER) &&
+ io::Tokenizer::ParseInteger(input_->current().text, max_value,
+ output)) {
+ input_->Next();
+ return true;
+ }
+ return false;
+}
+
bool Parser::ConsumeNumber(double* output, const char* error) {
if (LookingAtType(io::Tokenizer::TYPE_FLOAT)) {
*output = io::Tokenizer::ParseFloat(input_->current().text);
@@ -294,13 +307,19 @@
} else if (LookingAtType(io::Tokenizer::TYPE_INTEGER)) {
// Also accept integers.
uint64_t value = 0;
- if (!io::Tokenizer::ParseInteger(input_->current().text,
+ if (io::Tokenizer::ParseInteger(input_->current().text,
std::numeric_limits<uint64_t>::max(),
&value)) {
+ *output = value;
+ } else if (input_->current().text[0] == '0') {
+ // octal or hexadecimal; don't bother parsing as float
+ AddError("Integer out of range.");
+ // We still return true because we did, in fact, parse a number.
+ } else if (!io::Tokenizer::TryParseFloat(input_->current().text, output)) {
+ // out of int range, and not valid float? 🤷
AddError("Integer out of range.");
// We still return true because we did, in fact, parse a number.
}
- *output = value;
input_->Next();
return true;
} else if (LookingAt("inf")) {
@@ -387,13 +406,16 @@
AddError(input_->current().line, input_->current().column, error);
}
-void Parser::AddWarning(const std::string& warning) {
+void Parser::AddWarning(int line, int column, const std::string& warning) {
if (error_collector_ != nullptr) {
- error_collector_->AddWarning(input_->current().line,
- input_->current().column, warning);
+ error_collector_->AddWarning(line, column, warning);
}
}
+void Parser::AddWarning(const std::string& warning) {
+ AddWarning(input_->current().line, input_->current().column, warning);
+}
+
// -------------------------------------------------------------------
Parser::LocationRecorder::LocationRecorder(Parser* parser)
@@ -634,14 +656,17 @@
root_location.RecordLegacyLocation(file,
DescriptorPool::ErrorCollector::OTHER);
- if (require_syntax_identifier_ || LookingAt("syntax")) {
+ if (require_syntax_identifier_ || LookingAt("syntax")
+ ) {
if (!ParseSyntaxIdentifier(root_location)) {
// Don't attempt to parse the file if we didn't recognize the syntax
// identifier.
return false;
}
// Store the syntax into the file.
- if (file != nullptr) file->set_syntax(syntax_identifier_);
+ if (file != nullptr) {
+ file->set_syntax(syntax_identifier_);
+ }
} else if (!stop_after_syntax_identifier_) {
GOOGLE_LOG(WARNING) << "No syntax specified for the proto file: " << file->name()
<< ". Please use 'syntax = \"proto2\";' "
@@ -678,9 +703,10 @@
bool Parser::ParseSyntaxIdentifier(const LocationRecorder& parent) {
LocationRecorder syntax_location(parent,
FileDescriptorProto::kSyntaxFieldNumber);
- DO(Consume(
- "syntax",
- "File must begin with a syntax statement, e.g. 'syntax = \"proto2\";'."));
+ DO(Consume("syntax",
+ "File must begin with a syntax statement, e.g. 'syntax = "
+ "\"proto2\";'."));
+
DO(Consume("="));
io::Tokenizer::Token syntax_token = input_->current();
std::string syntax;
@@ -688,7 +714,6 @@
DO(ConsumeEndOfDeclaration(";", &syntax_location));
syntax_identifier_ = syntax;
-
if (syntax != "proto2" && syntax != "proto3" &&
!stop_after_syntax_identifier_) {
AddError(syntax_token.line, syntax_token.column,
@@ -1084,7 +1109,7 @@
AddError(name_token.line, name_token.column,
"Group names must start with a capital letter.");
}
- LowerString(field->mutable_name());
+ absl::AsciiStrToLower(field->mutable_name());
field->set_type_name(group->name());
if (LookingAt("{")) {
@@ -1283,7 +1308,7 @@
DO(ConsumeInteger64(max_value, &value,
"Expected integer for field default value."));
// And stringify it again.
- default_value->append(StrCat(value));
+ default_value->append(absl::StrCat(value));
break;
}
@@ -1306,7 +1331,7 @@
DO(ConsumeInteger64(max_value, &value,
"Expected integer for field default value."));
// And stringify it again.
- default_value->append(StrCat(value));
+ default_value->append(absl::StrCat(value));
break;
}
@@ -1346,7 +1371,7 @@
case FieldDescriptorProto::TYPE_BYTES:
DO(ConsumeString(default_value, "Expected string."));
- *default_value = CEscape(*default_value);
+ *default_value = absl::CEscape(*default_value);
break;
case FieldDescriptorProto::TYPE_ENUM:
@@ -1474,7 +1499,7 @@
}
UninterpretedOption* uninterpreted_option =
- down_cast<UninterpretedOption*>(options->GetReflection()->AddMessage(
+ DownCast<UninterpretedOption*>(options->GetReflection()->AddMessage(
options, uninterpreted_option_field));
// Parse dot-separated name.
@@ -1546,18 +1571,20 @@
is_negative
? static_cast<uint64_t>(std::numeric_limits<int64_t>::max()) + 1
: std::numeric_limits<uint64_t>::max();
- DO(ConsumeInteger64(max_value, &value, "Expected integer."));
- if (is_negative) {
- value_location.AddPath(
- UninterpretedOption::kNegativeIntValueFieldNumber);
- uninterpreted_option->set_negative_int_value(
- static_cast<int64_t>(0 - value));
- } else {
- value_location.AddPath(
- UninterpretedOption::kPositiveIntValueFieldNumber);
- uninterpreted_option->set_positive_int_value(value);
+ if (TryConsumeInteger64(max_value, &value)) {
+ if (is_negative) {
+ value_location.AddPath(
+ UninterpretedOption::kNegativeIntValueFieldNumber);
+ uninterpreted_option->set_negative_int_value(
+ static_cast<int64_t>(0 - value));
+ } else {
+ value_location.AddPath(
+ UninterpretedOption::kPositiveIntValueFieldNumber);
+ uninterpreted_option->set_positive_int_value(value);
+ }
+ break;
}
- break;
+ // value too large for an integer; fall through below to treat as floating point
}
case io::Tokenizer::TYPE_FLOAT: {
@@ -1723,11 +1750,23 @@
}
}
+bool Parser::ParseReservedName(std::string* name, const char* error_message) {
+ // Capture the position of the token, in case we have to report an
+ // error after it is consumed.
+ int line = input_->current().line;
+ int col = input_->current().column;
+ DO(ConsumeString(name, error_message));
+ if (!io::Tokenizer::IsIdentifier(*name)) {
+ AddWarning(line, col, absl::StrFormat("Reserved name \"%s\" is not a valid identifier.", *name));
+ }
+ return true;
+}
+
bool Parser::ParseReservedNames(DescriptorProto* message,
const LocationRecorder& parent_location) {
do {
LocationRecorder location(parent_location, message->reserved_name_size());
- DO(ConsumeString(message->add_reserved_name(), "Expected field name."));
+ DO(ParseReservedName(message->add_reserved_name(), "Expected field name."));
} while (TryConsume(","));
DO(ConsumeEndOfDeclaration(";", &parent_location));
return true;
@@ -1782,42 +1821,42 @@
return true;
}
-bool Parser::ParseReserved(EnumDescriptorProto* message,
- const LocationRecorder& message_location) {
+bool Parser::ParseReserved(EnumDescriptorProto* proto,
+ const LocationRecorder& enum_location) {
io::Tokenizer::Token start_token = input_->current();
// Parse the declaration.
DO(Consume("reserved"));
if (LookingAtType(io::Tokenizer::TYPE_STRING)) {
- LocationRecorder location(message_location,
+ LocationRecorder location(enum_location,
EnumDescriptorProto::kReservedNameFieldNumber);
location.StartAt(start_token);
- return ParseReservedNames(message, location);
+ return ParseReservedNames(proto, location);
} else {
- LocationRecorder location(message_location,
+ LocationRecorder location(enum_location,
EnumDescriptorProto::kReservedRangeFieldNumber);
location.StartAt(start_token);
- return ParseReservedNumbers(message, location);
+ return ParseReservedNumbers(proto, location);
}
}
-bool Parser::ParseReservedNames(EnumDescriptorProto* message,
+bool Parser::ParseReservedNames(EnumDescriptorProto* proto,
const LocationRecorder& parent_location) {
do {
- LocationRecorder location(parent_location, message->reserved_name_size());
- DO(ConsumeString(message->add_reserved_name(), "Expected enum value."));
+ LocationRecorder location(parent_location, proto->reserved_name_size());
+ DO(ParseReservedName(proto->add_reserved_name(), "Expected enum value."));
} while (TryConsume(","));
DO(ConsumeEndOfDeclaration(";", &parent_location));
return true;
}
-bool Parser::ParseReservedNumbers(EnumDescriptorProto* message,
+bool Parser::ParseReservedNumbers(EnumDescriptorProto* proto,
const LocationRecorder& parent_location) {
bool first = true;
do {
- LocationRecorder location(parent_location, message->reserved_range_size());
+ LocationRecorder location(parent_location, proto->reserved_range_size());
EnumDescriptorProto::EnumReservedRange* range =
- message->add_reserved_range();
+ proto->add_reserved_range();
int start, end;
io::Tokenizer::Token start_token;
{
@@ -2395,33 +2434,27 @@
const Message* descriptor,
DescriptorPool::ErrorCollector::ErrorLocation location, int* line,
int* column) const {
- const std::pair<int, int>* result =
- FindOrNull(location_map_, std::make_pair(descriptor, location));
- if (result == nullptr) {
+ auto it = location_map_.find({descriptor, location});
+ if (it == location_map_.end()) {
*line = -1;
*column = 0;
return false;
- } else {
- *line = result->first;
- *column = result->second;
- return true;
}
+ std::tie(*line, *column) = it->second;
+ return true;
}
bool SourceLocationTable::FindImport(const Message* descriptor,
const std::string& name, int* line,
int* column) const {
- const std::pair<int, int>* result =
- FindOrNull(import_location_map_, std::make_pair(descriptor, name));
- if (result == nullptr) {
+ auto it = import_location_map_.find({descriptor, name});
+ if (it == import_location_map_.end()) {
*line = -1;
*column = 0;
return false;
- } else {
- *line = result->first;
- *column = result->second;
- return true;
}
+ std::tie(*line, *column) = it->second;
+ return true;
}
void SourceLocationTable::Add(
diff --git a/src/google/protobuf/compiler/parser.h b/src/google/protobuf/compiler/parser.h
index d4eb763..cac3855 100644
--- a/src/google/protobuf/compiler/parser.h
+++ b/src/google/protobuf/compiler/parser.h
@@ -42,13 +42,13 @@
#include <string>
#include <utility>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/io/tokenizer.h>
-#include <google/protobuf/repeated_field.h>
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/io/tokenizer.h"
+#include "google/protobuf/repeated_field.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -71,6 +71,8 @@
class PROTOBUF_EXPORT Parser {
public:
Parser();
+ Parser(const Parser&) = delete;
+ Parser& operator=(const Parser&) = delete;
~Parser();
// Parse the entire input and construct a FileDescriptorProto representing
@@ -178,6 +180,9 @@
// is greater than max_value, an error will be reported.
bool ConsumeInteger64(uint64_t max_value, uint64_t* output,
const char* error);
+ // Try to consume a 64-bit integer and store its value in "output". No
+ // error is reported on failure, allowing caller to consume token another way.
+ bool TryConsumeInteger64(uint64_t max_value, uint64_t* output);
// Consume a number and store its value in "output". This will accept
// tokens of either INTEGER or FLOAT type.
bool ConsumeNumber(double* output, const char* error);
@@ -211,6 +216,9 @@
// of the current token.
void AddError(const std::string& error);
+ // Invokes error_collector_->AddWarning(), if error_collector_ is not NULL.
+ void AddWarning(int line, int column, const std::string& warning);
+
// Invokes error_collector_->AddWarning() with the line and column number
// of the current token.
void AddWarning(const std::string& warning);
@@ -392,6 +400,7 @@
const LocationRecorder& message_location);
bool ParseReservedNames(DescriptorProto* message,
const LocationRecorder& parent_location);
+ bool ParseReservedName(std::string* name, const char* error_message);
bool ParseReservedNumbers(DescriptorProto* message,
const LocationRecorder& parent_location);
bool ParseReserved(EnumDescriptorProto* message,
@@ -545,8 +554,6 @@
// the next element (See SourceCodeInfo.Location in descriptor.proto), when
// ConsumeEndOfDeclaration() is called.
std::vector<std::string> upcoming_detached_comments_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Parser);
};
// A table mapping (descriptor, ErrorLocation) pairs -- as reported by
@@ -597,6 +604,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_COMPILER_PARSER_H__
diff --git a/src/google/protobuf/compiler/parser_unittest.cc b/src/google/protobuf/compiler/parser_unittest.cc
index 2d681d9..8260721 100644
--- a/src/google/protobuf/compiler/parser_unittest.cc
+++ b/src/google/protobuf/compiler/parser_unittest.cc
@@ -32,26 +32,26 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/compiler/parser.h>
+#include "google/protobuf/compiler/parser.h"
#include <algorithm>
#include <map>
#include <memory>
#include <vector>
-#include <google/protobuf/test_util2.h>
-#include <google/protobuf/unittest.pb.h>
-#include <google/protobuf/any.pb.h>
-#include <google/protobuf/unittest_custom_options.pb.h>
-#include <google/protobuf/io/tokenizer.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/text_format.h>
-#include <google/protobuf/wire_format.h>
-#include <google/protobuf/testing/googletest.h>
+#include "google/protobuf/test_util2.h"
+#include "google/protobuf/unittest.pb.h"
+#include "google/protobuf/any.pb.h"
+#include "google/protobuf/unittest_custom_options.pb.h"
+#include "google/protobuf/io/tokenizer.h"
+#include "google/protobuf/io/zero_copy_stream_impl.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/text_format.h"
+#include "google/protobuf/wire_format.h"
+#include "google/protobuf/testing/googletest.h"
#include <gtest/gtest.h>
-#include <google/protobuf/stubs/substitute.h>
-#include <google/protobuf/stubs/map_util.h>
+#include "absl/strings/str_join.h"
+#include "absl/strings/substitute.h"
namespace google {
namespace protobuf {
@@ -69,11 +69,11 @@
// implements ErrorCollector ---------------------------------------
void AddWarning(int line, int column, const std::string& message) override {
- strings::SubstituteAndAppend(&warning_, "$0:$1: $2\n", line, column, message);
+ absl::SubstituteAndAppend(&warning_, "$0:$1: $2\n", line, column, message);
}
void AddError(int line, int column, const std::string& message) override {
- strings::SubstituteAndAppend(&text_, "$0:$1: $2\n", line, column, message);
+ absl::SubstituteAndAppend(&text_, "$0:$1: $2\n", line, column, message);
}
};
@@ -147,6 +147,16 @@
EXPECT_EQ(io::Tokenizer::TYPE_END, input_->current().type);
}
+ // Parse the text and expect that the given warnings are reported.
+ void ExpectHasWarnings(const char* text, const char* expected_warnings) {
+ SetupParser(text);
+ FileDescriptorProto file;
+ ASSERT_TRUE(parser_->Parse(input_.get(), &file));
+ EXPECT_EQ(io::Tokenizer::TYPE_END, input_->current().type);
+ ASSERT_EQ("", error_collector_.text_);
+ EXPECT_EQ(expected_warnings, error_collector_.warning_);
+ }
+
// Same as above but does not expect that the parser parses the complete
// input.
void ExpectHasEarlyExitErrors(const char* text, const char* expected_errors) {
@@ -264,6 +274,7 @@
"song_name_1.") != std::string::npos);
}
+
// ===================================================================
typedef ParserTest ParseMessageTest;
@@ -591,6 +602,56 @@
"}");
}
+TEST_F(ParseMessageTest, FieldOptionsSupportLargeDecimalLiteral) {
+ // decimal integer literal > uint64 max
+ ExpectParsesTo(
+ "import \"google/protobuf/descriptor.proto\";\n"
+ "extend google.protobuf.FieldOptions {\n"
+ " optional double f = 10101;\n"
+ "}\n"
+ "message TestMessage {\n"
+ " optional double a = 1 [default = 18446744073709551616];\n"
+ " optional double b = 2 [default = -18446744073709551616];\n"
+ " optional double c = 3 [(f) = 18446744073709551616];\n"
+ " optional double d = 4 [(f) = -18446744073709551616];\n"
+ "}\n",
+
+ "dependency: \"google/protobuf/descriptor.proto\""
+ "extension {"
+ " name: \"f\" label: LABEL_OPTIONAL type: TYPE_DOUBLE number: 10101"
+ " extendee: \"google.protobuf.FieldOptions\""
+ "}"
+ "message_type {"
+ " name: \"TestMessage\""
+ " field {"
+ " name: \"a\" label: LABEL_OPTIONAL type: TYPE_DOUBLE number: 1"
+ " default_value: \"1.8446744073709552e+19\""
+ " }"
+ " field {"
+ " name: \"b\" label: LABEL_OPTIONAL type: TYPE_DOUBLE number: 2"
+ " default_value: \"-1.8446744073709552e+19\""
+ " }"
+ " field {"
+ " name: \"c\" label: LABEL_OPTIONAL type: TYPE_DOUBLE number: 3"
+ " options{"
+ " uninterpreted_option{"
+ " name{ name_part: \"f\" is_extension: true }"
+ " double_value: 1.8446744073709552e+19"
+ " }"
+ " }"
+ " }"
+ " field {"
+ " name: \"d\" label: LABEL_OPTIONAL type: TYPE_DOUBLE number: 4"
+ " options{"
+ " uninterpreted_option{"
+ " name{ name_part: \"f\" is_extension: true }"
+ " double_value: -1.8446744073709552e+19"
+ " }"
+ " }"
+ " }"
+ "}");
+}
+
TEST_F(ParseMessageTest, Oneof) {
ExpectParsesTo(
"message TestMessage {\n"
@@ -1674,6 +1735,17 @@
"2:11: Expected enum value or number range.\n");
}
+TEST_F(ParseErrorTest, EnumReservedInvalidIdentifier) {
+ ExpectHasWarnings(
+ R"pb(
+ enum TestEnum {
+ FOO = 1;
+ reserved "foo bar";
+ }
+ )pb",
+ "3:17: Reserved name \"foo bar\" is not a valid identifier.\n");
+}
+
// -------------------------------------------------------------------
// Reserved field number errors
@@ -1701,6 +1773,16 @@
"1:11: Expected field name or number range.\n");
}
+TEST_F(ParseErrorTest, ReservedInvalidIdentifier) {
+ ExpectHasWarnings(
+ R"pb(
+ message Foo {
+ reserved "foo bar";
+ }
+ )pb",
+ "2:17: Reserved name \"foo bar\" is not a valid identifier.\n");
+}
+
TEST_F(ParseErrorTest, ReservedNegativeNumber) {
ExpectHasErrors(
"message Foo {\n"
@@ -1890,6 +1972,22 @@
"2:32: Enum type \"Baz\" has no value named \"NO_SUCH_VALUE\".\n");
}
+TEST_F(ParserValidationErrorTest, FieldDefaultIntegerOutOfRange) {
+ ExpectHasErrors(
+ "message Foo {\n"
+ " optional double bar = 1 [default = 0x10000000000000000];\n"
+ "}\n",
+ "1:37: Integer out of range.\n");
+}
+
+TEST_F(ParserValidationErrorTest, FieldOptionOutOfRange) {
+ ExpectHasErrors(
+ "message Foo {\n"
+ " optional double bar = 1 [foo = 0x10000000000000000];\n"
+ "}\n",
+ "1:33: Integer out of range.\n");
+}
+
TEST_F(ParserValidationErrorTest, FileOptionNameError) {
ExpectHasValidationErrors(
"option foo = 5;",
@@ -2401,7 +2499,7 @@
const std::string debug_string =
descriptor->DebugStringWithOptions(debug_string_options);
- for (int i = 0; i < GOOGLE_ARRAYSIZE(expected_comments); ++i) {
+ for (int i = 0; i < ABSL_ARRAYSIZE(expected_comments); ++i) {
std::string::size_type found_pos =
debug_string.find(expected_comments[i]);
EXPECT_TRUE(found_pos != std::string::npos)
@@ -2677,8 +2775,8 @@
return true;
}
} else {
- std::pair<int, int> start_pos = FindOrDie(markers_, start_marker);
- std::pair<int, int> end_pos = FindOrDie(markers_, end_marker);
+ std::pair<int, int> start_pos = markers_.at(start_marker);
+ std::pair<int, int> end_pos = markers_.at(end_marker);
RepeatedField<int> expected_span;
expected_span.Add(start_pos.first);
@@ -2709,7 +2807,7 @@
} else {
EXPECT_EQ(
expected_leading_detached_comments,
- Join(iter->second->leading_detached_comments(), "\n"));
+ absl::StrJoin(iter->second->leading_detached_comments(), "\n"));
}
spans_.erase(iter);
diff --git a/src/google/protobuf/compiler/php/BUILD.bazel b/src/google/protobuf/compiler/php/BUILD.bazel
new file mode 100644
index 0000000..3f8376f
--- /dev/null
+++ b/src/google/protobuf/compiler/php/BUILD.bazel
@@ -0,0 +1,59 @@
+################################################################################
+# Protocol Buffers Compiler - PHP code generator
+################################################################################
+
+load("@rules_cc//cc:defs.bzl", "cc_library")
+load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
+load("//build_defs:cpp_opts.bzl", "COPTS")
+
+cc_library(
+ name = "names",
+ hdrs = ["names.h"],
+ srcs = ["names.cc"],
+ copts = COPTS,
+ include_prefix = "google/protobuf/compiler/php",
+ visibility = ["//visibility:public"],
+ deps = [
+ "//src/google/protobuf:protobuf_nowkt",
+ "//src/google/protobuf/compiler:code_generator",
+ "@com_google_absl//absl/strings",
+ ],
+)
+
+cc_library(
+ name = "php",
+ srcs = ["php_generator.cc"],
+ hdrs = ["php_generator.h"],
+ copts = COPTS,
+ include_prefix = "google/protobuf/compiler/php",
+ visibility = [
+ "//pkg:__pkg__",
+ "//src/google/protobuf/compiler:__pkg__",
+ ],
+ deps = [
+ ":names",
+ "//src/google/protobuf:protobuf_nowkt",
+ "//src/google/protobuf/compiler:code_generator",
+ "@com_google_absl//absl/strings",
+ ],
+)
+
+################################################################################
+# Distribution packaging
+################################################################################
+
+pkg_files(
+ name = "dist_files",
+ srcs = glob(["**/*"]),
+ strip_prefix = strip_prefix.from_root(""),
+ visibility = ["//src:__pkg__"],
+)
+
+filegroup(
+ name = "test_srcs",
+ srcs = glob([
+ "*_test.cc",
+ "*unittest.cc",
+ ]),
+ visibility = ["//src/google/protobuf/compiler:__pkg__"],
+)
diff --git a/src/google/protobuf/compiler/php/names.cc b/src/google/protobuf/compiler/php/names.cc
new file mode 100644
index 0000000..20e169e
--- /dev/null
+++ b/src/google/protobuf/compiler/php/names.cc
@@ -0,0 +1,144 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "google/protobuf/compiler/php/names.h"
+
+#include <string>
+
+#include "google/protobuf/compiler/code_generator.h"
+#include "google/protobuf/compiler/plugin.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/descriptor.pb.h"
+
+const char* const kReservedNames[] = {
+ "abstract", "and", "array", "as", "break",
+ "callable", "case", "catch", "class", "clone",
+ "const", "continue", "declare", "default", "die",
+ "do", "echo", "else", "elseif", "empty",
+ "enddeclare", "endfor", "endforeach", "endif", "endswitch",
+ "endwhile", "eval", "exit", "extends", "final",
+ "finally", "fn", "for", "foreach", "function",
+ "global", "goto", "if", "implements", "include",
+ "include_once", "instanceof", "insteadof", "interface", "isset",
+ "list", "match", "namespace", "new", "or",
+ "parent", "print", "private", "protected", "public",
+ "readonly", "require", "require_once", "return", "self",
+ "static", "switch", "throw", "trait", "try",
+ "unset", "use", "var", "while", "xor",
+ "yield", "int", "float", "bool", "string",
+ "true", "false", "null", "void", "iterable"};
+const int kReservedNamesSize = 80;
+
+namespace google {
+namespace protobuf {
+namespace compiler {
+namespace php {
+
+bool IsReservedName(absl::string_view name) {
+ std::string lower(name);
+ std::transform(lower.begin(), lower.end(), lower.begin(), ::tolower);
+ for (int i = 0; i < kReservedNamesSize; i++) {
+ if (lower == kReservedNames[i]) {
+ return true;
+ }
+ }
+ return false;
+}
+
+std::string ReservedNamePrefix(const std::string& classname,
+ const FileDescriptor* file) {
+ if (IsReservedName(classname)) {
+ if (file->package() == "google.protobuf") {
+ return "GPB";
+ } else {
+ return "PB";
+ }
+ }
+
+ return "";
+}
+
+namespace {
+
+template <typename DescriptorType>
+std::string ClassNamePrefixImpl(const std::string& classname,
+ const DescriptorType* desc) {
+ const std::string& prefix = (desc->file()->options()).php_class_prefix();
+ if (!prefix.empty()) {
+ return prefix;
+ }
+
+ return ReservedNamePrefix(classname, desc->file());
+}
+
+template <typename DescriptorType>
+std::string GeneratedClassNameImpl(const DescriptorType* desc) {
+ std::string classname = ClassNamePrefixImpl(desc->name(), desc) + desc->name();
+ const Descriptor* containing = desc->containing_type();
+ while (containing != NULL) {
+ classname = ClassNamePrefixImpl(containing->name(), desc) + containing->name()
+ + '\\' + classname;
+ containing = containing->containing_type();
+ }
+ return classname;
+}
+
+std::string GeneratedClassNameImpl(const ServiceDescriptor* desc) {
+ std::string classname = desc->name();
+ return ClassNamePrefixImpl(classname, desc) + classname;
+}
+
+} // namespace
+
+std::string ClassNamePrefix(const std::string& classname,
+ const Descriptor* desc) {
+ return ClassNamePrefixImpl(classname, desc);
+}
+std::string ClassNamePrefix(const std::string& classname,
+ const EnumDescriptor* desc) {
+ return ClassNamePrefixImpl(classname, desc);
+}
+
+std::string GeneratedClassName(const Descriptor* desc) {
+ return GeneratedClassNameImpl(desc);
+}
+
+std::string GeneratedClassName(const EnumDescriptor* desc) {
+ return GeneratedClassNameImpl(desc);
+}
+
+std::string GeneratedClassName(const ServiceDescriptor* desc) {
+ return GeneratedClassNameImpl(desc);
+}
+
+} // namespace php
+} // namespace compiler
+} // namespace protobuf
+} // namespace google
diff --git a/src/google/protobuf/compiler/php/names.h b/src/google/protobuf/compiler/php/names.h
new file mode 100644
index 0000000..cf4f942
--- /dev/null
+++ b/src/google/protobuf/compiler/php/names.h
@@ -0,0 +1,73 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef GOOGLE_PROTOBUF_COMPILER_PHP_NAMES_H__
+#define GOOGLE_PROTOBUF_COMPILER_PHP_NAMES_H__
+
+#include "google/protobuf/descriptor.h"
+
+#include <string>
+
+#include "absl/strings/string_view.h"
+#include "google/protobuf/port_def.inc"
+
+namespace google {
+namespace protobuf {
+namespace compiler {
+namespace php {
+
+// Whether or not a name is reserved.
+PROTOC_EXPORT bool IsReservedName(absl::string_view name);
+
+// A prefix to stick in front of reserved names to avoid clashes.
+PROTOC_EXPORT std::string ReservedNamePrefix(const std::string& classname,
+ const FileDescriptor* file);
+
+// A prefix to stick in front of all class names.
+PROTOC_EXPORT std::string ClassNamePrefix(const std::string& classname,
+ const Descriptor* desc);
+PROTOC_EXPORT std::string ClassNamePrefix(const std::string& classname,
+ const EnumDescriptor* desc);
+
+// To skip reserved keywords in php, some generated classname are prefixed.
+// Other code generators may need following API to figure out the actual
+// classname.
+PROTOC_EXPORT std::string GeneratedClassName(const Descriptor* desc);
+PROTOC_EXPORT std::string GeneratedClassName(const EnumDescriptor* desc);
+PROTOC_EXPORT std::string GeneratedClassName(const ServiceDescriptor* desc);
+
+} // namespace php
+} // namespace compiler
+} // namespace protobuf
+} // namespace google
+
+#include "google/protobuf/port_undef.inc"
+
+#endif // GOOGLE_PROTOBUF_COMPILER_PHP_NAMES_H__
diff --git a/src/google/protobuf/compiler/php/php_generator.cc b/src/google/protobuf/compiler/php/php_generator.cc
index f3aa92f..2903c3d 100644
--- a/src/google/protobuf/compiler/php/php_generator.cc
+++ b/src/google/protobuf/compiler/php/php_generator.cc
@@ -28,18 +28,21 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/compiler/php/php_generator.h>
-
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/compiler/plugin.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/stubs/strutil.h>
+#include "google/protobuf/compiler/php/php_generator.h"
#include <sstream>
+#include "google/protobuf/compiler/code_generator.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "absl/strings/ascii.h"
+#include "absl/strings/escaping.h"
+#include "absl/strings/str_replace.h"
+#include "absl/strings/str_split.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/io/zero_copy_stream.h"
+
const std::string kDescriptorFile = "google/protobuf/descriptor.proto";
const std::string kEmptyFile = "google/protobuf/empty.proto";
const std::string kEmptyMetadataFile = "GPBMetadata/Google/Protobuf/GPBEmpty.php";
@@ -47,29 +50,11 @@
"GPBMetadata/Google/Protobuf/Internal/Descriptor.php";
const std::string kDescriptorDirName = "Google/Protobuf/Internal";
const std::string kDescriptorPackageName = "Google\\Protobuf\\Internal";
-const char* const kReservedNames[] = {
- "abstract", "and", "array", "as", "break",
- "callable", "case", "catch", "class", "clone",
- "const", "continue", "declare", "default", "die",
- "do", "echo", "else", "elseif", "empty",
- "enddeclare", "endfor", "endforeach", "endif", "endswitch",
- "endwhile", "eval", "exit", "extends", "final",
- "finally", "fn", "for", "foreach", "function",
- "global", "goto", "if", "implements", "include",
- "include_once", "instanceof", "insteadof", "interface", "isset",
- "list", "match", "namespace", "new", "or",
- "parent", "print", "private", "protected", "public",
- "readonly", "require", "require_once", "return", "self",
- "static", "switch", "throw", "trait", "try",
- "unset", "use", "var", "while", "xor",
- "yield", "int", "float", "bool", "string",
- "true", "false", "null", "void", "iterable"};
const char* const kValidConstantNames[] = {
"int", "float", "bool", "string", "true",
"false", "null", "void", "iterable", "parent",
"self", "readonly"
};
-const int kReservedNamesSize = 80;
const int kValidConstantNamesSize = 12;
const int kFieldSetter = 1;
const int kFieldGetter = 2;
@@ -121,36 +106,10 @@
void GenerateServiceMethodDocComment(io::Printer* printer,
const MethodDescriptor* method);
-std::string ReservedNamePrefix(const std::string& classname,
- const FileDescriptor* file) {
- bool is_reserved = false;
-
- std::string lower = classname;
- std::transform(lower.begin(), lower.end(), lower.begin(), ::tolower);
-
- for (int i = 0; i < kReservedNamesSize; i++) {
- if (lower == kReservedNames[i]) {
- is_reserved = true;
- break;
- }
- }
-
- if (is_reserved) {
- if (file->package() == "google.protobuf") {
- return "GPB";
- } else {
- return "PB";
- }
- }
-
- return "";
-}
-
template <typename DescriptorType>
std::string DescriptorFullName(const DescriptorType* desc, bool is_internal) {
if (is_internal) {
- return StringReplace(desc->full_name(),
- "google.protobuf",
+ return StringReplace(desc->full_name(), "google.protobuf",
"google.protobuf.internal", false);
} else {
return desc->full_name();
@@ -158,34 +117,6 @@
}
template <typename DescriptorType>
-std::string ClassNamePrefix(const std::string& classname,
- const DescriptorType* desc) {
- const std::string& prefix = (desc->file()->options()).php_class_prefix();
- if (!prefix.empty()) {
- return prefix;
- }
-
- return ReservedNamePrefix(classname, desc->file());
-}
-
-template <typename DescriptorType>
-std::string GeneratedClassNameImpl(const DescriptorType* desc) {
- std::string classname = ClassNamePrefix(desc->name(), desc) + desc->name();
- const Descriptor* containing = desc->containing_type();
- while (containing != NULL) {
- classname = ClassNamePrefix(containing->name(), desc) + containing->name()
- + '\\' + classname;
- containing = containing->containing_type();
- }
- return classname;
-}
-
-std::string GeneratedClassNameImpl(const ServiceDescriptor* desc) {
- std::string classname = desc->name();
- return ClassNamePrefix(classname, desc) + classname;
-}
-
-template <typename DescriptorType>
std::string LegacyGeneratedClassName(const DescriptorType* desc) {
std::string classname = desc->name();
const Descriptor* containing = desc->containing_type();
@@ -196,31 +127,13 @@
return ClassNamePrefix(classname, desc) + classname;
}
-std::string ClassNamePrefix(const std::string& classname) {
- std::string lower = classname;
- std::transform(lower.begin(), lower.end(), lower.begin(), ::tolower);
-
- for (int i = 0; i < kReservedNamesSize; i++) {
- if (lower == kReservedNames[i]) {
- return "PB";
- }
- }
-
- return "";
-}
-
std::string ConstantNamePrefix(const std::string& classname) {
bool is_reserved = false;
std::string lower = classname;
std::transform(lower.begin(), lower.end(), lower.begin(), ::tolower);
- for (int i = 0; i < kReservedNamesSize; i++) {
- if (lower == kReservedNames[i]) {
- is_reserved = true;
- break;
- }
- }
+ is_reserved = IsReservedName(lower);
for (int i = 0; i < kValidConstantNamesSize; i++) {
if (lower == kValidConstantNames[i]) {
@@ -255,7 +168,7 @@
template <typename DescriptorType>
std::string FullClassName(const DescriptorType* desc, const Options& options) {
- std::string classname = GeneratedClassNameImpl(desc);
+ std::string classname = GeneratedClassName(desc);
std::string php_namespace = RootPhpNamespace(desc, options);
if (!php_namespace.empty()) {
return php_namespace + "\\" + classname;
@@ -281,6 +194,11 @@
return classname;
}
+std::string PhpNamePrefix(const std::string& classname) {
+ if (IsReservedName(classname)) return "PB";
+ return "";
+}
+
std::string PhpName(const std::string& full_name, const Options& options) {
if (options.is_descriptor) {
return kDescriptorPackageName;
@@ -294,7 +212,7 @@
segment += full_name[i] + ('A' - 'a');
cap_next_letter = false;
} else if (full_name[i] == '.') {
- result += ClassNamePrefix(segment) + segment + '\\';
+ result += PhpNamePrefix(segment) + segment + '\\';
segment = "";
cap_next_letter = true;
} else {
@@ -302,7 +220,7 @@
cap_next_letter = false;
}
}
- result += ClassNamePrefix(segment) + segment;
+ result += PhpNamePrefix(segment) + segment;
return result;
}
@@ -334,7 +252,7 @@
const Options& options) {
const std::string& proto_file = file->name();
int start_index = 0;
- int first_index = proto_file.find_first_of("/", start_index);
+ int first_index = proto_file.find_first_of('/', start_index);
std::string result = "";
std::string segment = "";
@@ -347,7 +265,7 @@
// Append directory name.
std::string file_no_suffix;
- int lastindex = proto_file.find_last_of(".");
+ int lastindex = proto_file.find_last_of('.');
if (proto_file == kEmptyFile) {
return kEmptyMetadataFile;
} else {
@@ -371,12 +289,12 @@
file_no_suffix.substr(start_index, first_index - start_index), true);
result += ReservedNamePrefix(segment, file) + segment + "/";
start_index = first_index + 1;
- first_index = file_no_suffix.find_first_of("/", start_index);
+ first_index = file_no_suffix.find_first_of('/', start_index);
}
}
// Append file name.
- int file_name_start = file_no_suffix.find_last_of("/");
+ int file_name_start = file_no_suffix.find_last_of('/');
if (file_name_start == std::string::npos) {
file_name_start = 0;
} else {
@@ -503,7 +421,7 @@
}
if (field->is_repeated()) {
// accommodate for edge case with multiple types.
- size_t start_pos = type.find("|");
+ size_t start_pos = type.find('|');
if (start_pos != std::string::npos) {
type.replace(start_pos, 1, ">|array<");
}
@@ -763,8 +681,8 @@
"$arr = GPBUtil::checkMapField($var, "
"\\Google\\Protobuf\\Internal\\GPBType::^key_type^, "
"\\Google\\Protobuf\\Internal\\GPBType::^value_type^",
- "key_type", ToUpper(key->type_name()),
- "value_type", ToUpper(value->type_name()));
+ "key_type", absl::AsciiStrToUpper(key->type_name()),
+ "value_type", absl::AsciiStrToUpper(value->type_name()));
if (value->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
printer->Print(
", \\^class_name^);\n",
@@ -782,7 +700,7 @@
printer->Print(
"$arr = GPBUtil::checkRepeatedField($var, "
"\\Google\\Protobuf\\Internal\\GPBType::^type^",
- "type", ToUpper(field->type_name()));
+ "type", absl::AsciiStrToUpper(field->type_name()));
if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
printer->Print(
", \\^class_name^);\n",
@@ -912,9 +830,9 @@
"->map('^field^', \\Google\\Protobuf\\Internal\\GPBType::^key^, "
"\\Google\\Protobuf\\Internal\\GPBType::^value^, ^number^^other^)\n",
"field", field->name(),
- "key", ToUpper(key->type_name()),
- "value", ToUpper(val->type_name()),
- "number", StrCat(field->number()),
+ "key", absl::AsciiStrToUpper(key->type_name()),
+ "value", absl::AsciiStrToUpper(val->type_name()),
+ "number", absl::StrCat(field->number()),
"other", EnumOrMessageSuffix(val, true));
} else if (!field->real_containing_oneof()) {
printer->Print(
@@ -922,8 +840,8 @@
"\\Google\\Protobuf\\Internal\\GPBType::^type^, ^number^^other^)\n",
"field", field->name(),
"label", LabelForField(field),
- "type", ToUpper(field->type_name()),
- "number", StrCat(field->number()),
+ "type", absl::AsciiStrToUpper(field->type_name()),
+ "number", absl::StrCat(field->number()),
"other", EnumOrMessageSuffix(field, true));
}
}
@@ -940,8 +858,8 @@
"->value('^field^', "
"\\Google\\Protobuf\\Internal\\GPBType::^type^, ^number^^other^)\n",
"field", field->name(),
- "type", ToUpper(field->type_name()),
- "number", StrCat(field->number()),
+ "type", absl::AsciiStrToUpper(field->type_name()),
+ "number", absl::StrCat(field->number()),
"other", EnumOrMessageSuffix(field, true));
}
printer->Print("->finish()\n");
@@ -1106,7 +1024,7 @@
has_aggregate_metadata_prefix = true;
} else {
for (const auto& prefix : options.aggregate_metadata_prefixes) {
- if (HasPrefixString(file->package(), prefix)) {
+ if (absl::StartsWith(file->package(), prefix)) {
has_aggregate_metadata_prefix = true;
break;
}
@@ -1235,7 +1153,7 @@
}
std::string FilenameToClassname(const std::string& filename) {
- int lastindex = filename.find_last_of(".");
+ int lastindex = filename.find_last_of('.');
std::string result = filename.substr(0, lastindex);
for (int i = 0; i < result.size(); i++) {
if (result[i] == '/') {
@@ -1255,7 +1173,7 @@
GenerateHead(file, &printer);
std::string fullname = FilenameToClassname(filename);
- int lastindex = fullname.find_last_of("\\");
+ int lastindex = fullname.find_last_of('\\');
if (lastindex != std::string::npos) {
printer.Print(
@@ -1310,7 +1228,7 @@
Outdent(&printer);
printer.Print("}\n");
printer.Print("class_exists(^new^::class);\n",
- "new", GeneratedClassNameImpl(desc));
+ "new", GeneratedClassName(desc));
printer.Print("@trigger_error('^old^ is deprecated and will be removed in "
"the next major release. Use ^fullname^ instead', E_USER_DEPRECATED);\n\n",
"old", LegacyFullClassName(desc, options),
@@ -1367,7 +1285,7 @@
GenerateHead(file, &printer);
std::string fullname = FilenameToClassname(filename);
- int lastindex = fullname.find_last_of("\\");
+ int lastindex = fullname.find_last_of('\\');
if (lastindex != std::string::npos) {
printer.Print(
@@ -1467,7 +1385,7 @@
Outdent(&printer);
printer.Print("}\n\n");
- // write legacy file for backwards compatibility with nested messages and enums
+ // write legacy alias for backwards compatibility with nested messages and enums
if (en->containing_type() != NULL) {
printer.Print(
"// Adding a class alias for backwards compatibility with the previous class name.\n");
@@ -1475,7 +1393,6 @@
"class_alias(^new^::class, \\^old^::class);\n\n",
"new", fullname,
"old", LegacyFullClassName(en, options));
- LegacyGenerateClassFile(file, en, options, generator_context);
}
// Write legacy file for backwards compatibility with "readonly" keywword
@@ -1509,7 +1426,7 @@
GenerateHead(file, &printer);
std::string fullname = FilenameToClassname(filename);
- int lastindex = fullname.find_last_of("\\");
+ int lastindex = fullname.find_last_of('\\');
if (lastindex != std::string::npos) {
printer.Print(
@@ -1595,7 +1512,7 @@
Outdent(&printer);
printer.Print("}\n\n");
- // write legacy file for backwards compatibility with nested messages and enums
+ // write legacy alias for backwards compatibility with nested messages and enums
if (message->containing_type() != NULL) {
printer.Print(
"// Adding a class alias for backwards compatibility with the previous class name.\n");
@@ -1603,7 +1520,6 @@
"class_alias(^new^::class, \\^old^::class);\n\n",
"new", fullname,
"old", LegacyFullClassName(message, options));
- LegacyGenerateClassFile(file, message, options, generator_context);
}
// Write legacy file for backwards compatibility with "readonly" keywword
@@ -1640,7 +1556,7 @@
GenerateHead(file, &printer);
std::string fullname = FilenameToClassname(filename);
- int lastindex = fullname.find_last_of("\\");
+ int lastindex = fullname.find_last_of('\\');
if (!file->options().php_namespace().empty() ||
(!file->options().has_php_namespace() && !file->package().empty()) ||
@@ -1751,7 +1667,7 @@
// HTML-escape them so that they don't accidentally close the doc comment.
comments = EscapePhpdoc(comments);
- std::vector<std::string> lines = Split(comments, "\n", true);
+ std::vector<std::string> lines = absl::StrSplit(comments, "\n", absl::SkipEmpty());
while (!lines.empty() && lines.back().empty()) {
lines.pop_back();
}
@@ -1950,17 +1866,13 @@
}
std::string FilenameCName(const FileDescriptor* file) {
- std::string c_name = file->name();
- c_name = StringReplace(c_name, ".", "_", true);
- c_name = StringReplace(c_name, "/", "_", true);
- return c_name;
+ return absl::StrReplaceAll(file->name(), {{".", "_"}, {"/", "_"}});
}
void GenerateCEnum(const EnumDescriptor* desc, io::Printer* printer) {
- std::string c_name = desc->full_name();
- c_name = StringReplace(c_name, ".", "_", true);
- std::string php_name = FullClassName(desc, Options());
- php_name = StringReplace(php_name, "\\", "\\\\", true);
+ std::string c_name = absl::StrReplaceAll(desc->full_name(), {{".", "_"}});
+ std::string php_name =
+ absl::StrReplaceAll(FullClassName(desc, Options()), {{"\\", "\\\\"}});
printer->Print(
"/* $c_name$ */\n"
"\n"
@@ -2043,10 +1955,9 @@
}
void GenerateCMessage(const Descriptor* message, io::Printer* printer) {
- std::string c_name = message->full_name();
- c_name = StringReplace(c_name, ".", "_", true);
- std::string php_name = FullClassName(message, Options());
- php_name = StringReplace(php_name, "\\", "\\\\", true);
+ std::string c_name = absl::StrReplaceAll(message->full_name(), {{".", "_"}});
+ std::string php_name =
+ absl::StrReplaceAll(FullClassName(message, Options()), {{"\\", "\\\\"}});
printer->Print(
"/* $c_name$ */\n"
"\n"
@@ -2196,8 +2107,7 @@
}
void GenerateEnumCInit(const EnumDescriptor* desc, io::Printer* printer) {
- std::string c_name = desc->full_name();
- c_name = StringReplace(c_name, ".", "_", true);
+ std::string c_name = absl::StrReplaceAll(desc->full_name(), {{".", "_"}});
printer->Print(
" $c_name$_ModuleInit();\n",
@@ -2205,8 +2115,7 @@
}
void GenerateCInit(const Descriptor* message, io::Printer* printer) {
- std::string c_name = message->full_name();
- c_name = StringReplace(c_name, ".", "_", true);
+ std::string c_name = absl::StrReplaceAll(message->full_name(), {{".", "_"}});
printer->Print(
" $c_name$_ModuleInit();\n",
@@ -2248,8 +2157,9 @@
std::string metadata_filename = GeneratedMetadataFileName(file, Options());
std::string metadata_classname = FilenameToClassname(metadata_filename);
std::string metadata_c_name =
- StringReplace(metadata_classname, "\\", "_", true);
- metadata_classname = StringReplace(metadata_classname, "\\", "\\\\", true);
+ absl::StrReplaceAll(metadata_classname, {{"\\", "_"}});
+ metadata_classname =
+ absl::StrReplaceAll(metadata_classname, {{"\\", "\\\\"}});
FileDescriptorProto file_proto;
file->CopyTo(&file_proto);
std::string serialized;
@@ -2267,7 +2177,7 @@
for (size_t i = 0; i < serialized.size();) {
for (size_t j = 0; j < 25 && i < serialized.size(); ++i, ++j) {
- printer.Print("'$ch$', ", "ch", CEscape(serialized.substr(i, 1)));
+ printer.Print("'$ch$', ", "ch", absl::CEscape(serialized.substr(i, 1)));
}
printer.Print("\n");
}
@@ -2330,7 +2240,7 @@
std::string metadata_filename = GeneratedMetadataFileName(file, Options());
std::string metadata_classname = FilenameToClassname(metadata_filename);
std::string metadata_c_name =
- StringReplace(metadata_classname, "\\", "_", true);
+ absl::StrReplaceAll(metadata_classname, {{"\\", "_"}});
printer.Print(
" $metadata_c_name$_ModuleInit();\n",
"metadata_c_name", metadata_c_name);
@@ -2348,18 +2258,6 @@
} // namespace
-std::string GeneratedClassName(const Descriptor* desc) {
- return GeneratedClassNameImpl(desc);
-}
-
-std::string GeneratedClassName(const EnumDescriptor* desc) {
- return GeneratedClassNameImpl(desc);
-}
-
-std::string GeneratedClassName(const ServiceDescriptor* desc) {
- return GeneratedClassNameImpl(desc);
-}
-
bool Generator::Generate(const FileDescriptor* file,
const std::string& parameter,
GeneratorContext* generator_context,
@@ -2394,11 +2292,11 @@
std::string* error) const {
Options options;
- for (const auto& option : Split(parameter, ",", true)) {
- const std::vector<std::string> option_pair = Split(option, "=", true);
- if (HasPrefixString(option_pair[0], "aggregate_metadata")) {
+ for (const auto& option : absl::StrSplit(parameter, ",", absl::SkipEmpty())) {
+ const std::vector<std::string> option_pair = absl::StrSplit(option, "=", absl::SkipEmpty());
+ if (absl::StartsWith(option_pair[0], "aggregate_metadata")) {
options.aggregate_metadata = true;
- for (const auto& prefix : Split(option_pair[1], "#", false)) {
+ for (const auto& prefix : absl::StrSplit(option_pair[1], "#", absl::AllowEmpty())) {
options.aggregate_metadata_prefixes.emplace(prefix);
GOOGLE_LOG(INFO) << prefix;
}
diff --git a/src/google/protobuf/compiler/php/php_generator.h b/src/google/protobuf/compiler/php/php_generator.h
index 17cb59c..2729b4a 100644
--- a/src/google/protobuf/compiler/php/php_generator.h
+++ b/src/google/protobuf/compiler/php/php_generator.h
@@ -31,12 +31,13 @@
#ifndef GOOGLE_PROTOBUF_COMPILER_PHP_GENERATOR_H__
#define GOOGLE_PROTOBUF_COMPILER_PHP_GENERATOR_H__
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/descriptor.h>
+#include "google/protobuf/compiler/code_generator.h"
+#include "google/protobuf/compiler/php/names.h"
+#include "google/protobuf/descriptor.h"
#include <string>
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -70,13 +71,6 @@
std::string* error) const;
};
-// To skip reserved keywords in php, some generated classname are prefixed.
-// Other code generators may need following API to figure out the actual
-// classname.
-PROTOC_EXPORT std::string GeneratedClassName(const Descriptor* desc);
-PROTOC_EXPORT std::string GeneratedClassName(const EnumDescriptor* desc);
-PROTOC_EXPORT std::string GeneratedClassName(const ServiceDescriptor* desc);
-
inline bool IsWrapperType(const FieldDescriptor* descriptor) {
return descriptor->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE &&
descriptor->message_type()->file()->name() == "google/protobuf/wrappers.proto";
@@ -87,6 +81,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_COMPILER_PHP_GENERATOR_H__
diff --git a/src/google/protobuf/compiler/plugin.cc b/src/google/protobuf/compiler/plugin.cc
index 0a32384..b7e5c0e 100644
--- a/src/google/protobuf/compiler/plugin.cc
+++ b/src/google/protobuf/compiler/plugin.cc
@@ -30,7 +30,7 @@
// Author: kenton@google.com (Kenton Varda)
-#include <google/protobuf/compiler/plugin.h>
+#include "google/protobuf/compiler/plugin.h"
#include <iostream>
#include <set>
@@ -41,14 +41,14 @@
#include <unistd.h>
#endif
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/compiler/plugin.pb.h>
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/io/io_win32.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/compiler/plugin.pb.h"
+#include "google/protobuf/compiler/code_generator.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/io/io_win32.h"
+#include "google/protobuf/io/zero_copy_stream_impl.h"
namespace google {
diff --git a/src/google/protobuf/compiler/plugin.h b/src/google/protobuf/compiler/plugin.h
index 611713e..388f51a 100644
--- a/src/google/protobuf/compiler/plugin.h
+++ b/src/google/protobuf/compiler/plugin.h
@@ -65,7 +65,7 @@
#include <string>
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -91,6 +91,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_COMPILER_PLUGIN_H__
diff --git a/src/google/protobuf/compiler/plugin.pb.cc b/src/google/protobuf/compiler/plugin.pb.cc
index 8f8d83f..87d4dda 100644
--- a/src/google/protobuf/compiler/plugin.pb.cc
+++ b/src/google/protobuf/compiler/plugin.pb.cc
@@ -1,25 +1,23 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: google/protobuf/compiler/plugin.proto
-#include <google/protobuf/compiler/plugin.pb.h>
+#include "google/protobuf/compiler/plugin.pb.h"
#include <algorithm>
-
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/extension_set.h>
-#include <google/protobuf/wire_format_lite.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/generated_message_reflection.h>
-#include <google/protobuf/reflection_ops.h>
-#include <google/protobuf/wire_format.h>
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/extension_set.h"
+#include "google/protobuf/wire_format_lite.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/generated_message_reflection.h"
+#include "google/protobuf/reflection_ops.h"
+#include "google/protobuf/wire_format.h"
// @@protoc_insertion_point(includes)
-#include <google/protobuf/port_def.inc>
+// Must be included last.
+#include "google/protobuf/port_def.inc"
PROTOBUF_PRAGMA_INIT_SEG
-
namespace _pb = ::PROTOBUF_NAMESPACE_ID;
-namespace _pbi = _pb::internal;
-
+namespace _pbi = ::PROTOBUF_NAMESPACE_ID::internal;
PROTOBUF_NAMESPACE_OPEN
namespace compiler {
PROTOBUF_CONSTEXPR Version::Version(
@@ -31,14 +29,15 @@
, /*decltype(_impl_.minor_)*/0
, /*decltype(_impl_.patch_)*/0} {}
struct VersionDefaultTypeInternal {
- PROTOBUF_CONSTEXPR VersionDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR VersionDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~VersionDefaultTypeInternal() {}
union {
Version _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 VersionDefaultTypeInternal _Version_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 VersionDefaultTypeInternal _Version_default_instance_;
PROTOBUF_CONSTEXPR CodeGeneratorRequest::CodeGeneratorRequest(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_._has_bits_)*/{}
@@ -48,14 +47,15 @@
, /*decltype(_impl_.parameter_)*/{&::_pbi::fixed_address_empty_string, ::_pbi::ConstantInitialized{}}
, /*decltype(_impl_.compiler_version_)*/nullptr} {}
struct CodeGeneratorRequestDefaultTypeInternal {
- PROTOBUF_CONSTEXPR CodeGeneratorRequestDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR CodeGeneratorRequestDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~CodeGeneratorRequestDefaultTypeInternal() {}
union {
CodeGeneratorRequest _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 CodeGeneratorRequestDefaultTypeInternal _CodeGeneratorRequest_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 CodeGeneratorRequestDefaultTypeInternal _CodeGeneratorRequest_default_instance_;
PROTOBUF_CONSTEXPR CodeGeneratorResponse_File::CodeGeneratorResponse_File(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_._has_bits_)*/{}
@@ -65,14 +65,15 @@
, /*decltype(_impl_.content_)*/{&::_pbi::fixed_address_empty_string, ::_pbi::ConstantInitialized{}}
, /*decltype(_impl_.generated_code_info_)*/nullptr} {}
struct CodeGeneratorResponse_FileDefaultTypeInternal {
- PROTOBUF_CONSTEXPR CodeGeneratorResponse_FileDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR CodeGeneratorResponse_FileDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~CodeGeneratorResponse_FileDefaultTypeInternal() {}
union {
CodeGeneratorResponse_File _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 CodeGeneratorResponse_FileDefaultTypeInternal _CodeGeneratorResponse_File_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 CodeGeneratorResponse_FileDefaultTypeInternal _CodeGeneratorResponse_File_default_instance_;
PROTOBUF_CONSTEXPR CodeGeneratorResponse::CodeGeneratorResponse(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_._has_bits_)*/{}
@@ -81,130 +82,163 @@
, /*decltype(_impl_.error_)*/{&::_pbi::fixed_address_empty_string, ::_pbi::ConstantInitialized{}}
, /*decltype(_impl_.supported_features_)*/uint64_t{0u}} {}
struct CodeGeneratorResponseDefaultTypeInternal {
- PROTOBUF_CONSTEXPR CodeGeneratorResponseDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR CodeGeneratorResponseDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~CodeGeneratorResponseDefaultTypeInternal() {}
union {
CodeGeneratorResponse _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 CodeGeneratorResponseDefaultTypeInternal _CodeGeneratorResponse_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 CodeGeneratorResponseDefaultTypeInternal _CodeGeneratorResponse_default_instance_;
} // namespace compiler
PROTOBUF_NAMESPACE_CLOSE
static ::_pb::Metadata file_level_metadata_google_2fprotobuf_2fcompiler_2fplugin_2eproto[4];
static const ::_pb::EnumDescriptor* file_level_enum_descriptors_google_2fprotobuf_2fcompiler_2fplugin_2eproto[1];
-static constexpr ::_pb::ServiceDescriptor const** file_level_service_descriptors_google_2fprotobuf_2fcompiler_2fplugin_2eproto = nullptr;
-
-const uint32_t TableStruct_google_2fprotobuf_2fcompiler_2fplugin_2eproto::offsets[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::Version, _impl_._has_bits_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::Version, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::Version, _impl_.major_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::Version, _impl_.minor_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::Version, _impl_.patch_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::Version, _impl_.suffix_),
- 1,
- 2,
- 3,
- 0,
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorRequest, _impl_._has_bits_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorRequest, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorRequest, _impl_.file_to_generate_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorRequest, _impl_.parameter_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorRequest, _impl_.proto_file_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorRequest, _impl_.compiler_version_),
- ~0u,
- 0,
- ~0u,
- 1,
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorResponse_File, _impl_._has_bits_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorResponse_File, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorResponse_File, _impl_.name_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorResponse_File, _impl_.insertion_point_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorResponse_File, _impl_.content_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorResponse_File, _impl_.generated_code_info_),
- 0,
- 1,
- 2,
- 3,
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorResponse, _impl_._has_bits_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorResponse, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorResponse, _impl_.error_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorResponse, _impl_.supported_features_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorResponse, _impl_.file_),
- 0,
- 1,
- ~0u,
+static constexpr const ::_pb::ServiceDescriptor**
+ file_level_service_descriptors_google_2fprotobuf_2fcompiler_2fplugin_2eproto = nullptr;
+const uint32_t TableStruct_google_2fprotobuf_2fcompiler_2fplugin_2eproto::offsets[] PROTOBUF_SECTION_VARIABLE(
+ protodesc_cold) = {
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::Version, _impl_._has_bits_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::Version, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::Version, _impl_.major_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::Version, _impl_.minor_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::Version, _impl_.patch_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::Version, _impl_.suffix_),
+ 1,
+ 2,
+ 3,
+ 0,
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorRequest, _impl_._has_bits_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorRequest, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorRequest, _impl_.file_to_generate_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorRequest, _impl_.parameter_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorRequest, _impl_.proto_file_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorRequest, _impl_.compiler_version_),
+ ~0u,
+ 0,
+ ~0u,
+ 1,
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorResponse_File, _impl_._has_bits_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorResponse_File, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorResponse_File, _impl_.name_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorResponse_File, _impl_.insertion_point_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorResponse_File, _impl_.content_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorResponse_File, _impl_.generated_code_info_),
+ 0,
+ 1,
+ 2,
+ 3,
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorResponse, _impl_._has_bits_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorResponse, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorResponse, _impl_.error_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorResponse, _impl_.supported_features_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorResponse, _impl_.file_),
+ 0,
+ 1,
+ ~0u,
};
-static const ::_pbi::MigrationSchema schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
- { 0, 10, -1, sizeof(::PROTOBUF_NAMESPACE_ID::compiler::Version)},
- { 14, 24, -1, sizeof(::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorRequest)},
- { 28, 38, -1, sizeof(::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorResponse_File)},
- { 42, 51, -1, sizeof(::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorResponse)},
+
+static const ::_pbi::MigrationSchema
+ schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
+ { 0, 12, -1, sizeof(::PROTOBUF_NAMESPACE_ID::compiler::Version)},
+ { 16, 28, -1, sizeof(::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorRequest)},
+ { 32, 44, -1, sizeof(::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorResponse_File)},
+ { 48, 59, -1, sizeof(::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorResponse)},
};
static const ::_pb::Message* const file_default_instances[] = {
- &::PROTOBUF_NAMESPACE_ID::compiler::_Version_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::compiler::_CodeGeneratorRequest_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::compiler::_CodeGeneratorResponse_File_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::compiler::_CodeGeneratorResponse_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::compiler::_Version_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::compiler::_CodeGeneratorRequest_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::compiler::_CodeGeneratorResponse_File_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::compiler::_CodeGeneratorResponse_default_instance_._instance,
};
-
-const char descriptor_table_protodef_google_2fprotobuf_2fcompiler_2fplugin_2eproto[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) =
- "\n%google/protobuf/compiler/plugin.proto\022"
- "\030google.protobuf.compiler\032 google/protob"
- "uf/descriptor.proto\"F\n\007Version\022\r\n\005major\030"
- "\001 \001(\005\022\r\n\005minor\030\002 \001(\005\022\r\n\005patch\030\003 \001(\005\022\016\n\006s"
- "uffix\030\004 \001(\t\"\272\001\n\024CodeGeneratorRequest\022\030\n\020"
- "file_to_generate\030\001 \003(\t\022\021\n\tparameter\030\002 \001("
- "\t\0228\n\nproto_file\030\017 \003(\0132$.google.protobuf."
- "FileDescriptorProto\022;\n\020compiler_version\030"
- "\003 \001(\0132!.google.protobuf.compiler.Version"
- "\"\301\002\n\025CodeGeneratorResponse\022\r\n\005error\030\001 \001("
- "\t\022\032\n\022supported_features\030\002 \001(\004\022B\n\004file\030\017 "
- "\003(\01324.google.protobuf.compiler.CodeGener"
- "atorResponse.File\032\177\n\004File\022\014\n\004name\030\001 \001(\t\022"
- "\027\n\017insertion_point\030\002 \001(\t\022\017\n\007content\030\017 \001("
- "\t\022\?\n\023generated_code_info\030\020 \001(\0132\".google."
- "protobuf.GeneratedCodeInfo\"8\n\007Feature\022\020\n"
- "\014FEATURE_NONE\020\000\022\033\n\027FEATURE_PROTO3_OPTION"
- "AL\020\001BW\n\034com.google.protobuf.compilerB\014Pl"
- "uginProtosZ)google.golang.org/protobuf/t"
- "ypes/pluginpb"
- ;
-static const ::_pbi::DescriptorTable* const descriptor_table_google_2fprotobuf_2fcompiler_2fplugin_2eproto_deps[1] = {
- &::descriptor_table_google_2fprotobuf_2fdescriptor_2eproto,
+const char descriptor_table_protodef_google_2fprotobuf_2fcompiler_2fplugin_2eproto[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
+ "\n%google/protobuf/compiler/plugin.proto\022"
+ "\030google.protobuf.compiler\032 google/protob"
+ "uf/descriptor.proto\"F\n\007Version\022\r\n\005major\030"
+ "\001 \001(\005\022\r\n\005minor\030\002 \001(\005\022\r\n\005patch\030\003 \001(\005\022\016\n\006s"
+ "uffix\030\004 \001(\t\"\272\001\n\024CodeGeneratorRequest\022\030\n\020"
+ "file_to_generate\030\001 \003(\t\022\021\n\tparameter\030\002 \001("
+ "\t\0228\n\nproto_file\030\017 \003(\0132$.google.protobuf."
+ "FileDescriptorProto\022;\n\020compiler_version\030"
+ "\003 \001(\0132!.google.protobuf.compiler.Version"
+ "\"\301\002\n\025CodeGeneratorResponse\022\r\n\005error\030\001 \001("
+ "\t\022\032\n\022supported_features\030\002 \001(\004\022B\n\004file\030\017 "
+ "\003(\01324.google.protobuf.compiler.CodeGener"
+ "atorResponse.File\032\177\n\004File\022\014\n\004name\030\001 \001(\t\022"
+ "\027\n\017insertion_point\030\002 \001(\t\022\017\n\007content\030\017 \001("
+ "\t\022\?\n\023generated_code_info\030\020 \001(\0132\".google."
+ "protobuf.GeneratedCodeInfo\"8\n\007Feature\022\020\n"
+ "\014FEATURE_NONE\020\000\022\033\n\027FEATURE_PROTO3_OPTION"
+ "AL\020\001BW\n\034com.google.protobuf.compilerB\014Pl"
+ "uginProtosZ)google.golang.org/protobuf/t"
+ "ypes/pluginpb"
};
-static ::_pbi::once_flag descriptor_table_google_2fprotobuf_2fcompiler_2fplugin_2eproto_once;
+static const ::_pbi::DescriptorTable* const descriptor_table_google_2fprotobuf_2fcompiler_2fplugin_2eproto_deps[1] =
+ {
+ &::descriptor_table_google_2fprotobuf_2fdescriptor_2eproto,
+};
+static ::absl::once_flag descriptor_table_google_2fprotobuf_2fcompiler_2fplugin_2eproto_once;
const ::_pbi::DescriptorTable descriptor_table_google_2fprotobuf_2fcompiler_2fplugin_2eproto = {
- false, false, 773, descriptor_table_protodef_google_2fprotobuf_2fcompiler_2fplugin_2eproto,
+ false,
+ false,
+ 773,
+ descriptor_table_protodef_google_2fprotobuf_2fcompiler_2fplugin_2eproto,
"google/protobuf/compiler/plugin.proto",
- &descriptor_table_google_2fprotobuf_2fcompiler_2fplugin_2eproto_once, descriptor_table_google_2fprotobuf_2fcompiler_2fplugin_2eproto_deps, 1, 4,
- schemas, file_default_instances, TableStruct_google_2fprotobuf_2fcompiler_2fplugin_2eproto::offsets,
- file_level_metadata_google_2fprotobuf_2fcompiler_2fplugin_2eproto, file_level_enum_descriptors_google_2fprotobuf_2fcompiler_2fplugin_2eproto,
+ &descriptor_table_google_2fprotobuf_2fcompiler_2fplugin_2eproto_once,
+ descriptor_table_google_2fprotobuf_2fcompiler_2fplugin_2eproto_deps,
+ 1,
+ 4,
+ schemas,
+ file_default_instances,
+ TableStruct_google_2fprotobuf_2fcompiler_2fplugin_2eproto::offsets,
+ file_level_metadata_google_2fprotobuf_2fcompiler_2fplugin_2eproto,
+ file_level_enum_descriptors_google_2fprotobuf_2fcompiler_2fplugin_2eproto,
file_level_service_descriptors_google_2fprotobuf_2fcompiler_2fplugin_2eproto,
};
+
+// This function exists to be marked as weak.
+// It can significantly speed up compilation by breaking up LLVM's SCC
+// in the .pb.cc translation units. Large translation units see a
+// reduction of more than 35% of walltime for optimized builds. Without
+// the weak attribute all the messages in the file, including all the
+// vtables and everything they use become part of the same SCC through
+// a cycle like:
+// GetMetadata -> descriptor table -> default instances ->
+// vtables -> GetMetadata
+// By adding a weak function here we break the connection from the
+// individual vtables back into the descriptor table.
PROTOBUF_ATTRIBUTE_WEAK const ::_pbi::DescriptorTable* descriptor_table_google_2fprotobuf_2fcompiler_2fplugin_2eproto_getter() {
return &descriptor_table_google_2fprotobuf_2fcompiler_2fplugin_2eproto;
}
-
// Force running AddDescriptors() at dynamic initialization time.
-PROTOBUF_ATTRIBUTE_INIT_PRIORITY2 static ::_pbi::AddDescriptorsRunner dynamic_init_dummy_google_2fprotobuf_2fcompiler_2fplugin_2eproto(&descriptor_table_google_2fprotobuf_2fcompiler_2fplugin_2eproto);
+PROTOBUF_ATTRIBUTE_INIT_PRIORITY2
+static ::_pbi::AddDescriptorsRunner dynamic_init_dummy_google_2fprotobuf_2fcompiler_2fplugin_2eproto(&descriptor_table_google_2fprotobuf_2fcompiler_2fplugin_2eproto);
PROTOBUF_NAMESPACE_OPEN
namespace compiler {
const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* CodeGeneratorResponse_Feature_descriptor() {
@@ -228,12 +262,13 @@
constexpr CodeGeneratorResponse_Feature CodeGeneratorResponse::Feature_MAX;
constexpr int CodeGeneratorResponse::Feature_ARRAYSIZE;
#endif // (__cplusplus < 201703) && (!defined(_MSC_VER) || (_MSC_VER >= 1900 && _MSC_VER < 1912))
-
// ===================================================================
class Version::_Internal {
public:
using HasBits = decltype(std::declval<Version>()._impl_._has_bits_);
+ static constexpr int32_t kHasBitsOffset =
+ 8 * PROTOBUF_FIELD_OFFSET(Version, _impl_._has_bits_);
static void set_has_major(HasBits* has_bits) {
(*has_bits)[0] |= 2u;
}
@@ -552,12 +587,13 @@
&descriptor_table_google_2fprotobuf_2fcompiler_2fplugin_2eproto_getter, &descriptor_table_google_2fprotobuf_2fcompiler_2fplugin_2eproto_once,
file_level_metadata_google_2fprotobuf_2fcompiler_2fplugin_2eproto[0]);
}
-
// ===================================================================
class CodeGeneratorRequest::_Internal {
public:
using HasBits = decltype(std::declval<CodeGeneratorRequest>()._impl_._has_bits_);
+ static constexpr int32_t kHasBitsOffset =
+ 8 * PROTOBUF_FIELD_OFFSET(CodeGeneratorRequest, _impl_._has_bits_);
static void set_has_parameter(HasBits* has_bits) {
(*has_bits)[0] |= 1u;
}
@@ -904,12 +940,13 @@
&descriptor_table_google_2fprotobuf_2fcompiler_2fplugin_2eproto_getter, &descriptor_table_google_2fprotobuf_2fcompiler_2fplugin_2eproto_once,
file_level_metadata_google_2fprotobuf_2fcompiler_2fplugin_2eproto[1]);
}
-
// ===================================================================
class CodeGeneratorResponse_File::_Internal {
public:
using HasBits = decltype(std::declval<CodeGeneratorResponse_File>()._impl_._has_bits_);
+ static constexpr int32_t kHasBitsOffset =
+ 8 * PROTOBUF_FIELD_OFFSET(CodeGeneratorResponse_File, _impl_._has_bits_);
static void set_has_name(HasBits* has_bits) {
(*has_bits)[0] |= 1u;
}
@@ -1294,12 +1331,13 @@
&descriptor_table_google_2fprotobuf_2fcompiler_2fplugin_2eproto_getter, &descriptor_table_google_2fprotobuf_2fcompiler_2fplugin_2eproto_once,
file_level_metadata_google_2fprotobuf_2fcompiler_2fplugin_2eproto[2]);
}
-
// ===================================================================
class CodeGeneratorResponse::_Internal {
public:
using HasBits = decltype(std::declval<CodeGeneratorResponse>()._impl_._has_bits_);
+ static constexpr int32_t kHasBitsOffset =
+ 8 * PROTOBUF_FIELD_OFFSET(CodeGeneratorResponse, _impl_._has_bits_);
static void set_has_error(HasBits* has_bits) {
(*has_bits)[0] |= 1u;
}
@@ -1585,7 +1623,6 @@
&descriptor_table_google_2fprotobuf_2fcompiler_2fplugin_2eproto_getter, &descriptor_table_google_2fprotobuf_2fcompiler_2fplugin_2eproto_once,
file_level_metadata_google_2fprotobuf_2fcompiler_2fplugin_2eproto[3]);
}
-
// @@protoc_insertion_point(namespace_scope)
} // namespace compiler
PROTOBUF_NAMESPACE_CLOSE
@@ -1607,6 +1644,5 @@
return Arena::CreateMessageInternal< ::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorResponse >(arena);
}
PROTOBUF_NAMESPACE_CLOSE
-
// @@protoc_insertion_point(global_scope)
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/compiler/plugin.pb.h b/src/google/protobuf/compiler/plugin.pb.h
index 3e2bc50..d310643 100644
--- a/src/google/protobuf/compiler/plugin.pb.h
+++ b/src/google/protobuf/compiler/plugin.pb.h
@@ -1,46 +1,51 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: google/protobuf/compiler/plugin.proto
-#ifndef GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fcompiler_2fplugin_2eproto
-#define GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fcompiler_2fplugin_2eproto
+#ifndef GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fcompiler_2fplugin_2eproto_2epb_2eh
+#define GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fcompiler_2fplugin_2eproto_2epb_2eh
#include <limits>
#include <string>
+#include <type_traits>
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
#if PROTOBUF_VERSION < 3021000
-#error This file was generated by a newer version of protoc which is
-#error incompatible with your Protocol Buffer headers. Please update
-#error your headers.
-#endif
-#if 3021007 < PROTOBUF_MIN_PROTOC_VERSION
-#error This file was generated by an older version of protoc which is
-#error incompatible with your Protocol Buffer headers. Please
-#error regenerate this file with a newer version of protoc.
-#endif
+#error "This file was generated by a newer version of protoc which is"
+#error "incompatible with your Protocol Buffer headers. Please update"
+#error "your headers."
+#endif // PROTOBUF_VERSION
-#include <google/protobuf/port_undef.inc>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/arena.h>
-#include <google/protobuf/arenastring.h>
-#include <google/protobuf/generated_message_util.h>
-#include <google/protobuf/metadata_lite.h>
-#include <google/protobuf/generated_message_reflection.h>
-#include <google/protobuf/message.h>
-#include <google/protobuf/repeated_field.h> // IWYU pragma: export
-#include <google/protobuf/extension_set.h> // IWYU pragma: export
-#include <google/protobuf/generated_enum_reflection.h>
-#include <google/protobuf/unknown_field_set.h>
-#include <google/protobuf/descriptor.pb.h>
+#if 3021007 < PROTOBUF_MIN_PROTOC_VERSION
+#error "This file was generated by an older version of protoc which is"
+#error "incompatible with your Protocol Buffer headers. Please"
+#error "regenerate this file with a newer version of protoc."
+#endif // PROTOBUF_MIN_PROTOC_VERSION
+#include "google/protobuf/port_undef.inc"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/arena.h"
+#include "google/protobuf/arenastring.h"
+#include "google/protobuf/generated_message_util.h"
+#include "google/protobuf/metadata_lite.h"
+#include "google/protobuf/generated_message_reflection.h"
+#include "google/protobuf/message.h"
+#include "google/protobuf/repeated_field.h" // IWYU pragma: export
+#include "google/protobuf/extension_set.h" // IWYU pragma: export
+#include "google/protobuf/generated_enum_reflection.h"
+#include "google/protobuf/unknown_field_set.h"
+#include "google/protobuf/descriptor.pb.h"
// @@protoc_insertion_point(includes)
-#include <google/protobuf/port_def.inc>
+
+// Must be included last.
+#include "google/protobuf/port_def.inc"
+
#define PROTOBUF_INTERNAL_EXPORT_google_2fprotobuf_2fcompiler_2fplugin_2eproto PROTOC_EXPORT
#ifdef major
#undef major
-#endif
+#endif // major
#ifdef minor
#undef minor
-#endif
+#endif // minor
+
PROTOBUF_NAMESPACE_OPEN
namespace internal {
class AnyMetadata;
@@ -51,7 +56,8 @@
struct PROTOC_EXPORT TableStruct_google_2fprotobuf_2fcompiler_2fplugin_2eproto {
static const uint32_t offsets[];
};
-PROTOC_EXPORT extern const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_google_2fprotobuf_2fcompiler_2fplugin_2eproto;
+PROTOC_EXPORT extern const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable
+ descriptor_table_google_2fprotobuf_2fcompiler_2fplugin_2eproto;
PROTOBUF_NAMESPACE_OPEN
namespace compiler {
class CodeGeneratorRequest;
@@ -67,16 +73,18 @@
struct VersionDefaultTypeInternal;
PROTOC_EXPORT extern VersionDefaultTypeInternal _Version_default_instance_;
} // namespace compiler
+template <>
+PROTOC_EXPORT ::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorRequest* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorRequest>(Arena*);
+template <>
+PROTOC_EXPORT ::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorResponse* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorResponse>(Arena*);
+template <>
+PROTOC_EXPORT ::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorResponse_File* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorResponse_File>(Arena*);
+template <>
+PROTOC_EXPORT ::PROTOBUF_NAMESPACE_ID::compiler::Version* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::compiler::Version>(Arena*);
PROTOBUF_NAMESPACE_CLOSE
-PROTOBUF_NAMESPACE_OPEN
-template<> PROTOC_EXPORT ::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorRequest* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorRequest>(Arena*);
-template<> PROTOC_EXPORT ::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorResponse* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorResponse>(Arena*);
-template<> PROTOC_EXPORT ::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorResponse_File* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorResponse_File>(Arena*);
-template<> PROTOC_EXPORT ::PROTOBUF_NAMESPACE_ID::compiler::Version* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::compiler::Version>(Arena*);
-PROTOBUF_NAMESPACE_CLOSE
+
PROTOBUF_NAMESPACE_OPEN
namespace compiler {
-
enum CodeGeneratorResponse_Feature : int {
CodeGeneratorResponse_Feature_FEATURE_NONE = 0,
CodeGeneratorResponse_Feature_FEATURE_PROTO3_OPTIONAL = 1
@@ -92,16 +100,24 @@
static_assert(::std::is_same<T, CodeGeneratorResponse_Feature>::value ||
::std::is_integral<T>::value,
"Incorrect type passed to function CodeGeneratorResponse_Feature_Name.");
- return ::PROTOBUF_NAMESPACE_ID::internal::NameOfEnum(
- CodeGeneratorResponse_Feature_descriptor(), enum_t_value);
+ return CodeGeneratorResponse_Feature_Name(static_cast<CodeGeneratorResponse_Feature>(enum_t_value));
+}
+template<>
+inline const std::string& CodeGeneratorResponse_Feature_Name(CodeGeneratorResponse_Feature value) {
+ return ::PROTOBUF_NAMESPACE_ID::internal::NameOfDenseEnum
+ <CodeGeneratorResponse_Feature_descriptor, 0, 1>(static_cast<int>(value));
}
inline bool CodeGeneratorResponse_Feature_Parse(
- ::PROTOBUF_NAMESPACE_ID::ConstStringParam name, CodeGeneratorResponse_Feature* value) {
+ ::absl::string_view name, CodeGeneratorResponse_Feature* value) {
return ::PROTOBUF_NAMESPACE_ID::internal::ParseNamedEnum<CodeGeneratorResponse_Feature>(
CodeGeneratorResponse_Feature_descriptor(), name, value);
}
+
// ===================================================================
+
+// -------------------------------------------------------------------
+
class PROTOC_EXPORT Version final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.compiler.Version) */ {
public:
@@ -212,7 +228,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.compiler.Version";
}
protected:
@@ -309,8 +325,7 @@
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2fcompiler_2fplugin_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOC_EXPORT CodeGeneratorRequest final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.compiler.CodeGeneratorRequest) */ {
@@ -422,7 +437,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.compiler.CodeGeneratorRequest";
}
protected:
@@ -540,8 +555,7 @@
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2fcompiler_2fplugin_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOC_EXPORT CodeGeneratorResponse_File final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.compiler.CodeGeneratorResponse.File) */ {
@@ -653,7 +667,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.compiler.CodeGeneratorResponse.File";
}
protected:
@@ -765,8 +779,7 @@
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2fcompiler_2fplugin_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOC_EXPORT CodeGeneratorResponse final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.compiler.CodeGeneratorResponse) */ {
@@ -878,7 +891,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.compiler.CodeGeneratorResponse";
}
protected:
@@ -920,7 +933,7 @@
"Incorrect type passed to function Feature_Name.");
return CodeGeneratorResponse_Feature_Name(enum_t_value);
}
- static inline bool Feature_Parse(::PROTOBUF_NAMESPACE_ID::ConstStringParam name,
+ static inline bool Feature_Parse(::absl::string_view name,
Feature* value) {
return CodeGeneratorResponse_Feature_Parse(name, value);
}
@@ -1001,12 +1014,17 @@
// ===================================================================
+
+
// ===================================================================
+
#ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wstrict-aliasing"
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wstrict-aliasing"
#endif // __GNUC__
+// -------------------------------------------------------------------
+
// Version
// optional int32 major = 1;
@@ -1140,9 +1158,7 @@
_impl_._has_bits_[0] &= ~0x00000001u;
auto* p = _impl_.suffix_.Release();
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
- if (_impl_.suffix_.IsDefault()) {
- _impl_.suffix_.Set("", GetArenaForAllocation());
- }
+ _impl_.suffix_.Set("", GetArenaForAllocation());
#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
return p;
}
@@ -1200,8 +1216,7 @@
// @@protoc_insertion_point(field_set:google.protobuf.compiler.CodeGeneratorRequest.file_to_generate)
}
inline void CodeGeneratorRequest::set_file_to_generate(int index, const char* value) {
- GOOGLE_DCHECK(value != nullptr);
- _impl_.file_to_generate_.Mutable(index)->assign(value);
+ GOOGLE_DCHECK(value != nullptr); _impl_.file_to_generate_.Mutable(index)->assign(value);
// @@protoc_insertion_point(field_set_char:google.protobuf.compiler.CodeGeneratorRequest.file_to_generate)
}
inline void CodeGeneratorRequest::set_file_to_generate(int index, const char* value, size_t size) {
@@ -1221,8 +1236,7 @@
// @@protoc_insertion_point(field_add:google.protobuf.compiler.CodeGeneratorRequest.file_to_generate)
}
inline void CodeGeneratorRequest::add_file_to_generate(const char* value) {
- GOOGLE_DCHECK(value != nullptr);
- _impl_.file_to_generate_.Add()->assign(value);
+ GOOGLE_DCHECK(value != nullptr); _impl_.file_to_generate_.Add()->assign(value);
// @@protoc_insertion_point(field_add_char:google.protobuf.compiler.CodeGeneratorRequest.file_to_generate)
}
inline void CodeGeneratorRequest::add_file_to_generate(const char* value, size_t size) {
@@ -1287,9 +1301,7 @@
_impl_._has_bits_[0] &= ~0x00000001u;
auto* p = _impl_.parameter_.Release();
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
- if (_impl_.parameter_.IsDefault()) {
- _impl_.parameter_.Set("", GetArenaForAllocation());
- }
+ _impl_.parameter_.Set("", GetArenaForAllocation());
#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
return p;
}
@@ -1486,9 +1498,7 @@
_impl_._has_bits_[0] &= ~0x00000001u;
auto* p = _impl_.name_.Release();
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
- if (_impl_.name_.IsDefault()) {
- _impl_.name_.Set("", GetArenaForAllocation());
- }
+ _impl_.name_.Set("", GetArenaForAllocation());
#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
return p;
}
@@ -1554,9 +1564,7 @@
_impl_._has_bits_[0] &= ~0x00000002u;
auto* p = _impl_.insertion_point_.Release();
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
- if (_impl_.insertion_point_.IsDefault()) {
- _impl_.insertion_point_.Set("", GetArenaForAllocation());
- }
+ _impl_.insertion_point_.Set("", GetArenaForAllocation());
#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
return p;
}
@@ -1622,9 +1630,7 @@
_impl_._has_bits_[0] &= ~0x00000004u;
auto* p = _impl_.content_.Release();
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
- if (_impl_.content_.IsDefault()) {
- _impl_.content_.Set("", GetArenaForAllocation());
- }
+ _impl_.content_.Set("", GetArenaForAllocation());
#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
return p;
}
@@ -1781,9 +1787,7 @@
_impl_._has_bits_[0] &= ~0x00000001u;
auto* p = _impl_.error_.Release();
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
- if (_impl_.error_.IsDefault()) {
- _impl_.error_.Set("", GetArenaForAllocation());
- }
+ _impl_.error_.Set("", GetArenaForAllocation());
#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
return p;
}
@@ -1871,20 +1875,14 @@
}
#ifdef __GNUC__
- #pragma GCC diagnostic pop
+#pragma GCC diagnostic pop
#endif // __GNUC__
-// -------------------------------------------------------------------
-
-// -------------------------------------------------------------------
-
-// -------------------------------------------------------------------
-
// @@protoc_insertion_point(namespace_scope)
-
} // namespace compiler
PROTOBUF_NAMESPACE_CLOSE
+
PROTOBUF_NAMESPACE_OPEN
template <> struct is_proto_enum< ::PROTOBUF_NAMESPACE_ID::compiler::CodeGeneratorResponse_Feature> : ::std::true_type {};
@@ -1897,5 +1895,6 @@
// @@protoc_insertion_point(global_scope)
-#include <google/protobuf/port_undef.inc>
-#endif // GOOGLE_PROTOBUF_INCLUDED_GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fcompiler_2fplugin_2eproto
+#include "google/protobuf/port_undef.inc"
+
+#endif // GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fcompiler_2fplugin_2eproto_2epb_2eh
diff --git a/src/google/protobuf/compiler/plugin.proto b/src/google/protobuf/compiler/plugin.proto
index 9242aac..0f46a45 100644
--- a/src/google/protobuf/compiler/plugin.proto
+++ b/src/google/protobuf/compiler/plugin.proto
@@ -30,9 +30,6 @@
// Author: kenton@google.com (Kenton Varda)
//
-// WARNING: The plugin interface is currently EXPERIMENTAL and is subject to
-// change.
-//
// protoc (aka the Protocol Compiler) can be extended via plugins. A plugin is
// just a program that reads a CodeGeneratorRequest from stdin and writes a
// CodeGeneratorResponse to stdout.
diff --git a/src/google/protobuf/compiler/python/BUILD.bazel b/src/google/protobuf/compiler/python/BUILD.bazel
new file mode 100644
index 0000000..933d063
--- /dev/null
+++ b/src/google/protobuf/compiler/python/BUILD.bazel
@@ -0,0 +1,69 @@
+################################################################################
+# Protocol Buffers Compiler - Python code generator
+################################################################################
+
+load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test")
+load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
+load("//build_defs:cpp_opts.bzl", "COPTS")
+
+cc_library(
+ name = "python",
+ srcs = [
+ "generator.cc",
+ "helpers.cc",
+ "pyi_generator.cc",
+ ],
+ hdrs = [
+ "generator.h",
+ "helpers.h",
+ "pyi_generator.h",
+ ],
+ copts = COPTS,
+ include_prefix = "google/protobuf/compiler/python",
+ visibility = [
+ "//pkg:__pkg__",
+ "//src/google/protobuf/compiler:__pkg__",
+ "@com_github_grpc_grpc//tools/distrib/python/grpcio_tools:__subpackages__",
+ ],
+ deps = [
+ "//src/google/protobuf:protobuf_nowkt",
+ "//src/google/protobuf/compiler:code_generator",
+ "@com_google_absl//absl/strings",
+ "@com_google_absl//absl/synchronization",
+ ],
+)
+
+cc_test(
+ name = "plugin_unittest",
+ srcs = ["plugin_unittest.cc"],
+ copts = COPTS,
+ deps = [
+ ":python",
+ "//src/google/protobuf/compiler:command_line_interface",
+ "//src/google/protobuf/io",
+ "//src/google/protobuf/testing",
+ "@com_google_absl//absl/strings",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+################################################################################
+# Distribution packaging
+################################################################################
+
+pkg_files(
+ name = "dist_files",
+ srcs = glob(["**/*"]),
+ strip_prefix = strip_prefix.from_root(""),
+ visibility = ["//src:__pkg__"],
+)
+
+filegroup(
+ name = "test_srcs",
+ srcs = glob([
+ "*_test.cc",
+ "*unittest.cc",
+ ]),
+ visibility = ["//src/google/protobuf/compiler:__pkg__"],
+)
diff --git a/src/google/protobuf/compiler/python/generator.cc b/src/google/protobuf/compiler/python/generator.cc
index d8d6d74..1ff2497 100644
--- a/src/google/protobuf/compiler/python/generator.cc
+++ b/src/google/protobuf/compiler/python/generator.cc
@@ -42,7 +42,7 @@
// performance-minded Python code leverage the fast C++ implementation
// directly.
-#include <google/protobuf/compiler/python/generator.h>
+#include "google/protobuf/compiler/python/generator.h"
#include <algorithm>
#include <limits>
@@ -52,17 +52,22 @@
#include <utility>
#include <vector>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/stringprintf.h>
-#include <google/protobuf/stubs/substitute.h>
-#include <google/protobuf/compiler/python/helpers.h>
-#include <google/protobuf/compiler/python/pyi_generator.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/io/zero_copy_stream.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "absl/strings/ascii.h"
+#include "absl/strings/escaping.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/str_format.h"
+#include "absl/strings/str_replace.h"
+#include "absl/strings/strip.h"
+#include "absl/strings/substitute.h"
+#include "google/protobuf/compiler/python/helpers.h"
+#include "google/protobuf/compiler/python/pyi_generator.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/io/zero_copy_stream.h"
namespace google {
namespace protobuf {
@@ -79,8 +84,8 @@
// We can't have dots in the module name, so we replace each with _dot_.
// But that could lead to a collision between a.b and a_dot_b, so we also
// duplicate each underscore.
- GlobalReplaceSubstring("_", "__", &module_name);
- GlobalReplaceSubstring(".", "_dot_", &module_name);
+ absl::StrReplaceAll({{"_", "__"}}, &module_name);
+ absl::StrReplaceAll({{".", "_dot_"}}, &module_name);
return module_name;
}
@@ -90,29 +95,7 @@
// in proto2/public/reflection.py.
const char kDescriptorKey[] = "DESCRIPTOR";
-
-// file output by this generator.
-void PrintTopBoilerplate(io::Printer* printer, const FileDescriptor* file,
- bool descriptor_proto) {
- // TODO(robinson): Allow parameterization of Python version?
- printer->Print(
- "# -*- coding: utf-8 -*-\n"
- "# Generated by the protocol buffer compiler. DO NOT EDIT!\n"
- "# source: $filename$\n"
- "\"\"\"Generated protocol buffer code.\"\"\"\n",
- "filename", file->name());
- printer->Print(
- "from google.protobuf.internal import builder as _builder\n"
- "from google.protobuf import descriptor as _descriptor\n"
- "from google.protobuf import descriptor_pool as "
- "_descriptor_pool\n"
- "from google.protobuf import symbol_database as "
- "_symbol_database\n");
-
- printer->Print("# @@protoc_insertion_point(imports)\n\n");
- printer->Print("_sym_db = _symbol_database.Default()\n");
- printer->Print("\n\n");
-}
+const char kThirdPartyPrefix[] = "google3.third_party.py.";
// Returns a Python literal giving the default value for a field.
// If the field specifies no explicit default value, we'll return
@@ -131,13 +114,13 @@
switch (field.cpp_type()) {
case FieldDescriptor::CPPTYPE_INT32:
- return StrCat(field.default_value_int32());
+ return absl::StrCat(field.default_value_int32());
case FieldDescriptor::CPPTYPE_UINT32:
- return StrCat(field.default_value_uint32());
+ return absl::StrCat(field.default_value_uint32());
case FieldDescriptor::CPPTYPE_INT64:
- return StrCat(field.default_value_int64());
+ return absl::StrCat(field.default_value_int64());
case FieldDescriptor::CPPTYPE_UINT64:
- return StrCat(field.default_value_uint64());
+ return absl::StrCat(field.default_value_uint64());
case FieldDescriptor::CPPTYPE_DOUBLE: {
double value = field.default_value_double();
if (value == std::numeric_limits<double>::infinity()) {
@@ -173,9 +156,9 @@
case FieldDescriptor::CPPTYPE_BOOL:
return field.default_value_bool() ? "True" : "False";
case FieldDescriptor::CPPTYPE_ENUM:
- return StrCat(field.default_value_enum()->number());
+ return absl::StrCat(field.default_value_enum()->number());
case FieldDescriptor::CPPTYPE_STRING:
- return "b\"" + CEscape(field.default_value_string()) +
+ return "b\"" + absl::CEscape(field.default_value_string()) +
(field.type() != FieldDescriptor::TYPE_STRING
? "\""
: "\".decode('utf-8')");
@@ -212,26 +195,42 @@
return CodeGenerator::Feature::FEATURE_PROTO3_OPTIONAL;
}
+GeneratorOptions Generator::ParseParameter(const std::string& parameter,
+ std::string* error) const {
+ GeneratorOptions options;
+
+ std::vector<std::pair<std::string, std::string> > option_pairs;
+ ParseGeneratorParameter(parameter, &option_pairs);
+
+ for (const std::pair<std::string, std::string>& option : option_pairs) {
+ if (!opensource_runtime_ &&
+ option.first == "no_enforce_api_compatibility") {
+ // TODO(b/241584880): remove this legacy option, it has no effect.
+ } else if (!opensource_runtime_ && option.first == "bootstrap") {
+ options.bootstrap = true;
+ } else if (option.first == "pyi_out") {
+ options.generate_pyi = true;
+ } else if (option.first == "annotate_code") {
+ options.annotate_pyi = true;
+ } else {
+ *error = "Unknown generator option: " + option.first;
+ }
+ }
+ return options;
+}
+
bool Generator::Generate(const FileDescriptor* file,
const std::string& parameter,
GeneratorContext* context, std::string* error) const {
// -----------------------------------------------------------------
- // parse generator options
- bool cpp_generated_lib_linked = false;
+ GeneratorOptions options = ParseParameter(parameter, error);
+ if (!error->empty()) return false;
- std::vector<std::pair<std::string, std::string> > options;
- ParseGeneratorParameter(parameter, &options);
-
- for (int i = 0; i < options.size(); i++) {
- if (options[i].first == "cpp_generated_lib_linked") {
- cpp_generated_lib_linked = true;
- } else if (options[i].first == "pyi_out") {
- python::PyiGenerator pyi_generator;
- if (!pyi_generator.Generate(file, "", context, error)) {
- return false;
- }
- } else {
- *error = "Unknown generator option: " + options[i].first;
+ // Generate pyi typing information
+ if (options.generate_pyi) {
+ python::PyiGenerator pyi_generator;
+ std::string pyi_options = options.annotate_pyi ? "annotate_code" : "";
+ if (!pyi_generator.Generate(file, pyi_options, context, error)) {
return false;
}
}
@@ -243,75 +242,106 @@
// TODO(kenton): The proper thing to do would be to allocate any state on
// the stack and use that, so that the Generator class itself does not need
// to have any mutable members. Then it is implicitly thread-safe.
- MutexLock lock(&mutex_);
+ absl::MutexLock lock(&mutex_);
file_ = file;
std::string filename = GetFileName(file, ".py");
- pure_python_workable_ = !cpp_generated_lib_linked;
- if (HasPrefixString(file->name(), "google/protobuf/")) {
- pure_python_workable_ = true;
- }
FileDescriptorProto fdp;
file_->CopyTo(&fdp);
fdp.SerializeToString(&file_descriptor_serialized_);
+ if (!opensource_runtime_ && GeneratingDescriptorProto()) {
+ std::string bootstrap_filename =
+ "net/proto2/python/internal/descriptor_pb2.py";
+ if (options.bootstrap) {
+ filename = bootstrap_filename;
+ } else {
+ std::unique_ptr<io::ZeroCopyOutputStream> output(context->Open(filename));
+ io::Printer printer(output.get(), '$');
+ printer.Print(
+ "from $internal_package$ import descriptor_pb2\n"
+ "\n",
+ "internal_package", InternalPackage());
+
+ // For static checkers, we need to explicitly assign to the symbols we
+ // publicly export.
+ for (int i = 0; i < file_->message_type_count(); i++) {
+ const Descriptor* message = file_->message_type(i);
+ printer.Print("$name$ = descriptor_pb2.$name$\n", "name",
+ message->name());
+ }
+
+ // Sadly some clients access our internal variables (starting with "_").
+ // To support them, we iterate over *all* symbols to expose even the
+ // private ones. Statically type-checked code should (especially) never
+ // use these, so we don't worry about making them available to pytype
+ // checks.
+ printer.Print(
+ "\n"
+ "globals().update(descriptor_pb2.__dict__)\n"
+ "\n");
+
+ printer.Print(
+ "# @@protoc_insertion_point(module_scope)\n"
+ "\n");
+ return true;
+ }
+ }
std::unique_ptr<io::ZeroCopyOutputStream> output(context->Open(filename));
GOOGLE_CHECK(output.get());
io::Printer printer(output.get(), '$');
printer_ = &printer;
- PrintTopBoilerplate(printer_, file_, GeneratingDescriptorProto());
- if (pure_python_workable_) {
- PrintImports();
- }
+ PrintTopBoilerplate();
+ PrintImports();
PrintFileDescriptor();
- if (pure_python_workable_) {
- if (GeneratingDescriptorProto()) {
- printer_->Print("if _descriptor._USE_C_DESCRIPTORS == False:\n");
- printer_->Indent();
- // Create enums before message descriptors
- PrintAllNestedEnumsInFile();
- PrintMessageDescriptors();
- FixForeignFieldsInDescriptors();
- printer_->Outdent();
- printer_->Print("else:\n");
- printer_->Indent();
- }
- // Find the message descriptors first and then use the message
- // descriptor to find enums.
- printer_->Print(
- "_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())\n");
- if (GeneratingDescriptorProto()) {
- printer_->Outdent();
- }
+ if (GeneratingDescriptorProto()) {
+ printer_->Print("if _descriptor._USE_C_DESCRIPTORS == False:\n");
+ printer_->Indent();
+ // Create enums before message descriptors
+ PrintAllNestedEnumsInFile();
+ PrintMessageDescriptors();
+ FixForeignFieldsInDescriptors();
+ printer_->Outdent();
+ printer_->Print("else:\n");
+ printer_->Indent();
+ }
+ // Find the message descriptors first and then use the message
+ // descriptor to find enums.
+ printer_->Print(
+ "_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())\n");
+ if (GeneratingDescriptorProto()) {
+ printer_->Outdent();
}
std::string module_name = ModuleName(file->name());
+ if (!opensource_runtime_) {
+ module_name =
+ std::string(absl::StripPrefix(module_name, kThirdPartyPrefix));
+ }
printer_->Print(
"_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, '$module_name$', "
"globals())\n",
"module_name", module_name);
- if (pure_python_workable_) {
- printer.Print("if _descriptor._USE_C_DESCRIPTORS == False:\n");
- printer_->Indent();
+ printer.Print("if _descriptor._USE_C_DESCRIPTORS == False:\n");
+ printer_->Indent();
- // We have to fix up the extensions after the message classes themselves,
- // since they need to call static RegisterExtension() methods on these
- // classes.
- FixForeignFieldsInExtensions();
- // Descriptor options may have custom extensions. These custom options
- // can only be successfully parsed after we register corresponding
- // extensions. Therefore we parse all options again here to recognize
- // custom options that may be unknown when we define the descriptors.
- // This does not apply to services because they are not used by extensions.
- FixAllDescriptorOptions();
+ // We have to fix up the extensions after the message classes themselves,
+ // since they need to call static RegisterExtension() methods on these
+ // classes.
+ FixForeignFieldsInExtensions();
+ // Descriptor options may have custom extensions. These custom options
+ // can only be successfully parsed after we register corresponding
+ // extensions. Therefore we parse all options again here to recognize
+ // custom options that may be unknown when we define the descriptors.
+ // This does not apply to services because they are not used by extensions.
+ FixAllDescriptorOptions();
- // Set serialized_start and serialized_end.
- SetSerializedPbInterval();
+ // Set serialized_start and serialized_end.
+ SetSerializedPbInterval();
- printer_->Outdent();
- }
+ printer_->Outdent();
if (HasGenericServices(file)) {
printer_->Print(
"_builder.BuildServices(DESCRIPTOR, '$module_name$', globals())\n",
@@ -323,6 +353,34 @@
return !printer.failed();
}
+// file output by this generator.
+void Generator::PrintTopBoilerplate() const {
+ // TODO(robinson): Allow parameterization of Python version?
+ printer_->Print(
+ "# -*- coding: utf-8 -*-\n"
+ "# Generated by the protocol buffer compiler. DO NOT EDIT!\n"
+ "# source: $filename$\n"
+ "\"\"\"Generated protocol buffer code.\"\"\"\n",
+ "filename", file_->name());
+ if (!opensource_runtime_) {
+ // This import is needed so that compatibility proto1 compiler output
+ // inserted at protoc_insertion_point can refer to other protos like
+ // google3.a.b.c. Code generated by proto2 compiler doesn't do it, and
+ // instead uses aliases assigned when importing modules.
+ printer_->Print("import google3\n");
+ }
+ printer_->Print(
+ "from $internal_package$ import builder as _builder\n"
+ "from $public_package$ import descriptor as _descriptor\n"
+ "from $public_package$ import descriptor_pool as _descriptor_pool\n"
+ "from $public_package$ import symbol_database as _symbol_database\n",
+ "internal_package", InternalPackage(), "public_package", PublicPackage());
+
+ printer_->Print("# @@protoc_insertion_point(imports)\n\n");
+ printer_->Print("_sym_db = _symbol_database.Default()\n");
+ printer_->Print("\n\n");
+}
+
// Prints Python imports for all modules imported by |file|.
void Generator::PrintImports() const {
for (int i = 0; i < file_->dependency_count(); ++i) {
@@ -330,6 +388,10 @@
std::string module_name = ModuleName(filename);
std::string module_alias = ModuleAlias(filename);
+ if (!opensource_runtime_) {
+ module_name =
+ std::string(absl::StripPrefix(module_name, kThirdPartyPrefix));
+ }
if (ContainsPythonKeyword(module_name)) {
// If the module path contains a Python keyword, we have to quote the
// module name and import it using importlib. Otherwise the usual kind of
@@ -360,6 +422,10 @@
// Print public imports.
for (int i = 0; i < file_->public_dependency_count(); ++i) {
std::string module_name = ModuleName(file_->public_dependency(i)->name());
+ if (!opensource_runtime_) {
+ module_name =
+ std::string(absl::StripPrefix(module_name, kThirdPartyPrefix));
+ }
printer_->Print("from $module$ import *\n", "module", module_name);
}
printer_->Print("\n");
@@ -373,7 +439,7 @@
m["package"] = file_->package();
m["syntax"] = StringifySyntax(file_->syntax());
m["options"] = OptionsValue(file_->options().SerializeAsString());
- m["serialized_descriptor"] = strings::CHexEscape(file_descriptor_serialized_);
+ m["serialized_descriptor"] = absl::CHexEscape(file_descriptor_serialized_);
if (GeneratingDescriptorProto()) {
printer_->Print("if _descriptor._USE_C_DESCRIPTORS == False:\n");
printer_->Indent();
@@ -389,30 +455,26 @@
" create_key=_descriptor._internal_create_key,\n";
printer_->Print(m, file_descriptor_template);
printer_->Indent();
- if (pure_python_workable_) {
- printer_->Print("serialized_pb=b'$value$'\n", "value",
- strings::CHexEscape(file_descriptor_serialized_));
- if (file_->dependency_count() != 0) {
- printer_->Print(",\ndependencies=[");
- for (int i = 0; i < file_->dependency_count(); ++i) {
- std::string module_alias = ModuleAlias(file_->dependency(i)->name());
- printer_->Print("$module_alias$.DESCRIPTOR,", "module_alias",
- module_alias);
- }
- printer_->Print("]");
+ printer_->Print("serialized_pb=b'$value$'\n", "value",
+ absl::CHexEscape(file_descriptor_serialized_));
+ if (file_->dependency_count() != 0) {
+ printer_->Print(",\ndependencies=[");
+ for (int i = 0; i < file_->dependency_count(); ++i) {
+ std::string module_alias = ModuleAlias(file_->dependency(i)->name());
+ printer_->Print("$module_alias$.DESCRIPTOR,", "module_alias",
+ module_alias);
}
- if (file_->public_dependency_count() > 0) {
- printer_->Print(",\npublic_dependencies=[");
- for (int i = 0; i < file_->public_dependency_count(); ++i) {
- std::string module_alias =
- ModuleAlias(file_->public_dependency(i)->name());
- printer_->Print("$module_alias$.DESCRIPTOR,", "module_alias",
- module_alias);
- }
- printer_->Print("]");
+ printer_->Print("]");
+ }
+ if (file_->public_dependency_count() > 0) {
+ printer_->Print(",\npublic_dependencies=[");
+ for (int i = 0; i < file_->public_dependency_count(); ++i) {
+ std::string module_alias =
+ ModuleAlias(file_->public_dependency(i)->name());
+ printer_->Print("$module_alias$.DESCRIPTOR,", "module_alias",
+ module_alias);
}
- } else {
- printer_->Print("serialized_pb=''\n");
+ printer_->Print("]");
}
// TODO(falk): Also print options and fix the message_type, enum_type,
@@ -467,11 +529,9 @@
printer_->Indent();
printer_->Indent();
- if (pure_python_workable_) {
- for (int i = 0; i < enum_descriptor.value_count(); ++i) {
- PrintEnumValueDescriptor(*enum_descriptor.value(i));
- printer_->Print(",\n");
- }
+ for (int i = 0; i < enum_descriptor.value_count(); ++i) {
+ PrintEnumValueDescriptor(*enum_descriptor.value(i));
+ printer_->Print(",\n");
}
printer_->Outdent();
@@ -482,10 +542,8 @@
EnumDescriptorProto edp;
printer_->Outdent();
printer_->Print(")\n");
- if (pure_python_workable_) {
- printer_->Print("_sym_db.RegisterEnumDescriptor($name$)\n", "name",
- module_level_descriptor_name);
- }
+ printer_->Print("_sym_db.RegisterEnumDescriptor($name$)\n", "name",
+ module_level_descriptor_name);
printer_->Print("\n");
}
@@ -535,13 +593,13 @@
void Generator::PrintDescriptorKeyAndModuleName(
const ServiceDescriptor& descriptor) const {
std::string name = ModuleLevelServiceDescriptorName(descriptor);
- if (!pure_python_workable_) {
- name = "_descriptor.ServiceDescriptor(full_name='" +
- descriptor.full_name() + "')";
- }
printer_->Print("$descriptor_key$ = $descriptor_name$,\n", "descriptor_key",
kDescriptorKey, "descriptor_name", name);
std::string module_name = ModuleName(file_->name());
+ if (!opensource_runtime_) {
+ module_name =
+ std::string(absl::StripPrefix(module_name, kThirdPartyPrefix));
+ }
printer_->Print("__module__ = '$module_name$'\n", "module_name", module_name);
}
@@ -634,8 +692,8 @@
for (int i = 0; i < message_descriptor.extension_range_count(); ++i) {
const Descriptor::ExtensionRange* range =
message_descriptor.extension_range(i);
- printer_->Print("($start$, $end$), ", "start", StrCat(range->start),
- "end", StrCat(range->end));
+ printer_->Print("($start$, $end$), ", "start", absl::StrCat(range->start),
+ "end", absl::StrCat(range->end));
}
printer_->Print("],\n");
printer_->Print("oneofs=[\n");
@@ -645,7 +703,7 @@
m.clear();
m["name"] = desc->name();
m["full_name"] = desc->full_name();
- m["index"] = StrCat(desc->index());
+ m["index"] = absl::StrCat(desc->index());
options_string = OptionsValue(desc->options().SerializeAsString());
if (options_string == "None") {
m["serialized_options"] = "";
@@ -728,14 +786,13 @@
PrintNestedMessages(message_descriptor, qualified_name, to_register);
std::map<std::string, std::string> m;
m["descriptor_key"] = kDescriptorKey;
- if (pure_python_workable_) {
- m["descriptor_name"] = ModuleLevelDescriptorName(message_descriptor);
- } else {
- m["descriptor_name"] = "_descriptor.Descriptor(full_name='" +
- message_descriptor.full_name() + "')";
- }
+ m["descriptor_name"] = ModuleLevelDescriptorName(message_descriptor);
printer_->Print(m, "'$descriptor_key$' : $descriptor_name$,\n");
std::string module_name = ModuleName(file_->name());
+ if (!opensource_runtime_) {
+ module_name =
+ std::string(absl::StripPrefix(module_name, kThirdPartyPrefix));
+ }
printer_->Print("'__module__' : '$module_name$'\n", "module_name",
module_name);
printer_->Print("# @@protoc_insertion_point(class_scope:$full_name$)\n",
@@ -894,7 +951,7 @@
if (!containing_type) {
return ResolveKeyword(field.name());
}
- return strings::Substitute("$0.$1['$2']",
+ return absl::Substitute("$0.$1['$2']",
ModuleLevelDescriptorName(*containing_type),
python_dict_name, field.name());
}
@@ -991,8 +1048,8 @@
descriptor.options().SerializeToString(&options_string);
std::map<std::string, std::string> m;
m["name"] = descriptor.name();
- m["index"] = StrCat(descriptor.index());
- m["number"] = StrCat(descriptor.number());
+ m["index"] = absl::StrCat(descriptor.index());
+ m["number"] = absl::StrCat(descriptor.number());
m["options"] = OptionsValue(options_string);
printer_->Print(m,
"_descriptor.EnumValueDescriptor(\n"
@@ -1008,7 +1065,7 @@
if (serialized_options.length() == 0 || GeneratingDescriptorProto()) {
return "None";
} else {
- return "b'" + CEscape(serialized_options) + "'";
+ return "b'" + absl::CEscape(serialized_options) + "'";
}
}
@@ -1020,11 +1077,11 @@
std::map<std::string, std::string> m;
m["name"] = field.name();
m["full_name"] = field.full_name();
- m["index"] = StrCat(field.index());
- m["number"] = StrCat(field.number());
- m["type"] = StrCat(field.type());
- m["cpp_type"] = StrCat(field.cpp_type());
- m["label"] = StrCat(field.label());
+ m["index"] = absl::StrCat(field.index());
+ m["number"] = absl::StrCat(field.number());
+ m["type"] = absl::StrCat(field.type());
+ m["cpp_type"] = absl::StrCat(field.cpp_type());
+ m["label"] = absl::StrCat(field.label());
m["has_default_value"] = field.has_default_value() ? "True" : "False";
m["default_value"] = StringifyDefaultValue(field);
m["is_extension"] = is_extension ? "True" : "False";
@@ -1106,7 +1163,7 @@
// The C++ implementation doesn't guard against this either. Leaving
// it for now...
std::string name = NamePrefixedWithNestedTypes(descriptor, "_");
- ToUpper(&name);
+ absl::AsciiStrToUpper(&name);
// Module-private for now. Easy to make public later; almost impossible
// to make private later.
name = "_" + name;
@@ -1136,7 +1193,7 @@
std::string Generator::ModuleLevelServiceDescriptorName(
const ServiceDescriptor& descriptor) const {
std::string name = descriptor.name();
- ToUpper(&name);
+ absl::AsciiStrToUpper(&name);
name = "_" + name;
if (descriptor.file() != file_) {
name = ModuleAlias(descriptor.file()->name()) + "." + name;
@@ -1144,6 +1201,16 @@
return name;
}
+std::string Generator::PublicPackage() const {
+ return opensource_runtime_ ? "google.protobuf"
+ : "google3.net.google.protobuf.python.public";
+}
+
+std::string Generator::InternalPackage() const {
+ return opensource_runtime_ ? "google.protobuf.internal"
+ : "google3.net.google.protobuf.python.internal";
+}
+
// Prints standard constructor arguments serialized_start and serialized_end.
// Args:
// descriptor: The cpp descriptor to have a serialized reference.
@@ -1165,8 +1232,8 @@
printer_->Print(
"$name$._serialized_start=$serialized_start$\n"
"$name$._serialized_end=$serialized_end$\n",
- "name", name, "serialized_start", StrCat(offset), "serialized_end",
- StrCat(offset + sp.size()));
+ "name", name, "serialized_start", absl::StrCat(offset), "serialized_end",
+ absl::StrCat(offset + sp.size()));
}
namespace {
@@ -1256,7 +1323,7 @@
void Generator::FixOptionsForOneof(const OneofDescriptor& oneof) const {
std::string oneof_options = OptionsValue(oneof.options().SerializeAsString());
if (oneof_options != "None") {
- std::string oneof_name = strings::Substitute(
+ std::string oneof_name = absl::Substitute(
"$0.$1['$2']", ModuleLevelDescriptorName(*oneof.containing_type()),
"oneofs_by_name", oneof.name());
PrintDescriptorOptionsFixingCode(oneof_name, oneof_options, printer_);
@@ -1278,7 +1345,7 @@
OptionsValue(value_descriptor.options().SerializeAsString());
if (value_options != "None") {
PrintDescriptorOptionsFixingCode(
- StringPrintf("%s.values_by_name[\"%s\"]", descriptor_name.c_str(),
+ absl::StrFormat("%s.values_by_name[\"%s\"]", descriptor_name.c_str(),
value_descriptor.name().c_str()),
value_options, printer_);
}
diff --git a/src/google/protobuf/compiler/python/generator.h b/src/google/protobuf/compiler/python/generator.h
index f1fecbc..3fa946d 100644
--- a/src/google/protobuf/compiler/python/generator.h
+++ b/src/google/protobuf/compiler/python/generator.h
@@ -37,11 +37,11 @@
#include <string>
-#include <google/protobuf/stubs/mutex.h>
-#include <google/protobuf/compiler/code_generator.h>
+#include "absl/synchronization/mutex.h"
+#include "google/protobuf/compiler/code_generator.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -64,9 +64,18 @@
// If you create your own protocol compiler binary and you want it to support
// Python output, you can do so by registering an instance of this
// CodeGenerator with the CommandLineInterface in your main() function.
+
+struct GeneratorOptions {
+ bool generate_pyi = false;
+ bool annotate_pyi = false;
+ bool bootstrap = false;
+};
+
class PROTOC_EXPORT Generator : public CodeGenerator {
public:
Generator();
+ Generator(const Generator&) = delete;
+ Generator& operator=(const Generator&) = delete;
~Generator() override;
// CodeGenerator methods.
@@ -76,7 +85,13 @@
uint64_t GetSupportedFeatures() const override;
+ void set_opensource_runtime(bool opensource) {
+ opensource_runtime_ = opensource;
+ }
+
private:
+ GeneratorOptions ParseParameter(const std::string& parameter,
+ std::string* error) const;
void PrintImports() const;
void PrintFileDescriptor() const;
void PrintAllNestedEnumsInFile() const;
@@ -128,6 +143,7 @@
const FieldDescriptor& extension_field) const;
void FixForeignFieldsInNestedExtensions(const Descriptor& descriptor) const;
+ void PrintTopBoilerplate() const;
void PrintServices() const;
void PrintServiceDescriptors() const;
void PrintServiceDescriptor(const ServiceDescriptor& descriptor) const;
@@ -145,6 +161,8 @@
std::string ModuleLevelMessageName(const Descriptor& descriptor) const;
std::string ModuleLevelServiceDescriptorName(
const ServiceDescriptor& descriptor) const;
+ std::string PublicPackage() const;
+ std::string InternalPackage() const;
template <typename DescriptorT, typename DescriptorProtoT>
void PrintSerializedPbInterval(const DescriptorT& descriptor,
@@ -166,13 +184,12 @@
// Very coarse-grained lock to ensure that Generate() is reentrant.
// Guards file_, printer_ and file_descriptor_serialized_.
- mutable Mutex mutex_;
+ mutable absl::Mutex mutex_;
mutable const FileDescriptor* file_; // Set in Generate(). Under mutex_.
mutable std::string file_descriptor_serialized_;
mutable io::Printer* printer_; // Set in Generate(). Under mutex_.
- mutable bool pure_python_workable_;
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Generator);
+ bool opensource_runtime_ = true;
};
} // namespace python
@@ -180,6 +197,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_COMPILER_PYTHON_GENERATOR_H__
diff --git a/src/google/protobuf/compiler/python/helpers.cc b/src/google/protobuf/compiler/python/helpers.cc
index e4d3c13..e58ed9c 100644
--- a/src/google/protobuf/compiler/python/helpers.cc
+++ b/src/google/protobuf/compiler/python/helpers.cc
@@ -28,14 +28,18 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/compiler/python/helpers.h>
+#include "google/protobuf/compiler/python/helpers.h"
#include <algorithm>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/descriptor.pb.h>
+#include "absl/strings/escaping.h"
+#include "absl/strings/match.h"
+#include "absl/strings/str_replace.h"
+#include "absl/strings/str_split.h"
+#include "absl/strings/strip.h"
+#include "google/protobuf/compiler/code_generator.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/descriptor.pb.h"
namespace google {
namespace protobuf {
@@ -45,8 +49,7 @@
// Returns the Python module name expected for a given .proto filename.
std::string ModuleName(const std::string& filename) {
std::string basename = StripProto(filename);
- ReplaceCharacters(&basename, "-", '_');
- ReplaceCharacters(&basename, "/", '.');
+ absl::StrReplaceAll({{"-", "_"}, {"/", "."}}, &basename);
return basename + "_pb2";
}
@@ -68,7 +71,7 @@
kKeywords + (sizeof(kKeywords) / sizeof(kKeywords[0]));
bool ContainsPythonKeyword(const std::string& module_name) {
- std::vector<std::string> tokens = Split(module_name, ".");
+ std::vector<std::string> tokens = absl::StrSplit(module_name, ".");
for (int i = 0; i < static_cast<int>(tokens.size()); ++i) {
if (std::find(kKeywords, kKeywordsEnd, tokens[i]) != kKeywordsEnd) {
return true;
@@ -92,7 +95,7 @@
const std::string& suffix) {
std::string module_name = ModuleName(file_des->name());
std::string filename = module_name;
- ReplaceCharacters(&filename, ".", '/');
+ absl::StrReplaceAll({{".", "/"}}, &filename);
filename += suffix;
return filename;
}
@@ -101,6 +104,12 @@
return file->service_count() > 0 && file->options().py_generic_services();
}
+std::string GeneratedCodeToBase64(const GeneratedCodeInfo& annotations) {
+ std::string result;
+ absl::Base64Escape(annotations.SerializeAsString(), &result);
+ return result;
+}
+
template <typename DescriptorT>
std::string NamePrefixedWithNestedTypes(const DescriptorT& descriptor,
const std::string& separator) {
diff --git a/src/google/protobuf/compiler/python/helpers.h b/src/google/protobuf/compiler/python/helpers.h
index a68ceb1..3741fbb 100644
--- a/src/google/protobuf/compiler/python/helpers.h
+++ b/src/google/protobuf/compiler/python/helpers.h
@@ -33,14 +33,15 @@
#include <string>
-#include <google/protobuf/descriptor.h>
+#include "absl/strings/str_replace.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/descriptor.pb.h"
namespace google {
namespace protobuf {
namespace compiler {
namespace python {
-
std::string ModuleName(const std::string& filename);
std::string StrippedModuleName(const std::string& filename);
bool ContainsPythonKeyword(const std::string& module_name);
@@ -49,6 +50,7 @@
std::string GetFileName(const FileDescriptor* file_des,
const std::string& suffix);
bool HasGenericServices(const FileDescriptor* file);
+std::string GeneratedCodeToBase64(const GeneratedCodeInfo& annotations);
template <typename DescriptorT>
std::string NamePrefixedWithNestedTypes(const DescriptorT& descriptor,
diff --git a/src/google/protobuf/compiler/python/plugin_unittest.cc b/src/google/protobuf/compiler/python/plugin_unittest.cc
index 7f9589b..b8f25cf 100644
--- a/src/google/protobuf/compiler/python/plugin_unittest.cc
+++ b/src/google/protobuf/compiler/python/plugin_unittest.cc
@@ -33,15 +33,15 @@
#include <memory>
#include <string>
-#include <google/protobuf/testing/file.h>
-#include <google/protobuf/testing/file.h>
-#include <google/protobuf/compiler/command_line_interface.h>
-#include <google/protobuf/compiler/python/generator.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/testing/googletest.h>
+#include "google/protobuf/testing/file.h"
+#include "google/protobuf/testing/file.h"
+#include "google/protobuf/compiler/command_line_interface.h"
+#include "google/protobuf/compiler/python/generator.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/io/zero_copy_stream.h"
+#include "google/protobuf/testing/googletest.h"
#include <gtest/gtest.h>
+#include "absl/strings/str_split.h"
namespace google {
namespace protobuf {
@@ -107,7 +107,7 @@
std::string output;
GOOGLE_CHECK_OK(File::GetContents(TestTempDir() + "/test1_pb2.py", &output,
true));
- std::vector<std::string> lines = Split(output, "\n");
+ std::vector<std::string> lines = absl::StrSplit(output, "\n");
std::string expected_import = "import test2_pb2";
bool found_expected_import = false;
for (int i = 0; i < lines.size(); ++i) {
diff --git a/src/google/protobuf/compiler/python/pyi_generator.cc b/src/google/protobuf/compiler/python/pyi_generator.cc
index 1ccc9a2..b09ceb2 100644
--- a/src/google/protobuf/compiler/python/pyi_generator.cc
+++ b/src/google/protobuf/compiler/python/pyi_generator.cc
@@ -28,61 +28,57 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/compiler/python/pyi_generator.h>
+#include "google/protobuf/compiler/python/pyi_generator.h"
#include <string>
+#include <utility>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/compiler/python/helpers.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/io/zero_copy_stream.h>
+#include "absl/strings/ascii.h"
+#include "absl/strings/match.h"
+#include "absl/strings/str_split.h"
+#include "google/protobuf/compiler/python/helpers.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/io/zero_copy_stream.h"
namespace google {
namespace protobuf {
namespace compiler {
namespace python {
-template <typename DescriptorT>
-struct SortByName {
- bool operator()(const DescriptorT* l, const DescriptorT* r) const {
- return l->name() < r->name();
- }
-};
-
PyiGenerator::PyiGenerator() : file_(nullptr) {}
PyiGenerator::~PyiGenerator() {}
-void PyiGenerator::PrintItemMap(
- const std::map<std::string, std::string>& item_map) const {
- for (const auto& entry : item_map) {
- printer_->Print("$key$: $value$\n", "key", entry.first, "value",
- entry.second);
- }
-}
-
template <typename DescriptorT>
-std::string PyiGenerator::ModuleLevelName(
- const DescriptorT& descriptor,
- const std::map<std::string, std::string>& import_map) const {
+std::string PyiGenerator::ModuleLevelName(const DescriptorT& descriptor) const {
std::string name = NamePrefixedWithNestedTypes(descriptor, ".");
if (descriptor.file() != file_) {
std::string module_alias;
std::string filename = descriptor.file()->name();
- if (import_map.find(filename) == import_map.end()) {
+ if (import_map_.find(filename) == import_map_.end()) {
std::string module_name = ModuleName(descriptor.file()->name());
- std::vector<std::string> tokens = Split(module_name, ".");
+ std::vector<std::string> tokens = absl::StrSplit(module_name, ".");
module_alias = "_" + tokens.back();
} else {
- module_alias = import_map.at(filename);
+ module_alias = import_map_.at(filename);
}
name = module_alias + "." + name;
}
return name;
}
+std::string PyiGenerator::PublicPackage() const {
+ return opensource_runtime_ ? "google.protobuf"
+ : "google3.net.google.protobuf.python.public";
+}
+
+std::string PyiGenerator::InternalPackage() const {
+ return opensource_runtime_ ? "google.protobuf.internal"
+ : "google3.net.google.protobuf.python.internal";
+}
+
struct ImportModules {
bool has_repeated = false; // _containers
bool has_iterable = false; // typing.Iterable
@@ -156,7 +152,6 @@
void PyiGenerator::PrintImportForDescriptor(
const FileDescriptor& desc,
- std::map<std::string, std::string>* import_map,
std::set<std::string>* seen_aliases) const {
const std::string& filename = desc.name();
std::string module_name = StrippedModuleName(filename);
@@ -176,21 +171,19 @@
}
printer_->Print("$statement$ as $alias$\n", "statement",
import_statement, "alias", alias);
- (*import_map)[filename] = alias;
+ import_map_[filename] = alias;
seen_aliases->insert(alias);
}
-void PyiGenerator::PrintImports(
- std::map<std::string, std::string>* item_map,
- std::map<std::string, std::string>* import_map) const {
+void PyiGenerator::PrintImports() const {
// Prints imported dependent _pb2 files.
std::set<std::string> seen_aliases;
for (int i = 0; i < file_->dependency_count(); ++i) {
const FileDescriptor* dep = file_->dependency(i);
- PrintImportForDescriptor(*dep, import_map, &seen_aliases);
+ PrintImportForDescriptor(*dep, &seen_aliases);
for (int j = 0; j < dep->public_dependency_count(); ++j) {
PrintImportForDescriptor(
- *dep->public_dependency(j), import_map, &seen_aliases);
+ *dep->public_dependency(j), &seen_aliases);
}
}
@@ -202,6 +195,10 @@
if (file_->enum_type_count() > 0) {
import_modules.has_enums = true;
}
+ if (!opensource_runtime_ && file_->service_count() > 0) {
+ import_modules.has_optional = true;
+ import_modules.has_union = true;
+ }
for (int i = 0; i < file_->message_type_count(); i++) {
CheckImportModules(file_->message_type(i), &import_modules);
}
@@ -210,37 +207,50 @@
// required in the proto file.
if (import_modules.has_repeated) {
printer_->Print(
- "from google.protobuf.internal import containers as "
- "_containers\n");
+ "from $internal_package$ import containers as _containers\n",
+ "internal_package", InternalPackage());
}
if (import_modules.has_enums) {
printer_->Print(
- "from google.protobuf.internal import enum_type_wrapper"
- " as _enum_type_wrapper\n");
+ "from $internal_package$ import enum_type_wrapper as "
+ "_enum_type_wrapper\n",
+ "internal_package", InternalPackage());
}
if (import_modules.has_extendable) {
printer_->Print(
- "from google.protobuf.internal import python_message"
- " as _python_message\n");
+ "from $internal_package$ import python_message as _python_message\n",
+ "internal_package", InternalPackage());
}
if (import_modules.has_well_known_type) {
printer_->Print(
- "from google.protobuf.internal import well_known_types"
- " as _well_known_types\n");
+ "from $internal_package$ import well_known_types as "
+ "_well_known_types\n",
+ "internal_package", InternalPackage());
}
- printer_->Print(
- "from google.protobuf import"
- " descriptor as _descriptor\n");
+ printer_->Print("from $public_package$ import descriptor as _descriptor\n",
+ "public_package", PublicPackage());
if (import_modules.has_messages) {
- printer_->Print(
- "from google.protobuf import message as _message\n");
+ printer_->Print("from $public_package$ import message as _message\n",
+ "public_package", PublicPackage());
}
- if (HasGenericServices(file_)) {
- printer_->Print(
- "from google.protobuf import service as"
- " _service\n");
+ if (opensource_runtime_) {
+ if (HasGenericServices(file_)) {
+ printer_->Print("from $public_package$ import service as _service\n",
+ "public_package", PublicPackage());
+ }
+ } else {
+ if (file_->service_count() > 0) {
+ printer_->Print(
+ "from google3.net.rpc.python import proto_python_api_2_stub as "
+ "_proto_python_api_2_stub\n"
+ "from google3.net.rpc.python import pywraprpc as _pywraprpc\n"
+ "from google3.net.rpc.python import rpcserver as _rpcserver\n");
+ }
}
printer_->Print("from typing import ");
+ if (!opensource_runtime_ && file_->service_count() > 0) {
+ printer_->Print("Any as _Any, ");
+ }
printer_->Print("ClassVar as _ClassVar");
if (import_modules.has_iterable) {
printer_->Print(", Iterable as _Iterable");
@@ -254,7 +264,7 @@
if (import_modules.has_union) {
printer_->Print(", Union as _Union");
}
- printer_->Print("\n\n");
+ printer_->Print("\n");
// Public imports
for (int i = 0; i < file_->public_dependency_count(); ++i) {
@@ -272,17 +282,16 @@
module_name, "enum_class",
public_dep->enum_type(i)->name());
}
- // Enum values for public imports
- for (int i = 0; i < public_dep->enum_type_count(); ++i) {
- const EnumDescriptor* enum_descriptor = public_dep->enum_type(i);
- for (int j = 0; j < enum_descriptor->value_count(); ++j) {
- (*item_map)[enum_descriptor->value(j)->name()] =
- ModuleLevelName(*enum_descriptor, *import_map);
- }
- }
- // Top level extensions for public imports
- AddExtensions(*public_dep, item_map);
}
+printer_->Print("\n");
+}
+
+// Annotate wrapper for debugging purposes
+// Print a message after Annotate to see what is annotated.
+template <typename DescriptorT>
+void PyiGenerator::Annotate(const std::string& label,
+ const DescriptorT* descriptor) const {
+printer_->Annotate(label.c_str(), descriptor);
}
void PyiGenerator::PrintEnum(const EnumDescriptor& enum_descriptor) const {
@@ -291,22 +300,22 @@
"class $enum_name$(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):\n"
" __slots__ = []\n",
"enum_name", enum_name);
+ Annotate("enum_name", &enum_descriptor);
}
-// Adds enum value to item map which will be ordered and printed later.
-void PyiGenerator::AddEnumValue(
- const EnumDescriptor& enum_descriptor,
- std::map<std::string, std::string>* item_map,
- const std::map<std::string, std::string>& import_map) const {
+void PyiGenerator::PrintEnumValues(
+ const EnumDescriptor& enum_descriptor) const {
// enum values
- std::string module_enum_name = ModuleLevelName(enum_descriptor, import_map);
+ std::string module_enum_name = ModuleLevelName(enum_descriptor);
for (int j = 0; j < enum_descriptor.value_count(); ++j) {
const EnumValueDescriptor* value_descriptor = enum_descriptor.value(j);
- (*item_map)[value_descriptor->name()] = module_enum_name;
+ printer_->Print("$name$: $module_enum_name$\n",
+ "name", value_descriptor->name(),
+ "module_enum_name", module_enum_name);
+ Annotate("name", value_descriptor);
}
}
-// Prints top level enums
void PyiGenerator::PrintTopLevelEnums() const {
for (int i = 0; i < file_->enum_type_count(); ++i) {
printer_->Print("\n");
@@ -314,25 +323,23 @@
}
}
-// Add top level extensions to item_map which will be ordered and
-// printed later.
template <typename DescriptorT>
-void PyiGenerator::AddExtensions(
- const DescriptorT& descriptor,
- std::map<std::string, std::string>* item_map) const {
+void PyiGenerator::PrintExtensions(const DescriptorT& descriptor) const {
for (int i = 0; i < descriptor.extension_count(); ++i) {
const FieldDescriptor* extension_field = descriptor.extension(i);
std::string constant_name = extension_field->name() + "_FIELD_NUMBER";
- ToUpper(&constant_name);
- (*item_map)[constant_name] = "_ClassVar[int]";
- (*item_map)[extension_field->name()] = "_descriptor.FieldDescriptor";
+ absl::AsciiStrToUpper(&constant_name);
+ printer_->Print("$constant_name$: _ClassVar[int]\n",
+ "constant_name", constant_name);
+ printer_->Print("$name$: _descriptor.FieldDescriptor\n",
+ "name", extension_field->name());
+ Annotate("name", extension_field);
}
}
// Returns the string format of a field's cpp_type
std::string PyiGenerator::GetFieldType(
- const FieldDescriptor& field_des, const Descriptor& containing_des,
- const std::map<std::string, std::string>& import_map) const {
+ const FieldDescriptor& field_des, const Descriptor& containing_des) const {
switch (field_des.cpp_type()) {
case FieldDescriptor::CPPTYPE_INT32:
case FieldDescriptor::CPPTYPE_UINT32:
@@ -345,7 +352,7 @@
case FieldDescriptor::CPPTYPE_BOOL:
return "bool";
case FieldDescriptor::CPPTYPE_ENUM:
- return ModuleLevelName(*field_des.enum_type(), import_map);
+ return ModuleLevelName(*field_des.enum_type());
case FieldDescriptor::CPPTYPE_STRING:
if (field_des.type() == FieldDescriptor::TYPE_STRING) {
return "str";
@@ -356,7 +363,7 @@
// If the field is inside a nested message and the nested message has the
// same name as a top-level message, then we need to prefix the field type
// with the module name for disambiguation.
- std::string name = ModuleLevelName(*field_des.message_type(), import_map);
+ std::string name = ModuleLevelName(*field_des.message_type());
if ((containing_des.containing_type() != nullptr &&
name == containing_des.name())) {
std::string module = ModuleName(field_des.file()->name());
@@ -371,8 +378,7 @@
}
void PyiGenerator::PrintMessage(
- const Descriptor& message_descriptor, bool is_nested,
- const std::map<std::string, std::string>& import_map) const {
+ const Descriptor& message_descriptor, bool is_nested) const {
if (!is_nested) {
printer_->Print("\n");
}
@@ -387,20 +393,15 @@
}
printer_->Print("class $class_name$(_message.Message$extra_base$):\n",
"class_name", class_name, "extra_base", extra_base);
+ Annotate("class_name", &message_descriptor);
printer_->Indent();
printer_->Indent();
- std::vector<const FieldDescriptor*> fields;
- fields.reserve(message_descriptor.field_count());
- for (int i = 0; i < message_descriptor.field_count(); ++i) {
- fields.push_back(message_descriptor.field(i));
- }
- std::sort(fields.begin(), fields.end(), SortByName<FieldDescriptor>());
-
// Prints slots
printer_->Print("__slots__ = [", "class_name", class_name);
bool first_item = true;
- for (const auto& field_des : fields) {
+ for (int i = 0; i < message_descriptor.field_count(); ++i) {
+ const FieldDescriptor* field_des = message_descriptor.field(i);
if (IsPythonKeyword(field_des->name())) {
continue;
}
@@ -413,48 +414,34 @@
}
printer_->Print("]\n");
- std::map<std::string, std::string> item_map;
// Prints Extensions for extendable messages
if (message_descriptor.extension_range_count() > 0) {
- item_map["Extensions"] = "_python_message._ExtensionDict";
+ printer_->Print("Extensions: _python_message._ExtensionDict\n");
}
// Prints nested enums
- std::vector<const EnumDescriptor*> nested_enums;
- nested_enums.reserve(message_descriptor.enum_type_count());
for (int i = 0; i < message_descriptor.enum_type_count(); ++i) {
- nested_enums.push_back(message_descriptor.enum_type(i));
- }
- std::sort(nested_enums.begin(), nested_enums.end(),
- SortByName<EnumDescriptor>());
-
- for (const auto& entry : nested_enums) {
- PrintEnum(*entry);
- // Adds enum value to item_map which will be ordered and printed later
- AddEnumValue(*entry, &item_map, import_map);
+ PrintEnum(*message_descriptor.enum_type(i));
+ PrintEnumValues(*message_descriptor.enum_type(i));
}
// Prints nested messages
- std::vector<const Descriptor*> nested_messages;
- nested_messages.reserve(message_descriptor.nested_type_count());
for (int i = 0; i < message_descriptor.nested_type_count(); ++i) {
- nested_messages.push_back(message_descriptor.nested_type(i));
- }
- std::sort(nested_messages.begin(), nested_messages.end(),
- SortByName<Descriptor>());
-
- for (const auto& entry : nested_messages) {
- PrintMessage(*entry, true, import_map);
+ PrintMessage(*message_descriptor.nested_type(i), true);
}
- // Adds extensions to item_map which will be ordered and printed later
- AddExtensions(message_descriptor, &item_map);
+ PrintExtensions(message_descriptor);
- // Adds field number and field descriptor to item_map
+ // Prints field number
for (int i = 0; i < message_descriptor.field_count(); ++i) {
const FieldDescriptor& field_des = *message_descriptor.field(i);
- item_map[ToUpper(field_des.name()) + "_FIELD_NUMBER"] =
- "_ClassVar[int]";
+ printer_->Print(
+ "$field_number_name$: _ClassVar[int]\n", "field_number_name",
+ absl::AsciiStrToUpper(field_des.name()) + "_FIELD_NUMBER");
+ }
+ // Prints field name and type
+ for (int i = 0; i < message_descriptor.field_count(); ++i) {
+ const FieldDescriptor& field_des = *message_descriptor.field(i);
if (IsPythonKeyword(field_des.name())) {
continue;
}
@@ -465,27 +452,26 @@
field_type = (value_des->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE
? "_containers.MessageMap["
: "_containers.ScalarMap[");
- field_type += GetFieldType(*key_des, message_descriptor, import_map);
+ field_type += GetFieldType(*key_des, message_descriptor);
field_type += ", ";
- field_type += GetFieldType(*value_des, message_descriptor, import_map);
+ field_type += GetFieldType(*value_des, message_descriptor);
} else {
if (field_des.is_repeated()) {
field_type = (field_des.cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE
? "_containers.RepeatedCompositeFieldContainer["
: "_containers.RepeatedScalarFieldContainer[");
}
- field_type += GetFieldType(field_des, message_descriptor, import_map);
+ field_type += GetFieldType(field_des, message_descriptor);
}
if (field_des.is_repeated()) {
field_type += "]";
}
- item_map[field_des.name()] = field_type;
+ printer_->Print("$name$: $type$\n",
+ "name", field_des.name(), "type", field_type);
+ Annotate("name", &field_des);
}
- // Prints all items in item_map
- PrintItemMap(item_map);
-
// Prints __init__
printer_->Print("def __init__(self");
bool has_key_words = false;
@@ -505,6 +491,7 @@
}
is_first = false;
printer_->Print(", $field_name$: ", "field_name", field_name);
+ Annotate("field_name", field_des);
if (field_des->is_repeated() ||
field_des->cpp_type() != FieldDescriptor::CPPTYPE_BOOL) {
printer_->Print("_Optional[");
@@ -513,9 +500,9 @@
const Descriptor* map_entry = field_des->message_type();
printer_->Print(
"_Mapping[$key_type$, $value_type$]", "key_type",
- GetFieldType(*map_entry->field(0), message_descriptor, import_map),
+ GetFieldType(*map_entry->field(0), message_descriptor),
"value_type",
- GetFieldType(*map_entry->field(1), message_descriptor, import_map));
+ GetFieldType(*map_entry->field(1), message_descriptor));
} else {
if (field_des->is_repeated()) {
printer_->Print("_Iterable[");
@@ -523,15 +510,15 @@
if (field_des->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
printer_->Print(
"_Union[$type_name$, _Mapping]", "type_name",
- GetFieldType(*field_des, message_descriptor, import_map));
+ GetFieldType(*field_des, message_descriptor));
} else {
if (field_des->cpp_type() == FieldDescriptor::CPPTYPE_ENUM) {
printer_->Print("_Union[$type_name$, str]", "type_name",
- ModuleLevelName(*field_des->enum_type(), import_map));
+ ModuleLevelName(*field_des->enum_type()));
} else {
printer_->Print(
"$type_name$", "type_name",
- GetFieldType(*field_des, message_descriptor, import_map));
+ GetFieldType(*field_des, message_descriptor));
}
}
if (field_des->is_repeated()) {
@@ -553,78 +540,87 @@
printer_->Outdent();
}
-void PyiGenerator::PrintMessages(
- const std::map<std::string, std::string>& import_map) const {
+void PyiGenerator::PrintMessages() const {
// Deterministically order the descriptors.
- std::vector<const Descriptor*> messages;
- messages.reserve(file_->message_type_count());
for (int i = 0; i < file_->message_type_count(); ++i) {
- messages.push_back(file_->message_type(i));
- }
- std::sort(messages.begin(), messages.end(), SortByName<Descriptor>());
-
- for (const auto& entry : messages) {
- PrintMessage(*entry, false, import_map);
+ PrintMessage(*file_->message_type(i), false);
}
}
void PyiGenerator::PrintServices() const {
- std::vector<const ServiceDescriptor*> services;
- services.reserve(file_->service_count());
- for (int i = 0; i < file_->service_count(); ++i) {
- services.push_back(file_->service(i));
- }
- std::sort(services.begin(), services.end(), SortByName<ServiceDescriptor>());
-
// Prints $Service$ and $Service$_Stub classes
- for (const auto& entry : services) {
+ for (int i = 0; i < file_->service_count(); ++i) {
printer_->Print("\n");
printer_->Print(
"class $service_name$(_service.service): ...\n\n"
"class $service_name$_Stub($service_name$): ...\n",
- "service_name", entry->name());
+ "service_name", file_->service(i)->name());
}
}
+
bool PyiGenerator::Generate(const FileDescriptor* file,
const std::string& parameter,
GeneratorContext* context,
std::string* error) const {
- MutexLock lock(&mutex_);
+ absl::MutexLock lock(&mutex_);
+ import_map_.clear();
// Calculate file name.
file_ = file;
- std::string filename =
- parameter.empty() ? GetFileName(file, ".pyi") : parameter;
+ // In google3, devtools/python/blaze/pytype/pytype_impl.bzl uses --pyi_out to
+ // directly set the output file name.
+ std::vector<std::pair<std::string, std::string> > options;
+ ParseGeneratorParameter(parameter, &options);
+
+ std::string filename;
+ bool annotate_code = false;
+ for (const std::pair<std::string, std::string>& option : options) {
+ if (option.first == "annotate_code") {
+ annotate_code = true;
+ } else if (absl::EndsWith(option.first, ".pyi")) {
+ filename = option.first;
+ } else {
+ *error = "Unknown generator option: " + option.first;
+ return false;
+ }
+ }
+
+ if (filename.empty()) {
+ filename = GetFileName(file, ".pyi");
+ }
std::unique_ptr<io::ZeroCopyOutputStream> output(context->Open(filename));
GOOGLE_CHECK(output.get());
- io::Printer printer(output.get(), '$');
+ GeneratedCodeInfo annotations;
+ io::AnnotationProtoCollector<GeneratedCodeInfo> annotation_collector(
+ &annotations);
+ io::Printer printer(output.get(), '$',
+ annotate_code ? &annotation_collector : nullptr);
printer_ = &printer;
- // item map will store "DESCRIPTOR", top level extensions, top level enum
- // values. The items will be sorted and printed later.
- std::map<std::string, std::string> item_map;
+ PrintImports();
+ printer_->Print("DESCRIPTOR: _descriptor.FileDescriptor\n");
- // Adds "DESCRIPTOR" into item_map.
- item_map["DESCRIPTOR"] = "_descriptor.FileDescriptor";
-
- // import_map will be a mapping from filename to module alias, e.g.
- // "google3/foo/bar.py" -> "_bar"
- std::map<std::string, std::string> import_map;
-
- PrintImports(&item_map, &import_map);
- // Adds top level enum values to item_map.
- for (int i = 0; i < file_->enum_type_count(); ++i) {
- AddEnumValue(*file_->enum_type(i), &item_map, import_map);
+ // Prints extensions and enums from imports.
+ for (int i = 0; i < file_->public_dependency_count(); ++i) {
+ const FileDescriptor* public_dep = file_->public_dependency(i);
+ PrintExtensions(*public_dep);
+ for (int i = 0; i < public_dep->enum_type_count(); ++i) {
+ const EnumDescriptor* enum_descriptor = public_dep->enum_type(i);
+ PrintEnumValues(*enum_descriptor);
+ }
}
- // Adds top level extensions to item_map.
- AddExtensions(*file_, &item_map);
- // Prints item map
- PrintItemMap(item_map);
- PrintMessages(import_map);
PrintTopLevelEnums();
- if (HasGenericServices(file)) {
+ // Prints top level enum values
+ for (int i = 0; i < file_->enum_type_count(); ++i) {
+ PrintEnumValues(*file_->enum_type(i));
+ }
+ // Prints top level Extensions
+ PrintExtensions(*file_);
+ PrintMessages();
+
+ if (opensource_runtime_ && HasGenericServices(file)) {
PrintServices();
}
return true;
diff --git a/src/google/protobuf/compiler/python/pyi_generator.h b/src/google/protobuf/compiler/python/pyi_generator.h
index 9611ed4..7f1e5d8 100644
--- a/src/google/protobuf/compiler/python/pyi_generator.h
+++ b/src/google/protobuf/compiler/python/pyi_generator.h
@@ -39,11 +39,11 @@
#include <set>
#include <string>
-#include <google/protobuf/stubs/mutex.h>
-#include <google/protobuf/compiler/code_generator.h>
+#include "absl/synchronization/mutex.h"
+#include "google/protobuf/compiler/code_generator.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -63,6 +63,8 @@
class PROTOC_EXPORT PyiGenerator : public google::protobuf::compiler::CodeGenerator {
public:
PyiGenerator();
+ PyiGenerator(const PyiGenerator&) = delete;
+ PyiGenerator& operator=(const PyiGenerator&) = delete;
~PyiGenerator() override;
// CodeGenerator methods.
@@ -76,38 +78,35 @@
private:
void PrintImportForDescriptor(const FileDescriptor& desc,
- std::map<std::string, std::string>* import_map,
std::set<std::string>* seen_aliases) const;
- void PrintImports(std::map<std::string, std::string>* item_map,
- std::map<std::string, std::string>* import_map) const;
- void PrintEnum(const EnumDescriptor& enum_descriptor) const;
- void AddEnumValue(const EnumDescriptor& enum_descriptor,
- std::map<std::string, std::string>* item_map,
- const std::map<std::string, std::string>& import_map) const;
+ template <typename DescriptorT>
+ void Annotate(const std::string& label, const DescriptorT* descriptor) const;
+ void PrintImports() const;
void PrintTopLevelEnums() const;
+ void PrintEnum(const EnumDescriptor& enum_descriptor) const;
+ void PrintEnumValues(const EnumDescriptor& enum_descriptor) const;
template <typename DescriptorT>
- void AddExtensions(const DescriptorT& descriptor,
- std::map<std::string, std::string>* item_map) const;
- void PrintMessages(
- const std::map<std::string, std::string>& import_map) const;
- void PrintMessage(const Descriptor& message_descriptor, bool is_nested,
- const std::map<std::string, std::string>& import_map) const;
+ void PrintExtensions(const DescriptorT& descriptor) const;
+ void PrintMessages() const;
+ void PrintMessage(const Descriptor& message_descriptor, bool is_nested) const;
void PrintServices() const;
- void PrintItemMap(const std::map<std::string, std::string>& item_map) const;
std::string GetFieldType(
- const FieldDescriptor& field_des, const Descriptor& containing_des,
- const std::map<std::string, std::string>& import_map) const;
+ const FieldDescriptor& field_des, const Descriptor& containing_des) const;
template <typename DescriptorT>
- std::string ModuleLevelName(
- const DescriptorT& descriptor,
- const std::map<std::string, std::string>& import_map) const;
+ std::string ModuleLevelName(const DescriptorT& descriptor) const;
+ std::string PublicPackage() const;
+ std::string InternalPackage() const;
+
+ bool opensource_runtime_ = true;
// Very coarse-grained lock to ensure that Generate() is reentrant.
- // Guards file_ and printer_.
- mutable Mutex mutex_;
+ // Guards file_, printer_, and import_map_.
+ mutable absl::Mutex mutex_;
mutable const FileDescriptor* file_; // Set in Generate(). Under mutex_.
mutable io::Printer* printer_; // Set in Generate(). Under mutex_.
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(PyiGenerator);
+ // import_map will be a mapping from filename to module alias, e.g.
+ // "google3/foo/bar.py" -> "_bar"
+ mutable std::map<std::string, std::string> import_map_;
};
} // namespace python
@@ -115,6 +114,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_COMPILER_PYTHON_PYI_GENERATOR_H__
diff --git a/src/google/protobuf/compiler/python/python_generator.h b/src/google/protobuf/compiler/python/python_generator.h
index 21d48cd..bb31797 100644
--- a/src/google/protobuf/compiler/python/python_generator.h
+++ b/src/google/protobuf/compiler/python/python_generator.h
@@ -1,6 +1,6 @@
#ifndef GOOGLE_PROTOBUF_COMPILER_PYTHON_PYTHON_GENERATOR_H_
#define GOOGLE_PROTOBUF_COMPILER_PYTHON_PYTHON_GENERATOR_H_
-#include <google/protobuf/compiler/python/generator.h>
+#include "google/protobuf/compiler/python/generator.h"
#endif // GOOGLE_PROTOBUF_COMPILER_PYTHON_PYTHON_GENERATOR_H_
diff --git a/src/google/protobuf/compiler/ruby/BUILD.bazel b/src/google/protobuf/compiler/ruby/BUILD.bazel
new file mode 100644
index 0000000..7abfeb6
--- /dev/null
+++ b/src/google/protobuf/compiler/ruby/BUILD.bazel
@@ -0,0 +1,70 @@
+################################################################################
+# Protocol Buffers Compiler - Ruby code generator
+################################################################################
+
+load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test")
+load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
+load("//build_defs:cpp_opts.bzl", "COPTS")
+
+cc_library(
+ name = "ruby",
+ srcs = ["ruby_generator.cc"],
+ hdrs = ["ruby_generator.h"],
+ copts = COPTS,
+ include_prefix = "google/protobuf/compiler/ruby",
+ visibility = [
+ "//pkg:__pkg__",
+ "//src/google/protobuf/compiler:__pkg__",
+ ],
+ deps = [
+ "//src/google/protobuf:protobuf_nowkt",
+ "//src/google/protobuf/compiler:code_generator",
+ ],
+)
+
+cc_test(
+ name = "generator_unittest",
+ srcs = ["ruby_generator_unittest.cc"],
+ data = [
+ "ruby_generated_code.proto",
+ "ruby_generated_code_pb.rb",
+ "ruby_generated_code_proto2.proto",
+ "ruby_generated_code_proto2_import.proto",
+ "ruby_generated_code_proto2_pb.rb",
+ "ruby_generated_pkg_explicit.proto",
+ "ruby_generated_pkg_explicit_legacy.proto",
+ "ruby_generated_pkg_explicit_legacy_pb.rb",
+ "ruby_generated_pkg_explicit_pb.rb",
+ "ruby_generated_pkg_implicit.proto",
+ "ruby_generated_pkg_implicit_pb.rb",
+ "//src/google/protobuf:testdata",
+ ],
+ deps = [
+ ":ruby",
+ "//src/google/protobuf/compiler:command_line_interface",
+ "//src/google/protobuf/io",
+ "//src/google/protobuf/testing",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+################################################################################
+# Distribution packaging
+################################################################################
+
+pkg_files(
+ name = "dist_files",
+ srcs = glob(["**/*"]),
+ strip_prefix = strip_prefix.from_root(""),
+ visibility = ["//src:__pkg__"],
+)
+
+filegroup(
+ name = "test_srcs",
+ srcs = glob([
+ "*_test.cc",
+ "*unittest.cc",
+ ]),
+ visibility = ["//src/google/protobuf/compiler:__pkg__"],
+)
diff --git a/src/google/protobuf/compiler/ruby/ruby_generated_code.proto b/src/google/protobuf/compiler/ruby/ruby_generated_code.proto
index 70ec9f1..56173c2 100644
--- a/src/google/protobuf/compiler/ruby/ruby_generated_code.proto
+++ b/src/google/protobuf/compiler/ruby/ruby_generated_code.proto
@@ -1,3 +1,33 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
syntax = "proto3";
package A.B.C;
diff --git a/src/google/protobuf/compiler/ruby/ruby_generated_code_proto2.proto b/src/google/protobuf/compiler/ruby/ruby_generated_code_proto2.proto
index ea7f783..cd4955d 100644
--- a/src/google/protobuf/compiler/ruby/ruby_generated_code_proto2.proto
+++ b/src/google/protobuf/compiler/ruby/ruby_generated_code_proto2.proto
@@ -1,3 +1,33 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
syntax = "proto2";
package A.B.C;
diff --git a/src/google/protobuf/compiler/ruby/ruby_generated_code_proto2_import.proto b/src/google/protobuf/compiler/ruby/ruby_generated_code_proto2_import.proto
index 9ec0738..9fc1719 100644
--- a/src/google/protobuf/compiler/ruby/ruby_generated_code_proto2_import.proto
+++ b/src/google/protobuf/compiler/ruby/ruby_generated_code_proto2_import.proto
@@ -1,3 +1,33 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
syntax = "proto2";
package A.B.C;
diff --git a/src/google/protobuf/compiler/ruby/ruby_generated_pkg_explicit.proto b/src/google/protobuf/compiler/ruby/ruby_generated_pkg_explicit.proto
index 8d7c948..153cec6 100644
--- a/src/google/protobuf/compiler/ruby/ruby_generated_pkg_explicit.proto
+++ b/src/google/protobuf/compiler/ruby/ruby_generated_pkg_explicit.proto
@@ -1,3 +1,33 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
syntax = "proto3";
package one.two.a_three;
diff --git a/src/google/protobuf/compiler/ruby/ruby_generated_pkg_explicit_legacy.proto b/src/google/protobuf/compiler/ruby/ruby_generated_pkg_explicit_legacy.proto
index 7a0d260..6515634 100644
--- a/src/google/protobuf/compiler/ruby/ruby_generated_pkg_explicit_legacy.proto
+++ b/src/google/protobuf/compiler/ruby/ruby_generated_pkg_explicit_legacy.proto
@@ -1,3 +1,33 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
syntax = "proto3";
package one.two.a_three.and;
diff --git a/src/google/protobuf/compiler/ruby/ruby_generated_pkg_implicit.proto b/src/google/protobuf/compiler/ruby/ruby_generated_pkg_implicit.proto
index 544db64..23eaa43 100644
--- a/src/google/protobuf/compiler/ruby/ruby_generated_pkg_implicit.proto
+++ b/src/google/protobuf/compiler/ruby/ruby_generated_pkg_implicit.proto
@@ -1,3 +1,33 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
syntax = "proto3";
package one.two.a_three;
diff --git a/src/google/protobuf/compiler/ruby/ruby_generator.cc b/src/google/protobuf/compiler/ruby/ruby_generator.cc
index d4a53d5..be643d8 100644
--- a/src/google/protobuf/compiler/ruby/ruby_generator.cc
+++ b/src/google/protobuf/compiler/ruby/ruby_generator.cc
@@ -28,17 +28,17 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#include "google/protobuf/compiler/ruby/ruby_generator.h"
+
#include <iomanip>
#include <sstream>
-#include <google/protobuf/compiler/code_generator.h>
-#include <google/protobuf/compiler/plugin.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-
-#include <google/protobuf/compiler/ruby/ruby_generator.h>
+#include "google/protobuf/compiler/code_generator.h"
+#include "google/protobuf/compiler/plugin.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/io/zero_copy_stream.h"
namespace google {
namespace protobuf {
@@ -68,7 +68,7 @@
}
std::string GetRequireName(const std::string& proto_file) {
- int lastindex = proto_file.find_last_of(".");
+ int lastindex = proto_file.find_last_of('.');
return proto_file.substr(0, lastindex) + "_pb";
}
@@ -421,7 +421,7 @@
// -> A.B.C
if (package_name.find("::") != std::string::npos) {
need_change_to_module = false;
- } else if (package_name.find(".") != std::string::npos) {
+ } else if (package_name.find('.') != std::string::npos) {
GOOGLE_LOG(WARNING) << "ruby_package option should be in the form of:"
<< " 'A::B::C' and not 'A.B.C'";
}
diff --git a/src/google/protobuf/compiler/ruby/ruby_generator.h b/src/google/protobuf/compiler/ruby/ruby_generator.h
index 647bb83..a6881ff 100644
--- a/src/google/protobuf/compiler/ruby/ruby_generator.h
+++ b/src/google/protobuf/compiler/ruby/ruby_generator.h
@@ -35,9 +35,9 @@
#include <string>
-#include <google/protobuf/compiler/code_generator.h>
+#include "google/protobuf/compiler/code_generator.h"
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -62,6 +62,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_COMPILER_RUBY_GENERATOR_H__
diff --git a/src/google/protobuf/compiler/ruby/ruby_generator_unittest.cc b/src/google/protobuf/compiler/ruby/ruby_generator_unittest.cc
index c3ce1d3..31d3770 100644
--- a/src/google/protobuf/compiler/ruby/ruby_generator_unittest.cc
+++ b/src/google/protobuf/compiler/ruby/ruby_generator_unittest.cc
@@ -28,17 +28,17 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <memory>
+#include "google/protobuf/compiler/ruby/ruby_generator.h"
+
#include <list>
+#include <memory>
-#include <google/protobuf/compiler/ruby/ruby_generator.h>
-#include <google/protobuf/compiler/command_line_interface.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/io/printer.h>
-
-#include <google/protobuf/testing/googletest.h>
+#include "google/protobuf/testing/file.h"
+#include "google/protobuf/testing/googletest.h"
#include <gtest/gtest.h>
-#include <google/protobuf/testing/file.h>
+#include "google/protobuf/compiler/command_line_interface.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/io/zero_copy_stream.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/compiler/scc.h b/src/google/protobuf/compiler/scc.h
index 7b95689..2408dcd 100644
--- a/src/google/protobuf/compiler/scc.h
+++ b/src/google/protobuf/compiler/scc.h
@@ -33,12 +33,12 @@
#include <map>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/descriptor.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/descriptor.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -64,6 +64,8 @@
class PROTOC_EXPORT SCCAnalyzer {
public:
explicit SCCAnalyzer() : index_(0) {}
+ SCCAnalyzer(const SCCAnalyzer&) = delete;
+ SCCAnalyzer& operator=(const SCCAnalyzer&) = delete;
const SCC* GetSCC(const Descriptor* descriptor) {
if (cache_.count(descriptor)) return cache_[descriptor].scc;
@@ -151,15 +153,12 @@
}
}
}
-
- // This is necessary for compiler bug in msvc2015.
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(SCCAnalyzer);
};
} // namespace compiler
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_COMPILER_SCC_H__
diff --git a/src/google/protobuf/compiler/subprocess.cc b/src/google/protobuf/compiler/subprocess.cc
index 764f9ab..ae1f5dd 100644
--- a/src/google/protobuf/compiler/subprocess.cc
+++ b/src/google/protobuf/compiler/subprocess.cc
@@ -30,7 +30,7 @@
// Author: kenton@google.com (Kenton Varda)
-#include <google/protobuf/compiler/subprocess.h>
+#include "google/protobuf/compiler/subprocess.h"
#include <algorithm>
#include <cstring>
@@ -43,25 +43,17 @@
#include <sys/wait.h>
#endif
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/substitute.h>
-#include <google/protobuf/message.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "absl/strings/escaping.h"
+#include "absl/strings/substitute.h"
+#include "google/protobuf/io/io_win32.h"
+#include "google/protobuf/message.h"
namespace google {
namespace protobuf {
namespace compiler {
-namespace {
-char* portable_strdup(const char* s) {
- char* ns = (char*)malloc(strlen(s) + 1);
- if (ns != nullptr) {
- strcpy(ns, s);
- }
- return ns;
-}
-} // namespace
-
#ifdef _WIN32
static void CloseHandleOrDie(HANDLE handle) {
@@ -113,7 +105,7 @@
}
// Setup STARTUPINFO to redirect handles.
- STARTUPINFOA startup_info;
+ STARTUPINFOW startup_info;
ZeroMemory(&startup_info, sizeof(startup_info));
startup_info.cb = sizeof(startup_info);
startup_info.dwFlags = STARTF_USESTDHANDLES;
@@ -125,17 +117,30 @@
GOOGLE_LOG(FATAL) << "GetStdHandle: " << Win32ErrorMessage(GetLastError());
}
+ // get wide string version of program as the path may contain non-ascii characters
+ std::wstring wprogram;
+ if (!io::win32::strings::utf8_to_wcs(program.c_str(), &wprogram)) {
+ GOOGLE_LOG(FATAL) << "utf8_to_wcs: " << Win32ErrorMessage(GetLastError());
+ }
+
// Invoking cmd.exe allows for '.bat' files from the path as well as '.exe'.
+ std::string command_line = "cmd.exe /c \"" + program + "\"";
+
+ // get wide string version of command line as the path may contain non-ascii characters
+ std::wstring wcommand_line;
+ if (!io::win32::strings::utf8_to_wcs(command_line.c_str(), &wcommand_line)) {
+ GOOGLE_LOG(FATAL) << "utf8_to_wcs: " << Win32ErrorMessage(GetLastError());
+ }
+
// Using a malloc'ed string because CreateProcess() can mutate its second
// parameter.
- char* command_line =
- portable_strdup(("cmd.exe /c \"" + program + "\"").c_str());
+ wchar_t *wcommand_line_copy = _wcsdup(wcommand_line.c_str());
// Create the process.
PROCESS_INFORMATION process_info;
- if (CreateProcessA((search_mode == SEARCH_PATH) ? nullptr : program.c_str(),
- (search_mode == SEARCH_PATH) ? command_line : nullptr,
+ if (CreateProcessW((search_mode == SEARCH_PATH) ? nullptr : wprogram.c_str(),
+ (search_mode == SEARCH_PATH) ? wcommand_line_copy : NULL,
nullptr, // process security attributes
nullptr, // thread security attributes
TRUE, // inherit handles?
@@ -155,7 +160,7 @@
CloseHandleOrDie(stdin_pipe_read);
CloseHandleOrDie(stdout_pipe_write);
- free(command_line);
+ free(wcommand_line_copy);
}
bool Subprocess::Communicate(const Message& input, Message* output,
@@ -259,12 +264,12 @@
child_handle_ = nullptr;
if (exit_code != 0) {
- *error = strings::Substitute("Plugin failed with status code $0.", exit_code);
+ *error = absl::Substitute("Plugin failed with status code $0.", exit_code);
return false;
}
if (!output->ParseFromString(output_data)) {
- *error = "Plugin output is unparseable: " + CEscape(output_data);
+ *error = "Plugin output is unparseable: " + absl::CEscape(output_data);
return false;
}
@@ -303,6 +308,16 @@
}
}
+namespace {
+char* portable_strdup(const char* s) {
+ char* ns = (char*)malloc(strlen(s) + 1);
+ if (ns != nullptr) {
+ strcpy(ns, s);
+ }
+ return ns;
+}
+} // namespace
+
void Subprocess::Start(const std::string& program, SearchMode search_mode) {
// Note that we assume that there are no other threads, thus we don't have to
// do crazy stuff like using socket pairs or avoiding libc locks.
@@ -457,12 +472,12 @@
if (WEXITSTATUS(status) != 0) {
int error_code = WEXITSTATUS(status);
*error =
- strings::Substitute("Plugin failed with status code $0.", error_code);
+ absl::Substitute("Plugin failed with status code $0.", error_code);
return false;
}
} else if (WIFSIGNALED(status)) {
int signal = WTERMSIG(status);
- *error = strings::Substitute("Plugin killed by signal $0.", signal);
+ *error = absl::Substitute("Plugin killed by signal $0.", signal);
return false;
} else {
*error = "Neither WEXITSTATUS nor WTERMSIG is true?";
@@ -470,7 +485,7 @@
}
if (!output->ParseFromString(output_data)) {
- *error = "Plugin output is unparseable: " + CEscape(output_data);
+ *error = "Plugin output is unparseable: " + absl::CEscape(output_data);
return false;
}
diff --git a/src/google/protobuf/compiler/subprocess.h b/src/google/protobuf/compiler/subprocess.h
index 5cb784d..b6bf282 100644
--- a/src/google/protobuf/compiler/subprocess.h
+++ b/src/google/protobuf/compiler/subprocess.h
@@ -42,12 +42,12 @@
#include <sys/types.h>
#include <unistd.h>
#endif // !_WIN32
-#include <google/protobuf/stubs/common.h>
-
#include <string>
+#include "google/protobuf/port.h"
+
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -109,6 +109,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_COMPILER_SUBPROCESS_H__
diff --git a/src/google/protobuf/compiler/test_plugin.cc b/src/google/protobuf/compiler/test_plugin.cc
index 2556078..2ed1e3d 100644
--- a/src/google/protobuf/compiler/test_plugin.cc
+++ b/src/google/protobuf/compiler/test_plugin.cc
@@ -37,8 +37,8 @@
#include <string>
-#include <google/protobuf/compiler/mock_code_generator.h>
-#include <google/protobuf/compiler/plugin.h>
+#include "google/protobuf/compiler/mock_code_generator.h"
+#include "google/protobuf/compiler/plugin.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/compiler/zip_writer.cc b/src/google/protobuf/compiler/zip_writer.cc
index 72e1d71..73b9ef5 100644
--- a/src/google/protobuf/compiler/zip_writer.cc
+++ b/src/google/protobuf/compiler/zip_writer.cc
@@ -33,11 +33,11 @@
//
// Based on http://www.pkware.com/documents/casestudies/APPNOTE.TXT
-#include <google/protobuf/compiler/zip_writer.h>
+#include "google/protobuf/compiler/zip_writer.h"
#include <cstdint>
-#include <google/protobuf/io/coded_stream.h>
+#include "google/protobuf/io/coded_stream.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/compiler/zip_writer.h b/src/google/protobuf/compiler/zip_writer.h
index 5d7f69a..89717c7 100644
--- a/src/google/protobuf/compiler/zip_writer.h
+++ b/src/google/protobuf/compiler/zip_writer.h
@@ -35,8 +35,8 @@
#include <cstdint>
#include <vector>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/io/zero_copy_stream.h>
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/io/zero_copy_stream.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/descriptor.cc b/src/google/protobuf/descriptor.cc
index 5f3427d..54822bd 100644
--- a/src/google/protobuf/descriptor.cc
+++ b/src/google/protobuf/descriptor.cc
@@ -32,7 +32,7 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/descriptor.h>
+#include "google/protobuf/descriptor.h"
#include <algorithm>
#include <array>
@@ -44,53 +44,47 @@
#include <sstream>
#include <string>
#include <type_traits>
-#include <unordered_map>
-#include <unordered_set>
#include <vector>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/once.h>
-#include <google/protobuf/any.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/tokenizer.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/stubs/casts.h>
-#include <google/protobuf/stubs/stringprintf.h>
-#include <google/protobuf/stubs/substitute.h>
-#include <google/protobuf/descriptor_database.h>
-#include <google/protobuf/dynamic_message.h>
-#include <google/protobuf/generated_message_util.h>
-#include <google/protobuf/io/strtod.h>
-#include <google/protobuf/port.h>
-#include <google/protobuf/text_format.h>
-#include <google/protobuf/unknown_field_set.h>
-#include <google/protobuf/stubs/map_util.h>
-#include <google/protobuf/stubs/stl_util.h>
-#include <google/protobuf/stubs/hash.h>
-
-#undef PACKAGE // autoheader #defines this. :(
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "absl/base/call_once.h"
+#include "absl/base/casts.h"
+#include "absl/base/dynamic_annotations.h"
+#include "absl/container/flat_hash_map.h"
+#include "absl/container/flat_hash_set.h"
+#include "absl/hash/hash.h"
+#include "absl/strings/ascii.h"
+#include "absl/strings/escaping.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/str_format.h"
+#include "absl/strings/str_join.h"
+#include "absl/strings/str_split.h"
+#include "absl/strings/substitute.h"
+#include "absl/synchronization/mutex.h"
+#include "google/protobuf/any.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/descriptor_database.h"
+#include "google/protobuf/dynamic_message.h"
+#include "google/protobuf/generated_message_util.h"
+#include "google/protobuf/io/strtod.h"
+#include "google/protobuf/io/tokenizer.h"
+#include "google/protobuf/port.h"
+#include "google/protobuf/text_format.h"
+#include "google/protobuf/unknown_field_set.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
-
namespace {
+using ::google::protobuf::internal::DownCast;
+
const int kPackageLimit = 100;
-// Note: I distrust ctype.h due to locales.
-char ToUpper(char ch) {
- return (ch >= 'a' && ch <= 'z') ? (ch - 'a' + 'A') : ch;
-}
-
-char ToLower(char ch) {
- return (ch >= 'A' && ch <= 'Z') ? (ch - 'A' + 'a') : ch;
-}
std::string ToCamelCase(const std::string& input, bool lower_first) {
bool capitalize_next = !lower_first;
@@ -101,7 +95,7 @@
if (character == '_') {
capitalize_next = true;
} else if (capitalize_next) {
- result.push_back(ToUpper(character));
+ result.push_back(absl::ascii_toupper(character));
capitalize_next = false;
} else {
result.push_back(character);
@@ -110,7 +104,7 @@
// Lower-case the first letter.
if (lower_first && !result.empty()) {
- result[0] = ToLower(result[0]);
+ result[0] = absl::ascii_tolower(result[0]);
}
return result;
@@ -125,7 +119,7 @@
if (character == '_') {
capitalize_next = true;
} else if (capitalize_next) {
- result.push_back(ToUpper(character));
+ result.push_back(absl::ascii_toupper(character));
capitalize_next = false;
} else {
result.push_back(character);
@@ -430,13 +424,13 @@
}
std::string lowercase_name = name;
- LowerString(&lowercase_name);
+ absl::AsciiStrToLower(&lowercase_name);
std::string camelcase_name = ToCamelCase(name, /* lower_first = */ true);
std::string json_name =
opt_json_name != nullptr ? *opt_json_name : ToJsonName(name);
- StringPiece all_names[] = {name, lowercase_name, camelcase_name,
+ absl::string_view all_names[] = {name, lowercase_name, camelcase_name,
json_name};
std::sort(all_names, all_names + 4);
int unique =
@@ -457,7 +451,7 @@
GOOGLE_CHECK(has_allocated());
std::string full_name =
- scope.empty() ? name : StrCat(scope, ".", name);
+ scope.empty() ? name : absl::StrCat(scope, ".", name);
// Fast path for snake_case names, which follow the style guide.
if (opt_json_name == nullptr) {
@@ -494,7 +488,7 @@
FieldNamesResult result{nullptr, 0, 0, 0};
std::string lowercase_name = name;
- LowerString(&lowercase_name);
+ absl::AsciiStrToLower(&lowercase_name);
result.lowercase_index = push_name(std::move(lowercase_name));
result.camelcase_index =
push_name(ToCamelCase(name, /* lower_first = */ true));
@@ -575,7 +569,6 @@
METHOD,
FULL_PACKAGE,
SUB_PACKAGE,
- QUERY_KEY
};
Symbol() {
@@ -641,35 +634,6 @@
: nullptr;
}
- // Not a real symbol.
- // Only used for heterogeneous lookups and never actually inserted in the
- // tables.
- // TODO(b/215557658): If we templetize QueryKey on the expected object type we
- // can skip the switches for the eq function altogether.
- struct QueryKey : internal::SymbolBase {
- StringPiece name;
- const void* parent;
- int field_number;
-
- // Adaptor functions to look like a Symbol to the comparators.
- StringPiece full_name() const { return name; }
- std::pair<const void*, int> parent_number_key() const {
- return {parent, field_number};
- }
- std::pair<const void*, StringPiece> parent_name_key() const {
- return {parent, name};
- }
- };
- // This constructor is implicit to allow for non-transparent lookups when
- // necessary.
- // For transparent lookup cases we query directly with the object without the
- // type erasure layer.
- Symbol(QueryKey& value) : ptr_(&value) { // NOLINT
- value.symbol_type_ = QUERY_KEY;
- }
- const QueryKey* query_key() const {
- return type() == QUERY_KEY ? static_cast<const QueryKey*>(ptr_) : nullptr;
- }
#undef DEFINE_MEMBERS
Type type() const { return static_cast<Type>(ptr_->symbol_type_); }
@@ -707,7 +671,7 @@
}
}
- StringPiece full_name() const {
+ absl::string_view full_name() const {
switch (type()) {
case MESSAGE:
return descriptor()->full_name();
@@ -726,17 +690,15 @@
case FULL_PACKAGE:
return file_descriptor()->package();
case SUB_PACKAGE:
- return StringPiece(sub_package_file_descriptor()->file->package())
+ return absl::string_view(sub_package_file_descriptor()->file->package())
.substr(0, sub_package_file_descriptor()->name_size);
- case QUERY_KEY:
- return query_key()->full_name();
default:
GOOGLE_CHECK(false);
}
return "";
}
- std::pair<const void*, StringPiece> parent_name_key() const {
+ std::pair<const void*, absl::string_view> parent_name_key() const {
const auto or_file = [&](const void* p) { return p ? p : GetFile(); };
switch (type()) {
case MESSAGE:
@@ -763,24 +725,6 @@
return {GetFile(), service_descriptor()->name()};
case METHOD:
return {method_descriptor()->service(), method_descriptor()->name()};
- case QUERY_KEY:
- return query_key()->parent_name_key();
- default:
- GOOGLE_CHECK(false);
- }
- return {};
- }
-
- std::pair<const void*, int> parent_number_key() const {
- switch (type()) {
- case FIELD:
- return {field_descriptor()->containing_type(),
- field_descriptor()->number()};
- case ENUM_VALUE:
- return {enum_value_descriptor()->type(),
- enum_value_descriptor()->number()};
- case QUERY_KEY:
- return query_key()->parent_number_key();
default:
GOOGLE_CHECK(false);
}
@@ -894,9 +838,9 @@
next_upper = true;
} else {
if (next_upper) {
- result.push_back(ToUpper(character));
+ result.push_back(absl::ascii_toupper(character));
} else {
- result.push_back(ToLower(character));
+ result.push_back(absl::ascii_tolower(character));
}
next_upper = false;
}
@@ -908,18 +852,18 @@
// Class to remove an enum prefix from enum values.
class PrefixRemover {
public:
- PrefixRemover(StringPiece prefix) {
+ PrefixRemover(absl::string_view prefix) {
// Strip underscores and lower-case the prefix.
for (char character : prefix) {
if (character != '_') {
- prefix_ += ascii_tolower(character);
+ prefix_ += absl::ascii_tolower(character);
}
}
}
// Tries to remove the enum prefix from this enum value.
// If this is not possible, returns the input verbatim.
- std::string MaybeRemove(StringPiece str) {
+ std::string MaybeRemove(absl::string_view str) {
// We can't just lowercase and strip str and look for a prefix.
// We need to properly recognize the difference between:
//
@@ -938,7 +882,7 @@
continue;
}
- if (ascii_tolower(str[i]) != prefix_[j++]) {
+ if (absl::ascii_tolower(str[i]) != prefix_[j++]) {
return std::string(str);
}
}
@@ -975,60 +919,16 @@
// hash-maps for each object.
//
// The keys to these hash-maps are (parent, name) or (parent, number) pairs.
-
-typedef std::pair<const void*, StringPiece> PointerStringPair;
-
-typedef std::pair<const Descriptor*, int> DescriptorIntPair;
-
-#define HASH_MAP std::unordered_map
-#define HASH_SET std::unordered_set
-#define HASH_FXN hash
-
-template <typename PairType>
-struct PointerIntegerPairHash {
- size_t operator()(const PairType& p) const {
- static const size_t prime1 = 16777499;
- static const size_t prime2 = 16777619;
- return reinterpret_cast<size_t>(p.first) * prime1 ^
- static_cast<size_t>(p.second) * prime2;
- }
-
-#ifdef _MSC_VER
- // Used only by MSVC and platforms where hash_map is not available.
- static const size_t bucket_size = 4;
- static const size_t min_buckets = 8;
-#endif
- inline bool operator()(const PairType& a, const PairType& b) const {
- return a < b;
- }
+struct FullNameQuery {
+ absl::string_view query;
+ absl::string_view full_name() const { return query; }
};
-
-struct PointerStringPairHash {
- size_t operator()(const PointerStringPair& p) const {
- static const size_t prime = 16777619;
- hash<StringPiece> string_hash;
- return reinterpret_cast<size_t>(p.first) * prime ^
- static_cast<size_t>(string_hash(p.second));
- }
-
-#ifdef _MSC_VER
- // Used only by MSVC and platforms where hash_map is not available.
- static const size_t bucket_size = 4;
- static const size_t min_buckets = 8;
-#endif
- inline bool operator()(const PointerStringPair& a,
- const PointerStringPair& b) const {
- return a < b;
- }
-};
-
-
struct SymbolByFullNameHash {
using is_transparent = void;
template <typename T>
size_t operator()(const T& s) const {
- return HASH_FXN<StringPiece>{}(s.full_name());
+ return absl::HashOf(s.full_name());
}
};
struct SymbolByFullNameEq {
@@ -1040,14 +940,20 @@
}
};
using SymbolsByNameSet =
- HASH_SET<Symbol, SymbolByFullNameHash, SymbolByFullNameEq>;
+ absl::flat_hash_set<Symbol, SymbolByFullNameHash, SymbolByFullNameEq>;
+struct ParentNameQuery {
+ std::pair<const void*, absl::string_view> query;
+ std::pair<const void*, absl::string_view> parent_name_key() const {
+ return query;
+ }
+};
struct SymbolByParentHash {
using is_transparent = void;
template <typename T>
size_t operator()(const T& s) const {
- return PointerStringPairHash{}(s.parent_name_key());
+ return absl::HashOf(s.parent_name_key());
}
};
struct SymbolByParentEq {
@@ -1059,52 +965,94 @@
}
};
using SymbolsByParentSet =
- HASH_SET<Symbol, SymbolByParentHash, SymbolByParentEq>;
+ absl::flat_hash_set<Symbol, SymbolByParentHash, SymbolByParentEq>;
-typedef HASH_MAP<StringPiece, const FileDescriptor*,
- HASH_FXN<StringPiece>>
- FilesByNameMap;
+struct FilesByNameHash {
+ using is_transparent = void;
-typedef HASH_MAP<PointerStringPair, const FieldDescriptor*,
- PointerStringPairHash>
- FieldsByNameMap;
+ size_t operator()(absl::string_view name) const { return absl::HashOf(name); }
-struct FieldsByNumberHash {
+ size_t operator()(const FileDescriptor* file) const {
+ return absl::HashOf(file->name());
+ }
+};
+
+struct FilesByNameEq {
+ using is_transparent = void;
+
+ bool operator()(absl::string_view lhs, absl::string_view rhs) const {
+ return lhs == rhs;
+ }
+ bool operator()(absl::string_view lhs, const FileDescriptor* rhs) const {
+ return lhs == rhs->name();
+ }
+ bool operator()(const FileDescriptor* lhs, absl::string_view rhs) const {
+ return lhs->name() == rhs;
+ }
+ bool operator()(const FileDescriptor* lhs, const FileDescriptor* rhs) const {
+ return lhs == rhs || lhs->name() == rhs->name();
+ }
+};
+using FilesByNameSet =
+ absl::flat_hash_set<const FileDescriptor*, FilesByNameHash, FilesByNameEq>;
+
+using FieldsByNameMap =
+ absl::flat_hash_map<std::pair<const void*, absl::string_view>,
+ const FieldDescriptor*>;
+
+struct ParentNumberQuery {
+ std::pair<const void*, int> query;
+};
+std::pair<const void*, int> ObjectToParentNumber(const FieldDescriptor* field) {
+ return {field->containing_type(), field->number()};
+}
+std::pair<const void*, int> ObjectToParentNumber(
+ const EnumValueDescriptor* enum_value) {
+ return {enum_value->type(), enum_value->number()};
+}
+std::pair<const void*, int> ObjectToParentNumber(ParentNumberQuery query) {
+ return query.query;
+}
+struct ParentNumberHash {
using is_transparent = void;
template <typename T>
- size_t operator()(const T& s) const {
- return PointerIntegerPairHash<std::pair<const void*, int>>{}(
- s.parent_number_key());
+ size_t operator()(const T& t) const {
+ return absl::HashOf(ObjectToParentNumber(t));
}
};
-struct FieldsByNumberEq {
+struct ParentNumberEq {
using is_transparent = void;
template <typename T, typename U>
bool operator()(const T& a, const U& b) const {
- return a.parent_number_key() == b.parent_number_key();
+ return ObjectToParentNumber(a) == ObjectToParentNumber(b);
}
};
-using FieldsByNumberSet =
- HASH_SET<Symbol, FieldsByNumberHash, FieldsByNumberEq>;
-using EnumValuesByNumberSet = FieldsByNumberSet;
+using FieldsByNumberSet = absl::flat_hash_set<const FieldDescriptor*,
+ ParentNumberHash, ParentNumberEq>;
+using EnumValuesByNumberSet =
+ absl::flat_hash_set<const EnumValueDescriptor*, ParentNumberHash,
+ ParentNumberEq>;
// This is a map rather than a hash-map, since we use it to iterate
// through all the extensions that extend a given Descriptor, and an
// ordered data structure that implements lower_bound is convenient
// for that.
-typedef std::map<DescriptorIntPair, const FieldDescriptor*>
- ExtensionsGroupedByDescriptorMap;
-typedef HASH_MAP<std::string, const SourceCodeInfo_Location*>
- LocationsByPathMap;
+using ExtensionsGroupedByDescriptorMap =
+ std::map<std::pair<const Descriptor*, int>, const FieldDescriptor*>;
+using LocationsByPathMap =
+ absl::flat_hash_map<std::string, const SourceCodeInfo_Location*>;
-std::set<std::string>* NewAllowedProto3Extendee() {
- auto allowed_proto3_extendees = new std::set<std::string>;
+absl::flat_hash_set<std::string>* NewAllowedProto3Extendee() {
const char* kOptionNames[] = {
"FileOptions", "MessageOptions", "FieldOptions",
"EnumOptions", "EnumValueOptions", "ServiceOptions",
"MethodOptions", "OneofOptions", "ExtensionRangeOptions"};
+ auto allowed_proto3_extendees = new absl::flat_hash_set<std::string>();
+ allowed_proto3_extendees->reserve(sizeof(kOptionNames) /
+ sizeof(kOptionNames[0]));
+
for (const char* option_name : kOptionNames) {
// descriptor.proto has a different package name in opensource. We allow
// both so the opensource protocol compiler can also compile internal
@@ -1113,7 +1061,7 @@
option_name);
// Split the word to trick the opensource processing scripts so they
// will keep the original package name.
- allowed_proto3_extendees->insert(std::string("proto") + "2." + option_name);
+ allowed_proto3_extendees->insert(std::string("proto2.") + option_name);
}
return allowed_proto3_extendees;
}
@@ -1151,16 +1099,19 @@
// Finding items.
// Returns a null Symbol (symbol.IsNull() is true) if not found.
+ // TODO(sbenza): All callers to this function know the type they are looking
+ // for. If we propagate that information statically we can make the query
+ // faster.
inline Symbol FindNestedSymbol(const void* parent,
- StringPiece name) const;
+ absl::string_view name) const;
// These return nullptr if not found.
inline const FieldDescriptor* FindFieldByNumber(const Descriptor* parent,
int number) const;
inline const FieldDescriptor* FindFieldByLowercaseName(
- const void* parent, StringPiece lowercase_name) const;
+ const void* parent, absl::string_view lowercase_name) const;
inline const FieldDescriptor* FindFieldByCamelcaseName(
- const void* parent, StringPiece camelcase_name) const;
+ const void* parent, absl::string_view camelcase_name) const;
inline const EnumValueDescriptor* FindEnumValueByNumber(
const EnumDescriptor* parent, int number) const;
// This creates a new EnumValueDescriptor if not found, in a thread-safe way.
@@ -1178,7 +1129,7 @@
bool AddEnumValueByNumber(EnumValueDescriptor* value);
// Populates p->first->locations_by_path_ from p->second.
- // Unusual signature dictated by internal::call_once.
+ // Unusual signature dictated by absl::call_once.
static void BuildLocationsByPath(
std::pair<const FileDescriptorTables*, const SourceCodeInfo*>* p);
@@ -1203,8 +1154,8 @@
void FieldsByCamelcaseNamesLazyInitInternal() const;
SymbolsByParentSet symbols_by_parent_;
- mutable internal::once_flag fields_by_lowercase_name_once_;
- mutable internal::once_flag fields_by_camelcase_name_once_;
+ mutable absl::once_flag fields_by_lowercase_name_once_;
+ mutable absl::once_flag fields_by_camelcase_name_once_;
// Make these fields atomic to avoid race conditions with
// GetEstimatedOwnedMemoryBytesSize. Once the pointer is set the map won't
// change anymore.
@@ -1216,12 +1167,12 @@
PROTOBUF_GUARDED_BY(unknown_enum_values_mu_);
// Populated on first request to save space, hence constness games.
- mutable internal::once_flag locations_by_path_once_;
+ mutable absl::once_flag locations_by_path_once_;
mutable LocationsByPathMap locations_by_path_;
// Mutex to protect the unknown-enum-value map due to dynamic
// EnumValueDescriptor creation on unknown values.
- mutable internal::WrappedMutex unknown_enum_values_mu_;
+ mutable absl::Mutex unknown_enum_values_mu_;
};
namespace internal {
@@ -1303,39 +1254,39 @@
// execution of the current public API call, but for compatibility with
// legacy clients, this is cleared at the beginning of each public API call.
// Not used when fallback_database_ == nullptr.
- HASH_SET<std::string> known_bad_files_;
+ absl::flat_hash_set<std::string> known_bad_files_;
// A set of symbols which we have tried to load from the fallback database
// and encountered errors. We will not attempt to load them again during
// execution of the current public API call, but for compatibility with
// legacy clients, this is cleared at the beginning of each public API call.
- HASH_SET<std::string> known_bad_symbols_;
+ absl::flat_hash_set<std::string> known_bad_symbols_;
// The set of descriptors for which we've already loaded the full
// set of extensions numbers from fallback_database_.
- HASH_SET<const Descriptor*> extensions_loaded_from_db_;
+ absl::flat_hash_set<const Descriptor*> extensions_loaded_from_db_;
// Maps type name to Descriptor::WellKnownType. This is logically global
// and const, but we make it a member here to simplify its construction and
// destruction. This only has 20-ish entries and is one per DescriptorPool,
// so the overhead is small.
- HASH_MAP<std::string, Descriptor::WellKnownType> well_known_types_;
+ absl::flat_hash_map<std::string, Descriptor::WellKnownType> well_known_types_;
// -----------------------------------------------------------------
// Finding items.
// Find symbols. This returns a null Symbol (symbol.IsNull() is true)
// if not found.
- inline Symbol FindSymbol(StringPiece key) const;
+ inline Symbol FindSymbol(absl::string_view key) const;
// This implements the body of DescriptorPool::Find*ByName(). It should
// really be a private method of DescriptorPool, but that would require
// declaring Symbol in descriptor.h, which would drag all kinds of other
// stuff into the header. Yay C++.
- Symbol FindByNameHelper(const DescriptorPool* pool, StringPiece name);
+ Symbol FindByNameHelper(const DescriptorPool* pool, absl::string_view name);
// These return nullptr if not found.
- inline const FileDescriptor* FindFile(StringPiece key) const;
+ inline const FileDescriptor* FindFile(absl::string_view key) const;
inline const FieldDescriptor* FindExtension(const Descriptor* extendee,
int number) const;
inline void FindAllExtensions(const Descriptor* extendee,
@@ -1394,7 +1345,7 @@
flat_allocs_;
SymbolsByNameSet symbols_by_name_;
- FilesByNameMap files_by_name_;
+ FilesByNameSet files_by_name_;
ExtensionsGroupedByDescriptorMap extensions_;
struct CheckPoint {
@@ -1418,7 +1369,7 @@
std::vector<CheckPoint> checkpoints_;
std::vector<Symbol> symbols_after_checkpoint_;
std::vector<const FileDescriptor*> files_after_checkpoint_;
- std::vector<DescriptorIntPair> extensions_after_checkpoint_;
+ std::vector<std::pair<const Descriptor*, int>> extensions_after_checkpoint_;
};
DescriptorPool::Tables::Tables() {
@@ -1483,7 +1434,7 @@
}
for (size_t i = checkpoint.pending_files_before_checkpoint;
i < files_after_checkpoint_.size(); i++) {
- files_by_name_.erase(files_after_checkpoint_[i]->name());
+ files_by_name_.erase(files_after_checkpoint_[i]);
}
for (size_t i = checkpoint.pending_extensions_before_checkpoint;
i < extensions_after_checkpoint_.size(); i++) {
@@ -1503,33 +1454,28 @@
// -------------------------------------------------------------------
-inline Symbol DescriptorPool::Tables::FindSymbol(StringPiece key) const {
- Symbol::QueryKey name;
- name.name = key;
- auto it = symbols_by_name_.find(name);
+inline Symbol DescriptorPool::Tables::FindSymbol(absl::string_view key) const {
+ auto it = symbols_by_name_.find(FullNameQuery{key});
return it == symbols_by_name_.end() ? Symbol() : *it;
}
inline Symbol FileDescriptorTables::FindNestedSymbol(
- const void* parent, StringPiece name) const {
- Symbol::QueryKey query;
- query.name = name;
- query.parent = parent;
- auto it = symbols_by_parent_.find(query);
+ const void* parent, absl::string_view name) const {
+ auto it = symbols_by_parent_.find(ParentNameQuery{{parent, name}});
return it == symbols_by_parent_.end() ? Symbol() : *it;
}
Symbol DescriptorPool::Tables::FindByNameHelper(const DescriptorPool* pool,
- StringPiece name) {
+ absl::string_view name) {
if (pool->mutex_ != nullptr) {
// Fast path: the Symbol is already cached. This is just a hash lookup.
- ReaderMutexLock lock(pool->mutex_);
+ absl::ReaderMutexLock lock(pool->mutex_);
if (known_bad_symbols_.empty() && known_bad_files_.empty()) {
Symbol result = FindSymbol(name);
if (!result.IsNull()) return result;
}
}
- MutexLockMaybe lock(pool->mutex_);
+ absl::MutexLockMaybe lock(pool->mutex_);
if (pool->fallback_database_ != nullptr) {
known_bad_symbols_.clear();
known_bad_files_.clear();
@@ -1552,8 +1498,10 @@
}
inline const FileDescriptor* DescriptorPool::Tables::FindFile(
- StringPiece key) const {
- return FindPtrOrNull(files_by_name_, key);
+ absl::string_view key) const {
+ auto it = files_by_name_.find(key);
+ if (it == files_by_name_.end()) return nullptr;
+ return *it;
}
inline const FieldDescriptor* FileDescriptorTables::FindFieldByNumber(
@@ -1565,12 +1513,8 @@
return parent->field(number - 1);
}
- Symbol::QueryKey query;
- query.parent = parent;
- query.field_number = number;
-
- auto it = fields_by_number_.find(query);
- return it == fields_by_number_.end() ? nullptr : it->field_descriptor();
+ auto it = fields_by_number_.find(ParentNumberQuery{{parent, number}});
+ return it == fields_by_number_.end() ? nullptr : *it;
}
const void* FileDescriptorTables::FindParentForFieldsByMap(
@@ -1603,13 +1547,15 @@
}
inline const FieldDescriptor* FileDescriptorTables::FindFieldByLowercaseName(
- const void* parent, StringPiece lowercase_name) const {
- internal::call_once(
- fields_by_lowercase_name_once_,
- &FileDescriptorTables::FieldsByLowercaseNamesLazyInitStatic, this);
- return FindPtrOrNull(
- *fields_by_lowercase_name_.load(std::memory_order_acquire),
- PointerStringPair(parent, lowercase_name));
+ const void* parent, absl::string_view lowercase_name) const {
+ absl::call_once(fields_by_lowercase_name_once_,
+ &FileDescriptorTables::FieldsByLowercaseNamesLazyInitStatic,
+ this);
+ const auto* fields =
+ fields_by_lowercase_name_.load(std::memory_order_acquire);
+ auto it = fields->find({parent, lowercase_name});
+ if (it == fields->end()) return nullptr;
+ return it->second;
}
void FileDescriptorTables::FieldsByCamelcaseNamesLazyInitStatic(
@@ -1629,13 +1575,14 @@
}
inline const FieldDescriptor* FileDescriptorTables::FindFieldByCamelcaseName(
- const void* parent, StringPiece camelcase_name) const {
- internal::call_once(
- fields_by_camelcase_name_once_,
- FileDescriptorTables::FieldsByCamelcaseNamesLazyInitStatic, this);
- return FindPtrOrNull(
- *fields_by_camelcase_name_.load(std::memory_order_acquire),
- PointerStringPair(parent, camelcase_name));
+ const void* parent, absl::string_view camelcase_name) const {
+ absl::call_once(fields_by_camelcase_name_once_,
+ FileDescriptorTables::FieldsByCamelcaseNamesLazyInitStatic,
+ this);
+ auto* fields = fields_by_camelcase_name_.load(std::memory_order_acquire);
+ auto it = fields->find({parent, camelcase_name});
+ if (it == fields->end()) return nullptr;
+ return it->second;
}
inline const EnumValueDescriptor* FileDescriptorTables::FindEnumValueByNumber(
@@ -1648,13 +1595,8 @@
return parent->value(number - base);
}
- Symbol::QueryKey query;
- query.parent = parent;
- query.field_number = number;
-
- auto it = enum_values_by_number_.find(query);
- return it == enum_values_by_number_.end() ? nullptr
- : it->enum_value_descriptor();
+ auto it = enum_values_by_number_.find(ParentNumberQuery{{parent, number}});
+ return it == enum_values_by_number_.end() ? nullptr : *it;
}
inline const EnumValueDescriptor*
@@ -1668,34 +1610,30 @@
}
}
- Symbol::QueryKey query;
- query.parent = parent;
- query.field_number = number;
+ const ParentNumberQuery query{{parent, number}};
// Second try, with reader lock held on unknown enum values: common case.
{
- ReaderMutexLock l(&unknown_enum_values_mu_);
+ absl::ReaderMutexLock l(&unknown_enum_values_mu_);
auto it = unknown_enum_values_by_number_.find(query);
- if (it != unknown_enum_values_by_number_.end() &&
- it->enum_value_descriptor() != nullptr) {
- return it->enum_value_descriptor();
+ if (it != unknown_enum_values_by_number_.end()) {
+ return *it;
}
}
// If not found, try again with writer lock held, and create new descriptor if
// necessary.
{
- WriterMutexLock l(&unknown_enum_values_mu_);
+ absl::WriterMutexLock l(&unknown_enum_values_mu_);
auto it = unknown_enum_values_by_number_.find(query);
- if (it != unknown_enum_values_by_number_.end() &&
- it->enum_value_descriptor() != nullptr) {
- return it->enum_value_descriptor();
+ if (it != unknown_enum_values_by_number_.end()) {
+ return *it;
}
// Create an EnumValueDescriptor dynamically. We don't insert it into the
// EnumDescriptor (it's not a part of the enum as originally defined), but
// we do insert it into the table so that we can return the same pointer
// later.
- std::string enum_value_name = StringPrintf(
+ std::string enum_value_name = absl::StrFormat(
"UNKNOWN_ENUM_VALUE_%s_%d", parent->name().c_str(), number);
auto* pool = DescriptorPool::generated_pool();
auto* tables = const_cast<DescriptorPool::Tables*>(pool->tables_.get());
@@ -1705,24 +1643,26 @@
{
// Must lock the pool because we will do allocations in the shared arena.
- MutexLockMaybe l2(pool->mutex_);
+ absl::MutexLockMaybe l2(pool->mutex_);
alloc.FinalizePlanning(tables);
}
EnumValueDescriptor* result = alloc.AllocateArray<EnumValueDescriptor>(1);
result->all_names_ = alloc.AllocateStrings(
enum_value_name,
- StrCat(parent->full_name(), ".", enum_value_name));
+ absl::StrCat(parent->full_name(), ".", enum_value_name));
result->number_ = number;
result->type_ = parent;
result->options_ = &EnumValueOptions::default_instance();
- unknown_enum_values_by_number_.insert(Symbol::EnumValue(result, 0));
+ unknown_enum_values_by_number_.insert(result);
return result;
}
}
inline const FieldDescriptor* DescriptorPool::Tables::FindExtension(
const Descriptor* extendee, int number) const {
- return FindPtrOrNull(extensions_, std::make_pair(extendee, number));
+ auto it = extensions_.find({extendee, number});
+ if (it == extensions_.end()) return nullptr;
+ return it->second;
}
inline void DescriptorPool::Tables::FindAllExtensions(
@@ -1757,7 +1697,7 @@
}
bool DescriptorPool::Tables::AddFile(const FileDescriptor* file) {
- if (InsertIfNotPresent(&files_by_name_, file->name(), file)) {
+ if (files_by_name_.insert(file).second) {
files_after_checkpoint_.push_back(file);
return true;
} else {
@@ -1780,7 +1720,7 @@
return field->containing_type()->field(field->number() - 1) == field;
}
- return fields_by_number_.insert(Symbol(field)).second;
+ return fields_by_number_.insert(field).second;
}
bool FileDescriptorTables::AddEnumValueByNumber(EnumValueDescriptor* value) {
@@ -1790,13 +1730,14 @@
value->number() <=
static_cast<int64_t>(base) + value->type()->sequential_value_limit_)
return true;
- return enum_values_by_number_.insert(Symbol::EnumValue(value, 0)).second;
+ return enum_values_by_number_.insert(value).second;
}
bool DescriptorPool::Tables::AddExtension(const FieldDescriptor* field) {
- DescriptorIntPair key(field->containing_type(), field->number());
- if (InsertIfNotPresent(&extensions_, key, field)) {
- extensions_after_checkpoint_.push_back(key);
+ auto it_inserted =
+ extensions_.insert({{field->containing_type(), field->number()}, field});
+ if (it_inserted.second) {
+ extensions_after_checkpoint_.push_back(it_inserted.first->first);
return true;
} else {
return false;
@@ -1842,7 +1783,7 @@
std::pair<const FileDescriptorTables*, const SourceCodeInfo*>* p) {
for (int i = 0, len = p->second->location_size(); i < len; ++i) {
const SourceCodeInfo_Location* loc = &p->second->location().Get(i);
- p->first->locations_by_path_[Join(loc->path(), ",")] = loc;
+ p->first->locations_by_path_[absl::StrJoin(loc->path(), ",")] = loc;
}
}
@@ -1850,9 +1791,11 @@
const std::vector<int>& path, const SourceCodeInfo* info) const {
std::pair<const FileDescriptorTables*, const SourceCodeInfo*> p(
std::make_pair(this, info));
- internal::call_once(locations_by_path_once_,
- FileDescriptorTables::BuildLocationsByPath, &p);
- return FindPtrOrNull(locations_by_path_, Join(path, ","));
+ absl::call_once(locations_by_path_once_,
+ FileDescriptorTables::BuildLocationsByPath, &p);
+ auto it = locations_by_path_.find(absl::StrJoin(path, ","));
+ if (it == locations_by_path_.end()) return nullptr;
+ return it->second;
}
// ===================================================================
@@ -1874,7 +1817,7 @@
DescriptorPool::DescriptorPool(DescriptorDatabase* fallback_database,
ErrorCollector* error_collector)
- : mutex_(new internal::WrappedMutex),
+ : mutex_(new absl::Mutex),
fallback_database_(fallback_database),
default_error_collector_(error_collector),
underlay_(nullptr),
@@ -1908,7 +1851,7 @@
enforce_dependencies_ = false;
}
-void DescriptorPool::AddUnusedImportTrackFile(ConstStringParam file_name,
+void DescriptorPool::AddUnusedImportTrackFile(absl::string_view file_name,
bool is_error) {
unused_import_track_files_[std::string(file_name)] = is_error;
}
@@ -1917,8 +1860,8 @@
unused_import_track_files_.clear();
}
-bool DescriptorPool::InternalIsFileLoaded(ConstStringParam filename) const {
- MutexLockMaybe lock(mutex_);
+bool DescriptorPool::InternalIsFileLoaded(absl::string_view filename) const {
+ absl::MutexLockMaybe lock(mutex_);
return tables_->FindFile(filename) != nullptr;
}
@@ -1994,8 +1937,8 @@
// there's nothing more important to do (read: never).
const FileDescriptor* DescriptorPool::FindFileByName(
- ConstStringParam name) const {
- MutexLockMaybe lock(mutex_);
+ absl::string_view name) const {
+ absl::MutexLockMaybe lock(mutex_);
if (fallback_database_ != nullptr) {
tables_->known_bad_symbols_.clear();
tables_->known_bad_files_.clear();
@@ -2014,8 +1957,8 @@
}
const FileDescriptor* DescriptorPool::FindFileContainingSymbol(
- ConstStringParam symbol_name) const {
- MutexLockMaybe lock(mutex_);
+ absl::string_view symbol_name) const {
+ absl::MutexLockMaybe lock(mutex_);
if (fallback_database_ != nullptr) {
tables_->known_bad_symbols_.clear();
tables_->known_bad_files_.clear();
@@ -2035,12 +1978,12 @@
}
const Descriptor* DescriptorPool::FindMessageTypeByName(
- ConstStringParam name) const {
+ absl::string_view name) const {
return tables_->FindByNameHelper(this, name).descriptor();
}
const FieldDescriptor* DescriptorPool::FindFieldByName(
- ConstStringParam name) const {
+ absl::string_view name) const {
if (const FieldDescriptor* field =
tables_->FindByNameHelper(this, name).field_descriptor()) {
if (!field->is_extension()) {
@@ -2051,7 +1994,7 @@
}
const FieldDescriptor* DescriptorPool::FindExtensionByName(
- ConstStringParam name) const {
+ absl::string_view name) const {
if (const FieldDescriptor* field =
tables_->FindByNameHelper(this, name).field_descriptor()) {
if (field->is_extension()) {
@@ -2062,27 +2005,27 @@
}
const OneofDescriptor* DescriptorPool::FindOneofByName(
- ConstStringParam name) const {
+ absl::string_view name) const {
return tables_->FindByNameHelper(this, name).oneof_descriptor();
}
const EnumDescriptor* DescriptorPool::FindEnumTypeByName(
- ConstStringParam name) const {
+ absl::string_view name) const {
return tables_->FindByNameHelper(this, name).enum_descriptor();
}
const EnumValueDescriptor* DescriptorPool::FindEnumValueByName(
- ConstStringParam name) const {
+ absl::string_view name) const {
return tables_->FindByNameHelper(this, name).enum_value_descriptor();
}
const ServiceDescriptor* DescriptorPool::FindServiceByName(
- ConstStringParam name) const {
+ absl::string_view name) const {
return tables_->FindByNameHelper(this, name).service_descriptor();
}
const MethodDescriptor* DescriptorPool::FindMethodByName(
- ConstStringParam name) const {
+ absl::string_view name) const {
return tables_->FindByNameHelper(this, name).method_descriptor();
}
@@ -2092,13 +2035,13 @@
// A faster path to reduce lock contention in finding extensions, assuming
// most extensions will be cache hit.
if (mutex_ != nullptr) {
- ReaderMutexLock lock(mutex_);
+ absl::ReaderMutexLock lock(mutex_);
const FieldDescriptor* result = tables_->FindExtension(extendee, number);
if (result != nullptr) {
return result;
}
}
- MutexLockMaybe lock(mutex_);
+ absl::MutexLockMaybe lock(mutex_);
if (fallback_database_ != nullptr) {
tables_->known_bad_symbols_.clear();
tables_->known_bad_files_.clear();
@@ -2138,7 +2081,7 @@
}
const FieldDescriptor* DescriptorPool::FindExtensionByPrintableName(
- const Descriptor* extendee, ConstStringParam printable_name) const {
+ const Descriptor* extendee, absl::string_view printable_name) const {
if (extendee->extension_range_count() == 0) return nullptr;
const FieldDescriptor* result = FindExtensionByName(printable_name);
if (result != nullptr && result->containing_type() == extendee) {
@@ -2167,7 +2110,7 @@
void DescriptorPool::FindAllExtensions(
const Descriptor* extendee,
std::vector<const FieldDescriptor*>* out) const {
- MutexLockMaybe lock(mutex_);
+ absl::MutexLockMaybe lock(mutex_);
if (fallback_database_ != nullptr) {
tables_->known_bad_symbols_.clear();
tables_->known_bad_files_.clear();
@@ -2208,7 +2151,7 @@
}
const FieldDescriptor* Descriptor::FindFieldByLowercaseName(
- ConstStringParam key) const {
+ absl::string_view key) const {
const FieldDescriptor* result =
file()->tables_->FindFieldByLowercaseName(this, key);
if (result == nullptr || result->is_extension()) {
@@ -2219,7 +2162,7 @@
}
const FieldDescriptor* Descriptor::FindFieldByCamelcaseName(
- ConstStringParam key) const {
+ absl::string_view key) const {
const FieldDescriptor* result =
file()->tables_->FindFieldByCamelcaseName(this, key);
if (result == nullptr || result->is_extension()) {
@@ -2229,25 +2172,27 @@
}
}
-const FieldDescriptor* Descriptor::FindFieldByName(ConstStringParam key) const {
+const FieldDescriptor* Descriptor::FindFieldByName(
+ absl::string_view key) const {
const FieldDescriptor* field =
file()->tables_->FindNestedSymbol(this, key).field_descriptor();
return field != nullptr && !field->is_extension() ? field : nullptr;
}
-const OneofDescriptor* Descriptor::FindOneofByName(ConstStringParam key) const {
+const OneofDescriptor* Descriptor::FindOneofByName(
+ absl::string_view key) const {
return file()->tables_->FindNestedSymbol(this, key).oneof_descriptor();
}
const FieldDescriptor* Descriptor::FindExtensionByName(
- ConstStringParam key) const {
+ absl::string_view key) const {
const FieldDescriptor* field =
file()->tables_->FindNestedSymbol(this, key).field_descriptor();
return field != nullptr && field->is_extension() ? field : nullptr;
}
const FieldDescriptor* Descriptor::FindExtensionByLowercaseName(
- ConstStringParam key) const {
+ absl::string_view key) const {
const FieldDescriptor* result =
file()->tables_->FindFieldByLowercaseName(this, key);
if (result == nullptr || !result->is_extension()) {
@@ -2258,7 +2203,7 @@
}
const FieldDescriptor* Descriptor::FindExtensionByCamelcaseName(
- ConstStringParam key) const {
+ absl::string_view key) const {
const FieldDescriptor* result =
file()->tables_->FindFieldByCamelcaseName(this, key);
if (result == nullptr || !result->is_extension()) {
@@ -2268,17 +2213,18 @@
}
}
-const Descriptor* Descriptor::FindNestedTypeByName(ConstStringParam key) const {
+const Descriptor* Descriptor::FindNestedTypeByName(
+ absl::string_view key) const {
return file()->tables_->FindNestedSymbol(this, key).descriptor();
}
const EnumDescriptor* Descriptor::FindEnumTypeByName(
- ConstStringParam key) const {
+ absl::string_view key) const {
return file()->tables_->FindNestedSymbol(this, key).enum_descriptor();
}
const EnumValueDescriptor* Descriptor::FindEnumValueByName(
- ConstStringParam key) const {
+ absl::string_view key) const {
return file()->tables_->FindNestedSymbol(this, key).enum_value_descriptor();
}
@@ -2295,7 +2241,7 @@
}
const EnumValueDescriptor* EnumDescriptor::FindValueByName(
- ConstStringParam key) const {
+ absl::string_view key) const {
return file()->tables_->FindNestedSymbol(this, key).enum_value_descriptor();
}
@@ -2309,39 +2255,39 @@
}
const MethodDescriptor* ServiceDescriptor::FindMethodByName(
- ConstStringParam key) const {
+ absl::string_view key) const {
return file()->tables_->FindNestedSymbol(this, key).method_descriptor();
}
const Descriptor* FileDescriptor::FindMessageTypeByName(
- ConstStringParam key) const {
+ absl::string_view key) const {
return tables_->FindNestedSymbol(this, key).descriptor();
}
const EnumDescriptor* FileDescriptor::FindEnumTypeByName(
- ConstStringParam key) const {
+ absl::string_view key) const {
return tables_->FindNestedSymbol(this, key).enum_descriptor();
}
const EnumValueDescriptor* FileDescriptor::FindEnumValueByName(
- ConstStringParam key) const {
+ absl::string_view key) const {
return tables_->FindNestedSymbol(this, key).enum_value_descriptor();
}
const ServiceDescriptor* FileDescriptor::FindServiceByName(
- ConstStringParam key) const {
+ absl::string_view key) const {
return tables_->FindNestedSymbol(this, key).service_descriptor();
}
const FieldDescriptor* FileDescriptor::FindExtensionByName(
- ConstStringParam key) const {
+ absl::string_view key) const {
const FieldDescriptor* field =
tables_->FindNestedSymbol(this, key).field_descriptor();
return field != nullptr && field->is_extension() ? field : nullptr;
}
const FieldDescriptor* FileDescriptor::FindExtensionByLowercaseName(
- ConstStringParam key) const {
+ absl::string_view key) const {
const FieldDescriptor* result = tables_->FindFieldByLowercaseName(this, key);
if (result == nullptr || !result->is_extension()) {
return nullptr;
@@ -2351,7 +2297,7 @@
}
const FieldDescriptor* FileDescriptor::FindExtensionByCamelcaseName(
- ConstStringParam key) const {
+ absl::string_view key) const {
const FieldDescriptor* result = tables_->FindFieldByCamelcaseName(this, key);
if (result == nullptr || !result->is_extension()) {
return nullptr;
@@ -2408,7 +2354,7 @@
// -------------------------------------------------------------------
bool DescriptorPool::TryFindFileInFallbackDatabase(
- StringPiece name) const {
+ absl::string_view name) const {
if (fallback_database_ == nullptr) return false;
auto name_string = std::string(name);
@@ -2423,7 +2369,7 @@
return true;
}
-bool DescriptorPool::IsSubSymbolOfBuiltType(StringPiece name) const {
+bool DescriptorPool::IsSubSymbolOfBuiltType(absl::string_view name) const {
auto prefix = std::string(name);
for (;;) {
std::string::size_type dot_pos = prefix.find_last_of('.');
@@ -2446,7 +2392,7 @@
}
bool DescriptorPool::TryFindSymbolInFallbackDatabase(
- StringPiece name) const {
+ absl::string_view name) const {
if (fallback_database_ == nullptr) return false;
auto name_string = std::string(name);
@@ -2523,13 +2469,13 @@
GOOGLE_CHECK(has_default_value()) << "No default value";
switch (cpp_type()) {
case CPPTYPE_INT32:
- return StrCat(default_value_int32_t());
+ return absl::StrCat(default_value_int32_t());
case CPPTYPE_INT64:
- return StrCat(default_value_int64_t());
+ return absl::StrCat(default_value_int64_t());
case CPPTYPE_UINT32:
- return StrCat(default_value_uint32_t());
+ return absl::StrCat(default_value_uint32_t());
case CPPTYPE_UINT64:
- return StrCat(default_value_uint64_t());
+ return absl::StrCat(default_value_uint64_t());
case CPPTYPE_FLOAT:
return SimpleFtoa(default_value_float());
case CPPTYPE_DOUBLE:
@@ -2538,10 +2484,10 @@
return default_value_bool() ? "true" : "false";
case CPPTYPE_STRING:
if (quote_string_type) {
- return "\"" + CEscape(default_value_string()) + "\"";
+ return "\"" + absl::CEscape(default_value_string()) + "\"";
} else {
if (type() == TYPE_BYTES) {
- return CEscape(default_value_string());
+ return absl::CEscape(default_value_string());
} else {
return default_value_string();
}
@@ -2559,10 +2505,7 @@
// CopyTo methods ====================================================
void FileDescriptor::CopyTo(FileDescriptorProto* proto) const {
- proto->set_name(name());
- if (!package().empty()) proto->set_package(package());
- // TODO(liujisi): Also populate when syntax="proto2".
- if (syntax() == SYNTAX_PROTO3) proto->set_syntax(SyntaxName(syntax()));
+ CopyHeadingTo(proto);
for (int i = 0; i < dependency_count(); i++) {
proto->add_dependency(dependency(i)->name());
@@ -2594,6 +2537,19 @@
}
}
+void FileDescriptor::CopyHeadingTo(FileDescriptorProto* proto) const {
+ proto->set_name(name());
+ if (!package().empty()) {
+ proto->set_package(package());
+ }
+
+ // TODO(liujisi): Also populate when syntax="proto2".
+ if (syntax() == SYNTAX_PROTO3
+ ) {
+ proto->set_syntax(SyntaxName(syntax()));
+ }
+}
+
void FileDescriptor::CopyJsonNameTo(FileDescriptorProto* proto) const {
if (message_type_count() != proto->message_type_size() ||
extension_count() != proto->extension_size()) {
@@ -2680,9 +2636,9 @@
// Some compilers do not allow static_cast directly between two enum types,
// so we must cast to int first.
proto->set_label(static_cast<FieldDescriptorProto::Label>(
- implicit_cast<int>(label())));
+ absl::implicit_cast<int>(label())));
proto->set_type(static_cast<FieldDescriptorProto::Type>(
- implicit_cast<int>(type())));
+ absl::implicit_cast<int>(type())));
if (is_extension()) {
if (!containing_type()->is_unqualified_placeholder_) {
@@ -2889,7 +2845,7 @@
const DescriptorPool* pool, std::string* output) {
std::vector<std::string> all_options;
if (RetrieveOptions(depth, options, pool, &all_options)) {
- output->append(Join(all_options, ", "));
+ output->append(absl::StrJoin(all_options, ", "));
}
return !all_options.empty();
}
@@ -2901,7 +2857,7 @@
std::vector<std::string> all_options;
if (RetrieveOptions(depth, options, pool, &all_options)) {
for (const std::string& option : all_options) {
- strings::SubstituteAndAppend(output, "$0option $1;\n", prefix, option);
+ absl::SubstituteAndAppend(output, "$0option $1;\n", prefix, option);
}
}
return !all_options.empty();
@@ -2952,11 +2908,11 @@
// the DebugString() output.
std::string FormatComment(const std::string& comment_text) {
std::string stripped_comment = comment_text;
- StripWhitespace(&stripped_comment);
- std::vector<std::string> lines = Split(stripped_comment, "\n");
+ absl::StripAsciiWhitespace(&stripped_comment);
+ std::vector<std::string> lines = absl::StrSplit(stripped_comment, "\n");
std::string output;
for (const std::string& line : lines) {
- strings::SubstituteAndAppend(&output, "$0// $1\n", prefix_, line);
+ absl::SubstituteAndAppend(&output, "$0// $1\n", prefix_, line);
}
return output;
}
@@ -2985,7 +2941,7 @@
SourceLocationCommentPrinter syntax_comment(this, path, "",
debug_string_options);
syntax_comment.AddPreComment(&contents);
- strings::SubstituteAndAppend(&contents, "syntax = \"$0\";\n\n",
+ absl::SubstituteAndAppend(&contents, "syntax = \"$0\";\n\n",
SyntaxName(syntax()));
syntax_comment.AddPostComment(&contents);
}
@@ -2993,22 +2949,20 @@
SourceLocationCommentPrinter comment_printer(this, "", debug_string_options);
comment_printer.AddPreComment(&contents);
- std::set<int> public_dependencies;
- std::set<int> weak_dependencies;
- public_dependencies.insert(public_dependencies_,
- public_dependencies_ + public_dependency_count_);
- weak_dependencies.insert(weak_dependencies_,
- weak_dependencies_ + weak_dependency_count_);
+ absl::flat_hash_set<int> public_dependencies(
+ public_dependencies_, public_dependencies_ + public_dependency_count_);
+ absl::flat_hash_set<int> weak_dependencies(
+ weak_dependencies_, weak_dependencies_ + weak_dependency_count_);
for (int i = 0; i < dependency_count(); i++) {
- if (public_dependencies.count(i) > 0) {
- strings::SubstituteAndAppend(&contents, "import public \"$0\";\n",
+ if (public_dependencies.contains(i)) {
+ absl::SubstituteAndAppend(&contents, "import public \"$0\";\n",
dependency(i)->name());
- } else if (weak_dependencies.count(i) > 0) {
- strings::SubstituteAndAppend(&contents, "import weak \"$0\";\n",
+ } else if (weak_dependencies.contains(i)) {
+ absl::SubstituteAndAppend(&contents, "import weak \"$0\";\n",
dependency(i)->name());
} else {
- strings::SubstituteAndAppend(&contents, "import \"$0\";\n",
+ absl::SubstituteAndAppend(&contents, "import \"$0\";\n",
dependency(i)->name());
}
}
@@ -3019,7 +2973,7 @@
SourceLocationCommentPrinter package_comment(this, path, "",
debug_string_options);
package_comment.AddPreComment(&contents);
- strings::SubstituteAndAppend(&contents, "package $0;\n\n", package());
+ absl::SubstituteAndAppend(&contents, "package $0;\n\n", package());
package_comment.AddPostComment(&contents);
}
@@ -3034,7 +2988,7 @@
// Find all the 'group' type extensions; we will not output their nested
// definitions (those will be done with their group field descriptor).
- std::set<const Descriptor*> groups;
+ absl::flat_hash_set<const Descriptor*> groups;
for (int i = 0; i < extension_count(); i++) {
if (extension(i)->type() == FieldDescriptor::TYPE_GROUP) {
groups.insert(extension(i)->message_type());
@@ -3042,7 +2996,7 @@
}
for (int i = 0; i < message_type_count(); i++) {
- if (groups.count(message_type(i)) == 0) {
+ if (!groups.contains(message_type(i))) {
message_type(i)->DebugString(0, &contents, debug_string_options,
/* include_opening_clause */ true);
contents.append("\n");
@@ -3059,7 +3013,7 @@
if (extension(i)->containing_type() != containing_type) {
if (i > 0) contents.append("}\n\n");
containing_type = extension(i)->containing_type();
- strings::SubstituteAndAppend(&contents, "extend .$0 {\n",
+ absl::SubstituteAndAppend(&contents, "extend .$0 {\n",
containing_type->full_name());
}
extension(i)->DebugString(1, &contents, debug_string_options);
@@ -3098,7 +3052,7 @@
comment_printer.AddPreComment(contents);
if (include_opening_clause) {
- strings::SubstituteAndAppend(contents, "$0message $1", prefix, name());
+ absl::SubstituteAndAppend(contents, "$0message $1", prefix, name());
}
contents->append(" {\n");
@@ -3107,7 +3061,7 @@
// Find all the 'group' types for fields and extensions; we will not output
// their nested definitions (those will be done with their group field
// descriptor).
- std::set<const Descriptor*> groups;
+ absl::flat_hash_set<const Descriptor*> groups;
for (int i = 0; i < field_count(); i++) {
if (field(i)->type() == FieldDescriptor::TYPE_GROUP) {
groups.insert(field(i)->message_type());
@@ -3120,7 +3074,7 @@
}
for (int i = 0; i < nested_type_count(); i++) {
- if (groups.count(nested_type(i)) == 0) {
+ if (!groups.contains(nested_type(i))) {
nested_type(i)->DebugString(depth, contents, debug_string_options,
/* include_opening_clause */ true);
}
@@ -3139,7 +3093,7 @@
}
for (int i = 0; i < extension_range_count(); i++) {
- strings::SubstituteAndAppend(contents, "$0 extensions $1 to $2;\n", prefix,
+ absl::SubstituteAndAppend(contents, "$0 extensions $1 to $2;\n", prefix,
extension_range(i)->start,
extension_range(i)->end - 1);
}
@@ -3148,26 +3102,26 @@
const Descriptor* containing_type = nullptr;
for (int i = 0; i < extension_count(); i++) {
if (extension(i)->containing_type() != containing_type) {
- if (i > 0) strings::SubstituteAndAppend(contents, "$0 }\n", prefix);
+ if (i > 0) absl::SubstituteAndAppend(contents, "$0 }\n", prefix);
containing_type = extension(i)->containing_type();
- strings::SubstituteAndAppend(contents, "$0 extend .$1 {\n", prefix,
+ absl::SubstituteAndAppend(contents, "$0 extend .$1 {\n", prefix,
containing_type->full_name());
}
extension(i)->DebugString(depth + 1, contents, debug_string_options);
}
if (extension_count() > 0)
- strings::SubstituteAndAppend(contents, "$0 }\n", prefix);
+ absl::SubstituteAndAppend(contents, "$0 }\n", prefix);
if (reserved_range_count() > 0) {
- strings::SubstituteAndAppend(contents, "$0 reserved ", prefix);
+ absl::SubstituteAndAppend(contents, "$0 reserved ", prefix);
for (int i = 0; i < reserved_range_count(); i++) {
const Descriptor::ReservedRange* range = reserved_range(i);
if (range->end == range->start + 1) {
- strings::SubstituteAndAppend(contents, "$0, ", range->start);
+ absl::SubstituteAndAppend(contents, "$0, ", range->start);
} else if (range->end > FieldDescriptor::kMaxNumber) {
- strings::SubstituteAndAppend(contents, "$0 to max, ", range->start);
+ absl::SubstituteAndAppend(contents, "$0 to max, ", range->start);
} else {
- strings::SubstituteAndAppend(contents, "$0 to $1, ", range->start,
+ absl::SubstituteAndAppend(contents, "$0 to $1, ", range->start,
range->end - 1);
}
}
@@ -3175,15 +3129,15 @@
}
if (reserved_name_count() > 0) {
- strings::SubstituteAndAppend(contents, "$0 reserved ", prefix);
+ absl::SubstituteAndAppend(contents, "$0 reserved ", prefix);
for (int i = 0; i < reserved_name_count(); i++) {
- strings::SubstituteAndAppend(contents, "\"$0\", ",
- CEscape(reserved_name(i)));
+ absl::SubstituteAndAppend(contents, "\"$0\", ",
+ absl::CEscape(reserved_name(i)));
}
contents->replace(contents->size() - 2, 2, ";\n");
}
- strings::SubstituteAndAppend(contents, "$0}\n", prefix);
+ absl::SubstituteAndAppend(contents, "$0}\n", prefix);
comment_printer.AddPostComment(contents);
}
@@ -3197,7 +3151,7 @@
std::string contents;
int depth = 0;
if (is_extension()) {
- strings::SubstituteAndAppend(&contents, "extend .$0 {\n",
+ absl::SubstituteAndAppend(&contents, "extend .$0 {\n",
containing_type()->full_name());
depth = 1;
}
@@ -3228,7 +3182,7 @@
// Special case map fields.
if (is_map()) {
- strings::SubstituteAndAppend(
+ absl::SubstituteAndAppend(
&field_type, "map<$0, $1>",
message_type()->field(0)->FieldTypeNameDebugString(),
message_type()->field(1)->FieldTypeNameDebugString());
@@ -3236,7 +3190,7 @@
field_type = FieldTypeNameDebugString();
}
- std::string label = StrCat(kLabelToName[this->label()], " ");
+ std::string label = absl::StrCat(kLabelToName[this->label()], " ");
// Label is omitted for maps, oneof, and plain proto3 fields.
if (is_map() || real_containing_oneof() ||
@@ -3248,14 +3202,14 @@
debug_string_options);
comment_printer.AddPreComment(contents);
- strings::SubstituteAndAppend(
+ absl::SubstituteAndAppend(
contents, "$0$1$2 $3 = $4", prefix, label, field_type,
type() == TYPE_GROUP ? message_type()->name() : name(), number());
bool bracketed = false;
if (has_default_value()) {
bracketed = true;
- strings::SubstituteAndAppend(contents, " [default = $0",
+ absl::SubstituteAndAppend(contents, " [default = $0",
DefaultValueAsString(true));
}
if (has_json_name_) {
@@ -3266,7 +3220,7 @@
contents->append(", ");
}
contents->append("json_name = \"");
- contents->append(CEscape(json_name()));
+ contents->append(absl::CEscape(json_name()));
contents->append("\"");
}
@@ -3316,7 +3270,7 @@
SourceLocationCommentPrinter comment_printer(this, prefix,
debug_string_options);
comment_printer.AddPreComment(contents);
- strings::SubstituteAndAppend(contents, "$0oneof $1 {", prefix, name());
+ absl::SubstituteAndAppend(contents, "$0oneof $1 {", prefix, name());
FormatLineOptions(depth, options(), containing_type()->file()->pool(),
contents);
@@ -3328,7 +3282,7 @@
for (int i = 0; i < field_count(); i++) {
field(i)->DebugString(depth, contents, debug_string_options);
}
- strings::SubstituteAndAppend(contents, "$0}\n", prefix);
+ absl::SubstituteAndAppend(contents, "$0}\n", prefix);
}
comment_printer.AddPostComment(contents);
}
@@ -3355,7 +3309,7 @@
debug_string_options);
comment_printer.AddPreComment(contents);
- strings::SubstituteAndAppend(contents, "$0enum $1 {\n", prefix, name());
+ absl::SubstituteAndAppend(contents, "$0enum $1 {\n", prefix, name());
FormatLineOptions(depth, options(), file()->pool(), contents);
@@ -3364,15 +3318,15 @@
}
if (reserved_range_count() > 0) {
- strings::SubstituteAndAppend(contents, "$0 reserved ", prefix);
+ absl::SubstituteAndAppend(contents, "$0 reserved ", prefix);
for (int i = 0; i < reserved_range_count(); i++) {
const EnumDescriptor::ReservedRange* range = reserved_range(i);
if (range->end == range->start) {
- strings::SubstituteAndAppend(contents, "$0, ", range->start);
+ absl::SubstituteAndAppend(contents, "$0, ", range->start);
} else if (range->end == INT_MAX) {
- strings::SubstituteAndAppend(contents, "$0 to max, ", range->start);
+ absl::SubstituteAndAppend(contents, "$0 to max, ", range->start);
} else {
- strings::SubstituteAndAppend(contents, "$0 to $1, ", range->start,
+ absl::SubstituteAndAppend(contents, "$0 to $1, ", range->start,
range->end);
}
}
@@ -3380,15 +3334,15 @@
}
if (reserved_name_count() > 0) {
- strings::SubstituteAndAppend(contents, "$0 reserved ", prefix);
+ absl::SubstituteAndAppend(contents, "$0 reserved ", prefix);
for (int i = 0; i < reserved_name_count(); i++) {
- strings::SubstituteAndAppend(contents, "\"$0\", ",
- CEscape(reserved_name(i)));
+ absl::SubstituteAndAppend(contents, "\"$0\", ",
+ absl::CEscape(reserved_name(i)));
}
contents->replace(contents->size() - 2, 2, ";\n");
}
- strings::SubstituteAndAppend(contents, "$0}\n", prefix);
+ absl::SubstituteAndAppend(contents, "$0}\n", prefix);
comment_printer.AddPostComment(contents);
}
@@ -3414,12 +3368,12 @@
debug_string_options);
comment_printer.AddPreComment(contents);
- strings::SubstituteAndAppend(contents, "$0$1 = $2", prefix, name(), number());
+ absl::SubstituteAndAppend(contents, "$0$1 = $2", prefix, name(), number());
std::string formatted_options;
if (FormatBracketedOptions(depth, options(), type()->file()->pool(),
&formatted_options)) {
- strings::SubstituteAndAppend(contents, " [$0]", formatted_options);
+ absl::SubstituteAndAppend(contents, " [$0]", formatted_options);
}
contents->append(";\n");
@@ -3445,7 +3399,7 @@
debug_string_options);
comment_printer.AddPreComment(contents);
- strings::SubstituteAndAppend(contents, "service $0 {\n", name());
+ absl::SubstituteAndAppend(contents, "service $0 {\n", name());
FormatLineOptions(1, options(), file()->pool(), contents);
@@ -3480,7 +3434,7 @@
debug_string_options);
comment_printer.AddPreComment(contents);
- strings::SubstituteAndAppend(
+ absl::SubstituteAndAppend(
contents, "$0rpc $1($4.$2) returns ($5.$3)", prefix, name(),
input_type()->full_name(), output_type()->full_name(),
client_streaming() ? "stream " : "", server_streaming() ? "stream " : "");
@@ -3488,7 +3442,7 @@
std::string formatted_options;
if (FormatLineOptions(depth, options(), service()->file()->pool(),
&formatted_options)) {
- strings::SubstituteAndAppend(contents, " {\n$0$1}\n", formatted_options,
+ absl::SubstituteAndAppend(contents, " {\n$0$1}\n", formatted_options,
prefix);
} else {
contents->append(";\n");
@@ -3698,7 +3652,7 @@
std::string filename_;
FileDescriptor* file_;
FileDescriptorTables* file_tables_;
- std::set<const FileDescriptor*> dependencies_;
+ absl::flat_hash_set<const FileDescriptor*> dependencies_;
struct MessageHints {
int fields_to_suggest = 0;
@@ -3721,11 +3675,11 @@
}
};
- std::unordered_map<const Descriptor*, MessageHints> message_hints_;
+ absl::flat_hash_map<const Descriptor*, MessageHints> message_hints_;
// unused_dependency_ is used to record the unused imported files.
// Note: public import is not considered.
- std::set<const FileDescriptor*> unused_dependency_;
+ absl::flat_hash_set<const FileDescriptor*> unused_dependency_;
// If LookupSymbol() finds a symbol that is in a file which is not a declared
// dependency of this file, it will fail, but will set
@@ -3949,6 +3903,8 @@
// specified builder, which must not be nullptr. We don't take ownership of
// the builder.
explicit OptionInterpreter(DescriptorBuilder* builder);
+ OptionInterpreter(const OptionInterpreter&) = delete;
+ OptionInterpreter& operator=(const OptionInterpreter&) = delete;
~OptionInterpreter();
@@ -4065,8 +4021,6 @@
// Factory used to create the dynamic messages we need to parse
// any aggregate option values we encounter.
DynamicMessageFactory dynamic_factory_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(OptionInterpreter);
};
// Work-around for broken compilers: According to the C++ standard,
@@ -4259,7 +4213,7 @@
bool DescriptorBuilder::IsInPackage(const FileDescriptor* file,
const std::string& package_name) {
- return HasPrefixString(file->package(), package_name) &&
+ return absl::StartsWith(file->package(), package_name) &&
(file->package().size() == package_name.size() ||
file->package()[package_name.size()] == '.');
}
@@ -4275,7 +4229,7 @@
const DescriptorPool* pool, const std::string& name, bool build_it) {
// If we are looking at an underlay, we must lock its mutex_, since we are
// accessing the underlay's tables_ directly.
- MutexLockMaybe lock((pool == pool_) ? nullptr : pool->mutex_);
+ absl::MutexLockMaybe lock((pool == pool_) ? nullptr : pool->mutex_);
Symbol result = pool->tables_->FindSymbol(name);
if (result.IsNull() && pool->underlay_ != nullptr) {
@@ -4305,7 +4259,7 @@
// Only find symbols which were defined in this file or one of its
// dependencies.
const FileDescriptor* file = result.GetFile();
- if (file == file_ || dependencies_.count(file) > 0) {
+ if (file == file_ || dependencies_.contains(file)) {
unused_dependency_.erase(file);
}
return result;
@@ -4324,7 +4278,7 @@
// Only find symbols which were defined in this file or one of its
// dependencies.
const FileDescriptor* file = result.GetFile();
- if (file == file_ || dependencies_.count(file) > 0) {
+ if (file == file_ || dependencies_.contains(file)) {
return result;
}
@@ -4337,11 +4291,9 @@
// dependency also defines the same package. We can't really rule out this
// symbol unless none of the dependencies define it.
if (IsInPackage(file_, name)) return result;
- for (std::set<const FileDescriptor*>::const_iterator it =
- dependencies_.begin();
- it != dependencies_.end(); ++it) {
+ for (const auto* dep : dependencies_) {
// Note: A dependency may be nullptr if it was not found or had errors.
- if (*it != nullptr && IsInPackage(*it, name)) return result;
+ if (dep != nullptr && IsInPackage(dep, name)) return result;
}
}
@@ -4439,7 +4391,7 @@
return result;
}
-static bool ValidateQualifiedName(StringPiece name) {
+static bool ValidateQualifiedName(absl::string_view name) {
bool last_was_period = false;
for (char character : name) {
@@ -4459,20 +4411,20 @@
return !name.empty() && !last_was_period;
}
-Symbol DescriptorPool::NewPlaceholder(StringPiece name,
+Symbol DescriptorPool::NewPlaceholder(absl::string_view name,
PlaceholderType placeholder_type) const {
- MutexLockMaybe lock(mutex_);
+ absl::MutexLockMaybe lock(mutex_);
return NewPlaceholderWithMutexHeld(name, placeholder_type);
}
Symbol DescriptorPool::NewPlaceholderWithMutexHeld(
- StringPiece name, PlaceholderType placeholder_type) const {
+ absl::string_view name, PlaceholderType placeholder_type) const {
if (mutex_) {
mutex_->AssertHeld();
}
// Compute names.
- StringPiece placeholder_full_name;
- StringPiece placeholder_name;
+ absl::string_view placeholder_full_name;
+ absl::string_view placeholder_name;
const std::string* placeholder_package;
if (!ValidateQualifiedName(name)) return Symbol();
@@ -4512,7 +4464,7 @@
}
FileDescriptor* placeholder_file = NewPlaceholderFileWithMutexHeld(
- StrCat(placeholder_full_name, ".placeholder.proto"), alloc);
+ absl::StrCat(placeholder_full_name, ".placeholder.proto"), alloc);
placeholder_file->package_ = placeholder_package;
if (placeholder_type == PLACEHOLDER_ENUM) {
@@ -4581,8 +4533,8 @@
}
FileDescriptor* DescriptorPool::NewPlaceholderFile(
- StringPiece name) const {
- MutexLockMaybe lock(mutex_);
+ absl::string_view name) const {
+ absl::MutexLockMaybe lock(mutex_);
internal::FlatAllocator alloc;
alloc.PlanArray<FileDescriptor>(1);
alloc.PlanArray<std::string>(1);
@@ -4592,7 +4544,7 @@
}
FileDescriptor* DescriptorPool::NewPlaceholderFileWithMutexHeld(
- StringPiece name, internal::FlatAllocator& alloc) const {
+ absl::string_view name, internal::FlatAllocator& alloc) const {
if (mutex_) {
mutex_->AssertHeld();
}
@@ -4982,7 +4934,8 @@
internal::FlatAllocator& alloc) {
alloc.PlanArray<FileDescriptor>(1);
alloc.PlanArray<FileDescriptorTables>(1);
- alloc.PlanArray<std::string>(2); // name + package
+ alloc.PlanArray<std::string>(2
+ ); // name + package
if (proto.has_options()) alloc.PlanArray<FileOptions>(1);
if (proto.has_source_code_info()) alloc.PlanArray<SourceCodeInfo>(1);
@@ -5151,13 +5104,13 @@
}
// Make sure all dependencies are loaded.
- std::set<std::string> seen_dependencies;
+ absl::flat_hash_set<absl::string_view> seen_dependencies;
result->dependency_count_ = proto.dependency_size();
result->dependencies_ =
alloc.AllocateArray<const FileDescriptor*>(proto.dependency_size());
result->dependencies_once_ = nullptr;
unused_dependency_.clear();
- std::set<int> weak_deps;
+ absl::flat_hash_set<int> weak_deps;
for (int i = 0; i < proto.weak_dependency_size(); ++i) {
weak_deps.insert(proto.weak_dependency(i));
}
@@ -5183,7 +5136,7 @@
if (dependency == nullptr) {
if (!pool_->lazily_build_dependencies_) {
if (pool_->allow_unknown_ ||
- (!pool_->enforce_weak_ && weak_deps.find(i) != weak_deps.end())) {
+ (!pool_->enforce_weak_ && weak_deps.contains(i))) {
internal::FlatAllocator lazy_dep_alloc;
lazy_dep_alloc.PlanArray<FileDescriptor>(1);
lazy_dep_alloc.PlanArray<std::string>(1);
@@ -5220,8 +5173,8 @@
}
void* data = tables_->AllocateBytes(
- static_cast<int>(sizeof(internal::once_flag) + total_char_size));
- result->dependencies_once_ = ::new (data) internal::once_flag{};
+ static_cast<int>(sizeof(absl::once_flag)) + total_char_size);
+ result->dependencies_once_ = ::new (data) absl::once_flag{};
char* name_data = reinterpret_cast<char*>(result->dependencies_once_ + 1);
for (int i = 0; i < proto.dependency_size(); i++) {
@@ -5358,7 +5311,7 @@
return alloc.AllocateStrings(proto_name, proto_name);
} else {
return alloc.AllocateStrings(proto_name,
- StrCat(scope, ".", proto_name));
+ absl::StrCat(scope, ".", proto_name));
}
}
@@ -5452,7 +5405,7 @@
if (range1.end() > range2.start() && range2.end() > range1.start()) {
AddError(result->full_name(), proto.reserved_range(i),
DescriptorPool::ErrorCollector::NUMBER,
- strings::Substitute("Reserved range $0 to $1 overlaps with "
+ absl::Substitute("Reserved range $0 to $1 overlaps with "
"already-defined range $2 to $3.",
range2.start(), range2.end() - 1,
range1.start(), range1.end() - 1));
@@ -5460,14 +5413,12 @@
}
}
- HASH_SET<std::string> reserved_name_set;
+ absl::flat_hash_set<std::string> reserved_name_set;
for (int i = 0; i < proto.reserved_name_size(); i++) {
const std::string& name = proto.reserved_name(i);
- if (reserved_name_set.find(name) == reserved_name_set.end()) {
- reserved_name_set.insert(name);
- } else {
+ if (!reserved_name_set.insert(name).second) {
AddError(name, proto, DescriptorPool::ErrorCollector::NAME,
- strings::Substitute("Field name \"$0\" is reserved multiple times.",
+ absl::Substitute("Field name \"$0\" is reserved multiple times.",
name));
}
}
@@ -5483,7 +5434,7 @@
AddError(
field->full_name(), proto.extension_range(j),
DescriptorPool::ErrorCollector::NUMBER,
- strings::Substitute(
+ absl::Substitute(
"Extension range $0 to $1 includes field \"$2\" ($3).",
range->start, range->end - 1, field->name(), field->number()));
}
@@ -5495,7 +5446,7 @@
proto.reserved_range(j), DescriptorPool::ErrorCollector::NUMBER);
AddError(field->full_name(), proto.reserved_range(j),
DescriptorPool::ErrorCollector::NUMBER,
- strings::Substitute("Field \"$0\" uses reserved number $1.",
+ absl::Substitute("Field \"$0\" uses reserved number $1.",
field->name(), field->number()));
}
}
@@ -5503,7 +5454,7 @@
AddError(
field->full_name(), proto.field(i),
DescriptorPool::ErrorCollector::NAME,
- strings::Substitute("Field name \"$0\" is reserved.", field->name()));
+ absl::Substitute("Field name \"$0\" is reserved.", field->name()));
}
}
@@ -5517,7 +5468,7 @@
if (range1->end > range2->start && range2->end > range1->start) {
AddError(result->full_name(), proto.extension_range(i),
DescriptorPool::ErrorCollector::NUMBER,
- strings::Substitute("Extension range $0 to $1 overlaps with "
+ absl::Substitute("Extension range $0 to $1 overlaps with "
"reserved range $2 to $3.",
range1->start, range1->end - 1, range2->start,
range2->end - 1));
@@ -5528,7 +5479,7 @@
if (range1->end > range2->start && range2->end > range1->start) {
AddError(result->full_name(), proto.extension_range(i),
DescriptorPool::ErrorCollector::NUMBER,
- strings::Substitute("Extension range $0 to $1 overlaps with "
+ absl::Substitute("Extension range $0 to $1 overlaps with "
"already-defined range $2 to $3.",
range2->start, range2->end - 1, range1->start,
range1->end - 1));
@@ -5576,9 +5527,9 @@
// Some compilers do not allow static_cast directly between two enum types,
// so we must cast to int first.
result->type_ = static_cast<FieldDescriptor::Type>(
- implicit_cast<int>(proto.type()));
+ absl::implicit_cast<int>(proto.type()));
result->label_ = static_cast<FieldDescriptor::Label>(
- implicit_cast<int>(proto.label()));
+ absl::implicit_cast<int>(proto.label()));
if (result->label_ == FieldDescriptor::LABEL_REQUIRED) {
// An extension cannot have a required field (b/13365836).
@@ -5673,8 +5624,9 @@
break;
case FieldDescriptor::CPPTYPE_STRING:
if (result->type() == FieldDescriptor::TYPE_BYTES) {
- result->default_value_string_ = alloc.AllocateStrings(
- UnescapeCEscapeString(proto.default_value()));
+ std::string value;
+ absl::CUnescape(proto.default_value(), &value);
+ result->default_value_string_ = alloc.AllocateStrings(value);
} else {
result->default_value_string_ =
alloc.AllocateStrings(proto.default_value());
@@ -5755,14 +5707,14 @@
message_hints_[parent].RequestHintOnFieldNumbers(
proto, DescriptorPool::ErrorCollector::NUMBER);
AddError(result->full_name(), proto, DescriptorPool::ErrorCollector::NUMBER,
- strings::Substitute("Field numbers cannot be greater than $0.",
+ absl::Substitute("Field numbers cannot be greater than $0.",
FieldDescriptor::kMaxNumber));
} else if (result->number() >= FieldDescriptor::kFirstReservedNumber &&
result->number() <= FieldDescriptor::kLastReservedNumber) {
message_hints_[parent].RequestHintOnFieldNumbers(
proto, DescriptorPool::ErrorCollector::NUMBER);
AddError(result->full_name(), proto, DescriptorPool::ErrorCollector::NUMBER,
- strings::Substitute(
+ absl::Substitute(
"Field numbers $0 through $1 are reserved for the protocol "
"buffer library implementation.",
FieldDescriptor::kFirstReservedNumber,
@@ -5797,7 +5749,7 @@
proto.oneof_index() >= parent->oneof_decl_count()) {
AddError(result->full_name(), proto,
DescriptorPool::ErrorCollector::TYPE,
- strings::Substitute("FieldDescriptorProto.oneof_index $0 is "
+ absl::Substitute("FieldDescriptorProto.oneof_index $0 is "
"out of range for type \"$1\".",
proto.oneof_index(), parent->name()));
} else {
@@ -6046,7 +5998,7 @@
if (range1.end() >= range2.start() && range2.end() >= range1.start()) {
AddError(result->full_name(), proto.reserved_range(i),
DescriptorPool::ErrorCollector::NUMBER,
- strings::Substitute("Reserved range $0 to $1 overlaps with "
+ absl::Substitute("Reserved range $0 to $1 overlaps with "
"already-defined range $2 to $3.",
range2.start(), range2.end(), range1.start(),
range1.end()));
@@ -6054,14 +6006,14 @@
}
}
- HASH_SET<std::string> reserved_name_set;
+ absl::flat_hash_set<std::string> reserved_name_set;
for (int i = 0; i < proto.reserved_name_size(); i++) {
const std::string& name = proto.reserved_name(i);
if (reserved_name_set.find(name) == reserved_name_set.end()) {
reserved_name_set.insert(name);
} else {
AddError(name, proto, DescriptorPool::ErrorCollector::NAME,
- strings::Substitute("Enum value \"$0\" is reserved multiple times.",
+ absl::Substitute("Enum value \"$0\" is reserved multiple times.",
name));
}
}
@@ -6073,7 +6025,7 @@
if (range->start <= value->number() && value->number() <= range->end) {
AddError(value->full_name(), proto.reserved_range(j),
DescriptorPool::ErrorCollector::NUMBER,
- strings::Substitute("Enum value \"$0\" uses reserved number $1.",
+ absl::Substitute("Enum value \"$0\" uses reserved number $1.",
value->name(), value->number()));
}
}
@@ -6081,7 +6033,7 @@
AddError(
value->full_name(), proto.value(i),
DescriptorPool::ErrorCollector::NAME,
- strings::Substitute("Enum value \"$0\" is reserved.", value->name()));
+ absl::Substitute("Enum value \"$0\" is reserved.", value->name()));
}
}
}
@@ -6279,7 +6231,7 @@
message->field(i - 1)->containing_oneof() != oneof_decl) {
AddError(message->full_name() + "." + message->field(i - 1)->name(),
proto.field(i - 1), DescriptorPool::ErrorCollector::TYPE,
- strings::Substitute(
+ absl::Substitute(
"Fields in the same oneof must be defined consecutively. "
"\"$0\" cannot be defined before the completion of the "
"\"$1\" oneof definition.",
@@ -6399,7 +6351,7 @@
if (!skip_check) {
AddError(field->full_name(), proto,
DescriptorPool::ErrorCollector::NUMBER,
- strings::Substitute("\"$0\" does not declare $1 as an "
+ absl::Substitute("\"$0\" does not declare $1 as an "
"extension number.",
field->containing_type()->full_name(),
field->number()));
@@ -6449,8 +6401,9 @@
int name_sizes = static_cast<int>(name.size() + 1 +
proto.default_value().size() + 1);
- field->type_once_ = ::new (tables_->AllocateBytes(static_cast<int>(
- sizeof(internal::once_flag) + name_sizes))) internal::once_flag{};
+ field->type_once_ = ::new (tables_->AllocateBytes(
+ static_cast<int>(sizeof(absl::once_flag)) + name_sizes))
+ absl::once_flag{};
char* names = reinterpret_cast<char*>(field->type_once_ + 1);
memcpy(names, name.c_str(), name.size() + 1);
@@ -6589,14 +6542,14 @@
if (field->is_extension()) {
AddError(field->full_name(), proto,
DescriptorPool::ErrorCollector::NUMBER,
- strings::Substitute("Extension number $0 has already been used "
+ absl::Substitute("Extension number $0 has already been used "
"in \"$1\" by extension \"$2\".",
field->number(), containing_type_name,
conflicting_field->full_name()));
} else {
AddError(field->full_name(), proto,
DescriptorPool::ErrorCollector::NUMBER,
- strings::Substitute("Field number $0 has already been used in "
+ absl::Substitute("Field number $0 has already been used in "
"\"$1\" by field \"$2\".",
field->number(), containing_type_name,
conflicting_field->name()));
@@ -6610,7 +6563,7 @@
field->containing_type() == nullptr
? "unknown"
: field->containing_type()->full_name();
- std::string error_msg = strings::Substitute(
+ std::string error_msg = absl::Substitute(
"Extension number $0 has already been used in \"$1\" by extension "
"\"$2\" defined in $3.",
field->number(), containing_type_name,
@@ -6708,8 +6661,9 @@
for (int message_index = 0; message_index < file->message_type_count();
message_index++) {
const Descriptor* message = &file->message_types_[message_index];
- auto* hints = FindOrNull(message_hints_, message);
- if (!hints) continue;
+ auto hints_it = message_hints_.find(message);
+ if (hints_it == message_hints_.end()) continue;
+ auto* hints = &hints_it->second;
constexpr int kMaxSuggestions = 3;
int fields_to_suggest = std::min(kMaxSuggestions, hints->fields_to_suggest);
if (fields_to_suggest <= 0) continue;
@@ -6951,7 +6905,7 @@
if (message->extension_range(i)->end > max_extension_range + 1) {
AddError(message->full_name(), proto.extension_range(i),
DescriptorPool::ErrorCollector::NUMBER,
- strings::Substitute("Extension numbers cannot be greater than $0.",
+ absl::Substitute("Extension numbers cannot be greater than $0.",
max_extension_range));
}
@@ -7309,7 +7263,7 @@
*original_options, original_uninterpreted_options_field);
for (int i = 0; i < num_uninterpreted_options; ++i) {
src_path.push_back(i);
- uninterpreted_option_ = down_cast<const UninterpretedOption*>(
+ uninterpreted_option_ = DownCast<const UninterpretedOption*>(
&original_options->GetReflection()->GetRepeatedMessage(
*original_options, original_uninterpreted_options_field, i));
if (!InterpretSingleOption(options, src_path,
@@ -7729,6 +7683,27 @@
return true;
}
+namespace {
+// Helpers for method below
+
+template <typename T> std::string ValueOutOfRange(
+ absl::string_view type_name, absl::string_view option_name) {
+ return absl::StrFormat(
+ "Value out of range, %d to %d, for %s option \"%s\".", \
+ std::numeric_limits<T>::min(), std::numeric_limits<T>::max(),
+ type_name, option_name);
+}
+
+template <typename T> std::string ValueMustBeInt(
+ absl::string_view type_name, absl::string_view option_name) {
+ return absl::StrFormat(
+ "Value must be integer, from %d to %d, for %s option \"%s\".", \
+ std::numeric_limits<T>::min(), std::numeric_limits<T>::max(),
+ type_name, option_name);
+}
+
+} // namespace
+
bool DescriptorBuilder::OptionInterpreter::SetOptionValue(
const FieldDescriptor* option_field, UnknownFieldSet* unknown_fields) {
// We switch on the CppType to validate.
@@ -7737,8 +7712,7 @@
if (uninterpreted_option_->has_positive_int_value()) {
if (uninterpreted_option_->positive_int_value() >
static_cast<uint64_t>(std::numeric_limits<int32_t>::max())) {
- return AddValueError("Value out of range for int32 option \"" +
- option_field->full_name() + "\".");
+ return AddValueError(ValueOutOfRange<int32_t>("int32", option_field->full_name()));
} else {
SetInt32(option_field->number(),
uninterpreted_option_->positive_int_value(),
@@ -7747,16 +7721,14 @@
} else if (uninterpreted_option_->has_negative_int_value()) {
if (uninterpreted_option_->negative_int_value() <
static_cast<int64_t>(std::numeric_limits<int32_t>::min())) {
- return AddValueError("Value out of range for int32 option \"" +
- option_field->full_name() + "\".");
+ return AddValueError(ValueOutOfRange<int32_t>("int32", option_field->full_name()));
} else {
SetInt32(option_field->number(),
uninterpreted_option_->negative_int_value(),
option_field->type(), unknown_fields);
}
} else {
- return AddValueError("Value must be integer for int32 option \"" +
- option_field->full_name() + "\".");
+ return AddValueError(ValueMustBeInt<int32_t>("int32", option_field->full_name()));
}
break;
@@ -7764,8 +7736,7 @@
if (uninterpreted_option_->has_positive_int_value()) {
if (uninterpreted_option_->positive_int_value() >
static_cast<uint64_t>(std::numeric_limits<int64_t>::max())) {
- return AddValueError("Value out of range for int64 option \"" +
- option_field->full_name() + "\".");
+ return AddValueError(ValueOutOfRange<int64_t>("int64", option_field->full_name()));
} else {
SetInt64(option_field->number(),
uninterpreted_option_->positive_int_value(),
@@ -7776,8 +7747,7 @@
uninterpreted_option_->negative_int_value(),
option_field->type(), unknown_fields);
} else {
- return AddValueError("Value must be integer for int64 option \"" +
- option_field->full_name() + "\".");
+ return AddValueError(ValueMustBeInt<int64_t>("int64", option_field->full_name()));
}
break;
@@ -7785,18 +7755,14 @@
if (uninterpreted_option_->has_positive_int_value()) {
if (uninterpreted_option_->positive_int_value() >
std::numeric_limits<uint32_t>::max()) {
- return AddValueError("Value out of range for uint32 option \"" +
- option_field->name() + "\".");
+ return AddValueError(ValueOutOfRange<uint32_t>("uint32", option_field->full_name()));
} else {
SetUInt32(option_field->number(),
uninterpreted_option_->positive_int_value(),
option_field->type(), unknown_fields);
}
} else {
- return AddValueError(
- "Value must be non-negative integer for uint32 "
- "option \"" +
- option_field->full_name() + "\".");
+ return AddValueError(ValueMustBeInt<uint32_t>("uint32", option_field->full_name()));
}
break;
@@ -7806,10 +7772,7 @@
uninterpreted_option_->positive_int_value(),
option_field->type(), unknown_fields);
} else {
- return AddValueError(
- "Value must be non-negative integer for uint64 "
- "option \"" +
- option_field->full_name() + "\".");
+ return AddValueError(ValueMustBeInt<uint64_t>("uint64", option_field->full_name()));
}
break;
@@ -8154,22 +8117,20 @@
auto itr = pool_->unused_import_track_files_.find(proto.name());
bool is_error =
itr != pool_->unused_import_track_files_.end() && itr->second;
- for (std::set<const FileDescriptor*>::const_iterator it =
- unused_dependency_.begin();
- it != unused_dependency_.end(); ++it) {
- std::string error_message = "Import " + (*it)->name() + " is unused.";
+ for (const auto* unused : unused_dependency_) {
+ std::string error_message = "Import " + unused->name() + " is unused.";
if (is_error) {
- AddError((*it)->name(), proto, DescriptorPool::ErrorCollector::IMPORT,
+ AddError(unused->name(), proto, DescriptorPool::ErrorCollector::IMPORT,
error_message);
} else {
- AddWarning((*it)->name(), proto, DescriptorPool::ErrorCollector::IMPORT,
- error_message);
+ AddWarning(unused->name(), proto,
+ DescriptorPool::ErrorCollector::IMPORT, error_message);
}
}
}
}
-Symbol DescriptorPool::CrossLinkOnDemandHelper(StringPiece name,
+Symbol DescriptorPool::CrossLinkOnDemandHelper(absl::string_view name,
bool expecting_enum) const {
(void)expecting_enum; // Parameter is used by Google-internal code.
auto lookup_name = std::string(name);
@@ -8231,11 +8192,11 @@
}
// message_type(), enum_type(), default_value_enum(), and type()
-// all share the same internal::call_once init path to do lazy
+// all share the same absl::call_once init path to do lazy
// import building and cross linking of a field of a message.
const Descriptor* FieldDescriptor::message_type() const {
if (type_once_) {
- internal::call_once(*type_once_, FieldDescriptor::TypeOnceInit, this);
+ absl::call_once(*type_once_, FieldDescriptor::TypeOnceInit, this);
}
return type_ == TYPE_MESSAGE || type_ == TYPE_GROUP
? type_descriptor_.message_type
@@ -8244,14 +8205,14 @@
const EnumDescriptor* FieldDescriptor::enum_type() const {
if (type_once_) {
- internal::call_once(*type_once_, FieldDescriptor::TypeOnceInit, this);
+ absl::call_once(*type_once_, FieldDescriptor::TypeOnceInit, this);
}
return type_ == TYPE_ENUM ? type_descriptor_.enum_type : nullptr;
}
const EnumValueDescriptor* FieldDescriptor::default_value_enum() const {
if (type_once_) {
- internal::call_once(*type_once_, FieldDescriptor::TypeOnceInit, this);
+ absl::call_once(*type_once_, FieldDescriptor::TypeOnceInit, this);
}
return default_value_enum_;
}
@@ -8284,9 +8245,9 @@
const FileDescriptor* FileDescriptor::dependency(int index) const {
if (dependencies_once_) {
// Do once init for all indices, as it's unlikely only a single index would
- // be called, and saves on internal::call_once allocations.
- internal::call_once(*dependencies_once_,
- FileDescriptor::DependenciesOnceInit, this);
+ // be called, and saves on absl::call_once allocations.
+ absl::call_once(*dependencies_once_, FileDescriptor::DependenciesOnceInit,
+ this);
}
return dependencies_[index];
}
@@ -8305,7 +8266,7 @@
descriptor_ = descriptor;
}
-void LazyDescriptor::SetLazy(StringPiece name,
+void LazyDescriptor::SetLazy(absl::string_view name,
const FileDescriptor* file) {
// verify Init() has been called and Set hasn't been called yet.
GOOGLE_CHECK(!descriptor_);
@@ -8314,7 +8275,7 @@
GOOGLE_CHECK(file->pool_->lazily_build_dependencies_);
GOOGLE_CHECK(!file->finished_building_);
once_ = ::new (file->pool_->tables_->AllocateBytes(static_cast<int>(
- sizeof(internal::once_flag) + name.size() + 1))) internal::once_flag{};
+ sizeof(absl::once_flag) + name.size() + 1))) absl::once_flag{};
char* lazy_name = reinterpret_cast<char*>(once_ + 1);
memcpy(lazy_name, name.data(), name.size());
lazy_name[name.size()] = 0;
@@ -8322,7 +8283,7 @@
void LazyDescriptor::Once(const ServiceDescriptor* service) {
if (once_) {
- internal::call_once(*once_, [&] {
+ absl::call_once(*once_, [&] {
auto* file = service->file();
GOOGLE_CHECK(file->finished_building_);
const char* lazy_name = reinterpret_cast<const char*>(once_ + 1);
@@ -8332,9 +8293,51 @@
}
}
+namespace cpp {
+bool HasPreservingUnknownEnumSemantics(const FieldDescriptor* field) {
+ return field->file()->syntax() == FileDescriptor::SYNTAX_PROTO3;
+}
+
+bool HasHasbit(const FieldDescriptor* field) {
+ // This predicate includes proto3 message fields only if they have "optional".
+ // Foo submsg1 = 1; // HasHasbit() == false
+ // optional Foo submsg2 = 2; // HasHasbit() == true
+ // This is slightly odd, as adding "optional" to a singular proto3 field does
+ // not change the semantics or API. However whenever any field in a message
+ // has a hasbit, it forces reflection to include hasbit offsets for *all*
+ // fields, even if almost all of them are set to -1 (no hasbit). So to avoid
+ // causing a sudden size regression for ~all proto3 messages, we give proto3
+ // message fields a hasbit only if "optional" is present. If the user is
+ // explicitly writing "optional", it is likely they are writing it on
+ // primitive fields also.
+ return (field->has_optional_keyword() || field->is_required()) &&
+ !field->options().weak();
+}
+
+static bool FieldEnforceUtf8(const FieldDescriptor* field) {
+ return true;
+}
+
+static bool FileUtf8Verification(const FileDescriptor* file) {
+ return true;
+}
+
+// Which level of UTF-8 enforcemant is placed on this file.
+Utf8CheckMode GetUtf8CheckMode(const FieldDescriptor* field, bool is_lite) {
+ if (field->file()->syntax() == FileDescriptor::SYNTAX_PROTO3 &&
+ FieldEnforceUtf8(field)) {
+ return Utf8CheckMode::kStrict;
+ } else if (!is_lite && FileUtf8Verification(field->file())) {
+ return Utf8CheckMode::kVerify;
+ } else {
+ return Utf8CheckMode::kNone;
+ }
+}
+
+} // namespace cpp
} // namespace internal
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/descriptor.h b/src/google/protobuf/descriptor.h
index 1b8728e..5a8b5f3 100644
--- a/src/google/protobuf/descriptor.h
+++ b/src/google/protobuf/descriptor.h
@@ -54,27 +54,26 @@
#ifndef GOOGLE_PROTOBUF_DESCRIPTOR_H__
#define GOOGLE_PROTOBUF_DESCRIPTOR_H__
-
#include <atomic>
+#include <cstdint>
+#include <iterator>
#include <map>
#include <memory>
#include <set>
#include <string>
#include <vector>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/mutex.h>
-#include <google/protobuf/stubs/once.h>
-#include <google/protobuf/port.h>
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/port.h"
+#include "absl/base/call_once.h"
+#include "absl/strings/string_view.h"
+#include "absl/synchronization/mutex.h"
+#include "google/protobuf/port.h"
+
// Must be included last.
-#include <google/protobuf/port_def.inc>
-
-// TYPE_BOOL is defined in the MacOS's ConditionalMacros.h.
-#ifdef TYPE_BOOL
-#undef TYPE_BOOL
-#endif // TYPE_BOOL
+#include "google/protobuf/port_def.inc"
#ifdef SWIG
#define PROTOBUF_EXPORT
@@ -220,7 +219,7 @@
// build time if the symbol wasn't found and building of the file containing
// that type is delayed because lazily_build_dependencies_ is set on the pool.
// Should not be called after Set() has been called.
- void SetLazy(StringPiece name, const FileDescriptor* file);
+ void SetLazy(absl::string_view name, const FileDescriptor* file);
// Returns the current value of the descriptor, thread-safe. If SetLazy(...)
// has been called, will do a one-time cross link of the type specified,
@@ -235,7 +234,7 @@
const Descriptor* descriptor_;
// The once_ flag is followed by a NUL terminated string for the type name.
- internal::once_flag* once_;
+ absl::once_flag* once_;
};
class PROTOBUF_EXPORT SymbolBase {
@@ -261,6 +260,10 @@
class PROTOBUF_EXPORT Descriptor : private internal::SymbolBase {
public:
typedef DescriptorProto Proto;
+#ifndef SWIG
+ Descriptor(const Descriptor&) = delete;
+ Descriptor& operator=(const Descriptor&) = delete;
+#endif
// The name of the message type, not including its scope.
const std::string& name() const;
@@ -349,20 +352,20 @@
// exists.
const FieldDescriptor* FindFieldByNumber(int number) const;
// Looks up a field by name. Returns nullptr if no such field exists.
- const FieldDescriptor* FindFieldByName(ConstStringParam name) const;
+ const FieldDescriptor* FindFieldByName(absl::string_view name) const;
// Looks up a field by lowercased name (as returned by lowercase_name()).
// This lookup may be ambiguous if multiple field names differ only by case,
// in which case the field returned is chosen arbitrarily from the matches.
const FieldDescriptor* FindFieldByLowercaseName(
- ConstStringParam lowercase_name) const;
+ absl::string_view lowercase_name) const;
// Looks up a field by camel-case name (as returned by camelcase_name()).
// This lookup may be ambiguous if multiple field names differ in a way that
// leads them to have identical camel-case names, in which case the field
// returned is chosen arbitrarily from the matches.
const FieldDescriptor* FindFieldByCamelcaseName(
- ConstStringParam camelcase_name) const;
+ absl::string_view camelcase_name) const;
// The number of oneofs in this message type.
int oneof_decl_count() const;
@@ -375,7 +378,7 @@
const OneofDescriptor* oneof_decl(int index) const;
// Looks up a oneof by name. Returns nullptr if no such oneof exists.
- const OneofDescriptor* FindOneofByName(ConstStringParam name) const;
+ const OneofDescriptor* FindOneofByName(absl::string_view name) const;
// Nested type stuff -----------------------------------------------
@@ -387,7 +390,7 @@
// Looks up a nested type by name. Returns nullptr if no such nested type
// exists.
- const Descriptor* FindNestedTypeByName(ConstStringParam name) const;
+ const Descriptor* FindNestedTypeByName(absl::string_view name) const;
// Enum stuff ------------------------------------------------------
@@ -399,11 +402,11 @@
// Looks up an enum type by name. Returns nullptr if no such enum type
// exists.
- const EnumDescriptor* FindEnumTypeByName(ConstStringParam name) const;
+ const EnumDescriptor* FindEnumTypeByName(absl::string_view name) const;
// Looks up an enum value by name, among all enum types in this message.
// Returns nullptr if no such value exists.
- const EnumValueDescriptor* FindEnumValueByName(ConstStringParam name) const;
+ const EnumValueDescriptor* FindEnumValueByName(absl::string_view name) const;
// Extensions ------------------------------------------------------
@@ -467,17 +470,17 @@
// Looks up a named extension (which extends some *other* message type)
// defined within this message type's scope.
- const FieldDescriptor* FindExtensionByName(ConstStringParam name) const;
+ const FieldDescriptor* FindExtensionByName(absl::string_view name) const;
// Similar to FindFieldByLowercaseName(), but finds extensions defined within
// this message type's scope.
const FieldDescriptor* FindExtensionByLowercaseName(
- ConstStringParam name) const;
+ absl::string_view name) const;
// Similar to FindFieldByCamelcaseName(), but finds extensions defined within
// this message type's scope.
const FieldDescriptor* FindExtensionByCamelcaseName(
- ConstStringParam name) const;
+ absl::string_view name) const;
// Reserved fields -------------------------------------------------
@@ -507,7 +510,7 @@
const std::string& reserved_name(int index) const;
// Returns true if the field name is reserved.
- bool IsReservedName(ConstStringParam name) const;
+ bool IsReservedName(absl::string_view name) const;
// Source Location ---------------------------------------------------
@@ -609,7 +612,6 @@
friend class OneofDescriptor;
friend class MethodDescriptor;
friend class FileDescriptor;
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Descriptor);
};
PROTOBUF_INTERNAL_CHECK_CLASS_SIZE(Descriptor, 136);
@@ -628,6 +630,11 @@
public:
typedef FieldDescriptorProto Proto;
+#ifndef SWIG
+ FieldDescriptor(const FieldDescriptor&) = delete;
+ FieldDescriptor& operator=(const FieldDescriptor&) = delete;
+#endif
+
// Identifies a field type. 0 is reserved for errors. The order is weird
// for historical reasons. Types 12 and up are new in proto2.
enum Type {
@@ -754,6 +761,10 @@
// Reflection::HasField() is semantically meaningful.
bool has_presence() const;
+ // Returns true if this TYPE_STRING-typed field requires UTF-8 validation on
+ // parse.
+ bool requires_utf8_validation() const;
+
// Index of this field within the message's field array, or the file or
// extension scope's extensions array.
int index() const;
@@ -896,7 +907,7 @@
// formats the default value appropriately and returns it as a string.
// Must have a default value to call this. If quote_string_type is true, then
- // types of CPPTYPE_STRING whill be surrounded by quotes and CEscaped.
+ // types of CPPTYPE_STRING will be surrounded by quotes and CEscaped.
std::string DefaultValueAsString(bool quote_string_type) const;
// Helper function that returns the field type name for DebugString.
@@ -941,7 +952,7 @@
// The once_flag is followed by a NUL terminated string for the type name and
// enum default value (or empty string if no default enum).
- internal::once_flag* type_once_;
+ absl::once_flag* type_once_;
static void TypeOnceInit(const FieldDescriptor* to_init);
void InternalTypeOnceInit() const;
const Descriptor* containing_type_;
@@ -986,7 +997,6 @@
friend class FileDescriptor;
friend class Descriptor;
friend class OneofDescriptor;
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FieldDescriptor);
};
PROTOBUF_INTERNAL_CHECK_CLASS_SIZE(FieldDescriptor, 72);
@@ -996,6 +1006,11 @@
public:
typedef OneofDescriptorProto Proto;
+#ifndef SWIG
+ OneofDescriptor(const OneofDescriptor&) = delete;
+ OneofDescriptor& operator=(const OneofDescriptor&) = delete;
+#endif
+
const std::string& name() const; // Name of this oneof.
const std::string& full_name() const; // Fully-qualified name of the oneof.
@@ -1067,7 +1082,6 @@
OneofDescriptor() {}
friend class DescriptorBuilder;
friend class Descriptor;
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(OneofDescriptor);
};
PROTOBUF_INTERNAL_CHECK_CLASS_SIZE(OneofDescriptor, 40);
@@ -1079,6 +1093,11 @@
public:
typedef EnumDescriptorProto Proto;
+#ifndef SWIG
+ EnumDescriptor(const EnumDescriptor&) = delete;
+ EnumDescriptor& operator=(const EnumDescriptor&) = delete;
+#endif
+
// The name of this enum type in the containing scope.
const std::string& name() const;
@@ -1099,7 +1118,7 @@
const EnumValueDescriptor* value(int index) const;
// Looks up a value by name. Returns nullptr if no such value exists.
- const EnumValueDescriptor* FindValueByName(ConstStringParam name) const;
+ const EnumValueDescriptor* FindValueByName(absl::string_view name) const;
// Looks up a value by number. Returns nullptr if no such value exists. If
// multiple values have this number, the first one defined is returned.
const EnumValueDescriptor* FindValueByNumber(int number) const;
@@ -1128,6 +1147,13 @@
// with AllowUnknownDependencies() set.
bool is_placeholder() const;
+ // Returns true whether this is a "closed" enum, meaning that it:
+ // - Has a fixed set of named values.
+ // - Encountering values not in this set causes them to be treated as unknown
+ // fields.
+ // - The first value (i.e., the default) may be nonzero.
+ bool is_closed() const;
+
// Reserved fields -------------------------------------------------
// A range of reserved field numbers.
@@ -1157,7 +1183,7 @@
const std::string& reserved_name(int index) const;
// Returns true if the field name is reserved.
- bool IsReservedName(ConstStringParam name) const;
+ bool IsReservedName(absl::string_view name) const;
// Source Location ---------------------------------------------------
@@ -1238,7 +1264,6 @@
friend class FileDescriptor;
friend class DescriptorPool;
friend class Reflection;
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumDescriptor);
};
PROTOBUF_INTERNAL_CHECK_CLASS_SIZE(EnumDescriptor, 72);
@@ -1253,6 +1278,11 @@
public:
typedef EnumValueDescriptorProto Proto;
+#ifndef SWIG
+ EnumValueDescriptor(const EnumValueDescriptor&) = delete;
+ EnumValueDescriptor& operator=(const EnumValueDescriptor&) = delete;
+#endif
+
const std::string& name() const; // Name of this enum constant.
int index() const; // Index within the enums's Descriptor.
int number() const; // Numeric value of this enum constant.
@@ -1323,7 +1353,6 @@
friend class DescriptorPool;
friend class FileDescriptorTables;
friend class Reflection;
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumValueDescriptor);
};
PROTOBUF_INTERNAL_CHECK_CLASS_SIZE(EnumValueDescriptor, 32);
@@ -1334,6 +1363,11 @@
public:
typedef ServiceDescriptorProto Proto;
+#ifndef SWIG
+ ServiceDescriptor(const ServiceDescriptor&) = delete;
+ ServiceDescriptor& operator=(const ServiceDescriptor&) = delete;
+#endif
+
// The name of the service, not including its containing scope.
const std::string& name() const;
// The fully-qualified name of the service, scope delimited by periods.
@@ -1357,7 +1391,7 @@
const MethodDescriptor* method(int index) const;
// Look up a MethodDescriptor by name.
- const MethodDescriptor* FindMethodByName(ConstStringParam name) const;
+ const MethodDescriptor* FindMethodByName(absl::string_view name) const;
// See Descriptor::CopyTo().
void CopyTo(ServiceDescriptorProto* proto) const;
@@ -1406,7 +1440,6 @@
friend class DescriptorBuilder;
friend class FileDescriptor;
friend class MethodDescriptor;
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ServiceDescriptor);
};
PROTOBUF_INTERNAL_CHECK_CLASS_SIZE(ServiceDescriptor, 48);
@@ -1419,6 +1452,11 @@
public:
typedef MethodDescriptorProto Proto;
+#ifndef SWIG
+ MethodDescriptor(const MethodDescriptor&) = delete;
+ MethodDescriptor& operator=(const MethodDescriptor&) = delete;
+#endif
+
// Name of this method, not including containing scope.
const std::string& name() const;
// The fully-qualified name of the method, scope delimited by periods.
@@ -1495,7 +1533,6 @@
MethodDescriptor() {}
friend class DescriptorBuilder;
friend class ServiceDescriptor;
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MethodDescriptor);
};
PROTOBUF_INTERNAL_CHECK_CLASS_SIZE(MethodDescriptor, 64);
@@ -1507,6 +1544,11 @@
public:
typedef FileDescriptorProto Proto;
+#ifndef SWIG
+ FileDescriptor(const FileDescriptor&) = delete;
+ FileDescriptor& operator=(const FileDescriptor&) = delete;
+#endif
+
// The filename, relative to the source tree.
// e.g. "foo/bar/baz.proto"
const std::string& name() const;
@@ -1574,7 +1616,11 @@
const FileOptions& options() const;
// Syntax of this file.
- enum Syntax {
+ enum Syntax
+#ifndef SWIG
+ : int
+#endif // !SWIG
+ {
SYNTAX_UNKNOWN = 0,
SYNTAX_PROTO2 = 2,
SYNTAX_PROTO3 = 3,
@@ -1584,25 +1630,25 @@
// Find a top-level message type by name (not full_name). Returns nullptr if
// not found.
- const Descriptor* FindMessageTypeByName(ConstStringParam name) const;
+ const Descriptor* FindMessageTypeByName(absl::string_view name) const;
// Find a top-level enum type by name. Returns nullptr if not found.
- const EnumDescriptor* FindEnumTypeByName(ConstStringParam name) const;
+ const EnumDescriptor* FindEnumTypeByName(absl::string_view name) const;
// Find an enum value defined in any top-level enum by name. Returns nullptr
// if not found.
- const EnumValueDescriptor* FindEnumValueByName(ConstStringParam name) const;
+ const EnumValueDescriptor* FindEnumValueByName(absl::string_view name) const;
// Find a service definition by name. Returns nullptr if not found.
- const ServiceDescriptor* FindServiceByName(ConstStringParam name) const;
+ const ServiceDescriptor* FindServiceByName(absl::string_view name) const;
// Find a top-level extension definition by name. Returns nullptr if not
// found.
- const FieldDescriptor* FindExtensionByName(ConstStringParam name) const;
+ const FieldDescriptor* FindExtensionByName(absl::string_view name) const;
// Similar to FindExtensionByName(), but searches by lowercased-name. See
// Descriptor::FindFieldByLowercaseName().
const FieldDescriptor* FindExtensionByLowercaseName(
- ConstStringParam name) const;
+ absl::string_view name) const;
// Similar to FindExtensionByName(), but searches by camelcased-name. See
// Descriptor::FindFieldByCamelcaseName().
const FieldDescriptor* FindExtensionByCamelcaseName(
- ConstStringParam name) const;
+ absl::string_view name) const;
// See Descriptor::CopyTo().
// Notes:
@@ -1615,6 +1661,9 @@
// Fill the json_name field of FieldDescriptorProto for all fields. Can only
// be called after CopyTo().
void CopyJsonNameTo(FileDescriptorProto* proto) const;
+ // Fills in the file-level settings of this file (e.g. syntax, package,
+ // file options) to `proto`.
+ void CopyHeadingTo(FileDescriptorProto* proto) const;
// See Descriptor::DebugString().
std::string DebugString() const;
@@ -1660,7 +1709,7 @@
// dependencies_once_ contain a once_flag followed by N NUL terminated
// strings. Dependencies that do not need to be loaded will be empty. ie just
// {'\0'}
- internal::once_flag* dependencies_once_;
+ absl::once_flag* dependencies_once_;
static void DependenciesOnceInit(const FileDescriptor* to_init);
void InternalDependenciesOnceInit() const;
@@ -1699,10 +1748,9 @@
friend class EnumValueDescriptor;
friend class MethodDescriptor;
friend class ServiceDescriptor;
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FileDescriptor);
};
-PROTOBUF_INTERNAL_CHECK_CLASS_SIZE(FileDescriptor, 144);
+PROTOBUF_INTERNAL_CHECK_CLASS_SIZE(FileDescriptor, 152);
// ===================================================================
@@ -1762,6 +1810,10 @@
explicit DescriptorPool(DescriptorDatabase* fallback_database,
ErrorCollector* error_collector = nullptr);
+#ifndef SWIG
+ DescriptorPool(const DescriptorPool&) = delete;
+ DescriptorPool& operator=(const DescriptorPool&) = delete;
+#endif
~DescriptorPool();
// Get a pointer to the generated pool. Generated protocol message classes
@@ -1772,28 +1824,28 @@
// Find a FileDescriptor in the pool by file name. Returns nullptr if not
// found.
- const FileDescriptor* FindFileByName(ConstStringParam name) const;
+ const FileDescriptor* FindFileByName(absl::string_view name) const;
// Find the FileDescriptor in the pool which defines the given symbol.
// If any of the Find*ByName() methods below would succeed, then this is
// equivalent to calling that method and calling the result's file() method.
// Otherwise this returns nullptr.
const FileDescriptor* FindFileContainingSymbol(
- ConstStringParam symbol_name) const;
+ absl::string_view symbol_name) const;
// Looking up descriptors ------------------------------------------
// These find descriptors by fully-qualified name. These will find both
// top-level descriptors and nested descriptors. They return nullptr if not
// found.
- const Descriptor* FindMessageTypeByName(ConstStringParam name) const;
- const FieldDescriptor* FindFieldByName(ConstStringParam name) const;
- const FieldDescriptor* FindExtensionByName(ConstStringParam name) const;
- const OneofDescriptor* FindOneofByName(ConstStringParam name) const;
- const EnumDescriptor* FindEnumTypeByName(ConstStringParam name) const;
- const EnumValueDescriptor* FindEnumValueByName(ConstStringParam name) const;
- const ServiceDescriptor* FindServiceByName(ConstStringParam name) const;
- const MethodDescriptor* FindMethodByName(ConstStringParam name) const;
+ const Descriptor* FindMessageTypeByName(absl::string_view name) const;
+ const FieldDescriptor* FindFieldByName(absl::string_view name) const;
+ const FieldDescriptor* FindExtensionByName(absl::string_view name) const;
+ const OneofDescriptor* FindOneofByName(absl::string_view name) const;
+ const EnumDescriptor* FindEnumTypeByName(absl::string_view name) const;
+ const EnumValueDescriptor* FindEnumValueByName(absl::string_view name) const;
+ const ServiceDescriptor* FindServiceByName(absl::string_view name) const;
+ const MethodDescriptor* FindMethodByName(absl::string_view name) const;
// Finds an extension of the given type by number. The extendee must be
// a member of this DescriptorPool or one of its underlays.
@@ -1806,7 +1858,7 @@
// or one of its underlays. Returns nullptr if there is no known message
// extension with the given printable name.
const FieldDescriptor* FindExtensionByPrintableName(
- const Descriptor* extendee, ConstStringParam printable_name) const;
+ const Descriptor* extendee, absl::string_view printable_name) const;
// Finds extensions of extendee. The extensions will be appended to
// out in an undefined order. Only extensions defined directly in
@@ -1824,6 +1876,10 @@
class PROTOBUF_EXPORT ErrorCollector {
public:
inline ErrorCollector() {}
+#ifndef SWIG
+ ErrorCollector(const ErrorCollector&) = delete;
+ ErrorCollector& operator=(const ErrorCollector&) = delete;
+#endif
virtual ~ErrorCollector();
// These constants specify what exact part of the construct is broken.
@@ -1864,9 +1920,6 @@
ErrorLocation /*location*/, // One of the location constants, above.
const std::string& /*message*/ // Human-readable error message.
) {}
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ErrorCollector);
};
// Convert the FileDescriptorProto to real descriptors and place them in
@@ -1979,11 +2032,11 @@
// For internal (unit test) use only: Returns true if a FileDescriptor has
// been constructed for the given file, false otherwise. Useful for testing
// lazy descriptor initialization behavior.
- bool InternalIsFileLoaded(ConstStringParam filename) const;
+ bool InternalIsFileLoaded(absl::string_view filename) const;
// Add a file to unused_import_track_files_. DescriptorBuilder will log
// warnings or errors for those files if there is any unused import.
- void AddUnusedImportTrackFile(ConstStringParam file_name,
+ void AddUnusedImportTrackFile(absl::string_view file_name,
bool is_error = false);
void ClearUnusedImportTrackFiles();
@@ -2001,14 +2054,14 @@
// Return true if the given name is a sub-symbol of any non-package
// descriptor that already exists in the descriptor pool. (The full
// definition of such types is already known.)
- bool IsSubSymbolOfBuiltType(StringPiece name) const;
+ bool IsSubSymbolOfBuiltType(absl::string_view name) const;
// Tries to find something in the fallback database and link in the
// corresponding proto file. Returns true if successful, in which case
// the caller should search for the thing again. These are declared
// const because they are called by (semantically) const methods.
- bool TryFindFileInFallbackDatabase(StringPiece name) const;
- bool TryFindSymbolInFallbackDatabase(StringPiece name) const;
+ bool TryFindFileInFallbackDatabase(absl::string_view name) const;
+ bool TryFindSymbolInFallbackDatabase(absl::string_view name) const;
bool TryFindExtensionInFallbackDatabase(const Descriptor* containing_type,
int field_number) const;
@@ -2029,13 +2082,13 @@
// symbol is defined if necessary. Will create a placeholder if the type
// doesn't exist in the fallback database, or the file doesn't build
// successfully.
- Symbol CrossLinkOnDemandHelper(StringPiece name,
+ Symbol CrossLinkOnDemandHelper(absl::string_view name,
bool expecting_enum) const;
// Create a placeholder FileDescriptor of the specified name
- FileDescriptor* NewPlaceholderFile(StringPiece name) const;
+ FileDescriptor* NewPlaceholderFile(absl::string_view name) const;
FileDescriptor* NewPlaceholderFileWithMutexHeld(
- StringPiece name, internal::FlatAllocator& alloc) const;
+ absl::string_view name, internal::FlatAllocator& alloc) const;
enum PlaceholderType {
PLACEHOLDER_MESSAGE,
@@ -2043,14 +2096,14 @@
PLACEHOLDER_EXTENDABLE_MESSAGE
};
// Create a placeholder Descriptor of the specified name
- Symbol NewPlaceholder(StringPiece name,
+ Symbol NewPlaceholder(absl::string_view name,
PlaceholderType placeholder_type) const;
- Symbol NewPlaceholderWithMutexHeld(StringPiece name,
+ Symbol NewPlaceholderWithMutexHeld(absl::string_view name,
PlaceholderType placeholder_type) const;
// If fallback_database_ is nullptr, this is nullptr. Otherwise, this is a
// mutex which must be locked while accessing tables_.
- internal::WrappedMutex* mutex_;
+ absl::Mutex* mutex_;
// See constructor.
DescriptorDatabase* fallback_database_;
@@ -2071,8 +2124,6 @@
// Set of files to track for unused imports. The bool value when true means
// unused imports are treated as errors (and as warnings when false).
std::map<std::string, bool> unused_import_track_files_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DescriptorPool);
};
@@ -2163,6 +2214,10 @@
const EnumDescriptor::ReservedRange*)
PROTOBUF_DEFINE_ACCESSOR(EnumDescriptor, reserved_name_count, int)
+inline bool EnumDescriptor::is_closed() const {
+ return file()->syntax() != FileDescriptor::SYNTAX_PROTO3;
+}
+
PROTOBUF_DEFINE_NAME_ACCESSOR(EnumValueDescriptor)
PROTOBUF_DEFINE_ACCESSOR(EnumValueDescriptor, number, int)
PROTOBUF_DEFINE_ACCESSOR(EnumValueDescriptor, type, const EnumDescriptor*)
@@ -2219,9 +2274,9 @@
return FindReservedRangeContainingNumber(number) != nullptr;
}
-inline bool Descriptor::IsReservedName(ConstStringParam name) const {
+inline bool Descriptor::IsReservedName(absl::string_view name) const {
for (int i = 0; i < reserved_name_count(); i++) {
- if (name == static_cast<ConstStringParam>(reserved_name(i))) {
+ if (name == static_cast<absl::string_view>(reserved_name(i))) {
return true;
}
}
@@ -2238,9 +2293,9 @@
return FindReservedRangeContainingNumber(number) != nullptr;
}
-inline bool EnumDescriptor::IsReservedName(ConstStringParam name) const {
+inline bool EnumDescriptor::IsReservedName(absl::string_view name) const {
for (int i = 0; i < reserved_name_count(); i++) {
- if (name == static_cast<ConstStringParam>(reserved_name(i))) {
+ if (name == static_cast<absl::string_view>(reserved_name(i))) {
return true;
}
}
@@ -2285,7 +2340,7 @@
inline FieldDescriptor::Type FieldDescriptor::type() const {
if (type_once_) {
- internal::call_once(*type_once_, &FieldDescriptor::TypeOnceInit, this);
+ absl::call_once(*type_once_, &FieldDescriptor::TypeOnceInit, this);
}
return static_cast<Type>(type_);
}
@@ -2327,6 +2382,11 @@
file()->syntax() == FileDescriptor::SYNTAX_PROTO2;
}
+inline bool FieldDescriptor::requires_utf8_validation() const {
+ return type() == TYPE_STRING &&
+ file()->syntax() == FileDescriptor::SYNTAX_PROTO3;
+}
+
// To save space, index() is computed by looking at the descriptor's position
// in the parent's array of children.
inline int FieldDescriptor::index() const {
@@ -2431,10 +2491,79 @@
return static_cast<Syntax>(syntax_);
}
+namespace internal {
+
+// FieldRange(desc) provides an iterable range for the fields of a
+// descriptor type, appropriate for range-for loops.
+
+template <typename T>
+struct FieldRangeImpl;
+
+template <typename T>
+FieldRangeImpl<T> FieldRange(const T* desc) {
+ return {desc};
+}
+
+template <typename T>
+struct FieldRangeImpl {
+ struct Iterator {
+ using iterator_category = std::forward_iterator_tag;
+ using value_type = const FieldDescriptor*;
+ using difference_type = int;
+
+ value_type operator*() { return descriptor->field(idx); }
+
+ friend bool operator==(const Iterator& a, const Iterator& b) {
+ GOOGLE_DCHECK(a.descriptor == b.descriptor);
+ return a.idx == b.idx;
+ }
+ friend bool operator!=(const Iterator& a, const Iterator& b) {
+ return !(a == b);
+ }
+
+ Iterator& operator++() {
+ idx++;
+ return *this;
+ }
+
+ int idx;
+ const T* descriptor;
+ };
+
+ Iterator begin() const { return {0, descriptor}; }
+ Iterator end() const { return {descriptor->field_count(), descriptor}; }
+
+ const T* descriptor;
+};
+
+// The context for these functions under `cpp` is "for the C++ implementation".
+// In particular, questions like "does this field have a has bit?" have a
+// different answer depending on the language.
+namespace cpp {
+// Returns true if 'enum' semantics are such that unknown values are preserved
+// in the enum field itself, rather than going to the UnknownFieldSet.
+PROTOBUF_EXPORT bool HasPreservingUnknownEnumSemantics(
+ const FieldDescriptor* field);
+
+PROTOBUF_EXPORT bool HasHasbit(const FieldDescriptor* field);
+
+#ifndef SWIG
+enum class Utf8CheckMode {
+ kStrict = 0, // Parsing will fail if non UTF-8 data is in string fields.
+ kVerify = 1, // Only log an error but parsing will succeed.
+ kNone = 2, // No UTF-8 check.
+};
+PROTOBUF_EXPORT Utf8CheckMode GetUtf8CheckMode(const FieldDescriptor* field,
+ bool is_lite);
+#endif // !SWIG
+
+} // namespace cpp
+} // namespace internal
+
} // namespace protobuf
} // namespace google
#undef PROTOBUF_INTERNAL_CHECK_CLASS_SIZE
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_DESCRIPTOR_H__
diff --git a/src/google/protobuf/descriptor.pb.cc b/src/google/protobuf/descriptor.pb.cc
index d3bfb46..7d17e6b 100644
--- a/src/google/protobuf/descriptor.pb.cc
+++ b/src/google/protobuf/descriptor.pb.cc
@@ -1,39 +1,38 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: google/protobuf/descriptor.proto
-#include <google/protobuf/descriptor.pb.h>
+#include "google/protobuf/descriptor.pb.h"
#include <algorithm>
-
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/extension_set.h>
-#include <google/protobuf/wire_format_lite.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/generated_message_reflection.h>
-#include <google/protobuf/reflection_ops.h>
-#include <google/protobuf/wire_format.h>
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/extension_set.h"
+#include "google/protobuf/wire_format_lite.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/generated_message_reflection.h"
+#include "google/protobuf/reflection_ops.h"
+#include "google/protobuf/wire_format.h"
// @@protoc_insertion_point(includes)
-#include <google/protobuf/port_def.inc>
+// Must be included last.
+#include "google/protobuf/port_def.inc"
PROTOBUF_PRAGMA_INIT_SEG
-
namespace _pb = ::PROTOBUF_NAMESPACE_ID;
-namespace _pbi = _pb::internal;
-
+namespace _pbi = ::PROTOBUF_NAMESPACE_ID::internal;
PROTOBUF_NAMESPACE_OPEN
PROTOBUF_CONSTEXPR FileDescriptorSet::FileDescriptorSet(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_.file_)*/{}
, /*decltype(_impl_._cached_size_)*/{}} {}
struct FileDescriptorSetDefaultTypeInternal {
- PROTOBUF_CONSTEXPR FileDescriptorSetDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR FileDescriptorSetDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~FileDescriptorSetDefaultTypeInternal() {}
union {
FileDescriptorSet _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 FileDescriptorSetDefaultTypeInternal _FileDescriptorSet_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 FileDescriptorSetDefaultTypeInternal _FileDescriptorSet_default_instance_;
PROTOBUF_CONSTEXPR FileDescriptorProto::FileDescriptorProto(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_._has_bits_)*/{}
@@ -48,17 +47,19 @@
, /*decltype(_impl_.name_)*/{&::_pbi::fixed_address_empty_string, ::_pbi::ConstantInitialized{}}
, /*decltype(_impl_.package_)*/{&::_pbi::fixed_address_empty_string, ::_pbi::ConstantInitialized{}}
, /*decltype(_impl_.syntax_)*/{&::_pbi::fixed_address_empty_string, ::_pbi::ConstantInitialized{}}
+ , /*decltype(_impl_.edition_)*/{&::_pbi::fixed_address_empty_string, ::_pbi::ConstantInitialized{}}
, /*decltype(_impl_.options_)*/nullptr
, /*decltype(_impl_.source_code_info_)*/nullptr} {}
struct FileDescriptorProtoDefaultTypeInternal {
- PROTOBUF_CONSTEXPR FileDescriptorProtoDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR FileDescriptorProtoDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~FileDescriptorProtoDefaultTypeInternal() {}
union {
FileDescriptorProto _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 FileDescriptorProtoDefaultTypeInternal _FileDescriptorProto_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 FileDescriptorProtoDefaultTypeInternal _FileDescriptorProto_default_instance_;
PROTOBUF_CONSTEXPR DescriptorProto_ExtensionRange::DescriptorProto_ExtensionRange(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_._has_bits_)*/{}
@@ -67,14 +68,15 @@
, /*decltype(_impl_.start_)*/0
, /*decltype(_impl_.end_)*/0} {}
struct DescriptorProto_ExtensionRangeDefaultTypeInternal {
- PROTOBUF_CONSTEXPR DescriptorProto_ExtensionRangeDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR DescriptorProto_ExtensionRangeDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~DescriptorProto_ExtensionRangeDefaultTypeInternal() {}
union {
DescriptorProto_ExtensionRange _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 DescriptorProto_ExtensionRangeDefaultTypeInternal _DescriptorProto_ExtensionRange_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 DescriptorProto_ExtensionRangeDefaultTypeInternal _DescriptorProto_ExtensionRange_default_instance_;
PROTOBUF_CONSTEXPR DescriptorProto_ReservedRange::DescriptorProto_ReservedRange(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_._has_bits_)*/{}
@@ -82,14 +84,15 @@
, /*decltype(_impl_.start_)*/0
, /*decltype(_impl_.end_)*/0} {}
struct DescriptorProto_ReservedRangeDefaultTypeInternal {
- PROTOBUF_CONSTEXPR DescriptorProto_ReservedRangeDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR DescriptorProto_ReservedRangeDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~DescriptorProto_ReservedRangeDefaultTypeInternal() {}
union {
DescriptorProto_ReservedRange _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 DescriptorProto_ReservedRangeDefaultTypeInternal _DescriptorProto_ReservedRange_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 DescriptorProto_ReservedRangeDefaultTypeInternal _DescriptorProto_ReservedRange_default_instance_;
PROTOBUF_CONSTEXPR DescriptorProto::DescriptorProto(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_._has_bits_)*/{}
@@ -105,28 +108,30 @@
, /*decltype(_impl_.name_)*/{&::_pbi::fixed_address_empty_string, ::_pbi::ConstantInitialized{}}
, /*decltype(_impl_.options_)*/nullptr} {}
struct DescriptorProtoDefaultTypeInternal {
- PROTOBUF_CONSTEXPR DescriptorProtoDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR DescriptorProtoDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~DescriptorProtoDefaultTypeInternal() {}
union {
DescriptorProto _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 DescriptorProtoDefaultTypeInternal _DescriptorProto_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 DescriptorProtoDefaultTypeInternal _DescriptorProto_default_instance_;
PROTOBUF_CONSTEXPR ExtensionRangeOptions::ExtensionRangeOptions(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_._extensions_)*/{}
, /*decltype(_impl_.uninterpreted_option_)*/{}
, /*decltype(_impl_._cached_size_)*/{}} {}
struct ExtensionRangeOptionsDefaultTypeInternal {
- PROTOBUF_CONSTEXPR ExtensionRangeOptionsDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR ExtensionRangeOptionsDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~ExtensionRangeOptionsDefaultTypeInternal() {}
union {
ExtensionRangeOptions _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 ExtensionRangeOptionsDefaultTypeInternal _ExtensionRangeOptions_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 ExtensionRangeOptionsDefaultTypeInternal _ExtensionRangeOptions_default_instance_;
PROTOBUF_CONSTEXPR FieldDescriptorProto::FieldDescriptorProto(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_._has_bits_)*/{}
@@ -143,14 +148,15 @@
, /*decltype(_impl_.label_)*/1
, /*decltype(_impl_.type_)*/1} {}
struct FieldDescriptorProtoDefaultTypeInternal {
- PROTOBUF_CONSTEXPR FieldDescriptorProtoDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR FieldDescriptorProtoDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~FieldDescriptorProtoDefaultTypeInternal() {}
union {
FieldDescriptorProto _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 FieldDescriptorProtoDefaultTypeInternal _FieldDescriptorProto_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 FieldDescriptorProtoDefaultTypeInternal _FieldDescriptorProto_default_instance_;
PROTOBUF_CONSTEXPR OneofDescriptorProto::OneofDescriptorProto(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_._has_bits_)*/{}
@@ -158,14 +164,15 @@
, /*decltype(_impl_.name_)*/{&::_pbi::fixed_address_empty_string, ::_pbi::ConstantInitialized{}}
, /*decltype(_impl_.options_)*/nullptr} {}
struct OneofDescriptorProtoDefaultTypeInternal {
- PROTOBUF_CONSTEXPR OneofDescriptorProtoDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR OneofDescriptorProtoDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~OneofDescriptorProtoDefaultTypeInternal() {}
union {
OneofDescriptorProto _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 OneofDescriptorProtoDefaultTypeInternal _OneofDescriptorProto_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 OneofDescriptorProtoDefaultTypeInternal _OneofDescriptorProto_default_instance_;
PROTOBUF_CONSTEXPR EnumDescriptorProto_EnumReservedRange::EnumDescriptorProto_EnumReservedRange(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_._has_bits_)*/{}
@@ -173,14 +180,15 @@
, /*decltype(_impl_.start_)*/0
, /*decltype(_impl_.end_)*/0} {}
struct EnumDescriptorProto_EnumReservedRangeDefaultTypeInternal {
- PROTOBUF_CONSTEXPR EnumDescriptorProto_EnumReservedRangeDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR EnumDescriptorProto_EnumReservedRangeDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~EnumDescriptorProto_EnumReservedRangeDefaultTypeInternal() {}
union {
EnumDescriptorProto_EnumReservedRange _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 EnumDescriptorProto_EnumReservedRangeDefaultTypeInternal _EnumDescriptorProto_EnumReservedRange_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 EnumDescriptorProto_EnumReservedRangeDefaultTypeInternal _EnumDescriptorProto_EnumReservedRange_default_instance_;
PROTOBUF_CONSTEXPR EnumDescriptorProto::EnumDescriptorProto(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_._has_bits_)*/{}
@@ -191,14 +199,15 @@
, /*decltype(_impl_.name_)*/{&::_pbi::fixed_address_empty_string, ::_pbi::ConstantInitialized{}}
, /*decltype(_impl_.options_)*/nullptr} {}
struct EnumDescriptorProtoDefaultTypeInternal {
- PROTOBUF_CONSTEXPR EnumDescriptorProtoDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR EnumDescriptorProtoDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~EnumDescriptorProtoDefaultTypeInternal() {}
union {
EnumDescriptorProto _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 EnumDescriptorProtoDefaultTypeInternal _EnumDescriptorProto_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 EnumDescriptorProtoDefaultTypeInternal _EnumDescriptorProto_default_instance_;
PROTOBUF_CONSTEXPR EnumValueDescriptorProto::EnumValueDescriptorProto(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_._has_bits_)*/{}
@@ -207,14 +216,15 @@
, /*decltype(_impl_.options_)*/nullptr
, /*decltype(_impl_.number_)*/0} {}
struct EnumValueDescriptorProtoDefaultTypeInternal {
- PROTOBUF_CONSTEXPR EnumValueDescriptorProtoDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR EnumValueDescriptorProtoDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~EnumValueDescriptorProtoDefaultTypeInternal() {}
union {
EnumValueDescriptorProto _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 EnumValueDescriptorProtoDefaultTypeInternal _EnumValueDescriptorProto_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 EnumValueDescriptorProtoDefaultTypeInternal _EnumValueDescriptorProto_default_instance_;
PROTOBUF_CONSTEXPR ServiceDescriptorProto::ServiceDescriptorProto(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_._has_bits_)*/{}
@@ -223,14 +233,15 @@
, /*decltype(_impl_.name_)*/{&::_pbi::fixed_address_empty_string, ::_pbi::ConstantInitialized{}}
, /*decltype(_impl_.options_)*/nullptr} {}
struct ServiceDescriptorProtoDefaultTypeInternal {
- PROTOBUF_CONSTEXPR ServiceDescriptorProtoDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR ServiceDescriptorProtoDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~ServiceDescriptorProtoDefaultTypeInternal() {}
union {
ServiceDescriptorProto _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 ServiceDescriptorProtoDefaultTypeInternal _ServiceDescriptorProto_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 ServiceDescriptorProtoDefaultTypeInternal _ServiceDescriptorProto_default_instance_;
PROTOBUF_CONSTEXPR MethodDescriptorProto::MethodDescriptorProto(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_._has_bits_)*/{}
@@ -242,14 +253,15 @@
, /*decltype(_impl_.client_streaming_)*/false
, /*decltype(_impl_.server_streaming_)*/false} {}
struct MethodDescriptorProtoDefaultTypeInternal {
- PROTOBUF_CONSTEXPR MethodDescriptorProtoDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR MethodDescriptorProtoDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~MethodDescriptorProtoDefaultTypeInternal() {}
union {
MethodDescriptorProto _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 MethodDescriptorProtoDefaultTypeInternal _MethodDescriptorProto_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 MethodDescriptorProtoDefaultTypeInternal _MethodDescriptorProto_default_instance_;
PROTOBUF_CONSTEXPR FileOptions::FileOptions(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_._extensions_)*/{}
@@ -277,14 +289,15 @@
, /*decltype(_impl_.optimize_for_)*/1
, /*decltype(_impl_.cc_enable_arenas_)*/true} {}
struct FileOptionsDefaultTypeInternal {
- PROTOBUF_CONSTEXPR FileOptionsDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR FileOptionsDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~FileOptionsDefaultTypeInternal() {}
union {
FileOptions _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 FileOptionsDefaultTypeInternal _FileOptions_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 FileOptionsDefaultTypeInternal _FileOptions_default_instance_;
PROTOBUF_CONSTEXPR MessageOptions::MessageOptions(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_._extensions_)*/{}
@@ -296,14 +309,15 @@
, /*decltype(_impl_.deprecated_)*/false
, /*decltype(_impl_.map_entry_)*/false} {}
struct MessageOptionsDefaultTypeInternal {
- PROTOBUF_CONSTEXPR MessageOptionsDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR MessageOptionsDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~MessageOptionsDefaultTypeInternal() {}
union {
MessageOptions _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 MessageOptionsDefaultTypeInternal _MessageOptions_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 MessageOptionsDefaultTypeInternal _MessageOptions_default_instance_;
PROTOBUF_CONSTEXPR FieldOptions::FieldOptions(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_._extensions_)*/{}
@@ -318,28 +332,30 @@
, /*decltype(_impl_.deprecated_)*/false
, /*decltype(_impl_.weak_)*/false} {}
struct FieldOptionsDefaultTypeInternal {
- PROTOBUF_CONSTEXPR FieldOptionsDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR FieldOptionsDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~FieldOptionsDefaultTypeInternal() {}
union {
FieldOptions _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 FieldOptionsDefaultTypeInternal _FieldOptions_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 FieldOptionsDefaultTypeInternal _FieldOptions_default_instance_;
PROTOBUF_CONSTEXPR OneofOptions::OneofOptions(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_._extensions_)*/{}
, /*decltype(_impl_.uninterpreted_option_)*/{}
, /*decltype(_impl_._cached_size_)*/{}} {}
struct OneofOptionsDefaultTypeInternal {
- PROTOBUF_CONSTEXPR OneofOptionsDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR OneofOptionsDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~OneofOptionsDefaultTypeInternal() {}
union {
OneofOptions _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 OneofOptionsDefaultTypeInternal _OneofOptions_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 OneofOptionsDefaultTypeInternal _OneofOptions_default_instance_;
PROTOBUF_CONSTEXPR EnumOptions::EnumOptions(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_._extensions_)*/{}
@@ -349,14 +365,15 @@
, /*decltype(_impl_.allow_alias_)*/false
, /*decltype(_impl_.deprecated_)*/false} {}
struct EnumOptionsDefaultTypeInternal {
- PROTOBUF_CONSTEXPR EnumOptionsDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR EnumOptionsDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~EnumOptionsDefaultTypeInternal() {}
union {
EnumOptions _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 EnumOptionsDefaultTypeInternal _EnumOptions_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 EnumOptionsDefaultTypeInternal _EnumOptions_default_instance_;
PROTOBUF_CONSTEXPR EnumValueOptions::EnumValueOptions(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_._extensions_)*/{}
@@ -365,14 +382,15 @@
, /*decltype(_impl_.uninterpreted_option_)*/{}
, /*decltype(_impl_.deprecated_)*/false} {}
struct EnumValueOptionsDefaultTypeInternal {
- PROTOBUF_CONSTEXPR EnumValueOptionsDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR EnumValueOptionsDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~EnumValueOptionsDefaultTypeInternal() {}
union {
EnumValueOptions _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 EnumValueOptionsDefaultTypeInternal _EnumValueOptions_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 EnumValueOptionsDefaultTypeInternal _EnumValueOptions_default_instance_;
PROTOBUF_CONSTEXPR ServiceOptions::ServiceOptions(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_._extensions_)*/{}
@@ -381,14 +399,15 @@
, /*decltype(_impl_.uninterpreted_option_)*/{}
, /*decltype(_impl_.deprecated_)*/false} {}
struct ServiceOptionsDefaultTypeInternal {
- PROTOBUF_CONSTEXPR ServiceOptionsDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR ServiceOptionsDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~ServiceOptionsDefaultTypeInternal() {}
union {
ServiceOptions _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 ServiceOptionsDefaultTypeInternal _ServiceOptions_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 ServiceOptionsDefaultTypeInternal _ServiceOptions_default_instance_;
PROTOBUF_CONSTEXPR MethodOptions::MethodOptions(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_._extensions_)*/{}
@@ -398,14 +417,15 @@
, /*decltype(_impl_.deprecated_)*/false
, /*decltype(_impl_.idempotency_level_)*/0} {}
struct MethodOptionsDefaultTypeInternal {
- PROTOBUF_CONSTEXPR MethodOptionsDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR MethodOptionsDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~MethodOptionsDefaultTypeInternal() {}
union {
MethodOptions _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 MethodOptionsDefaultTypeInternal _MethodOptions_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 MethodOptionsDefaultTypeInternal _MethodOptions_default_instance_;
PROTOBUF_CONSTEXPR UninterpretedOption_NamePart::UninterpretedOption_NamePart(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_._has_bits_)*/{}
@@ -413,14 +433,15 @@
, /*decltype(_impl_.name_part_)*/{&::_pbi::fixed_address_empty_string, ::_pbi::ConstantInitialized{}}
, /*decltype(_impl_.is_extension_)*/false} {}
struct UninterpretedOption_NamePartDefaultTypeInternal {
- PROTOBUF_CONSTEXPR UninterpretedOption_NamePartDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR UninterpretedOption_NamePartDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~UninterpretedOption_NamePartDefaultTypeInternal() {}
union {
UninterpretedOption_NamePart _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 UninterpretedOption_NamePartDefaultTypeInternal _UninterpretedOption_NamePart_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 UninterpretedOption_NamePartDefaultTypeInternal _UninterpretedOption_NamePart_default_instance_;
PROTOBUF_CONSTEXPR UninterpretedOption::UninterpretedOption(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_._has_bits_)*/{}
@@ -433,14 +454,15 @@
, /*decltype(_impl_.negative_int_value_)*/int64_t{0}
, /*decltype(_impl_.double_value_)*/0} {}
struct UninterpretedOptionDefaultTypeInternal {
- PROTOBUF_CONSTEXPR UninterpretedOptionDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR UninterpretedOptionDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~UninterpretedOptionDefaultTypeInternal() {}
union {
UninterpretedOption _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 UninterpretedOptionDefaultTypeInternal _UninterpretedOption_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 UninterpretedOptionDefaultTypeInternal _UninterpretedOption_default_instance_;
PROTOBUF_CONSTEXPR SourceCodeInfo_Location::SourceCodeInfo_Location(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_._has_bits_)*/{}
@@ -453,27 +475,29 @@
, /*decltype(_impl_.leading_comments_)*/{&::_pbi::fixed_address_empty_string, ::_pbi::ConstantInitialized{}}
, /*decltype(_impl_.trailing_comments_)*/{&::_pbi::fixed_address_empty_string, ::_pbi::ConstantInitialized{}}} {}
struct SourceCodeInfo_LocationDefaultTypeInternal {
- PROTOBUF_CONSTEXPR SourceCodeInfo_LocationDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR SourceCodeInfo_LocationDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~SourceCodeInfo_LocationDefaultTypeInternal() {}
union {
SourceCodeInfo_Location _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 SourceCodeInfo_LocationDefaultTypeInternal _SourceCodeInfo_Location_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 SourceCodeInfo_LocationDefaultTypeInternal _SourceCodeInfo_Location_default_instance_;
PROTOBUF_CONSTEXPR SourceCodeInfo::SourceCodeInfo(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_.location_)*/{}
, /*decltype(_impl_._cached_size_)*/{}} {}
struct SourceCodeInfoDefaultTypeInternal {
- PROTOBUF_CONSTEXPR SourceCodeInfoDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR SourceCodeInfoDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~SourceCodeInfoDefaultTypeInternal() {}
union {
SourceCodeInfo _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 SourceCodeInfoDefaultTypeInternal _SourceCodeInfo_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 SourceCodeInfoDefaultTypeInternal _SourceCodeInfo_default_instance_;
PROTOBUF_CONSTEXPR GeneratedCodeInfo_Annotation::GeneratedCodeInfo_Annotation(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_._has_bits_)*/{}
@@ -482,674 +506,762 @@
, /*decltype(_impl_._path_cached_byte_size_)*/{0}
, /*decltype(_impl_.source_file_)*/{&::_pbi::fixed_address_empty_string, ::_pbi::ConstantInitialized{}}
, /*decltype(_impl_.begin_)*/0
- , /*decltype(_impl_.end_)*/0} {}
+ , /*decltype(_impl_.end_)*/0
+ , /*decltype(_impl_.semantic_)*/0} {}
struct GeneratedCodeInfo_AnnotationDefaultTypeInternal {
- PROTOBUF_CONSTEXPR GeneratedCodeInfo_AnnotationDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR GeneratedCodeInfo_AnnotationDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~GeneratedCodeInfo_AnnotationDefaultTypeInternal() {}
union {
GeneratedCodeInfo_Annotation _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 GeneratedCodeInfo_AnnotationDefaultTypeInternal _GeneratedCodeInfo_Annotation_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 GeneratedCodeInfo_AnnotationDefaultTypeInternal _GeneratedCodeInfo_Annotation_default_instance_;
PROTOBUF_CONSTEXPR GeneratedCodeInfo::GeneratedCodeInfo(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_.annotation_)*/{}
, /*decltype(_impl_._cached_size_)*/{}} {}
struct GeneratedCodeInfoDefaultTypeInternal {
- PROTOBUF_CONSTEXPR GeneratedCodeInfoDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR GeneratedCodeInfoDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~GeneratedCodeInfoDefaultTypeInternal() {}
union {
GeneratedCodeInfo _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 GeneratedCodeInfoDefaultTypeInternal _GeneratedCodeInfo_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 GeneratedCodeInfoDefaultTypeInternal _GeneratedCodeInfo_default_instance_;
PROTOBUF_NAMESPACE_CLOSE
static ::_pb::Metadata file_level_metadata_google_2fprotobuf_2fdescriptor_2eproto[27];
-static const ::_pb::EnumDescriptor* file_level_enum_descriptors_google_2fprotobuf_2fdescriptor_2eproto[6];
-static constexpr ::_pb::ServiceDescriptor const** file_level_service_descriptors_google_2fprotobuf_2fdescriptor_2eproto = nullptr;
-
-const uint32_t TableStruct_google_2fprotobuf_2fdescriptor_2eproto::offsets[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
- ~0u, // no _has_bits_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileDescriptorSet, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileDescriptorSet, _impl_.file_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileDescriptorProto, _impl_._has_bits_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileDescriptorProto, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileDescriptorProto, _impl_.name_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileDescriptorProto, _impl_.package_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileDescriptorProto, _impl_.dependency_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileDescriptorProto, _impl_.public_dependency_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileDescriptorProto, _impl_.weak_dependency_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileDescriptorProto, _impl_.message_type_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileDescriptorProto, _impl_.enum_type_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileDescriptorProto, _impl_.service_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileDescriptorProto, _impl_.extension_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileDescriptorProto, _impl_.options_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileDescriptorProto, _impl_.source_code_info_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileDescriptorProto, _impl_.syntax_),
- 0,
- 1,
- ~0u,
- ~0u,
- ~0u,
- ~0u,
- ~0u,
- ~0u,
- ~0u,
- 3,
- 4,
- 2,
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DescriptorProto_ExtensionRange, _impl_._has_bits_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DescriptorProto_ExtensionRange, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DescriptorProto_ExtensionRange, _impl_.start_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DescriptorProto_ExtensionRange, _impl_.end_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DescriptorProto_ExtensionRange, _impl_.options_),
- 1,
- 2,
- 0,
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DescriptorProto_ReservedRange, _impl_._has_bits_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DescriptorProto_ReservedRange, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DescriptorProto_ReservedRange, _impl_.start_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DescriptorProto_ReservedRange, _impl_.end_),
- 0,
- 1,
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DescriptorProto, _impl_._has_bits_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DescriptorProto, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DescriptorProto, _impl_.name_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DescriptorProto, _impl_.field_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DescriptorProto, _impl_.extension_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DescriptorProto, _impl_.nested_type_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DescriptorProto, _impl_.enum_type_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DescriptorProto, _impl_.extension_range_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DescriptorProto, _impl_.oneof_decl_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DescriptorProto, _impl_.options_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DescriptorProto, _impl_.reserved_range_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DescriptorProto, _impl_.reserved_name_),
- 0,
- ~0u,
- ~0u,
- ~0u,
- ~0u,
- ~0u,
- ~0u,
- 1,
- ~0u,
- ~0u,
- ~0u, // no _has_bits_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::ExtensionRangeOptions, _internal_metadata_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::ExtensionRangeOptions, _impl_._extensions_),
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::ExtensionRangeOptions, _impl_.uninterpreted_option_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldDescriptorProto, _impl_._has_bits_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldDescriptorProto, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldDescriptorProto, _impl_.name_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldDescriptorProto, _impl_.number_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldDescriptorProto, _impl_.label_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldDescriptorProto, _impl_.type_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldDescriptorProto, _impl_.type_name_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldDescriptorProto, _impl_.extendee_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldDescriptorProto, _impl_.default_value_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldDescriptorProto, _impl_.oneof_index_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldDescriptorProto, _impl_.json_name_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldDescriptorProto, _impl_.options_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldDescriptorProto, _impl_.proto3_optional_),
- 0,
- 6,
- 9,
- 10,
- 2,
- 1,
- 3,
- 7,
- 4,
- 5,
- 8,
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::OneofDescriptorProto, _impl_._has_bits_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::OneofDescriptorProto, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::OneofDescriptorProto, _impl_.name_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::OneofDescriptorProto, _impl_.options_),
- 0,
- 1,
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumDescriptorProto_EnumReservedRange, _impl_._has_bits_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumDescriptorProto_EnumReservedRange, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumDescriptorProto_EnumReservedRange, _impl_.start_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumDescriptorProto_EnumReservedRange, _impl_.end_),
- 0,
- 1,
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumDescriptorProto, _impl_._has_bits_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumDescriptorProto, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumDescriptorProto, _impl_.name_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumDescriptorProto, _impl_.value_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumDescriptorProto, _impl_.options_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumDescriptorProto, _impl_.reserved_range_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumDescriptorProto, _impl_.reserved_name_),
- 0,
- ~0u,
- 1,
- ~0u,
- ~0u,
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumValueDescriptorProto, _impl_._has_bits_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumValueDescriptorProto, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumValueDescriptorProto, _impl_.name_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumValueDescriptorProto, _impl_.number_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumValueDescriptorProto, _impl_.options_),
- 0,
- 2,
- 1,
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::ServiceDescriptorProto, _impl_._has_bits_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::ServiceDescriptorProto, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::ServiceDescriptorProto, _impl_.name_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::ServiceDescriptorProto, _impl_.method_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::ServiceDescriptorProto, _impl_.options_),
- 0,
- ~0u,
- 1,
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::MethodDescriptorProto, _impl_._has_bits_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::MethodDescriptorProto, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::MethodDescriptorProto, _impl_.name_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::MethodDescriptorProto, _impl_.input_type_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::MethodDescriptorProto, _impl_.output_type_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::MethodDescriptorProto, _impl_.options_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::MethodDescriptorProto, _impl_.client_streaming_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::MethodDescriptorProto, _impl_.server_streaming_),
- 0,
- 1,
- 2,
- 3,
- 4,
- 5,
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_._has_bits_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _internal_metadata_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_._extensions_),
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_.java_package_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_.java_outer_classname_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_.java_multiple_files_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_.java_generate_equals_and_hash_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_.java_string_check_utf8_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_.optimize_for_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_.go_package_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_.cc_generic_services_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_.java_generic_services_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_.py_generic_services_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_.php_generic_services_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_.deprecated_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_.cc_enable_arenas_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_.objc_class_prefix_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_.csharp_namespace_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_.swift_prefix_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_.php_class_prefix_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_.php_namespace_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_.php_metadata_namespace_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_.ruby_package_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_.uninterpreted_option_),
- 0,
- 1,
- 10,
- 11,
- 12,
- 18,
- 2,
- 13,
- 14,
- 15,
- 16,
- 17,
- 19,
- 3,
- 4,
- 5,
- 6,
- 7,
- 8,
- 9,
- ~0u,
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::MessageOptions, _impl_._has_bits_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::MessageOptions, _internal_metadata_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::MessageOptions, _impl_._extensions_),
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::MessageOptions, _impl_.message_set_wire_format_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::MessageOptions, _impl_.no_standard_descriptor_accessor_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::MessageOptions, _impl_.deprecated_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::MessageOptions, _impl_.map_entry_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::MessageOptions, _impl_.uninterpreted_option_),
- 0,
- 1,
- 2,
- 3,
- ~0u,
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldOptions, _impl_._has_bits_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldOptions, _internal_metadata_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldOptions, _impl_._extensions_),
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldOptions, _impl_.ctype_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldOptions, _impl_.packed_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldOptions, _impl_.jstype_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldOptions, _impl_.lazy_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldOptions, _impl_.unverified_lazy_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldOptions, _impl_.deprecated_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldOptions, _impl_.weak_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldOptions, _impl_.uninterpreted_option_),
- 0,
- 2,
- 1,
- 3,
- 4,
- 5,
- 6,
- ~0u,
- ~0u, // no _has_bits_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::OneofOptions, _internal_metadata_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::OneofOptions, _impl_._extensions_),
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::OneofOptions, _impl_.uninterpreted_option_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumOptions, _impl_._has_bits_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumOptions, _internal_metadata_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumOptions, _impl_._extensions_),
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumOptions, _impl_.allow_alias_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumOptions, _impl_.deprecated_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumOptions, _impl_.uninterpreted_option_),
- 0,
- 1,
- ~0u,
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumValueOptions, _impl_._has_bits_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumValueOptions, _internal_metadata_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumValueOptions, _impl_._extensions_),
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumValueOptions, _impl_.deprecated_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumValueOptions, _impl_.uninterpreted_option_),
- 0,
- ~0u,
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::ServiceOptions, _impl_._has_bits_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::ServiceOptions, _internal_metadata_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::ServiceOptions, _impl_._extensions_),
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::ServiceOptions, _impl_.deprecated_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::ServiceOptions, _impl_.uninterpreted_option_),
- 0,
- ~0u,
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::MethodOptions, _impl_._has_bits_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::MethodOptions, _internal_metadata_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::MethodOptions, _impl_._extensions_),
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::MethodOptions, _impl_.deprecated_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::MethodOptions, _impl_.idempotency_level_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::MethodOptions, _impl_.uninterpreted_option_),
- 0,
- 1,
- ~0u,
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::UninterpretedOption_NamePart, _impl_._has_bits_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::UninterpretedOption_NamePart, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::UninterpretedOption_NamePart, _impl_.name_part_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::UninterpretedOption_NamePart, _impl_.is_extension_),
- 0,
- 1,
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::UninterpretedOption, _impl_._has_bits_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::UninterpretedOption, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::UninterpretedOption, _impl_.name_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::UninterpretedOption, _impl_.identifier_value_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::UninterpretedOption, _impl_.positive_int_value_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::UninterpretedOption, _impl_.negative_int_value_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::UninterpretedOption, _impl_.double_value_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::UninterpretedOption, _impl_.string_value_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::UninterpretedOption, _impl_.aggregate_value_),
- ~0u,
- 0,
- 3,
- 4,
- 5,
- 1,
- 2,
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::SourceCodeInfo_Location, _impl_._has_bits_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::SourceCodeInfo_Location, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::SourceCodeInfo_Location, _impl_.path_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::SourceCodeInfo_Location, _impl_.span_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::SourceCodeInfo_Location, _impl_.leading_comments_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::SourceCodeInfo_Location, _impl_.trailing_comments_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::SourceCodeInfo_Location, _impl_.leading_detached_comments_),
- ~0u,
- ~0u,
- 0,
- 1,
- ~0u,
- ~0u, // no _has_bits_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::SourceCodeInfo, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::SourceCodeInfo, _impl_.location_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo_Annotation, _impl_._has_bits_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo_Annotation, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo_Annotation, _impl_.path_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo_Annotation, _impl_.source_file_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo_Annotation, _impl_.begin_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo_Annotation, _impl_.end_),
- ~0u,
- 0,
- 1,
- 2,
- ~0u, // no _has_bits_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo, _impl_.annotation_),
+static const ::_pb::EnumDescriptor* file_level_enum_descriptors_google_2fprotobuf_2fdescriptor_2eproto[7];
+static constexpr const ::_pb::ServiceDescriptor**
+ file_level_service_descriptors_google_2fprotobuf_2fdescriptor_2eproto = nullptr;
+const uint32_t TableStruct_google_2fprotobuf_2fdescriptor_2eproto::offsets[] PROTOBUF_SECTION_VARIABLE(
+ protodesc_cold) = {
+ ~0u, // no _has_bits_
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileDescriptorSet, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileDescriptorSet, _impl_.file_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileDescriptorProto, _impl_._has_bits_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileDescriptorProto, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileDescriptorProto, _impl_.name_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileDescriptorProto, _impl_.package_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileDescriptorProto, _impl_.dependency_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileDescriptorProto, _impl_.public_dependency_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileDescriptorProto, _impl_.weak_dependency_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileDescriptorProto, _impl_.message_type_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileDescriptorProto, _impl_.enum_type_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileDescriptorProto, _impl_.service_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileDescriptorProto, _impl_.extension_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileDescriptorProto, _impl_.options_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileDescriptorProto, _impl_.source_code_info_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileDescriptorProto, _impl_.syntax_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileDescriptorProto, _impl_.edition_),
+ 0,
+ 1,
+ ~0u,
+ ~0u,
+ ~0u,
+ ~0u,
+ ~0u,
+ ~0u,
+ ~0u,
+ 4,
+ 5,
+ 2,
+ 3,
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DescriptorProto_ExtensionRange, _impl_._has_bits_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DescriptorProto_ExtensionRange, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DescriptorProto_ExtensionRange, _impl_.start_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DescriptorProto_ExtensionRange, _impl_.end_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DescriptorProto_ExtensionRange, _impl_.options_),
+ 1,
+ 2,
+ 0,
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DescriptorProto_ReservedRange, _impl_._has_bits_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DescriptorProto_ReservedRange, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DescriptorProto_ReservedRange, _impl_.start_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DescriptorProto_ReservedRange, _impl_.end_),
+ 0,
+ 1,
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DescriptorProto, _impl_._has_bits_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DescriptorProto, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DescriptorProto, _impl_.name_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DescriptorProto, _impl_.field_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DescriptorProto, _impl_.extension_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DescriptorProto, _impl_.nested_type_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DescriptorProto, _impl_.enum_type_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DescriptorProto, _impl_.extension_range_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DescriptorProto, _impl_.oneof_decl_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DescriptorProto, _impl_.options_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DescriptorProto, _impl_.reserved_range_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DescriptorProto, _impl_.reserved_name_),
+ 0,
+ ~0u,
+ ~0u,
+ ~0u,
+ ~0u,
+ ~0u,
+ ~0u,
+ 1,
+ ~0u,
+ ~0u,
+ ~0u, // no _has_bits_
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::ExtensionRangeOptions, _internal_metadata_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::ExtensionRangeOptions, _impl_._extensions_),
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::ExtensionRangeOptions, _impl_.uninterpreted_option_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldDescriptorProto, _impl_._has_bits_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldDescriptorProto, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldDescriptorProto, _impl_.name_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldDescriptorProto, _impl_.number_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldDescriptorProto, _impl_.label_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldDescriptorProto, _impl_.type_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldDescriptorProto, _impl_.type_name_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldDescriptorProto, _impl_.extendee_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldDescriptorProto, _impl_.default_value_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldDescriptorProto, _impl_.oneof_index_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldDescriptorProto, _impl_.json_name_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldDescriptorProto, _impl_.options_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldDescriptorProto, _impl_.proto3_optional_),
+ 0,
+ 6,
+ 9,
+ 10,
+ 2,
+ 1,
+ 3,
+ 7,
+ 4,
+ 5,
+ 8,
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::OneofDescriptorProto, _impl_._has_bits_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::OneofDescriptorProto, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::OneofDescriptorProto, _impl_.name_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::OneofDescriptorProto, _impl_.options_),
+ 0,
+ 1,
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumDescriptorProto_EnumReservedRange, _impl_._has_bits_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumDescriptorProto_EnumReservedRange, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumDescriptorProto_EnumReservedRange, _impl_.start_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumDescriptorProto_EnumReservedRange, _impl_.end_),
+ 0,
+ 1,
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumDescriptorProto, _impl_._has_bits_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumDescriptorProto, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumDescriptorProto, _impl_.name_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumDescriptorProto, _impl_.value_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumDescriptorProto, _impl_.options_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumDescriptorProto, _impl_.reserved_range_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumDescriptorProto, _impl_.reserved_name_),
+ 0,
+ ~0u,
+ 1,
+ ~0u,
+ ~0u,
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumValueDescriptorProto, _impl_._has_bits_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumValueDescriptorProto, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumValueDescriptorProto, _impl_.name_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumValueDescriptorProto, _impl_.number_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumValueDescriptorProto, _impl_.options_),
+ 0,
+ 2,
+ 1,
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::ServiceDescriptorProto, _impl_._has_bits_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::ServiceDescriptorProto, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::ServiceDescriptorProto, _impl_.name_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::ServiceDescriptorProto, _impl_.method_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::ServiceDescriptorProto, _impl_.options_),
+ 0,
+ ~0u,
+ 1,
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::MethodDescriptorProto, _impl_._has_bits_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::MethodDescriptorProto, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::MethodDescriptorProto, _impl_.name_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::MethodDescriptorProto, _impl_.input_type_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::MethodDescriptorProto, _impl_.output_type_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::MethodDescriptorProto, _impl_.options_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::MethodDescriptorProto, _impl_.client_streaming_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::MethodDescriptorProto, _impl_.server_streaming_),
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_._has_bits_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _internal_metadata_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_._extensions_),
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_.java_package_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_.java_outer_classname_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_.java_multiple_files_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_.java_generate_equals_and_hash_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_.java_string_check_utf8_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_.optimize_for_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_.go_package_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_.cc_generic_services_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_.java_generic_services_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_.py_generic_services_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_.php_generic_services_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_.deprecated_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_.cc_enable_arenas_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_.objc_class_prefix_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_.csharp_namespace_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_.swift_prefix_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_.php_class_prefix_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_.php_namespace_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_.php_metadata_namespace_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_.ruby_package_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FileOptions, _impl_.uninterpreted_option_),
+ 0,
+ 1,
+ 10,
+ 11,
+ 12,
+ 18,
+ 2,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 19,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ ~0u,
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::MessageOptions, _impl_._has_bits_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::MessageOptions, _internal_metadata_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::MessageOptions, _impl_._extensions_),
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::MessageOptions, _impl_.message_set_wire_format_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::MessageOptions, _impl_.no_standard_descriptor_accessor_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::MessageOptions, _impl_.deprecated_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::MessageOptions, _impl_.map_entry_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::MessageOptions, _impl_.uninterpreted_option_),
+ 0,
+ 1,
+ 2,
+ 3,
+ ~0u,
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldOptions, _impl_._has_bits_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldOptions, _internal_metadata_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldOptions, _impl_._extensions_),
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldOptions, _impl_.ctype_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldOptions, _impl_.packed_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldOptions, _impl_.jstype_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldOptions, _impl_.lazy_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldOptions, _impl_.unverified_lazy_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldOptions, _impl_.deprecated_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldOptions, _impl_.weak_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldOptions, _impl_.uninterpreted_option_),
+ 0,
+ 2,
+ 1,
+ 3,
+ 4,
+ 5,
+ 6,
+ ~0u,
+ ~0u, // no _has_bits_
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::OneofOptions, _internal_metadata_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::OneofOptions, _impl_._extensions_),
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::OneofOptions, _impl_.uninterpreted_option_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumOptions, _impl_._has_bits_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumOptions, _internal_metadata_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumOptions, _impl_._extensions_),
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumOptions, _impl_.allow_alias_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumOptions, _impl_.deprecated_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumOptions, _impl_.uninterpreted_option_),
+ 0,
+ 1,
+ ~0u,
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumValueOptions, _impl_._has_bits_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumValueOptions, _internal_metadata_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumValueOptions, _impl_._extensions_),
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumValueOptions, _impl_.deprecated_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumValueOptions, _impl_.uninterpreted_option_),
+ 0,
+ ~0u,
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::ServiceOptions, _impl_._has_bits_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::ServiceOptions, _internal_metadata_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::ServiceOptions, _impl_._extensions_),
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::ServiceOptions, _impl_.deprecated_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::ServiceOptions, _impl_.uninterpreted_option_),
+ 0,
+ ~0u,
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::MethodOptions, _impl_._has_bits_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::MethodOptions, _internal_metadata_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::MethodOptions, _impl_._extensions_),
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::MethodOptions, _impl_.deprecated_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::MethodOptions, _impl_.idempotency_level_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::MethodOptions, _impl_.uninterpreted_option_),
+ 0,
+ 1,
+ ~0u,
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::UninterpretedOption_NamePart, _impl_._has_bits_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::UninterpretedOption_NamePart, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::UninterpretedOption_NamePart, _impl_.name_part_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::UninterpretedOption_NamePart, _impl_.is_extension_),
+ 0,
+ 1,
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::UninterpretedOption, _impl_._has_bits_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::UninterpretedOption, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::UninterpretedOption, _impl_.name_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::UninterpretedOption, _impl_.identifier_value_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::UninterpretedOption, _impl_.positive_int_value_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::UninterpretedOption, _impl_.negative_int_value_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::UninterpretedOption, _impl_.double_value_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::UninterpretedOption, _impl_.string_value_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::UninterpretedOption, _impl_.aggregate_value_),
+ ~0u,
+ 0,
+ 3,
+ 4,
+ 5,
+ 1,
+ 2,
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::SourceCodeInfo_Location, _impl_._has_bits_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::SourceCodeInfo_Location, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::SourceCodeInfo_Location, _impl_.path_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::SourceCodeInfo_Location, _impl_.span_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::SourceCodeInfo_Location, _impl_.leading_comments_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::SourceCodeInfo_Location, _impl_.trailing_comments_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::SourceCodeInfo_Location, _impl_.leading_detached_comments_),
+ ~0u,
+ ~0u,
+ 0,
+ 1,
+ ~0u,
+ ~0u, // no _has_bits_
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::SourceCodeInfo, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::SourceCodeInfo, _impl_.location_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo_Annotation, _impl_._has_bits_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo_Annotation, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo_Annotation, _impl_.path_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo_Annotation, _impl_.source_file_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo_Annotation, _impl_.begin_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo_Annotation, _impl_.end_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo_Annotation, _impl_.semantic_),
+ ~0u,
+ 0,
+ 1,
+ 2,
+ 3,
+ ~0u, // no _has_bits_
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo, _impl_.annotation_),
};
-static const ::_pbi::MigrationSchema schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
- { 0, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::FileDescriptorSet)},
- { 7, 25, -1, sizeof(::PROTOBUF_NAMESPACE_ID::FileDescriptorProto)},
- { 37, 46, -1, sizeof(::PROTOBUF_NAMESPACE_ID::DescriptorProto_ExtensionRange)},
- { 49, 57, -1, sizeof(::PROTOBUF_NAMESPACE_ID::DescriptorProto_ReservedRange)},
- { 59, 75, -1, sizeof(::PROTOBUF_NAMESPACE_ID::DescriptorProto)},
- { 85, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::ExtensionRangeOptions)},
- { 92, 109, -1, sizeof(::PROTOBUF_NAMESPACE_ID::FieldDescriptorProto)},
- { 120, 128, -1, sizeof(::PROTOBUF_NAMESPACE_ID::OneofDescriptorProto)},
- { 130, 138, -1, sizeof(::PROTOBUF_NAMESPACE_ID::EnumDescriptorProto_EnumReservedRange)},
- { 140, 151, -1, sizeof(::PROTOBUF_NAMESPACE_ID::EnumDescriptorProto)},
- { 156, 165, -1, sizeof(::PROTOBUF_NAMESPACE_ID::EnumValueDescriptorProto)},
- { 168, 177, -1, sizeof(::PROTOBUF_NAMESPACE_ID::ServiceDescriptorProto)},
- { 180, 192, -1, sizeof(::PROTOBUF_NAMESPACE_ID::MethodDescriptorProto)},
- { 198, 225, -1, sizeof(::PROTOBUF_NAMESPACE_ID::FileOptions)},
- { 246, 257, -1, sizeof(::PROTOBUF_NAMESPACE_ID::MessageOptions)},
- { 262, 276, -1, sizeof(::PROTOBUF_NAMESPACE_ID::FieldOptions)},
- { 284, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::OneofOptions)},
- { 291, 300, -1, sizeof(::PROTOBUF_NAMESPACE_ID::EnumOptions)},
- { 303, 311, -1, sizeof(::PROTOBUF_NAMESPACE_ID::EnumValueOptions)},
- { 313, 321, -1, sizeof(::PROTOBUF_NAMESPACE_ID::ServiceOptions)},
- { 323, 332, -1, sizeof(::PROTOBUF_NAMESPACE_ID::MethodOptions)},
- { 335, 343, -1, sizeof(::PROTOBUF_NAMESPACE_ID::UninterpretedOption_NamePart)},
- { 345, 358, -1, sizeof(::PROTOBUF_NAMESPACE_ID::UninterpretedOption)},
- { 365, 376, -1, sizeof(::PROTOBUF_NAMESPACE_ID::SourceCodeInfo_Location)},
- { 381, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::SourceCodeInfo)},
- { 388, 398, -1, sizeof(::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo_Annotation)},
- { 402, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo)},
+
+static const ::_pbi::MigrationSchema
+ schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
+ { 0, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::FileDescriptorSet)},
+ { 9, 30, -1, sizeof(::PROTOBUF_NAMESPACE_ID::FileDescriptorProto)},
+ { 43, 54, -1, sizeof(::PROTOBUF_NAMESPACE_ID::DescriptorProto_ExtensionRange)},
+ { 57, 67, -1, sizeof(::PROTOBUF_NAMESPACE_ID::DescriptorProto_ReservedRange)},
+ { 69, 87, -1, sizeof(::PROTOBUF_NAMESPACE_ID::DescriptorProto)},
+ { 97, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::ExtensionRangeOptions)},
+ { 106, 125, -1, sizeof(::PROTOBUF_NAMESPACE_ID::FieldDescriptorProto)},
+ { 136, 146, -1, sizeof(::PROTOBUF_NAMESPACE_ID::OneofDescriptorProto)},
+ { 148, 158, -1, sizeof(::PROTOBUF_NAMESPACE_ID::EnumDescriptorProto_EnumReservedRange)},
+ { 160, 173, -1, sizeof(::PROTOBUF_NAMESPACE_ID::EnumDescriptorProto)},
+ { 178, 189, -1, sizeof(::PROTOBUF_NAMESPACE_ID::EnumValueDescriptorProto)},
+ { 192, 203, -1, sizeof(::PROTOBUF_NAMESPACE_ID::ServiceDescriptorProto)},
+ { 206, 220, -1, sizeof(::PROTOBUF_NAMESPACE_ID::MethodDescriptorProto)},
+ { 226, 255, -1, sizeof(::PROTOBUF_NAMESPACE_ID::FileOptions)},
+ { 276, 289, -1, sizeof(::PROTOBUF_NAMESPACE_ID::MessageOptions)},
+ { 294, 310, -1, sizeof(::PROTOBUF_NAMESPACE_ID::FieldOptions)},
+ { 318, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::OneofOptions)},
+ { 327, 338, -1, sizeof(::PROTOBUF_NAMESPACE_ID::EnumOptions)},
+ { 341, 351, -1, sizeof(::PROTOBUF_NAMESPACE_ID::EnumValueOptions)},
+ { 353, 363, -1, sizeof(::PROTOBUF_NAMESPACE_ID::ServiceOptions)},
+ { 365, 376, -1, sizeof(::PROTOBUF_NAMESPACE_ID::MethodOptions)},
+ { 379, 389, -1, sizeof(::PROTOBUF_NAMESPACE_ID::UninterpretedOption_NamePart)},
+ { 391, 406, -1, sizeof(::PROTOBUF_NAMESPACE_ID::UninterpretedOption)},
+ { 413, 426, -1, sizeof(::PROTOBUF_NAMESPACE_ID::SourceCodeInfo_Location)},
+ { 431, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::SourceCodeInfo)},
+ { 440, 453, -1, sizeof(::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo_Annotation)},
+ { 458, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo)},
};
static const ::_pb::Message* const file_default_instances[] = {
- &::PROTOBUF_NAMESPACE_ID::_FileDescriptorSet_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::_FileDescriptorProto_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::_DescriptorProto_ExtensionRange_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::_DescriptorProto_ReservedRange_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::_DescriptorProto_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::_ExtensionRangeOptions_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::_FieldDescriptorProto_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::_OneofDescriptorProto_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::_EnumDescriptorProto_EnumReservedRange_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::_EnumDescriptorProto_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::_EnumValueDescriptorProto_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::_ServiceDescriptorProto_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::_MethodDescriptorProto_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::_FileOptions_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::_MessageOptions_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::_FieldOptions_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::_OneofOptions_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::_EnumOptions_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::_EnumValueOptions_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::_ServiceOptions_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::_MethodOptions_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::_UninterpretedOption_NamePart_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::_UninterpretedOption_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::_SourceCodeInfo_Location_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::_SourceCodeInfo_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::_GeneratedCodeInfo_Annotation_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::_GeneratedCodeInfo_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_FileDescriptorSet_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_FileDescriptorProto_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_DescriptorProto_ExtensionRange_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_DescriptorProto_ReservedRange_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_DescriptorProto_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_ExtensionRangeOptions_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_FieldDescriptorProto_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_OneofDescriptorProto_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_EnumDescriptorProto_EnumReservedRange_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_EnumDescriptorProto_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_EnumValueDescriptorProto_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_ServiceDescriptorProto_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_MethodDescriptorProto_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_FileOptions_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_MessageOptions_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_FieldOptions_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_OneofOptions_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_EnumOptions_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_EnumValueOptions_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_ServiceOptions_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_MethodOptions_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_UninterpretedOption_NamePart_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_UninterpretedOption_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_SourceCodeInfo_Location_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_SourceCodeInfo_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_GeneratedCodeInfo_Annotation_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_GeneratedCodeInfo_default_instance_._instance,
};
-
-const char descriptor_table_protodef_google_2fprotobuf_2fdescriptor_2eproto[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) =
- "\n google/protobuf/descriptor.proto\022\017goog"
- "le.protobuf\"G\n\021FileDescriptorSet\0222\n\004file"
- "\030\001 \003(\0132$.google.protobuf.FileDescriptorP"
- "roto\"\333\003\n\023FileDescriptorProto\022\014\n\004name\030\001 \001"
- "(\t\022\017\n\007package\030\002 \001(\t\022\022\n\ndependency\030\003 \003(\t\022"
- "\031\n\021public_dependency\030\n \003(\005\022\027\n\017weak_depen"
- "dency\030\013 \003(\005\0226\n\014message_type\030\004 \003(\0132 .goog"
- "le.protobuf.DescriptorProto\0227\n\tenum_type"
- "\030\005 \003(\0132$.google.protobuf.EnumDescriptorP"
- "roto\0228\n\007service\030\006 \003(\0132\'.google.protobuf."
- "ServiceDescriptorProto\0228\n\textension\030\007 \003("
- "\0132%.google.protobuf.FieldDescriptorProto"
- "\022-\n\007options\030\010 \001(\0132\034.google.protobuf.File"
- "Options\0229\n\020source_code_info\030\t \001(\0132\037.goog"
- "le.protobuf.SourceCodeInfo\022\016\n\006syntax\030\014 \001"
- "(\t\"\251\005\n\017DescriptorProto\022\014\n\004name\030\001 \001(\t\0224\n\005"
- "field\030\002 \003(\0132%.google.protobuf.FieldDescr"
- "iptorProto\0228\n\textension\030\006 \003(\0132%.google.p"
- "rotobuf.FieldDescriptorProto\0225\n\013nested_t"
- "ype\030\003 \003(\0132 .google.protobuf.DescriptorPr"
- "oto\0227\n\tenum_type\030\004 \003(\0132$.google.protobuf"
- ".EnumDescriptorProto\022H\n\017extension_range\030"
- "\005 \003(\0132/.google.protobuf.DescriptorProto."
- "ExtensionRange\0229\n\noneof_decl\030\010 \003(\0132%.goo"
- "gle.protobuf.OneofDescriptorProto\0220\n\007opt"
- "ions\030\007 \001(\0132\037.google.protobuf.MessageOpti"
- "ons\022F\n\016reserved_range\030\t \003(\0132..google.pro"
- "tobuf.DescriptorProto.ReservedRange\022\025\n\rr"
- "eserved_name\030\n \003(\t\032e\n\016ExtensionRange\022\r\n\005"
- "start\030\001 \001(\005\022\013\n\003end\030\002 \001(\005\0227\n\007options\030\003 \001("
- "\0132&.google.protobuf.ExtensionRangeOption"
- "s\032+\n\rReservedRange\022\r\n\005start\030\001 \001(\005\022\013\n\003end"
- "\030\002 \001(\005\"g\n\025ExtensionRangeOptions\022C\n\024unint"
- "erpreted_option\030\347\007 \003(\0132$.google.protobuf"
- ".UninterpretedOption*\t\010\350\007\020\200\200\200\200\002\"\325\005\n\024Fiel"
- "dDescriptorProto\022\014\n\004name\030\001 \001(\t\022\016\n\006number"
- "\030\003 \001(\005\022:\n\005label\030\004 \001(\0162+.google.protobuf."
- "FieldDescriptorProto.Label\0228\n\004type\030\005 \001(\016"
- "2*.google.protobuf.FieldDescriptorProto."
- "Type\022\021\n\ttype_name\030\006 \001(\t\022\020\n\010extendee\030\002 \001("
- "\t\022\025\n\rdefault_value\030\007 \001(\t\022\023\n\013oneof_index\030"
- "\t \001(\005\022\021\n\tjson_name\030\n \001(\t\022.\n\007options\030\010 \001("
- "\0132\035.google.protobuf.FieldOptions\022\027\n\017prot"
- "o3_optional\030\021 \001(\010\"\266\002\n\004Type\022\017\n\013TYPE_DOUBL"
- "E\020\001\022\016\n\nTYPE_FLOAT\020\002\022\016\n\nTYPE_INT64\020\003\022\017\n\013T"
- "YPE_UINT64\020\004\022\016\n\nTYPE_INT32\020\005\022\020\n\014TYPE_FIX"
- "ED64\020\006\022\020\n\014TYPE_FIXED32\020\007\022\r\n\tTYPE_BOOL\020\010\022"
- "\017\n\013TYPE_STRING\020\t\022\016\n\nTYPE_GROUP\020\n\022\020\n\014TYPE"
- "_MESSAGE\020\013\022\016\n\nTYPE_BYTES\020\014\022\017\n\013TYPE_UINT3"
- "2\020\r\022\r\n\tTYPE_ENUM\020\016\022\021\n\rTYPE_SFIXED32\020\017\022\021\n"
- "\rTYPE_SFIXED64\020\020\022\017\n\013TYPE_SINT32\020\021\022\017\n\013TYP"
- "E_SINT64\020\022\"C\n\005Label\022\022\n\016LABEL_OPTIONAL\020\001\022"
- "\022\n\016LABEL_REQUIRED\020\002\022\022\n\016LABEL_REPEATED\020\003\""
- "T\n\024OneofDescriptorProto\022\014\n\004name\030\001 \001(\t\022.\n"
- "\007options\030\002 \001(\0132\035.google.protobuf.OneofOp"
- "tions\"\244\002\n\023EnumDescriptorProto\022\014\n\004name\030\001 "
- "\001(\t\0228\n\005value\030\002 \003(\0132).google.protobuf.Enu"
- "mValueDescriptorProto\022-\n\007options\030\003 \001(\0132\034"
- ".google.protobuf.EnumOptions\022N\n\016reserved"
- "_range\030\004 \003(\01326.google.protobuf.EnumDescr"
- "iptorProto.EnumReservedRange\022\025\n\rreserved"
- "_name\030\005 \003(\t\032/\n\021EnumReservedRange\022\r\n\005star"
- "t\030\001 \001(\005\022\013\n\003end\030\002 \001(\005\"l\n\030EnumValueDescrip"
- "torProto\022\014\n\004name\030\001 \001(\t\022\016\n\006number\030\002 \001(\005\0222"
- "\n\007options\030\003 \001(\0132!.google.protobuf.EnumVa"
- "lueOptions\"\220\001\n\026ServiceDescriptorProto\022\014\n"
- "\004name\030\001 \001(\t\0226\n\006method\030\002 \003(\0132&.google.pro"
- "tobuf.MethodDescriptorProto\0220\n\007options\030\003"
- " \001(\0132\037.google.protobuf.ServiceOptions\"\301\001"
- "\n\025MethodDescriptorProto\022\014\n\004name\030\001 \001(\t\022\022\n"
- "\ninput_type\030\002 \001(\t\022\023\n\013output_type\030\003 \001(\t\022/"
- "\n\007options\030\004 \001(\0132\036.google.protobuf.Method"
- "Options\022\037\n\020client_streaming\030\005 \001(\010:\005false"
- "\022\037\n\020server_streaming\030\006 \001(\010:\005false\"\245\006\n\013Fi"
- "leOptions\022\024\n\014java_package\030\001 \001(\t\022\034\n\024java_"
- "outer_classname\030\010 \001(\t\022\"\n\023java_multiple_f"
- "iles\030\n \001(\010:\005false\022)\n\035java_generate_equal"
- "s_and_hash\030\024 \001(\010B\002\030\001\022%\n\026java_string_chec"
- "k_utf8\030\033 \001(\010:\005false\022F\n\014optimize_for\030\t \001("
- "\0162).google.protobuf.FileOptions.Optimize"
- "Mode:\005SPEED\022\022\n\ngo_package\030\013 \001(\t\022\"\n\023cc_ge"
- "neric_services\030\020 \001(\010:\005false\022$\n\025java_gene"
- "ric_services\030\021 \001(\010:\005false\022\"\n\023py_generic_"
- "services\030\022 \001(\010:\005false\022#\n\024php_generic_ser"
- "vices\030* \001(\010:\005false\022\031\n\ndeprecated\030\027 \001(\010:\005"
- "false\022\036\n\020cc_enable_arenas\030\037 \001(\010:\004true\022\031\n"
- "\021objc_class_prefix\030$ \001(\t\022\030\n\020csharp_names"
- "pace\030% \001(\t\022\024\n\014swift_prefix\030\' \001(\t\022\030\n\020php_"
- "class_prefix\030( \001(\t\022\025\n\rphp_namespace\030) \001("
- "\t\022\036\n\026php_metadata_namespace\030, \001(\t\022\024\n\014rub"
- "y_package\030- \001(\t\022C\n\024uninterpreted_option\030"
- "\347\007 \003(\0132$.google.protobuf.UninterpretedOp"
- "tion\":\n\014OptimizeMode\022\t\n\005SPEED\020\001\022\r\n\tCODE_"
- "SIZE\020\002\022\020\n\014LITE_RUNTIME\020\003*\t\010\350\007\020\200\200\200\200\002J\004\010&\020"
- "\'\"\204\002\n\016MessageOptions\022&\n\027message_set_wire"
- "_format\030\001 \001(\010:\005false\022.\n\037no_standard_desc"
- "riptor_accessor\030\002 \001(\010:\005false\022\031\n\ndeprecat"
- "ed\030\003 \001(\010:\005false\022\021\n\tmap_entry\030\007 \001(\010\022C\n\024un"
- "interpreted_option\030\347\007 \003(\0132$.google.proto"
- "buf.UninterpretedOption*\t\010\350\007\020\200\200\200\200\002J\004\010\004\020\005"
- "J\004\010\005\020\006J\004\010\006\020\007J\004\010\010\020\tJ\004\010\t\020\n\"\276\003\n\014FieldOption"
- "s\022:\n\005ctype\030\001 \001(\0162#.google.protobuf.Field"
- "Options.CType:\006STRING\022\016\n\006packed\030\002 \001(\010\022\?\n"
- "\006jstype\030\006 \001(\0162$.google.protobuf.FieldOpt"
- "ions.JSType:\tJS_NORMAL\022\023\n\004lazy\030\005 \001(\010:\005fa"
- "lse\022\036\n\017unverified_lazy\030\017 \001(\010:\005false\022\031\n\nd"
- "eprecated\030\003 \001(\010:\005false\022\023\n\004weak\030\n \001(\010:\005fa"
- "lse\022C\n\024uninterpreted_option\030\347\007 \003(\0132$.goo"
- "gle.protobuf.UninterpretedOption\"/\n\005CTyp"
- "e\022\n\n\006STRING\020\000\022\010\n\004CORD\020\001\022\020\n\014STRING_PIECE\020"
- "\002\"5\n\006JSType\022\r\n\tJS_NORMAL\020\000\022\r\n\tJS_STRING\020"
- "\001\022\r\n\tJS_NUMBER\020\002*\t\010\350\007\020\200\200\200\200\002J\004\010\004\020\005\"^\n\014One"
- "ofOptions\022C\n\024uninterpreted_option\030\347\007 \003(\013"
- "2$.google.protobuf.UninterpretedOption*\t"
- "\010\350\007\020\200\200\200\200\002\"\223\001\n\013EnumOptions\022\023\n\013allow_alias"
- "\030\002 \001(\010\022\031\n\ndeprecated\030\003 \001(\010:\005false\022C\n\024uni"
- "nterpreted_option\030\347\007 \003(\0132$.google.protob"
- "uf.UninterpretedOption*\t\010\350\007\020\200\200\200\200\002J\004\010\005\020\006\""
- "}\n\020EnumValueOptions\022\031\n\ndeprecated\030\001 \001(\010:"
- "\005false\022C\n\024uninterpreted_option\030\347\007 \003(\0132$."
- "google.protobuf.UninterpretedOption*\t\010\350\007"
- "\020\200\200\200\200\002\"{\n\016ServiceOptions\022\031\n\ndeprecated\030!"
- " \001(\010:\005false\022C\n\024uninterpreted_option\030\347\007 \003"
- "(\0132$.google.protobuf.UninterpretedOption"
- "*\t\010\350\007\020\200\200\200\200\002\"\255\002\n\rMethodOptions\022\031\n\ndepreca"
- "ted\030! \001(\010:\005false\022_\n\021idempotency_level\030\" "
- "\001(\0162/.google.protobuf.MethodOptions.Idem"
- "potencyLevel:\023IDEMPOTENCY_UNKNOWN\022C\n\024uni"
- "nterpreted_option\030\347\007 \003(\0132$.google.protob"
- "uf.UninterpretedOption\"P\n\020IdempotencyLev"
- "el\022\027\n\023IDEMPOTENCY_UNKNOWN\020\000\022\023\n\017NO_SIDE_E"
- "FFECTS\020\001\022\016\n\nIDEMPOTENT\020\002*\t\010\350\007\020\200\200\200\200\002\"\236\002\n\023"
- "UninterpretedOption\022;\n\004name\030\002 \003(\0132-.goog"
- "le.protobuf.UninterpretedOption.NamePart"
- "\022\030\n\020identifier_value\030\003 \001(\t\022\032\n\022positive_i"
- "nt_value\030\004 \001(\004\022\032\n\022negative_int_value\030\005 \001"
- "(\003\022\024\n\014double_value\030\006 \001(\001\022\024\n\014string_value"
- "\030\007 \001(\014\022\027\n\017aggregate_value\030\010 \001(\t\0323\n\010NameP"
- "art\022\021\n\tname_part\030\001 \002(\t\022\024\n\014is_extension\030\002"
- " \002(\010\"\325\001\n\016SourceCodeInfo\022:\n\010location\030\001 \003("
- "\0132(.google.protobuf.SourceCodeInfo.Locat"
- "ion\032\206\001\n\010Location\022\020\n\004path\030\001 \003(\005B\002\020\001\022\020\n\004sp"
- "an\030\002 \003(\005B\002\020\001\022\030\n\020leading_comments\030\003 \001(\t\022\031"
- "\n\021trailing_comments\030\004 \001(\t\022!\n\031leading_det"
- "ached_comments\030\006 \003(\t\"\247\001\n\021GeneratedCodeIn"
- "fo\022A\n\nannotation\030\001 \003(\0132-.google.protobuf"
- ".GeneratedCodeInfo.Annotation\032O\n\nAnnotat"
- "ion\022\020\n\004path\030\001 \003(\005B\002\020\001\022\023\n\013source_file\030\002 \001"
- "(\t\022\r\n\005begin\030\003 \001(\005\022\013\n\003end\030\004 \001(\005B~\n\023com.go"
- "ogle.protobufB\020DescriptorProtosH\001Z-googl"
- "e.golang.org/protobuf/types/descriptorpb"
- "\370\001\001\242\002\003GPB\252\002\032Google.Protobuf.Reflection"
- ;
-static ::_pbi::once_flag descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_once;
+const char descriptor_table_protodef_google_2fprotobuf_2fdescriptor_2eproto[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
+ "\n google/protobuf/descriptor.proto\022\017goog"
+ "le.protobuf\"G\n\021FileDescriptorSet\0222\n\004file"
+ "\030\001 \003(\0132$.google.protobuf.FileDescriptorP"
+ "roto\"\354\003\n\023FileDescriptorProto\022\014\n\004name\030\001 \001"
+ "(\t\022\017\n\007package\030\002 \001(\t\022\022\n\ndependency\030\003 \003(\t\022"
+ "\031\n\021public_dependency\030\n \003(\005\022\027\n\017weak_depen"
+ "dency\030\013 \003(\005\0226\n\014message_type\030\004 \003(\0132 .goog"
+ "le.protobuf.DescriptorProto\0227\n\tenum_type"
+ "\030\005 \003(\0132$.google.protobuf.EnumDescriptorP"
+ "roto\0228\n\007service\030\006 \003(\0132\'.google.protobuf."
+ "ServiceDescriptorProto\0228\n\textension\030\007 \003("
+ "\0132%.google.protobuf.FieldDescriptorProto"
+ "\022-\n\007options\030\010 \001(\0132\034.google.protobuf.File"
+ "Options\0229\n\020source_code_info\030\t \001(\0132\037.goog"
+ "le.protobuf.SourceCodeInfo\022\016\n\006syntax\030\014 \001"
+ "(\t\022\017\n\007edition\030\r \001(\t\"\251\005\n\017DescriptorProto\022"
+ "\014\n\004name\030\001 \001(\t\0224\n\005field\030\002 \003(\0132%.google.pr"
+ "otobuf.FieldDescriptorProto\0228\n\textension"
+ "\030\006 \003(\0132%.google.protobuf.FieldDescriptor"
+ "Proto\0225\n\013nested_type\030\003 \003(\0132 .google.prot"
+ "obuf.DescriptorProto\0227\n\tenum_type\030\004 \003(\0132"
+ "$.google.protobuf.EnumDescriptorProto\022H\n"
+ "\017extension_range\030\005 \003(\0132/.google.protobuf"
+ ".DescriptorProto.ExtensionRange\0229\n\noneof"
+ "_decl\030\010 \003(\0132%.google.protobuf.OneofDescr"
+ "iptorProto\0220\n\007options\030\007 \001(\0132\037.google.pro"
+ "tobuf.MessageOptions\022F\n\016reserved_range\030\t"
+ " \003(\0132..google.protobuf.DescriptorProto.R"
+ "eservedRange\022\025\n\rreserved_name\030\n \003(\t\032e\n\016E"
+ "xtensionRange\022\r\n\005start\030\001 \001(\005\022\013\n\003end\030\002 \001("
+ "\005\0227\n\007options\030\003 \001(\0132&.google.protobuf.Ext"
+ "ensionRangeOptions\032+\n\rReservedRange\022\r\n\005s"
+ "tart\030\001 \001(\005\022\013\n\003end\030\002 \001(\005\"g\n\025ExtensionRang"
+ "eOptions\022C\n\024uninterpreted_option\030\347\007 \003(\0132"
+ "$.google.protobuf.UninterpretedOption*\t\010"
+ "\350\007\020\200\200\200\200\002\"\325\005\n\024FieldDescriptorProto\022\014\n\004nam"
+ "e\030\001 \001(\t\022\016\n\006number\030\003 \001(\005\022:\n\005label\030\004 \001(\0162+"
+ ".google.protobuf.FieldDescriptorProto.La"
+ "bel\0228\n\004type\030\005 \001(\0162*.google.protobuf.Fiel"
+ "dDescriptorProto.Type\022\021\n\ttype_name\030\006 \001(\t"
+ "\022\020\n\010extendee\030\002 \001(\t\022\025\n\rdefault_value\030\007 \001("
+ "\t\022\023\n\013oneof_index\030\t \001(\005\022\021\n\tjson_name\030\n \001("
+ "\t\022.\n\007options\030\010 \001(\0132\035.google.protobuf.Fie"
+ "ldOptions\022\027\n\017proto3_optional\030\021 \001(\010\"\266\002\n\004T"
+ "ype\022\017\n\013TYPE_DOUBLE\020\001\022\016\n\nTYPE_FLOAT\020\002\022\016\n\n"
+ "TYPE_INT64\020\003\022\017\n\013TYPE_UINT64\020\004\022\016\n\nTYPE_IN"
+ "T32\020\005\022\020\n\014TYPE_FIXED64\020\006\022\020\n\014TYPE_FIXED32\020"
+ "\007\022\r\n\tTYPE_BOOL\020\010\022\017\n\013TYPE_STRING\020\t\022\016\n\nTYP"
+ "E_GROUP\020\n\022\020\n\014TYPE_MESSAGE\020\013\022\016\n\nTYPE_BYTE"
+ "S\020\014\022\017\n\013TYPE_UINT32\020\r\022\r\n\tTYPE_ENUM\020\016\022\021\n\rT"
+ "YPE_SFIXED32\020\017\022\021\n\rTYPE_SFIXED64\020\020\022\017\n\013TYP"
+ "E_SINT32\020\021\022\017\n\013TYPE_SINT64\020\022\"C\n\005Label\022\022\n\016"
+ "LABEL_OPTIONAL\020\001\022\022\n\016LABEL_REQUIRED\020\002\022\022\n\016"
+ "LABEL_REPEATED\020\003\"T\n\024OneofDescriptorProto"
+ "\022\014\n\004name\030\001 \001(\t\022.\n\007options\030\002 \001(\0132\035.google"
+ ".protobuf.OneofOptions\"\244\002\n\023EnumDescripto"
+ "rProto\022\014\n\004name\030\001 \001(\t\0228\n\005value\030\002 \003(\0132).go"
+ "ogle.protobuf.EnumValueDescriptorProto\022-"
+ "\n\007options\030\003 \001(\0132\034.google.protobuf.EnumOp"
+ "tions\022N\n\016reserved_range\030\004 \003(\01326.google.p"
+ "rotobuf.EnumDescriptorProto.EnumReserved"
+ "Range\022\025\n\rreserved_name\030\005 \003(\t\032/\n\021EnumRese"
+ "rvedRange\022\r\n\005start\030\001 \001(\005\022\013\n\003end\030\002 \001(\005\"l\n"
+ "\030EnumValueDescriptorProto\022\014\n\004name\030\001 \001(\t\022"
+ "\016\n\006number\030\002 \001(\005\0222\n\007options\030\003 \001(\0132!.googl"
+ "e.protobuf.EnumValueOptions\"\220\001\n\026ServiceD"
+ "escriptorProto\022\014\n\004name\030\001 \001(\t\0226\n\006method\030\002"
+ " \003(\0132&.google.protobuf.MethodDescriptorP"
+ "roto\0220\n\007options\030\003 \001(\0132\037.google.protobuf."
+ "ServiceOptions\"\301\001\n\025MethodDescriptorProto"
+ "\022\014\n\004name\030\001 \001(\t\022\022\n\ninput_type\030\002 \001(\t\022\023\n\013ou"
+ "tput_type\030\003 \001(\t\022/\n\007options\030\004 \001(\0132\036.googl"
+ "e.protobuf.MethodOptions\022\037\n\020client_strea"
+ "ming\030\005 \001(\010:\005false\022\037\n\020server_streaming\030\006 "
+ "\001(\010:\005false\"\245\006\n\013FileOptions\022\024\n\014java_packa"
+ "ge\030\001 \001(\t\022\034\n\024java_outer_classname\030\010 \001(\t\022\""
+ "\n\023java_multiple_files\030\n \001(\010:\005false\022)\n\035ja"
+ "va_generate_equals_and_hash\030\024 \001(\010B\002\030\001\022%\n"
+ "\026java_string_check_utf8\030\033 \001(\010:\005false\022F\n\014"
+ "optimize_for\030\t \001(\0162).google.protobuf.Fil"
+ "eOptions.OptimizeMode:\005SPEED\022\022\n\ngo_packa"
+ "ge\030\013 \001(\t\022\"\n\023cc_generic_services\030\020 \001(\010:\005f"
+ "alse\022$\n\025java_generic_services\030\021 \001(\010:\005fal"
+ "se\022\"\n\023py_generic_services\030\022 \001(\010:\005false\022#"
+ "\n\024php_generic_services\030* \001(\010:\005false\022\031\n\nd"
+ "eprecated\030\027 \001(\010:\005false\022\036\n\020cc_enable_aren"
+ "as\030\037 \001(\010:\004true\022\031\n\021objc_class_prefix\030$ \001("
+ "\t\022\030\n\020csharp_namespace\030% \001(\t\022\024\n\014swift_pre"
+ "fix\030\' \001(\t\022\030\n\020php_class_prefix\030( \001(\t\022\025\n\rp"
+ "hp_namespace\030) \001(\t\022\036\n\026php_metadata_names"
+ "pace\030, \001(\t\022\024\n\014ruby_package\030- \001(\t\022C\n\024unin"
+ "terpreted_option\030\347\007 \003(\0132$.google.protobu"
+ "f.UninterpretedOption\":\n\014OptimizeMode\022\t\n"
+ "\005SPEED\020\001\022\r\n\tCODE_SIZE\020\002\022\020\n\014LITE_RUNTIME\020"
+ "\003*\t\010\350\007\020\200\200\200\200\002J\004\010&\020\'\"\204\002\n\016MessageOptions\022&\n"
+ "\027message_set_wire_format\030\001 \001(\010:\005false\022.\n"
+ "\037no_standard_descriptor_accessor\030\002 \001(\010:\005"
+ "false\022\031\n\ndeprecated\030\003 \001(\010:\005false\022\021\n\tmap_"
+ "entry\030\007 \001(\010\022C\n\024uninterpreted_option\030\347\007 \003"
+ "(\0132$.google.protobuf.UninterpretedOption"
+ "*\t\010\350\007\020\200\200\200\200\002J\004\010\004\020\005J\004\010\005\020\006J\004\010\006\020\007J\004\010\010\020\tJ\004\010\t\020"
+ "\n\"\276\003\n\014FieldOptions\022:\n\005ctype\030\001 \001(\0162#.goog"
+ "le.protobuf.FieldOptions.CType:\006STRING\022\016"
+ "\n\006packed\030\002 \001(\010\022\?\n\006jstype\030\006 \001(\0162$.google."
+ "protobuf.FieldOptions.JSType:\tJS_NORMAL\022"
+ "\023\n\004lazy\030\005 \001(\010:\005false\022\036\n\017unverified_lazy\030"
+ "\017 \001(\010:\005false\022\031\n\ndeprecated\030\003 \001(\010:\005false\022"
+ "\023\n\004weak\030\n \001(\010:\005false\022C\n\024uninterpreted_op"
+ "tion\030\347\007 \003(\0132$.google.protobuf.Uninterpre"
+ "tedOption\"/\n\005CType\022\n\n\006STRING\020\000\022\010\n\004CORD\020\001"
+ "\022\020\n\014STRING_PIECE\020\002\"5\n\006JSType\022\r\n\tJS_NORMA"
+ "L\020\000\022\r\n\tJS_STRING\020\001\022\r\n\tJS_NUMBER\020\002*\t\010\350\007\020\200"
+ "\200\200\200\002J\004\010\004\020\005\"^\n\014OneofOptions\022C\n\024uninterpre"
+ "ted_option\030\347\007 \003(\0132$.google.protobuf.Unin"
+ "terpretedOption*\t\010\350\007\020\200\200\200\200\002\"\223\001\n\013EnumOptio"
+ "ns\022\023\n\013allow_alias\030\002 \001(\010\022\031\n\ndeprecated\030\003 "
+ "\001(\010:\005false\022C\n\024uninterpreted_option\030\347\007 \003("
+ "\0132$.google.protobuf.UninterpretedOption*"
+ "\t\010\350\007\020\200\200\200\200\002J\004\010\005\020\006\"}\n\020EnumValueOptions\022\031\n\n"
+ "deprecated\030\001 \001(\010:\005false\022C\n\024uninterpreted"
+ "_option\030\347\007 \003(\0132$.google.protobuf.Uninter"
+ "pretedOption*\t\010\350\007\020\200\200\200\200\002\"{\n\016ServiceOption"
+ "s\022\031\n\ndeprecated\030! \001(\010:\005false\022C\n\024uninterp"
+ "reted_option\030\347\007 \003(\0132$.google.protobuf.Un"
+ "interpretedOption*\t\010\350\007\020\200\200\200\200\002\"\255\002\n\rMethodO"
+ "ptions\022\031\n\ndeprecated\030! \001(\010:\005false\022_\n\021ide"
+ "mpotency_level\030\" \001(\0162/.google.protobuf.M"
+ "ethodOptions.IdempotencyLevel:\023IDEMPOTEN"
+ "CY_UNKNOWN\022C\n\024uninterpreted_option\030\347\007 \003("
+ "\0132$.google.protobuf.UninterpretedOption\""
+ "P\n\020IdempotencyLevel\022\027\n\023IDEMPOTENCY_UNKNO"
+ "WN\020\000\022\023\n\017NO_SIDE_EFFECTS\020\001\022\016\n\nIDEMPOTENT\020"
+ "\002*\t\010\350\007\020\200\200\200\200\002\"\236\002\n\023UninterpretedOption\022;\n\004"
+ "name\030\002 \003(\0132-.google.protobuf.Uninterpret"
+ "edOption.NamePart\022\030\n\020identifier_value\030\003 "
+ "\001(\t\022\032\n\022positive_int_value\030\004 \001(\004\022\032\n\022negat"
+ "ive_int_value\030\005 \001(\003\022\024\n\014double_value\030\006 \001("
+ "\001\022\024\n\014string_value\030\007 \001(\014\022\027\n\017aggregate_val"
+ "ue\030\010 \001(\t\0323\n\010NamePart\022\021\n\tname_part\030\001 \002(\t\022"
+ "\024\n\014is_extension\030\002 \002(\010\"\325\001\n\016SourceCodeInfo"
+ "\022:\n\010location\030\001 \003(\0132(.google.protobuf.Sou"
+ "rceCodeInfo.Location\032\206\001\n\010Location\022\020\n\004pat"
+ "h\030\001 \003(\005B\002\020\001\022\020\n\004span\030\002 \003(\005B\002\020\001\022\030\n\020leading"
+ "_comments\030\003 \001(\t\022\031\n\021trailing_comments\030\004 \001"
+ "(\t\022!\n\031leading_detached_comments\030\006 \003(\t\"\234\002"
+ "\n\021GeneratedCodeInfo\022A\n\nannotation\030\001 \003(\0132"
+ "-.google.protobuf.GeneratedCodeInfo.Anno"
+ "tation\032\303\001\n\nAnnotation\022\020\n\004path\030\001 \003(\005B\002\020\001\022"
+ "\023\n\013source_file\030\002 \001(\t\022\r\n\005begin\030\003 \001(\005\022\013\n\003e"
+ "nd\030\004 \001(\005\022H\n\010semantic\030\005 \001(\01626.google.prot"
+ "obuf.GeneratedCodeInfo.Annotation.Semant"
+ "ic\"(\n\010Semantic\022\010\n\004NONE\020\000\022\007\n\003SET\020\001\022\t\n\005ALI"
+ "AS\020\002B~\n\023com.google.protobufB\020DescriptorP"
+ "rotosH\001Z-google.golang.org/protobuf/type"
+ "s/descriptorpb\370\001\001\242\002\003GPB\252\002\032Google.Protobu"
+ "f.Reflection"
+};
+static ::absl::once_flag descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_once;
const ::_pbi::DescriptorTable descriptor_table_google_2fprotobuf_2fdescriptor_2eproto = {
- false, false, 6078, descriptor_table_protodef_google_2fprotobuf_2fdescriptor_2eproto,
+ false,
+ false,
+ 6212,
+ descriptor_table_protodef_google_2fprotobuf_2fdescriptor_2eproto,
"google/protobuf/descriptor.proto",
- &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_once, nullptr, 0, 27,
- schemas, file_default_instances, TableStruct_google_2fprotobuf_2fdescriptor_2eproto::offsets,
- file_level_metadata_google_2fprotobuf_2fdescriptor_2eproto, file_level_enum_descriptors_google_2fprotobuf_2fdescriptor_2eproto,
+ &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_once,
+ nullptr,
+ 0,
+ 27,
+ schemas,
+ file_default_instances,
+ TableStruct_google_2fprotobuf_2fdescriptor_2eproto::offsets,
+ file_level_metadata_google_2fprotobuf_2fdescriptor_2eproto,
+ file_level_enum_descriptors_google_2fprotobuf_2fdescriptor_2eproto,
file_level_service_descriptors_google_2fprotobuf_2fdescriptor_2eproto,
};
+
+// This function exists to be marked as weak.
+// It can significantly speed up compilation by breaking up LLVM's SCC
+// in the .pb.cc translation units. Large translation units see a
+// reduction of more than 35% of walltime for optimized builds. Without
+// the weak attribute all the messages in the file, including all the
+// vtables and everything they use become part of the same SCC through
+// a cycle like:
+// GetMetadata -> descriptor table -> default instances ->
+// vtables -> GetMetadata
+// By adding a weak function here we break the connection from the
+// individual vtables back into the descriptor table.
PROTOBUF_ATTRIBUTE_WEAK const ::_pbi::DescriptorTable* descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_getter() {
return &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto;
}
-
// Force running AddDescriptors() at dynamic initialization time.
-PROTOBUF_ATTRIBUTE_INIT_PRIORITY2 static ::_pbi::AddDescriptorsRunner dynamic_init_dummy_google_2fprotobuf_2fdescriptor_2eproto(&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto);
+PROTOBUF_ATTRIBUTE_INIT_PRIORITY2
+static ::_pbi::AddDescriptorsRunner dynamic_init_dummy_google_2fprotobuf_2fdescriptor_2eproto(&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto);
PROTOBUF_NAMESPACE_OPEN
const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* FieldDescriptorProto_Type_descriptor() {
::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto);
@@ -1319,7 +1431,29 @@
constexpr MethodOptions_IdempotencyLevel MethodOptions::IdempotencyLevel_MAX;
constexpr int MethodOptions::IdempotencyLevel_ARRAYSIZE;
#endif // (__cplusplus < 201703) && (!defined(_MSC_VER) || (_MSC_VER >= 1900 && _MSC_VER < 1912))
+const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* GeneratedCodeInfo_Annotation_Semantic_descriptor() {
+ ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto);
+ return file_level_enum_descriptors_google_2fprotobuf_2fdescriptor_2eproto[6];
+}
+bool GeneratedCodeInfo_Annotation_Semantic_IsValid(int value) {
+ switch (value) {
+ case 0:
+ case 1:
+ case 2:
+ return true;
+ default:
+ return false;
+ }
+}
+#if (__cplusplus < 201703) && (!defined(_MSC_VER) || (_MSC_VER >= 1900 && _MSC_VER < 1912))
+constexpr GeneratedCodeInfo_Annotation_Semantic GeneratedCodeInfo_Annotation::NONE;
+constexpr GeneratedCodeInfo_Annotation_Semantic GeneratedCodeInfo_Annotation::SET;
+constexpr GeneratedCodeInfo_Annotation_Semantic GeneratedCodeInfo_Annotation::ALIAS;
+constexpr GeneratedCodeInfo_Annotation_Semantic GeneratedCodeInfo_Annotation::Semantic_MIN;
+constexpr GeneratedCodeInfo_Annotation_Semantic GeneratedCodeInfo_Annotation::Semantic_MAX;
+constexpr int GeneratedCodeInfo_Annotation::Semantic_ARRAYSIZE;
+#endif // (__cplusplus < 201703) && (!defined(_MSC_VER) || (_MSC_VER >= 1900 && _MSC_VER < 1912))
// ===================================================================
class FileDescriptorSet::_Internal {
@@ -1506,12 +1640,13 @@
&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_getter, &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_once,
file_level_metadata_google_2fprotobuf_2fdescriptor_2eproto[0]);
}
-
// ===================================================================
class FileDescriptorProto::_Internal {
public:
using HasBits = decltype(std::declval<FileDescriptorProto>()._impl_._has_bits_);
+ static constexpr int32_t kHasBitsOffset =
+ 8 * PROTOBUF_FIELD_OFFSET(FileDescriptorProto, _impl_._has_bits_);
static void set_has_name(HasBits* has_bits) {
(*has_bits)[0] |= 1u;
}
@@ -1520,15 +1655,18 @@
}
static const ::PROTOBUF_NAMESPACE_ID::FileOptions& options(const FileDescriptorProto* msg);
static void set_has_options(HasBits* has_bits) {
- (*has_bits)[0] |= 8u;
+ (*has_bits)[0] |= 16u;
}
static const ::PROTOBUF_NAMESPACE_ID::SourceCodeInfo& source_code_info(const FileDescriptorProto* msg);
static void set_has_source_code_info(HasBits* has_bits) {
- (*has_bits)[0] |= 16u;
+ (*has_bits)[0] |= 32u;
}
static void set_has_syntax(HasBits* has_bits) {
(*has_bits)[0] |= 4u;
}
+ static void set_has_edition(HasBits* has_bits) {
+ (*has_bits)[0] |= 8u;
+ }
};
const ::PROTOBUF_NAMESPACE_ID::FileOptions&
@@ -1561,6 +1699,7 @@
, decltype(_impl_.name_){}
, decltype(_impl_.package_){}
, decltype(_impl_.syntax_){}
+ , decltype(_impl_.edition_){}
, decltype(_impl_.options_){nullptr}
, decltype(_impl_.source_code_info_){nullptr}};
@@ -1589,6 +1728,14 @@
_this->_impl_.syntax_.Set(from._internal_syntax(),
_this->GetArenaForAllocation());
}
+ _impl_.edition_.InitDefault();
+ #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
+ _impl_.edition_.Set("", GetArenaForAllocation());
+ #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
+ if (from._internal_has_edition()) {
+ _this->_impl_.edition_.Set(from._internal_edition(),
+ _this->GetArenaForAllocation());
+ }
if (from._internal_has_options()) {
_this->_impl_.options_ = new ::PROTOBUF_NAMESPACE_ID::FileOptions(*from._impl_.options_);
}
@@ -1615,6 +1762,7 @@
, decltype(_impl_.name_){}
, decltype(_impl_.package_){}
, decltype(_impl_.syntax_){}
+ , decltype(_impl_.edition_){}
, decltype(_impl_.options_){nullptr}
, decltype(_impl_.source_code_info_){nullptr}
};
@@ -1630,6 +1778,10 @@
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
_impl_.syntax_.Set("", GetArenaForAllocation());
#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
+ _impl_.edition_.InitDefault();
+ #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
+ _impl_.edition_.Set("", GetArenaForAllocation());
+ #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
}
FileDescriptorProto::~FileDescriptorProto() {
@@ -1653,6 +1805,7 @@
_impl_.name_.Destroy();
_impl_.package_.Destroy();
_impl_.syntax_.Destroy();
+ _impl_.edition_.Destroy();
if (this != internal_default_instance()) delete _impl_.options_;
if (this != internal_default_instance()) delete _impl_.source_code_info_;
}
@@ -1675,7 +1828,7 @@
_impl_.public_dependency_.Clear();
_impl_.weak_dependency_.Clear();
cached_has_bits = _impl_._has_bits_[0];
- if (cached_has_bits & 0x0000001fu) {
+ if (cached_has_bits & 0x0000003fu) {
if (cached_has_bits & 0x00000001u) {
_impl_.name_.ClearNonDefaultToEmpty();
}
@@ -1686,10 +1839,13 @@
_impl_.syntax_.ClearNonDefaultToEmpty();
}
if (cached_has_bits & 0x00000008u) {
+ _impl_.edition_.ClearNonDefaultToEmpty();
+ }
+ if (cached_has_bits & 0x00000010u) {
GOOGLE_DCHECK(_impl_.options_ != nullptr);
_impl_.options_->Clear();
}
- if (cached_has_bits & 0x00000010u) {
+ if (cached_has_bits & 0x00000020u) {
GOOGLE_DCHECK(_impl_.source_code_info_ != nullptr);
_impl_.source_code_info_->Clear();
}
@@ -1858,6 +2014,18 @@
} else
goto handle_unusual;
continue;
+ // optional string edition = 13;
+ case 13:
+ if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 106)) {
+ auto str = _internal_mutable_edition();
+ ptr = ::_pbi::InlineGreedyStringParser(str, ptr, ctx);
+ CHK_(ptr);
+ #ifndef NDEBUG
+ ::_pbi::VerifyUTF8(str, "google.protobuf.FileDescriptorProto.edition");
+ #endif // !NDEBUG
+ } else
+ goto handle_unusual;
+ continue;
default:
goto handle_unusual;
} // switch
@@ -1952,14 +2120,14 @@
}
// optional .google.protobuf.FileOptions options = 8;
- if (cached_has_bits & 0x00000008u) {
+ if (cached_has_bits & 0x00000010u) {
target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
InternalWriteMessage(8, _Internal::options(this),
_Internal::options(this).GetCachedSize(), target, stream);
}
// optional .google.protobuf.SourceCodeInfo source_code_info = 9;
- if (cached_has_bits & 0x00000010u) {
+ if (cached_has_bits & 0x00000020u) {
target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
InternalWriteMessage(9, _Internal::source_code_info(this),
_Internal::source_code_info(this).GetCachedSize(), target, stream);
@@ -1987,6 +2155,16 @@
12, this->_internal_syntax(), target);
}
+ // optional string edition = 13;
+ if (cached_has_bits & 0x00000008u) {
+ ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::VerifyUTF8StringNamedField(
+ this->_internal_edition().data(), static_cast<int>(this->_internal_edition().length()),
+ ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::SERIALIZE,
+ "google.protobuf.FileDescriptorProto.edition");
+ target = stream->WriteStringMaybeAliased(
+ 13, this->_internal_edition(), target);
+ }
+
if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) {
target = ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
_internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream);
@@ -2058,7 +2236,7 @@
}
cached_has_bits = _impl_._has_bits_[0];
- if (cached_has_bits & 0x0000001fu) {
+ if (cached_has_bits & 0x0000003fu) {
// optional string name = 1;
if (cached_has_bits & 0x00000001u) {
total_size += 1 +
@@ -2080,15 +2258,22 @@
this->_internal_syntax());
}
- // optional .google.protobuf.FileOptions options = 8;
+ // optional string edition = 13;
if (cached_has_bits & 0x00000008u) {
total_size += 1 +
+ ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::StringSize(
+ this->_internal_edition());
+ }
+
+ // optional .google.protobuf.FileOptions options = 8;
+ if (cached_has_bits & 0x00000010u) {
+ total_size += 1 +
::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(
*_impl_.options_);
}
// optional .google.protobuf.SourceCodeInfo source_code_info = 9;
- if (cached_has_bits & 0x00000010u) {
+ if (cached_has_bits & 0x00000020u) {
total_size += 1 +
::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(
*_impl_.source_code_info_);
@@ -2121,7 +2306,7 @@
_this->_impl_.public_dependency_.MergeFrom(from._impl_.public_dependency_);
_this->_impl_.weak_dependency_.MergeFrom(from._impl_.weak_dependency_);
cached_has_bits = from._impl_._has_bits_[0];
- if (cached_has_bits & 0x0000001fu) {
+ if (cached_has_bits & 0x0000003fu) {
if (cached_has_bits & 0x00000001u) {
_this->_internal_set_name(from._internal_name());
}
@@ -2132,10 +2317,13 @@
_this->_internal_set_syntax(from._internal_syntax());
}
if (cached_has_bits & 0x00000008u) {
+ _this->_internal_set_edition(from._internal_edition());
+ }
+ if (cached_has_bits & 0x00000010u) {
_this->_internal_mutable_options()->::PROTOBUF_NAMESPACE_ID::FileOptions::MergeFrom(
from._internal_options());
}
- if (cached_has_bits & 0x00000010u) {
+ if (cached_has_bits & 0x00000020u) {
_this->_internal_mutable_source_code_info()->::PROTOBUF_NAMESPACE_ID::SourceCodeInfo::MergeFrom(
from._internal_source_code_info());
}
@@ -2190,6 +2378,10 @@
&_impl_.syntax_, lhs_arena,
&other->_impl_.syntax_, rhs_arena
);
+ ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr::InternalSwap(
+ &_impl_.edition_, lhs_arena,
+ &other->_impl_.edition_, rhs_arena
+ );
::PROTOBUF_NAMESPACE_ID::internal::memswap<
PROTOBUF_FIELD_OFFSET(FileDescriptorProto, _impl_.source_code_info_)
+ sizeof(FileDescriptorProto::_impl_.source_code_info_)
@@ -2203,12 +2395,13 @@
&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_getter, &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_once,
file_level_metadata_google_2fprotobuf_2fdescriptor_2eproto[1]);
}
-
// ===================================================================
class DescriptorProto_ExtensionRange::_Internal {
public:
using HasBits = decltype(std::declval<DescriptorProto_ExtensionRange>()._impl_._has_bits_);
+ static constexpr int32_t kHasBitsOffset =
+ 8 * PROTOBUF_FIELD_OFFSET(DescriptorProto_ExtensionRange, _impl_._has_bits_);
static void set_has_start(HasBits* has_bits) {
(*has_bits)[0] |= 2u;
}
@@ -2487,12 +2680,13 @@
&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_getter, &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_once,
file_level_metadata_google_2fprotobuf_2fdescriptor_2eproto[2]);
}
-
// ===================================================================
class DescriptorProto_ReservedRange::_Internal {
public:
using HasBits = decltype(std::declval<DescriptorProto_ReservedRange>()._impl_._has_bits_);
+ static constexpr int32_t kHasBitsOffset =
+ 8 * PROTOBUF_FIELD_OFFSET(DescriptorProto_ReservedRange, _impl_._has_bits_);
static void set_has_start(HasBits* has_bits) {
(*has_bits)[0] |= 1u;
}
@@ -2724,12 +2918,13 @@
&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_getter, &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_once,
file_level_metadata_google_2fprotobuf_2fdescriptor_2eproto[3]);
}
-
// ===================================================================
class DescriptorProto::_Internal {
public:
using HasBits = decltype(std::declval<DescriptorProto>()._impl_._has_bits_);
+ static constexpr int32_t kHasBitsOffset =
+ 8 * PROTOBUF_FIELD_OFFSET(DescriptorProto, _impl_._has_bits_);
static void set_has_name(HasBits* has_bits) {
(*has_bits)[0] |= 1u;
}
@@ -3290,7 +3485,6 @@
&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_getter, &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_once,
file_level_metadata_google_2fprotobuf_2fdescriptor_2eproto[4]);
}
-
// ===================================================================
class ExtensionRangeOptions::_Internal {
@@ -3499,12 +3693,13 @@
&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_getter, &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_once,
file_level_metadata_google_2fprotobuf_2fdescriptor_2eproto[5]);
}
-
// ===================================================================
class FieldDescriptorProto::_Internal {
public:
using HasBits = decltype(std::declval<FieldDescriptorProto>()._impl_._has_bits_);
+ static constexpr int32_t kHasBitsOffset =
+ 8 * PROTOBUF_FIELD_OFFSET(FieldDescriptorProto, _impl_._has_bits_);
static void set_has_name(HasBits* has_bits) {
(*has_bits)[0] |= 1u;
}
@@ -3768,9 +3963,9 @@
// optional .google.protobuf.FieldDescriptorProto.Label label = 4;
case 4:
if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 32)) {
- uint64_t val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr);
+ uint32_t val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr);
CHK_(ptr);
- if (PROTOBUF_PREDICT_TRUE(::PROTOBUF_NAMESPACE_ID::FieldDescriptorProto_Label_IsValid(val))) {
+ if (PROTOBUF_PREDICT_TRUE(::PROTOBUF_NAMESPACE_ID::FieldDescriptorProto_Label_IsValid(static_cast<int>(val)))) {
_internal_set_label(static_cast<::PROTOBUF_NAMESPACE_ID::FieldDescriptorProto_Label>(val));
} else {
::PROTOBUF_NAMESPACE_ID::internal::WriteVarint(4, val, mutable_unknown_fields());
@@ -3781,9 +3976,9 @@
// optional .google.protobuf.FieldDescriptorProto.Type type = 5;
case 5:
if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 40)) {
- uint64_t val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr);
+ uint32_t val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr);
CHK_(ptr);
- if (PROTOBUF_PREDICT_TRUE(::PROTOBUF_NAMESPACE_ID::FieldDescriptorProto_Type_IsValid(val))) {
+ if (PROTOBUF_PREDICT_TRUE(::PROTOBUF_NAMESPACE_ID::FieldDescriptorProto_Type_IsValid(static_cast<int>(val)))) {
_internal_set_type(static_cast<::PROTOBUF_NAMESPACE_ID::FieldDescriptorProto_Type>(val));
} else {
::PROTOBUF_NAMESPACE_ID::internal::WriteVarint(5, val, mutable_unknown_fields());
@@ -4180,12 +4375,13 @@
&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_getter, &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_once,
file_level_metadata_google_2fprotobuf_2fdescriptor_2eproto[6]);
}
-
// ===================================================================
class OneofDescriptorProto::_Internal {
public:
using HasBits = decltype(std::declval<OneofDescriptorProto>()._impl_._has_bits_);
+ static constexpr int32_t kHasBitsOffset =
+ 8 * PROTOBUF_FIELD_OFFSET(OneofDescriptorProto, _impl_._has_bits_);
static void set_has_name(HasBits* has_bits) {
(*has_bits)[0] |= 1u;
}
@@ -4455,12 +4651,13 @@
&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_getter, &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_once,
file_level_metadata_google_2fprotobuf_2fdescriptor_2eproto[7]);
}
-
// ===================================================================
class EnumDescriptorProto_EnumReservedRange::_Internal {
public:
using HasBits = decltype(std::declval<EnumDescriptorProto_EnumReservedRange>()._impl_._has_bits_);
+ static constexpr int32_t kHasBitsOffset =
+ 8 * PROTOBUF_FIELD_OFFSET(EnumDescriptorProto_EnumReservedRange, _impl_._has_bits_);
static void set_has_start(HasBits* has_bits) {
(*has_bits)[0] |= 1u;
}
@@ -4692,12 +4889,13 @@
&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_getter, &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_once,
file_level_metadata_google_2fprotobuf_2fdescriptor_2eproto[8]);
}
-
// ===================================================================
class EnumDescriptorProto::_Internal {
public:
using HasBits = decltype(std::declval<EnumDescriptorProto>()._impl_._has_bits_);
+ static constexpr int32_t kHasBitsOffset =
+ 8 * PROTOBUF_FIELD_OFFSET(EnumDescriptorProto, _impl_._has_bits_);
static void set_has_name(HasBits* has_bits) {
(*has_bits)[0] |= 1u;
}
@@ -5078,12 +5276,13 @@
&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_getter, &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_once,
file_level_metadata_google_2fprotobuf_2fdescriptor_2eproto[9]);
}
-
// ===================================================================
class EnumValueDescriptorProto::_Internal {
public:
using HasBits = decltype(std::declval<EnumValueDescriptorProto>()._impl_._has_bits_);
+ static constexpr int32_t kHasBitsOffset =
+ 8 * PROTOBUF_FIELD_OFFSET(EnumValueDescriptorProto, _impl_._has_bits_);
static void set_has_name(HasBits* has_bits) {
(*has_bits)[0] |= 1u;
}
@@ -5389,12 +5588,13 @@
&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_getter, &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_once,
file_level_metadata_google_2fprotobuf_2fdescriptor_2eproto[10]);
}
-
// ===================================================================
class ServiceDescriptorProto::_Internal {
public:
using HasBits = decltype(std::declval<ServiceDescriptorProto>()._impl_._has_bits_);
+ static constexpr int32_t kHasBitsOffset =
+ 8 * PROTOBUF_FIELD_OFFSET(ServiceDescriptorProto, _impl_._has_bits_);
static void set_has_name(HasBits* has_bits) {
(*has_bits)[0] |= 1u;
}
@@ -5700,12 +5900,13 @@
&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_getter, &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_once,
file_level_metadata_google_2fprotobuf_2fdescriptor_2eproto[11]);
}
-
// ===================================================================
class MethodDescriptorProto::_Internal {
public:
using HasBits = decltype(std::declval<MethodDescriptorProto>()._impl_._has_bits_);
+ static constexpr int32_t kHasBitsOffset =
+ 8 * PROTOBUF_FIELD_OFFSET(MethodDescriptorProto, _impl_._has_bits_);
static void set_has_name(HasBits* has_bits) {
(*has_bits)[0] |= 1u;
}
@@ -6157,12 +6358,13 @@
&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_getter, &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_once,
file_level_metadata_google_2fprotobuf_2fdescriptor_2eproto[12]);
}
-
// ===================================================================
class FileOptions::_Internal {
public:
using HasBits = decltype(std::declval<FileOptions>()._impl_._has_bits_);
+ static constexpr int32_t kHasBitsOffset =
+ 8 * PROTOBUF_FIELD_OFFSET(FileOptions, _impl_._has_bits_);
static void set_has_java_package(HasBits* has_bits) {
(*has_bits)[0] |= 1u;
}
@@ -6542,9 +6744,9 @@
// optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED];
case 9:
if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 72)) {
- uint64_t val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr);
+ uint32_t val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr);
CHK_(ptr);
- if (PROTOBUF_PREDICT_TRUE(::PROTOBUF_NAMESPACE_ID::FileOptions_OptimizeMode_IsValid(val))) {
+ if (PROTOBUF_PREDICT_TRUE(::PROTOBUF_NAMESPACE_ID::FileOptions_OptimizeMode_IsValid(static_cast<int>(val)))) {
_internal_set_optimize_for(static_cast<::PROTOBUF_NAMESPACE_ID::FileOptions_OptimizeMode>(val));
} else {
::PROTOBUF_NAMESPACE_ID::internal::WriteVarint(9, val, mutable_unknown_fields());
@@ -7276,12 +7478,13 @@
&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_getter, &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_once,
file_level_metadata_google_2fprotobuf_2fdescriptor_2eproto[13]);
}
-
// ===================================================================
class MessageOptions::_Internal {
public:
using HasBits = decltype(std::declval<MessageOptions>()._impl_._has_bits_);
+ static constexpr int32_t kHasBitsOffset =
+ 8 * PROTOBUF_FIELD_OFFSET(MessageOptions, _impl_._has_bits_);
static void set_has_message_set_wire_format(HasBits* has_bits) {
(*has_bits)[0] |= 1u;
}
@@ -7624,12 +7827,13 @@
&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_getter, &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_once,
file_level_metadata_google_2fprotobuf_2fdescriptor_2eproto[14]);
}
-
// ===================================================================
class FieldOptions::_Internal {
public:
using HasBits = decltype(std::declval<FieldOptions>()._impl_._has_bits_);
+ static constexpr int32_t kHasBitsOffset =
+ 8 * PROTOBUF_FIELD_OFFSET(FieldOptions, _impl_._has_bits_);
static void set_has_ctype(HasBits* has_bits) {
(*has_bits)[0] |= 1u;
}
@@ -7749,9 +7953,9 @@
// optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING];
case 1:
if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 8)) {
- uint64_t val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr);
+ uint32_t val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr);
CHK_(ptr);
- if (PROTOBUF_PREDICT_TRUE(::PROTOBUF_NAMESPACE_ID::FieldOptions_CType_IsValid(val))) {
+ if (PROTOBUF_PREDICT_TRUE(::PROTOBUF_NAMESPACE_ID::FieldOptions_CType_IsValid(static_cast<int>(val)))) {
_internal_set_ctype(static_cast<::PROTOBUF_NAMESPACE_ID::FieldOptions_CType>(val));
} else {
::PROTOBUF_NAMESPACE_ID::internal::WriteVarint(1, val, mutable_unknown_fields());
@@ -7789,9 +7993,9 @@
// optional .google.protobuf.FieldOptions.JSType jstype = 6 [default = JS_NORMAL];
case 6:
if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 48)) {
- uint64_t val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr);
+ uint32_t val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr);
CHK_(ptr);
- if (PROTOBUF_PREDICT_TRUE(::PROTOBUF_NAMESPACE_ID::FieldOptions_JSType_IsValid(val))) {
+ if (PROTOBUF_PREDICT_TRUE(::PROTOBUF_NAMESPACE_ID::FieldOptions_JSType_IsValid(static_cast<int>(val)))) {
_internal_set_jstype(static_cast<::PROTOBUF_NAMESPACE_ID::FieldOptions_JSType>(val));
} else {
::PROTOBUF_NAMESPACE_ID::internal::WriteVarint(6, val, mutable_unknown_fields());
@@ -8071,7 +8275,6 @@
&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_getter, &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_once,
file_level_metadata_google_2fprotobuf_2fdescriptor_2eproto[15]);
}
-
// ===================================================================
class OneofOptions::_Internal {
@@ -8280,12 +8483,13 @@
&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_getter, &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_once,
file_level_metadata_google_2fprotobuf_2fdescriptor_2eproto[16]);
}
-
// ===================================================================
class EnumOptions::_Internal {
public:
using HasBits = decltype(std::declval<EnumOptions>()._impl_._has_bits_);
+ static constexpr int32_t kHasBitsOffset =
+ 8 * PROTOBUF_FIELD_OFFSET(EnumOptions, _impl_._has_bits_);
static void set_has_allow_alias(HasBits* has_bits) {
(*has_bits)[0] |= 1u;
}
@@ -8572,12 +8776,13 @@
&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_getter, &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_once,
file_level_metadata_google_2fprotobuf_2fdescriptor_2eproto[17]);
}
-
// ===================================================================
class EnumValueOptions::_Internal {
public:
using HasBits = decltype(std::declval<EnumValueOptions>()._impl_._has_bits_);
+ static constexpr int32_t kHasBitsOffset =
+ 8 * PROTOBUF_FIELD_OFFSET(EnumValueOptions, _impl_._has_bits_);
static void set_has_deprecated(HasBits* has_bits) {
(*has_bits)[0] |= 1u;
}
@@ -8821,12 +9026,13 @@
&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_getter, &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_once,
file_level_metadata_google_2fprotobuf_2fdescriptor_2eproto[18]);
}
-
// ===================================================================
class ServiceOptions::_Internal {
public:
using HasBits = decltype(std::declval<ServiceOptions>()._impl_._has_bits_);
+ static constexpr int32_t kHasBitsOffset =
+ 8 * PROTOBUF_FIELD_OFFSET(ServiceOptions, _impl_._has_bits_);
static void set_has_deprecated(HasBits* has_bits) {
(*has_bits)[0] |= 1u;
}
@@ -9070,12 +9276,13 @@
&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_getter, &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_once,
file_level_metadata_google_2fprotobuf_2fdescriptor_2eproto[19]);
}
-
// ===================================================================
class MethodOptions::_Internal {
public:
using HasBits = decltype(std::declval<MethodOptions>()._impl_._has_bits_);
+ static constexpr int32_t kHasBitsOffset =
+ 8 * PROTOBUF_FIELD_OFFSET(MethodOptions, _impl_._has_bits_);
static void set_has_deprecated(HasBits* has_bits) {
(*has_bits)[0] |= 1u;
}
@@ -9179,9 +9386,9 @@
// optional .google.protobuf.MethodOptions.IdempotencyLevel idempotency_level = 34 [default = IDEMPOTENCY_UNKNOWN];
case 34:
if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 16)) {
- uint64_t val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr);
+ uint32_t val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr);
CHK_(ptr);
- if (PROTOBUF_PREDICT_TRUE(::PROTOBUF_NAMESPACE_ID::MethodOptions_IdempotencyLevel_IsValid(val))) {
+ if (PROTOBUF_PREDICT_TRUE(::PROTOBUF_NAMESPACE_ID::MethodOptions_IdempotencyLevel_IsValid(static_cast<int>(val)))) {
_internal_set_idempotency_level(static_cast<::PROTOBUF_NAMESPACE_ID::MethodOptions_IdempotencyLevel>(val));
} else {
::PROTOBUF_NAMESPACE_ID::internal::WriteVarint(34, val, mutable_unknown_fields());
@@ -9371,12 +9578,13 @@
&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_getter, &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_once,
file_level_metadata_google_2fprotobuf_2fdescriptor_2eproto[20]);
}
-
// ===================================================================
class UninterpretedOption_NamePart::_Internal {
public:
using HasBits = decltype(std::declval<UninterpretedOption_NamePart>()._impl_._has_bits_);
+ static constexpr int32_t kHasBitsOffset =
+ 8 * PROTOBUF_FIELD_OFFSET(UninterpretedOption_NamePart, _impl_._has_bits_);
static void set_has_name_part(HasBits* has_bits) {
(*has_bits)[0] |= 1u;
}
@@ -9647,12 +9855,13 @@
&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_getter, &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_once,
file_level_metadata_google_2fprotobuf_2fdescriptor_2eproto[21]);
}
-
// ===================================================================
class UninterpretedOption::_Internal {
public:
using HasBits = decltype(std::declval<UninterpretedOption>()._impl_._has_bits_);
+ static constexpr int32_t kHasBitsOffset =
+ 8 * PROTOBUF_FIELD_OFFSET(UninterpretedOption, _impl_._has_bits_);
static void set_has_identifier_value(HasBits* has_bits) {
(*has_bits)[0] |= 1u;
}
@@ -10116,12 +10325,13 @@
&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_getter, &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_once,
file_level_metadata_google_2fprotobuf_2fdescriptor_2eproto[22]);
}
-
// ===================================================================
class SourceCodeInfo_Location::_Internal {
public:
using HasBits = decltype(std::declval<SourceCodeInfo_Location>()._impl_._has_bits_);
+ static constexpr int32_t kHasBitsOffset =
+ 8 * PROTOBUF_FIELD_OFFSET(SourceCodeInfo_Location, _impl_._has_bits_);
static void set_has_leading_comments(HasBits* has_bits) {
(*has_bits)[0] |= 1u;
}
@@ -10341,7 +10551,7 @@
// repeated int32 path = 1 [packed = true];
{
- int byte_size = _impl_._path_cached_byte_size_.load(std::memory_order_relaxed);
+ int byte_size = _impl_._path_cached_byte_size_.Get();
if (byte_size > 0) {
target = stream->WriteInt32Packed(
1, _internal_path(), byte_size, target);
@@ -10350,7 +10560,7 @@
// repeated int32 span = 2 [packed = true];
{
- int byte_size = _impl_._span_cached_byte_size_.load(std::memory_order_relaxed);
+ int byte_size = _impl_._span_cached_byte_size_.Get();
if (byte_size > 0) {
target = stream->WriteInt32Packed(
2, _internal_span(), byte_size, target);
@@ -10413,8 +10623,7 @@
::_pbi::WireFormatLite::Int32Size(static_cast<int32_t>(data_size));
}
int cached_size = ::_pbi::ToCachedSize(data_size);
- _impl_._path_cached_byte_size_.store(cached_size,
- std::memory_order_relaxed);
+ _impl_._path_cached_byte_size_.Set(cached_size);
total_size += data_size;
}
@@ -10427,8 +10636,7 @@
::_pbi::WireFormatLite::Int32Size(static_cast<int32_t>(data_size));
}
int cached_size = ::_pbi::ToCachedSize(data_size);
- _impl_._span_cached_byte_size_.store(cached_size,
- std::memory_order_relaxed);
+ _impl_._span_cached_byte_size_.Set(cached_size);
total_size += data_size;
}
@@ -10525,7 +10733,6 @@
&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_getter, &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_once,
file_level_metadata_google_2fprotobuf_2fdescriptor_2eproto[23]);
}
-
// ===================================================================
class SourceCodeInfo::_Internal {
@@ -10710,12 +10917,13 @@
&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_getter, &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_once,
file_level_metadata_google_2fprotobuf_2fdescriptor_2eproto[24]);
}
-
// ===================================================================
class GeneratedCodeInfo_Annotation::_Internal {
public:
using HasBits = decltype(std::declval<GeneratedCodeInfo_Annotation>()._impl_._has_bits_);
+ static constexpr int32_t kHasBitsOffset =
+ 8 * PROTOBUF_FIELD_OFFSET(GeneratedCodeInfo_Annotation, _impl_._has_bits_);
static void set_has_source_file(HasBits* has_bits) {
(*has_bits)[0] |= 1u;
}
@@ -10725,6 +10933,9 @@
static void set_has_end(HasBits* has_bits) {
(*has_bits)[0] |= 4u;
}
+ static void set_has_semantic(HasBits* has_bits) {
+ (*has_bits)[0] |= 8u;
+ }
};
GeneratedCodeInfo_Annotation::GeneratedCodeInfo_Annotation(::PROTOBUF_NAMESPACE_ID::Arena* arena,
@@ -10743,7 +10954,8 @@
, /*decltype(_impl_._path_cached_byte_size_)*/{0}
, decltype(_impl_.source_file_){}
, decltype(_impl_.begin_){}
- , decltype(_impl_.end_){}};
+ , decltype(_impl_.end_){}
+ , decltype(_impl_.semantic_){}};
_internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_);
_impl_.source_file_.InitDefault();
@@ -10755,8 +10967,8 @@
_this->GetArenaForAllocation());
}
::memcpy(&_impl_.begin_, &from._impl_.begin_,
- static_cast<size_t>(reinterpret_cast<char*>(&_impl_.end_) -
- reinterpret_cast<char*>(&_impl_.begin_)) + sizeof(_impl_.end_));
+ static_cast<size_t>(reinterpret_cast<char*>(&_impl_.semantic_) -
+ reinterpret_cast<char*>(&_impl_.begin_)) + sizeof(_impl_.semantic_));
// @@protoc_insertion_point(copy_constructor:google.protobuf.GeneratedCodeInfo.Annotation)
}
@@ -10772,6 +10984,7 @@
, decltype(_impl_.source_file_){}
, decltype(_impl_.begin_){0}
, decltype(_impl_.end_){0}
+ , decltype(_impl_.semantic_){0}
};
_impl_.source_file_.InitDefault();
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
@@ -10809,10 +11022,10 @@
if (cached_has_bits & 0x00000001u) {
_impl_.source_file_.ClearNonDefaultToEmpty();
}
- if (cached_has_bits & 0x00000006u) {
+ if (cached_has_bits & 0x0000000eu) {
::memset(&_impl_.begin_, 0, static_cast<size_t>(
- reinterpret_cast<char*>(&_impl_.end_) -
- reinterpret_cast<char*>(&_impl_.begin_)) + sizeof(_impl_.end_));
+ reinterpret_cast<char*>(&_impl_.semantic_) -
+ reinterpret_cast<char*>(&_impl_.begin_)) + sizeof(_impl_.semantic_));
}
_impl_._has_bits_.Clear();
_internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>();
@@ -10866,6 +11079,19 @@
} else
goto handle_unusual;
continue;
+ // optional .google.protobuf.GeneratedCodeInfo.Annotation.Semantic semantic = 5;
+ case 5:
+ if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 40)) {
+ uint32_t val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr);
+ CHK_(ptr);
+ if (PROTOBUF_PREDICT_TRUE(::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo_Annotation_Semantic_IsValid(static_cast<int>(val)))) {
+ _internal_set_semantic(static_cast<::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo_Annotation_Semantic>(val));
+ } else {
+ ::PROTOBUF_NAMESPACE_ID::internal::WriteVarint(5, val, mutable_unknown_fields());
+ }
+ } else
+ goto handle_unusual;
+ continue;
default:
goto handle_unusual;
} // switch
@@ -10898,7 +11124,7 @@
// repeated int32 path = 1 [packed = true];
{
- int byte_size = _impl_._path_cached_byte_size_.load(std::memory_order_relaxed);
+ int byte_size = _impl_._path_cached_byte_size_.Get();
if (byte_size > 0) {
target = stream->WriteInt32Packed(
1, _internal_path(), byte_size, target);
@@ -10928,6 +11154,13 @@
target = ::_pbi::WireFormatLite::WriteInt32ToArray(4, this->_internal_end(), target);
}
+ // optional .google.protobuf.GeneratedCodeInfo.Annotation.Semantic semantic = 5;
+ if (cached_has_bits & 0x00000008u) {
+ target = stream->EnsureSpace(target);
+ target = ::_pbi::WireFormatLite::WriteEnumToArray(
+ 5, this->_internal_semantic(), target);
+ }
+
if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) {
target = ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
_internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream);
@@ -10953,13 +11186,12 @@
::_pbi::WireFormatLite::Int32Size(static_cast<int32_t>(data_size));
}
int cached_size = ::_pbi::ToCachedSize(data_size);
- _impl_._path_cached_byte_size_.store(cached_size,
- std::memory_order_relaxed);
+ _impl_._path_cached_byte_size_.Set(cached_size);
total_size += data_size;
}
cached_has_bits = _impl_._has_bits_[0];
- if (cached_has_bits & 0x00000007u) {
+ if (cached_has_bits & 0x0000000fu) {
// optional string source_file = 2;
if (cached_has_bits & 0x00000001u) {
total_size += 1 +
@@ -10977,6 +11209,12 @@
total_size += ::_pbi::WireFormatLite::Int32SizePlusOne(this->_internal_end());
}
+ // optional .google.protobuf.GeneratedCodeInfo.Annotation.Semantic semantic = 5;
+ if (cached_has_bits & 0x00000008u) {
+ total_size += 1 +
+ ::_pbi::WireFormatLite::EnumSize(this->_internal_semantic());
+ }
+
}
return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_);
}
@@ -10998,7 +11236,7 @@
_this->_impl_.path_.MergeFrom(from._impl_.path_);
cached_has_bits = from._impl_._has_bits_[0];
- if (cached_has_bits & 0x00000007u) {
+ if (cached_has_bits & 0x0000000fu) {
if (cached_has_bits & 0x00000001u) {
_this->_internal_set_source_file(from._internal_source_file());
}
@@ -11008,6 +11246,9 @@
if (cached_has_bits & 0x00000004u) {
_this->_impl_.end_ = from._impl_.end_;
}
+ if (cached_has_bits & 0x00000008u) {
+ _this->_impl_.semantic_ = from._impl_.semantic_;
+ }
_this->_impl_._has_bits_[0] |= cached_has_bits;
}
_this->_internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_);
@@ -11036,8 +11277,8 @@
&other->_impl_.source_file_, rhs_arena
);
::PROTOBUF_NAMESPACE_ID::internal::memswap<
- PROTOBUF_FIELD_OFFSET(GeneratedCodeInfo_Annotation, _impl_.end_)
- + sizeof(GeneratedCodeInfo_Annotation::_impl_.end_)
+ PROTOBUF_FIELD_OFFSET(GeneratedCodeInfo_Annotation, _impl_.semantic_)
+ + sizeof(GeneratedCodeInfo_Annotation::_impl_.semantic_)
- PROTOBUF_FIELD_OFFSET(GeneratedCodeInfo_Annotation, _impl_.begin_)>(
reinterpret_cast<char*>(&_impl_.begin_),
reinterpret_cast<char*>(&other->_impl_.begin_));
@@ -11048,7 +11289,6 @@
&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_getter, &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_once,
file_level_metadata_google_2fprotobuf_2fdescriptor_2eproto[25]);
}
-
// ===================================================================
class GeneratedCodeInfo::_Internal {
@@ -11233,7 +11473,6 @@
&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_getter, &descriptor_table_google_2fprotobuf_2fdescriptor_2eproto_once,
file_level_metadata_google_2fprotobuf_2fdescriptor_2eproto[26]);
}
-
// @@protoc_insertion_point(namespace_scope)
PROTOBUF_NAMESPACE_CLOSE
PROTOBUF_NAMESPACE_OPEN
@@ -11346,6 +11585,5 @@
return Arena::CreateMessageInternal< ::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo >(arena);
}
PROTOBUF_NAMESPACE_CLOSE
-
// @@protoc_insertion_point(global_scope)
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/descriptor.pb.h b/src/google/protobuf/descriptor.pb.h
index dde688e..9f6df48 100644
--- a/src/google/protobuf/descriptor.pb.h
+++ b/src/google/protobuf/descriptor.pb.h
@@ -1,39 +1,44 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: google/protobuf/descriptor.proto
-#ifndef GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fdescriptor_2eproto
-#define GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fdescriptor_2eproto
+#ifndef GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fdescriptor_2eproto_2epb_2eh
+#define GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fdescriptor_2eproto_2epb_2eh
#include <limits>
#include <string>
+#include <type_traits>
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
#if PROTOBUF_VERSION < 3021000
-#error This file was generated by a newer version of protoc which is
-#error incompatible with your Protocol Buffer headers. Please update
-#error your headers.
-#endif
-#if 3021007 < PROTOBUF_MIN_PROTOC_VERSION
-#error This file was generated by an older version of protoc which is
-#error incompatible with your Protocol Buffer headers. Please
-#error regenerate this file with a newer version of protoc.
-#endif
+#error "This file was generated by a newer version of protoc which is"
+#error "incompatible with your Protocol Buffer headers. Please update"
+#error "your headers."
+#endif // PROTOBUF_VERSION
-#include <google/protobuf/port_undef.inc>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/arena.h>
-#include <google/protobuf/arenastring.h>
-#include <google/protobuf/generated_message_util.h>
-#include <google/protobuf/metadata_lite.h>
-#include <google/protobuf/generated_message_reflection.h>
-#include <google/protobuf/message.h>
-#include <google/protobuf/repeated_field.h> // IWYU pragma: export
-#include <google/protobuf/extension_set.h> // IWYU pragma: export
-#include <google/protobuf/generated_enum_reflection.h>
-#include <google/protobuf/unknown_field_set.h>
+#if 3021007 < PROTOBUF_MIN_PROTOC_VERSION
+#error "This file was generated by an older version of protoc which is"
+#error "incompatible with your Protocol Buffer headers. Please"
+#error "regenerate this file with a newer version of protoc."
+#endif // PROTOBUF_MIN_PROTOC_VERSION
+#include "google/protobuf/port_undef.inc"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/arena.h"
+#include "google/protobuf/arenastring.h"
+#include "google/protobuf/generated_message_util.h"
+#include "google/protobuf/metadata_lite.h"
+#include "google/protobuf/generated_message_reflection.h"
+#include "google/protobuf/message.h"
+#include "google/protobuf/repeated_field.h" // IWYU pragma: export
+#include "google/protobuf/extension_set.h" // IWYU pragma: export
+#include "google/protobuf/generated_enum_reflection.h"
+#include "google/protobuf/unknown_field_set.h"
// @@protoc_insertion_point(includes)
-#include <google/protobuf/port_def.inc>
+
+// Must be included last.
+#include "google/protobuf/port_def.inc"
+
#define PROTOBUF_INTERNAL_EXPORT_google_2fprotobuf_2fdescriptor_2eproto PROTOBUF_EXPORT
+
PROTOBUF_NAMESPACE_OPEN
namespace internal {
class AnyMetadata;
@@ -44,7 +49,8 @@
struct PROTOBUF_EXPORT TableStruct_google_2fprotobuf_2fdescriptor_2eproto {
static const uint32_t offsets[];
};
-PROTOBUF_EXPORT extern const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_google_2fprotobuf_2fdescriptor_2eproto;
+PROTOBUF_EXPORT extern const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable
+ descriptor_table_google_2fprotobuf_2fdescriptor_2eproto;
PROTOBUF_NAMESPACE_OPEN
class DescriptorProto;
struct DescriptorProtoDefaultTypeInternal;
@@ -127,38 +133,63 @@
class UninterpretedOption_NamePart;
struct UninterpretedOption_NamePartDefaultTypeInternal;
PROTOBUF_EXPORT extern UninterpretedOption_NamePartDefaultTypeInternal _UninterpretedOption_NamePart_default_instance_;
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::DescriptorProto* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::DescriptorProto>(Arena*);
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::DescriptorProto_ExtensionRange* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::DescriptorProto_ExtensionRange>(Arena*);
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::DescriptorProto_ReservedRange* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::DescriptorProto_ReservedRange>(Arena*);
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::EnumDescriptorProto* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::EnumDescriptorProto>(Arena*);
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::EnumDescriptorProto_EnumReservedRange* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::EnumDescriptorProto_EnumReservedRange>(Arena*);
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::EnumOptions* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::EnumOptions>(Arena*);
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::EnumValueDescriptorProto* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::EnumValueDescriptorProto>(Arena*);
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::EnumValueOptions* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::EnumValueOptions>(Arena*);
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::ExtensionRangeOptions* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::ExtensionRangeOptions>(Arena*);
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::FieldDescriptorProto* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::FieldDescriptorProto>(Arena*);
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::FieldOptions* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::FieldOptions>(Arena*);
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::FileDescriptorProto* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::FileDescriptorProto>(Arena*);
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::FileDescriptorSet* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::FileDescriptorSet>(Arena*);
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::FileOptions* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::FileOptions>(Arena*);
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo>(Arena*);
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo_Annotation* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo_Annotation>(Arena*);
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::MessageOptions* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::MessageOptions>(Arena*);
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::MethodDescriptorProto* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::MethodDescriptorProto>(Arena*);
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::MethodOptions* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::MethodOptions>(Arena*);
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::OneofDescriptorProto* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::OneofDescriptorProto>(Arena*);
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::OneofOptions* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::OneofOptions>(Arena*);
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::ServiceDescriptorProto* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::ServiceDescriptorProto>(Arena*);
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::ServiceOptions* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::ServiceOptions>(Arena*);
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::SourceCodeInfo* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::SourceCodeInfo>(Arena*);
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::SourceCodeInfo_Location* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::SourceCodeInfo_Location>(Arena*);
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::UninterpretedOption* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::UninterpretedOption>(Arena*);
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::UninterpretedOption_NamePart* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::UninterpretedOption_NamePart>(Arena*);
PROTOBUF_NAMESPACE_CLOSE
-PROTOBUF_NAMESPACE_OPEN
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::DescriptorProto* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::DescriptorProto>(Arena*);
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::DescriptorProto_ExtensionRange* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::DescriptorProto_ExtensionRange>(Arena*);
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::DescriptorProto_ReservedRange* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::DescriptorProto_ReservedRange>(Arena*);
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::EnumDescriptorProto* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::EnumDescriptorProto>(Arena*);
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::EnumDescriptorProto_EnumReservedRange* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::EnumDescriptorProto_EnumReservedRange>(Arena*);
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::EnumOptions* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::EnumOptions>(Arena*);
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::EnumValueDescriptorProto* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::EnumValueDescriptorProto>(Arena*);
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::EnumValueOptions* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::EnumValueOptions>(Arena*);
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::ExtensionRangeOptions* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::ExtensionRangeOptions>(Arena*);
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::FieldDescriptorProto* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::FieldDescriptorProto>(Arena*);
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::FieldOptions* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::FieldOptions>(Arena*);
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::FileDescriptorProto* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::FileDescriptorProto>(Arena*);
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::FileDescriptorSet* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::FileDescriptorSet>(Arena*);
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::FileOptions* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::FileOptions>(Arena*);
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo>(Arena*);
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo_Annotation* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo_Annotation>(Arena*);
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::MessageOptions* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::MessageOptions>(Arena*);
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::MethodDescriptorProto* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::MethodDescriptorProto>(Arena*);
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::MethodOptions* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::MethodOptions>(Arena*);
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::OneofDescriptorProto* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::OneofDescriptorProto>(Arena*);
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::OneofOptions* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::OneofOptions>(Arena*);
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::ServiceDescriptorProto* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::ServiceDescriptorProto>(Arena*);
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::ServiceOptions* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::ServiceOptions>(Arena*);
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::SourceCodeInfo* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::SourceCodeInfo>(Arena*);
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::SourceCodeInfo_Location* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::SourceCodeInfo_Location>(Arena*);
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::UninterpretedOption* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::UninterpretedOption>(Arena*);
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::UninterpretedOption_NamePart* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::UninterpretedOption_NamePart>(Arena*);
-PROTOBUF_NAMESPACE_CLOSE
-PROTOBUF_NAMESPACE_OPEN
+PROTOBUF_NAMESPACE_OPEN
enum FieldDescriptorProto_Type : int {
FieldDescriptorProto_Type_TYPE_DOUBLE = 1,
FieldDescriptorProto_Type_TYPE_FLOAT = 2,
@@ -190,11 +221,15 @@
static_assert(::std::is_same<T, FieldDescriptorProto_Type>::value ||
::std::is_integral<T>::value,
"Incorrect type passed to function FieldDescriptorProto_Type_Name.");
- return ::PROTOBUF_NAMESPACE_ID::internal::NameOfEnum(
- FieldDescriptorProto_Type_descriptor(), enum_t_value);
+ return FieldDescriptorProto_Type_Name(static_cast<FieldDescriptorProto_Type>(enum_t_value));
+}
+template<>
+inline const std::string& FieldDescriptorProto_Type_Name(FieldDescriptorProto_Type value) {
+ return ::PROTOBUF_NAMESPACE_ID::internal::NameOfDenseEnum
+ <FieldDescriptorProto_Type_descriptor, 1, 18>(static_cast<int>(value));
}
inline bool FieldDescriptorProto_Type_Parse(
- ::PROTOBUF_NAMESPACE_ID::ConstStringParam name, FieldDescriptorProto_Type* value) {
+ ::absl::string_view name, FieldDescriptorProto_Type* value) {
return ::PROTOBUF_NAMESPACE_ID::internal::ParseNamedEnum<FieldDescriptorProto_Type>(
FieldDescriptorProto_Type_descriptor(), name, value);
}
@@ -214,11 +249,15 @@
static_assert(::std::is_same<T, FieldDescriptorProto_Label>::value ||
::std::is_integral<T>::value,
"Incorrect type passed to function FieldDescriptorProto_Label_Name.");
- return ::PROTOBUF_NAMESPACE_ID::internal::NameOfEnum(
- FieldDescriptorProto_Label_descriptor(), enum_t_value);
+ return FieldDescriptorProto_Label_Name(static_cast<FieldDescriptorProto_Label>(enum_t_value));
+}
+template<>
+inline const std::string& FieldDescriptorProto_Label_Name(FieldDescriptorProto_Label value) {
+ return ::PROTOBUF_NAMESPACE_ID::internal::NameOfDenseEnum
+ <FieldDescriptorProto_Label_descriptor, 1, 3>(static_cast<int>(value));
}
inline bool FieldDescriptorProto_Label_Parse(
- ::PROTOBUF_NAMESPACE_ID::ConstStringParam name, FieldDescriptorProto_Label* value) {
+ ::absl::string_view name, FieldDescriptorProto_Label* value) {
return ::PROTOBUF_NAMESPACE_ID::internal::ParseNamedEnum<FieldDescriptorProto_Label>(
FieldDescriptorProto_Label_descriptor(), name, value);
}
@@ -238,11 +277,15 @@
static_assert(::std::is_same<T, FileOptions_OptimizeMode>::value ||
::std::is_integral<T>::value,
"Incorrect type passed to function FileOptions_OptimizeMode_Name.");
- return ::PROTOBUF_NAMESPACE_ID::internal::NameOfEnum(
- FileOptions_OptimizeMode_descriptor(), enum_t_value);
+ return FileOptions_OptimizeMode_Name(static_cast<FileOptions_OptimizeMode>(enum_t_value));
+}
+template<>
+inline const std::string& FileOptions_OptimizeMode_Name(FileOptions_OptimizeMode value) {
+ return ::PROTOBUF_NAMESPACE_ID::internal::NameOfDenseEnum
+ <FileOptions_OptimizeMode_descriptor, 1, 3>(static_cast<int>(value));
}
inline bool FileOptions_OptimizeMode_Parse(
- ::PROTOBUF_NAMESPACE_ID::ConstStringParam name, FileOptions_OptimizeMode* value) {
+ ::absl::string_view name, FileOptions_OptimizeMode* value) {
return ::PROTOBUF_NAMESPACE_ID::internal::ParseNamedEnum<FileOptions_OptimizeMode>(
FileOptions_OptimizeMode_descriptor(), name, value);
}
@@ -262,11 +305,15 @@
static_assert(::std::is_same<T, FieldOptions_CType>::value ||
::std::is_integral<T>::value,
"Incorrect type passed to function FieldOptions_CType_Name.");
- return ::PROTOBUF_NAMESPACE_ID::internal::NameOfEnum(
- FieldOptions_CType_descriptor(), enum_t_value);
+ return FieldOptions_CType_Name(static_cast<FieldOptions_CType>(enum_t_value));
+}
+template<>
+inline const std::string& FieldOptions_CType_Name(FieldOptions_CType value) {
+ return ::PROTOBUF_NAMESPACE_ID::internal::NameOfDenseEnum
+ <FieldOptions_CType_descriptor, 0, 2>(static_cast<int>(value));
}
inline bool FieldOptions_CType_Parse(
- ::PROTOBUF_NAMESPACE_ID::ConstStringParam name, FieldOptions_CType* value) {
+ ::absl::string_view name, FieldOptions_CType* value) {
return ::PROTOBUF_NAMESPACE_ID::internal::ParseNamedEnum<FieldOptions_CType>(
FieldOptions_CType_descriptor(), name, value);
}
@@ -286,11 +333,15 @@
static_assert(::std::is_same<T, FieldOptions_JSType>::value ||
::std::is_integral<T>::value,
"Incorrect type passed to function FieldOptions_JSType_Name.");
- return ::PROTOBUF_NAMESPACE_ID::internal::NameOfEnum(
- FieldOptions_JSType_descriptor(), enum_t_value);
+ return FieldOptions_JSType_Name(static_cast<FieldOptions_JSType>(enum_t_value));
+}
+template<>
+inline const std::string& FieldOptions_JSType_Name(FieldOptions_JSType value) {
+ return ::PROTOBUF_NAMESPACE_ID::internal::NameOfDenseEnum
+ <FieldOptions_JSType_descriptor, 0, 2>(static_cast<int>(value));
}
inline bool FieldOptions_JSType_Parse(
- ::PROTOBUF_NAMESPACE_ID::ConstStringParam name, FieldOptions_JSType* value) {
+ ::absl::string_view name, FieldOptions_JSType* value) {
return ::PROTOBUF_NAMESPACE_ID::internal::ParseNamedEnum<FieldOptions_JSType>(
FieldOptions_JSType_descriptor(), name, value);
}
@@ -310,16 +361,52 @@
static_assert(::std::is_same<T, MethodOptions_IdempotencyLevel>::value ||
::std::is_integral<T>::value,
"Incorrect type passed to function MethodOptions_IdempotencyLevel_Name.");
- return ::PROTOBUF_NAMESPACE_ID::internal::NameOfEnum(
- MethodOptions_IdempotencyLevel_descriptor(), enum_t_value);
+ return MethodOptions_IdempotencyLevel_Name(static_cast<MethodOptions_IdempotencyLevel>(enum_t_value));
+}
+template<>
+inline const std::string& MethodOptions_IdempotencyLevel_Name(MethodOptions_IdempotencyLevel value) {
+ return ::PROTOBUF_NAMESPACE_ID::internal::NameOfDenseEnum
+ <MethodOptions_IdempotencyLevel_descriptor, 0, 2>(static_cast<int>(value));
}
inline bool MethodOptions_IdempotencyLevel_Parse(
- ::PROTOBUF_NAMESPACE_ID::ConstStringParam name, MethodOptions_IdempotencyLevel* value) {
+ ::absl::string_view name, MethodOptions_IdempotencyLevel* value) {
return ::PROTOBUF_NAMESPACE_ID::internal::ParseNamedEnum<MethodOptions_IdempotencyLevel>(
MethodOptions_IdempotencyLevel_descriptor(), name, value);
}
+enum GeneratedCodeInfo_Annotation_Semantic : int {
+ GeneratedCodeInfo_Annotation_Semantic_NONE = 0,
+ GeneratedCodeInfo_Annotation_Semantic_SET = 1,
+ GeneratedCodeInfo_Annotation_Semantic_ALIAS = 2
+};
+PROTOBUF_EXPORT bool GeneratedCodeInfo_Annotation_Semantic_IsValid(int value);
+constexpr GeneratedCodeInfo_Annotation_Semantic GeneratedCodeInfo_Annotation_Semantic_Semantic_MIN = GeneratedCodeInfo_Annotation_Semantic_NONE;
+constexpr GeneratedCodeInfo_Annotation_Semantic GeneratedCodeInfo_Annotation_Semantic_Semantic_MAX = GeneratedCodeInfo_Annotation_Semantic_ALIAS;
+constexpr int GeneratedCodeInfo_Annotation_Semantic_Semantic_ARRAYSIZE = GeneratedCodeInfo_Annotation_Semantic_Semantic_MAX + 1;
+
+PROTOBUF_EXPORT const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* GeneratedCodeInfo_Annotation_Semantic_descriptor();
+template<typename T>
+inline const std::string& GeneratedCodeInfo_Annotation_Semantic_Name(T enum_t_value) {
+ static_assert(::std::is_same<T, GeneratedCodeInfo_Annotation_Semantic>::value ||
+ ::std::is_integral<T>::value,
+ "Incorrect type passed to function GeneratedCodeInfo_Annotation_Semantic_Name.");
+ return GeneratedCodeInfo_Annotation_Semantic_Name(static_cast<GeneratedCodeInfo_Annotation_Semantic>(enum_t_value));
+}
+template<>
+inline const std::string& GeneratedCodeInfo_Annotation_Semantic_Name(GeneratedCodeInfo_Annotation_Semantic value) {
+ return ::PROTOBUF_NAMESPACE_ID::internal::NameOfDenseEnum
+ <GeneratedCodeInfo_Annotation_Semantic_descriptor, 0, 2>(static_cast<int>(value));
+}
+inline bool GeneratedCodeInfo_Annotation_Semantic_Parse(
+ ::absl::string_view name, GeneratedCodeInfo_Annotation_Semantic* value) {
+ return ::PROTOBUF_NAMESPACE_ID::internal::ParseNamedEnum<GeneratedCodeInfo_Annotation_Semantic>(
+ GeneratedCodeInfo_Annotation_Semantic_descriptor(), name, value);
+}
+
// ===================================================================
+
+// -------------------------------------------------------------------
+
class PROTOBUF_EXPORT FileDescriptorSet final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.FileDescriptorSet) */ {
public:
@@ -430,7 +517,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.FileDescriptorSet";
}
protected:
@@ -481,8 +568,7 @@
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2fdescriptor_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOBUF_EXPORT FileDescriptorProto final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.FileDescriptorProto) */ {
@@ -594,7 +680,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.FileDescriptorProto";
}
protected:
@@ -622,6 +708,7 @@
kNameFieldNumber = 1,
kPackageFieldNumber = 2,
kSyntaxFieldNumber = 12,
+ kEditionFieldNumber = 13,
kOptionsFieldNumber = 8,
kSourceCodeInfoFieldNumber = 9,
};
@@ -819,6 +906,24 @@
std::string* _internal_mutable_syntax();
public:
+ // optional string edition = 13;
+ bool has_edition() const;
+ private:
+ bool _internal_has_edition() const;
+ public:
+ void clear_edition();
+ const std::string& edition() const;
+ template <typename ArgT0 = const std::string&, typename... ArgT>
+ void set_edition(ArgT0&& arg0, ArgT... args);
+ std::string* mutable_edition();
+ PROTOBUF_NODISCARD std::string* release_edition();
+ void set_allocated_edition(std::string* edition);
+ private:
+ const std::string& _internal_edition() const;
+ inline PROTOBUF_ALWAYS_INLINE void _internal_set_edition(const std::string& value);
+ std::string* _internal_mutable_edition();
+ public:
+
// optional .google.protobuf.FileOptions options = 8;
bool has_options() const;
private:
@@ -875,13 +980,13 @@
::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr name_;
::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr package_;
::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr syntax_;
+ ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr edition_;
::PROTOBUF_NAMESPACE_ID::FileOptions* options_;
::PROTOBUF_NAMESPACE_ID::SourceCodeInfo* source_code_info_;
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2fdescriptor_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOBUF_EXPORT DescriptorProto_ExtensionRange final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.DescriptorProto.ExtensionRange) */ {
@@ -993,7 +1098,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.DescriptorProto.ExtensionRange";
}
protected:
@@ -1075,8 +1180,7 @@
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2fdescriptor_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOBUF_EXPORT DescriptorProto_ReservedRange final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.DescriptorProto.ReservedRange) */ {
@@ -1188,7 +1292,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.DescriptorProto.ReservedRange";
}
protected:
@@ -1250,8 +1354,7 @@
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2fdescriptor_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOBUF_EXPORT DescriptorProto final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.DescriptorProto) */ {
@@ -1363,7 +1466,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.DescriptorProto";
}
protected:
@@ -1604,8 +1707,7 @@
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2fdescriptor_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOBUF_EXPORT ExtensionRangeOptions final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.ExtensionRangeOptions) */ {
@@ -1717,7 +1819,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.ExtensionRangeOptions";
}
protected:
@@ -1960,8 +2062,7 @@
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2fdescriptor_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOBUF_EXPORT FieldDescriptorProto final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.FieldDescriptorProto) */ {
@@ -2073,7 +2174,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.FieldDescriptorProto";
}
protected:
@@ -2145,7 +2246,7 @@
"Incorrect type passed to function Type_Name.");
return FieldDescriptorProto_Type_Name(enum_t_value);
}
- static inline bool Type_Parse(::PROTOBUF_NAMESPACE_ID::ConstStringParam name,
+ static inline bool Type_Parse(::absl::string_view name,
Type* value) {
return FieldDescriptorProto_Type_Parse(name, value);
}
@@ -2177,7 +2278,7 @@
"Incorrect type passed to function Label_Name.");
return FieldDescriptorProto_Label_Name(enum_t_value);
}
- static inline bool Label_Parse(::PROTOBUF_NAMESPACE_ID::ConstStringParam name,
+ static inline bool Label_Parse(::absl::string_view name,
Label* value) {
return FieldDescriptorProto_Label_Parse(name, value);
}
@@ -2394,8 +2495,7 @@
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2fdescriptor_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOBUF_EXPORT OneofDescriptorProto final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.OneofDescriptorProto) */ {
@@ -2507,7 +2607,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.OneofDescriptorProto";
}
protected:
@@ -2579,8 +2679,7 @@
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2fdescriptor_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOBUF_EXPORT EnumDescriptorProto_EnumReservedRange final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.EnumDescriptorProto.EnumReservedRange) */ {
@@ -2692,7 +2791,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.EnumDescriptorProto.EnumReservedRange";
}
protected:
@@ -2754,8 +2853,7 @@
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2fdescriptor_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOBUF_EXPORT EnumDescriptorProto final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.EnumDescriptorProto) */ {
@@ -2867,7 +2965,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.EnumDescriptorProto";
}
protected:
@@ -3007,8 +3105,7 @@
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2fdescriptor_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOBUF_EXPORT EnumValueDescriptorProto final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.EnumValueDescriptorProto) */ {
@@ -3120,7 +3217,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.EnumValueDescriptorProto";
}
protected:
@@ -3207,8 +3304,7 @@
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2fdescriptor_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOBUF_EXPORT ServiceDescriptorProto final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.ServiceDescriptorProto) */ {
@@ -3320,7 +3416,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.ServiceDescriptorProto";
}
protected:
@@ -3412,8 +3508,7 @@
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2fdescriptor_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOBUF_EXPORT MethodDescriptorProto final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.MethodDescriptorProto) */ {
@@ -3525,7 +3620,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.MethodDescriptorProto";
}
protected:
@@ -3667,8 +3762,7 @@
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2fdescriptor_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOBUF_EXPORT FileOptions final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.FileOptions) */ {
@@ -3780,7 +3874,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.FileOptions";
}
protected:
@@ -3822,7 +3916,7 @@
"Incorrect type passed to function OptimizeMode_Name.");
return FileOptions_OptimizeMode_Name(enum_t_value);
}
- static inline bool OptimizeMode_Parse(::PROTOBUF_NAMESPACE_ID::ConstStringParam name,
+ static inline bool OptimizeMode_Parse(::absl::string_view name,
OptimizeMode* value) {
return FileOptions_OptimizeMode_Parse(name, value);
}
@@ -4406,8 +4500,7 @@
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2fdescriptor_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOBUF_EXPORT MessageOptions final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.MessageOptions) */ {
@@ -4519,7 +4612,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.MessageOptions";
}
protected:
@@ -4823,8 +4916,7 @@
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2fdescriptor_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOBUF_EXPORT FieldOptions final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.FieldOptions) */ {
@@ -4936,7 +5028,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.FieldOptions";
}
protected:
@@ -4978,7 +5070,7 @@
"Incorrect type passed to function CType_Name.");
return FieldOptions_CType_Name(enum_t_value);
}
- static inline bool CType_Parse(::PROTOBUF_NAMESPACE_ID::ConstStringParam name,
+ static inline bool CType_Parse(::absl::string_view name,
CType* value) {
return FieldOptions_CType_Parse(name, value);
}
@@ -5010,7 +5102,7 @@
"Incorrect type passed to function JSType_Name.");
return FieldOptions_JSType_Name(enum_t_value);
}
- static inline bool JSType_Parse(::PROTOBUF_NAMESPACE_ID::ConstStringParam name,
+ static inline bool JSType_Parse(::absl::string_view name,
JSType* value) {
return FieldOptions_JSType_Parse(name, value);
}
@@ -5349,8 +5441,7 @@
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2fdescriptor_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOBUF_EXPORT OneofOptions final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.OneofOptions) */ {
@@ -5462,7 +5553,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.OneofOptions";
}
protected:
@@ -5705,8 +5796,7 @@
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2fdescriptor_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOBUF_EXPORT EnumOptions final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.EnumOptions) */ {
@@ -5818,7 +5908,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.EnumOptions";
}
protected:
@@ -6092,8 +6182,7 @@
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2fdescriptor_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOBUF_EXPORT EnumValueOptions final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.EnumValueOptions) */ {
@@ -6205,7 +6294,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.EnumValueOptions";
}
protected:
@@ -6464,8 +6553,7 @@
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2fdescriptor_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOBUF_EXPORT ServiceOptions final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.ServiceOptions) */ {
@@ -6577,7 +6665,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.ServiceOptions";
}
protected:
@@ -6836,8 +6924,7 @@
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2fdescriptor_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOBUF_EXPORT MethodOptions final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.MethodOptions) */ {
@@ -6949,7 +7036,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.MethodOptions";
}
protected:
@@ -6991,7 +7078,7 @@
"Incorrect type passed to function IdempotencyLevel_Name.");
return MethodOptions_IdempotencyLevel_Name(enum_t_value);
}
- static inline bool IdempotencyLevel_Parse(::PROTOBUF_NAMESPACE_ID::ConstStringParam name,
+ static inline bool IdempotencyLevel_Parse(::absl::string_view name,
IdempotencyLevel* value) {
return MethodOptions_IdempotencyLevel_Parse(name, value);
}
@@ -7255,8 +7342,7 @@
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2fdescriptor_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOBUF_EXPORT UninterpretedOption_NamePart final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.UninterpretedOption.NamePart) */ {
@@ -7368,7 +7454,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.UninterpretedOption.NamePart";
}
protected:
@@ -7438,8 +7524,7 @@
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2fdescriptor_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOBUF_EXPORT UninterpretedOption final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.UninterpretedOption) */ {
@@ -7551,7 +7636,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.UninterpretedOption";
}
protected:
@@ -7710,8 +7795,7 @@
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2fdescriptor_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOBUF_EXPORT SourceCodeInfo_Location final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.SourceCodeInfo.Location) */ {
@@ -7823,7 +7907,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.SourceCodeInfo.Location";
}
protected:
@@ -7962,17 +8046,16 @@
::PROTOBUF_NAMESPACE_ID::internal::HasBits<1> _has_bits_;
mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_;
::PROTOBUF_NAMESPACE_ID::RepeatedField< int32_t > path_;
- mutable std::atomic<int> _path_cached_byte_size_;
+ mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _path_cached_byte_size_;
::PROTOBUF_NAMESPACE_ID::RepeatedField< int32_t > span_;
- mutable std::atomic<int> _span_cached_byte_size_;
+ mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _span_cached_byte_size_;
::PROTOBUF_NAMESPACE_ID::RepeatedPtrField<std::string> leading_detached_comments_;
::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr leading_comments_;
::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr trailing_comments_;
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2fdescriptor_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOBUF_EXPORT SourceCodeInfo final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.SourceCodeInfo) */ {
@@ -8084,7 +8167,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.SourceCodeInfo";
}
protected:
@@ -8137,8 +8220,7 @@
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2fdescriptor_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOBUF_EXPORT GeneratedCodeInfo_Annotation final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.GeneratedCodeInfo.Annotation) */ {
@@ -8250,7 +8332,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.GeneratedCodeInfo.Annotation";
}
protected:
@@ -8265,6 +8347,38 @@
// nested types ----------------------------------------------------
+ typedef GeneratedCodeInfo_Annotation_Semantic Semantic;
+ static constexpr Semantic NONE =
+ GeneratedCodeInfo_Annotation_Semantic_NONE;
+ static constexpr Semantic SET =
+ GeneratedCodeInfo_Annotation_Semantic_SET;
+ static constexpr Semantic ALIAS =
+ GeneratedCodeInfo_Annotation_Semantic_ALIAS;
+ static inline bool Semantic_IsValid(int value) {
+ return GeneratedCodeInfo_Annotation_Semantic_IsValid(value);
+ }
+ static constexpr Semantic Semantic_MIN =
+ GeneratedCodeInfo_Annotation_Semantic_Semantic_MIN;
+ static constexpr Semantic Semantic_MAX =
+ GeneratedCodeInfo_Annotation_Semantic_Semantic_MAX;
+ static constexpr int Semantic_ARRAYSIZE =
+ GeneratedCodeInfo_Annotation_Semantic_Semantic_ARRAYSIZE;
+ static inline const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor*
+ Semantic_descriptor() {
+ return GeneratedCodeInfo_Annotation_Semantic_descriptor();
+ }
+ template<typename T>
+ static inline const std::string& Semantic_Name(T enum_t_value) {
+ static_assert(::std::is_same<T, Semantic>::value ||
+ ::std::is_integral<T>::value,
+ "Incorrect type passed to function Semantic_Name.");
+ return GeneratedCodeInfo_Annotation_Semantic_Name(enum_t_value);
+ }
+ static inline bool Semantic_Parse(::absl::string_view name,
+ Semantic* value) {
+ return GeneratedCodeInfo_Annotation_Semantic_Parse(name, value);
+ }
+
// accessors -------------------------------------------------------
enum : int {
@@ -8272,6 +8386,7 @@
kSourceFileFieldNumber = 2,
kBeginFieldNumber = 3,
kEndFieldNumber = 4,
+ kSemanticFieldNumber = 5,
};
// repeated int32 path = 1 [packed = true];
int path_size() const;
@@ -8339,6 +8454,19 @@
void _internal_set_end(int32_t value);
public:
+ // optional .google.protobuf.GeneratedCodeInfo.Annotation.Semantic semantic = 5;
+ bool has_semantic() const;
+ private:
+ bool _internal_has_semantic() const;
+ public:
+ void clear_semantic();
+ ::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo_Annotation_Semantic semantic() const;
+ void set_semantic(::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo_Annotation_Semantic value);
+ private:
+ ::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo_Annotation_Semantic _internal_semantic() const;
+ void _internal_set_semantic(::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo_Annotation_Semantic value);
+ public:
+
// @@protoc_insertion_point(class_scope:google.protobuf.GeneratedCodeInfo.Annotation)
private:
class _Internal;
@@ -8350,15 +8478,15 @@
::PROTOBUF_NAMESPACE_ID::internal::HasBits<1> _has_bits_;
mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_;
::PROTOBUF_NAMESPACE_ID::RepeatedField< int32_t > path_;
- mutable std::atomic<int> _path_cached_byte_size_;
+ mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _path_cached_byte_size_;
::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr source_file_;
int32_t begin_;
int32_t end_;
+ int semantic_;
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2fdescriptor_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOBUF_EXPORT GeneratedCodeInfo final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.GeneratedCodeInfo) */ {
@@ -8470,7 +8598,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.GeneratedCodeInfo";
}
protected:
@@ -8527,12 +8655,17 @@
// ===================================================================
+
+
// ===================================================================
+
#ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wstrict-aliasing"
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wstrict-aliasing"
#endif // __GNUC__
+// -------------------------------------------------------------------
+
// FileDescriptorSet
// repeated .google.protobuf.FileDescriptorProto file = 1;
@@ -8626,9 +8759,7 @@
_impl_._has_bits_[0] &= ~0x00000001u;
auto* p = _impl_.name_.Release();
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
- if (_impl_.name_.IsDefault()) {
- _impl_.name_.Set("", GetArenaForAllocation());
- }
+ _impl_.name_.Set("", GetArenaForAllocation());
#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
return p;
}
@@ -8694,9 +8825,7 @@
_impl_._has_bits_[0] &= ~0x00000002u;
auto* p = _impl_.package_.Release();
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
- if (_impl_.package_.IsDefault()) {
- _impl_.package_.Set("", GetArenaForAllocation());
- }
+ _impl_.package_.Set("", GetArenaForAllocation());
#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
return p;
}
@@ -8750,8 +8879,7 @@
// @@protoc_insertion_point(field_set:google.protobuf.FileDescriptorProto.dependency)
}
inline void FileDescriptorProto::set_dependency(int index, const char* value) {
- GOOGLE_DCHECK(value != nullptr);
- _impl_.dependency_.Mutable(index)->assign(value);
+ GOOGLE_DCHECK(value != nullptr); _impl_.dependency_.Mutable(index)->assign(value);
// @@protoc_insertion_point(field_set_char:google.protobuf.FileDescriptorProto.dependency)
}
inline void FileDescriptorProto::set_dependency(int index, const char* value, size_t size) {
@@ -8771,8 +8899,7 @@
// @@protoc_insertion_point(field_add:google.protobuf.FileDescriptorProto.dependency)
}
inline void FileDescriptorProto::add_dependency(const char* value) {
- GOOGLE_DCHECK(value != nullptr);
- _impl_.dependency_.Add()->assign(value);
+ GOOGLE_DCHECK(value != nullptr); _impl_.dependency_.Add()->assign(value);
// @@protoc_insertion_point(field_add_char:google.protobuf.FileDescriptorProto.dependency)
}
inline void FileDescriptorProto::add_dependency(const char* value, size_t size) {
@@ -9046,7 +9173,7 @@
// optional .google.protobuf.FileOptions options = 8;
inline bool FileDescriptorProto::_internal_has_options() const {
- bool value = (_impl_._has_bits_[0] & 0x00000008u) != 0;
+ bool value = (_impl_._has_bits_[0] & 0x00000010u) != 0;
PROTOBUF_ASSUME(!value || _impl_.options_ != nullptr);
return value;
}
@@ -9055,7 +9182,7 @@
}
inline void FileDescriptorProto::clear_options() {
if (_impl_.options_ != nullptr) _impl_.options_->Clear();
- _impl_._has_bits_[0] &= ~0x00000008u;
+ _impl_._has_bits_[0] &= ~0x00000010u;
}
inline const ::PROTOBUF_NAMESPACE_ID::FileOptions& FileDescriptorProto::_internal_options() const {
const ::PROTOBUF_NAMESPACE_ID::FileOptions* p = _impl_.options_;
@@ -9073,14 +9200,14 @@
}
_impl_.options_ = options;
if (options) {
- _impl_._has_bits_[0] |= 0x00000008u;
+ _impl_._has_bits_[0] |= 0x00000010u;
} else {
- _impl_._has_bits_[0] &= ~0x00000008u;
+ _impl_._has_bits_[0] &= ~0x00000010u;
}
// @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.FileDescriptorProto.options)
}
inline ::PROTOBUF_NAMESPACE_ID::FileOptions* FileDescriptorProto::release_options() {
- _impl_._has_bits_[0] &= ~0x00000008u;
+ _impl_._has_bits_[0] &= ~0x00000010u;
::PROTOBUF_NAMESPACE_ID::FileOptions* temp = _impl_.options_;
_impl_.options_ = nullptr;
#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE
@@ -9096,13 +9223,13 @@
}
inline ::PROTOBUF_NAMESPACE_ID::FileOptions* FileDescriptorProto::unsafe_arena_release_options() {
// @@protoc_insertion_point(field_release:google.protobuf.FileDescriptorProto.options)
- _impl_._has_bits_[0] &= ~0x00000008u;
+ _impl_._has_bits_[0] &= ~0x00000010u;
::PROTOBUF_NAMESPACE_ID::FileOptions* temp = _impl_.options_;
_impl_.options_ = nullptr;
return temp;
}
inline ::PROTOBUF_NAMESPACE_ID::FileOptions* FileDescriptorProto::_internal_mutable_options() {
- _impl_._has_bits_[0] |= 0x00000008u;
+ _impl_._has_bits_[0] |= 0x00000010u;
if (_impl_.options_ == nullptr) {
auto* p = CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::FileOptions>(GetArenaForAllocation());
_impl_.options_ = p;
@@ -9126,9 +9253,9 @@
options = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage(
message_arena, options, submessage_arena);
}
- _impl_._has_bits_[0] |= 0x00000008u;
+ _impl_._has_bits_[0] |= 0x00000010u;
} else {
- _impl_._has_bits_[0] &= ~0x00000008u;
+ _impl_._has_bits_[0] &= ~0x00000010u;
}
_impl_.options_ = options;
// @@protoc_insertion_point(field_set_allocated:google.protobuf.FileDescriptorProto.options)
@@ -9136,7 +9263,7 @@
// optional .google.protobuf.SourceCodeInfo source_code_info = 9;
inline bool FileDescriptorProto::_internal_has_source_code_info() const {
- bool value = (_impl_._has_bits_[0] & 0x00000010u) != 0;
+ bool value = (_impl_._has_bits_[0] & 0x00000020u) != 0;
PROTOBUF_ASSUME(!value || _impl_.source_code_info_ != nullptr);
return value;
}
@@ -9145,7 +9272,7 @@
}
inline void FileDescriptorProto::clear_source_code_info() {
if (_impl_.source_code_info_ != nullptr) _impl_.source_code_info_->Clear();
- _impl_._has_bits_[0] &= ~0x00000010u;
+ _impl_._has_bits_[0] &= ~0x00000020u;
}
inline const ::PROTOBUF_NAMESPACE_ID::SourceCodeInfo& FileDescriptorProto::_internal_source_code_info() const {
const ::PROTOBUF_NAMESPACE_ID::SourceCodeInfo* p = _impl_.source_code_info_;
@@ -9163,14 +9290,14 @@
}
_impl_.source_code_info_ = source_code_info;
if (source_code_info) {
- _impl_._has_bits_[0] |= 0x00000010u;
+ _impl_._has_bits_[0] |= 0x00000020u;
} else {
- _impl_._has_bits_[0] &= ~0x00000010u;
+ _impl_._has_bits_[0] &= ~0x00000020u;
}
// @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.FileDescriptorProto.source_code_info)
}
inline ::PROTOBUF_NAMESPACE_ID::SourceCodeInfo* FileDescriptorProto::release_source_code_info() {
- _impl_._has_bits_[0] &= ~0x00000010u;
+ _impl_._has_bits_[0] &= ~0x00000020u;
::PROTOBUF_NAMESPACE_ID::SourceCodeInfo* temp = _impl_.source_code_info_;
_impl_.source_code_info_ = nullptr;
#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE
@@ -9186,13 +9313,13 @@
}
inline ::PROTOBUF_NAMESPACE_ID::SourceCodeInfo* FileDescriptorProto::unsafe_arena_release_source_code_info() {
// @@protoc_insertion_point(field_release:google.protobuf.FileDescriptorProto.source_code_info)
- _impl_._has_bits_[0] &= ~0x00000010u;
+ _impl_._has_bits_[0] &= ~0x00000020u;
::PROTOBUF_NAMESPACE_ID::SourceCodeInfo* temp = _impl_.source_code_info_;
_impl_.source_code_info_ = nullptr;
return temp;
}
inline ::PROTOBUF_NAMESPACE_ID::SourceCodeInfo* FileDescriptorProto::_internal_mutable_source_code_info() {
- _impl_._has_bits_[0] |= 0x00000010u;
+ _impl_._has_bits_[0] |= 0x00000020u;
if (_impl_.source_code_info_ == nullptr) {
auto* p = CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::SourceCodeInfo>(GetArenaForAllocation());
_impl_.source_code_info_ = p;
@@ -9216,9 +9343,9 @@
source_code_info = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage(
message_arena, source_code_info, submessage_arena);
}
- _impl_._has_bits_[0] |= 0x00000010u;
+ _impl_._has_bits_[0] |= 0x00000020u;
} else {
- _impl_._has_bits_[0] &= ~0x00000010u;
+ _impl_._has_bits_[0] &= ~0x00000020u;
}
_impl_.source_code_info_ = source_code_info;
// @@protoc_insertion_point(field_set_allocated:google.protobuf.FileDescriptorProto.source_code_info)
@@ -9271,9 +9398,7 @@
_impl_._has_bits_[0] &= ~0x00000004u;
auto* p = _impl_.syntax_.Release();
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
- if (_impl_.syntax_.IsDefault()) {
- _impl_.syntax_.Set("", GetArenaForAllocation());
- }
+ _impl_.syntax_.Set("", GetArenaForAllocation());
#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
return p;
}
@@ -9292,6 +9417,72 @@
// @@protoc_insertion_point(field_set_allocated:google.protobuf.FileDescriptorProto.syntax)
}
+// optional string edition = 13;
+inline bool FileDescriptorProto::_internal_has_edition() const {
+ bool value = (_impl_._has_bits_[0] & 0x00000008u) != 0;
+ return value;
+}
+inline bool FileDescriptorProto::has_edition() const {
+ return _internal_has_edition();
+}
+inline void FileDescriptorProto::clear_edition() {
+ _impl_.edition_.ClearToEmpty();
+ _impl_._has_bits_[0] &= ~0x00000008u;
+}
+inline const std::string& FileDescriptorProto::edition() const {
+ // @@protoc_insertion_point(field_get:google.protobuf.FileDescriptorProto.edition)
+ return _internal_edition();
+}
+template <typename ArgT0, typename... ArgT>
+inline PROTOBUF_ALWAYS_INLINE
+void FileDescriptorProto::set_edition(ArgT0&& arg0, ArgT... args) {
+ _impl_._has_bits_[0] |= 0x00000008u;
+ _impl_.edition_.Set(static_cast<ArgT0 &&>(arg0), args..., GetArenaForAllocation());
+ // @@protoc_insertion_point(field_set:google.protobuf.FileDescriptorProto.edition)
+}
+inline std::string* FileDescriptorProto::mutable_edition() {
+ std::string* _s = _internal_mutable_edition();
+ // @@protoc_insertion_point(field_mutable:google.protobuf.FileDescriptorProto.edition)
+ return _s;
+}
+inline const std::string& FileDescriptorProto::_internal_edition() const {
+ return _impl_.edition_.Get();
+}
+inline void FileDescriptorProto::_internal_set_edition(const std::string& value) {
+ _impl_._has_bits_[0] |= 0x00000008u;
+ _impl_.edition_.Set(value, GetArenaForAllocation());
+}
+inline std::string* FileDescriptorProto::_internal_mutable_edition() {
+ _impl_._has_bits_[0] |= 0x00000008u;
+ return _impl_.edition_.Mutable(GetArenaForAllocation());
+}
+inline std::string* FileDescriptorProto::release_edition() {
+ // @@protoc_insertion_point(field_release:google.protobuf.FileDescriptorProto.edition)
+ if (!_internal_has_edition()) {
+ return nullptr;
+ }
+ _impl_._has_bits_[0] &= ~0x00000008u;
+ auto* p = _impl_.edition_.Release();
+#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
+ _impl_.edition_.Set("", GetArenaForAllocation());
+#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
+ return p;
+}
+inline void FileDescriptorProto::set_allocated_edition(std::string* edition) {
+ if (edition != nullptr) {
+ _impl_._has_bits_[0] |= 0x00000008u;
+ } else {
+ _impl_._has_bits_[0] &= ~0x00000008u;
+ }
+ _impl_.edition_.SetAllocated(edition, GetArenaForAllocation());
+#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
+ if (_impl_.edition_.IsDefault()) {
+ _impl_.edition_.Set("", GetArenaForAllocation());
+ }
+#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
+ // @@protoc_insertion_point(field_set_allocated:google.protobuf.FileDescriptorProto.edition)
+}
+
// -------------------------------------------------------------------
// DescriptorProto_ExtensionRange
@@ -9553,9 +9744,7 @@
_impl_._has_bits_[0] &= ~0x00000001u;
auto* p = _impl_.name_.Release();
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
- if (_impl_.name_.IsDefault()) {
- _impl_.name_.Set("", GetArenaForAllocation());
- }
+ _impl_.name_.Set("", GetArenaForAllocation());
#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
return p;
}
@@ -9979,8 +10168,7 @@
// @@protoc_insertion_point(field_set:google.protobuf.DescriptorProto.reserved_name)
}
inline void DescriptorProto::set_reserved_name(int index, const char* value) {
- GOOGLE_DCHECK(value != nullptr);
- _impl_.reserved_name_.Mutable(index)->assign(value);
+ GOOGLE_DCHECK(value != nullptr); _impl_.reserved_name_.Mutable(index)->assign(value);
// @@protoc_insertion_point(field_set_char:google.protobuf.DescriptorProto.reserved_name)
}
inline void DescriptorProto::set_reserved_name(int index, const char* value, size_t size) {
@@ -10000,8 +10188,7 @@
// @@protoc_insertion_point(field_add:google.protobuf.DescriptorProto.reserved_name)
}
inline void DescriptorProto::add_reserved_name(const char* value) {
- GOOGLE_DCHECK(value != nullptr);
- _impl_.reserved_name_.Add()->assign(value);
+ GOOGLE_DCHECK(value != nullptr); _impl_.reserved_name_.Add()->assign(value);
// @@protoc_insertion_point(field_add_char:google.protobuf.DescriptorProto.reserved_name)
}
inline void DescriptorProto::add_reserved_name(const char* value, size_t size) {
@@ -10114,9 +10301,7 @@
_impl_._has_bits_[0] &= ~0x00000001u;
auto* p = _impl_.name_.Release();
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
- if (_impl_.name_.IsDefault()) {
- _impl_.name_.Set("", GetArenaForAllocation());
- }
+ _impl_.name_.Set("", GetArenaForAllocation());
#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
return p;
}
@@ -10268,9 +10453,7 @@
_impl_._has_bits_[0] &= ~0x00000004u;
auto* p = _impl_.type_name_.Release();
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
- if (_impl_.type_name_.IsDefault()) {
- _impl_.type_name_.Set("", GetArenaForAllocation());
- }
+ _impl_.type_name_.Set("", GetArenaForAllocation());
#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
return p;
}
@@ -10336,9 +10519,7 @@
_impl_._has_bits_[0] &= ~0x00000002u;
auto* p = _impl_.extendee_.Release();
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
- if (_impl_.extendee_.IsDefault()) {
- _impl_.extendee_.Set("", GetArenaForAllocation());
- }
+ _impl_.extendee_.Set("", GetArenaForAllocation());
#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
return p;
}
@@ -10404,9 +10585,7 @@
_impl_._has_bits_[0] &= ~0x00000008u;
auto* p = _impl_.default_value_.Release();
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
- if (_impl_.default_value_.IsDefault()) {
- _impl_.default_value_.Set("", GetArenaForAllocation());
- }
+ _impl_.default_value_.Set("", GetArenaForAllocation());
#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
return p;
}
@@ -10500,9 +10679,7 @@
_impl_._has_bits_[0] &= ~0x00000010u;
auto* p = _impl_.json_name_.Release();
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
- if (_impl_.json_name_.IsDefault()) {
- _impl_.json_name_.Set("", GetArenaForAllocation());
- }
+ _impl_.json_name_.Set("", GetArenaForAllocation());
#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
return p;
}
@@ -10690,9 +10867,7 @@
_impl_._has_bits_[0] &= ~0x00000001u;
auto* p = _impl_.name_.Release();
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
- if (_impl_.name_.IsDefault()) {
- _impl_.name_.Set("", GetArenaForAllocation());
- }
+ _impl_.name_.Set("", GetArenaForAllocation());
#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
return p;
}
@@ -10912,9 +11087,7 @@
_impl_._has_bits_[0] &= ~0x00000001u;
auto* p = _impl_.name_.Release();
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
- if (_impl_.name_.IsDefault()) {
- _impl_.name_.Set("", GetArenaForAllocation());
- }
+ _impl_.name_.Set("", GetArenaForAllocation());
#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
return p;
}
@@ -11138,8 +11311,7 @@
// @@protoc_insertion_point(field_set:google.protobuf.EnumDescriptorProto.reserved_name)
}
inline void EnumDescriptorProto::set_reserved_name(int index, const char* value) {
- GOOGLE_DCHECK(value != nullptr);
- _impl_.reserved_name_.Mutable(index)->assign(value);
+ GOOGLE_DCHECK(value != nullptr); _impl_.reserved_name_.Mutable(index)->assign(value);
// @@protoc_insertion_point(field_set_char:google.protobuf.EnumDescriptorProto.reserved_name)
}
inline void EnumDescriptorProto::set_reserved_name(int index, const char* value, size_t size) {
@@ -11159,8 +11331,7 @@
// @@protoc_insertion_point(field_add:google.protobuf.EnumDescriptorProto.reserved_name)
}
inline void EnumDescriptorProto::add_reserved_name(const char* value) {
- GOOGLE_DCHECK(value != nullptr);
- _impl_.reserved_name_.Add()->assign(value);
+ GOOGLE_DCHECK(value != nullptr); _impl_.reserved_name_.Add()->assign(value);
// @@protoc_insertion_point(field_add_char:google.protobuf.EnumDescriptorProto.reserved_name)
}
inline void EnumDescriptorProto::add_reserved_name(const char* value, size_t size) {
@@ -11229,9 +11400,7 @@
_impl_._has_bits_[0] &= ~0x00000001u;
auto* p = _impl_.name_.Release();
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
- if (_impl_.name_.IsDefault()) {
- _impl_.name_.Set("", GetArenaForAllocation());
- }
+ _impl_.name_.Set("", GetArenaForAllocation());
#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
return p;
}
@@ -11419,9 +11588,7 @@
_impl_._has_bits_[0] &= ~0x00000001u;
auto* p = _impl_.name_.Release();
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
- if (_impl_.name_.IsDefault()) {
- _impl_.name_.Set("", GetArenaForAllocation());
- }
+ _impl_.name_.Set("", GetArenaForAllocation());
#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
return p;
}
@@ -11621,9 +11788,7 @@
_impl_._has_bits_[0] &= ~0x00000001u;
auto* p = _impl_.name_.Release();
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
- if (_impl_.name_.IsDefault()) {
- _impl_.name_.Set("", GetArenaForAllocation());
- }
+ _impl_.name_.Set("", GetArenaForAllocation());
#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
return p;
}
@@ -11689,9 +11854,7 @@
_impl_._has_bits_[0] &= ~0x00000002u;
auto* p = _impl_.input_type_.Release();
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
- if (_impl_.input_type_.IsDefault()) {
- _impl_.input_type_.Set("", GetArenaForAllocation());
- }
+ _impl_.input_type_.Set("", GetArenaForAllocation());
#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
return p;
}
@@ -11757,9 +11920,7 @@
_impl_._has_bits_[0] &= ~0x00000004u;
auto* p = _impl_.output_type_.Release();
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
- if (_impl_.output_type_.IsDefault()) {
- _impl_.output_type_.Set("", GetArenaForAllocation());
- }
+ _impl_.output_type_.Set("", GetArenaForAllocation());
#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
return p;
}
@@ -11975,9 +12136,7 @@
_impl_._has_bits_[0] &= ~0x00000001u;
auto* p = _impl_.java_package_.Release();
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
- if (_impl_.java_package_.IsDefault()) {
- _impl_.java_package_.Set("", GetArenaForAllocation());
- }
+ _impl_.java_package_.Set("", GetArenaForAllocation());
#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
return p;
}
@@ -12043,9 +12202,7 @@
_impl_._has_bits_[0] &= ~0x00000002u;
auto* p = _impl_.java_outer_classname_.Release();
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
- if (_impl_.java_outer_classname_.IsDefault()) {
- _impl_.java_outer_classname_.Set("", GetArenaForAllocation());
- }
+ _impl_.java_outer_classname_.Set("", GetArenaForAllocation());
#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
return p;
}
@@ -12224,9 +12381,7 @@
_impl_._has_bits_[0] &= ~0x00000004u;
auto* p = _impl_.go_package_.Release();
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
- if (_impl_.go_package_.IsDefault()) {
- _impl_.go_package_.Set("", GetArenaForAllocation());
- }
+ _impl_.go_package_.Set("", GetArenaForAllocation());
#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
return p;
}
@@ -12460,9 +12615,7 @@
_impl_._has_bits_[0] &= ~0x00000008u;
auto* p = _impl_.objc_class_prefix_.Release();
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
- if (_impl_.objc_class_prefix_.IsDefault()) {
- _impl_.objc_class_prefix_.Set("", GetArenaForAllocation());
- }
+ _impl_.objc_class_prefix_.Set("", GetArenaForAllocation());
#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
return p;
}
@@ -12528,9 +12681,7 @@
_impl_._has_bits_[0] &= ~0x00000010u;
auto* p = _impl_.csharp_namespace_.Release();
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
- if (_impl_.csharp_namespace_.IsDefault()) {
- _impl_.csharp_namespace_.Set("", GetArenaForAllocation());
- }
+ _impl_.csharp_namespace_.Set("", GetArenaForAllocation());
#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
return p;
}
@@ -12596,9 +12747,7 @@
_impl_._has_bits_[0] &= ~0x00000020u;
auto* p = _impl_.swift_prefix_.Release();
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
- if (_impl_.swift_prefix_.IsDefault()) {
- _impl_.swift_prefix_.Set("", GetArenaForAllocation());
- }
+ _impl_.swift_prefix_.Set("", GetArenaForAllocation());
#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
return p;
}
@@ -12664,9 +12813,7 @@
_impl_._has_bits_[0] &= ~0x00000040u;
auto* p = _impl_.php_class_prefix_.Release();
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
- if (_impl_.php_class_prefix_.IsDefault()) {
- _impl_.php_class_prefix_.Set("", GetArenaForAllocation());
- }
+ _impl_.php_class_prefix_.Set("", GetArenaForAllocation());
#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
return p;
}
@@ -12732,9 +12879,7 @@
_impl_._has_bits_[0] &= ~0x00000080u;
auto* p = _impl_.php_namespace_.Release();
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
- if (_impl_.php_namespace_.IsDefault()) {
- _impl_.php_namespace_.Set("", GetArenaForAllocation());
- }
+ _impl_.php_namespace_.Set("", GetArenaForAllocation());
#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
return p;
}
@@ -12800,9 +12945,7 @@
_impl_._has_bits_[0] &= ~0x00000100u;
auto* p = _impl_.php_metadata_namespace_.Release();
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
- if (_impl_.php_metadata_namespace_.IsDefault()) {
- _impl_.php_metadata_namespace_.Set("", GetArenaForAllocation());
- }
+ _impl_.php_metadata_namespace_.Set("", GetArenaForAllocation());
#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
return p;
}
@@ -12868,9 +13011,7 @@
_impl_._has_bits_[0] &= ~0x00000200u;
auto* p = _impl_.ruby_package_.Release();
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
- if (_impl_.ruby_package_.IsDefault()) {
- _impl_.ruby_package_.Set("", GetArenaForAllocation());
- }
+ _impl_.ruby_package_.Set("", GetArenaForAllocation());
#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
return p;
}
@@ -13767,9 +13908,7 @@
_impl_._has_bits_[0] &= ~0x00000001u;
auto* p = _impl_.name_part_.Release();
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
- if (_impl_.name_part_.IsDefault()) {
- _impl_.name_part_.Set("", GetArenaForAllocation());
- }
+ _impl_.name_part_.Set("", GetArenaForAllocation());
#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
return p;
}
@@ -13907,9 +14046,7 @@
_impl_._has_bits_[0] &= ~0x00000001u;
auto* p = _impl_.identifier_value_.Release();
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
- if (_impl_.identifier_value_.IsDefault()) {
- _impl_.identifier_value_.Set("", GetArenaForAllocation());
- }
+ _impl_.identifier_value_.Set("", GetArenaForAllocation());
#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
return p;
}
@@ -14059,9 +14196,7 @@
_impl_._has_bits_[0] &= ~0x00000002u;
auto* p = _impl_.string_value_.Release();
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
- if (_impl_.string_value_.IsDefault()) {
- _impl_.string_value_.Set("", GetArenaForAllocation());
- }
+ _impl_.string_value_.Set("", GetArenaForAllocation());
#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
return p;
}
@@ -14127,9 +14262,7 @@
_impl_._has_bits_[0] &= ~0x00000004u;
auto* p = _impl_.aggregate_value_.Release();
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
- if (_impl_.aggregate_value_.IsDefault()) {
- _impl_.aggregate_value_.Set("", GetArenaForAllocation());
- }
+ _impl_.aggregate_value_.Set("", GetArenaForAllocation());
#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
return p;
}
@@ -14293,9 +14426,7 @@
_impl_._has_bits_[0] &= ~0x00000001u;
auto* p = _impl_.leading_comments_.Release();
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
- if (_impl_.leading_comments_.IsDefault()) {
- _impl_.leading_comments_.Set("", GetArenaForAllocation());
- }
+ _impl_.leading_comments_.Set("", GetArenaForAllocation());
#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
return p;
}
@@ -14361,9 +14492,7 @@
_impl_._has_bits_[0] &= ~0x00000002u;
auto* p = _impl_.trailing_comments_.Release();
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
- if (_impl_.trailing_comments_.IsDefault()) {
- _impl_.trailing_comments_.Set("", GetArenaForAllocation());
- }
+ _impl_.trailing_comments_.Set("", GetArenaForAllocation());
#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
return p;
}
@@ -14417,8 +14546,7 @@
// @@protoc_insertion_point(field_set:google.protobuf.SourceCodeInfo.Location.leading_detached_comments)
}
inline void SourceCodeInfo_Location::set_leading_detached_comments(int index, const char* value) {
- GOOGLE_DCHECK(value != nullptr);
- _impl_.leading_detached_comments_.Mutable(index)->assign(value);
+ GOOGLE_DCHECK(value != nullptr); _impl_.leading_detached_comments_.Mutable(index)->assign(value);
// @@protoc_insertion_point(field_set_char:google.protobuf.SourceCodeInfo.Location.leading_detached_comments)
}
inline void SourceCodeInfo_Location::set_leading_detached_comments(int index, const char* value, size_t size) {
@@ -14438,8 +14566,7 @@
// @@protoc_insertion_point(field_add:google.protobuf.SourceCodeInfo.Location.leading_detached_comments)
}
inline void SourceCodeInfo_Location::add_leading_detached_comments(const char* value) {
- GOOGLE_DCHECK(value != nullptr);
- _impl_.leading_detached_comments_.Add()->assign(value);
+ GOOGLE_DCHECK(value != nullptr); _impl_.leading_detached_comments_.Add()->assign(value);
// @@protoc_insertion_point(field_add_char:google.protobuf.SourceCodeInfo.Location.leading_detached_comments)
}
inline void SourceCodeInfo_Location::add_leading_detached_comments(const char* value, size_t size) {
@@ -14599,9 +14726,7 @@
_impl_._has_bits_[0] &= ~0x00000001u;
auto* p = _impl_.source_file_.Release();
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
- if (_impl_.source_file_.IsDefault()) {
- _impl_.source_file_.Set("", GetArenaForAllocation());
- }
+ _impl_.source_file_.Set("", GetArenaForAllocation());
#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING
return p;
}
@@ -14676,6 +14801,35 @@
// @@protoc_insertion_point(field_set:google.protobuf.GeneratedCodeInfo.Annotation.end)
}
+// optional .google.protobuf.GeneratedCodeInfo.Annotation.Semantic semantic = 5;
+inline bool GeneratedCodeInfo_Annotation::_internal_has_semantic() const {
+ bool value = (_impl_._has_bits_[0] & 0x00000008u) != 0;
+ return value;
+}
+inline bool GeneratedCodeInfo_Annotation::has_semantic() const {
+ return _internal_has_semantic();
+}
+inline void GeneratedCodeInfo_Annotation::clear_semantic() {
+ _impl_.semantic_ = 0;
+ _impl_._has_bits_[0] &= ~0x00000008u;
+}
+inline ::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo_Annotation_Semantic GeneratedCodeInfo_Annotation::_internal_semantic() const {
+ return static_cast< ::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo_Annotation_Semantic >(_impl_.semantic_);
+}
+inline ::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo_Annotation_Semantic GeneratedCodeInfo_Annotation::semantic() const {
+ // @@protoc_insertion_point(field_get:google.protobuf.GeneratedCodeInfo.Annotation.semantic)
+ return _internal_semantic();
+}
+inline void GeneratedCodeInfo_Annotation::_internal_set_semantic(::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo_Annotation_Semantic value) {
+ assert(::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo_Annotation_Semantic_IsValid(value));
+ _impl_._has_bits_[0] |= 0x00000008u;
+ _impl_.semantic_ = value;
+}
+inline void GeneratedCodeInfo_Annotation::set_semantic(::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo_Annotation_Semantic value) {
+ _internal_set_semantic(value);
+ // @@protoc_insertion_point(field_set:google.protobuf.GeneratedCodeInfo.Annotation.semantic)
+}
+
// -------------------------------------------------------------------
// GeneratedCodeInfo
@@ -14721,65 +14875,13 @@
}
#ifdef __GNUC__
- #pragma GCC diagnostic pop
+#pragma GCC diagnostic pop
#endif // __GNUC__
-// -------------------------------------------------------------------
-
-// -------------------------------------------------------------------
-
-// -------------------------------------------------------------------
-
-// -------------------------------------------------------------------
-
-// -------------------------------------------------------------------
-
-// -------------------------------------------------------------------
-
-// -------------------------------------------------------------------
-
-// -------------------------------------------------------------------
-
-// -------------------------------------------------------------------
-
-// -------------------------------------------------------------------
-
-// -------------------------------------------------------------------
-
-// -------------------------------------------------------------------
-
-// -------------------------------------------------------------------
-
-// -------------------------------------------------------------------
-
-// -------------------------------------------------------------------
-
-// -------------------------------------------------------------------
-
-// -------------------------------------------------------------------
-
-// -------------------------------------------------------------------
-
-// -------------------------------------------------------------------
-
-// -------------------------------------------------------------------
-
-// -------------------------------------------------------------------
-
-// -------------------------------------------------------------------
-
-// -------------------------------------------------------------------
-
-// -------------------------------------------------------------------
-
-// -------------------------------------------------------------------
-
-// -------------------------------------------------------------------
-
// @@protoc_insertion_point(namespace_scope)
-
PROTOBUF_NAMESPACE_CLOSE
+
PROTOBUF_NAMESPACE_OPEN
template <> struct is_proto_enum< ::PROTOBUF_NAMESPACE_ID::FieldDescriptorProto_Type> : ::std::true_type {};
@@ -14812,10 +14914,16 @@
inline const EnumDescriptor* GetEnumDescriptor< ::PROTOBUF_NAMESPACE_ID::MethodOptions_IdempotencyLevel>() {
return ::PROTOBUF_NAMESPACE_ID::MethodOptions_IdempotencyLevel_descriptor();
}
+template <> struct is_proto_enum< ::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo_Annotation_Semantic> : ::std::true_type {};
+template <>
+inline const EnumDescriptor* GetEnumDescriptor< ::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo_Annotation_Semantic>() {
+ return ::PROTOBUF_NAMESPACE_ID::GeneratedCodeInfo_Annotation_Semantic_descriptor();
+}
PROTOBUF_NAMESPACE_CLOSE
// @@protoc_insertion_point(global_scope)
-#include <google/protobuf/port_undef.inc>
-#endif // GOOGLE_PROTOBUF_INCLUDED_GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fdescriptor_2eproto
+#include "google/protobuf/port_undef.inc"
+
+#endif // GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fdescriptor_2eproto_2epb_2eh
diff --git a/src/google/protobuf/descriptor.proto b/src/google/protobuf/descriptor.proto
index f8eb216..f264b13 100644
--- a/src/google/protobuf/descriptor.proto
+++ b/src/google/protobuf/descriptor.proto
@@ -86,8 +86,13 @@
optional SourceCodeInfo source_code_info = 9;
// The syntax of the proto file.
- // The supported values are "proto2" and "proto3".
+ // The supported values are "proto2", "proto3", and "editions".
+ //
+ // If `edition` is present, this value must be "editions".
optional string syntax = 12;
+
+ // The edition of the proto file, which is an opaque string.
+ optional string edition = 13;
}
// Describes a message type.
@@ -497,6 +502,10 @@
reserved 4, 5, 6;
+ // NOTE: Do not set the option in .proto files. Always use the maps syntax
+ // instead. The option should only be implicitly set by the proto compiler
+ // parser.
+ //
// Whether the message is an automatically generated map entry type for the
// maps field.
//
@@ -514,10 +523,6 @@
// use a native map in the target language to hold the keys and values.
// The reflection APIs in such implementations still need to work as
// if the field is a repeated message field.
- //
- // NOTE: Do not set the option in .proto files. Always use the maps syntax
- // instead. The option should only be implicitly set by the proto compiler
- // parser.
optional bool map_entry = 7;
reserved 8; // javalite_serializable
@@ -604,11 +609,8 @@
// check its required fields, regardless of whether or not the message has
// been parsed.
//
- // As of 2021, lazy does no correctness checks on the byte stream during
- // parsing. This may lead to crashes if and when an invalid byte stream is
- // finally parsed upon access.
- //
- // TODO(b/211906113): Enable validation on lazy fields.
+ // As of May 2022, lazy verifies the contents of the byte stream during
+ // parsing. An invalid byte stream will cause the overall parsing to fail.
optional bool lazy = 5 [default = false];
// unverified_lazy does no correctness checks on the byte stream. This should
@@ -914,8 +916,20 @@
optional int32 begin = 3;
// Identifies the ending offset in bytes in the generated code that
- // relates to the identified offset. The end offset should be one past
+ // relates to the identified object. The end offset should be one past
// the last relevant byte (so the length of the text = end - begin).
optional int32 end = 4;
+
+ // Represents the identified object's effect on the element in the original
+ // .proto file.
+ enum Semantic {
+ // There is no effect or the effect is indescribable.
+ NONE = 0;
+ // The element is set or otherwise mutated.
+ SET = 1;
+ // An alias to the element is returned.
+ ALIAS = 2;
+ }
+ optional Semantic semantic = 5;
}
}
diff --git a/src/google/protobuf/descriptor_database.cc b/src/google/protobuf/descriptor_database.cc
index 203000d..c024a77 100644
--- a/src/google/protobuf/descriptor_database.cc
+++ b/src/google/protobuf/descriptor_database.cc
@@ -32,14 +32,17 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/descriptor_database.h>
+#include "google/protobuf/descriptor_database.h"
#include <algorithm>
#include <set>
+#include <utility>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/stubs/map_util.h>
-#include <google/protobuf/stubs/stl_util.h>
+#include "absl/strings/ascii.h"
+#include "absl/strings/match.h"
+#include "absl/strings/str_replace.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/stubs/stl_util.h"
namespace google {
@@ -52,7 +55,7 @@
GOOGLE_CHECK(desc_proto.has_name());
std::string full_name = prefix.empty()
? desc_proto.name()
- : StrCat(prefix, ".", desc_proto.name());
+ : absl::StrCat(prefix, ".", desc_proto.name());
output->insert(full_name);
for (const auto& d : desc_proto.nested_type()) {
@@ -117,7 +120,7 @@
template <typename Value>
bool SimpleDescriptorDatabase::DescriptorIndex<Value>::AddFile(
const FileDescriptorProto& file, Value value) {
- if (!InsertIfNotPresent(&by_name_, file.name(), value)) {
+ if (!by_name_.insert({file.name(), value}).second) {
GOOGLE_LOG(ERROR) << "File already exists in database: " << file.name();
return false;
}
@@ -151,7 +154,7 @@
// Returns true if and only if all characters in the name are alphanumerics,
// underscores, or periods.
-bool ValidateSymbolName(StringPiece name) {
+bool ValidateSymbolName(absl::string_view name) {
for (char c : name) {
// I don't trust ctype.h due to locales. :(
if (c != '.' && c != '_' && (c < '0' || c > '9') && (c < 'A' || c > 'Z') &&
@@ -185,9 +188,9 @@
// True if either the arguments are equal or super_symbol identifies a
// parent symbol of sub_symbol (e.g. "foo.bar" is a parent of
// "foo.bar.baz", but not a parent of "foo.barbaz").
-bool IsSubSymbol(StringPiece sub_symbol, StringPiece super_symbol) {
+bool IsSubSymbol(absl::string_view sub_symbol, absl::string_view super_symbol) {
return sub_symbol == super_symbol ||
- (HasPrefixString(super_symbol, sub_symbol) &&
+ (absl::StartsWith(super_symbol, sub_symbol) &&
super_symbol[sub_symbol.size()] == '.');
}
@@ -271,10 +274,11 @@
if (!field.extendee().empty() && field.extendee()[0] == '.') {
// The extension is fully-qualified. We can use it as a lookup key in
// the by_symbol_ table.
- if (!InsertIfNotPresent(
- &by_extension_,
- std::make_pair(field.extendee().substr(1), field.number()),
- value)) {
+ if (!by_extension_
+ .insert(
+ {std::make_pair(field.extendee().substr(1), field.number()),
+ value})
+ .second) {
GOOGLE_LOG(ERROR) << "Extension conflicts with extension already in database: "
"extend "
<< field.extendee() << " { " << field.name() << " = "
@@ -292,7 +296,9 @@
template <typename Value>
Value SimpleDescriptorDatabase::DescriptorIndex<Value>::FindFile(
const std::string& filename) {
- return FindWithDefault(by_name_, filename, Value());
+ auto it = by_name_.find(filename);
+ if (it == by_name_.end()) return {};
+ return it->second;
}
template <typename Value>
@@ -308,8 +314,9 @@
template <typename Value>
Value SimpleDescriptorDatabase::DescriptorIndex<Value>::FindExtension(
const std::string& containing_type, int field_number) {
- return FindWithDefault(
- by_extension_, std::make_pair(containing_type, field_number), Value());
+ auto it = by_extension_.find({containing_type, field_number});
+ if (it == by_extension_.end()) return {};
+ return it->second;
}
template <typename Value>
@@ -352,6 +359,10 @@
return index_.AddFile(*file, file);
}
+bool SimpleDescriptorDatabase::AddUnowned(const FileDescriptorProto* file) {
+ return index_.AddFile(*file, file);
+}
+
bool SimpleDescriptorDatabase::FindFileByName(const std::string& filename,
FileDescriptorProto* output) {
return MaybeCopy(index_.FindFile(filename), output);
@@ -397,24 +408,24 @@
template <typename FileProto>
bool AddFile(const FileProto& file, Value value);
- Value FindFile(StringPiece filename);
- Value FindSymbol(StringPiece name);
- Value FindSymbolOnlyFlat(StringPiece name) const;
- Value FindExtension(StringPiece containing_type, int field_number);
- bool FindAllExtensionNumbers(StringPiece containing_type,
+ Value FindFile(absl::string_view filename);
+ Value FindSymbol(absl::string_view name);
+ Value FindSymbolOnlyFlat(absl::string_view name) const;
+ Value FindExtension(absl::string_view containing_type, int field_number);
+ bool FindAllExtensionNumbers(absl::string_view containing_type,
std::vector<int>* output);
void FindAllFileNames(std::vector<std::string>* output) const;
private:
friend class EncodedDescriptorDatabase;
- bool AddSymbol(StringPiece symbol);
+ bool AddSymbol(absl::string_view symbol);
template <typename DescProto>
- bool AddNestedExtensions(StringPiece filename,
+ bool AddNestedExtensions(absl::string_view filename,
const DescProto& message_type);
template <typename FieldProto>
- bool AddExtension(StringPiece filename, const FieldProto& field);
+ bool AddExtension(absl::string_view filename, const FieldProto& field);
// All the maps below have two representations:
// - a std::set<> where we insert initially.
@@ -427,8 +438,8 @@
using String = std::string;
- String EncodeString(StringPiece str) const { return String(str); }
- StringPiece DecodeString(const String& str, int) const { return str; }
+ String EncodeString(absl::string_view str) const { return String(str); }
+ absl::string_view DecodeString(const String& str, int) const { return str; }
struct EncodedEntry {
// Do not use `Value` here to avoid the padding of that object.
@@ -445,7 +456,7 @@
int data_offset;
String encoded_name;
- StringPiece name(const DescriptorIndex& index) const {
+ absl::string_view name(const DescriptorIndex& index) const {
return index.DecodeString(encoded_name, data_offset);
}
};
@@ -455,10 +466,10 @@
bool operator()(const FileEntry& a, const FileEntry& b) const {
return a.name(index) < b.name(index);
}
- bool operator()(const FileEntry& a, StringPiece b) const {
+ bool operator()(const FileEntry& a, absl::string_view b) const {
return a.name(index) < b;
}
- bool operator()(StringPiece a, const FileEntry& b) const {
+ bool operator()(absl::string_view a, const FileEntry& b) const {
return a < b.name(index);
}
};
@@ -469,17 +480,17 @@
int data_offset;
String encoded_symbol;
- StringPiece package(const DescriptorIndex& index) const {
+ absl::string_view package(const DescriptorIndex& index) const {
return index.DecodeString(index.all_values_[data_offset].encoded_package,
data_offset);
}
- StringPiece symbol(const DescriptorIndex& index) const {
+ absl::string_view symbol(const DescriptorIndex& index) const {
return index.DecodeString(encoded_symbol, data_offset);
}
std::string AsString(const DescriptorIndex& index) const {
auto p = package(index);
- return StrCat(p, p.empty() ? "" : ".", symbol(index));
+ return absl::StrCat(p, p.empty() ? "" : ".", symbol(index));
}
};
@@ -489,16 +500,16 @@
std::string AsString(const SymbolEntry& entry) const {
return entry.AsString(index);
}
- static StringPiece AsString(StringPiece str) { return str; }
+ static absl::string_view AsString(absl::string_view str) { return str; }
- std::pair<StringPiece, StringPiece> GetParts(
+ std::pair<absl::string_view, absl::string_view> GetParts(
const SymbolEntry& entry) const {
auto package = entry.package(index);
- if (package.empty()) return {entry.symbol(index), StringPiece{}};
+ if (package.empty()) return {entry.symbol(index), absl::string_view{}};
return {package, entry.symbol(index)};
}
- std::pair<StringPiece, StringPiece> GetParts(
- StringPiece str) const {
+ std::pair<absl::string_view, absl::string_view> GetParts(
+ absl::string_view str) const {
return {str, {}};
}
@@ -525,7 +536,7 @@
struct ExtensionEntry {
int data_offset;
String encoded_extendee;
- StringPiece extendee(const DescriptorIndex& index) const {
+ absl::string_view extendee(const DescriptorIndex& index) const {
return index.DecodeString(encoded_extendee, data_offset).substr(1);
}
int extension_number;
@@ -538,10 +549,10 @@
std::make_tuple(b.extendee(index), b.extension_number);
}
bool operator()(const ExtensionEntry& a,
- std::tuple<StringPiece, int> b) const {
+ std::tuple<absl::string_view, int> b) const {
return std::make_tuple(a.extendee(index), a.extension_number) < b;
}
- bool operator()(std::tuple<StringPiece, int> a,
+ bool operator()(std::tuple<absl::string_view, int> a,
const ExtensionEntry& b) const {
return a < std::make_tuple(b.extendee(index), b.extension_number);
}
@@ -634,9 +645,10 @@
}
all_values_.back().encoded_package = EncodeString(file.package());
- if (!InsertIfNotPresent(
- &by_name_, FileEntry{static_cast<int>(all_values_.size() - 1),
- EncodeString(file.name())}) ||
+ if (!by_name_
+ .insert({static_cast<int>(all_values_.size() - 1),
+ EncodeString(file.name())})
+ .second ||
std::binary_search(by_name_flat_.begin(), by_name_flat_.end(),
file.name(), by_name_.key_comp())) {
GOOGLE_LOG(ERROR) << "File already exists in database: " << file.name();
@@ -662,7 +674,7 @@
}
template <typename Iter, typename Iter2, typename Index>
-static bool CheckForMutualSubsymbols(StringPiece symbol_name, Iter* iter,
+static bool CheckForMutualSubsymbols(absl::string_view symbol_name, Iter* iter,
Iter2 end, const Index& index) {
if (*iter != end) {
if (IsSubSymbol((*iter)->AsString(index), symbol_name)) {
@@ -690,7 +702,7 @@
}
bool EncodedDescriptorDatabase::DescriptorIndex::AddSymbol(
- StringPiece symbol) {
+ absl::string_view symbol) {
SymbolEntry entry = {static_cast<int>(all_values_.size() - 1),
EncodeString(symbol)};
std::string entry_as_string = entry.AsString(*this);
@@ -730,7 +742,7 @@
template <typename DescProto>
bool EncodedDescriptorDatabase::DescriptorIndex::AddNestedExtensions(
- StringPiece filename, const DescProto& message_type) {
+ absl::string_view filename, const DescProto& message_type) {
for (const auto& nested_type : message_type.nested_type()) {
if (!AddNestedExtensions(filename, nested_type)) return false;
}
@@ -742,14 +754,14 @@
template <typename FieldProto>
bool EncodedDescriptorDatabase::DescriptorIndex::AddExtension(
- StringPiece filename, const FieldProto& field) {
+ absl::string_view filename, const FieldProto& field) {
if (!field.extendee().empty() && field.extendee()[0] == '.') {
// The extension is fully-qualified. We can use it as a lookup key in
// the by_symbol_ table.
- if (!InsertIfNotPresent(
- &by_extension_,
- ExtensionEntry{static_cast<int>(all_values_.size() - 1),
- EncodeString(field.extendee()), field.number()}) ||
+ if (!by_extension_
+ .insert({static_cast<int>(all_values_.size() - 1),
+ EncodeString(field.extendee()), field.number()})
+ .second ||
std::binary_search(
by_extension_flat_.begin(), by_extension_flat_.end(),
std::make_pair(field.extendee().substr(1), field.number()),
@@ -769,14 +781,14 @@
}
std::pair<const void*, int>
-EncodedDescriptorDatabase::DescriptorIndex::FindSymbol(StringPiece name) {
+EncodedDescriptorDatabase::DescriptorIndex::FindSymbol(absl::string_view name) {
EnsureFlat();
return FindSymbolOnlyFlat(name);
}
std::pair<const void*, int>
EncodedDescriptorDatabase::DescriptorIndex::FindSymbolOnlyFlat(
- StringPiece name) const {
+ absl::string_view name) const {
auto iter =
FindLastLessOrEqual(&by_symbol_flat_, name, by_symbol_.key_comp());
@@ -788,7 +800,7 @@
std::pair<const void*, int>
EncodedDescriptorDatabase::DescriptorIndex::FindExtension(
- StringPiece containing_type, int field_number) {
+ absl::string_view containing_type, int field_number) {
EnsureFlat();
auto it = std::lower_bound(
@@ -820,7 +832,7 @@
}
bool EncodedDescriptorDatabase::DescriptorIndex::FindAllExtensionNumbers(
- StringPiece containing_type, std::vector<int>* output) {
+ absl::string_view containing_type, std::vector<int>* output) {
EnsureFlat();
bool success = false;
@@ -853,7 +865,7 @@
std::pair<const void*, int>
EncodedDescriptorDatabase::DescriptorIndex::FindFile(
- StringPiece filename) {
+ absl::string_view filename) {
EnsureFlat();
auto it = std::lower_bound(by_name_flat_.begin(), by_name_flat_.end(),
diff --git a/src/google/protobuf/descriptor_database.h b/src/google/protobuf/descriptor_database.h
index f4f06bb..942f975 100644
--- a/src/google/protobuf/descriptor_database.h
+++ b/src/google/protobuf/descriptor_database.h
@@ -43,11 +43,11 @@
#include <utility>
#include <vector>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/descriptor.h>
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/port.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
#ifdef SWIG
#error "You cannot SWIG proto headers"
@@ -74,6 +74,8 @@
class PROTOBUF_EXPORT DescriptorDatabase {
public:
inline DescriptorDatabase() {}
+ DescriptorDatabase(const DescriptorDatabase&) = delete;
+ DescriptorDatabase& operator=(const DescriptorDatabase&) = delete;
virtual ~DescriptorDatabase();
// Find a file by file name. Fills in in *output and returns true if found.
@@ -136,9 +138,6 @@
// searching all message names, otherwise returns false and leaves output
// unchanged.
bool FindAllMessageNames(std::vector<std::string>* output);
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DescriptorDatabase);
};
// A DescriptorDatabase into which you can insert files manually.
@@ -165,6 +164,8 @@
class PROTOBUF_EXPORT SimpleDescriptorDatabase : public DescriptorDatabase {
public:
SimpleDescriptorDatabase();
+ SimpleDescriptorDatabase(const SimpleDescriptorDatabase&) = delete;
+ SimpleDescriptorDatabase& operator=(const SimpleDescriptorDatabase&) = delete;
~SimpleDescriptorDatabase() override;
// Adds the FileDescriptorProto to the database, making a copy. The object
@@ -176,6 +177,10 @@
// Adds the FileDescriptorProto to the database and takes ownership of it.
bool AddAndOwn(const FileDescriptorProto* file);
+ // Adds the FileDescriptorProto to the database and not take ownership of it.
+ // The owner must ensure file outlives the SimpleDescriptorDatabase.
+ bool AddUnowned(const FileDescriptorProto* file);
+
// implements DescriptorDatabase -----------------------------------
bool FindFileByName(const std::string& filename,
FileDescriptorProto* output) override;
@@ -274,8 +279,6 @@
// If file is non-nullptr, copy it into *output and return true, otherwise
// return false.
bool MaybeCopy(const FileDescriptorProto* file, FileDescriptorProto* output);
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(SimpleDescriptorDatabase);
};
// Very similar to SimpleDescriptorDatabase, but stores all the descriptors
@@ -286,6 +289,9 @@
class PROTOBUF_EXPORT EncodedDescriptorDatabase : public DescriptorDatabase {
public:
EncodedDescriptorDatabase();
+ EncodedDescriptorDatabase(const EncodedDescriptorDatabase&) = delete;
+ EncodedDescriptorDatabase& operator=(const EncodedDescriptorDatabase&) =
+ delete;
~EncodedDescriptorDatabase() override;
// Adds the FileDescriptorProto to the database. The descriptor is provided
@@ -327,14 +333,14 @@
// return true, otherwise return false.
bool MaybeParse(std::pair<const void*, int> encoded_file,
FileDescriptorProto* output);
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EncodedDescriptorDatabase);
};
// A DescriptorDatabase that fetches files from a given pool.
class PROTOBUF_EXPORT DescriptorPoolDatabase : public DescriptorDatabase {
public:
explicit DescriptorPoolDatabase(const DescriptorPool& pool);
+ DescriptorPoolDatabase(const DescriptorPoolDatabase&) = delete;
+ DescriptorPoolDatabase& operator=(const DescriptorPoolDatabase&) = delete;
~DescriptorPoolDatabase() override;
// implements DescriptorDatabase -----------------------------------
@@ -350,7 +356,6 @@
private:
const DescriptorPool& pool_;
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DescriptorPoolDatabase);
};
// A DescriptorDatabase that wraps two or more others. It first searches the
@@ -365,6 +370,8 @@
// DescriptorDatabases need to stick around.
explicit MergedDescriptorDatabase(
const std::vector<DescriptorDatabase*>& sources);
+ MergedDescriptorDatabase(const MergedDescriptorDatabase&) = delete;
+ MergedDescriptorDatabase& operator=(const MergedDescriptorDatabase&) = delete;
~MergedDescriptorDatabase() override;
// implements DescriptorDatabase -----------------------------------
@@ -387,12 +394,11 @@
private:
std::vector<DescriptorDatabase*> sources_;
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MergedDescriptorDatabase);
};
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_DESCRIPTOR_DATABASE_H__
diff --git a/src/google/protobuf/descriptor_database_unittest.cc b/src/google/protobuf/descriptor_database_unittest.cc
index f582448..d06d0c0 100644
--- a/src/google/protobuf/descriptor_database_unittest.cc
+++ b/src/google/protobuf/descriptor_database_unittest.cc
@@ -34,18 +34,18 @@
//
// This file makes extensive use of RFC 3092. :)
-#include <google/protobuf/descriptor_database.h>
+#include "google/protobuf/descriptor_database.h"
#include <algorithm>
#include <memory>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/text_format.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/text_format.h"
#include <gmock/gmock.h>
-#include <google/protobuf/testing/googletest.h>
+#include "google/protobuf/testing/googletest.h"
#include <gtest/gtest.h>
@@ -572,6 +572,29 @@
EXPECT_THAT(messages, ::testing::UnorderedElementsAre("foo.Foo", "Bar"));
}
+TEST(SimpleDescriptorDatabaseExtraTest, AddUnowned) {
+ FileDescriptorProto f;
+ f.set_name("foo.proto");
+ f.set_package("foo");
+ f.add_message_type()->set_name("Foo");
+
+ FileDescriptorProto b;
+ b.set_name("bar.proto");
+ b.set_package("");
+ b.add_message_type()->set_name("Bar");
+
+ SimpleDescriptorDatabase db;
+ db.AddUnowned(&f);
+ db.AddUnowned(&b);
+
+ std::vector<std::string> packages;
+ EXPECT_TRUE(db.FindAllPackageNames(&packages));
+ EXPECT_THAT(packages, ::testing::UnorderedElementsAre("foo", ""));
+ std::vector<std::string> messages;
+ EXPECT_TRUE(db.FindAllMessageNames(&messages));
+ EXPECT_THAT(messages, ::testing::UnorderedElementsAre("foo.Foo", "Bar"));
+}
+
// ===================================================================
class MergedDescriptorDatabaseTest : public testing::Test {
diff --git a/src/google/protobuf/descriptor_unittest.cc b/src/google/protobuf/descriptor_unittest.cc
index dc47531..d14557c 100644
--- a/src/google/protobuf/descriptor_unittest.cc
+++ b/src/google/protobuf/descriptor_unittest.cc
@@ -38,33 +38,34 @@
#include <memory>
#include <vector>
-#include <google/protobuf/any.pb.h>
-#include <google/protobuf/compiler/importer.h>
-#include <google/protobuf/compiler/parser.h>
-#include <google/protobuf/unittest.pb.h>
-#include <google/protobuf/unittest_custom_options.pb.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/stringprintf.h>
-#include <google/protobuf/unittest_lazy_dependencies.pb.h>
-#include <google/protobuf/unittest_proto3_arena.pb.h>
-#include <google/protobuf/io/tokenizer.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/descriptor_database.h>
-#include <google/protobuf/dynamic_message.h>
-#include <google/protobuf/text_format.h>
-#include <google/protobuf/stubs/strutil.h>
+#include "google/protobuf/any.pb.h"
+#include "google/protobuf/compiler/importer.h"
+#include "google/protobuf/compiler/parser.h"
+#include "google/protobuf/unittest.pb.h"
+#include "google/protobuf/unittest_custom_options.pb.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "absl/strings/str_format.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/unittest_lazy_dependencies.pb.h"
+#include "google/protobuf/unittest_proto3_arena.pb.h"
+#include "google/protobuf/io/tokenizer.h"
+#include "google/protobuf/io/zero_copy_stream_impl.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/descriptor_database.h"
+#include "google/protobuf/dynamic_message.h"
+#include "google/protobuf/text_format.h"
+#include "google/protobuf/stubs/strutil.h"
#include <gmock/gmock.h>
-#include <google/protobuf/testing/googletest.h>
+#include "google/protobuf/testing/googletest.h"
#include <gtest/gtest.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/substitute.h>
+#include "google/protobuf/stubs/logging.h"
+#include "absl/strings/substitute.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
using ::testing::AnyOf;
@@ -247,7 +248,7 @@
break;
}
- strings::SubstituteAndAppend(&text_, "$0: $1: $2: $3\n", filename,
+ absl::SubstituteAndAppend(&text_, "$0: $1: $2: $3\n", filename,
element_name, location_name, message);
}
@@ -292,7 +293,7 @@
break;
}
- strings::SubstituteAndAppend(&warning_text_, "$0: $1: $2: $3\n", filename,
+ absl::SubstituteAndAppend(&warning_text_, "$0: $1: $2: $3\n", filename,
element_name, location_name, message);
}
};
@@ -553,6 +554,27 @@
}
}
+TEST_F(FileDescriptorTest, CopyHeadingTo) {
+ FileDescriptorProto proto;
+ proto.set_name("foo.proto");
+ proto.set_package("foo.bar.baz");
+ proto.set_syntax("proto3");
+
+ // Won't be copied.
+ proto.add_message_type()->set_name("Foo");
+
+ DescriptorPool pool;
+ const FileDescriptor* file = pool.BuildFile(proto);
+ ASSERT_NE(file, nullptr);
+
+ FileDescriptorProto other;
+ file->CopyHeadingTo(&other);
+ EXPECT_EQ(other.name(), "foo.proto");
+ EXPECT_EQ(other.package(), "foo.bar.baz");
+ EXPECT_EQ(other.syntax(), "proto3");
+ EXPECT_TRUE(other.message_type().empty());
+}
+
void ExtractDebugString(
const FileDescriptor* file, std::set<std::string>* visited,
std::vector<std::pair<std::string, std::string>>* debug_strings) {
@@ -569,7 +591,7 @@
public:
// implements ErrorCollector ---------------------------------------
void AddError(int line, int column, const std::string& message) override {
- last_error_ = StringPrintf("%d:%d:", line, column) + message;
+ last_error_ = absl::StrFormat("%d:%d:%s", line, column, message);
}
const std::string& last_error() { return last_error_; }
@@ -1063,6 +1085,34 @@
EXPECT_TRUE(baz_->is_repeated());
}
+TEST_F(DescriptorTest, NeedsUtf8Check) {
+ EXPECT_FALSE(foo_->requires_utf8_validation());
+ EXPECT_FALSE(bar_->requires_utf8_validation());
+
+ // Build a copy of the file in proto3.
+ FileDescriptorProto foo_file3;
+ foo_file_->CopyTo(&foo_file3);
+ foo_file3.set_syntax("proto3");
+
+ // Make this valid proto3 by removing `required` and the one group field.
+ for (auto& f : *foo_file3.mutable_message_type(1)->mutable_field()) {
+ f.clear_label();
+ if (f.type() == FieldDescriptorProto::TYPE_GROUP) {
+ f.set_type(FieldDescriptorProto::TYPE_MESSAGE);
+ }
+ }
+ // Make this valid proto3 by making the first enum value be zero.
+ foo_file3.mutable_enum_type(0)->mutable_value(0)->set_number(0);
+
+ DescriptorPool pool3;
+ const Descriptor* message3 = pool3.BuildFile(foo_file3)->message_type(1);
+ const FieldDescriptor* foo3 = message3->field(0);
+ const FieldDescriptor* bar3 = message3->field(1);
+
+ EXPECT_TRUE(foo3->requires_utf8_validation());
+ EXPECT_FALSE(bar3->requires_utf8_validation());
+}
+
TEST_F(DescriptorTest, IsMap) {
EXPECT_TRUE(map_->is_map());
EXPECT_FALSE(baz_->is_map());
@@ -1535,6 +1585,23 @@
EXPECT_EQ(enum2_, baz2_->type());
}
+TEST_F(EnumDescriptorTest, IsClosed) {
+ // enum_ is proto2.
+ EXPECT_TRUE(enum_->is_closed());
+
+ // Make a proto3 version of enum_.
+ FileDescriptorProto foo_file3;
+ foo_file_->CopyTo(&foo_file3);
+ foo_file3.set_syntax("proto3");
+
+ // Make this valid proto3 by making the first enum value be zero.
+ foo_file3.mutable_enum_type(0)->mutable_value(0)->set_number(0);
+
+ DescriptorPool pool3;
+ const EnumDescriptor* enum3 = pool3.BuildFile(foo_file3)->enum_type(0);
+ EXPECT_FALSE(enum3->is_closed());
+}
+
// ===================================================================
// Test service descriptors.
@@ -4244,7 +4311,7 @@
}
TEST_F(ValidationErrorTest, DebugStringReservedRangeMax) {
- const FileDescriptor* file = BuildFile(strings::Substitute(
+ const FileDescriptor* file = BuildFile(absl::Substitute(
"name: \"foo.proto\" "
"enum_type { "
" name: \"Bar\""
@@ -5557,7 +5624,7 @@
" positive_int_value: 0x80000000 } "
"}",
- "foo.proto: foo.proto: OPTION_VALUE: Value out of range "
+ "foo.proto: foo.proto: OPTION_VALUE: Value out of range, -2147483648 to 2147483647, "
"for int32 option \"foo\".\n");
}
@@ -5574,7 +5641,7 @@
" negative_int_value: -0x80000001 } "
"}",
- "foo.proto: foo.proto: OPTION_VALUE: Value out of range "
+ "foo.proto: foo.proto: OPTION_VALUE: Value out of range, -2147483648 to 2147483647, "
"for int32 option \"foo\".\n");
}
@@ -5590,7 +5657,7 @@
" is_extension: true } "
" string_value: \"5\" } }",
- "foo.proto: foo.proto: OPTION_VALUE: Value must be integer "
+ "foo.proto: foo.proto: OPTION_VALUE: Value must be integer, from -2147483648 to 2147483647, "
"for int32 option \"foo\".\n");
}
@@ -5608,7 +5675,7 @@
"} "
"}",
- "foo.proto: foo.proto: OPTION_VALUE: Value out of range "
+ "foo.proto: foo.proto: OPTION_VALUE: Value out of range, -9223372036854775808 to 9223372036854775807, "
"for int64 option \"foo\".\n");
}
@@ -5624,7 +5691,7 @@
" is_extension: true } "
" identifier_value: \"5\" } }",
- "foo.proto: foo.proto: OPTION_VALUE: Value must be integer "
+ "foo.proto: foo.proto: OPTION_VALUE: Value must be integer, from -9223372036854775808 to 9223372036854775807, "
"for int64 option \"foo\".\n");
}
@@ -5640,7 +5707,7 @@
" is_extension: true } "
" positive_int_value: 0x100000000 } }",
- "foo.proto: foo.proto: OPTION_VALUE: Value out of range "
+ "foo.proto: foo.proto: OPTION_VALUE: Value out of range, 0 to 4294967295, "
"for uint32 option \"foo\".\n");
}
@@ -5656,7 +5723,7 @@
" is_extension: true } "
" double_value: -5.6 } }",
- "foo.proto: foo.proto: OPTION_VALUE: Value must be non-negative integer "
+ "foo.proto: foo.proto: OPTION_VALUE: Value must be integer, from 0 to 4294967295, "
"for uint32 option \"foo\".\n");
}
@@ -5672,7 +5739,7 @@
" is_extension: true } "
" negative_int_value: -5 } }",
- "foo.proto: foo.proto: OPTION_VALUE: Value must be non-negative integer "
+ "foo.proto: foo.proto: OPTION_VALUE: Value must be integer, from 0 to 18446744073709551615, "
"for uint64 option \"foo\".\n");
}
@@ -5844,7 +5911,7 @@
// errors. The "value" argument is embedded inside the
// "uninterpreted_option" portion of the result.
static std::string EmbedAggregateValue(const char* value) {
- return strings::Substitute(
+ return absl::Substitute(
"name: \"foo.proto\" "
"dependency: \"google/protobuf/descriptor.proto\" "
"message_type { name: \"Foo\" } "
@@ -6129,7 +6196,9 @@
TEST_F(ValidationErrorTest, MapEntryBase) {
FileDescriptorProto file_proto;
FillValidMapEntry(&file_proto);
- BuildFile(file_proto.DebugString());
+ std::string text_proto;
+ TextFormat::PrintToString(file_proto, &text_proto);
+ BuildFile(text_proto);
}
TEST_F(ValidationErrorTest, MapEntryExtensionRange) {
@@ -7338,19 +7407,19 @@
bool PopulateFile(int file_num, FileDescriptorProto* output) {
GOOGLE_CHECK_GE(file_num, 0);
output->Clear();
- output->set_name(strings::Substitute("file$0.proto", file_num));
+ output->set_name(absl::Substitute("file$0.proto", file_num));
// file0.proto doesn't define Message0
if (file_num > 0) {
DescriptorProto* message = output->add_message_type();
- message->set_name(strings::Substitute("Message$0", file_num));
+ message->set_name(absl::Substitute("Message$0", file_num));
for (int i = 0; i < file_num; ++i) {
- output->add_dependency(strings::Substitute("file$0.proto", i));
+ output->add_dependency(absl::Substitute("file$0.proto", i));
FieldDescriptorProto* field = message->add_field();
- field->set_name(strings::Substitute("field$0", i));
+ field->set_name(absl::Substitute("field$0", i));
field->set_number(i);
field->set_label(FieldDescriptorProto::LABEL_OPTIONAL);
field->set_type(FieldDescriptorProto::TYPE_MESSAGE);
- field->set_type_name(strings::Substitute("Message$0", i));
+ field->set_type_name(absl::Substitute("Message$0", i));
}
}
return true;
@@ -7400,6 +7469,8 @@
class AbortingErrorCollector : public DescriptorPool::ErrorCollector {
public:
AbortingErrorCollector() {}
+ AbortingErrorCollector(const AbortingErrorCollector&) = delete;
+ AbortingErrorCollector& operator=(const AbortingErrorCollector&) = delete;
void AddError(const std::string& filename, const std::string& element_name,
const Message* message, ErrorLocation location,
@@ -7407,9 +7478,6 @@
GOOGLE_LOG(FATAL) << "AddError() called unexpectedly: " << filename << " ["
<< element_name << "]: " << error_message;
}
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(AbortingErrorCollector);
};
// A source tree containing only one file.
@@ -7417,8 +7485,10 @@
public:
SingletonSourceTree(const std::string& filename, const std::string& contents)
: filename_(filename), contents_(contents) {}
+ SingletonSourceTree(const SingletonSourceTree&) = delete;
+ SingletonSourceTree& operator=(const SingletonSourceTree&) = delete;
- io::ZeroCopyInputStream* Open(const std::string& filename) override {
+ io::ZeroCopyInputStream* Open(absl::string_view filename) override {
return filename == filename_
? new io::ArrayInputStream(contents_.data(), contents_.size())
: nullptr;
@@ -7427,8 +7497,6 @@
private:
const std::string filename_;
const std::string contents_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(SingletonSourceTree);
};
const char* const kSourceLocationTestInput =
@@ -7523,7 +7591,7 @@
}
static std::string PrintSourceLocation(const SourceLocation& loc) {
- return strings::Substitute("$0:$1-$2:$3", 1 + loc.start_line,
+ return absl::Substitute("$0:$1-$2:$3", 1 + loc.start_line,
1 + loc.start_column, 1 + loc.end_line,
1 + loc.end_column);
}
@@ -8427,4 +8495,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/drop_unknown_fields_test.cc b/src/google/protobuf/drop_unknown_fields_test.cc
index 55c6b67..747cb5b 100644
--- a/src/google/protobuf/drop_unknown_fields_test.cc
+++ b/src/google/protobuf/drop_unknown_fields_test.cc
@@ -30,9 +30,9 @@
#include <memory>
-#include <google/protobuf/unittest_drop_unknown_fields.pb.h>
-#include <google/protobuf/dynamic_message.h>
-#include <google/protobuf/message_lite.h>
+#include "google/protobuf/unittest_drop_unknown_fields.pb.h"
+#include "google/protobuf/dynamic_message.h"
+#include "google/protobuf/message_lite.h"
#include <gtest/gtest.h>
using unittest_drop_unknown_fields::Foo;
diff --git a/src/google/protobuf/duration.pb.cc b/src/google/protobuf/duration.pb.cc
index 72766bd..18d3e42 100644
--- a/src/google/protobuf/duration.pb.cc
+++ b/src/google/protobuf/duration.pb.cc
@@ -1,25 +1,23 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: google/protobuf/duration.proto
-#include <google/protobuf/duration.pb.h>
+#include "google/protobuf/duration.pb.h"
#include <algorithm>
-
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/extension_set.h>
-#include <google/protobuf/wire_format_lite.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/generated_message_reflection.h>
-#include <google/protobuf/reflection_ops.h>
-#include <google/protobuf/wire_format.h>
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/extension_set.h"
+#include "google/protobuf/wire_format_lite.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/generated_message_reflection.h"
+#include "google/protobuf/reflection_ops.h"
+#include "google/protobuf/wire_format.h"
// @@protoc_insertion_point(includes)
-#include <google/protobuf/port_def.inc>
+// Must be included last.
+#include "google/protobuf/port_def.inc"
PROTOBUF_PRAGMA_INIT_SEG
-
namespace _pb = ::PROTOBUF_NAMESPACE_ID;
-namespace _pbi = _pb::internal;
-
+namespace _pbi = ::PROTOBUF_NAMESPACE_ID::internal;
PROTOBUF_NAMESPACE_OPEN
PROTOBUF_CONSTEXPR Duration::Duration(
::_pbi::ConstantInitialized): _impl_{
@@ -27,62 +25,88 @@
, /*decltype(_impl_.nanos_)*/0
, /*decltype(_impl_._cached_size_)*/{}} {}
struct DurationDefaultTypeInternal {
- PROTOBUF_CONSTEXPR DurationDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR DurationDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~DurationDefaultTypeInternal() {}
union {
Duration _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 DurationDefaultTypeInternal _Duration_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 DurationDefaultTypeInternal _Duration_default_instance_;
PROTOBUF_NAMESPACE_CLOSE
static ::_pb::Metadata file_level_metadata_google_2fprotobuf_2fduration_2eproto[1];
-static constexpr ::_pb::EnumDescriptor const** file_level_enum_descriptors_google_2fprotobuf_2fduration_2eproto = nullptr;
-static constexpr ::_pb::ServiceDescriptor const** file_level_service_descriptors_google_2fprotobuf_2fduration_2eproto = nullptr;
-
-const uint32_t TableStruct_google_2fprotobuf_2fduration_2eproto::offsets[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
- ~0u, // no _has_bits_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Duration, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Duration, _impl_.seconds_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Duration, _impl_.nanos_),
+static constexpr const ::_pb::EnumDescriptor**
+ file_level_enum_descriptors_google_2fprotobuf_2fduration_2eproto = nullptr;
+static constexpr const ::_pb::ServiceDescriptor**
+ file_level_service_descriptors_google_2fprotobuf_2fduration_2eproto = nullptr;
+const uint32_t TableStruct_google_2fprotobuf_2fduration_2eproto::offsets[] PROTOBUF_SECTION_VARIABLE(
+ protodesc_cold) = {
+ ~0u, // no _has_bits_
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Duration, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Duration, _impl_.seconds_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Duration, _impl_.nanos_),
};
-static const ::_pbi::MigrationSchema schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
- { 0, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::Duration)},
+
+static const ::_pbi::MigrationSchema
+ schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
+ { 0, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::Duration)},
};
static const ::_pb::Message* const file_default_instances[] = {
- &::PROTOBUF_NAMESPACE_ID::_Duration_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_Duration_default_instance_._instance,
};
-
-const char descriptor_table_protodef_google_2fprotobuf_2fduration_2eproto[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) =
- "\n\036google/protobuf/duration.proto\022\017google"
- ".protobuf\"*\n\010Duration\022\017\n\007seconds\030\001 \001(\003\022\r"
- "\n\005nanos\030\002 \001(\005B\203\001\n\023com.google.protobufB\rD"
- "urationProtoP\001Z1google.golang.org/protob"
- "uf/types/known/durationpb\370\001\001\242\002\003GPB\252\002\036Goo"
- "gle.Protobuf.WellKnownTypesb\006proto3"
- ;
-static ::_pbi::once_flag descriptor_table_google_2fprotobuf_2fduration_2eproto_once;
+const char descriptor_table_protodef_google_2fprotobuf_2fduration_2eproto[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
+ "\n\036google/protobuf/duration.proto\022\017google"
+ ".protobuf\"*\n\010Duration\022\017\n\007seconds\030\001 \001(\003\022\r"
+ "\n\005nanos\030\002 \001(\005B\203\001\n\023com.google.protobufB\rD"
+ "urationProtoP\001Z1google.golang.org/protob"
+ "uf/types/known/durationpb\370\001\001\242\002\003GPB\252\002\036Goo"
+ "gle.Protobuf.WellKnownTypesb\006proto3"
+};
+static ::absl::once_flag descriptor_table_google_2fprotobuf_2fduration_2eproto_once;
const ::_pbi::DescriptorTable descriptor_table_google_2fprotobuf_2fduration_2eproto = {
- false, false, 235, descriptor_table_protodef_google_2fprotobuf_2fduration_2eproto,
+ false,
+ false,
+ 235,
+ descriptor_table_protodef_google_2fprotobuf_2fduration_2eproto,
"google/protobuf/duration.proto",
- &descriptor_table_google_2fprotobuf_2fduration_2eproto_once, nullptr, 0, 1,
- schemas, file_default_instances, TableStruct_google_2fprotobuf_2fduration_2eproto::offsets,
- file_level_metadata_google_2fprotobuf_2fduration_2eproto, file_level_enum_descriptors_google_2fprotobuf_2fduration_2eproto,
+ &descriptor_table_google_2fprotobuf_2fduration_2eproto_once,
+ nullptr,
+ 0,
+ 1,
+ schemas,
+ file_default_instances,
+ TableStruct_google_2fprotobuf_2fduration_2eproto::offsets,
+ file_level_metadata_google_2fprotobuf_2fduration_2eproto,
+ file_level_enum_descriptors_google_2fprotobuf_2fduration_2eproto,
file_level_service_descriptors_google_2fprotobuf_2fduration_2eproto,
};
+
+// This function exists to be marked as weak.
+// It can significantly speed up compilation by breaking up LLVM's SCC
+// in the .pb.cc translation units. Large translation units see a
+// reduction of more than 35% of walltime for optimized builds. Without
+// the weak attribute all the messages in the file, including all the
+// vtables and everything they use become part of the same SCC through
+// a cycle like:
+// GetMetadata -> descriptor table -> default instances ->
+// vtables -> GetMetadata
+// By adding a weak function here we break the connection from the
+// individual vtables back into the descriptor table.
PROTOBUF_ATTRIBUTE_WEAK const ::_pbi::DescriptorTable* descriptor_table_google_2fprotobuf_2fduration_2eproto_getter() {
return &descriptor_table_google_2fprotobuf_2fduration_2eproto;
}
-
// Force running AddDescriptors() at dynamic initialization time.
-PROTOBUF_ATTRIBUTE_INIT_PRIORITY2 static ::_pbi::AddDescriptorsRunner dynamic_init_dummy_google_2fprotobuf_2fduration_2eproto(&descriptor_table_google_2fprotobuf_2fduration_2eproto);
+PROTOBUF_ATTRIBUTE_INIT_PRIORITY2
+static ::_pbi::AddDescriptorsRunner dynamic_init_dummy_google_2fprotobuf_2fduration_2eproto(&descriptor_table_google_2fprotobuf_2fduration_2eproto);
PROTOBUF_NAMESPACE_OPEN
-
// ===================================================================
class Duration::_Internal {
@@ -293,7 +317,6 @@
&descriptor_table_google_2fprotobuf_2fduration_2eproto_getter, &descriptor_table_google_2fprotobuf_2fduration_2eproto_once,
file_level_metadata_google_2fprotobuf_2fduration_2eproto[0]);
}
-
// @@protoc_insertion_point(namespace_scope)
PROTOBUF_NAMESPACE_CLOSE
PROTOBUF_NAMESPACE_OPEN
@@ -302,6 +325,5 @@
return Arena::CreateMessageInternal< ::PROTOBUF_NAMESPACE_ID::Duration >(arena);
}
PROTOBUF_NAMESPACE_CLOSE
-
// @@protoc_insertion_point(global_scope)
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/duration.pb.h b/src/google/protobuf/duration.pb.h
index 0b80557..2c1a550 100644
--- a/src/google/protobuf/duration.pb.h
+++ b/src/google/protobuf/duration.pb.h
@@ -1,38 +1,43 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: google/protobuf/duration.proto
-#ifndef GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fduration_2eproto
-#define GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fduration_2eproto
+#ifndef GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fduration_2eproto_2epb_2eh
+#define GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fduration_2eproto_2epb_2eh
#include <limits>
#include <string>
+#include <type_traits>
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
#if PROTOBUF_VERSION < 3021000
-#error This file was generated by a newer version of protoc which is
-#error incompatible with your Protocol Buffer headers. Please update
-#error your headers.
-#endif
-#if 3021007 < PROTOBUF_MIN_PROTOC_VERSION
-#error This file was generated by an older version of protoc which is
-#error incompatible with your Protocol Buffer headers. Please
-#error regenerate this file with a newer version of protoc.
-#endif
+#error "This file was generated by a newer version of protoc which is"
+#error "incompatible with your Protocol Buffer headers. Please update"
+#error "your headers."
+#endif // PROTOBUF_VERSION
-#include <google/protobuf/port_undef.inc>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/arena.h>
-#include <google/protobuf/arenastring.h>
-#include <google/protobuf/generated_message_util.h>
-#include <google/protobuf/metadata_lite.h>
-#include <google/protobuf/generated_message_reflection.h>
-#include <google/protobuf/message.h>
-#include <google/protobuf/repeated_field.h> // IWYU pragma: export
-#include <google/protobuf/extension_set.h> // IWYU pragma: export
-#include <google/protobuf/unknown_field_set.h>
+#if 3021007 < PROTOBUF_MIN_PROTOC_VERSION
+#error "This file was generated by an older version of protoc which is"
+#error "incompatible with your Protocol Buffer headers. Please"
+#error "regenerate this file with a newer version of protoc."
+#endif // PROTOBUF_MIN_PROTOC_VERSION
+#include "google/protobuf/port_undef.inc"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/arena.h"
+#include "google/protobuf/arenastring.h"
+#include "google/protobuf/generated_message_util.h"
+#include "google/protobuf/metadata_lite.h"
+#include "google/protobuf/generated_message_reflection.h"
+#include "google/protobuf/message.h"
+#include "google/protobuf/repeated_field.h" // IWYU pragma: export
+#include "google/protobuf/extension_set.h" // IWYU pragma: export
+#include "google/protobuf/unknown_field_set.h"
// @@protoc_insertion_point(includes)
-#include <google/protobuf/port_def.inc>
+
+// Must be included last.
+#include "google/protobuf/port_def.inc"
+
#define PROTOBUF_INTERNAL_EXPORT_google_2fprotobuf_2fduration_2eproto PROTOBUF_EXPORT
+
PROTOBUF_NAMESPACE_OPEN
namespace internal {
class AnyMetadata;
@@ -43,19 +48,23 @@
struct PROTOBUF_EXPORT TableStruct_google_2fprotobuf_2fduration_2eproto {
static const uint32_t offsets[];
};
-PROTOBUF_EXPORT extern const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_google_2fprotobuf_2fduration_2eproto;
+PROTOBUF_EXPORT extern const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable
+ descriptor_table_google_2fprotobuf_2fduration_2eproto;
PROTOBUF_NAMESPACE_OPEN
class Duration;
struct DurationDefaultTypeInternal;
PROTOBUF_EXPORT extern DurationDefaultTypeInternal _Duration_default_instance_;
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::Duration* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::Duration>(Arena*);
PROTOBUF_NAMESPACE_CLOSE
-PROTOBUF_NAMESPACE_OPEN
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::Duration* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::Duration>(Arena*);
-PROTOBUF_NAMESPACE_CLOSE
+
PROTOBUF_NAMESPACE_OPEN
// ===================================================================
+
+// -------------------------------------------------------------------
+
class PROTOBUF_EXPORT Duration final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.Duration) */ {
public:
@@ -159,7 +168,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.Duration";
}
protected:
@@ -216,12 +225,17 @@
// ===================================================================
+
+
// ===================================================================
+
#ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wstrict-aliasing"
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wstrict-aliasing"
#endif // __GNUC__
+// -------------------------------------------------------------------
+
// Duration
// int64 seconds = 1;
@@ -236,7 +250,7 @@
return _internal_seconds();
}
inline void Duration::_internal_set_seconds(int64_t value) {
-
+
_impl_.seconds_ = value;
}
inline void Duration::set_seconds(int64_t value) {
@@ -256,7 +270,7 @@
return _internal_nanos();
}
inline void Duration::_internal_set_nanos(int32_t value) {
-
+
_impl_.nanos_ = value;
}
inline void Duration::set_nanos(int32_t value) {
@@ -265,14 +279,15 @@
}
#ifdef __GNUC__
- #pragma GCC diagnostic pop
+#pragma GCC diagnostic pop
#endif // __GNUC__
// @@protoc_insertion_point(namespace_scope)
-
PROTOBUF_NAMESPACE_CLOSE
+
// @@protoc_insertion_point(global_scope)
-#include <google/protobuf/port_undef.inc>
-#endif // GOOGLE_PROTOBUF_INCLUDED_GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fduration_2eproto
+#include "google/protobuf/port_undef.inc"
+
+#endif // GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fduration_2eproto_2epb_2eh
diff --git a/src/google/protobuf/dynamic_message.cc b/src/google/protobuf/dynamic_message.cc
index 1c96ca2..16bce6e 100644
--- a/src/google/protobuf/dynamic_message.cc
+++ b/src/google/protobuf/dynamic_message.cc
@@ -62,7 +62,7 @@
// Item 8 of "More Effective C++" discusses this in more detail, though
// I don't have the book on me right now so I'm not sure.
-#include <google/protobuf/dynamic_message.h>
+#include "google/protobuf/dynamic_message.h"
#include <algorithm>
#include <cstddef>
@@ -70,23 +70,23 @@
#include <new>
#include <unordered_map>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/generated_message_reflection.h>
-#include <google/protobuf/generated_message_util.h>
-#include <google/protobuf/unknown_field_set.h>
-#include <google/protobuf/stubs/hash.h>
-#include <google/protobuf/arenastring.h>
-#include <google/protobuf/extension_set.h>
-#include <google/protobuf/map_field.h>
-#include <google/protobuf/map_field_inl.h>
-#include <google/protobuf/map_type_handler.h>
-#include <google/protobuf/reflection_ops.h>
-#include <google/protobuf/repeated_field.h>
-#include <google/protobuf/wire_format.h>
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/generated_message_reflection.h"
+#include "google/protobuf/generated_message_util.h"
+#include "google/protobuf/unknown_field_set.h"
+#include "google/protobuf/arenastring.h"
+#include "google/protobuf/extension_set.h"
+#include "google/protobuf/map_field.h"
+#include "google/protobuf/map_field_inl.h"
+#include "google/protobuf/map_type_handler.h"
+#include "google/protobuf/reflection_ops.h"
+#include "google/protobuf/repeated_field.h"
+#include "google/protobuf/wire_format.h"
+
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -105,22 +105,6 @@
bool IsMapFieldInApi(const FieldDescriptor* field) { return field->is_map(); }
-// Sync with helpers.h.
-inline bool HasHasbit(const FieldDescriptor* field) {
- // This predicate includes proto3 message fields only if they have "optional".
- // Foo submsg1 = 1; // HasHasbit() == false
- // optional Foo submsg2 = 2; // HasHasbit() == true
- // This is slightly odd, as adding "optional" to a singular proto3 field does
- // not change the semantics or API. However whenever any field in a message
- // has a hasbit, it forces reflection to include hasbit offsets for *all*
- // fields, even if almost all of them are set to -1 (no hasbit). So to avoid
- // causing a sudden size regression for ~all proto3 messages, we give proto3
- // message fields a hasbit only if "optional" is present. If the user is
- // explicitly writing "optional", it is likely they are writing it on
- // primitive fields also.
- return (field->has_optional_keyword() || field->is_required()) &&
- !field->options().weak();
-}
inline bool InRealOneof(const FieldDescriptor* field) {
return field->containing_oneof() &&
@@ -224,6 +208,8 @@
// This should only be used by GetPrototypeNoLock() to avoid dead lock.
DynamicMessage(DynamicMessageFactory::TypeInfo* type_info, bool lock_factory);
+ DynamicMessage(const DynamicMessage&) = delete;
+ DynamicMessage& operator=(const DynamicMessage&) = delete;
~DynamicMessage() override;
@@ -285,7 +271,6 @@
const DynamicMessageFactory::TypeInfo* type_info_;
mutable std::atomic<int> cached_byte_size_;
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DynamicMessage);
};
struct DynamicMessageFactory::TypeInfo {
@@ -313,7 +298,21 @@
TypeInfo() : prototype(nullptr) {}
- ~TypeInfo() { delete prototype; }
+ ~TypeInfo() {
+ delete prototype;
+
+ // Scribble the payload to prevent unsanitized opt builds from silently
+ // allowing use-after-free bugs where the factory is destroyed but the
+ // DynamicMessage instances are still used.
+ // This is a common bug with DynamicMessageFactory.
+ // NOTE: This must happen after deleting the prototype.
+ if (offsets != nullptr) {
+ std::fill_n(offsets.get(), type->field_count(), 0xCDCDCDCDu);
+ }
+ if (has_bits_indices != nullptr) {
+ std::fill_n(has_bits_indices.get(), type->field_count(), 0xCDCDCDCDu);
+ }
+ }
};
DynamicMessage::DynamicMessage(const DynamicMessageFactory::TypeInfo* type_info)
@@ -653,7 +652,7 @@
}
const Message* DynamicMessageFactory::GetPrototype(const Descriptor* type) {
- MutexLock lock(&prototypes_mutex_);
+ absl::MutexLock lock(&prototypes_mutex_);
return GetPrototypeNoLock(type);
}
@@ -705,7 +704,7 @@
type_info->has_bits_offset = -1;
int max_hasbit = 0;
for (int i = 0; i < type->field_count(); i++) {
- if (HasHasbit(type->field(i))) {
+ if (internal::cpp::HasHasbit(type->field(i))) {
if (type_info->has_bits_offset == -1) {
// At least one field in the message requires a hasbit, so allocate
// hasbits.
@@ -808,8 +807,11 @@
type_info->oneof_case_offset,
type_info->size,
type_info->weak_field_map_offset,
- nullptr /* inlined_string_indices_ */,
- 0 /* inlined_string_donated_offset_ */};
+ nullptr, // inlined_string_indices_
+ 0, // inlined_string_donated_offset_
+ -1, // split_offset_
+ -1, // sizeof_split_
+ };
type_info->reflection.reset(
new Reflection(type_info->type, schema, type_info->pool, this));
@@ -823,4 +825,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc> // NOLINT
+#include "google/protobuf/port_undef.inc" // NOLINT
diff --git a/src/google/protobuf/dynamic_message.h b/src/google/protobuf/dynamic_message.h
index 6fa6425..bec0a1e 100644
--- a/src/google/protobuf/dynamic_message.h
+++ b/src/google/protobuf/dynamic_message.h
@@ -44,18 +44,18 @@
#include <unordered_map>
#include <vector>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/mutex.h>
-#include <google/protobuf/message.h>
-#include <google/protobuf/reflection.h>
-#include <google/protobuf/repeated_field.h>
+#include "absl/synchronization/mutex.h"
+#include "google/protobuf/message.h"
+#include "google/protobuf/port.h"
+#include "google/protobuf/reflection.h"
+#include "google/protobuf/repeated_field.h"
#ifdef SWIG
#error "You cannot SWIG proto headers"
#endif
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -81,6 +81,9 @@
// encapsulates this "cache". All DynamicMessages of the same type created
// from the same factory will share the same support data. Any Descriptors
// used with a particular factory must outlive the factory.
+//
+// The thread safety for this class is subtle, see comments around GetPrototype
+// for details
class PROTOBUF_EXPORT DynamicMessageFactory : public MessageFactory {
public:
// Construct a DynamicMessageFactory that will search for extensions in
@@ -95,6 +98,8 @@
// this is almost never what you want to do. Almost all users should use
// the zero-arg constructor.
DynamicMessageFactory(const DescriptorPool* pool);
+ DynamicMessageFactory(const DynamicMessageFactory&) = delete;
+ DynamicMessageFactory& operator=(const DynamicMessageFactory&) = delete;
~DynamicMessageFactory() override;
@@ -133,12 +138,10 @@
struct TypeInfo;
std::unordered_map<const Descriptor*, const TypeInfo*> prototypes_;
- mutable internal::WrappedMutex prototypes_mutex_;
+ mutable absl::Mutex prototypes_mutex_;
friend class DynamicMessage;
const Message* GetPrototypeNoLock(const Descriptor* type);
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DynamicMessageFactory);
};
// Helper for computing a sorted list of map entries via reflection.
@@ -222,6 +225,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_DYNAMIC_MESSAGE_H__
diff --git a/src/google/protobuf/dynamic_message_unittest.cc b/src/google/protobuf/dynamic_message_unittest.cc
index 7ac2029..6dd1184 100644
--- a/src/google/protobuf/dynamic_message_unittest.cc
+++ b/src/google/protobuf/dynamic_message_unittest.cc
@@ -40,19 +40,19 @@
// reflection_ops_unittest, cover the rest of the functionality used by
// DynamicMessage.
-#include <google/protobuf/dynamic_message.h>
+#include "google/protobuf/dynamic_message.h"
#include <memory>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/unittest.pb.h>
-#include <google/protobuf/unittest_no_field_presence.pb.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/testing/googletest.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/unittest.pb.h"
+#include "google/protobuf/unittest_no_field_presence.pb.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/testing/googletest.h"
#include <gtest/gtest.h>
-#include <google/protobuf/test_util.h>
+#include "google/protobuf/test_util.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/empty.pb.cc b/src/google/protobuf/empty.pb.cc
index 3a30776..91ba9f2 100644
--- a/src/google/protobuf/empty.pb.cc
+++ b/src/google/protobuf/empty.pb.cc
@@ -1,82 +1,106 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: google/protobuf/empty.proto
-#include <google/protobuf/empty.pb.h>
+#include "google/protobuf/empty.pb.h"
#include <algorithm>
-
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/extension_set.h>
-#include <google/protobuf/wire_format_lite.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/generated_message_reflection.h>
-#include <google/protobuf/reflection_ops.h>
-#include <google/protobuf/wire_format.h>
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/extension_set.h"
+#include "google/protobuf/wire_format_lite.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/generated_message_reflection.h"
+#include "google/protobuf/reflection_ops.h"
+#include "google/protobuf/wire_format.h"
// @@protoc_insertion_point(includes)
-#include <google/protobuf/port_def.inc>
+// Must be included last.
+#include "google/protobuf/port_def.inc"
PROTOBUF_PRAGMA_INIT_SEG
-
namespace _pb = ::PROTOBUF_NAMESPACE_ID;
-namespace _pbi = _pb::internal;
-
+namespace _pbi = ::PROTOBUF_NAMESPACE_ID::internal;
PROTOBUF_NAMESPACE_OPEN
PROTOBUF_CONSTEXPR Empty::Empty(
::_pbi::ConstantInitialized) {}
struct EmptyDefaultTypeInternal {
- PROTOBUF_CONSTEXPR EmptyDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR EmptyDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~EmptyDefaultTypeInternal() {}
union {
Empty _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 EmptyDefaultTypeInternal _Empty_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 EmptyDefaultTypeInternal _Empty_default_instance_;
PROTOBUF_NAMESPACE_CLOSE
static ::_pb::Metadata file_level_metadata_google_2fprotobuf_2fempty_2eproto[1];
-static constexpr ::_pb::EnumDescriptor const** file_level_enum_descriptors_google_2fprotobuf_2fempty_2eproto = nullptr;
-static constexpr ::_pb::ServiceDescriptor const** file_level_service_descriptors_google_2fprotobuf_2fempty_2eproto = nullptr;
-
-const uint32_t TableStruct_google_2fprotobuf_2fempty_2eproto::offsets[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
- ~0u, // no _has_bits_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Empty, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
+static constexpr const ::_pb::EnumDescriptor**
+ file_level_enum_descriptors_google_2fprotobuf_2fempty_2eproto = nullptr;
+static constexpr const ::_pb::ServiceDescriptor**
+ file_level_service_descriptors_google_2fprotobuf_2fempty_2eproto = nullptr;
+const uint32_t TableStruct_google_2fprotobuf_2fempty_2eproto::offsets[] PROTOBUF_SECTION_VARIABLE(
+ protodesc_cold) = {
+ ~0u, // no _has_bits_
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Empty, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
};
-static const ::_pbi::MigrationSchema schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
- { 0, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::Empty)},
+
+static const ::_pbi::MigrationSchema
+ schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
+ { 0, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::Empty)},
};
static const ::_pb::Message* const file_default_instances[] = {
- &::PROTOBUF_NAMESPACE_ID::_Empty_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_Empty_default_instance_._instance,
};
-
-const char descriptor_table_protodef_google_2fprotobuf_2fempty_2eproto[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) =
- "\n\033google/protobuf/empty.proto\022\017google.pr"
- "otobuf\"\007\n\005EmptyB}\n\023com.google.protobufB\n"
- "EmptyProtoP\001Z.google.golang.org/protobuf"
- "/types/known/emptypb\370\001\001\242\002\003GPB\252\002\036Google.P"
- "rotobuf.WellKnownTypesb\006proto3"
- ;
-static ::_pbi::once_flag descriptor_table_google_2fprotobuf_2fempty_2eproto_once;
+const char descriptor_table_protodef_google_2fprotobuf_2fempty_2eproto[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
+ "\n\033google/protobuf/empty.proto\022\017google.pr"
+ "otobuf\"\007\n\005EmptyB}\n\023com.google.protobufB\n"
+ "EmptyProtoP\001Z.google.golang.org/protobuf"
+ "/types/known/emptypb\370\001\001\242\002\003GPB\252\002\036Google.P"
+ "rotobuf.WellKnownTypesb\006proto3"
+};
+static ::absl::once_flag descriptor_table_google_2fprotobuf_2fempty_2eproto_once;
const ::_pbi::DescriptorTable descriptor_table_google_2fprotobuf_2fempty_2eproto = {
- false, false, 190, descriptor_table_protodef_google_2fprotobuf_2fempty_2eproto,
+ false,
+ false,
+ 190,
+ descriptor_table_protodef_google_2fprotobuf_2fempty_2eproto,
"google/protobuf/empty.proto",
- &descriptor_table_google_2fprotobuf_2fempty_2eproto_once, nullptr, 0, 1,
- schemas, file_default_instances, TableStruct_google_2fprotobuf_2fempty_2eproto::offsets,
- file_level_metadata_google_2fprotobuf_2fempty_2eproto, file_level_enum_descriptors_google_2fprotobuf_2fempty_2eproto,
+ &descriptor_table_google_2fprotobuf_2fempty_2eproto_once,
+ nullptr,
+ 0,
+ 1,
+ schemas,
+ file_default_instances,
+ TableStruct_google_2fprotobuf_2fempty_2eproto::offsets,
+ file_level_metadata_google_2fprotobuf_2fempty_2eproto,
+ file_level_enum_descriptors_google_2fprotobuf_2fempty_2eproto,
file_level_service_descriptors_google_2fprotobuf_2fempty_2eproto,
};
+
+// This function exists to be marked as weak.
+// It can significantly speed up compilation by breaking up LLVM's SCC
+// in the .pb.cc translation units. Large translation units see a
+// reduction of more than 35% of walltime for optimized builds. Without
+// the weak attribute all the messages in the file, including all the
+// vtables and everything they use become part of the same SCC through
+// a cycle like:
+// GetMetadata -> descriptor table -> default instances ->
+// vtables -> GetMetadata
+// By adding a weak function here we break the connection from the
+// individual vtables back into the descriptor table.
PROTOBUF_ATTRIBUTE_WEAK const ::_pbi::DescriptorTable* descriptor_table_google_2fprotobuf_2fempty_2eproto_getter() {
return &descriptor_table_google_2fprotobuf_2fempty_2eproto;
}
-
// Force running AddDescriptors() at dynamic initialization time.
-PROTOBUF_ATTRIBUTE_INIT_PRIORITY2 static ::_pbi::AddDescriptorsRunner dynamic_init_dummy_google_2fprotobuf_2fempty_2eproto(&descriptor_table_google_2fprotobuf_2fempty_2eproto);
+PROTOBUF_ATTRIBUTE_INIT_PRIORITY2
+static ::_pbi::AddDescriptorsRunner dynamic_init_dummy_google_2fprotobuf_2fempty_2eproto(&descriptor_table_google_2fprotobuf_2fempty_2eproto);
PROTOBUF_NAMESPACE_OPEN
-
// ===================================================================
class Empty::_Internal {
@@ -116,7 +140,6 @@
&descriptor_table_google_2fprotobuf_2fempty_2eproto_getter, &descriptor_table_google_2fprotobuf_2fempty_2eproto_once,
file_level_metadata_google_2fprotobuf_2fempty_2eproto[0]);
}
-
// @@protoc_insertion_point(namespace_scope)
PROTOBUF_NAMESPACE_CLOSE
PROTOBUF_NAMESPACE_OPEN
@@ -125,6 +148,5 @@
return Arena::CreateMessageInternal< ::PROTOBUF_NAMESPACE_ID::Empty >(arena);
}
PROTOBUF_NAMESPACE_CLOSE
-
// @@protoc_insertion_point(global_scope)
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/empty.pb.h b/src/google/protobuf/empty.pb.h
index d57dedb..c8c03c3 100644
--- a/src/google/protobuf/empty.pb.h
+++ b/src/google/protobuf/empty.pb.h
@@ -1,39 +1,44 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: google/protobuf/empty.proto
-#ifndef GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fempty_2eproto
-#define GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fempty_2eproto
+#ifndef GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fempty_2eproto_2epb_2eh
+#define GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fempty_2eproto_2epb_2eh
#include <limits>
#include <string>
+#include <type_traits>
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
#if PROTOBUF_VERSION < 3021000
-#error This file was generated by a newer version of protoc which is
-#error incompatible with your Protocol Buffer headers. Please update
-#error your headers.
-#endif
-#if 3021007 < PROTOBUF_MIN_PROTOC_VERSION
-#error This file was generated by an older version of protoc which is
-#error incompatible with your Protocol Buffer headers. Please
-#error regenerate this file with a newer version of protoc.
-#endif
+#error "This file was generated by a newer version of protoc which is"
+#error "incompatible with your Protocol Buffer headers. Please update"
+#error "your headers."
+#endif // PROTOBUF_VERSION
-#include <google/protobuf/port_undef.inc>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/arena.h>
-#include <google/protobuf/arenastring.h>
-#include <google/protobuf/generated_message_bases.h>
-#include <google/protobuf/generated_message_util.h>
-#include <google/protobuf/metadata_lite.h>
-#include <google/protobuf/generated_message_reflection.h>
-#include <google/protobuf/message.h>
-#include <google/protobuf/repeated_field.h> // IWYU pragma: export
-#include <google/protobuf/extension_set.h> // IWYU pragma: export
-#include <google/protobuf/unknown_field_set.h>
+#if 3021007 < PROTOBUF_MIN_PROTOC_VERSION
+#error "This file was generated by an older version of protoc which is"
+#error "incompatible with your Protocol Buffer headers. Please"
+#error "regenerate this file with a newer version of protoc."
+#endif // PROTOBUF_MIN_PROTOC_VERSION
+#include "google/protobuf/port_undef.inc"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/arena.h"
+#include "google/protobuf/arenastring.h"
+#include "google/protobuf/generated_message_bases.h"
+#include "google/protobuf/generated_message_util.h"
+#include "google/protobuf/metadata_lite.h"
+#include "google/protobuf/generated_message_reflection.h"
+#include "google/protobuf/message.h"
+#include "google/protobuf/repeated_field.h" // IWYU pragma: export
+#include "google/protobuf/extension_set.h" // IWYU pragma: export
+#include "google/protobuf/unknown_field_set.h"
// @@protoc_insertion_point(includes)
-#include <google/protobuf/port_def.inc>
+
+// Must be included last.
+#include "google/protobuf/port_def.inc"
+
#define PROTOBUF_INTERNAL_EXPORT_google_2fprotobuf_2fempty_2eproto PROTOBUF_EXPORT
+
PROTOBUF_NAMESPACE_OPEN
namespace internal {
class AnyMetadata;
@@ -44,19 +49,23 @@
struct PROTOBUF_EXPORT TableStruct_google_2fprotobuf_2fempty_2eproto {
static const uint32_t offsets[];
};
-PROTOBUF_EXPORT extern const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_google_2fprotobuf_2fempty_2eproto;
+PROTOBUF_EXPORT extern const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable
+ descriptor_table_google_2fprotobuf_2fempty_2eproto;
PROTOBUF_NAMESPACE_OPEN
class Empty;
struct EmptyDefaultTypeInternal;
PROTOBUF_EXPORT extern EmptyDefaultTypeInternal _Empty_default_instance_;
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::Empty* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::Empty>(Arena*);
PROTOBUF_NAMESPACE_CLOSE
-PROTOBUF_NAMESPACE_OPEN
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::Empty* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::Empty>(Arena*);
-PROTOBUF_NAMESPACE_CLOSE
+
PROTOBUF_NAMESPACE_OPEN
// ===================================================================
+
+// -------------------------------------------------------------------
+
class PROTOBUF_EXPORT Empty final :
public ::PROTOBUF_NAMESPACE_ID::internal::ZeroFieldsBase /* @@protoc_insertion_point(class_definition:google.protobuf.Empty) */ {
public:
@@ -145,7 +154,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.Empty";
}
protected:
@@ -176,23 +185,29 @@
// ===================================================================
+
+
// ===================================================================
+
#ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wstrict-aliasing"
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wstrict-aliasing"
#endif // __GNUC__
+// -------------------------------------------------------------------
+
// Empty
#ifdef __GNUC__
- #pragma GCC diagnostic pop
+#pragma GCC diagnostic pop
#endif // __GNUC__
// @@protoc_insertion_point(namespace_scope)
-
PROTOBUF_NAMESPACE_CLOSE
+
// @@protoc_insertion_point(global_scope)
-#include <google/protobuf/port_undef.inc>
-#endif // GOOGLE_PROTOBUF_INCLUDED_GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fempty_2eproto
+#include "google/protobuf/port_undef.inc"
+
+#endif // GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fempty_2eproto_2epb_2eh
diff --git a/src/google/protobuf/endian.h b/src/google/protobuf/endian.h
index e0ee6cd..2527b3e 100644
--- a/src/google/protobuf/endian.h
+++ b/src/google/protobuf/endian.h
@@ -38,7 +38,7 @@
#include <cstdint>
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -193,6 +193,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_ENDIAN_H__
diff --git a/src/google/protobuf/explicitly_constructed.h b/src/google/protobuf/explicitly_constructed.h
index 174c59a..c273644 100644
--- a/src/google/protobuf/explicitly_constructed.h
+++ b/src/google/protobuf/explicitly_constructed.h
@@ -35,11 +35,11 @@
#include <utility>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
// clang-format off
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
// clang-format on
namespace google {
@@ -92,6 +92,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_EXPLICITLY_CONSTRUCTED_H__
diff --git a/src/google/protobuf/extension_set.cc b/src/google/protobuf/extension_set.cc
index fada4f5..791c1e3 100644
--- a/src/google/protobuf/extension_set.cc
+++ b/src/google/protobuf/extension_set.cc
@@ -32,32 +32,30 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/extension_set.h>
+#include "google/protobuf/extension_set.h"
#include <tuple>
-#include <unordered_set>
#include <utility>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
-#include <google/protobuf/arena.h>
-#include <google/protobuf/extension_set_inl.h>
-#include <google/protobuf/message_lite.h>
-#include <google/protobuf/metadata_lite.h>
-#include <google/protobuf/parse_context.h>
-#include <google/protobuf/port.h>
-#include <google/protobuf/repeated_field.h>
-#include <google/protobuf/stubs/map_util.h>
-#include <google/protobuf/stubs/hash.h>
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/io/zero_copy_stream_impl_lite.h"
+#include "google/protobuf/arena.h"
+#include "absl/container/flat_hash_set.h"
+#include "absl/hash/hash.h"
+#include "google/protobuf/extension_set_inl.h"
+#include "google/protobuf/message_lite.h"
+#include "google/protobuf/metadata_lite.h"
+#include "google/protobuf/parse_context.h"
+#include "google/protobuf/port.h"
+#include "google/protobuf/repeated_field.h"
-// clang-format off
-#include <google/protobuf/port_def.inc> // must be last.
-// clang-format on
+// must be last.
+#include "google/protobuf/port_def.inc"
+
namespace google {
namespace protobuf {
namespace internal {
-
namespace {
inline WireFormatLite::FieldType real_type(FieldType type) {
@@ -71,8 +69,6 @@
// Registry stuff.
-// Note that we cannot use hetererogeneous lookup for std containers since we
-// need to support C++11.
struct ExtensionEq {
bool operator()(const ExtensionInfo& lhs, const ExtensionInfo& rhs) const {
return lhs.message == rhs.message && lhs.number == rhs.number;
@@ -81,13 +77,12 @@
struct ExtensionHasher {
std::size_t operator()(const ExtensionInfo& info) const {
- return std::hash<const MessageLite*>{}(info.message) ^
- std::hash<int>{}(info.number);
+ return absl::HashOf(info.message, info.number);
}
};
using ExtensionRegistry =
- std::unordered_set<ExtensionInfo, ExtensionHasher, ExtensionEq>;
+ absl::flat_hash_set<ExtensionInfo, ExtensionHasher, ExtensionEq>;
static const ExtensionRegistry* global_registry = nullptr;
@@ -96,7 +91,7 @@
void Register(const ExtensionInfo& info) {
static auto local_static_registry = OnShutdownDelete(new ExtensionRegistry);
global_registry = local_static_registry;
- if (!InsertIfNotPresent(local_static_registry, info)) {
+ if (!local_static_registry->insert(info).second) {
GOOGLE_LOG(FATAL) << "Multiple extension registrations for type \""
<< info.message->GetTypeName() << "\", field number "
<< info.number << ".";
@@ -1964,4 +1959,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/extension_set.h b/src/google/protobuf/extension_set.h
index 0e6d052..2ce566a 100644
--- a/src/google/protobuf/extension_set.h
+++ b/src/google/protobuf/extension_set.h
@@ -46,16 +46,17 @@
#include <utility>
#include <vector>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/port.h>
-#include <google/protobuf/parse_context.h>
-#include <google/protobuf/repeated_field.h>
-#include <google/protobuf/wire_format_lite.h>
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/port.h"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/port.h"
+#include "google/protobuf/parse_context.h"
+#include "google/protobuf/repeated_field.h"
+#include "google/protobuf/wire_format_lite.h"
// clang-format off
-#include <google/protobuf/port_def.inc> // Must be last
+#include "google/protobuf/port_def.inc" // Must be last
// clang-format on
#ifdef SWIG
@@ -185,6 +186,8 @@
constexpr ExtensionSet();
explicit ExtensionSet(Arena* arena);
ExtensionSet(ArenaInitialized, Arena* arena) : ExtensionSet(arena) {}
+ ExtensionSet(const ExtensionSet&) = delete;
+ ExtensionSet& operator=(const ExtensionSet&) = delete;
~ExtensionSet();
// These are called at startup by protocol-compiler-generated code to
@@ -538,6 +541,8 @@
class PROTOBUF_EXPORT LazyMessageExtension {
public:
LazyMessageExtension() {}
+ LazyMessageExtension(const LazyMessageExtension&) = delete;
+ LazyMessageExtension& operator=(const LazyMessageExtension&) = delete;
virtual ~LazyMessageExtension() {}
virtual LazyMessageExtension* New(Arena* arena) const = 0;
@@ -574,8 +579,6 @@
private:
virtual void UnusedKeyMethod(); // Dummy key method to avoid weak vtable.
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(LazyMessageExtension);
};
// Give access to function defined below to see LazyMessageExtension.
friend LazyMessageExtension* MaybeCreateLazyExtension(Arena* arena);
@@ -908,8 +911,6 @@
} map_;
static void DeleteFlatMap(const KeyValue* flat, uint16_t flat_capacity);
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ExtensionSet);
};
constexpr ExtensionSet::ExtensionSet()
@@ -1262,6 +1263,8 @@
template <typename ExtendeeT>
static void Register(int number, FieldType type, bool is_packed,
LazyEagerVerifyFnType fn) {
+ // Avoid -Wunused-parameter
+ (void)fn;
ExtensionSet::RegisterEnumExtension(&ExtendeeT::default_instance(), number,
type, false, is_packed, IsValid);
}
@@ -1328,6 +1331,8 @@
template <typename ExtendeeT>
static void Register(int number, FieldType type, bool is_packed,
LazyEagerVerifyFnType fn) {
+ // Avoid -Wunused-parameter
+ (void)fn;
ExtensionSet::RegisterEnumExtension(&ExtendeeT::default_instance(), number,
type, true, is_packed, IsValid);
}
@@ -1556,6 +1561,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_EXTENSION_SET_H__
diff --git a/src/google/protobuf/extension_set_heavy.cc b/src/google/protobuf/extension_set_heavy.cc
index a4bb948..0ccce3c 100644
--- a/src/google/protobuf/extension_set_heavy.cc
+++ b/src/google/protobuf/extension_set_heavy.cc
@@ -35,24 +35,25 @@
// Contains methods defined in extension_set.h which cannot be part of the
// lite library because they use descriptors or reflection.
-#include <google/protobuf/stubs/casts.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/arena.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/extension_set.h>
-#include <google/protobuf/extension_set_inl.h>
-#include <google/protobuf/message.h>
-#include <google/protobuf/message_lite.h>
-#include <google/protobuf/parse_context.h>
-#include <google/protobuf/repeated_field.h>
-#include <google/protobuf/unknown_field_set.h>
-#include <google/protobuf/wire_format.h>
-#include <google/protobuf/wire_format_lite.h>
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/arena.h"
+#include "absl/base/casts.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/extension_set.h"
+#include "google/protobuf/extension_set_inl.h"
+#include "google/protobuf/message.h"
+#include "google/protobuf/message_lite.h"
+#include "google/protobuf/parse_context.h"
+#include "google/protobuf/port.h"
+#include "google/protobuf/repeated_field.h"
+#include "google/protobuf/unknown_field_set.h"
+#include "google/protobuf/wire_format.h"
+#include "google/protobuf/wire_format_lite.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -413,7 +414,7 @@
if (is_lazy) {
total_size += lazymessage_value->SpaceUsedLong();
} else {
- total_size += down_cast<Message*>(message_value)->SpaceUsedLong();
+ total_size += DownCast<Message*>(message_value)->SpaceUsedLong();
}
break;
default:
@@ -437,4 +438,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/extension_set_inl.h b/src/google/protobuf/extension_set_inl.h
index e4e7117..8256455 100644
--- a/src/google/protobuf/extension_set_inl.h
+++ b/src/google/protobuf/extension_set_inl.h
@@ -31,9 +31,9 @@
#ifndef GOOGLE_PROTOBUF_EXTENSION_SET_INL_H__
#define GOOGLE_PROTOBUF_EXTENSION_SET_INL_H__
-#include <google/protobuf/extension_set.h>
-#include <google/protobuf/metadata_lite.h>
-#include <google/protobuf/parse_context.h>
+#include "google/protobuf/extension_set.h"
+#include "google/protobuf/metadata_lite.h"
+#include "google/protobuf/parse_context.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/extension_set_unittest.cc b/src/google/protobuf/extension_set_unittest.cc
index 207e10c..2db28c3 100644
--- a/src/google/protobuf/extension_set_unittest.cc
+++ b/src/google/protobuf/extension_set_unittest.cc
@@ -32,29 +32,32 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/stubs/casts.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/unittest.pb.h>
-#include <google/protobuf/unittest_mset.pb.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/arena.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/dynamic_message.h>
-#include <google/protobuf/extension_set.h>
-#include <google/protobuf/text_format.h>
-#include <google/protobuf/wire_format.h>
-#include <google/protobuf/testing/googletest.h>
+#include "google/protobuf/extension_set.h"
+
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/unittest.pb.h"
+#include "google/protobuf/unittest_mset.pb.h"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/io/zero_copy_stream_impl.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/arena.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/dynamic_message.h"
+#include "google/protobuf/text_format.h"
+#include "google/protobuf/wire_format.h"
+#include "google/protobuf/testing/googletest.h"
#include <gtest/gtest.h>
-#include <google/protobuf/test_util.h>
-#include <google/protobuf/test_util2.h>
-#include <google/protobuf/stubs/stl_util.h>
+#include "absl/base/casts.h"
+#include "absl/strings/match.h"
+#include "google/protobuf/test_util.h"
+#include "google/protobuf/test_util2.h"
+#include "google/protobuf/stubs/stl_util.h"
+
+#include "google/protobuf/stubs/strutil.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
@@ -62,6 +65,7 @@
namespace internal {
namespace {
+using ::google::protobuf::internal::DownCast;
using TestUtil::EqualsToSerialized;
// This test closely mirrors third_party/protobuf/compiler/cpp/unittest.cc
@@ -852,8 +856,10 @@
const size_t old_capacity = \
message->GetRepeatedExtension(unittest::repeated_##type##_extension) \
.Capacity(); \
- EXPECT_GE(old_capacity, \
- (RepeatedFieldLowerClampLimit<cpptype, sizeof(void*)>())); \
+ EXPECT_GE( \
+ old_capacity, \
+ (RepeatedFieldLowerClampLimit<cpptype, std::max(sizeof(cpptype), \
+ sizeof(void*))>())); \
for (int i = 0; i < 16; ++i) { \
message->AddExtension(unittest::repeated_##type##_extension, value); \
} \
@@ -1229,7 +1235,7 @@
std::string prefix = "." + template_descriptor->full_name() + ".";
if (extension->has_type_name()) {
std::string* type_name = extension->mutable_type_name();
- if (HasPrefixString(*type_name, prefix)) {
+ if (absl::StartsWith(*type_name, prefix)) {
type_name->replace(0, prefix.size(), ".dynamic_extensions.");
}
}
diff --git a/src/google/protobuf/field_access_listener.h b/src/google/protobuf/field_access_listener.h
index 47422e6..fd54f0e 100644
--- a/src/google/protobuf/field_access_listener.h
+++ b/src/google/protobuf/field_access_listener.h
@@ -33,8 +33,8 @@
#include <cstddef>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/message_lite.h>
+#include "google/protobuf/message_lite.h"
+#include "google/protobuf/port.h"
namespace google {
@@ -57,7 +57,7 @@
// to differentiate the protos during the runtime before the start of the
// program, use this functor to get its name. We either way need it for
// LITE_RUNTIME protos as they don't have descriptors at all.
- explicit NoOpAccessListener(StringPiece (*name_extractor)()) {}
+ explicit NoOpAccessListener(absl::string_view (*name_extractor)()) {}
// called repeatedly during serialization/deserialization/ByteSize of
// Reflection as:
// AccessListener<MessageT>::OnSerialize(this);
diff --git a/src/google/protobuf/field_mask.pb.cc b/src/google/protobuf/field_mask.pb.cc
index 7860bfb..42dbbd5 100644
--- a/src/google/protobuf/field_mask.pb.cc
+++ b/src/google/protobuf/field_mask.pb.cc
@@ -1,86 +1,110 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: google/protobuf/field_mask.proto
-#include <google/protobuf/field_mask.pb.h>
+#include "google/protobuf/field_mask.pb.h"
#include <algorithm>
-
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/extension_set.h>
-#include <google/protobuf/wire_format_lite.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/generated_message_reflection.h>
-#include <google/protobuf/reflection_ops.h>
-#include <google/protobuf/wire_format.h>
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/extension_set.h"
+#include "google/protobuf/wire_format_lite.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/generated_message_reflection.h"
+#include "google/protobuf/reflection_ops.h"
+#include "google/protobuf/wire_format.h"
// @@protoc_insertion_point(includes)
-#include <google/protobuf/port_def.inc>
+// Must be included last.
+#include "google/protobuf/port_def.inc"
PROTOBUF_PRAGMA_INIT_SEG
-
namespace _pb = ::PROTOBUF_NAMESPACE_ID;
-namespace _pbi = _pb::internal;
-
+namespace _pbi = ::PROTOBUF_NAMESPACE_ID::internal;
PROTOBUF_NAMESPACE_OPEN
PROTOBUF_CONSTEXPR FieldMask::FieldMask(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_.paths_)*/{}
, /*decltype(_impl_._cached_size_)*/{}} {}
struct FieldMaskDefaultTypeInternal {
- PROTOBUF_CONSTEXPR FieldMaskDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR FieldMaskDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~FieldMaskDefaultTypeInternal() {}
union {
FieldMask _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 FieldMaskDefaultTypeInternal _FieldMask_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 FieldMaskDefaultTypeInternal _FieldMask_default_instance_;
PROTOBUF_NAMESPACE_CLOSE
static ::_pb::Metadata file_level_metadata_google_2fprotobuf_2ffield_5fmask_2eproto[1];
-static constexpr ::_pb::EnumDescriptor const** file_level_enum_descriptors_google_2fprotobuf_2ffield_5fmask_2eproto = nullptr;
-static constexpr ::_pb::ServiceDescriptor const** file_level_service_descriptors_google_2fprotobuf_2ffield_5fmask_2eproto = nullptr;
-
-const uint32_t TableStruct_google_2fprotobuf_2ffield_5fmask_2eproto::offsets[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
- ~0u, // no _has_bits_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldMask, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldMask, _impl_.paths_),
+static constexpr const ::_pb::EnumDescriptor**
+ file_level_enum_descriptors_google_2fprotobuf_2ffield_5fmask_2eproto = nullptr;
+static constexpr const ::_pb::ServiceDescriptor**
+ file_level_service_descriptors_google_2fprotobuf_2ffield_5fmask_2eproto = nullptr;
+const uint32_t TableStruct_google_2fprotobuf_2ffield_5fmask_2eproto::offsets[] PROTOBUF_SECTION_VARIABLE(
+ protodesc_cold) = {
+ ~0u, // no _has_bits_
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldMask, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FieldMask, _impl_.paths_),
};
-static const ::_pbi::MigrationSchema schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
- { 0, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::FieldMask)},
+
+static const ::_pbi::MigrationSchema
+ schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
+ { 0, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::FieldMask)},
};
static const ::_pb::Message* const file_default_instances[] = {
- &::PROTOBUF_NAMESPACE_ID::_FieldMask_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_FieldMask_default_instance_._instance,
};
-
-const char descriptor_table_protodef_google_2fprotobuf_2ffield_5fmask_2eproto[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) =
- "\n google/protobuf/field_mask.proto\022\017goog"
- "le.protobuf\"\032\n\tFieldMask\022\r\n\005paths\030\001 \003(\tB"
- "\205\001\n\023com.google.protobufB\016FieldMaskProtoP"
- "\001Z2google.golang.org/protobuf/types/know"
- "n/fieldmaskpb\370\001\001\242\002\003GPB\252\002\036Google.Protobuf"
- ".WellKnownTypesb\006proto3"
- ;
-static ::_pbi::once_flag descriptor_table_google_2fprotobuf_2ffield_5fmask_2eproto_once;
+const char descriptor_table_protodef_google_2fprotobuf_2ffield_5fmask_2eproto[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
+ "\n google/protobuf/field_mask.proto\022\017goog"
+ "le.protobuf\"\032\n\tFieldMask\022\r\n\005paths\030\001 \003(\tB"
+ "\205\001\n\023com.google.protobufB\016FieldMaskProtoP"
+ "\001Z2google.golang.org/protobuf/types/know"
+ "n/fieldmaskpb\370\001\001\242\002\003GPB\252\002\036Google.Protobuf"
+ ".WellKnownTypesb\006proto3"
+};
+static ::absl::once_flag descriptor_table_google_2fprotobuf_2ffield_5fmask_2eproto_once;
const ::_pbi::DescriptorTable descriptor_table_google_2fprotobuf_2ffield_5fmask_2eproto = {
- false, false, 223, descriptor_table_protodef_google_2fprotobuf_2ffield_5fmask_2eproto,
+ false,
+ false,
+ 223,
+ descriptor_table_protodef_google_2fprotobuf_2ffield_5fmask_2eproto,
"google/protobuf/field_mask.proto",
- &descriptor_table_google_2fprotobuf_2ffield_5fmask_2eproto_once, nullptr, 0, 1,
- schemas, file_default_instances, TableStruct_google_2fprotobuf_2ffield_5fmask_2eproto::offsets,
- file_level_metadata_google_2fprotobuf_2ffield_5fmask_2eproto, file_level_enum_descriptors_google_2fprotobuf_2ffield_5fmask_2eproto,
+ &descriptor_table_google_2fprotobuf_2ffield_5fmask_2eproto_once,
+ nullptr,
+ 0,
+ 1,
+ schemas,
+ file_default_instances,
+ TableStruct_google_2fprotobuf_2ffield_5fmask_2eproto::offsets,
+ file_level_metadata_google_2fprotobuf_2ffield_5fmask_2eproto,
+ file_level_enum_descriptors_google_2fprotobuf_2ffield_5fmask_2eproto,
file_level_service_descriptors_google_2fprotobuf_2ffield_5fmask_2eproto,
};
+
+// This function exists to be marked as weak.
+// It can significantly speed up compilation by breaking up LLVM's SCC
+// in the .pb.cc translation units. Large translation units see a
+// reduction of more than 35% of walltime for optimized builds. Without
+// the weak attribute all the messages in the file, including all the
+// vtables and everything they use become part of the same SCC through
+// a cycle like:
+// GetMetadata -> descriptor table -> default instances ->
+// vtables -> GetMetadata
+// By adding a weak function here we break the connection from the
+// individual vtables back into the descriptor table.
PROTOBUF_ATTRIBUTE_WEAK const ::_pbi::DescriptorTable* descriptor_table_google_2fprotobuf_2ffield_5fmask_2eproto_getter() {
return &descriptor_table_google_2fprotobuf_2ffield_5fmask_2eproto;
}
-
// Force running AddDescriptors() at dynamic initialization time.
-PROTOBUF_ATTRIBUTE_INIT_PRIORITY2 static ::_pbi::AddDescriptorsRunner dynamic_init_dummy_google_2fprotobuf_2ffield_5fmask_2eproto(&descriptor_table_google_2fprotobuf_2ffield_5fmask_2eproto);
+PROTOBUF_ATTRIBUTE_INIT_PRIORITY2
+static ::_pbi::AddDescriptorsRunner dynamic_init_dummy_google_2fprotobuf_2ffield_5fmask_2eproto(&descriptor_table_google_2fprotobuf_2ffield_5fmask_2eproto);
PROTOBUF_NAMESPACE_OPEN
-
// ===================================================================
class FieldMask::_Internal {
@@ -270,7 +294,6 @@
&descriptor_table_google_2fprotobuf_2ffield_5fmask_2eproto_getter, &descriptor_table_google_2fprotobuf_2ffield_5fmask_2eproto_once,
file_level_metadata_google_2fprotobuf_2ffield_5fmask_2eproto[0]);
}
-
// @@protoc_insertion_point(namespace_scope)
PROTOBUF_NAMESPACE_CLOSE
PROTOBUF_NAMESPACE_OPEN
@@ -279,6 +302,5 @@
return Arena::CreateMessageInternal< ::PROTOBUF_NAMESPACE_ID::FieldMask >(arena);
}
PROTOBUF_NAMESPACE_CLOSE
-
// @@protoc_insertion_point(global_scope)
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/field_mask.pb.h b/src/google/protobuf/field_mask.pb.h
index b36afc6..13fe9cf 100644
--- a/src/google/protobuf/field_mask.pb.h
+++ b/src/google/protobuf/field_mask.pb.h
@@ -1,38 +1,43 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: google/protobuf/field_mask.proto
-#ifndef GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2ffield_5fmask_2eproto
-#define GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2ffield_5fmask_2eproto
+#ifndef GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2ffield_5fmask_2eproto_2epb_2eh
+#define GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2ffield_5fmask_2eproto_2epb_2eh
#include <limits>
#include <string>
+#include <type_traits>
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
#if PROTOBUF_VERSION < 3021000
-#error This file was generated by a newer version of protoc which is
-#error incompatible with your Protocol Buffer headers. Please update
-#error your headers.
-#endif
-#if 3021007 < PROTOBUF_MIN_PROTOC_VERSION
-#error This file was generated by an older version of protoc which is
-#error incompatible with your Protocol Buffer headers. Please
-#error regenerate this file with a newer version of protoc.
-#endif
+#error "This file was generated by a newer version of protoc which is"
+#error "incompatible with your Protocol Buffer headers. Please update"
+#error "your headers."
+#endif // PROTOBUF_VERSION
-#include <google/protobuf/port_undef.inc>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/arena.h>
-#include <google/protobuf/arenastring.h>
-#include <google/protobuf/generated_message_util.h>
-#include <google/protobuf/metadata_lite.h>
-#include <google/protobuf/generated_message_reflection.h>
-#include <google/protobuf/message.h>
-#include <google/protobuf/repeated_field.h> // IWYU pragma: export
-#include <google/protobuf/extension_set.h> // IWYU pragma: export
-#include <google/protobuf/unknown_field_set.h>
+#if 3021007 < PROTOBUF_MIN_PROTOC_VERSION
+#error "This file was generated by an older version of protoc which is"
+#error "incompatible with your Protocol Buffer headers. Please"
+#error "regenerate this file with a newer version of protoc."
+#endif // PROTOBUF_MIN_PROTOC_VERSION
+#include "google/protobuf/port_undef.inc"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/arena.h"
+#include "google/protobuf/arenastring.h"
+#include "google/protobuf/generated_message_util.h"
+#include "google/protobuf/metadata_lite.h"
+#include "google/protobuf/generated_message_reflection.h"
+#include "google/protobuf/message.h"
+#include "google/protobuf/repeated_field.h" // IWYU pragma: export
+#include "google/protobuf/extension_set.h" // IWYU pragma: export
+#include "google/protobuf/unknown_field_set.h"
// @@protoc_insertion_point(includes)
-#include <google/protobuf/port_def.inc>
+
+// Must be included last.
+#include "google/protobuf/port_def.inc"
+
#define PROTOBUF_INTERNAL_EXPORT_google_2fprotobuf_2ffield_5fmask_2eproto PROTOBUF_EXPORT
+
PROTOBUF_NAMESPACE_OPEN
namespace internal {
class AnyMetadata;
@@ -43,19 +48,23 @@
struct PROTOBUF_EXPORT TableStruct_google_2fprotobuf_2ffield_5fmask_2eproto {
static const uint32_t offsets[];
};
-PROTOBUF_EXPORT extern const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_google_2fprotobuf_2ffield_5fmask_2eproto;
+PROTOBUF_EXPORT extern const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable
+ descriptor_table_google_2fprotobuf_2ffield_5fmask_2eproto;
PROTOBUF_NAMESPACE_OPEN
class FieldMask;
struct FieldMaskDefaultTypeInternal;
PROTOBUF_EXPORT extern FieldMaskDefaultTypeInternal _FieldMask_default_instance_;
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::FieldMask* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::FieldMask>(Arena*);
PROTOBUF_NAMESPACE_CLOSE
-PROTOBUF_NAMESPACE_OPEN
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::FieldMask* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::FieldMask>(Arena*);
-PROTOBUF_NAMESPACE_CLOSE
+
PROTOBUF_NAMESPACE_OPEN
// ===================================================================
+
+// -------------------------------------------------------------------
+
class PROTOBUF_EXPORT FieldMask final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.FieldMask) */ {
public:
@@ -159,7 +168,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.FieldMask";
}
protected:
@@ -220,12 +229,17 @@
// ===================================================================
+
+
// ===================================================================
+
#ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wstrict-aliasing"
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wstrict-aliasing"
#endif // __GNUC__
+// -------------------------------------------------------------------
+
// FieldMask
// repeated string paths = 1;
@@ -263,8 +277,7 @@
// @@protoc_insertion_point(field_set:google.protobuf.FieldMask.paths)
}
inline void FieldMask::set_paths(int index, const char* value) {
- GOOGLE_DCHECK(value != nullptr);
- _impl_.paths_.Mutable(index)->assign(value);
+ GOOGLE_DCHECK(value != nullptr); _impl_.paths_.Mutable(index)->assign(value);
// @@protoc_insertion_point(field_set_char:google.protobuf.FieldMask.paths)
}
inline void FieldMask::set_paths(int index, const char* value, size_t size) {
@@ -284,8 +297,7 @@
// @@protoc_insertion_point(field_add:google.protobuf.FieldMask.paths)
}
inline void FieldMask::add_paths(const char* value) {
- GOOGLE_DCHECK(value != nullptr);
- _impl_.paths_.Add()->assign(value);
+ GOOGLE_DCHECK(value != nullptr); _impl_.paths_.Add()->assign(value);
// @@protoc_insertion_point(field_add_char:google.protobuf.FieldMask.paths)
}
inline void FieldMask::add_paths(const char* value, size_t size) {
@@ -304,14 +316,15 @@
}
#ifdef __GNUC__
- #pragma GCC diagnostic pop
+#pragma GCC diagnostic pop
#endif // __GNUC__
// @@protoc_insertion_point(namespace_scope)
-
PROTOBUF_NAMESPACE_CLOSE
+
// @@protoc_insertion_point(global_scope)
-#include <google/protobuf/port_undef.inc>
-#endif // GOOGLE_PROTOBUF_INCLUDED_GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2ffield_5fmask_2eproto
+#include "google/protobuf/port_undef.inc"
+
+#endif // GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2ffield_5fmask_2eproto_2epb_2eh
diff --git a/src/google/protobuf/generated_enum_reflection.h b/src/google/protobuf/generated_enum_reflection.h
index b96a9c6..31ddc12 100644
--- a/src/google/protobuf/generated_enum_reflection.h
+++ b/src/google/protobuf/generated_enum_reflection.h
@@ -42,16 +42,16 @@
#include <string>
-#include <google/protobuf/port.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/generated_enum_util.h>
+#include "google/protobuf/port.h"
+#include "absl/strings/string_view.h"
+#include "google/protobuf/generated_enum_util.h"
#ifdef SWIG
#error "You cannot SWIG proto headers"
#endif
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -74,10 +74,10 @@
// an enum name of the given type, returning true and filling in value on
// success, or returning false and leaving value unchanged on failure.
PROTOBUF_EXPORT bool ParseNamedEnum(const EnumDescriptor* descriptor,
- ConstStringParam name, int* value);
+ absl::string_view name, int* value);
template <typename EnumType>
-bool ParseNamedEnum(const EnumDescriptor* descriptor, ConstStringParam name,
+bool ParseNamedEnum(const EnumDescriptor* descriptor, absl::string_view name,
EnumType* value) {
int tmp;
if (!ParseNamedEnum(descriptor, name, &tmp)) return false;
@@ -95,6 +95,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_GENERATED_ENUM_REFLECTION_H__
diff --git a/src/google/protobuf/generated_enum_util.cc b/src/google/protobuf/generated_enum_util.cc
index df7583e..ab21577 100644
--- a/src/google/protobuf/generated_enum_util.cc
+++ b/src/google/protobuf/generated_enum_util.cc
@@ -28,11 +28,11 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/generated_enum_util.h>
+#include "google/protobuf/generated_enum_util.h"
#include <algorithm>
-#include <google/protobuf/generated_message_util.h>
+#include "google/protobuf/generated_message_util.h"
namespace google {
namespace protobuf {
@@ -40,7 +40,7 @@
namespace {
bool EnumCompareByName(const EnumEntry& a, const EnumEntry& b) {
- return StringPiece(a.name) < StringPiece(b.name);
+ return absl::string_view(a.name) < absl::string_view(b.name);
}
// Gets the numeric value of the EnumEntry at the given index, but returns a
@@ -57,7 +57,7 @@
} // namespace
bool LookUpEnumValue(const EnumEntry* enums, size_t size,
- StringPiece name, int* value) {
+ absl::string_view name, int* value) {
EnumEntry target{name, 0};
auto it = std::lower_bound(enums, enums + size, target, EnumCompareByName);
if (it != enums + size && it->name == name) {
diff --git a/src/google/protobuf/generated_enum_util.h b/src/google/protobuf/generated_enum_util.h
index 5d10ac0..86e1bb9 100644
--- a/src/google/protobuf/generated_enum_util.h
+++ b/src/google/protobuf/generated_enum_util.h
@@ -34,11 +34,11 @@
#include <type_traits>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/message_lite.h>
+#include "absl/strings/string_view.h"
+#include "google/protobuf/message_lite.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
#ifdef SWIG
#error "You cannot SWIG proto headers"
@@ -58,13 +58,13 @@
// protos. This struct and the following related functions should only be used
// by protobuf generated code.
struct EnumEntry {
- StringPiece name;
+ absl::string_view name;
int value;
};
// Looks up a numeric enum value given the string name.
PROTOBUF_EXPORT bool LookUpEnumValue(const EnumEntry* enums, size_t size,
- StringPiece name, int* value);
+ absl::string_view name, int* value);
// Looks up an enum name given the numeric value.
PROTOBUF_EXPORT int LookUpEnumName(const EnumEntry* enums,
@@ -80,6 +80,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_GENERATED_ENUM_UTIL_H__
diff --git a/src/google/protobuf/generated_message_bases.cc b/src/google/protobuf/generated_message_bases.cc
index 306a38e..2ccca16 100644
--- a/src/google/protobuf/generated_message_bases.cc
+++ b/src/google/protobuf/generated_message_bases.cc
@@ -28,17 +28,17 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/generated_message_bases.h>
+#include "google/protobuf/generated_message_bases.h"
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/parse_context.h>
-#include <google/protobuf/unknown_field_set.h>
-#include <google/protobuf/wire_format.h>
-#include <google/protobuf/wire_format_lite.h>
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/io/zero_copy_stream_impl.h"
+#include "google/protobuf/parse_context.h"
+#include "google/protobuf/unknown_field_set.h"
+#include "google/protobuf/wire_format.h"
+#include "google/protobuf/wire_format_lite.h"
// Must be last:
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -121,4 +121,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/generated_message_bases.h b/src/google/protobuf/generated_message_bases.h
index b295218..e831079 100644
--- a/src/google/protobuf/generated_message_bases.h
+++ b/src/google/protobuf/generated_message_bases.h
@@ -35,14 +35,14 @@
#ifndef GOOGLE_PROTOBUF_GENERATED_MESSAGE_BASES_H__
#define GOOGLE_PROTOBUF_GENERATED_MESSAGE_BASES_H__
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/arena.h>
-#include <google/protobuf/generated_message_util.h>
-#include <google/protobuf/message.h>
-#include <google/protobuf/parse_context.h>
+#include "google/protobuf/io/zero_copy_stream_impl.h"
+#include "google/protobuf/arena.h"
+#include "google/protobuf/generated_message_util.h"
+#include "google/protobuf/message.h"
+#include "google/protobuf/parse_context.h"
// Must come last:
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -82,6 +82,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_GENERATED_MESSAGE_BASES_H__
diff --git a/src/google/protobuf/generated_message_reflection.cc b/src/google/protobuf/generated_message_reflection.cc
index 2a807e0..b1b472c 100644
--- a/src/google/protobuf/generated_message_reflection.cc
+++ b/src/google/protobuf/generated_message_reflection.cc
@@ -32,29 +32,36 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/generated_message_reflection.h>
+#include "google/protobuf/generated_message_reflection.h"
#include <algorithm>
+#include <atomic>
+#include <cstdint>
+#include <cstring>
#include <set>
+#include <string>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/mutex.h>
-#include <google/protobuf/stubs/casts.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/extension_set.h>
-#include <google/protobuf/generated_message_util.h>
-#include <google/protobuf/inlined_string_field.h>
-#include <google/protobuf/map_field.h>
-#include <google/protobuf/map_field_inl.h>
-#include <google/protobuf/repeated_field.h>
-#include <google/protobuf/unknown_field_set.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "absl/base/casts.h"
+#include "absl/container/flat_hash_map.h"
+#include "absl/strings/string_view.h"
+#include "absl/synchronization/mutex.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/extension_set.h"
+#include "google/protobuf/generated_message_tctable_gen.h"
+#include "google/protobuf/generated_message_tctable_impl.h"
+#include "google/protobuf/generated_message_util.h"
+#include "google/protobuf/inlined_string_field.h"
+#include "google/protobuf/map_field.h"
+#include "google/protobuf/map_field_inl.h"
+#include "google/protobuf/repeated_field.h"
+#include "google/protobuf/unknown_field_set.h"
// clang-format off
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
// clang-format on
#define GOOGLE_PROTOBUF_HAS_ONEOF
@@ -73,7 +80,6 @@
using google::protobuf::internal::ReflectionSchema;
using google::protobuf::internal::RepeatedPtrFieldBase;
using google::protobuf::internal::StringSpaceUsedExcludingSelfLong;
-using google::protobuf::internal::WrappedMutex;
namespace google {
namespace protobuf {
@@ -95,7 +101,7 @@
namespace internal {
-bool ParseNamedEnum(const EnumDescriptor* descriptor, ConstStringParam name,
+bool ParseNamedEnum(const EnumDescriptor* descriptor, absl::string_view name,
int* value) {
const EnumValueDescriptor* d = descriptor->FindValueByName(name);
if (d == nullptr) return false;
@@ -108,6 +114,54 @@
return (d == nullptr ? GetEmptyString() : d->name());
}
+// Internal helper routine for NameOfDenseEnum in the header file.
+// Allocates and fills a simple array of string pointers, based on
+// reflection information about the names of the enums. This routine
+// allocates max_val + 1 entries, under the assumption that all the enums
+// fall in the range [min_val .. max_val].
+const std::string** MakeDenseEnumCache(const EnumDescriptor* desc, int min_val,
+ int max_val) {
+ auto* str_ptrs =
+ new const std::string*[static_cast<size_t>(max_val - min_val + 1)]();
+ const int count = desc->value_count();
+ for (int i = 0; i < count; ++i) {
+ const int num = desc->value(i)->number();
+ if (str_ptrs[num - min_val] == nullptr) {
+ // Don't over-write an existing entry, because in case of duplication, the
+ // first one wins.
+ str_ptrs[num - min_val] = &desc->value(i)->name();
+ }
+ }
+ // Change any unfilled entries to point to the empty string.
+ for (int i = 0; i < max_val - min_val + 1; ++i) {
+ if (str_ptrs[i] == nullptr) str_ptrs[i] = &GetEmptyStringAlreadyInited();
+ }
+ return str_ptrs;
+}
+
+PROTOBUF_NOINLINE const std::string& NameOfDenseEnumSlow(
+ int v, DenseEnumCacheInfo* deci) {
+ if (v < deci->min_val || v > deci->max_val)
+ return GetEmptyStringAlreadyInited();
+
+ const std::string** new_cache =
+ MakeDenseEnumCache(deci->descriptor_fn(), deci->min_val, deci->max_val);
+ const std::string** old_cache = nullptr;
+
+ if (deci->cache.compare_exchange_strong(old_cache, new_cache,
+ std::memory_order_release,
+ std::memory_order_acquire)) {
+ // We successfully stored our new cache, and the old value was nullptr.
+ return *new_cache[v - deci->min_val];
+ } else {
+ // In the time it took to create our enum cache, another thread also
+ // created one, and put it into deci->cache. So delete ours, and
+ // use theirs instead.
+ delete[] new_cache;
+ return *old_cache[v - deci->min_val];
+ }
+}
+
} // namespace internal
// ===================================================================
@@ -239,6 +293,12 @@
last_non_weak_field_index_ = descriptor_->field_count() - 1;
}
+Reflection::~Reflection() {
+ // No need to use sized delete. This code path is uncommon and it would not be
+ // worth saving or recalculating the size.
+ ::operator delete(const_cast<internal::TcParseTableBase*>(tcparse_table_));
+}
+
const UnknownFieldSet& Reflection::GetUnknownFields(
const Message& message) const {
return GetInternalMetadata(message).unknown_fields<UnknownFieldSet>(
@@ -394,7 +454,19 @@
}
}
}
+#ifndef PROTOBUF_FUZZ_MESSAGE_SPACE_USED_LONG
return total_size;
+#else
+ // Use both `this` and `dummy` to generate the seed so that the scale factor
+ // is both per-object and non-predictable, but consistent across multiple
+ // calls in the same binary.
+ static bool dummy;
+ uintptr_t seed =
+ reinterpret_cast<uintptr_t>(&dummy) ^ reinterpret_cast<uintptr_t>(this);
+ // Fuzz the size by +/- 50%.
+ double scale = (static_cast<double>(seed % 10000) / 10000) + 0.5;
+ return total_size * scale;
+#endif
}
namespace {
@@ -983,8 +1055,6 @@
return;
}
- GOOGLE_DCHECK_EQ(message1->GetOwningArena(), message2->GetOwningArena());
-
UnsafeArenaSwap(message1, message2);
}
@@ -1014,9 +1084,6 @@
std::set<int> swapped_oneof;
- GOOGLE_DCHECK(!unsafe_shallow_swap || message1->GetArenaForAllocation() ==
- message2->GetArenaForAllocation());
-
const Message* prototype =
message_factory_->GetPrototype(message1->GetDescriptor());
for (const auto* field : fields) {
@@ -1073,6 +1140,9 @@
void Reflection::UnsafeShallowSwapFields(
Message* message1, Message* message2,
const std::vector<const FieldDescriptor*>& fields) const {
+ GOOGLE_DCHECK_EQ(message1->GetArenaForAllocation(),
+ message2->GetArenaForAllocation());
+
SwapFieldsImpl<true>(message1, message2, fields);
}
@@ -1103,6 +1173,11 @@
}
void Reflection::UnsafeArenaSwap(Message* lhs, Message* rhs) const {
+ GOOGLE_DCHECK_EQ(lhs->GetOwningArena(), rhs->GetOwningArena());
+ InternalSwap(lhs, rhs);
+}
+
+void Reflection::InternalSwap(Message* lhs, Message* rhs) const {
if (lhs == rhs) return;
MutableInternalMetadata(lhs)->InternalSwap(MutableInternalMetadata(rhs));
@@ -1111,8 +1186,14 @@
const FieldDescriptor* field = descriptor_->field(i);
if (schema_.InRealOneof(field)) continue;
if (schema_.IsFieldStripped(field)) continue;
+ if (schema_.IsSplit(field)) {
+ continue;
+ }
UnsafeShallowSwapField(lhs, rhs, field);
}
+ if (schema_.IsSplit()) {
+ std::swap(*MutableSplitField(lhs), *MutableSplitField(rhs));
+ }
const int oneof_decl_count = descriptor_->oneof_decl_count();
for (int i = 0; i < oneof_decl_count; i++) {
const OneofDescriptor* oneof = descriptor_->oneof_decl(i);
@@ -2434,13 +2515,35 @@
template <class Type>
const Type& Reflection::GetRawNonOneof(const Message& message,
const FieldDescriptor* field) const {
+ if (schema_.IsSplit(field)) {
+ return *GetConstPointerAtOffset<Type>(
+ GetSplitField(&message), schema_.GetFieldOffsetNonOneof(field));
+ }
return GetConstRefAtOffset<Type>(message,
schema_.GetFieldOffsetNonOneof(field));
}
+void Reflection::PrepareSplitMessageForWrite(Message* message) const {
+ GOOGLE_DCHECK_NE(message, schema_.default_instance_);
+ void** split = MutableSplitField(message);
+ const void* default_split = GetSplitField(schema_.default_instance_);
+ if (*split == default_split) {
+ uint32_t size = schema_.SizeofSplit();
+ Arena* arena = message->GetArenaForAllocation();
+ *split = (arena == nullptr) ? ::operator new(size)
+ : arena->AllocateAligned(size);
+ memcpy(*split, default_split, size);
+ }
+}
+
template <class Type>
Type* Reflection::MutableRawNonOneof(Message* message,
const FieldDescriptor* field) const {
+ if (schema_.IsSplit(field)) {
+ PrepareSplitMessageForWrite(message);
+ return GetPointerAtOffset<Type>(*MutableSplitField(message),
+ schema_.GetFieldOffsetNonOneof(field));
+ }
return GetPointerAtOffset<Type>(message,
schema_.GetFieldOffsetNonOneof(field));
}
@@ -2448,6 +2551,11 @@
template <typename Type>
Type* Reflection::MutableRaw(Message* message,
const FieldDescriptor* field) const {
+ if (schema_.IsSplit(field)) {
+ PrepareSplitMessageForWrite(message);
+ return GetPointerAtOffset<Type>(*MutableSplitField(message),
+ schema_.GetFieldOffset(field));
+ }
return GetPointerAtOffset<Type>(message, schema_.GetFieldOffset(field));
}
@@ -2864,6 +2972,363 @@
return &(GetRaw<MapFieldBase>(message, field));
}
+template <typename T>
+static uint32_t AlignTo(uint32_t v) {
+ return (v + alignof(T) - 1) & ~(alignof(T) - 1);
+}
+
+static internal::TailCallParseFunc GetFastParseFunction(
+ absl::string_view name) {
+ // This list must be synchronized with TcParser.
+ // Missing entries are replaced with MiniParse in opt mode to avoid runtime
+ // failures. It check-fails in debug mode.
+ static const auto* const map =
+ new absl::flat_hash_map<absl::string_view, internal::TailCallParseFunc>{
+ {"::_pbi::TcParser::FastF32S1", internal::TcParser::FastF32S1},
+ {"::_pbi::TcParser::FastF32S2", internal::TcParser::FastF32S2},
+ {"::_pbi::TcParser::FastF32R1", internal::TcParser::FastF32R1},
+ {"::_pbi::TcParser::FastF32R2", internal::TcParser::FastF32R2},
+ {"::_pbi::TcParser::FastF32P1", internal::TcParser::FastF32P1},
+ {"::_pbi::TcParser::FastF32P2", internal::TcParser::FastF32P2},
+ {"::_pbi::TcParser::FastF64S1", internal::TcParser::FastF64S1},
+ {"::_pbi::TcParser::FastF64S2", internal::TcParser::FastF64S2},
+ {"::_pbi::TcParser::FastF64R1", internal::TcParser::FastF64R1},
+ {"::_pbi::TcParser::FastF64R2", internal::TcParser::FastF64R2},
+ {"::_pbi::TcParser::FastF64P1", internal::TcParser::FastF64P1},
+ {"::_pbi::TcParser::FastF64P2", internal::TcParser::FastF64P2},
+ {"::_pbi::TcParser::FastV8S1", internal::TcParser::FastV8S1},
+ {"::_pbi::TcParser::FastV8S2", internal::TcParser::FastV8S2},
+ {"::_pbi::TcParser::FastV8R1", internal::TcParser::FastV8R1},
+ {"::_pbi::TcParser::FastV8R2", internal::TcParser::FastV8R2},
+ {"::_pbi::TcParser::FastV8P1", internal::TcParser::FastV8P1},
+ {"::_pbi::TcParser::FastV8P2", internal::TcParser::FastV8P2},
+ {"::_pbi::TcParser::FastV32S1", internal::TcParser::FastV32S1},
+ {"::_pbi::TcParser::FastV32S2", internal::TcParser::FastV32S2},
+ {"::_pbi::TcParser::FastV32R1", internal::TcParser::FastV32R1},
+ {"::_pbi::TcParser::FastV32R2", internal::TcParser::FastV32R2},
+ {"::_pbi::TcParser::FastV32P1", internal::TcParser::FastV32P1},
+ {"::_pbi::TcParser::FastV32P2", internal::TcParser::FastV32P2},
+ {"::_pbi::TcParser::FastV64S1", internal::TcParser::FastV64S1},
+ {"::_pbi::TcParser::FastV64S2", internal::TcParser::FastV64S2},
+ {"::_pbi::TcParser::FastV64R1", internal::TcParser::FastV64R1},
+ {"::_pbi::TcParser::FastV64R2", internal::TcParser::FastV64R2},
+ {"::_pbi::TcParser::FastV64P1", internal::TcParser::FastV64P1},
+ {"::_pbi::TcParser::FastV64P2", internal::TcParser::FastV64P2},
+ {"::_pbi::TcParser::FastZ32S1", internal::TcParser::FastZ32S1},
+ {"::_pbi::TcParser::FastZ32S2", internal::TcParser::FastZ32S2},
+ {"::_pbi::TcParser::FastZ32R1", internal::TcParser::FastZ32R1},
+ {"::_pbi::TcParser::FastZ32R2", internal::TcParser::FastZ32R2},
+ {"::_pbi::TcParser::FastZ32P1", internal::TcParser::FastZ32P1},
+ {"::_pbi::TcParser::FastZ32P2", internal::TcParser::FastZ32P2},
+ {"::_pbi::TcParser::FastZ64S1", internal::TcParser::FastZ64S1},
+ {"::_pbi::TcParser::FastZ64S2", internal::TcParser::FastZ64S2},
+ {"::_pbi::TcParser::FastZ64R1", internal::TcParser::FastZ64R1},
+ {"::_pbi::TcParser::FastZ64R2", internal::TcParser::FastZ64R2},
+ {"::_pbi::TcParser::FastZ64P1", internal::TcParser::FastZ64P1},
+ {"::_pbi::TcParser::FastZ64P2", internal::TcParser::FastZ64P2},
+ {"::_pbi::TcParser::FastErS1", internal::TcParser::FastErS1},
+ {"::_pbi::TcParser::FastErS2", internal::TcParser::FastErS2},
+ {"::_pbi::TcParser::FastErR1", internal::TcParser::FastErR1},
+ {"::_pbi::TcParser::FastErR2", internal::TcParser::FastErR2},
+ {"::_pbi::TcParser::FastEr0S1", internal::TcParser::FastEr0S1},
+ {"::_pbi::TcParser::FastEr0S2", internal::TcParser::FastEr0S2},
+ {"::_pbi::TcParser::FastEr0R1", internal::TcParser::FastEr0R1},
+ {"::_pbi::TcParser::FastEr0R2", internal::TcParser::FastEr0R2},
+ {"::_pbi::TcParser::FastEr1S1", internal::TcParser::FastEr1S1},
+ {"::_pbi::TcParser::FastEr1S2", internal::TcParser::FastEr1S2},
+ {"::_pbi::TcParser::FastEr1R1", internal::TcParser::FastEr1R1},
+ {"::_pbi::TcParser::FastEr1R2", internal::TcParser::FastEr1R2},
+ {"::_pbi::TcParser::FastEvS1", internal::TcParser::FastEvS1},
+ {"::_pbi::TcParser::FastEvS2", internal::TcParser::FastEvS2},
+ {"::_pbi::TcParser::FastEvR1", internal::TcParser::FastEvR1},
+ {"::_pbi::TcParser::FastEvR2", internal::TcParser::FastEvR2},
+ {"::_pbi::TcParser::FastBS1", internal::TcParser::FastBS1},
+ {"::_pbi::TcParser::FastBS2", internal::TcParser::FastBS2},
+ {"::_pbi::TcParser::FastBR1", internal::TcParser::FastBR1},
+ {"::_pbi::TcParser::FastBR2", internal::TcParser::FastBR2},
+ {"::_pbi::TcParser::FastSS1", internal::TcParser::FastSS1},
+ {"::_pbi::TcParser::FastSS2", internal::TcParser::FastSS2},
+ {"::_pbi::TcParser::FastSR1", internal::TcParser::FastSR1},
+ {"::_pbi::TcParser::FastSR2", internal::TcParser::FastSR2},
+ {"::_pbi::TcParser::FastUS1", internal::TcParser::FastUS1},
+ {"::_pbi::TcParser::FastUS2", internal::TcParser::FastUS2},
+ {"::_pbi::TcParser::FastUR1", internal::TcParser::FastUR1},
+ {"::_pbi::TcParser::FastUR2", internal::TcParser::FastUR2},
+ {"::_pbi::TcParser::FastBiS1", internal::TcParser::FastBiS1},
+ {"::_pbi::TcParser::FastBiS2", internal::TcParser::FastBiS2},
+ {"::_pbi::TcParser::FastSiS1", internal::TcParser::FastSiS1},
+ {"::_pbi::TcParser::FastSiS2", internal::TcParser::FastSiS2},
+ {"::_pbi::TcParser::FastUiS1", internal::TcParser::FastUiS1},
+ {"::_pbi::TcParser::FastUiS2", internal::TcParser::FastUiS2},
+ {"::_pbi::TcParser::FastMdS1", internal::TcParser::FastMdS1},
+ {"::_pbi::TcParser::FastMdS2", internal::TcParser::FastMdS2},
+ {"::_pbi::TcParser::FastGdS1", internal::TcParser::FastGdS1},
+ {"::_pbi::TcParser::FastGdS2", internal::TcParser::FastGdS2},
+ {"::_pbi::TcParser::FastMtS1", internal::TcParser::FastMtS1},
+ {"::_pbi::TcParser::FastMtS2", internal::TcParser::FastMtS2},
+ {"::_pbi::TcParser::FastGtS1", internal::TcParser::FastGtS1},
+ {"::_pbi::TcParser::FastGtS2", internal::TcParser::FastGtS2},
+ {"::_pbi::TcParser::FastMdR1", internal::TcParser::FastMdR1},
+ {"::_pbi::TcParser::FastMdR2", internal::TcParser::FastMdR2},
+ {"::_pbi::TcParser::FastGdR1", internal::TcParser::FastGdR1},
+ {"::_pbi::TcParser::FastGdR2", internal::TcParser::FastGdR2},
+ {"::_pbi::TcParser::FastMtR1", internal::TcParser::FastMtR1},
+ {"::_pbi::TcParser::FastMtR2", internal::TcParser::FastMtR2},
+ {"::_pbi::TcParser::FastGtR1", internal::TcParser::FastGtR1},
+ {"::_pbi::TcParser::FastGtR2", internal::TcParser::FastGtR2},
+ {"::_pbi::TcParser::FastEndG1", internal::TcParser::FastEndG1},
+ {"::_pbi::TcParser::FastEndG2", internal::TcParser::FastEndG2},
+ };
+ auto it = map->find(name);
+ if (it == map->end()) {
+ GOOGLE_LOG(DFATAL) << "Failed to find function: " << name;
+ // Let's not crash in opt, just in case.
+ // MiniParse is always a valid parser.
+ return &internal::TcParser::MiniParse;
+ }
+ return it->second;
+}
+
+const internal::TcParseTableBase* Reflection::CreateTcParseTableForMessageSet()
+ const {
+ // ParseLoop can't parse message set wire format.
+ // Create a dummy table that only exists to make TcParser::ParseLoop jump
+ // into the reflective parse loop.
+
+ using Table = internal::TcParseTable<0, 0, 0, 1, 1>;
+ // We use `operator new` here because the destruction will be done with
+ // `operator delete` unconditionally.
+ void* p = ::operator new(sizeof(Table));
+ auto* full_table = ::new (p) Table{
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, schema_.default_instance_, nullptr},
+ {{{&internal::TcParser::ReflectionParseLoop, {}}}}};
+ GOOGLE_DCHECK_EQ(static_cast<void*>(&full_table->header),
+ static_cast<void*>(full_table));
+ return &full_table->header;
+}
+
+void Reflection::PopulateTcParseFastEntries(
+ const internal::TailCallTableInfo& table_info,
+ TcParseTableBase::FastFieldEntry* fast_entries) const {
+ for (const auto& fast_field : table_info.fast_path_fields) {
+ if (fast_field.field == nullptr) {
+ if (fast_field.func_name.empty()) {
+ // No fast entry here. Use mini parser.
+ *fast_entries++ = {internal::TcParser::MiniParse, {}};
+ } else {
+ // No field, but still a special entry.
+ *fast_entries++ = {GetFastParseFunction(fast_field.func_name),
+ {fast_field.coded_tag, fast_field.nonfield_info}};
+ }
+ } else if (fast_field.func_name.find("TcParser::FastEv") !=
+ fast_field.func_name.npos) {
+ // We can't use fast parsing for these entries because we can't specify
+ // the validator. Use the reflection based parser called from MiniParse.
+ // TODO(b/239592582): Implement a fast parser for these enums.
+ *fast_entries++ = {internal::TcParser::MiniParse, {}};
+ } else {
+ *fast_entries++ = {
+ GetFastParseFunction(fast_field.func_name),
+ {fast_field.coded_tag, fast_field.hasbit_idx, fast_field.aux_idx,
+ static_cast<uint16_t>(schema_.GetFieldOffset(fast_field.field))}};
+ }
+ }
+}
+
+static void PopulateTcParseLookupTable(
+ const internal::TailCallTableInfo& table_info, uint16_t* lookup_table) {
+ for (const auto& entry_block : table_info.num_to_entry_table.blocks) {
+ *lookup_table++ = entry_block.first_fnum & 0xFFFF;
+ *lookup_table++ = entry_block.first_fnum >> 16;
+ *lookup_table++ = entry_block.entries.size();
+ for (auto se16 : entry_block.entries) {
+ *lookup_table++ = se16.skipmap;
+ *lookup_table++ = se16.field_entry_offset;
+ }
+ }
+ *lookup_table++ = 0xFFFF;
+ *lookup_table++ = 0xFFFF;
+}
+
+void Reflection::PopulateTcParseEntries(
+ internal::TailCallTableInfo& table_info,
+ TcParseTableBase::FieldEntry* entries) const {
+ for (const auto& entry : table_info.field_entries) {
+ const FieldDescriptor* field = entry.field;
+ if (field->options().weak()) {
+ // Weak fields are handled by the generated fallback function.
+ // (These are handled by legacy Google-internal logic.)
+ *entries = {};
+ } else if (field->type() == field->TYPE_ENUM &&
+ table_info.aux_entries[entry.aux_idx].type ==
+ internal::TailCallTableInfo::kEnumValidator) {
+ // Mini parse can't handle it. Fallback to reflection.
+ *entries = {};
+ table_info.aux_entries[entry.aux_idx] = {};
+ } else {
+ const OneofDescriptor* oneof = field->real_containing_oneof();
+ entries->offset = schema_.GetFieldOffset(field);
+ if (oneof != nullptr) {
+ entries->has_idx = schema_.oneof_case_offset_ + 4 * oneof->index();
+ } else if (schema_.HasHasbits()) {
+ entries->has_idx =
+ static_cast<int>(8 * schema_.HasBitsOffset() + entry.hasbit_idx);
+ } else {
+ entries->has_idx = 0;
+ }
+ entries->aux_idx = entry.aux_idx;
+ entries->type_card = entry.type_card;
+ }
+
+ ++entries;
+ }
+}
+
+void Reflection::PopulateTcParseFieldAux(
+ const internal::TailCallTableInfo& table_info,
+ TcParseTableBase::FieldAux* field_aux) const {
+ for (const auto& aux_entry : table_info.aux_entries) {
+ switch (aux_entry.type) {
+ case internal::TailCallTableInfo::kNothing:
+ *field_aux++ = {};
+ break;
+ case internal::TailCallTableInfo::kInlinedStringDonatedOffset:
+ field_aux++->offset =
+ static_cast<uint32_t>(schema_.inlined_string_donated_offset_);
+ break;
+ case internal::TailCallTableInfo::kSplitOffset:
+ field_aux++->offset = schema_.SplitOffset();
+ break;
+ case internal::TailCallTableInfo::kSplitSizeof:
+ field_aux++->offset = schema_.SizeofSplit();
+ break;
+ case internal::TailCallTableInfo::kSubTable:
+ GOOGLE_LOG(FATAL) << "Not supported";
+ break;
+ case internal::TailCallTableInfo::kSubMessage:
+ field_aux++->message_default_p =
+ GetDefaultMessageInstance(aux_entry.field);
+ break;
+ case internal::TailCallTableInfo::kEnumRange:
+ field_aux++->enum_range = {aux_entry.enum_range.start,
+ aux_entry.enum_range.size};
+ break;
+ case internal::TailCallTableInfo::kEnumValidator:
+ GOOGLE_LOG(FATAL) << "Not supported.";
+ break;
+ case internal::TailCallTableInfo::kNumericOffset:
+ field_aux++->offset = aux_entry.offset;
+ break;
+ }
+ }
+}
+
+const internal::TcParseTableBase* Reflection::CreateTcParseTable() const {
+ using TcParseTableBase = internal::TcParseTableBase;
+
+ if (descriptor_->options().message_set_wire_format()) {
+ return CreateTcParseTableForMessageSet();
+ }
+
+ std::vector<const FieldDescriptor*> fields;
+ constexpr int kNoHasbit = -1;
+ std::vector<int> has_bit_indices(
+ static_cast<size_t>(descriptor_->field_count()), kNoHasbit);
+ std::vector<int> inlined_string_indices = has_bit_indices;
+ for (int i = 0; i < descriptor_->field_count(); ++i) {
+ auto* field = descriptor_->field(i);
+ if (schema_.IsFieldStripped(field)) continue;
+
+ fields.push_back(field);
+ has_bit_indices[static_cast<size_t>(field->index())] =
+ static_cast<int>(schema_.HasBitIndex(field));
+
+ if (IsInlined(field)) {
+ inlined_string_indices[static_cast<size_t>(field->index())] =
+ schema_.InlinedStringIndex(field);
+ }
+ }
+ std::sort(fields.begin(), fields.end(),
+ [](const FieldDescriptor* a, const FieldDescriptor* b) {
+ return a->number() < b->number();
+ });
+
+ class ReflectionOptionProvider final
+ : public internal::TailCallTableInfo::OptionProvider {
+ public:
+ explicit ReflectionOptionProvider(const Reflection& ref) : ref_(ref) {}
+ internal::TailCallTableInfo::PerFieldOptions GetForField(
+ const FieldDescriptor* field) const final {
+ return {ref_.IsLazyField(field), //
+ ref_.IsInlined(field), //
+
+ // Only LITE can be implicitly weak.
+ /* is_implicitly_weak */ false,
+
+ // We could change this to use direct table.
+ // Might be easier to do when all messages support TDP.
+ /* use_direct_tcparser_table */ false,
+
+ /* is_lite */ false, //
+ ref_.schema_.IsSplit(field)};
+ }
+
+ private:
+ const Reflection& ref_;
+ };
+ internal::TailCallTableInfo table_info(
+ descriptor_, fields, ReflectionOptionProvider(*this), has_bit_indices,
+ inlined_string_indices);
+
+ const size_t fast_entries_count = table_info.fast_path_fields.size();
+ GOOGLE_CHECK_EQ(fast_entries_count, 1 << table_info.table_size_log2);
+ const uint16_t lookup_table_offset = AlignTo<uint16_t>(
+ sizeof(TcParseTableBase) +
+ fast_entries_count * sizeof(TcParseTableBase::FastFieldEntry));
+ const uint32_t field_entry_offset = AlignTo<TcParseTableBase::FieldEntry>(
+ lookup_table_offset +
+ sizeof(uint16_t) * table_info.num_to_entry_table.size16());
+ const uint32_t aux_offset = AlignTo<TcParseTableBase::FieldAux>(
+ field_entry_offset +
+ sizeof(TcParseTableBase::FieldEntry) * fields.size());
+
+ int byte_size =
+ aux_offset +
+ sizeof(TcParseTableBase::FieldAux) * table_info.aux_entries.size() +
+ sizeof(char) * table_info.field_name_data.size();
+
+ void* p = ::operator new(byte_size);
+ auto* res = ::new (p) TcParseTableBase{
+ static_cast<uint16_t>(schema_.HasHasbits() ? schema_.HasBitsOffset() : 0),
+ // extensions handled through reflection.
+ 0, 0, 0,
+ static_cast<uint32_t>(fields.empty() ? 0 : fields.back()->number()),
+ static_cast<uint8_t>((fast_entries_count - 1) << 3), lookup_table_offset,
+ table_info.num_to_entry_table.skipmap32, field_entry_offset,
+ static_cast<uint16_t>(fields.size()),
+ static_cast<uint16_t>(table_info.aux_entries.size()), aux_offset,
+ schema_.default_instance_, &internal::TcParser::ReflectionFallback};
+
+ // Now copy the rest of the payloads
+ PopulateTcParseFastEntries(table_info, res->fast_entry(0));
+
+ PopulateTcParseLookupTable(table_info, res->field_lookup_begin());
+
+ PopulateTcParseEntries(table_info, res->field_entries_begin());
+
+ PopulateTcParseFieldAux(table_info, res->field_aux(0u));
+
+ // Copy the name data.
+ memcpy(res->name_data(), table_info.field_name_data.data(),
+ table_info.field_name_data.size());
+ // Validation to make sure we used all the bytes correctly.
+ GOOGLE_CHECK_EQ(res->name_data() + table_info.field_name_data.size() -
+ reinterpret_cast<char*>(res),
+ byte_size);
+
+ return res;
+}
+
namespace {
// Helper function to transform migration schema into reflection schema.
@@ -2872,9 +3337,11 @@
MigrationSchema migration_schema) {
ReflectionSchema result;
result.default_instance_ = *default_instance;
- // First 7 offsets are offsets to the special fields. The following offsets
+ // First 9 offsets are offsets to the special fields. The following offsets
// are the proto fields.
- result.offsets_ = offsets + migration_schema.offsets_index + 6;
+ //
+ // TODO(congliu): Find a way to not encode sizeof_split_ in offsets.
+ result.offsets_ = offsets + migration_schema.offsets_index + 8;
result.has_bit_indices_ = offsets + migration_schema.has_bit_indices_index;
result.has_bits_offset_ = offsets[migration_schema.offsets_index + 0];
result.metadata_offset_ = offsets[migration_schema.offsets_index + 1];
@@ -2884,6 +3351,8 @@
result.weak_field_map_offset_ = offsets[migration_schema.offsets_index + 4];
result.inlined_string_donated_offset_ =
offsets[migration_schema.offsets_index + 5];
+ result.split_offset_ = offsets[migration_schema.offsets_index + 6];
+ result.sizeof_split_ = offsets[migration_schema.offsets_index + 7];
result.inlined_string_indices_ =
offsets + migration_schema.inlined_string_indices_index;
return result;
@@ -2970,7 +3439,7 @@
private:
MetadataOwner() = default; // private because singleton
- WrappedMutex mu_;
+ absl::Mutex mu_;
std::vector<std::pair<const Metadata*, const Metadata*> > metadata_arrays_;
};
@@ -2981,7 +3450,7 @@
{
// This only happens once per proto file. So a global mutex to serialize
// calls to AddDescriptors.
- static WrappedMutex mu{GOOGLE_PROTOBUF_LINKER_INITIALIZED};
+ static absl::Mutex mu{absl::kConstInit};
mu.Lock();
AddDescriptors(table);
mu.Unlock();
@@ -3076,9 +3545,8 @@
namespace internal {
Metadata AssignDescriptors(const DescriptorTable* (*table)(),
- internal::once_flag* once,
- const Metadata& metadata) {
- call_once(*once, [=] {
+ absl::once_flag* once, const Metadata& metadata) {
+ absl::call_once(*once, [=] {
auto* t = table();
AssignDescriptorsImpl(t, t->is_eager);
});
@@ -3088,7 +3556,7 @@
void AssignDescriptors(const DescriptorTable* table, bool eager) {
if (!eager) eager = table->is_eager;
- call_once(*table->once, AssignDescriptorsImpl, table, eager);
+ absl::call_once(*table->once, AssignDescriptorsImpl, table, eager);
}
AddDescriptorsRunner::AddDescriptorsRunner(const DescriptorTable* table) {
@@ -3165,4 +3633,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/generated_message_reflection.h b/src/google/protobuf/generated_message_reflection.h
index 334b2cc..3a6e93c 100644
--- a/src/google/protobuf/generated_message_reflection.h
+++ b/src/google/protobuf/generated_message_reflection.h
@@ -38,17 +38,19 @@
#ifndef GOOGLE_PROTOBUF_GENERATED_MESSAGE_REFLECTION_H__
#define GOOGLE_PROTOBUF_GENERATED_MESSAGE_REFLECTION_H__
-#include <google/protobuf/stubs/casts.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/once.h>
-#include <google/protobuf/port.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/generated_enum_reflection.h>
-#include <google/protobuf/unknown_field_set.h>
+#include <string>
+#include "google/protobuf/stubs/common.h"
+#include "absl/base/call_once.h"
+#include "absl/base/casts.h"
+#include "absl/strings/string_view.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/generated_enum_reflection.h"
+#include "google/protobuf/port.h"
+#include "google/protobuf/unknown_field_set.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
#ifdef SWIG
#error "You cannot SWIG proto headers"
@@ -72,6 +74,16 @@
class ExtensionSet; // extension_set.h
class WeakFieldMap; // weak_field_map.h
+// Tag used on offsets for fields that don't have a real offset.
+// For example, weak message fields go into the WeakFieldMap and not in an
+// actual field.
+constexpr uint32_t kInvalidFieldOffsetTag = 0x40000000u;
+
+// Mask used on offsets for split fields.
+constexpr uint32_t kSplitFieldOffsetMask = 0x80000000u;
+constexpr uint32_t kLazyMask = 0x1u;
+constexpr uint32_t kInlinedMask = 0x1u;
+
// This struct describes the internal layout of the message, hence this is
// used to act on the message reflectively.
// default_instance: The default instance of the message. This is only
@@ -234,6 +246,24 @@
return false;
}
+ bool IsSplit() const { return split_offset_ != -1; }
+
+ bool IsSplit(const FieldDescriptor* field) const {
+ return split_offset_ != -1 &&
+ (offsets_[field->index()] & kSplitFieldOffsetMask) != 0;
+ }
+
+ // Byte offset of _split_.
+ uint32_t SplitOffset() const {
+ GOOGLE_DCHECK(IsSplit());
+ return static_cast<uint32_t>(split_offset_);
+ }
+
+ uint32_t SizeofSplit() const {
+ GOOGLE_DCHECK(IsSplit());
+ return static_cast<uint32_t>(sizeof_split_);
+ }
+
bool HasWeakFields() const { return weak_field_map_offset_ > 0; }
@@ -254,6 +284,8 @@
int weak_field_map_offset_;
const uint32_t* inlined_string_indices_;
int inlined_string_donated_offset_;
+ int split_offset_;
+ int sizeof_split_;
// We tag offset values to provide additional data about fields (such as
// "unused" or "lazy" or "inlined").
@@ -261,15 +293,15 @@
if (type == FieldDescriptor::TYPE_MESSAGE ||
type == FieldDescriptor::TYPE_STRING ||
type == FieldDescriptor::TYPE_BYTES) {
- return v & 0xFFFFFFFEu;
+ return v & (~kSplitFieldOffsetMask) & (~kInlinedMask) & (~kLazyMask);
}
- return v;
+ return v & (~kSplitFieldOffsetMask);
}
static bool Inlined(uint32_t v, FieldDescriptor::Type type) {
if (type == FieldDescriptor::TYPE_STRING ||
type == FieldDescriptor::TYPE_BYTES) {
- return (v & 1u) != 0u;
+ return (v & kInlinedMask) != 0u;
} else {
// Non string/byte fields are not inlined.
return false;
@@ -299,7 +331,7 @@
int size; // of serialized descriptor
const char* descriptor;
const char* filename;
- once_flag* once;
+ absl::once_flag* once;
const DescriptorTable* const* deps;
int num_deps;
int num_messages;
@@ -312,13 +344,6 @@
const ServiceDescriptor** file_level_service_descriptors;
};
-enum {
- // Tag used on offsets for fields that don't have a real offset.
- // For example, weak message fields go into the WeakFieldMap and not in an
- // actual field.
- kInvalidFieldOffsetTag = 0x40000000u,
-};
-
// AssignDescriptors() pulls the compiled FileDescriptor from the DescriptorPool
// and uses it to populate all of the global variables which store pointers to
// the descriptor objects. It also constructs the reflection objects. It is
@@ -332,7 +357,7 @@
// It takes a `Metadata` and returns it to allow for tail calls and reduce
// binary size.
Metadata PROTOBUF_EXPORT AssignDescriptors(const DescriptorTable* (*table)(),
- internal::once_flag* once,
+ absl::once_flag* once,
const Metadata& metadata);
// These cannot be in lite so we put them in the reflection.
@@ -345,10 +370,38 @@
explicit AddDescriptorsRunner(const DescriptorTable* table);
};
+struct DenseEnumCacheInfo {
+ std::atomic<const std::string**> cache;
+ int min_val;
+ int max_val;
+ const EnumDescriptor* (*descriptor_fn)();
+};
+PROTOBUF_EXPORT const std::string& NameOfDenseEnumSlow(int v,
+ DenseEnumCacheInfo*);
+
+// Similar to the routine NameOfEnum, this routine returns the name of an enum.
+// Unlike that routine, it allocates, on-demand, a block of pointers to the
+// std::string objects allocated by reflection to store the enum names. This
+// way, as long as the enum values are fairly dense, looking them up can be
+// very fast. This assumes all the enums fall in the range [min_val .. max_val].
+template <const EnumDescriptor* (*descriptor_fn)(), int min_val, int max_val>
+const std::string& NameOfDenseEnum(int v) {
+ static_assert(max_val - min_val >= 0, "Too mamny enums between min and max.");
+ static DenseEnumCacheInfo deci = {/* atomic ptr */ {}, min_val, max_val,
+ descriptor_fn};
+ const std::string** cache = deci.cache.load(std::memory_order_acquire );
+ if (PROTOBUF_PREDICT_TRUE(cache != nullptr)) {
+ if (PROTOBUF_PREDICT_TRUE(v >= min_val && v <= max_val)) {
+ return *cache[v - min_val];
+ }
+ }
+ return NameOfDenseEnumSlow(v, &deci);
+}
+
} // namespace internal
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_GENERATED_MESSAGE_REFLECTION_H__
diff --git a/src/google/protobuf/generated_message_reflection_unittest.cc b/src/google/protobuf/generated_message_reflection_unittest.cc
index 50ce399..75ba3f6 100644
--- a/src/google/protobuf/generated_message_reflection_unittest.cc
+++ b/src/google/protobuf/generated_message_reflection_unittest.cc
@@ -42,25 +42,25 @@
// compiler/cpp/unittest, except using the reflection interface
// rather than generated accessors.
-#include <google/protobuf/generated_message_reflection.h>
+#include "google/protobuf/generated_message_reflection.h"
#include <memory>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/map_unittest.pb.h>
-#include <google/protobuf/unittest.pb.h>
-#include <google/protobuf/unittest_mset.pb.h>
-#include <google/protobuf/unittest_mset_wire_format.pb.h>
-#include <google/protobuf/arena.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/testing/googletest.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/map_unittest.pb.h"
+#include "google/protobuf/unittest.pb.h"
+#include "google/protobuf/unittest_mset.pb.h"
+#include "google/protobuf/unittest_mset_wire_format.pb.h"
+#include "google/protobuf/arena.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/testing/googletest.h"
#include <gtest/gtest.h>
-#include <google/protobuf/map_test_util.h>
-#include <google/protobuf/test_util.h>
+#include "google/protobuf/map_test_util.h"
+#include "google/protobuf/test_util.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -1261,8 +1261,6 @@
const Reflection* reflection = message.GetReflection();
const Descriptor* descriptor = message.GetDescriptor();
-#define f(NAME) descriptor->FindFieldByName(NAME)
-
// Testing every single failure mode would be too much work. Let's just
// check a few.
EXPECT_DEATH(
@@ -1301,8 +1299,6 @@
" Message type: protobuf_unittest.TestAllTypes\n"
" Field : protobuf_unittest.ForeignMessage.c\n"
" Problem : Field does not match message type.");
-
-#undef f
}
#endif // PROTOBUF_HAS_DEATH_TEST
diff --git a/src/google/protobuf/generated_message_tctable_decl.h b/src/google/protobuf/generated_message_tctable_decl.h
index b1bb1de..b5963a2 100644
--- a/src/google/protobuf/generated_message_tctable_decl.h
+++ b/src/google/protobuf/generated_message_tctable_decl.h
@@ -36,15 +36,16 @@
#define GOOGLE_PROTOBUF_GENERATED_MESSAGE_TCTABLE_DECL_H__
#include <array>
+#include <atomic>
#include <cstddef>
#include <cstdint>
#include <type_traits>
-#include <google/protobuf/message_lite.h>
-#include <google/protobuf/parse_context.h>
+#include "google/protobuf/message_lite.h"
+#include "google/protobuf/parse_context.h"
// Must come last:
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -85,6 +86,27 @@
uint8_t aux_idx() const { return static_cast<uint8_t>(data >> 24); }
uint16_t offset() const { return static_cast<uint16_t>(data >> 48); }
+ // Constructor for special entries that do not represent a field.
+ // - End group: `nonfield_info` is the decoded tag.
+ constexpr TcFieldData(uint16_t coded_tag, uint16_t nonfield_info)
+ : data(uint64_t{nonfield_info} << 16 | //
+ uint64_t{coded_tag}) {}
+
+ // Fields used in non-field entries
+ //
+ // Bit:
+ // +-----------+-------------------+
+ // |63 .. 32|31 .. 0|
+ // +---------------+---------------+
+ // : . : . : . 16|=======| [16] coded_tag()
+ // : . : . 32|=======| . : [16] decoded_tag()
+ // :---.---:---.---: . : . : [32] (unused)
+ // +-----------+-------------------+
+ // |63 .. 32|31 .. 0|
+ // +---------------+---------------+
+
+ uint16_t decoded_tag() const { return static_cast<uint16_t>(data >> 16); }
+
// Fields used in mini table parsing:
//
// Bit:
@@ -120,6 +142,8 @@
#pragma warning(disable : 4324)
#endif
+struct FieldAuxDefaultMessage {};
+
// Base class for message-level table with info for the tail-call parser.
struct alignas(uint64_t) TcParseTableBase {
// Common attributes for message layout:
@@ -173,25 +197,58 @@
// Table entry for fast-path tailcall dispatch handling.
struct FastFieldEntry {
// Target function for dispatch:
- TailCallParseFunc target;
+ mutable std::atomic<TailCallParseFunc> target_atomic;
+
// Field data used during parse:
TcFieldData bits;
+
+ // Default initializes this instance with undefined values.
+ FastFieldEntry() = default;
+
+ // Constant initializes this instance
+ constexpr FastFieldEntry(TailCallParseFunc func, TcFieldData bits)
+ : target_atomic(func), bits(bits) {}
+
+ // FastFieldEntry is copy-able and assignable, which is intended
+ // mainly for testing and debugging purposes.
+ FastFieldEntry(const FastFieldEntry& rhs) noexcept
+ : FastFieldEntry(rhs.target(), rhs.bits) {}
+ FastFieldEntry& operator=(const FastFieldEntry& rhs) noexcept {
+ SetTarget(rhs.target());
+ bits = rhs.bits;
+ return *this;
+ }
+
+ // Protocol buffer code should use these relaxed accessors.
+ TailCallParseFunc target() const {
+ return target_atomic.load(std::memory_order_relaxed);
+ }
+ void SetTarget(TailCallParseFunc func) const {
+ return target_atomic.store(func, std::memory_order_relaxed);
+ }
};
// There is always at least one table entry.
const FastFieldEntry* fast_entry(size_t idx) const {
return reinterpret_cast<const FastFieldEntry*>(this + 1) + idx;
}
+ FastFieldEntry* fast_entry(size_t idx) {
+ return reinterpret_cast<FastFieldEntry*>(this + 1) + idx;
+ }
// Returns a begin iterator (pointer) to the start of the field lookup table.
const uint16_t* field_lookup_begin() const {
return reinterpret_cast<const uint16_t*>(reinterpret_cast<uintptr_t>(this) +
lookup_table_offset);
}
+ uint16_t* field_lookup_begin() {
+ return reinterpret_cast<uint16_t*>(reinterpret_cast<uintptr_t>(this) +
+ lookup_table_offset);
+ }
// Field entry for all fields.
struct FieldEntry {
uint32_t offset; // offset in the message object
- int32_t has_idx; // has-bit index
+ int32_t has_idx; // has-bit index, relative to the message object
uint16_t aux_idx; // index for `field_aux`.
uint16_t type_card; // `FieldType` and `Cardinality` (see _impl.h)
};
@@ -201,29 +258,46 @@
return reinterpret_cast<const FieldEntry*>(
reinterpret_cast<uintptr_t>(this) + field_entries_offset);
}
+ FieldEntry* field_entries_begin() {
+ return reinterpret_cast<FieldEntry*>(reinterpret_cast<uintptr_t>(this) +
+ field_entries_offset);
+ }
// Auxiliary entries for field types that need extra information.
union FieldAux {
- constexpr FieldAux() : message_default(nullptr) {}
+ constexpr FieldAux() : message_default_p(nullptr) {}
constexpr FieldAux(bool (*enum_validator)(int))
: enum_validator(enum_validator) {}
constexpr FieldAux(field_layout::Offset off) : offset(off.off) {}
constexpr FieldAux(int16_t range_start, uint16_t range_length)
: enum_range{range_start, range_length} {}
- constexpr FieldAux(const MessageLite* msg) : message_default(msg) {}
+ constexpr FieldAux(const MessageLite* msg) : message_default_p(msg) {}
+ constexpr FieldAux(FieldAuxDefaultMessage, const void* msg)
+ : message_default_p(msg) {}
+ constexpr FieldAux(const TcParseTableBase* table) : table(table) {}
bool (*enum_validator)(int);
struct {
int16_t start; // minimum enum number (if it fits)
uint16_t length; // length of range (i.e., max = start + length - 1)
} enum_range;
uint32_t offset;
- const MessageLite* message_default;
+ const void* message_default_p;
+ const TcParseTableBase* table;
+
+ const MessageLite* message_default() const {
+ return static_cast<const MessageLite*>(message_default_p);
+ }
};
const FieldAux* field_aux(uint32_t idx) const {
return reinterpret_cast<const FieldAux*>(reinterpret_cast<uintptr_t>(this) +
aux_offset) +
idx;
}
+ FieldAux* field_aux(uint32_t idx) {
+ return reinterpret_cast<FieldAux*>(reinterpret_cast<uintptr_t>(this) +
+ aux_offset) +
+ idx;
+ }
const FieldAux* field_aux(const FieldEntry* entry) const {
return field_aux(entry->aux_idx);
}
@@ -234,6 +308,11 @@
aux_offset +
num_aux_entries * sizeof(FieldAux));
}
+ char* name_data() {
+ return reinterpret_cast<char*>(reinterpret_cast<uintptr_t>(this) +
+ aux_offset +
+ num_aux_entries * sizeof(FieldAux));
+ }
};
#if defined(_MSC_VER) && !defined(_WIN64)
@@ -307,6 +386,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_GENERATED_MESSAGE_TCTABLE_DECL_H__
diff --git a/src/google/protobuf/generated_message_tctable_full.cc b/src/google/protobuf/generated_message_tctable_full.cc
index b77bb8d..f224d4c 100644
--- a/src/google/protobuf/generated_message_tctable_full.cc
+++ b/src/google/protobuf/generated_message_tctable_full.cc
@@ -30,24 +30,61 @@
#include <cstdint>
-#include <google/protobuf/extension_set.h>
-#include <google/protobuf/generated_message_tctable_impl.h>
-#include <google/protobuf/message.h>
-#include <google/protobuf/parse_context.h>
-#include <google/protobuf/unknown_field_set.h>
+#include "google/protobuf/extension_set.h"
+#include "google/protobuf/generated_message_tctable_impl.h"
+#include "google/protobuf/message.h"
+#include "google/protobuf/parse_context.h"
+#include "google/protobuf/port.h"
+#include "google/protobuf/unknown_field_set.h"
+#include "google/protobuf/wire_format.h"
-// clang-format off
-#include <google/protobuf/port_def.inc>
-// clang-format on
+// must be last
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
namespace internal {
+using ::google::protobuf::internal::DownCast;
const char* TcParser::GenericFallback(PROTOBUF_TC_PARAM_DECL) {
return GenericFallbackImpl<Message, UnknownFieldSet>(PROTOBUF_TC_PARAM_PASS);
}
+const char* TcParser::ReflectionFallback(PROTOBUF_TC_PARAM_DECL) {
+ SyncHasbits(msg, hasbits, table);
+ uint32_t tag = data.tag();
+ if (tag == 0 || (tag & 7) == WireFormatLite::WIRETYPE_END_GROUP) {
+ ctx->SetLastTag(tag);
+ return ptr;
+ }
+
+ auto* full_msg = DownCast<Message*>(msg);
+ auto* descriptor = full_msg->GetDescriptor();
+ auto* reflection = full_msg->GetReflection();
+ int field_number = WireFormatLite::GetTagFieldNumber(tag);
+ const FieldDescriptor* field = descriptor->FindFieldByNumber(field_number);
+
+ // If that failed, check if the field is an extension.
+ if (field == nullptr && descriptor->IsExtensionNumber(field_number)) {
+ if (ctx->data().pool == nullptr) {
+ field = reflection->FindKnownExtensionByNumber(field_number);
+ } else {
+ field = ctx->data().pool->FindExtensionByNumber(descriptor, field_number);
+ }
+ }
+
+ return WireFormat::_InternalParseAndMergeField(full_msg, ptr, ctx, tag,
+ reflection, field);
+}
+
+const char* TcParser::ReflectionParseLoop(PROTOBUF_TC_PARAM_DECL) {
+ (void)data;
+ (void)table;
+ (void)hasbits;
+ // Call into the wire format reflective parse loop.
+ return WireFormat::_InternalParse(DownCast<Message*>(msg), ptr, ctx);
+}
+
} // namespace internal
} // namespace protobuf
} // namespace google
diff --git a/src/google/protobuf/generated_message_tctable_gen.cc b/src/google/protobuf/generated_message_tctable_gen.cc
new file mode 100644
index 0000000..b08e3c1
--- /dev/null
+++ b/src/google/protobuf/generated_message_tctable_gen.cc
@@ -0,0 +1,810 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "google/protobuf/generated_message_tctable_gen.h"
+
+#include <algorithm>
+#include <limits>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/generated_message_tctable_decl.h"
+#include "google/protobuf/generated_message_tctable_impl.h"
+#include "google/protobuf/wire_format.h"
+
+// Must come last:
+#include "google/protobuf/port_def.inc"
+
+namespace google {
+namespace protobuf {
+namespace internal {
+
+namespace {
+
+bool GetEnumValidationRange(const EnumDescriptor* enum_type, int16_t& start,
+ uint16_t& size) {
+ GOOGLE_CHECK_GT(enum_type->value_count(), 0) << enum_type->DebugString();
+
+ // Check if the enum values are a single, contiguous range.
+ std::vector<int> enum_values;
+ for (int i = 0, N = static_cast<int>(enum_type->value_count()); i < N; ++i) {
+ enum_values.push_back(enum_type->value(i)->number());
+ }
+ auto values_begin = enum_values.begin();
+ auto values_end = enum_values.end();
+ std::sort(values_begin, values_end);
+ enum_values.erase(std::unique(values_begin, values_end), values_end);
+
+ if (std::numeric_limits<int16_t>::min() <= enum_values[0] &&
+ enum_values[0] <= std::numeric_limits<int16_t>::max() &&
+ enum_values.size() <= std::numeric_limits<uint16_t>::max() &&
+ static_cast<int>(enum_values[0] + enum_values.size() - 1) ==
+ enum_values.back()) {
+ start = static_cast<int16_t>(enum_values[0]);
+ size = static_cast<uint16_t>(enum_values.size());
+ return true;
+ } else {
+ return false;
+ }
+}
+
+void PopulateFastFieldEntry(const TailCallTableInfo::FieldEntryInfo& entry,
+ const TailCallTableInfo::PerFieldOptions& options,
+ TailCallTableInfo::FastFieldInfo& info) {
+ const FieldDescriptor* field = entry.field;
+ std::string name = "::_pbi::TcParser::Fast";
+ uint8_t aux_idx = static_cast<uint8_t>(entry.aux_idx);
+
+ static const char* kPrefix[] = {
+ nullptr, // 0
+ "F64", // TYPE_DOUBLE = 1,
+ "F32", // TYPE_FLOAT = 2,
+ "V64", // TYPE_INT64 = 3,
+ "V64", // TYPE_UINT64 = 4,
+ "V32", // TYPE_INT32 = 5,
+ "F64", // TYPE_FIXED64 = 6,
+ "F32", // TYPE_FIXED32 = 7,
+ "V8", // TYPE_BOOL = 8,
+ "", // TYPE_STRING = 9,
+ "G", // TYPE_GROUP = 10,
+ "M", // TYPE_MESSAGE = 11,
+ "B", // TYPE_BYTES = 12,
+ "V32", // TYPE_UINT32 = 13,
+ "", // TYPE_ENUM = 14,
+ "F32", // TYPE_SFIXED32 = 15,
+ "F64", // TYPE_SFIXED64 = 16,
+ "Z32", // TYPE_SINT32 = 17,
+ "Z64", // TYPE_SINT64 = 18,
+ };
+ name.append(kPrefix[field->type()]);
+
+ if (field->type() == field->TYPE_ENUM) {
+ // Enums are handled as:
+ // - V32 for open enums
+ // - Er (and Er0/Er1) for sequential enums
+ // - Ev for the rest
+ if (cpp::HasPreservingUnknownEnumSemantics(field)) {
+ name.append("V32");
+ } else if (field->is_repeated() && field->is_packed()) {
+ GOOGLE_LOG(DFATAL) << "Enum validation not handled: " << field->DebugString();
+ return;
+ } else {
+ int16_t start;
+ uint16_t size;
+ if (GetEnumValidationRange(field->enum_type(), start, size)) {
+ name.append("Er");
+ int max_value = start + size - 1;
+ if (max_value <= 127 && (start == 0 || start == 1)) {
+ name.append(1, '0' + start);
+ aux_idx = max_value;
+ }
+ } else {
+ name.append("Ev");
+ }
+ }
+ }
+ if (field->type() == field->TYPE_STRING) {
+ switch (internal::cpp::GetUtf8CheckMode(field, options.is_lite)) {
+ case internal::cpp::Utf8CheckMode::kStrict:
+ name.append("U");
+ break;
+ case internal::cpp::Utf8CheckMode::kVerify:
+ name.append("S");
+ break;
+ case internal::cpp::Utf8CheckMode::kNone:
+ name.append("B");
+ break;
+ }
+ }
+ if (field->type() == field->TYPE_STRING ||
+ field->type() == field->TYPE_BYTES) {
+ if (options.is_string_inlined) {
+ name.append("i");
+ GOOGLE_CHECK(!field->is_repeated());
+ aux_idx = static_cast<uint8_t>(entry.inlined_string_idx);
+ }
+ }
+ if (field->type() == field->TYPE_MESSAGE ||
+ field->type() == field->TYPE_GROUP) {
+ name.append(options.use_direct_tcparser_table ? "t" : "d");
+ }
+
+ // The field implementation functions are prefixed by cardinality:
+ // `S` for optional or implicit fields.
+ // `R` for non-packed repeated.
+ // `P` for packed repeated.
+ name.append(field->is_packed() ? "P"
+ : field->is_repeated() ? "R"
+ : field->real_containing_oneof() ? "O"
+ : "S");
+
+ // Append the tag length. Fast parsing only handles 1- or 2-byte tags.
+ name.append(field->number() < 16 ? "1" : "2");
+
+ info.func_name = std::move(name);
+ info.aux_idx = aux_idx;
+}
+
+bool IsFieldEligibleForFastParsing(
+ const TailCallTableInfo::FieldEntryInfo& entry,
+ const TailCallTableInfo::OptionProvider& option_provider) {
+ const auto* field = entry.field;
+ // Conditions which exclude a field from being handled by fast parsing
+ // regardless of options should be considered in IsExcludedFromFastParsing.
+ if (!IsDescriptorEligibleForFastParsing(field)) return false;
+
+ const auto options = option_provider.GetForField(field);
+ // Weak, lazy, and split fields are not handled on the fast path.
+ if (options.is_implicitly_weak) return false;
+ if (options.is_lazy) return false;
+ if (options.should_split) return false;
+
+ // We will check for a valid auxiliary index range later. However, we might
+ // want to change the value we check for inlined string fields.
+ int aux_idx = entry.aux_idx;
+
+ switch (field->type()) {
+ // Some bytes fields can be handled on fast path.
+ case FieldDescriptor::TYPE_STRING:
+ case FieldDescriptor::TYPE_BYTES:
+ if (field->options().ctype() != FieldOptions::STRING) {
+ return false;
+ }
+ if (options.is_string_inlined) {
+ GOOGLE_CHECK(!field->is_repeated());
+ // For inlined strings, the donation state index is stored in the
+ // `aux_idx` field of the fast parsing info. We need to check the range
+ // of that value instead of the auxiliary index.
+ aux_idx = entry.inlined_string_idx;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ if (cpp::HasHasbit(field)) {
+ // The tailcall parser can only update the first 32 hasbits. Fields with
+ // has-bits beyond the first 32 are handled by mini parsing/fallback.
+ GOOGLE_CHECK_GE(entry.hasbit_idx, 0) << field->DebugString();
+ if (entry.hasbit_idx >= 32) return false;
+ }
+
+ // If the field needs auxiliary data, then the aux index is needed. This
+ // must fit in a uint8_t.
+ if (aux_idx > std::numeric_limits<uint8_t>::max()) {
+ return false;
+ }
+
+ return true;
+}
+
+absl::optional<uint32_t> GetEndGroupTag(const Descriptor* descriptor) {
+ auto* parent = descriptor->containing_type();
+ if (parent == nullptr) return absl::nullopt;
+ for (int i = 0; i < parent->field_count(); ++i) {
+ auto* field = parent->field(i);
+ if (field->type() == field->TYPE_GROUP &&
+ field->message_type() == descriptor) {
+ return WireFormatLite::MakeTag(field->number(),
+ WireFormatLite::WIRETYPE_END_GROUP);
+ }
+ }
+ return absl::nullopt;
+}
+
+uint32_t RecodeTagForFastParsing(uint32_t tag) {
+ GOOGLE_DCHECK_LE(tag, 0x3FFF);
+ // Construct the varint-coded tag. If it is more than 7 bits, we need to
+ // shift the high bits and add a continue bit.
+ if (uint32_t hibits = tag & 0xFFFFFF80) {
+ // hi = tag & ~0x7F
+ // lo = tag & 0x7F
+ // This shifts hi to the left by 1 to the next byte and sets the
+ // continuation bit.
+ tag = tag + hibits + 128;
+ }
+ return tag;
+}
+
+std::vector<TailCallTableInfo::FastFieldInfo> SplitFastFieldsForSize(
+ absl::optional<uint32_t> end_group_tag,
+ const std::vector<TailCallTableInfo::FieldEntryInfo>& field_entries,
+ int table_size_log2,
+ const TailCallTableInfo::OptionProvider& option_provider) {
+ std::vector<TailCallTableInfo::FastFieldInfo> result(1 << table_size_log2);
+ const uint32_t idx_mask = static_cast<uint32_t>(result.size() - 1);
+ const auto tag_to_idx = [&](uint32_t tag) {
+ // The field index is determined by the low bits of the field number, where
+ // the table size determines the width of the mask. The largest table
+ // supported is 32 entries. The parse loop uses these bits directly, so that
+ // the dispatch does not require arithmetic:
+ // byte 0 byte 1
+ // tag: 1nnnnttt 0nnnnnnn
+ // ^^^^^
+ // idx (table_size_log2=5)
+ // This means that any field number that does not fit in the lower 4 bits
+ // will always have the top bit of its table index asserted.
+ return (tag >> 3) & idx_mask;
+ };
+
+ if (end_group_tag.has_value() && (*end_group_tag >> 14) == 0) {
+ // Fits in 1 or 2 varint bytes.
+ const uint32_t tag = RecodeTagForFastParsing(*end_group_tag);
+ const uint32_t fast_idx = tag_to_idx(tag);
+
+ TailCallTableInfo::FastFieldInfo& info = result[fast_idx];
+ info.func_name = "::_pbi::TcParser::FastEndG";
+ info.func_name.append(*end_group_tag < 128 ? "1" : "2");
+ info.coded_tag = tag;
+ info.nonfield_info = *end_group_tag;
+ }
+
+ for (const auto& entry : field_entries) {
+ if (!IsFieldEligibleForFastParsing(entry, option_provider)) {
+ continue;
+ }
+
+ const auto* field = entry.field;
+ const auto options = option_provider.GetForField(field);
+ const uint32_t tag = RecodeTagForFastParsing(WireFormat::MakeTag(field));
+ const uint32_t fast_idx = tag_to_idx(tag);
+
+ TailCallTableInfo::FastFieldInfo& info = result[fast_idx];
+ if (!info.func_name.empty()) {
+ // This field entry is already filled.
+ continue;
+ }
+
+ // Fill in this field's entry:
+ GOOGLE_CHECK(info.func_name.empty()) << info.func_name;
+ PopulateFastFieldEntry(entry, options, info);
+ info.field = field;
+ info.coded_tag = tag;
+ // If this field does not have presence, then it can set an out-of-bounds
+ // bit (tailcall parsing uses a uint64_t for hasbits, but only stores 32).
+ info.hasbit_idx = cpp::HasHasbit(field) ? entry.hasbit_idx : 63;
+ }
+ return result;
+}
+
+// Filter out fields that will be handled by mini parsing.
+std::vector<const FieldDescriptor*> FilterMiniParsedFields(
+ const std::vector<const FieldDescriptor*>& fields,
+ const TailCallTableInfo::OptionProvider& option_provider
+) {
+ std::vector<const FieldDescriptor*> generated_fallback_fields;
+
+ for (const auto* field : fields) {
+ auto options = option_provider.GetForField(field);
+
+ bool handled = false;
+ switch (field->type()) {
+ case FieldDescriptor::TYPE_DOUBLE:
+ case FieldDescriptor::TYPE_FLOAT:
+ case FieldDescriptor::TYPE_FIXED32:
+ case FieldDescriptor::TYPE_SFIXED32:
+ case FieldDescriptor::TYPE_FIXED64:
+ case FieldDescriptor::TYPE_SFIXED64:
+ case FieldDescriptor::TYPE_BOOL:
+ case FieldDescriptor::TYPE_UINT32:
+ case FieldDescriptor::TYPE_SINT32:
+ case FieldDescriptor::TYPE_INT32:
+ case FieldDescriptor::TYPE_UINT64:
+ case FieldDescriptor::TYPE_SINT64:
+ case FieldDescriptor::TYPE_INT64:
+ // These are handled by MiniParse, so we don't need any generated
+ // fallback code.
+ handled = true;
+ break;
+
+ case FieldDescriptor::TYPE_ENUM:
+ if (field->is_repeated() &&
+ !cpp::HasPreservingUnknownEnumSemantics(field)) {
+ // TODO(b/206890171): handle packed repeated closed enums
+ // Non-packed repeated can be handled using tables, but we still
+ // need to generate fallback code for all repeated enums in order to
+ // handle packed encoding. This is because of the lite/full split
+ // when handling invalid enum values in a packed field.
+ handled = false;
+ } else {
+ handled = true;
+ }
+ break;
+
+ case FieldDescriptor::TYPE_BYTES:
+ case FieldDescriptor::TYPE_STRING:
+ if (options.is_string_inlined) {
+ // TODO(b/198211897): support InilnedStringField.
+ handled = false;
+ } else {
+ handled = true;
+ }
+ break;
+
+ case FieldDescriptor::TYPE_MESSAGE:
+ case FieldDescriptor::TYPE_GROUP:
+ // TODO(b/210762816): support remaining field types.
+ if (field->is_map() || field->options().weak() ||
+ options.is_implicitly_weak || options.is_lazy) {
+ handled = false;
+ } else {
+ handled = true;
+ }
+ break;
+
+ default:
+ handled = false;
+ break;
+ }
+ if (!handled) generated_fallback_fields.push_back(field);
+ }
+
+ return generated_fallback_fields;
+}
+
+std::vector<uint8_t> GenerateFieldNames(
+ const Descriptor* descriptor,
+ const std::vector<const FieldDescriptor*>& fields) {
+ static constexpr int kMaxNameLength = 255;
+ std::vector<uint8_t> out;
+ // First, we output the size of each string, as an unsigned byte. The first
+ // string is the message name.
+ int count = 1;
+ out.push_back(std::min(static_cast<int>(descriptor->full_name().size()),
+ kMaxNameLength));
+ for (const auto* field : fields) {
+ out.push_back(field->name().size());
+ ++count;
+ }
+ while (count & 7) { // align to an 8-byte boundary
+ out.push_back(0);
+ ++count;
+ }
+ // The message name is stored at the beginning of the string
+ std::string message_name = descriptor->full_name();
+ if (message_name.size() > kMaxNameLength) {
+ static constexpr int kNameHalfLength = (kMaxNameLength - 3) / 2;
+ message_name = absl::StrCat(
+ message_name.substr(0, kNameHalfLength), "...",
+ message_name.substr(message_name.size() - kNameHalfLength));
+ }
+ out.insert(out.end(), message_name.begin(), message_name.end());
+ // Then we output the actual field names
+ for (const auto* field : fields) {
+ out.insert(out.end(), field->name().begin(), field->name().end());
+ }
+
+ return out;
+}
+
+TailCallTableInfo::NumToEntryTable MakeNumToEntryTable(
+ const std::vector<const FieldDescriptor*>& field_descriptors) {
+ TailCallTableInfo::NumToEntryTable num_to_entry_table;
+ num_to_entry_table.skipmap32 = static_cast<uint32_t>(-1);
+
+ // skip_entry_block is the current block of SkipEntries that we're
+ // appending to. cur_block_first_fnum is the number of the first
+ // field represented by the block.
+ uint16_t field_entry_index = 0;
+ uint16_t N = field_descriptors.size();
+ // First, handle field numbers 1-32, which affect only the initial
+ // skipmap32 and don't generate additional skip-entry blocks.
+ for (; field_entry_index != N; ++field_entry_index) {
+ auto* field_descriptor = field_descriptors[field_entry_index];
+ if (field_descriptor->number() > 32) break;
+ auto skipmap32_index = field_descriptor->number() - 1;
+ num_to_entry_table.skipmap32 -= 1 << skipmap32_index;
+ }
+ // If all the field numbers were less than or equal to 32, we will have
+ // no further entries to process, and we are already done.
+ if (field_entry_index == N) return num_to_entry_table;
+
+ TailCallTableInfo::SkipEntryBlock* block = nullptr;
+ bool start_new_block = true;
+ // To determine sparseness, track the field number corresponding to
+ // the start of the most recent skip entry.
+ uint32_t last_skip_entry_start = 0;
+ for (; field_entry_index != N; ++field_entry_index) {
+ auto* field_descriptor = field_descriptors[field_entry_index];
+ uint32_t fnum = static_cast<uint32_t>(field_descriptor->number());
+ GOOGLE_CHECK_GT(fnum, last_skip_entry_start);
+ if (start_new_block == false) {
+ // If the next field number is within 15 of the last_skip_entry_start, we
+ // continue writing just to that entry. If it's between 16 and 31 more,
+ // then we just extend the current block by one. If it's more than 31
+ // more, we have to add empty skip entries in order to continue using the
+ // existing block. Obviously it's just 32 more, it doesn't make sense to
+ // start a whole new block, since new blocks mean having to write out
+ // their starting field number, which is 32 bits, as well as the size of
+ // the additional block, which is 16... while an empty SkipEntry16 only
+ // costs 32 bits. So if it was 48 more, it's a slight space win; we save
+ // 16 bits, but probably at the cost of slower run time. We're choosing
+ // 96 for now.
+ if (fnum - last_skip_entry_start > 96) start_new_block = true;
+ }
+ if (start_new_block) {
+ num_to_entry_table.blocks.push_back({fnum});
+ block = &num_to_entry_table.blocks.back();
+ start_new_block = false;
+ }
+
+ auto skip_entry_num = (fnum - block->first_fnum) / 16;
+ auto skip_entry_index = (fnum - block->first_fnum) % 16;
+ while (skip_entry_num >= block->entries.size())
+ block->entries.push_back({0xFFFF, field_entry_index});
+ block->entries[skip_entry_num].skipmap -= 1 << (skip_entry_index);
+
+ last_skip_entry_start = fnum - skip_entry_index;
+ }
+ return num_to_entry_table;
+}
+
+uint16_t MakeTypeCardForField(
+ const FieldDescriptor* field,
+ const TailCallTableInfo::PerFieldOptions& options) {
+ uint16_t type_card;
+ namespace fl = internal::field_layout;
+ if (internal::cpp::HasHasbit(field)) {
+ type_card = fl::kFcOptional;
+ } else if (field->is_repeated()) {
+ type_card = fl::kFcRepeated;
+ } else if (field->real_containing_oneof()) {
+ type_card = fl::kFcOneof;
+ } else {
+ type_card = fl::kFcSingular;
+ }
+
+ // The rest of the type uses convenience aliases:
+ switch (field->type()) {
+ case FieldDescriptor::TYPE_DOUBLE:
+ type_card |= field->is_repeated() && field->is_packed()
+ ? fl::kPackedDouble
+ : fl::kDouble;
+ break;
+ case FieldDescriptor::TYPE_FLOAT:
+ type_card |= field->is_repeated() && field->is_packed() ? fl::kPackedFloat
+ : fl::kFloat;
+ break;
+ case FieldDescriptor::TYPE_FIXED32:
+ type_card |= field->is_repeated() && field->is_packed()
+ ? fl::kPackedFixed32
+ : fl::kFixed32;
+ break;
+ case FieldDescriptor::TYPE_SFIXED32:
+ type_card |= field->is_repeated() && field->is_packed()
+ ? fl::kPackedSFixed32
+ : fl::kSFixed32;
+ break;
+ case FieldDescriptor::TYPE_FIXED64:
+ type_card |= field->is_repeated() && field->is_packed()
+ ? fl::kPackedFixed64
+ : fl::kFixed64;
+ break;
+ case FieldDescriptor::TYPE_SFIXED64:
+ type_card |= field->is_repeated() && field->is_packed()
+ ? fl::kPackedSFixed64
+ : fl::kSFixed64;
+ break;
+ case FieldDescriptor::TYPE_BOOL:
+ type_card |= field->is_repeated() && field->is_packed() ? fl::kPackedBool
+ : fl::kBool;
+ break;
+ case FieldDescriptor::TYPE_ENUM:
+ if (internal::cpp::HasPreservingUnknownEnumSemantics(field)) {
+ // No validation is required.
+ type_card |= field->is_repeated() && field->is_packed()
+ ? fl::kPackedOpenEnum
+ : fl::kOpenEnum;
+ } else {
+ int16_t start;
+ uint16_t size;
+ if (GetEnumValidationRange(field->enum_type(), start, size)) {
+ // Validation is done by range check (start/length in FieldAux).
+ type_card |= field->is_repeated() && field->is_packed()
+ ? fl::kPackedEnumRange
+ : fl::kEnumRange;
+ } else {
+ // Validation uses the generated _IsValid function.
+ type_card |= field->is_repeated() && field->is_packed()
+ ? fl::kPackedEnum
+ : fl::kEnum;
+ }
+ }
+ break;
+ case FieldDescriptor::TYPE_UINT32:
+ type_card |= field->is_repeated() && field->is_packed()
+ ? fl::kPackedUInt32
+ : fl::kUInt32;
+ break;
+ case FieldDescriptor::TYPE_SINT32:
+ type_card |= field->is_repeated() && field->is_packed()
+ ? fl::kPackedSInt32
+ : fl::kSInt32;
+ break;
+ case FieldDescriptor::TYPE_INT32:
+ type_card |= field->is_repeated() && field->is_packed() ? fl::kPackedInt32
+ : fl::kInt32;
+ break;
+ case FieldDescriptor::TYPE_UINT64:
+ type_card |= field->is_repeated() && field->is_packed()
+ ? fl::kPackedUInt64
+ : fl::kUInt64;
+ break;
+ case FieldDescriptor::TYPE_SINT64:
+ type_card |= field->is_repeated() && field->is_packed()
+ ? fl::kPackedSInt64
+ : fl::kSInt64;
+ break;
+ case FieldDescriptor::TYPE_INT64:
+ type_card |= field->is_repeated() && field->is_packed() ? fl::kPackedInt64
+ : fl::kInt64;
+ break;
+
+ case FieldDescriptor::TYPE_BYTES:
+ type_card |= fl::kBytes;
+ break;
+ case FieldDescriptor::TYPE_STRING: {
+ switch (internal::cpp::GetUtf8CheckMode(field, options.is_lite)) {
+ case internal::cpp::Utf8CheckMode::kStrict:
+ type_card |= fl::kUtf8String;
+ break;
+ case internal::cpp::Utf8CheckMode::kVerify:
+ type_card |= fl::kRawString;
+ break;
+ case internal::cpp::Utf8CheckMode::kNone:
+ type_card |= fl::kBytes;
+ break;
+ }
+ break;
+ }
+
+ case FieldDescriptor::TYPE_GROUP:
+ type_card |= 0 | fl::kMessage | fl::kRepGroup;
+ if (options.use_direct_tcparser_table) {
+ type_card |= fl::kTvTable;
+ } else {
+ type_card |= fl::kTvDefault;
+ }
+ break;
+ case FieldDescriptor::TYPE_MESSAGE:
+ if (field->is_map()) {
+ type_card |= fl::kMap;
+ } else {
+ type_card |= fl::kMessage;
+ if (options.is_lazy) {
+ type_card |= fl::kRepLazy;
+ } else if (options.is_implicitly_weak) {
+ type_card |= fl::kRepIWeak;
+ }
+
+ if (options.use_direct_tcparser_table) {
+ type_card |= fl::kTvTable;
+ } else {
+ type_card |= fl::kTvDefault;
+ }
+ }
+ break;
+ }
+
+ // Fill in extra information about string and bytes field representations.
+ if (field->type() == FieldDescriptor::TYPE_BYTES ||
+ field->type() == FieldDescriptor::TYPE_STRING) {
+ if (field->is_repeated()) {
+ type_card |= fl::kRepSString;
+ } else {
+ type_card |= fl::kRepAString;
+ }
+ }
+
+ if (options.should_split) {
+ type_card |= fl::kSplitTrue;
+ }
+
+ return type_card;
+}
+
+} // namespace
+
+TailCallTableInfo::TailCallTableInfo(
+ const Descriptor* descriptor,
+ const std::vector<const FieldDescriptor*>& ordered_fields,
+ const OptionProvider& option_provider,
+ const std::vector<int>& has_bit_indices,
+ const std::vector<int>& inlined_string_indices) {
+ // If this message has any inlined string fields, store the donation state
+ // offset in the second auxiliary entry.
+ if (!inlined_string_indices.empty()) {
+ aux_entries.resize(1); // pad if necessary
+ aux_entries[0] = {kInlinedStringDonatedOffset};
+ }
+
+ // If this message is split, store the split pointer offset in the third
+ // auxiliary entry.
+ for (auto* field : ordered_fields) {
+ if (option_provider.GetForField(field).should_split) {
+ aux_entries.resize(3); // pad if necessary
+ aux_entries[1] = {kSplitOffset};
+ aux_entries[2] = {kSplitSizeof};
+ break;
+ }
+ }
+
+ // Fill in mini table entries.
+ for (const FieldDescriptor* field : ordered_fields) {
+ auto options = option_provider.GetForField(field);
+ field_entries.push_back(
+ {field, internal::cpp ::HasHasbit(field)
+ ? has_bit_indices[static_cast<size_t>(field->index())]
+ : -1});
+ auto& entry = field_entries.back();
+ entry.type_card = MakeTypeCardForField(field, options);
+
+ if (field->type() == FieldDescriptor::TYPE_MESSAGE ||
+ field->type() == FieldDescriptor::TYPE_GROUP) {
+ // Message-typed fields have a FieldAux with the default instance pointer.
+ if (field->is_map()) {
+ // TODO(b/205904770): generate aux entries for maps
+ } else if (field->options().weak()) {
+ // Don't generate anything for weak fields. They are handled by the
+ // generated fallback.
+ } else if (options.is_implicitly_weak) {
+ // Implicit weak fields don't need to store a default instance pointer.
+ } else if (options.is_lazy) {
+ // Lazy fields are handled by the generated fallback function.
+ } else {
+ field_entries.back().aux_idx = aux_entries.size();
+ aux_entries.push_back(
+ {options.use_direct_tcparser_table ? kSubTable : kSubMessage,
+ {field}});
+ }
+ } else if (field->type() == FieldDescriptor::TYPE_ENUM &&
+ !cpp::HasPreservingUnknownEnumSemantics(field)) {
+ // Enum fields which preserve unknown values (proto3 behavior) are
+ // effectively int32 fields with respect to parsing -- i.e., the value
+ // does not need to be validated at parse time.
+ //
+ // Enum fields which do not preserve unknown values (proto2 behavior) use
+ // a FieldAux to store validation information. If the enum values are
+ // sequential (and within a range we can represent), then the FieldAux
+ // entry represents the range using the minimum value (which must fit in
+ // an int16_t) and count (a uint16_t). Otherwise, the entry holds a
+ // pointer to the generated Name_IsValid function.
+
+ entry.aux_idx = aux_entries.size();
+ aux_entries.push_back({});
+ auto& aux_entry = aux_entries.back();
+
+ if (GetEnumValidationRange(field->enum_type(), aux_entry.enum_range.start,
+ aux_entry.enum_range.size)) {
+ aux_entry.type = kEnumRange;
+ } else {
+ aux_entry.type = kEnumValidator;
+ aux_entry.field = field;
+ }
+
+ } else if ((field->type() == FieldDescriptor::TYPE_STRING ||
+ field->type() == FieldDescriptor::TYPE_BYTES) &&
+ options.is_string_inlined) {
+ GOOGLE_CHECK(!field->is_repeated());
+ // Inlined strings have an extra marker to represent their donation state.
+ int idx = inlined_string_indices[static_cast<size_t>(field->index())];
+ // For mini parsing, the donation state index is stored as an `offset`
+ // auxiliary entry.
+ entry.aux_idx = aux_entries.size();
+ aux_entries.push_back({kNumericOffset});
+ aux_entries.back().offset = idx;
+ // For fast table parsing, the donation state index is stored instead of
+ // the aux_idx (this will limit the range to 8 bits).
+ entry.inlined_string_idx = idx;
+ }
+ }
+
+ table_size_log2 = 0; // fallback value
+ int num_fast_fields = -1;
+ auto end_group_tag = GetEndGroupTag(descriptor);
+ for (int try_size_log2 : {0, 1, 2, 3, 4, 5}) {
+ size_t try_size = 1 << try_size_log2;
+ auto split_fields = SplitFastFieldsForSize(end_group_tag, field_entries,
+ try_size_log2, option_provider);
+ GOOGLE_CHECK_EQ(split_fields.size(), try_size);
+ int try_num_fast_fields = 0;
+ for (const auto& info : split_fields) {
+ if (info.field != nullptr) ++try_num_fast_fields;
+ }
+ // Use this size if (and only if) it covers more fields.
+ if (try_num_fast_fields > num_fast_fields) {
+ fast_path_fields = std::move(split_fields);
+ table_size_log2 = try_size_log2;
+ num_fast_fields = try_num_fast_fields;
+ }
+ // The largest table we allow has the same number of entries as the
+ // message has fields, rounded up to the next power of 2 (e.g., a message
+ // with 5 fields can have a fast table of size 8). A larger table *might*
+ // cover more fields in certain cases, but a larger table in that case
+ // would have mostly empty entries; so, we cap the size to avoid
+ // pathologically sparse tables.
+ if (end_group_tag.has_value()) {
+ // If this message uses group encoding, the tables are sometimes very
+ // sparse because the fields in the group avoid using the same field
+ // numbering as the parent message (even though currently, the proto
+ // compiler allows the overlap, and there is no possible conflict.)
+ // As such, this test produces a false negative as far as whether the
+ // large table will be worth it. So we disable the test in this case.
+ } else {
+ if (try_size > ordered_fields.size()) {
+ break;
+ }
+ }
+ }
+
+ // Filter out fields that are handled by MiniParse. We don't need to generate
+ // a fallback for these, which saves code size.
+ fallback_fields = FilterMiniParsedFields(ordered_fields, option_provider
+ );
+
+ num_to_entry_table = MakeNumToEntryTable(ordered_fields);
+ field_name_data = GenerateFieldNames(descriptor, ordered_fields);
+
+ // If there are no fallback fields, and at most one extension range, the
+ // parser can use a generic fallback function. Otherwise, a message-specific
+ // fallback routine is needed.
+ use_generated_fallback =
+ !fallback_fields.empty() || descriptor->extension_range_count() > 1;
+}
+
+} // namespace internal
+} // namespace protobuf
+} // namespace google
+
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/generated_message_tctable_gen.h b/src/google/protobuf/generated_message_tctable_gen.h
new file mode 100644
index 0000000..b752a80
--- /dev/null
+++ b/src/google/protobuf/generated_message_tctable_gen.h
@@ -0,0 +1,206 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// This file contains routines to generate tail-call table parsing tables.
+// Everything in this file is for internal use only.
+
+#ifndef GOOGLE_PROTOBUF_GENERATED_MESSAGE_TCTABLE_GEN_H__
+#define GOOGLE_PROTOBUF_GENERATED_MESSAGE_TCTABLE_GEN_H__
+
+#include <cstdint>
+#include <functional>
+#include <string>
+#include <vector>
+
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/generated_message_tctable_decl.h"
+
+// Must come last:
+#include "google/protobuf/port_def.inc"
+
+namespace google {
+namespace protobuf {
+namespace internal {
+
+// Helper class for generating tailcall parsing functions.
+struct PROTOBUF_EXPORT TailCallTableInfo {
+ struct PerFieldOptions {
+ bool is_lazy;
+ bool is_string_inlined;
+ bool is_implicitly_weak;
+ bool use_direct_tcparser_table;
+ bool is_lite;
+ bool should_split;
+ };
+ class OptionProvider {
+ public:
+ virtual PerFieldOptions GetForField(const FieldDescriptor*) const = 0;
+
+ protected:
+ ~OptionProvider() = default;
+ };
+
+ TailCallTableInfo(const Descriptor* descriptor,
+ const std::vector<const FieldDescriptor*>& ordered_fields,
+ const OptionProvider& option_provider,
+ const std::vector<int>& has_bit_indices,
+ const std::vector<int>& inlined_string_indices);
+
+ // Fields parsed by the table fast-path.
+ struct FastFieldInfo {
+ std::string func_name;
+ const FieldDescriptor* field;
+ uint16_t coded_tag;
+ uint8_t hasbit_idx;
+ uint8_t aux_idx;
+ uint16_t nonfield_info;
+ };
+ std::vector<FastFieldInfo> fast_path_fields;
+
+ // Fields parsed by mini parsing routines.
+ struct FieldEntryInfo {
+ const FieldDescriptor* field;
+ int hasbit_idx;
+ int inlined_string_idx;
+ uint16_t aux_idx;
+ uint16_t type_card;
+ };
+ std::vector<FieldEntryInfo> field_entries;
+
+ enum AuxType {
+ kNothing = 0,
+ kInlinedStringDonatedOffset,
+ kSplitOffset,
+ kSplitSizeof,
+ kSubMessage,
+ kSubTable,
+ kEnumRange,
+ kEnumValidator,
+ kNumericOffset,
+ };
+ struct AuxEntry {
+ AuxType type;
+ struct EnumRange {
+ int16_t start;
+ uint16_t size;
+ };
+ union {
+ const FieldDescriptor* field;
+ uint32_t offset;
+ EnumRange enum_range;
+ };
+ };
+ std::vector<AuxEntry> aux_entries;
+
+ // Fields parsed by generated fallback function.
+ std::vector<const FieldDescriptor*> fallback_fields;
+
+ struct SkipEntry16 {
+ uint16_t skipmap;
+ uint16_t field_entry_offset;
+ };
+ struct SkipEntryBlock {
+ uint32_t first_fnum;
+ std::vector<SkipEntry16> entries;
+ };
+ struct NumToEntryTable {
+ uint32_t skipmap32; // for fields #1 - #32
+ std::vector<SkipEntryBlock> blocks;
+ // Compute the number of uint16_t required to represent this table.
+ int size16() const {
+ int size = 2; // for the termination field#
+ for (const auto& block : blocks) {
+ // 2 for the field#, 1 for a count of skip entries, 2 for each entry.
+ size += static_cast<int>(3 + block.entries.size() * 2);
+ }
+ return size;
+ }
+ };
+ NumToEntryTable num_to_entry_table;
+
+ std::vector<uint8_t> field_name_data;
+
+ // Table size.
+ int table_size_log2;
+ // True if a generated fallback function is required instead of generic.
+ bool use_generated_fallback;
+};
+
+// A quick check to see if a field can be placed into the fast-table.
+// This is meant to be fast but not exhaustive; options that apply to some
+// fields may also exclude them.
+inline bool IsDescriptorEligibleForFastParsing(const FieldDescriptor* field) {
+ // Map, oneof, weak, and lazy fields are not handled on the fast path.
+ if (field->is_map()) return false;
+ if (field->real_containing_oneof()) return false;
+ if (field->options().weak()) return false;
+
+ switch (field->type()) {
+ case FieldDescriptor::TYPE_ENUM:
+ // If enum values are not validated at parse time, then this field can be
+ // handled on the fast path like an int32.
+ if (cpp::HasPreservingUnknownEnumSemantics(field)) {
+ break;
+ }
+ if (field->is_repeated() && field->is_packed()) {
+ return false;
+ }
+ break;
+
+ // Some bytes fields can be handled on fast path.
+ case FieldDescriptor::TYPE_STRING:
+ case FieldDescriptor::TYPE_BYTES:
+ if (field->options().ctype() != FieldOptions::STRING) {
+ return false;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ // The largest tag that can be read by the tailcall parser is two bytes
+ // when varint-coded. This allows 14 bits for the numeric tag value:
+ // byte 0 byte 1
+ // 1nnnnttt 0nnnnnnn
+ // ^^^^^^^ ^^^^^^^
+ if (field->number() >= 1 << 11) return false;
+
+ return true;
+}
+
+} // namespace internal
+} // namespace protobuf
+} // namespace google
+
+#include "google/protobuf/port_undef.inc"
+
+#endif // GOOGLE_PROTOBUF_GENERATED_MESSAGE_TCTABLE_GEN_H__
diff --git a/src/google/protobuf/generated_message_tctable_impl.h b/src/google/protobuf/generated_message_tctable_impl.h
index 21fa533..7f51966 100644
--- a/src/google/protobuf/generated_message_tctable_impl.h
+++ b/src/google/protobuf/generated_message_tctable_impl.h
@@ -32,18 +32,20 @@
#define GOOGLE_PROTOBUF_GENERATED_MESSAGE_TCTABLE_IMPL_H__
#include <cstdint>
+#include <cstdlib>
+#include <string>
#include <type_traits>
+#include <utility>
-#include <google/protobuf/port.h>
-#include <google/protobuf/extension_set.h>
-#include <google/protobuf/generated_message_tctable_decl.h>
-#include <google/protobuf/message_lite.h>
-#include <google/protobuf/metadata_lite.h>
-#include <google/protobuf/parse_context.h>
-#include <google/protobuf/wire_format_lite.h>
+#include "google/protobuf/port.h"
+#include "google/protobuf/extension_set.h"
+#include "google/protobuf/generated_message_tctable_decl.h"
+#include "google/protobuf/metadata_lite.h"
+#include "google/protobuf/parse_context.h"
+#include "google/protobuf/wire_format_lite.h"
// Must come last:
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -53,6 +55,12 @@
namespace internal {
+enum {
+ kInlinedStringAuxIdx = 0,
+ kSplitOffsetAuxIdx = 1,
+ kSplitSizeAuxIdx = 2,
+};
+
// Field layout enums.
//
// Structural information about fields is packed into a 16-bit value. The enum
@@ -64,10 +72,11 @@
// |15 .. 8|7 .. 0|
// +-----------------------+-----------------------+
// : . : . : . : . : . : . : 3|========| [3] FieldType
-// : : : : : : 5|=====| : : [2] FieldCardinality
-// : . : . : . : . 8|========| : . : . : [3] FieldRep
-// : : : 10|=====| : : : : [2] TransformValidation
-// : . : .12|=====| . : . : . : . : . : [2] FormatDiscriminator
+// : : : : : : . 4|==| : : [1] FieldSplit
+// : : : : : 6|=====| . : : [2] FieldCardinality
+// : . : . : . : 9|========| . : . : . : [3] FieldRep
+// : : :11|=====| : : : : : [2] TransformValidation
+// : . :13|=====| : . : . : . : . : . : [2] FormatDiscriminator
// +-----------------------+-----------------------+
// |15 .. 8|7 .. 0|
// +-----------------------+-----------------------+
@@ -95,11 +104,21 @@
static_assert(kFkMap < (1 << kFkBits), "too many types");
+// Split (1 bit):
+enum FieldSplit : uint16_t {
+ kSplitShift = kFkShift+ kFkBits,
+ kSplitBits = 1,
+ kSplitMask = ((1 << kSplitBits) - 1) << kSplitShift,
+
+ kSplitFalse = 0,
+ kSplitTrue = 1 << kSplitShift,
+};
+
// Cardinality (2 bits):
// These values determine how many values a field can have and its presence.
// Packed fields are represented in FieldType.
enum Cardinality : uint16_t {
- kFcShift = kFkShift + kFkBits,
+ kFcShift = kSplitShift+ kSplitBits,
kFcBits = 2,
kFcMask = ((1 << kFcBits) - 1) << kFcShift,
@@ -147,6 +166,10 @@
// String fields:
kTvUtf8Debug = 1 << kTvShift, // proto2
kTvUtf8 = 2 << kTvShift, // proto3
+
+ // Message fields:
+ kTvDefault = 1 << kTvShift, // Aux has default_instance
+ kTvTable = 2 << kTvShift, // Aux has TcParseTableBase*
};
static_assert((kTvEnum & kTvRange) != 0,
@@ -175,7 +198,7 @@
};
// Update this assertion (and comments above) when adding or removing bits:
-static_assert(kFmtShift + kFmtBits == 12, "number of bits changed");
+static_assert(kFmtShift + kFmtBits == 13, "number of bits changed");
// This assertion should not change unless the storage width changes:
static_assert(kFmtShift + kFmtBits <= 16, "too many bits");
@@ -183,48 +206,48 @@
// Convenience aliases (16 bits, with format):
enum FieldType : uint16_t {
// Numeric types:
- kBool = kFkVarint | kRep8Bits,
+ kBool = 0 | kFkVarint | kRep8Bits,
- kFixed32 = kFkFixed | kRep32Bits | kFmtUnsigned,
- kUInt32 = kFkVarint | kRep32Bits | kFmtUnsigned,
- kSFixed32 = kFkFixed | kRep32Bits | kFmtSigned,
- kInt32 = kFkVarint | kRep32Bits | kFmtSigned,
- kSInt32 = kFkVarint | kRep32Bits | kFmtSigned | kTvZigZag,
- kFloat = kFkFixed | kRep32Bits | kFmtFloating,
- kEnum = kFkVarint | kRep32Bits | kFmtEnum | kTvEnum,
- kEnumRange = kFkVarint | kRep32Bits | kFmtEnum | kTvRange,
- kOpenEnum = kFkVarint | kRep32Bits | kFmtEnum,
+ kFixed32 = 0 | kFkFixed | kRep32Bits | kFmtUnsigned,
+ kUInt32 = 0 | kFkVarint | kRep32Bits | kFmtUnsigned,
+ kSFixed32 = 0 | kFkFixed | kRep32Bits | kFmtSigned,
+ kInt32 = 0 | kFkVarint | kRep32Bits | kFmtSigned,
+ kSInt32 = 0 | kFkVarint | kRep32Bits | kFmtSigned | kTvZigZag,
+ kFloat = 0 | kFkFixed | kRep32Bits | kFmtFloating,
+ kEnum = 0 | kFkVarint | kRep32Bits | kFmtEnum | kTvEnum,
+ kEnumRange = 0 | kFkVarint | kRep32Bits | kFmtEnum | kTvRange,
+ kOpenEnum = 0 | kFkVarint | kRep32Bits | kFmtEnum,
- kFixed64 = kFkFixed | kRep64Bits | kFmtUnsigned,
- kUInt64 = kFkVarint | kRep64Bits | kFmtUnsigned,
- kSFixed64 = kFkFixed | kRep64Bits | kFmtSigned,
- kInt64 = kFkVarint | kRep64Bits | kFmtSigned,
- kSInt64 = kFkVarint | kRep64Bits | kFmtSigned | kTvZigZag,
- kDouble = kFkFixed | kRep64Bits | kFmtFloating,
+ kFixed64 = 0 | kFkFixed | kRep64Bits | kFmtUnsigned,
+ kUInt64 = 0 | kFkVarint | kRep64Bits | kFmtUnsigned,
+ kSFixed64 = 0 | kFkFixed | kRep64Bits | kFmtSigned,
+ kInt64 = 0 | kFkVarint | kRep64Bits | kFmtSigned,
+ kSInt64 = 0 | kFkVarint | kRep64Bits | kFmtSigned | kTvZigZag,
+ kDouble = 0 | kFkFixed | kRep64Bits | kFmtFloating,
- kPackedBool = kFkPackedVarint | kRep8Bits,
+ kPackedBool = 0 | kFkPackedVarint | kRep8Bits,
- kPackedFixed32 = kFkPackedFixed | kRep32Bits | kFmtUnsigned,
- kPackedUInt32 = kFkPackedVarint | kRep32Bits | kFmtUnsigned,
- kPackedSFixed32 = kFkPackedFixed | kRep32Bits | kFmtSigned,
- kPackedInt32 = kFkPackedVarint | kRep32Bits | kFmtSigned,
- kPackedSInt32 = kFkPackedVarint | kRep32Bits | kFmtSigned | kTvZigZag,
- kPackedFloat = kFkPackedFixed | kRep32Bits | kFmtFloating,
- kPackedEnum = kFkPackedVarint | kRep32Bits | kFmtEnum | kTvEnum,
- kPackedEnumRange = kFkPackedVarint | kRep32Bits | kFmtEnum | kTvRange,
- kPackedOpenEnum = kFkPackedVarint | kRep32Bits | kFmtEnum,
+ kPackedFixed32 = 0 | kFkPackedFixed | kRep32Bits | kFmtUnsigned,
+ kPackedUInt32 = 0 | kFkPackedVarint | kRep32Bits | kFmtUnsigned,
+ kPackedSFixed32 = 0 | kFkPackedFixed | kRep32Bits | kFmtSigned,
+ kPackedInt32 = 0 | kFkPackedVarint | kRep32Bits | kFmtSigned,
+ kPackedSInt32 = 0 | kFkPackedVarint | kRep32Bits | kFmtSigned | kTvZigZag,
+ kPackedFloat = 0 | kFkPackedFixed | kRep32Bits | kFmtFloating,
+ kPackedEnum = 0 | kFkPackedVarint | kRep32Bits | kFmtEnum | kTvEnum,
+ kPackedEnumRange = 0 | kFkPackedVarint | kRep32Bits | kFmtEnum | kTvRange,
+ kPackedOpenEnum = 0 | kFkPackedVarint | kRep32Bits | kFmtEnum,
- kPackedFixed64 = kFkPackedFixed | kRep64Bits | kFmtUnsigned,
- kPackedUInt64 = kFkPackedVarint | kRep64Bits | kFmtUnsigned,
- kPackedSFixed64 = kFkPackedFixed | kRep64Bits | kFmtSigned,
- kPackedInt64 = kFkPackedVarint | kRep64Bits | kFmtSigned,
- kPackedSInt64 = kFkPackedVarint | kRep64Bits | kFmtSigned | kTvZigZag,
- kPackedDouble = kFkPackedFixed | kRep64Bits | kFmtFloating,
+ kPackedFixed64 = 0 | kFkPackedFixed | kRep64Bits | kFmtUnsigned,
+ kPackedUInt64 = 0 | kFkPackedVarint | kRep64Bits | kFmtUnsigned,
+ kPackedSFixed64 = 0 | kFkPackedFixed | kRep64Bits | kFmtSigned,
+ kPackedInt64 = 0 | kFkPackedVarint | kRep64Bits | kFmtSigned,
+ kPackedSInt64 = 0 | kFkPackedVarint | kRep64Bits | kFmtSigned | kTvZigZag,
+ kPackedDouble = 0 | kFkPackedFixed | kRep64Bits | kFmtFloating,
// String types:
- kBytes = kFkString | kFmtArray,
- kRawString = kFkString | kFmtUtf8 | kTvUtf8Debug,
- kUtf8String = kFkString | kFmtUtf8 | kTvUtf8,
+ kBytes = 0 | kFkString | kFmtArray,
+ kRawString = 0 | kFkString | kFmtUtf8 | kTvUtf8Debug,
+ kUtf8String = 0 | kFkString | kFmtUtf8 | kTvUtf8,
// Message types:
kMessage = kFkMessage,
@@ -232,27 +255,16 @@
// Map types:
kMap = kFkMap,
};
-
// clang-format on
} // namespace field_layout
-// PROTOBUF_TC_PARAM_DECL are the parameters for tailcall functions, it is
-// defined in port_def.inc.
-//
-// Note that this is performance sensitive: changing the parameters will change
-// the registers used by the ABI calling convention, which subsequently affects
-// register selection logic inside the function.
-
-// PROTOBUF_TC_PARAM_PASS passes values to match PROTOBUF_TC_PARAM_DECL.
-#define PROTOBUF_TC_PARAM_PASS msg, ptr, ctx, table, hasbits, data
-
#ifndef NDEBUG
template <size_t align>
-#ifndef _MSC_VER
-[[noreturn]]
-#endif
void AlignFail(uintptr_t address) {
GOOGLE_LOG(FATAL) << "Unaligned (" << align << ") access at " << address;
+
+ // Explicit abort to let compilers know this function does not return
+ abort();
}
extern template void AlignFail<4>(uintptr_t);
@@ -262,8 +274,15 @@
// TcParser implements most of the parsing logic for tailcall tables.
class PROTOBUF_EXPORT TcParser final {
public:
+ template <typename T>
+ static constexpr const TcParseTableBase* GetTable() {
+ return &T::_table_.header;
+ }
+
static const char* GenericFallback(PROTOBUF_TC_PARAM_DECL);
static const char* GenericFallbackLite(PROTOBUF_TC_PARAM_DECL);
+ static const char* ReflectionFallback(PROTOBUF_TC_PARAM_DECL);
+ static const char* ReflectionParseLoop(PROTOBUF_TC_PARAM_DECL);
static const char* ParseLoop(MessageLite* msg, const char* ptr,
ParseContext* ctx,
@@ -323,6 +342,33 @@
static const char* FastZ64P1(PROTOBUF_TC_PARAM_DECL);
static const char* FastZ64P2(PROTOBUF_TC_PARAM_DECL);
+ // Manually unrolled and specialized Varint parsing.
+ template <typename FieldType, int data_offset, int hasbit_idx>
+ static const char* SpecializedUnrolledVImpl1(PROTOBUF_TC_PARAM_DECL);
+ template <int data_offset, int hasbit_idx>
+ static const char* SpecializedFastV8S1(PROTOBUF_TC_PARAM_DECL);
+
+ template <typename FieldType, int data_offset, int hasbit_idx>
+ static constexpr TailCallParseFunc SingularVarintNoZag1() {
+ if (data_offset < 100) {
+ if (sizeof(FieldType) == 1) {
+ return &SpecializedFastV8S1<data_offset, hasbit_idx>;
+ }
+ return &SpecializedUnrolledVImpl1<FieldType, data_offset, hasbit_idx>;
+ } else if (sizeof(FieldType) == 1) {
+ return &FastV8S1;
+ } else if (sizeof(FieldType) == 4) {
+ return &FastV32S1;
+ } else if (sizeof(FieldType) == 8) {
+ return &FastV64S1;
+ } else {
+ static_assert(sizeof(FieldType) == 1 || sizeof(FieldType) == 4 ||
+ sizeof(FieldType) == 8,
+ "");
+ return nullptr;
+ }
+ }
+
// Functions referenced by generated fast tables (closed enum):
// E: closed enum (N.B.: open enums use V32, above)
// r: enum range v: enum validator (_IsValid function)
@@ -337,6 +383,15 @@
static const char* FastEvR1(PROTOBUF_TC_PARAM_DECL);
static const char* FastEvR2(PROTOBUF_TC_PARAM_DECL);
+ static const char* FastEr0S1(PROTOBUF_TC_PARAM_DECL);
+ static const char* FastEr0S2(PROTOBUF_TC_PARAM_DECL);
+ static const char* FastEr0R1(PROTOBUF_TC_PARAM_DECL);
+ static const char* FastEr0R2(PROTOBUF_TC_PARAM_DECL);
+ static const char* FastEr1S1(PROTOBUF_TC_PARAM_DECL);
+ static const char* FastEr1S2(PROTOBUF_TC_PARAM_DECL);
+ static const char* FastEr1R1(PROTOBUF_TC_PARAM_DECL);
+ static const char* FastEr1R2(PROTOBUF_TC_PARAM_DECL);
+
// Functions referenced by generated fast tables (string types):
// B: bytes S: string U: UTF-8 string
// (empty): ArenaStringPtr i: InlinedString
@@ -364,16 +419,26 @@
// Functions referenced by generated fast tables (message types):
// M: message G: group
+ // d: default* t: TcParseTable* (the contents of aux)
// S: singular R: repeated
// 1/2: tag length (bytes)
- static const char* FastMS1(PROTOBUF_TC_PARAM_DECL);
- static const char* FastMS2(PROTOBUF_TC_PARAM_DECL);
- static const char* FastMR1(PROTOBUF_TC_PARAM_DECL);
- static const char* FastMR2(PROTOBUF_TC_PARAM_DECL);
- static const char* FastGS1(PROTOBUF_TC_PARAM_DECL);
- static const char* FastGS2(PROTOBUF_TC_PARAM_DECL);
- static const char* FastGR1(PROTOBUF_TC_PARAM_DECL);
- static const char* FastGR2(PROTOBUF_TC_PARAM_DECL);
+ static const char* FastMdS1(PROTOBUF_TC_PARAM_DECL);
+ static const char* FastMdS2(PROTOBUF_TC_PARAM_DECL);
+ static const char* FastGdS1(PROTOBUF_TC_PARAM_DECL);
+ static const char* FastGdS2(PROTOBUF_TC_PARAM_DECL);
+ static const char* FastMtS1(PROTOBUF_TC_PARAM_DECL);
+ static const char* FastMtS2(PROTOBUF_TC_PARAM_DECL);
+ static const char* FastGtS1(PROTOBUF_TC_PARAM_DECL);
+ static const char* FastGtS2(PROTOBUF_TC_PARAM_DECL);
+
+ static const char* FastMdR1(PROTOBUF_TC_PARAM_DECL);
+ static const char* FastMdR2(PROTOBUF_TC_PARAM_DECL);
+ static const char* FastGdR1(PROTOBUF_TC_PARAM_DECL);
+ static const char* FastGdR2(PROTOBUF_TC_PARAM_DECL);
+ static const char* FastMtR1(PROTOBUF_TC_PARAM_DECL);
+ static const char* FastMtR2(PROTOBUF_TC_PARAM_DECL);
+ static const char* FastGtR1(PROTOBUF_TC_PARAM_DECL);
+ static const char* FastGtR2(PROTOBUF_TC_PARAM_DECL);
template <typename T>
static inline T& RefAt(void* x, size_t offset) {
@@ -418,21 +483,30 @@
// parsing.
static const char* MiniParse(PROTOBUF_TC_PARAM_DECL);
+ static const char* FastEndG1(PROTOBUF_TC_PARAM_DECL);
+ static const char* FastEndG2(PROTOBUF_TC_PARAM_DECL);
+
private:
friend class GeneratedTcTableLiteTest;
+ static void* MaybeGetSplitBase(MessageLite* msg, const bool is_split,
+ const TcParseTableBase* table,
+ google::protobuf::internal::ParseContext* ctx);
- template <typename TagType, bool group_coding>
+ template <typename TagType, bool group_coding, bool aux_is_table>
static inline const char* SingularParseMessageAuxImpl(PROTOBUF_TC_PARAM_DECL);
- template <typename TagType, bool group_coding>
+ template <typename TagType, bool group_coding, bool aux_is_table>
static inline const char* RepeatedParseMessageAuxImpl(PROTOBUF_TC_PARAM_DECL);
+ template <typename TagType>
+ static const char* FastEndGroupImpl(PROTOBUF_TC_PARAM_DECL);
+
static inline PROTOBUF_ALWAYS_INLINE void SyncHasbits(
MessageLite* msg, uint64_t hasbits, const TcParseTableBase* table) {
const uint32_t has_bits_offset = table->has_bits_offset;
if (has_bits_offset) {
// Only the first 32 has-bits are updated. Nothing above those is stored,
// but e.g. messages without has-bits update the upper bits.
- RefAt<uint32_t>(msg, has_bits_offset) = static_cast<uint32_t>(hasbits);
+ RefAt<uint32_t>(msg, has_bits_offset) |= static_cast<uint32_t>(hasbits);
}
}
@@ -497,8 +571,12 @@
// Implementations for fast enum field parsing functions:
template <typename TagType, uint16_t xform_val>
static inline const char* SingularEnum(PROTOBUF_TC_PARAM_DECL);
+ template <typename TagType, uint8_t min>
+ static inline const char* SingularEnumSmallRange(PROTOBUF_TC_PARAM_DECL);
template <typename TagType, uint16_t xform_val>
static inline const char* RepeatedEnum(PROTOBUF_TC_PARAM_DECL);
+ template <typename TagType, uint8_t min>
+ static inline const char* RepeatedEnumSmallRange(PROTOBUF_TC_PARAM_DECL);
// Implementations for fast string field parsing functions:
enum Utf8Type { kNoUtf8 = 0, kUtf8 = 1, kUtf8ValidateOnly = 2 };
@@ -507,11 +585,15 @@
template <typename TagType, Utf8Type utf8>
static inline const char* RepeatedString(PROTOBUF_TC_PARAM_DECL);
+ static inline const char* ParseRepeatedStringOnce(
+ const char* ptr, Arena* arena, SerialArena* serial_arena,
+ ParseContext* ctx, RepeatedPtrField<std::string>& field);
+
// Mini field lookup:
static const TcParseTableBase::FieldEntry* FindFieldEntry(
const TcParseTableBase* table, uint32_t field_num);
- static StringPiece MessageName(const TcParseTableBase* table);
- static StringPiece FieldName(const TcParseTableBase* table,
+ static absl::string_view MessageName(const TcParseTableBase* table);
+ static absl::string_view FieldName(const TcParseTableBase* table,
const TcParseTableBase::FieldEntry*);
static bool ChangeOneof(const TcParseTableBase* table,
const TcParseTableBase::FieldEntry& entry,
@@ -521,7 +603,7 @@
// UTF-8 validation:
static void ReportFastUtf8Error(uint32_t decoded_tag,
const TcParseTableBase* table);
- static bool MpVerifyUtf8(StringPiece wire_bytes,
+ static bool MpVerifyUtf8(absl::string_view wire_bytes,
const TcParseTableBase* table,
const TcParseTableBase::FieldEntry& entry,
uint16_t xform_val);
@@ -531,23 +613,205 @@
static constexpr const uint32_t kMtSmallScanSize = 4;
// Mini parsing:
+ template <bool is_split>
static const char* MpVarint(PROTOBUF_TC_PARAM_DECL);
static const char* MpRepeatedVarint(PROTOBUF_TC_PARAM_DECL);
static const char* MpPackedVarint(PROTOBUF_TC_PARAM_DECL);
+ template <bool is_split>
static const char* MpFixed(PROTOBUF_TC_PARAM_DECL);
static const char* MpRepeatedFixed(PROTOBUF_TC_PARAM_DECL);
static const char* MpPackedFixed(PROTOBUF_TC_PARAM_DECL);
+ template <bool is_split>
static const char* MpString(PROTOBUF_TC_PARAM_DECL);
static const char* MpRepeatedString(PROTOBUF_TC_PARAM_DECL);
+ template <bool is_split>
static const char* MpMessage(PROTOBUF_TC_PARAM_DECL);
static const char* MpRepeatedMessage(PROTOBUF_TC_PARAM_DECL);
static const char* MpMap(PROTOBUF_TC_PARAM_DECL);
};
+// Notes:
+// 1) if data_offset is negative, it's read from data.offset()
+// 2) if hasbit_idx is negative, it's read from data.hasbit_idx()
+template <int data_offset, int hasbit_idx>
+const char* TcParser::SpecializedFastV8S1(PROTOBUF_TC_PARAM_DECL) {
+ using TagType = uint8_t;
+
+ // Special case for a varint bool field with a tag of 1 byte:
+ // The coded_tag() field will actually contain the value too and we can check
+ // both at the same time.
+ auto coded_tag = data.coded_tag<uint16_t>();
+ if (PROTOBUF_PREDICT_TRUE(coded_tag == 0x0000 || coded_tag == 0x0100)) {
+ auto& field =
+ RefAt<bool>(msg, data_offset >= 0 ? data_offset : data.offset());
+ // Note: we use `data.data` because Clang generates suboptimal code when
+ // using coded_tag.
+ // In x86_64 this uses the CH register to read the second byte out of
+ // `data`.
+ uint8_t value = data.data >> 8;
+ // The assume allows using a mov instead of test+setne.
+ PROTOBUF_ASSUME(value <= 1);
+ field = static_cast<bool>(value);
+
+ ptr += sizeof(TagType) + 1; // Consume the tag and the value.
+ if (hasbit_idx < 0) {
+ hasbits |= (uint64_t{1} << data.hasbit_idx());
+ } else {
+ if (hasbit_idx < 32) {
+ hasbits |= (uint64_t{1} << hasbit_idx);
+ } else {
+ static_assert(hasbit_idx == 63 || (hasbit_idx < 32),
+ "hard-coded hasbit_idx should be 0-31, or the special"
+ "value 63, which indicates the field has no has-bit.");
+ // TODO(jorg): investigate whether higher hasbit indices are worth
+ // supporting. Something like:
+ // auto& hasblock = TcParser::RefAt<uint32_t>(msg, hasbit_idx / 32 * 4);
+ // hasblock |= uint32_t{1} << (hasbit_idx % 32);
+ }
+ }
+
+ PROTOBUF_MUSTTAIL return ToTagDispatch(PROTOBUF_TC_PARAM_PASS);
+ }
+
+ // If it didn't match above either the tag is wrong, or the value is encoded
+ // non-canonically.
+ // Jump to MiniParse as wrong tag is the most probable reason.
+ PROTOBUF_MUSTTAIL return MiniParse(PROTOBUF_TC_PARAM_PASS);
+}
+
+template <typename FieldType, int data_offset, int hasbit_idx>
+const char* TcParser::SpecializedUnrolledVImpl1(PROTOBUF_TC_PARAM_DECL) {
+ using TagType = uint8_t;
+ // super-early success test...
+ if (PROTOBUF_PREDICT_TRUE(((data.data) & 0x80FF) == 0)) {
+ ptr += sizeof(TagType); // Consume tag
+ if (hasbit_idx < 32) {
+ hasbits |= (uint64_t{1} << hasbit_idx);
+ }
+ uint8_t value = data.data >> 8;
+ RefAt<FieldType>(msg, data_offset) = value;
+ ptr += 1;
+ PROTOBUF_MUSTTAIL return ToTagDispatch(PROTOBUF_TC_PARAM_PASS);
+ }
+ if (PROTOBUF_PREDICT_FALSE(data.coded_tag<TagType>() != 0)) {
+ PROTOBUF_MUSTTAIL return MiniParse(PROTOBUF_TC_PARAM_PASS);
+ }
+ ptr += sizeof(TagType); // Consume tag
+ if (hasbit_idx < 32) {
+ hasbits |= (uint64_t{1} << hasbit_idx);
+ }
+
+ // Few registers
+ auto* out = &RefAt<FieldType>(msg, data_offset);
+ uint64_t res = 0xFF & (data.data >> 8);
+ /* if (PROTOBUF_PREDICT_FALSE(res & 0x80)) */ {
+ res = RotRight7AndReplaceLowByte(res, ptr[1]);
+ if (PROTOBUF_PREDICT_FALSE(res & 0x80)) {
+ res = RotRight7AndReplaceLowByte(res, ptr[2]);
+ if (PROTOBUF_PREDICT_FALSE(res & 0x80)) {
+ res = RotRight7AndReplaceLowByte(res, ptr[3]);
+ if (PROTOBUF_PREDICT_FALSE(res & 0x80)) {
+ res = RotRight7AndReplaceLowByte(res, ptr[4]);
+ if (PROTOBUF_PREDICT_FALSE(res & 0x80)) {
+ res = RotRight7AndReplaceLowByte(res, ptr[5]);
+ if (PROTOBUF_PREDICT_FALSE(res & 0x80)) {
+ res = RotRight7AndReplaceLowByte(res, ptr[6]);
+ if (PROTOBUF_PREDICT_FALSE(res & 0x80)) {
+ res = RotRight7AndReplaceLowByte(res, ptr[7]);
+ if (PROTOBUF_PREDICT_FALSE(res & 0x80)) {
+ res = RotRight7AndReplaceLowByte(res, ptr[8]);
+ if (PROTOBUF_PREDICT_FALSE(res & 0x80)) {
+ if (ptr[9] & 0xFE) return nullptr;
+ res = RotateLeft(res, -7) & ~1;
+ res += ptr[9] & 1;
+ *out = RotateLeft(res, 63);
+ ptr += 10;
+ PROTOBUF_MUSTTAIL return ToTagDispatch(PROTOBUF_TC_PARAM_PASS);
+ }
+ *out = RotateLeft(res, 56);
+ ptr += 9;
+ PROTOBUF_MUSTTAIL return ToTagDispatch(PROTOBUF_TC_PARAM_PASS);
+ }
+ *out = RotateLeft(res, 49);
+ ptr += 8;
+ PROTOBUF_MUSTTAIL return ToTagDispatch(PROTOBUF_TC_PARAM_PASS);
+ }
+ *out = RotateLeft(res, 42);
+ ptr += 7;
+ PROTOBUF_MUSTTAIL return ToTagDispatch(PROTOBUF_TC_PARAM_PASS);
+ }
+ *out = RotateLeft(res, 35);
+ ptr += 6;
+ PROTOBUF_MUSTTAIL return ToTagDispatch(PROTOBUF_TC_PARAM_PASS);
+ }
+ *out = RotateLeft(res, 28);
+ ptr += 5;
+ PROTOBUF_MUSTTAIL return ToTagDispatch(PROTOBUF_TC_PARAM_PASS);
+ }
+ *out = RotateLeft(res, 21);
+ ptr += 4;
+ PROTOBUF_MUSTTAIL return ToTagDispatch(PROTOBUF_TC_PARAM_PASS);
+ }
+ *out = RotateLeft(res, 14);
+ ptr += 3;
+ PROTOBUF_MUSTTAIL return ToTagDispatch(PROTOBUF_TC_PARAM_PASS);
+ }
+ *out = RotateLeft(res, 7);
+ ptr += 2;
+ PROTOBUF_MUSTTAIL return ToTagDispatch(PROTOBUF_TC_PARAM_PASS);
+ }
+ *out = res;
+ ptr += 1;
+ PROTOBUF_MUSTTAIL return ToTagDispatch(PROTOBUF_TC_PARAM_PASS);
+}
+
+// Dispatch to the designated parse function
+inline PROTOBUF_ALWAYS_INLINE const char* TcParser::TagDispatch(
+ PROTOBUF_TC_PARAM_DECL) {
+ const auto coded_tag = UnalignedLoad<uint16_t>(ptr);
+ const size_t idx = coded_tag & table->fast_idx_mask;
+ PROTOBUF_ASSUME((idx & 7) == 0);
+ auto* fast_entry = table->fast_entry(idx >> 3);
+ data = fast_entry->bits;
+ data.data ^= coded_tag;
+ PROTOBUF_MUSTTAIL return fast_entry->target()(PROTOBUF_TC_PARAM_PASS);
+}
+
+// We can only safely call from field to next field if the call is optimized
+// to a proper tail call. Otherwise we blow through stack. Clang and gcc
+// reliably do this optimization in opt mode, but do not perform this in debug
+// mode. Luckily the structure of the algorithm is such that it's always
+// possible to just return and use the enclosing parse loop as a trampoline.
+inline PROTOBUF_ALWAYS_INLINE const char* TcParser::ToTagDispatch(
+ PROTOBUF_TC_PARAM_DECL) {
+ constexpr bool always_return = !PROTOBUF_TAILCALL;
+ if (always_return || !ctx->DataAvailable(ptr)) {
+ PROTOBUF_MUSTTAIL return ToParseLoop(PROTOBUF_TC_PARAM_PASS);
+ }
+ PROTOBUF_MUSTTAIL return TagDispatch(PROTOBUF_TC_PARAM_PASS);
+}
+
+inline PROTOBUF_ALWAYS_INLINE const char* TcParser::ToParseLoop(
+ PROTOBUF_TC_PARAM_DECL) {
+ (void)data;
+ (void)ctx;
+ SyncHasbits(msg, hasbits, table);
+ return ptr;
+}
+
+inline PROTOBUF_ALWAYS_INLINE const char* TcParser::Error(
+ PROTOBUF_TC_PARAM_DECL) {
+ (void)data;
+ (void)ctx;
+ (void)ptr;
+ SyncHasbits(msg, hasbits, table);
+ return nullptr;
+}
+
} // namespace internal
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_GENERATED_MESSAGE_TCTABLE_IMPL_H__
diff --git a/src/google/protobuf/generated_message_tctable_lite.cc b/src/google/protobuf/generated_message_tctable_lite.cc
index 9993811..dab4435 100644
--- a/src/google/protobuf/generated_message_tctable_lite.cc
+++ b/src/google/protobuf/generated_message_tctable_lite.cc
@@ -30,17 +30,18 @@
#include <cstdint>
#include <numeric>
+#include <type_traits>
-#include <google/protobuf/extension_set.h>
-#include <google/protobuf/generated_message_tctable_decl.h>
-#include <google/protobuf/generated_message_tctable_impl.h>
-#include <google/protobuf/inlined_string_field.h>
-#include <google/protobuf/message_lite.h>
-#include <google/protobuf/parse_context.h>
-#include <google/protobuf/wire_format_lite.h>
+#include "google/protobuf/extension_set.h"
+#include "google/protobuf/generated_message_tctable_decl.h"
+#include "google/protobuf/generated_message_tctable_impl.h"
+#include "google/protobuf/inlined_string_field.h"
+#include "google/protobuf/message_lite.h"
+#include "google/protobuf/parse_context.h"
+#include "google/protobuf/wire_format_lite.h"
// clang-format off
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
// clang-format on
namespace google {
@@ -66,78 +67,31 @@
// Core fast parsing implementation:
//////////////////////////////////////////////////////////////////////////////
-class TcParser::ScopedArenaSwap final {
- public:
- ScopedArenaSwap(MessageLite* msg, ParseContext* ctx)
- : ctx_(ctx), saved_(ctx->data().arena) {
- ctx_->data().arena = msg->GetArenaForAllocation();
- }
- ScopedArenaSwap(const ScopedArenaSwap&) = delete;
- ~ScopedArenaSwap() { ctx_->data().arena = saved_; }
-
- private:
- ParseContext* const ctx_;
- Arena* const saved_;
-};
-
PROTOBUF_NOINLINE const char* TcParser::ParseLoop(
MessageLite* msg, const char* ptr, ParseContext* ctx,
const TcParseTableBase* table) {
- ScopedArenaSwap saved(msg, ctx);
+ // Note: TagDispatch uses a dispatch table at "&table->fast_entries".
+ // For fast dispatch, we'd like to have a pointer to that, but if we use
+ // that expression, there's no easy way to get back to "table", which we also
+ // need during dispatch. It turns out that "table + 1" points exactly to
+ // fast_entries, so we just increment table by 1 here, to get the register
+ // holding the value we want.
+ table += 1;
while (!ctx->Done(&ptr)) {
- // Unconditionally read has bits, even if we don't have has bits.
- // has_bits_offset will be 0 and we will just read something valid.
- uint64_t hasbits = ReadAt<uint32_t>(msg, table->has_bits_offset);
- ptr = TagDispatch(msg, ptr, ctx, table, hasbits, {});
+#if defined(__GNUC__)
+ // Note: this asm prevents the compiler (clang, specifically) from
+ // believing (thanks to CSE) that it needs to dedicate a registeer both
+ // to "table" and "&table->fast_entries".
+ // TODO(b/64614992): remove this asm
+ asm("" : "+r"(table));
+#endif
+ ptr = TagDispatch(msg, ptr, ctx, {}, table - 1, 0);
if (ptr == nullptr) break;
if (ctx->LastTag() != 1) break; // Ended on terminating tag
}
return ptr;
}
- // Dispatch to the designated parse function
-inline PROTOBUF_ALWAYS_INLINE const char* TcParser::TagDispatch(
- PROTOBUF_TC_PARAM_DECL) {
- const auto coded_tag = UnalignedLoad<uint16_t>(ptr);
- const size_t idx = coded_tag & table->fast_idx_mask;
- PROTOBUF_ASSUME((idx & 7) == 0);
- auto* fast_entry = table->fast_entry(idx >> 3);
- data = fast_entry->bits;
- data.data ^= coded_tag;
- PROTOBUF_MUSTTAIL return fast_entry->target(PROTOBUF_TC_PARAM_PASS);
-}
-
-// We can only safely call from field to next field if the call is optimized
-// to a proper tail call. Otherwise we blow through stack. Clang and gcc
-// reliably do this optimization in opt mode, but do not perform this in debug
-// mode. Luckily the structure of the algorithm is such that it's always
-// possible to just return and use the enclosing parse loop as a trampoline.
-inline PROTOBUF_ALWAYS_INLINE const char* TcParser::ToTagDispatch(
- PROTOBUF_TC_PARAM_DECL) {
- constexpr bool always_return = !PROTOBUF_TAILCALL;
- if (always_return || !ctx->DataAvailable(ptr)) {
- PROTOBUF_MUSTTAIL return ToParseLoop(PROTOBUF_TC_PARAM_PASS);
- }
- PROTOBUF_MUSTTAIL return TagDispatch(PROTOBUF_TC_PARAM_PASS);
-}
-
-inline PROTOBUF_ALWAYS_INLINE const char* TcParser::ToParseLoop(
- PROTOBUF_TC_PARAM_DECL) {
- (void)data;
- (void)ctx;
- SyncHasbits(msg, hasbits, table);
- return ptr;
-}
-
-inline PROTOBUF_ALWAYS_INLINE const char* TcParser::Error(
- PROTOBUF_TC_PARAM_DECL) {
- (void)data;
- (void)ctx;
- (void)ptr;
- SyncHasbits(msg, hasbits, table);
- return nullptr;
-}
-
// On the fast path, a (matching) 1-byte tag already has the decoded value.
static uint32_t FastDecodeTag(uint8_t coded_tag) {
return coded_tag;
@@ -271,7 +225,7 @@
// This is designed to be compact but not particularly fast to retrieve.
// In particular, it takes O(n) to retrieve the name of the n'th field,
// which is usually fine because most protos have fewer than 10 fields.
-static StringPiece FindName(const char* name_data, size_t entries,
+static absl::string_view FindName(const char* name_data, size_t entries,
size_t index) {
// The compiler unrolls these... if this isn't fast enough,
// there's an AVX version at https://godbolt.org/z/eojrjqzfr
@@ -287,11 +241,11 @@
return {start, size};
}
-StringPiece TcParser::MessageName(const TcParseTableBase* table) {
+absl::string_view TcParser::MessageName(const TcParseTableBase* table) {
return FindName(table->name_data(), table->num_field_entries + 1, 0);
}
-StringPiece TcParser::FieldName(const TcParseTableBase* table,
+absl::string_view TcParser::FieldName(const TcParseTableBase* table,
const FieldEntry* field_entry) {
const FieldEntry* const field_entries = table->field_entries_begin();
auto field_index = static_cast<size_t>(field_entry - field_entries);
@@ -318,36 +272,67 @@
data.data = entry_offset << 32 | tag;
using field_layout::FieldKind;
- auto field_type = entry->type_card & FieldKind::kFkMask;
+ auto field_type =
+ entry->type_card & (+field_layout::kSplitMask | FieldKind::kFkMask);
switch (field_type) {
case FieldKind::kFkNone:
PROTOBUF_MUSTTAIL return table->fallback(PROTOBUF_TC_PARAM_PASS);
case FieldKind::kFkVarint:
- PROTOBUF_MUSTTAIL return MpVarint(PROTOBUF_TC_PARAM_PASS);
+ PROTOBUF_MUSTTAIL return MpVarint<false>(PROTOBUF_TC_PARAM_PASS);
case FieldKind::kFkPackedVarint:
PROTOBUF_MUSTTAIL return MpPackedVarint(PROTOBUF_TC_PARAM_PASS);
case FieldKind::kFkFixed:
- PROTOBUF_MUSTTAIL return MpFixed(PROTOBUF_TC_PARAM_PASS);
+ PROTOBUF_MUSTTAIL return MpFixed<false>(PROTOBUF_TC_PARAM_PASS);
case FieldKind::kFkPackedFixed:
PROTOBUF_MUSTTAIL return MpPackedFixed(PROTOBUF_TC_PARAM_PASS);
case FieldKind::kFkString:
- PROTOBUF_MUSTTAIL return MpString(PROTOBUF_TC_PARAM_PASS);
+ PROTOBUF_MUSTTAIL return MpString<false>(PROTOBUF_TC_PARAM_PASS);
case FieldKind::kFkMessage:
- PROTOBUF_MUSTTAIL return MpMessage(PROTOBUF_TC_PARAM_PASS);
+ PROTOBUF_MUSTTAIL return MpMessage<false>(PROTOBUF_TC_PARAM_PASS);
case FieldKind::kFkMap:
PROTOBUF_MUSTTAIL return MpMap(PROTOBUF_TC_PARAM_PASS);
+
+ case +field_layout::kSplitMask | FieldKind::kFkNone:
+ PROTOBUF_FALLTHROUGH_INTENDED;
+ case +field_layout::kSplitMask | FieldKind::kFkPackedVarint:
+ PROTOBUF_FALLTHROUGH_INTENDED;
+ case +field_layout::kSplitMask | FieldKind::kFkPackedFixed:
+ PROTOBUF_FALLTHROUGH_INTENDED;
+ case +field_layout::kSplitMask | FieldKind::kFkMap:
+ return Error(PROTOBUF_TC_PARAM_PASS);
+
+ case +field_layout::kSplitMask | FieldKind::kFkVarint:
+ PROTOBUF_MUSTTAIL return MpVarint<true>(PROTOBUF_TC_PARAM_PASS);
+ case +field_layout::kSplitMask | FieldKind::kFkFixed:
+ PROTOBUF_MUSTTAIL return MpFixed<true>(PROTOBUF_TC_PARAM_PASS);
+ case +field_layout::kSplitMask | FieldKind::kFkString:
+ PROTOBUF_MUSTTAIL return MpString<true>(PROTOBUF_TC_PARAM_PASS);
+ case +field_layout::kSplitMask | FieldKind::kFkMessage:
+ PROTOBUF_MUSTTAIL return MpMessage<true>(PROTOBUF_TC_PARAM_PASS);
default:
return Error(PROTOBUF_TC_PARAM_PASS);
}
}
-namespace {
-
-// Offset returns the address `offset` bytes after `base`.
-inline void* Offset(void* base, uint32_t offset) {
- return static_cast<uint8_t*>(base) + offset;
+template <typename TagType>
+const char* TcParser::FastEndGroupImpl(PROTOBUF_TC_PARAM_DECL) {
+ if (PROTOBUF_PREDICT_FALSE(data.coded_tag<TagType>() != 0)) {
+ PROTOBUF_MUSTTAIL return MiniParse(PROTOBUF_TC_PARAM_PASS);
+ }
+ ctx->SetLastTag(data.decoded_tag());
+ ptr += sizeof(TagType);
+ PROTOBUF_MUSTTAIL return ToParseLoop(PROTOBUF_TC_PARAM_PASS);
}
+const char* TcParser::FastEndG1(PROTOBUF_TC_PARAM_DECL) {
+ PROTOBUF_MUSTTAIL return FastEndGroupImpl<uint8_t>(PROTOBUF_TC_PARAM_PASS);
+}
+const char* TcParser::FastEndG2(PROTOBUF_TC_PARAM_DECL) {
+ PROTOBUF_MUSTTAIL return FastEndGroupImpl<uint16_t>(PROTOBUF_TC_PARAM_PASS);
+}
+
+namespace {
+
// InvertPacked changes tag bits from the given wire type to length
// delimited. This is the difference expected between packed and non-packed
// repeated fields.
@@ -362,9 +347,9 @@
// Message fields
//////////////////////////////////////////////////////////////////////////////
-template <typename TagType, bool group_coding>
-inline PROTOBUF_ALWAYS_INLINE
-const char* TcParser::SingularParseMessageAuxImpl(PROTOBUF_TC_PARAM_DECL) {
+template <typename TagType, bool group_coding, bool aux_is_table>
+inline PROTOBUF_ALWAYS_INLINE const char* TcParser::SingularParseMessageAuxImpl(
+ PROTOBUF_TC_PARAM_DECL) {
if (PROTOBUF_PREDICT_FALSE(data.coded_tag<TagType>() != 0)) {
PROTOBUF_MUSTTAIL return MiniParse(PROTOBUF_TC_PARAM_PASS);
}
@@ -373,74 +358,145 @@
hasbits |= (uint64_t{1} << data.hasbit_idx());
SyncHasbits(msg, hasbits, table);
auto& field = RefAt<MessageLite*>(msg, data.offset());
- if (field == nullptr) {
- const MessageLite* default_instance =
- table->field_aux(data.aux_idx())->message_default;
- field = default_instance->New(ctx->data().arena);
+
+ if (aux_is_table) {
+ const auto* inner_table = table->field_aux(data.aux_idx())->table;
+ if (field == nullptr) {
+ field = inner_table->default_instance->New(msg->GetArenaForAllocation());
+ }
+ if (group_coding) {
+ return ctx->ParseGroup<TcParser>(field, ptr, FastDecodeTag(saved_tag),
+ inner_table);
+ }
+ return ctx->ParseMessage<TcParser>(field, ptr, inner_table);
+ } else {
+ if (field == nullptr) {
+ const MessageLite* default_instance =
+ table->field_aux(data.aux_idx())->message_default();
+ field = default_instance->New(msg->GetArenaForAllocation());
+ }
+ if (group_coding) {
+ return ctx->ParseGroup(field, ptr, FastDecodeTag(saved_tag));
+ }
+ return ctx->ParseMessage(field, ptr);
}
- if (group_coding) {
- return ctx->ParseGroup(field, ptr, FastDecodeTag(saved_tag));
- }
- return ctx->ParseMessage(field, ptr);
}
-const char* TcParser::FastMS1(PROTOBUF_TC_PARAM_DECL) {
- PROTOBUF_MUSTTAIL return SingularParseMessageAuxImpl<uint8_t, false>(
+const char* TcParser::FastMdS1(PROTOBUF_TC_PARAM_DECL) {
+ PROTOBUF_MUSTTAIL return SingularParseMessageAuxImpl<uint8_t, false, false>(
PROTOBUF_TC_PARAM_PASS);
}
-const char* TcParser::FastMS2(PROTOBUF_TC_PARAM_DECL) {
- PROTOBUF_MUSTTAIL return SingularParseMessageAuxImpl<uint16_t, false>(
+const char* TcParser::FastMdS2(PROTOBUF_TC_PARAM_DECL) {
+ PROTOBUF_MUSTTAIL return SingularParseMessageAuxImpl<uint16_t, false, false>(
PROTOBUF_TC_PARAM_PASS);
}
-const char* TcParser::FastGS1(PROTOBUF_TC_PARAM_DECL) {
- PROTOBUF_MUSTTAIL return SingularParseMessageAuxImpl<uint8_t, true>(
+const char* TcParser::FastGdS1(PROTOBUF_TC_PARAM_DECL) {
+ PROTOBUF_MUSTTAIL return SingularParseMessageAuxImpl<uint8_t, true, false>(
PROTOBUF_TC_PARAM_PASS);
}
-const char* TcParser::FastGS2(PROTOBUF_TC_PARAM_DECL) {
- PROTOBUF_MUSTTAIL return SingularParseMessageAuxImpl<uint16_t, true>(
+const char* TcParser::FastGdS2(PROTOBUF_TC_PARAM_DECL) {
+ PROTOBUF_MUSTTAIL return SingularParseMessageAuxImpl<uint16_t, true, false>(
PROTOBUF_TC_PARAM_PASS);
}
-template <typename TagType, bool group_coding>
-inline PROTOBUF_ALWAYS_INLINE
-const char* TcParser::RepeatedParseMessageAuxImpl(PROTOBUF_TC_PARAM_DECL) {
+const char* TcParser::FastMtS1(PROTOBUF_TC_PARAM_DECL) {
+ PROTOBUF_MUSTTAIL return SingularParseMessageAuxImpl<uint8_t, false, true>(
+ PROTOBUF_TC_PARAM_PASS);
+}
+
+const char* TcParser::FastMtS2(PROTOBUF_TC_PARAM_DECL) {
+ PROTOBUF_MUSTTAIL return SingularParseMessageAuxImpl<uint16_t, false, true>(
+ PROTOBUF_TC_PARAM_PASS);
+}
+
+const char* TcParser::FastGtS1(PROTOBUF_TC_PARAM_DECL) {
+ PROTOBUF_MUSTTAIL return SingularParseMessageAuxImpl<uint8_t, true, true>(
+ PROTOBUF_TC_PARAM_PASS);
+}
+
+const char* TcParser::FastGtS2(PROTOBUF_TC_PARAM_DECL) {
+ PROTOBUF_MUSTTAIL return SingularParseMessageAuxImpl<uint16_t, true, true>(
+ PROTOBUF_TC_PARAM_PASS);
+}
+
+template <typename TagType, bool group_coding, bool aux_is_table>
+inline PROTOBUF_ALWAYS_INLINE const char* TcParser::RepeatedParseMessageAuxImpl(
+ PROTOBUF_TC_PARAM_DECL) {
if (PROTOBUF_PREDICT_FALSE(data.coded_tag<TagType>() != 0)) {
PROTOBUF_MUSTTAIL return MiniParse(PROTOBUF_TC_PARAM_PASS);
}
- auto saved_tag = UnalignedLoad<TagType>(ptr);
- ptr += sizeof(TagType);
- SyncHasbits(msg, hasbits, table);
- const MessageLite* default_instance =
- table->field_aux(data.aux_idx())->message_default;
+ const auto expected_tag = UnalignedLoad<TagType>(ptr);
+ const auto aux = *table->field_aux(data.aux_idx());
auto& field = RefAt<RepeatedPtrFieldBase>(msg, data.offset());
- MessageLite* submsg =
- field.Add<GenericTypeHandler<MessageLite>>(default_instance);
- if (group_coding) {
- return ctx->ParseGroup(submsg, ptr, FastDecodeTag(saved_tag));
- }
- return ctx->ParseMessage(submsg, ptr);
+ do {
+ ptr += sizeof(TagType);
+ MessageLite* submsg = field.Add<GenericTypeHandler<MessageLite>>(
+ aux_is_table ? aux.table->default_instance : aux.message_default());
+ if (aux_is_table) {
+ if (group_coding) {
+ ptr = ctx->ParseGroup<TcParser>(submsg, ptr,
+ FastDecodeTag(expected_tag), aux.table);
+ } else {
+ ptr = ctx->ParseMessage<TcParser>(submsg, ptr, aux.table);
+ }
+ } else {
+ if (group_coding) {
+ ptr = ctx->ParseGroup(submsg, ptr, FastDecodeTag(expected_tag));
+ } else {
+ ptr = ctx->ParseMessage(submsg, ptr);
+ }
+ }
+ if (PROTOBUF_PREDICT_FALSE(ptr == nullptr)) {
+ PROTOBUF_MUSTTAIL return Error(PROTOBUF_TC_PARAM_PASS);
+ }
+ if (PROTOBUF_PREDICT_FALSE(!ctx->DataAvailable(ptr))) {
+ PROTOBUF_MUSTTAIL return ToParseLoop(PROTOBUF_TC_PARAM_PASS);
+ }
+ } while (UnalignedLoad<TagType>(ptr) == expected_tag);
+
+ PROTOBUF_MUSTTAIL return ToTagDispatch(PROTOBUF_TC_PARAM_PASS);
}
-const char* TcParser::FastMR1(PROTOBUF_TC_PARAM_DECL) {
- PROTOBUF_MUSTTAIL return RepeatedParseMessageAuxImpl<uint8_t, false>(
+const char* TcParser::FastMdR1(PROTOBUF_TC_PARAM_DECL) {
+ PROTOBUF_MUSTTAIL return RepeatedParseMessageAuxImpl<uint8_t, false, false>(
PROTOBUF_TC_PARAM_PASS);
}
-const char* TcParser::FastMR2(PROTOBUF_TC_PARAM_DECL) {
- PROTOBUF_MUSTTAIL return RepeatedParseMessageAuxImpl<uint16_t, false>(
+const char* TcParser::FastMdR2(PROTOBUF_TC_PARAM_DECL) {
+ PROTOBUF_MUSTTAIL return RepeatedParseMessageAuxImpl<uint16_t, false, false>(
PROTOBUF_TC_PARAM_PASS);
}
-const char* TcParser::FastGR1(PROTOBUF_TC_PARAM_DECL) {
- PROTOBUF_MUSTTAIL return RepeatedParseMessageAuxImpl<uint8_t, true>(
+const char* TcParser::FastGdR1(PROTOBUF_TC_PARAM_DECL) {
+ PROTOBUF_MUSTTAIL return RepeatedParseMessageAuxImpl<uint8_t, true, false>(
PROTOBUF_TC_PARAM_PASS);
}
-const char* TcParser::FastGR2(PROTOBUF_TC_PARAM_DECL) {
- PROTOBUF_MUSTTAIL return RepeatedParseMessageAuxImpl<uint16_t, true>(
+const char* TcParser::FastGdR2(PROTOBUF_TC_PARAM_DECL) {
+ PROTOBUF_MUSTTAIL return RepeatedParseMessageAuxImpl<uint16_t, true, false>(
+ PROTOBUF_TC_PARAM_PASS);
+}
+
+const char* TcParser::FastMtR1(PROTOBUF_TC_PARAM_DECL) {
+ PROTOBUF_MUSTTAIL return RepeatedParseMessageAuxImpl<uint8_t, false, true>(
+ PROTOBUF_TC_PARAM_PASS);
+}
+
+const char* TcParser::FastMtR2(PROTOBUF_TC_PARAM_DECL) {
+ PROTOBUF_MUSTTAIL return RepeatedParseMessageAuxImpl<uint16_t, false, true>(
+ PROTOBUF_TC_PARAM_PASS);
+}
+
+const char* TcParser::FastGtR1(PROTOBUF_TC_PARAM_DECL) {
+ PROTOBUF_MUSTTAIL return RepeatedParseMessageAuxImpl<uint8_t, true, true>(
+ PROTOBUF_TC_PARAM_PASS);
+}
+
+const char* TcParser::FastGtR2(PROTOBUF_TC_PARAM_DECL) {
+ PROTOBUF_MUSTTAIL return RepeatedParseMessageAuxImpl<uint16_t, true, true>(
PROTOBUF_TC_PARAM_PASS);
}
@@ -498,7 +554,7 @@
auto elem = field.Add();
int space = field.Capacity() - idx;
idx = 0;
- auto expected_tag = UnalignedLoad<TagType>(ptr);
+ const auto expected_tag = UnalignedLoad<TagType>(ptr);
do {
ptr += sizeof(TagType);
elem[idx++] = UnalignedLoad<LayoutType>(ptr);
@@ -768,7 +824,13 @@
const ::google::protobuf::internal::TcParseTableBase* table;
uint64_t hasbits;
};
- volatile Spill spill = {data.data, msg, table, hasbits};
+ Spill spill = {data.data, msg, table, hasbits};
+#if defined(__GNUC__)
+ // This empty asm block convinces the compiler that the contents of spill may
+ // have changed, and thus can't be cached in registers. It's similar to, but
+ // more optimal then, the effect of declaring it "volatile".
+ asm("" : "+m"(spill));
+#endif
uint64_t tmp;
PROTOBUF_ASSUME(static_cast<int8_t>(*ptr) < 0);
@@ -788,8 +850,7 @@
}
const char* TcParser::FastV8S1(PROTOBUF_TC_PARAM_DECL) {
- PROTOBUF_MUSTTAIL return SingularVarint<bool, uint8_t>(
- PROTOBUF_TC_PARAM_PASS);
+ return SpecializedFastV8S1<-1, -1>(PROTOBUF_TC_PARAM_PASS);
}
const char* TcParser::FastV8S2(PROTOBUF_TC_PARAM_DECL) {
PROTOBUF_MUSTTAIL return SingularVarint<bool, uint16_t>(
@@ -842,7 +903,7 @@
}
}
auto& field = RefAt<RepeatedField<FieldType>>(msg, data.offset());
- auto expected_tag = UnalignedLoad<TagType>(ptr);
+ const auto expected_tag = UnalignedLoad<TagType>(ptr);
do {
ptr += sizeof(TagType);
uint64_t tmp;
@@ -977,10 +1038,6 @@
PROTOBUF_NOINLINE const char* TcParser::FastUnknownEnumFallback(
PROTOBUF_TC_PARAM_DECL) {
- (void)msg;
- (void)ctx;
- (void)hasbits;
-
// If we know we want to put this field directly into the unknown field set,
// then we can skip the call to MiniParse and directly call table->fallback.
// However, we first have to update `data` to contain the decoded tag.
@@ -1047,7 +1104,7 @@
}
}
auto& field = RefAt<RepeatedField<int32_t>>(msg, data.offset());
- auto expected_tag = UnalignedLoad<TagType>(ptr);
+ const auto expected_tag = UnalignedLoad<TagType>(ptr);
const TcParseTableBase::FieldAux aux = *table->field_aux(data.aux_idx());
do {
const char* ptr2 = ptr; // save for unknown enum case
@@ -1089,13 +1146,98 @@
PROTOBUF_TC_PARAM_PASS);
}
+template <typename TagType, uint8_t min>
+PROTOBUF_ALWAYS_INLINE const char* TcParser::SingularEnumSmallRange(
+ PROTOBUF_TC_PARAM_DECL) {
+ if (PROTOBUF_PREDICT_FALSE(data.coded_tag<TagType>() != 0)) {
+ PROTOBUF_MUSTTAIL return MiniParse(PROTOBUF_TC_PARAM_PASS);
+ }
+
+ uint8_t v = ptr[sizeof(TagType)];
+ if (PROTOBUF_PREDICT_FALSE(min > v || v > data.aux_idx())) {
+ PROTOBUF_MUSTTAIL return MiniParse(PROTOBUF_TC_PARAM_PASS);
+ }
+
+ RefAt<int32_t>(msg, data.offset()) = v;
+ ptr += sizeof(TagType) + 1;
+ hasbits |= (uint64_t{1} << data.hasbit_idx());
+ PROTOBUF_MUSTTAIL return ToTagDispatch(PROTOBUF_TC_PARAM_PASS);
+}
+
+const char* TcParser::FastEr0S1(PROTOBUF_TC_PARAM_DECL) {
+ PROTOBUF_MUSTTAIL return SingularEnumSmallRange<uint8_t, 0>(
+ PROTOBUF_TC_PARAM_PASS);
+}
+
+const char* TcParser::FastEr0S2(PROTOBUF_TC_PARAM_DECL) {
+ PROTOBUF_MUSTTAIL return SingularEnumSmallRange<uint16_t, 0>(
+ PROTOBUF_TC_PARAM_PASS);
+}
+
+const char* TcParser::FastEr1S1(PROTOBUF_TC_PARAM_DECL) {
+ PROTOBUF_MUSTTAIL return SingularEnumSmallRange<uint8_t, 1>(
+ PROTOBUF_TC_PARAM_PASS);
+}
+
+const char* TcParser::FastEr1S2(PROTOBUF_TC_PARAM_DECL) {
+ PROTOBUF_MUSTTAIL return SingularEnumSmallRange<uint16_t, 1>(
+ PROTOBUF_TC_PARAM_PASS);
+}
+
+
+template <typename TagType, uint8_t min>
+PROTOBUF_ALWAYS_INLINE const char* TcParser::RepeatedEnumSmallRange(
+ PROTOBUF_TC_PARAM_DECL) {
+ if (PROTOBUF_PREDICT_FALSE(data.coded_tag<TagType>() != 0)) {
+ InvertPacked<WireFormatLite::WIRETYPE_VARINT>(data);
+ if (data.coded_tag<TagType>() == 0) {
+ // Packed parsing is handled by generated fallback.
+ PROTOBUF_MUSTTAIL return FastUnknownEnumFallback(PROTOBUF_TC_PARAM_PASS);
+ } else {
+ PROTOBUF_MUSTTAIL return MiniParse(PROTOBUF_TC_PARAM_PASS);
+ }
+ }
+ auto& field = RefAt<RepeatedField<int32_t>>(msg, data.offset());
+ auto expected_tag = UnalignedLoad<TagType>(ptr);
+ const uint8_t max = data.aux_idx();
+ do {
+ uint8_t v = ptr[sizeof(TagType)];
+ if (PROTOBUF_PREDICT_FALSE(min > v || v > max)) {
+ PROTOBUF_MUSTTAIL return MiniParse(PROTOBUF_TC_PARAM_PASS);
+ }
+ field.Add(static_cast<int32_t>(v));
+ ptr += sizeof(TagType) + 1;
+ if (PROTOBUF_PREDICT_FALSE(!ctx->DataAvailable(ptr))) break;
+ } while (UnalignedLoad<TagType>(ptr) == expected_tag);
+
+ PROTOBUF_MUSTTAIL return ToParseLoop(PROTOBUF_TC_PARAM_PASS);
+}
+
+const char* TcParser::FastEr0R1(PROTOBUF_TC_PARAM_DECL) {
+ PROTOBUF_MUSTTAIL return RepeatedEnumSmallRange<uint8_t, 0>(
+ PROTOBUF_TC_PARAM_PASS);
+}
+const char* TcParser::FastEr0R2(PROTOBUF_TC_PARAM_DECL) {
+ PROTOBUF_MUSTTAIL return RepeatedEnumSmallRange<uint16_t, 0>(
+ PROTOBUF_TC_PARAM_PASS);
+}
+
+const char* TcParser::FastEr1R1(PROTOBUF_TC_PARAM_DECL) {
+ PROTOBUF_MUSTTAIL return RepeatedEnumSmallRange<uint8_t, 1>(
+ PROTOBUF_TC_PARAM_PASS);
+}
+const char* TcParser::FastEr1R2(PROTOBUF_TC_PARAM_DECL) {
+ PROTOBUF_MUSTTAIL return RepeatedEnumSmallRange<uint16_t, 1>(
+ PROTOBUF_TC_PARAM_PASS);
+}
+
//////////////////////////////////////////////////////////////////////////////
// String/bytes fields
//////////////////////////////////////////////////////////////////////////////
// Defined in wire_format_lite.cc
-void PrintUTF8ErrorLog(StringPiece message_name,
- StringPiece field_name, const char* operation_str,
+void PrintUTF8ErrorLog(absl::string_view message_name,
+ absl::string_view field_name, const char* operation_str,
bool emit_stacktrace);
void TcParser::ReportFastUtf8Error(uint32_t decoded_tag,
@@ -1128,7 +1270,7 @@
ptr += sizeof(TagType);
hasbits |= (uint64_t{1} << data.hasbit_idx());
auto& field = RefAt<ArenaStringPtr>(msg, data.offset());
- auto arena = ctx->data().arena;
+ auto arena = msg->GetArenaForAllocation();
if (arena) {
ptr = ctx->ReadArenaString(ptr, &field, arena);
} else {
@@ -1203,31 +1345,52 @@
if (PROTOBUF_PREDICT_FALSE(data.coded_tag<TagType>() != 0)) {
PROTOBUF_MUSTTAIL return MiniParse(PROTOBUF_TC_PARAM_PASS);
}
- auto expected_tag = UnalignedLoad<TagType>(ptr);
+ const auto expected_tag = UnalignedLoad<TagType>(ptr);
auto& field = RefAt<RepeatedPtrField<std::string>>(msg, data.offset());
- do {
- ptr += sizeof(TagType);
- std::string* str = field.Add();
- ptr = InlineGreedyStringParser(str, ptr, ctx);
- if (ptr == nullptr) {
- return Error(PROTOBUF_TC_PARAM_PASS);
- }
+
+ const auto validate_last_string = [expected_tag, table, &field] {
switch (utf8) {
case kNoUtf8:
#ifdef NDEBUG
case kUtf8ValidateOnly:
#endif
- break;
+ return true;
default:
- if (PROTOBUF_PREDICT_TRUE(IsStructurallyValidUTF8(*str))) {
- break;
+ if (PROTOBUF_PREDICT_TRUE(
+ IsStructurallyValidUTF8(field[field.size() - 1]))) {
+ return true;
}
ReportFastUtf8Error(FastDecodeTag(expected_tag), table);
- if (utf8 == kUtf8) return Error(PROTOBUF_TC_PARAM_PASS);
- break;
+ if (utf8 == kUtf8) return false;
+ return true;
}
- if (!ctx->DataAvailable(ptr)) break;
- } while (UnalignedLoad<TagType>(ptr) == expected_tag);
+ };
+
+ auto* arena = field.GetOwningArena();
+ SerialArena* serial_arena;
+ if (PROTOBUF_PREDICT_TRUE(arena != nullptr &&
+ arena->impl_.GetSerialArenaFast(&serial_arena) &&
+ field.PrepareForParse())) {
+ do {
+ ptr += sizeof(TagType);
+ ptr = ParseRepeatedStringOnce(ptr, arena, serial_arena, ctx, field);
+
+ if (PROTOBUF_PREDICT_FALSE(ptr == nullptr || !validate_last_string())) {
+ return Error(PROTOBUF_TC_PARAM_PASS);
+ }
+ if (!ctx->DataAvailable(ptr)) break;
+ } while (UnalignedLoad<TagType>(ptr) == expected_tag);
+ } else {
+ do {
+ ptr += sizeof(TagType);
+ std::string* str = field.Add();
+ ptr = InlineGreedyStringParser(str, ptr, ctx);
+ if (PROTOBUF_PREDICT_FALSE(ptr == nullptr || !validate_last_string())) {
+ return Error(PROTOBUF_TC_PARAM_PASS);
+ }
+ if (!ctx->DataAvailable(ptr)) break;
+ } while (UnalignedLoad<TagType>(ptr) == expected_tag);
+ }
return ToParseLoop(PROTOBUF_TC_PARAM_PASS);
}
@@ -1261,20 +1424,14 @@
//////////////////////////////////////////////////////////////////////////////
namespace {
-inline void SetHas(const TcParseTableBase* table, const FieldEntry& entry,
- MessageLite* msg, uint64_t& hasbits) {
- int32_t has_idx = entry.has_idx;
- if (has_idx < 32) {
- hasbits |= uint64_t{1} << has_idx;
- } else {
- auto* hasblocks = &TcParser::RefAt<uint32_t>(msg, table->has_bits_offset);
+inline void SetHas(const FieldEntry& entry, MessageLite* msg) {
+ auto has_idx = static_cast<uint32_t>(entry.has_idx);
#if defined(__x86_64__) && defined(__GNUC__)
- asm("bts %1, %0\n" : "+m"(*hasblocks) : "r"(has_idx));
+ asm("bts %1, %0\n" : "+m"(*msg) : "r"(has_idx));
#else
- auto& hasblock = hasblocks[has_idx / 32];
- hasblock |= uint32_t{1} << (has_idx % 32);
+ auto& hasblock = TcParser::RefAt<uint32_t>(msg, has_idx / 32 * 4);
+ hasblock |= uint32_t{1} << (has_idx % 32);
#endif
- }
}
} // namespace
@@ -1285,11 +1442,8 @@
const TcParseTableBase::FieldEntry& entry,
uint32_t field_num, ParseContext* ctx,
MessageLite* msg) {
- // The _oneof_case_ array offset is stored in the first aux entry.
- uint32_t oneof_case_offset = table->field_aux(0u)->offset;
- // The _oneof_case_ array index is stored in the has-bit index.
- uint32_t* oneof_case =
- &TcParser::RefAt<uint32_t>(msg, oneof_case_offset) + entry.has_idx;
+ // The _oneof_case_ value offset is stored in the has-bit index.
+ uint32_t* oneof_case = &TcParser::RefAt<uint32_t>(msg, entry.has_idx);
uint32_t current_case = *oneof_case;
*oneof_case = field_num;
@@ -1326,7 +1480,7 @@
case field_layout::kRepGroup:
case field_layout::kRepIWeak: {
auto& field = RefAt<MessageLite*>(msg, current_entry->offset);
- if (!ctx->data().arena) {
+ if (!msg->GetArenaForAllocation()) {
delete field;
}
break;
@@ -1340,6 +1494,39 @@
return true;
}
+namespace {
+uint32_t GetSplitOffset(const TcParseTableBase* table) {
+ return table->field_aux(kSplitOffsetAuxIdx)->offset;
+}
+
+uint32_t GetSizeofSplit(const TcParseTableBase* table) {
+ return table->field_aux(kSplitSizeAuxIdx)->offset;
+}
+} // namespace
+
+void* TcParser::MaybeGetSplitBase(MessageLite* msg, const bool is_split,
+ const TcParseTableBase* table,
+ ::google::protobuf::internal::ParseContext* ctx) {
+ void* out = msg;
+ if (is_split) {
+ const uint32_t split_offset = GetSplitOffset(table);
+ void* default_split =
+ TcParser::RefAt<void*>(table->default_instance, split_offset);
+ void*& split = TcParser::RefAt<void*>(msg, split_offset);
+ if (split == default_split) {
+ // Allocate split instance when needed.
+ uint32_t size = GetSizeofSplit(table);
+ Arena* arena = msg->GetArenaForAllocation();
+ split = (arena == nullptr) ? ::operator new(size)
+ : arena->AllocateAligned(size);
+ memcpy(split, default_split, size);
+ }
+ out = split;
+ }
+ return out;
+}
+
+template <bool is_split>
const char* TcParser::MpFixed(PROTOBUF_TC_PARAM_DECL) {
const auto& entry = RefAt<FieldEntry>(table, data.entry_offset());
const uint16_t type_card = entry.type_card;
@@ -1364,16 +1551,17 @@
}
// Set the field present:
if (card == field_layout::kFcOptional) {
- SetHas(table, entry, msg, hasbits);
+ SetHas(entry, msg);
} else if (card == field_layout::kFcOneof) {
ChangeOneof(table, entry, data.tag() >> 3, ctx, msg);
}
+ void* const base = MaybeGetSplitBase(msg, is_split, table, ctx);
// Copy the value:
if (rep == field_layout::kRep64Bits) {
- RefAt<uint64_t>(msg, entry.offset) = UnalignedLoad<uint64_t>(ptr);
+ RefAt<uint64_t>(base, entry.offset) = UnalignedLoad<uint64_t>(ptr);
ptr += sizeof(uint64_t);
} else {
- RefAt<uint32_t>(msg, entry.offset) = UnalignedLoad<uint32_t>(ptr);
+ RefAt<uint32_t>(base, entry.offset) = UnalignedLoad<uint32_t>(ptr);
ptr += sizeof(uint32_t);
}
PROTOBUF_MUSTTAIL return ToTagDispatch(PROTOBUF_TC_PARAM_PASS);
@@ -1458,6 +1646,7 @@
PROTOBUF_MUSTTAIL return ToTagDispatch(PROTOBUF_TC_PARAM_PASS);
}
+template <bool is_split>
const char* TcParser::MpVarint(PROTOBUF_TC_PARAM_DECL) {
const auto& entry = RefAt<FieldEntry>(table, data.entry_offset());
const uint16_t type_card = entry.type_card;
@@ -1501,18 +1690,19 @@
// Mark the field as present:
const bool is_oneof = card == field_layout::kFcOneof;
if (card == field_layout::kFcOptional) {
- SetHas(table, entry, msg, hasbits);
+ SetHas(entry, msg);
} else if (is_oneof) {
ChangeOneof(table, entry, data.tag() >> 3, ctx, msg);
}
+ void* const base = MaybeGetSplitBase(msg, is_split, table, ctx);
if (rep == field_layout::kRep64Bits) {
- RefAt<uint64_t>(msg, entry.offset) = tmp;
+ RefAt<uint64_t>(base, entry.offset) = tmp;
} else if (rep == field_layout::kRep32Bits) {
- RefAt<uint32_t>(msg, entry.offset) = static_cast<uint32_t>(tmp);
+ RefAt<uint32_t>(base, entry.offset) = static_cast<uint32_t>(tmp);
} else {
GOOGLE_DCHECK_EQ(rep, static_cast<uint16_t>(field_layout::kRep8Bits));
- RefAt<bool>(msg, entry.offset) = static_cast<bool>(tmp);
+ RefAt<bool>(base, entry.offset) = static_cast<bool>(tmp);
}
PROTOBUF_MUSTTAIL return ToTagDispatch(PROTOBUF_TC_PARAM_PASS);
@@ -1631,7 +1821,7 @@
return Error(PROTOBUF_TC_PARAM_PASS);
}
-bool TcParser::MpVerifyUtf8(StringPiece wire_bytes,
+bool TcParser::MpVerifyUtf8(absl::string_view wire_bytes,
const TcParseTableBase* table,
const FieldEntry& entry, uint16_t xform_val) {
if (xform_val == field_layout::kTvUtf8) {
@@ -1653,6 +1843,7 @@
return true;
}
+template <bool is_split>
const char* TcParser::MpString(PROTOBUF_TC_PARAM_DECL) {
const auto& entry = RefAt<FieldEntry>(table, data.entry_offset());
const uint16_t type_card = entry.type_card;
@@ -1676,17 +1867,18 @@
const bool is_oneof = card == field_layout::kFcOneof;
bool need_init = false;
if (card == field_layout::kFcOptional) {
- SetHas(table, entry, msg, hasbits);
+ SetHas(entry, msg);
} else if (is_oneof) {
need_init = ChangeOneof(table, entry, data.tag() >> 3, ctx, msg);
}
bool is_valid = false;
- Arena* arena = ctx->data().arena;
+ void* const base = MaybeGetSplitBase(msg, is_split, table, ctx);
switch (rep) {
case field_layout::kRepAString: {
- auto& field = RefAt<ArenaStringPtr>(msg, entry.offset);
+ auto& field = RefAt<ArenaStringPtr>(base, entry.offset);
if (need_init) field.InitDefault();
+ Arena* arena = msg->GetArenaForAllocation();
if (arena) {
ptr = ctx->ReadArenaString(ptr, &field, arena);
} else {
@@ -1709,6 +1901,19 @@
return ToParseLoop(PROTOBUF_TC_PARAM_PASS);
}
+PROTOBUF_ALWAYS_INLINE const char* TcParser::ParseRepeatedStringOnce(
+ const char* ptr, Arena* arena, SerialArena* serial_arena, ParseContext* ctx,
+ RepeatedPtrField<std::string>& field) {
+ int size = ReadSize(&ptr);
+ if (PROTOBUF_PREDICT_FALSE(!ptr)) return {};
+ auto* str = Arena::Create<std::string>(arena);
+ field.AddAllocatedForParse(str);
+ ptr = ctx->ReadString(ptr, size, str);
+ if (PROTOBUF_PREDICT_FALSE(!ptr)) return {};
+ PROTOBUF_ASSUME(ptr != nullptr);
+ return ptr;
+}
+
const char* TcParser::MpRepeatedString(PROTOBUF_TC_PARAM_DECL) {
const auto& entry = RefAt<FieldEntry>(table, data.entry_offset());
const uint16_t type_card = entry.type_card;
@@ -1726,18 +1931,39 @@
auto& field = RefAt<RepeatedPtrField<std::string>>(msg, entry.offset);
const char* ptr2 = ptr;
uint32_t next_tag;
- do {
- ptr = ptr2;
- std::string* str = field.Add();
- ptr = InlineGreedyStringParser(str, ptr, ctx);
- if (PROTOBUF_PREDICT_FALSE(
- ptr == nullptr ||
- !MpVerifyUtf8(*str, table, entry, xform_val))) {
- return Error(PROTOBUF_TC_PARAM_PASS);
- }
- if (!ctx->DataAvailable(ptr)) break;
- ptr2 = ReadTag(ptr, &next_tag);
- } while (next_tag == decoded_tag);
+
+ auto* arena = field.GetOwningArena();
+ SerialArena* serial_arena;
+ if (PROTOBUF_PREDICT_TRUE(
+ arena != nullptr &&
+ arena->impl_.GetSerialArenaFast(&serial_arena) &&
+ field.PrepareForParse())) {
+ do {
+ ptr = ptr2;
+ ptr = ParseRepeatedStringOnce(ptr, arena, serial_arena, ctx, field);
+ if (PROTOBUF_PREDICT_FALSE(ptr == nullptr ||
+ !MpVerifyUtf8(field[field.size() - 1],
+ table, entry, xform_val))) {
+ return Error(PROTOBUF_TC_PARAM_PASS);
+ }
+ if (!ctx->DataAvailable(ptr)) break;
+ ptr2 = ReadTag(ptr, &next_tag);
+ } while (next_tag == decoded_tag);
+ } else {
+ do {
+ ptr = ptr2;
+ std::string* str = field.Add();
+ ptr = InlineGreedyStringParser(str, ptr, ctx);
+ if (PROTOBUF_PREDICT_FALSE(
+ ptr == nullptr ||
+ !MpVerifyUtf8(*str, table, entry, xform_val))) {
+ return Error(PROTOBUF_TC_PARAM_PASS);
+ }
+ if (!ctx->DataAvailable(ptr)) break;
+ ptr2 = ReadTag(ptr, &next_tag);
+ } while (next_tag == decoded_tag);
+ }
+
break;
}
@@ -1751,6 +1977,7 @@
return ToParseLoop(PROTOBUF_TC_PARAM_PASS);
}
+template <bool is_split>
const char* TcParser::MpMessage(PROTOBUF_TC_PARAM_DECL) {
const auto& entry = RefAt<FieldEntry>(table, data.entry_offset());
const uint16_t type_card = entry.type_card;
@@ -1789,21 +2016,33 @@
const bool is_oneof = card == field_layout::kFcOneof;
bool need_init = false;
if (card == field_layout::kFcOptional) {
- SetHas(table, entry, msg, hasbits);
+ SetHas(entry, msg);
} else if (is_oneof) {
need_init = ChangeOneof(table, entry, data.tag() >> 3, ctx, msg);
}
- MessageLite*& field = RefAt<MessageLite*>(msg, entry.offset);
- if (need_init || field == nullptr) {
- const MessageLite* default_instance =
- table->field_aux(&entry)->message_default;
- field = default_instance->New(ctx->data().arena);
- }
+
+ void* const base = MaybeGetSplitBase(msg, is_split, table, ctx);
SyncHasbits(msg, hasbits, table);
- if (is_group) {
- return ctx->ParseGroup(field, ptr, decoded_tag);
+ MessageLite*& field = RefAt<MessageLite*>(base, entry.offset);
+ if ((type_card & field_layout::kTvMask) == field_layout::kTvTable) {
+ auto* inner_table = table->field_aux(&entry)->table;
+ if (need_init || field == nullptr) {
+ field = inner_table->default_instance->New(msg->GetArenaForAllocation());
+ }
+ if (is_group) {
+ return ctx->ParseGroup<TcParser>(field, ptr, decoded_tag, inner_table);
+ }
+ return ctx->ParseMessage<TcParser>(field, ptr, inner_table);
+ } else {
+ if (need_init || field == nullptr) {
+ field = table->field_aux(&entry)->message_default()->New(
+ msg->GetArenaForAllocation());
+ }
+ if (is_group) {
+ return ctx->ParseGroup(field, ptr, decoded_tag);
+ }
+ return ctx->ParseMessage(field, ptr);
}
- return ctx->ParseMessage(field, ptr);
}
const char* TcParser::MpRepeatedMessage(PROTOBUF_TC_PARAM_DECL) {
@@ -1837,15 +2076,24 @@
}
SyncHasbits(msg, hasbits, table);
- const MessageLite* default_instance =
- table->field_aux(&entry)->message_default;
- auto& field = RefAt<RepeatedPtrFieldBase>(msg, entry.offset);
- MessageLite* value =
- field.Add<GenericTypeHandler<MessageLite>>(default_instance);
- if (is_group) {
- return ctx->ParseGroup(value, ptr, decoded_tag);
+ if ((type_card & field_layout::kTvMask) == field_layout::kTvTable) {
+ auto* inner_table = table->field_aux(&entry)->table;
+ auto& field = RefAt<RepeatedPtrFieldBase>(msg, entry.offset);
+ MessageLite* value = field.Add<GenericTypeHandler<MessageLite>>(
+ inner_table->default_instance);
+ if (is_group) {
+ return ctx->ParseGroup<TcParser>(value, ptr, decoded_tag, inner_table);
+ }
+ return ctx->ParseMessage<TcParser>(value, ptr, inner_table);
+ } else {
+ auto& field = RefAt<RepeatedPtrFieldBase>(msg, entry.offset);
+ MessageLite* value = field.Add<GenericTypeHandler<MessageLite>>(
+ table->field_aux(&entry)->message_default());
+ if (is_group) {
+ return ctx->ParseGroup(value, ptr, decoded_tag);
+ }
+ return ctx->ParseMessage(value, ptr);
}
- return ctx->ParseMessage(value, ptr);
}
const char* TcParser::MpMap(PROTOBUF_TC_PARAM_DECL) {
diff --git a/src/google/protobuf/generated_message_tctable_lite_test.cc b/src/google/protobuf/generated_message_tctable_lite_test.cc
index 4310803..79b0d46 100644
--- a/src/google/protobuf/generated_message_tctable_lite_test.cc
+++ b/src/google/protobuf/generated_message_tctable_lite_test.cc
@@ -30,8 +30,8 @@
#include <cstddef>
-#include <google/protobuf/generated_message_tctable_impl.h>
-#include <google/protobuf/wire_format_lite.h>
+#include "google/protobuf/generated_message_tctable_impl.h"
+#include "google/protobuf/wire_format_lite.h"
#include <gmock/gmock.h>
#include <gtest/gtest.h>
@@ -45,7 +45,7 @@
using ::testing::Not;
MATCHER_P3(IsEntryForFieldNum, table, field_num, field_numbers_table,
- StrCat(negation ? "isn't " : "",
+ absl::StrCat(negation ? "isn't " : "",
"the field entry for field number ", field_num)) {
if (arg == nullptr) {
*result_listener << "which is nullptr";
@@ -80,7 +80,7 @@
}};
// clang-format on
int table_field_numbers[] = {1, 2, 3};
- table.field_lookup_table = {65535, 65535};
+ table.field_lookup_table = {{65535, 65535}};
auto& entries = table.field_entries;
EXPECT_THAT(&entries[0], IsEntryForFieldNum(&table, 1, table_field_numbers));
@@ -108,7 +108,7 @@
// Calls the private `FieldName` function.
template <size_t kFastTableSizeLog2, size_t kNumEntries, size_t kNumFieldAux,
size_t kNameTableSize, size_t kFieldLookupTableSize>
- static StringPiece FieldName(
+ static absl::string_view FieldName(
const TcParseTable<kFastTableSizeLog2, kNumEntries, kNumFieldAux,
kNameTableSize, kFieldLookupTableSize>& table,
const TcParseTableBase::FieldEntry* entry) {
@@ -118,7 +118,7 @@
// Calls the private `MessageName` function.
template <size_t kFastTableSizeLog2, size_t kNumEntries, size_t kNumFieldAux,
size_t kNameTableSize, size_t kFieldLookupTableSize>
- static StringPiece MessageName(
+ static absl::string_view MessageName(
const TcParseTable<kFastTableSizeLog2, kNumEntries, kNumFieldAux,
kNameTableSize, kFieldLookupTableSize>& table) {
return TcParser::MessageName(&table.header);
@@ -300,10 +300,10 @@
EXPECT_THAT(entry,
IsEntryForFieldNum(&table, field_num, table_field_numbers));
- StringPiece name = FieldName(table, entry);
+ absl::string_view name = FieldName(table, entry);
EXPECT_EQ(name.length(), field_num);
while (name[0] == '0') name.remove_prefix(1); // strip leading zeores
- EXPECT_EQ(name, StrCat(field_num));
+ EXPECT_EQ(name, absl::StrCat(field_num));
}
for (int field_num : {0, 4, 112, 500000000}) {
EXPECT_THAT(FindFieldEntry(table, field_num), Eq(nullptr));
@@ -557,7 +557,7 @@
for (int field_num :
{1, 12, 31, 42, 57, 68, 79, 90, 101, 119, 249, 402, 412}) {
auto* entry = FindFieldEntry(test_all_types_table, field_num);
- StringPiece name = FieldName(test_all_types_table, entry);
+ absl::string_view name = FieldName(test_all_types_table, entry);
switch (field_num) {
case 1:
EXPECT_THAT(name, Eq("optional_int32"));
diff --git a/src/google/protobuf/generated_message_util.cc b/src/google/protobuf/generated_message_util.cc
index cad12a3..f9c75c6 100644
--- a/src/google/protobuf/generated_message_util.cc
+++ b/src/google/protobuf/generated_message_util.cc
@@ -32,23 +32,23 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/generated_message_util.h>
+#include "google/protobuf/generated_message_util.h"
#include <atomic>
#include <limits>
#include <vector>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
-#include <google/protobuf/arenastring.h>
-#include <google/protobuf/extension_set.h>
-#include <google/protobuf/message_lite.h>
-#include <google/protobuf/metadata_lite.h>
-#include <google/protobuf/repeated_field.h>
-#include <google/protobuf/wire_format_lite.h>
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/io/zero_copy_stream_impl_lite.h"
+#include "google/protobuf/arenastring.h"
+#include "google/protobuf/extension_set.h"
+#include "google/protobuf/message_lite.h"
+#include "google/protobuf/metadata_lite.h"
+#include "google/protobuf/repeated_field.h"
+#include "google/protobuf/wire_format_lite.h"
// Must be included last
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
PROTOBUF_PRAGMA_INIT_SEG
@@ -406,4 +406,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/generated_message_util.h b/src/google/protobuf/generated_message_util.h
index 71d15cd..42c7db7 100644
--- a/src/google/protobuf/generated_message_util.h
+++ b/src/google/protobuf/generated_message_util.h
@@ -43,22 +43,24 @@
#include <atomic>
#include <climits>
#include <string>
+#include <type_traits>
#include <vector>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/once.h> // Add direct dep on port for pb.cc
-#include <google/protobuf/port.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/any.h>
-#include <google/protobuf/has_bits.h>
-#include <google/protobuf/implicit_weak_message.h>
-#include <google/protobuf/message_lite.h>
-#include <google/protobuf/repeated_field.h>
-#include <google/protobuf/wire_format_lite.h>
-#include <google/protobuf/stubs/casts.h>
+#include "google/protobuf/stubs/common.h"
+#include "absl/base/call_once.h"
+#include "absl/base/casts.h"
+#include "absl/strings/string_view.h"
+#include "google/protobuf/any.h"
+#include "google/protobuf/has_bits.h"
+#include "google/protobuf/implicit_weak_message.h"
+#include "google/protobuf/message_lite.h"
+#include "google/protobuf/port.h"
+#include "google/protobuf/repeated_field.h"
+#include "google/protobuf/wire_format_lite.h"
+
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
#ifdef SWIG
#error "You cannot SWIG proto headers"
@@ -76,15 +78,6 @@
namespace internal {
-template <typename To, typename From>
-inline To DownCast(From* f) {
- return PROTOBUF_NAMESPACE_ID::internal::down_cast<To>(f);
-}
-template <typename To, typename From>
-inline To DownCast(From& f) {
- return PROTOBUF_NAMESPACE_ID::internal::down_cast<To>(f);
-}
-
// This fastpath inlines a single branch instead of having to make the
// InitProtobufDefaults function call.
@@ -185,13 +178,58 @@
// Hide atomic from the public header and allow easy change to regular int
// on platforms where the atomic might have a perf impact.
+//
+// CachedSize is like std::atomic<int> but with some important changes:
+//
+// 1) CachedSize uses Get / Set rather than load / store.
+// 2) CachedSize always uses relaxed ordering.
+// 3) CachedSize is assignable and copy-constructible.
+// 4) CachedSize has a constexpr default constructor, and a constexpr
+// constructor that takes an int argument.
+// 5) If the compiler supports the __atomic_load_n / __atomic_store_n builtins,
+// then CachedSize is trivially copyable.
+//
+// Developed at https://godbolt.org/z/vYcx7zYs1 ; supports gcc, clang, MSVC.
class PROTOBUF_EXPORT CachedSize {
+ private:
+ using Scalar = int;
+
public:
- int Get() const { return size_.load(std::memory_order_relaxed); }
- void Set(int size) { size_.store(size, std::memory_order_relaxed); }
+ constexpr CachedSize() noexcept : atom_(Scalar{}) {}
+ // NOLINTNEXTLINE(google-explicit-constructor)
+ constexpr CachedSize(Scalar desired) noexcept : atom_(desired) {}
+#if PROTOBUF_BUILTIN_ATOMIC
+ constexpr CachedSize(const CachedSize& other) = default;
+
+ Scalar Get() const noexcept {
+ return __atomic_load_n(&atom_, __ATOMIC_RELAXED);
+ }
+
+ void Set(Scalar desired) noexcept {
+ __atomic_store_n(&atom_, desired, __ATOMIC_RELAXED);
+ }
+#else
+ CachedSize(const CachedSize& other) noexcept : atom_(other.Get()) {}
+ CachedSize& operator=(const CachedSize& other) noexcept {
+ Set(other.Get());
+ return *this;
+ }
+
+ Scalar Get() const noexcept { //
+ return atom_.load(std::memory_order_relaxed);
+ }
+
+ void Set(Scalar desired) noexcept {
+ atom_.store(desired, std::memory_order_relaxed);
+ }
+#endif
private:
- std::atomic<int> size_{0};
+#if PROTOBUF_BUILTIN_ATOMIC
+ Scalar atom_;
+#else
+ std::atomic<Scalar> atom_;
+#endif
};
PROTOBUF_EXPORT void DestroyMessage(const void* message);
@@ -209,6 +247,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_GENERATED_MESSAGE_UTIL_H__
diff --git a/src/google/protobuf/has_bits.h b/src/google/protobuf/has_bits.h
index f8a4587..b90c450 100644
--- a/src/google/protobuf/has_bits.h
+++ b/src/google/protobuf/has_bits.h
@@ -31,11 +31,11 @@
#ifndef GOOGLE_PROTOBUF_HAS_BITS_H__
#define GOOGLE_PROTOBUF_HAS_BITS_H__
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/port.h>
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/port.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
#ifdef SWIG
#error "You cannot SWIG proto headers"
@@ -112,6 +112,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_HAS_BITS_H__
diff --git a/src/google/protobuf/implicit_weak_message.cc b/src/google/protobuf/implicit_weak_message.cc
index 27ed6b6..5fac836 100644
--- a/src/google/protobuf/implicit_weak_message.cc
+++ b/src/google/protobuf/implicit_weak_message.cc
@@ -28,14 +28,14 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/implicit_weak_message.h>
+#include "google/protobuf/implicit_weak_message.h"
-#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
-#include <google/protobuf/parse_context.h>
-#include <google/protobuf/wire_format_lite.h>
+#include "google/protobuf/io/zero_copy_stream_impl_lite.h"
+#include "google/protobuf/parse_context.h"
+#include "google/protobuf/wire_format_lite.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
PROTOBUF_PRAGMA_INIT_SEG
@@ -69,4 +69,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/implicit_weak_message.h b/src/google/protobuf/implicit_weak_message.h
index b894ab4..1915e8c 100644
--- a/src/google/protobuf/implicit_weak_message.h
+++ b/src/google/protobuf/implicit_weak_message.h
@@ -33,17 +33,17 @@
#include <string>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/arena.h>
-#include <google/protobuf/message_lite.h>
-#include <google/protobuf/repeated_field.h>
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/arena.h"
+#include "google/protobuf/message_lite.h"
+#include "google/protobuf/repeated_field.h"
#ifdef SWIG
#error "You cannot SWIG proto headers"
#endif
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
// This file is logically internal-only and should only be used by protobuf
// generated code.
@@ -62,6 +62,8 @@
: data_(nullptr) {}
explicit ImplicitWeakMessage(Arena* arena)
: MessageLite(arena), data_(new std::string) {}
+ ImplicitWeakMessage(const ImplicitWeakMessage&) = delete;
+ ImplicitWeakMessage& operator=(const ImplicitWeakMessage&) = delete;
~ImplicitWeakMessage() override {
// data_ will be null in the default instance, but we can safely call delete
@@ -115,7 +117,6 @@
// the default instance can be constant-initialized. In the const methods, we
// have to handle the possibility of data_ being null.
std::string* data_;
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImplicitWeakMessage);
};
struct ImplicitWeakMessageDefaultType;
@@ -208,6 +209,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_IMPLICIT_WEAK_MESSAGE_H__
diff --git a/src/google/protobuf/inlined_string_field.cc b/src/google/protobuf/inlined_string_field.cc
index 0c3e476..34b73d2 100644
--- a/src/google/protobuf/inlined_string_field.cc
+++ b/src/google/protobuf/inlined_string_field.cc
@@ -28,16 +28,18 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/inlined_string_field.h>
+#include "google/protobuf/inlined_string_field.h"
-#include <google/protobuf/arena.h>
-#include <google/protobuf/arenastring.h>
-#include <google/protobuf/generated_message_util.h>
-#include <google/protobuf/message_lite.h>
-#include <google/protobuf/parse_context.h>
+#include "google/protobuf/arena.h"
+#include "absl/strings/internal/resize_uninitialized.h"
+#include "google/protobuf/arenastring.h"
+#include "google/protobuf/generated_message_util.h"
+#include "google/protobuf/message_lite.h"
+#include "google/protobuf/parse_context.h"
+
// clang-format off
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
// clang-format on
namespace google {
diff --git a/src/google/protobuf/inlined_string_field.h b/src/google/protobuf/inlined_string_field.h
index 79e37d4..fe52a4d 100644
--- a/src/google/protobuf/inlined_string_field.h
+++ b/src/google/protobuf/inlined_string_field.h
@@ -34,15 +34,15 @@
#include <string>
#include <utility>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/port.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/arenastring.h>
-#include <google/protobuf/message_lite.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/port.h"
+#include "absl/strings/string_view.h"
+#include "google/protobuf/arenastring.h"
+#include "google/protobuf/message_lite.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
#ifdef SWIG
#error "You cannot SWIG proto headers"
@@ -130,7 +130,7 @@
// `donated == ((donating_states & ~mask) != 0)`
//
// This method never changes the `donating_states`.
- void Set(ConstStringParam value, Arena* arena, bool donated,
+ void Set(absl::string_view value, Arena* arena, bool donated,
uint32_t* donating_states, uint32_t mask, MessageLite* msg);
// Rvalue Set. If this field is donated, this method will undonate this field
@@ -149,7 +149,7 @@
::google::protobuf::Arena* arena, bool donated, uint32_t* donating_states,
uint32_t mask, MessageLite* msg);
- void SetBytes(ConstStringParam value, Arena* arena, bool donated,
+ void SetBytes(absl::string_view value, Arena* arena, bool donated,
uint32_t* donating_states, uint32_t mask, MessageLite* msg);
void SetBytes(std::string&& value, Arena* arena, bool donated,
@@ -167,7 +167,7 @@
::google::protobuf::Arena* arena, bool donated, uint32_t* donating_states,
uint32_t mask, MessageLite* msg);
- PROTOBUF_NDEBUG_INLINE void SetNoArena(StringPiece value);
+ PROTOBUF_NDEBUG_INLINE void SetNoArena(absl::string_view value);
PROTOBUF_NDEBUG_INLINE void SetNoArena(std::string&& value);
// Basic accessors.
@@ -228,7 +228,7 @@
return Release();
}
- void Set(const std::string*, ConstStringParam value, Arena* arena,
+ void Set(const std::string*, absl::string_view value, Arena* arena,
bool donated, uint32_t* donating_states, uint32_t mask,
MessageLite* msg) {
Set(value, arena, donated, donating_states, mask, msg);
@@ -261,7 +261,7 @@
Set(const_string_ref, arena, donated, donating_states, mask, msg);
}
- void SetBytes(const std::string*, ConstStringParam value, Arena* arena,
+ void SetBytes(const std::string*, absl::string_view value, Arena* arena,
bool donated, uint32_t* donating_states, uint32_t mask,
MessageLite* msg) {
Set(value, arena, donated, donating_states, mask, msg);
@@ -297,7 +297,7 @@
msg);
}
- void SetNoArena(const std::string*, StringPiece value) {
+ void SetNoArena(const std::string*, absl::string_view value) {
SetNoArena(value);
}
void SetNoArena(const std::string*, std::string&& value) {
@@ -413,7 +413,7 @@
this->~InlinedStringField();
}
-inline void InlinedStringField::SetNoArena(StringPiece value) {
+inline void InlinedStringField::SetNoArena(absl::string_view value) {
get_mutable()->assign(value.data(), value.length());
}
@@ -427,7 +427,7 @@
MessageLite* lhs_msg, //
InlinedStringField* rhs, Arena* rhs_arena, bool rhs_arena_dtor_registered,
MessageLite* rhs_msg) {
-#if GOOGLE_PROTOBUF_INTERNAL_DONATE_STEAL_INLINE
+#ifdef GOOGLE_PROTOBUF_INTERNAL_DONATE_STEAL_INLINE
lhs->get_mutable()->swap(*rhs->get_mutable());
if (!lhs_arena_dtor_registered && rhs_arena_dtor_registered) {
lhs_msg->OnDemandRegisterArenaDtor(lhs_arena);
@@ -445,7 +445,7 @@
#endif
}
-inline void InlinedStringField::Set(ConstStringParam value, Arena* arena,
+inline void InlinedStringField::Set(absl::string_view value, Arena* arena,
bool donated, uint32_t* /*donating_states*/,
uint32_t /*mask*/, MessageLite* /*msg*/) {
(void)arena;
@@ -456,17 +456,17 @@
inline void InlinedStringField::Set(const char* str, ::google::protobuf::Arena* arena,
bool donated, uint32_t* donating_states,
uint32_t mask, MessageLite* msg) {
- Set(ConstStringParam(str), arena, donated, donating_states, mask, msg);
+ Set(absl::string_view(str), arena, donated, donating_states, mask, msg);
}
inline void InlinedStringField::Set(const char* str, size_t size,
::google::protobuf::Arena* arena, bool donated,
uint32_t* donating_states, uint32_t mask,
MessageLite* msg) {
- Set(ConstStringParam{str, size}, arena, donated, donating_states, mask, msg);
+ Set(absl::string_view{str, size}, arena, donated, donating_states, mask, msg);
}
-inline void InlinedStringField::SetBytes(ConstStringParam value, Arena* arena,
+inline void InlinedStringField::SetBytes(absl::string_view value, Arena* arena,
bool donated,
uint32_t* donating_states,
uint32_t mask, MessageLite* msg) {
@@ -527,6 +527,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_INLINED_STRING_FIELD_H__
diff --git a/src/google/protobuf/inlined_string_field_unittest.cc b/src/google/protobuf/inlined_string_field_unittest.cc
index 9efe6e9..53552df 100644
--- a/src/google/protobuf/inlined_string_field_unittest.cc
+++ b/src/google/protobuf/inlined_string_field_unittest.cc
@@ -28,7 +28,7 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/inlined_string_field.h>
+#include "google/protobuf/inlined_string_field.h"
#include <algorithm>
#include <cstdlib>
@@ -38,13 +38,14 @@
#include <utility>
#include <vector>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/arenastring.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/io/zero_copy_stream_impl.h"
+#include "google/protobuf/arenastring.h"
#include <gtest/gtest.h>
-#include <google/protobuf/stubs/strutil.h>
+#include "absl/strings/string_view.h"
+#include "google/protobuf/message.h"
namespace google {
diff --git a/src/google/protobuf/io/BUILD.bazel b/src/google/protobuf/io/BUILD.bazel
new file mode 100644
index 0000000..cce6296
--- /dev/null
+++ b/src/google/protobuf/io/BUILD.bazel
@@ -0,0 +1,185 @@
+# Protobuf IO library.
+
+load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test")
+load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
+load("//build_defs:cpp_opts.bzl", "COPTS")
+
+package(
+ default_visibility = ["//visibility:public"],
+)
+
+cc_library(
+ name = "io",
+ srcs = [
+ "coded_stream.cc",
+ "zero_copy_stream.cc",
+ "zero_copy_stream_impl.cc",
+ "zero_copy_stream_impl_lite.cc",
+ ],
+ hdrs = [
+ "coded_stream.h",
+ "zero_copy_stream.h",
+ "zero_copy_stream_impl.h",
+ "zero_copy_stream_impl_lite.h",
+ ],
+ copts = COPTS,
+ include_prefix = "google/protobuf/io",
+ deps = [
+ ":io_win32",
+ "//src/google/protobuf:arena",
+ "//src/google/protobuf/stubs:lite",
+ "@com_google_absl//absl/strings:internal",
+ ],
+)
+
+cc_library(
+ name = "zero_copy_sink",
+ srcs = ["zero_copy_sink.cc"],
+ hdrs = ["zero_copy_sink.h"],
+ copts = COPTS,
+ strip_include_prefix = "/src",
+ deps = [
+ ":io",
+ "//src/google/protobuf/stubs",
+ ],
+)
+
+cc_test(
+ name = "zero_copy_sink_test",
+ srcs = ["zero_copy_sink_test.cc"],
+ copts = COPTS,
+ deps = [
+ ":zero_copy_sink",
+ "//src/google/protobuf/stubs",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_library(
+ name = "printer",
+ srcs = ["printer.cc"],
+ hdrs = ["printer.h"],
+ copts = COPTS,
+ include_prefix = "google/protobuf/io",
+ deps = [
+ ":zero_copy_sink",
+ "//src/google/protobuf/stubs",
+ "@com_google_absl//absl/base:core_headers",
+ "@com_google_absl//absl/cleanup",
+ "@com_google_absl//absl/container:flat_hash_map",
+ "@com_google_absl//absl/functional:function_ref",
+ "@com_google_absl//absl/strings",
+ "@com_google_absl//absl/strings:str_format",
+ "@com_google_absl//absl/types:optional",
+ "@com_google_absl//absl/types:span",
+ "@com_google_absl//absl/types:variant",
+ ],
+)
+
+cc_library(
+ name = "tokenizer",
+ srcs = [
+ "strtod.cc",
+ "tokenizer.cc",
+ ],
+ hdrs = [
+ "strtod.h",
+ "tokenizer.h",
+ ],
+ copts = COPTS,
+ include_prefix = "google/protobuf/io",
+ deps = [
+ ":io",
+ "//src/google/protobuf/stubs",
+ ],
+)
+
+cc_library(
+ name = "gzip_stream",
+ srcs = ["gzip_stream.cc"],
+ hdrs = ["gzip_stream.h"],
+ copts = COPTS,
+ include_prefix = "google/protobuf/io",
+ deps = [
+ ":io",
+ "//src/google/protobuf/stubs",
+ ] + select({
+ "//build_defs:config_msvc": [],
+ "//conditions:default": ["@zlib//:zlib"],
+ }),
+)
+
+cc_library(
+ name = "io_win32",
+ srcs = ["io_win32.cc"],
+ hdrs = ["io_win32.h"],
+ copts = COPTS,
+ include_prefix = "google/protobuf/io",
+ visibility = ["//pkg:__pkg__"],
+ deps = [
+ "//src/google/protobuf:arena",
+ "//src/google/protobuf/stubs:lite",
+ ],
+)
+
+cc_test(
+ name = "io_test",
+ srcs = [
+ "coded_stream_unittest.cc",
+ "printer_death_test.cc",
+ "printer_unittest.cc",
+ "tokenizer_unittest.cc",
+ "zero_copy_stream_unittest.cc",
+ ],
+ copts = COPTS,
+ data = [
+ "//src/google/protobuf:testdata",
+ ],
+ deps = [
+ ":gzip_stream",
+ ":io",
+ "//:protobuf",
+ "//src/google/protobuf:test_util2",
+ "//src/google/protobuf/testing",
+ "@com_google_absl//absl/container:flat_hash_map",
+ "@com_google_absl//absl/strings",
+ "@com_google_absl//absl/strings:str_format",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_test(
+ name = "win32_test",
+ srcs = ["io_win32_unittest.cc"],
+ tags = [
+ "manual",
+ "windows",
+ ],
+ deps = [
+ "//:protobuf_lite",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+################################################################################
+# Distribution packaging
+################################################################################
+
+pkg_files(
+ name = "dist_files",
+ srcs = glob(["**/*"]),
+ strip_prefix = strip_prefix.from_root(""),
+ visibility = ["//src:__pkg__"],
+)
+
+filegroup(
+ name = "test_srcs",
+ srcs = glob([
+ "*_test.cc",
+ "*unittest.cc",
+ ]),
+ visibility = ["//pkg:__pkg__"],
+)
diff --git a/src/google/protobuf/io/coded_stream.cc b/src/google/protobuf/io/coded_stream.cc
index 487e1b8..b29fccf 100644
--- a/src/google/protobuf/io/coded_stream.cc
+++ b/src/google/protobuf/io/coded_stream.cc
@@ -38,7 +38,7 @@
// will not cross the end of the buffer, since we can avoid a lot
// of branching in this case.
-#include <google/protobuf/io/coded_stream.h>
+#include "google/protobuf/io/coded_stream.h"
#include <limits.h>
@@ -46,16 +46,18 @@
#include <cstring>
#include <utility>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/arena.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
-#include <google/protobuf/stubs/stl_util.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "absl/strings/internal/resize_uninitialized.h"
+#include "absl/strings/string_view.h"
+#include "google/protobuf/arena.h"
+#include "google/protobuf/io/zero_copy_stream.h"
+#include "google/protobuf/io/zero_copy_stream_impl_lite.h"
+#include "google/protobuf/port.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -260,7 +262,7 @@
if (size < 0) return false; // security: size is often user-supplied
if (BufferSize() >= size) {
- STLStringResizeUninitialized(buffer, size);
+ absl::strings_internal::STLStringResizeUninitialized(buffer, size);
std::pair<char*, bool> z = as_string_data(buffer);
if (z.second) {
// Oddly enough, memcpy() requires its first two args to be non-NULL even
@@ -964,4 +966,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/io/coded_stream.h b/src/google/protobuf/io/coded_stream.h
index c8fc994..d849a1b 100644
--- a/src/google/protobuf/io/coded_stream.h
+++ b/src/google/protobuf/io/coded_stream.h
@@ -109,7 +109,6 @@
#ifndef GOOGLE_PROTOBUF_IO_CODED_STREAM_H__
#define GOOGLE_PROTOBUF_IO_CODED_STREAM_H__
-
#include <assert.h>
#include <atomic>
@@ -128,15 +127,15 @@
#endif
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/port.h>
-#include <google/protobuf/stubs/port.h>
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/stubs/logging.h"
+#include "absl/numeric/bits.h"
+#include "absl/strings/string_view.h"
+#include "google/protobuf/port.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -178,6 +177,8 @@
// faster than using an ArrayInputStream. PushLimit(size) is implied by
// this constructor.
explicit CodedInputStream(const uint8_t* buffer, int size);
+ CodedInputStream(const CodedInputStream&) = delete;
+ CodedInputStream& operator=(const CodedInputStream&) = delete;
// Destroy the CodedInputStream and position the underlying
// ZeroCopyInputStream at the first unread byte. If an error occurred while
@@ -518,8 +519,6 @@
MessageFactory* GetExtensionFactory();
private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CodedInputStream);
-
const uint8_t* buffer_;
const uint8_t* buffer_end_; // pointer to the end of the buffer.
ZeroCopyInputStream* input_;
@@ -681,7 +680,7 @@
if (PROTOBUF_PREDICT_FALSE(end_ - ptr < size)) {
return WriteRawFallback(data, size, ptr);
}
- std::memcpy(ptr, data, size);
+ std::memcpy(ptr, data, static_cast<unsigned int>(size));
return ptr + size;
}
// Writes the buffer specified by data, size to the stream. Possibly by
@@ -1061,6 +1060,8 @@
template <class Stream, class = typename std::enable_if<std::is_base_of<
ZeroCopyOutputStream, Stream>::value>::type>
CodedOutputStream(Stream* stream, bool eager_init);
+ CodedOutputStream(const CodedOutputStream&) = delete;
+ CodedOutputStream& operator=(const CodedOutputStream&) = delete;
// Destroy the CodedOutputStream and position the underlying
// ZeroCopyOutputStream immediately after the last byte written.
@@ -1288,7 +1289,6 @@
// REQUIRES: value >= 0x80, and that (value & 7f) has been written to *target.
static uint8_t* WriteVarint32ToArrayOutOfLineHelper(uint32_t value,
uint8_t* target);
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CodedOutputStream);
};
// inline methods ====================================================
@@ -1729,15 +1729,16 @@
// This computes value == 0 ? 1 : floor(log2(value)) / 7 + 1
// Use an explicit multiplication to implement the divide of
// a number in the 1..31 range.
- // Explicit OR 0x1 to avoid calling Bits::Log2FloorNonZero(0), which is
- // undefined.
- uint32_t log2value = Bits::Log2FloorNonZero(value | 0x1);
+ //
+ // Explicit OR 0x1 to avoid calling absl::bit_width(0), which is
+ // requires a branch to check for on many platforms.
+ uint32_t log2value = absl::bit_width(value | 0x1) - 1;
return static_cast<size_t>((log2value * 9 + 73) / 64);
}
inline size_t CodedOutputStream::VarintSize32PlusOne(uint32_t value) {
// Same as above, but one more.
- uint32_t log2value = Bits::Log2FloorNonZero(value | 0x1);
+ uint32_t log2value = absl::bit_width(value | 0x1) - 1;
return static_cast<size_t>((log2value * 9 + 73 + 64) / 64);
}
@@ -1745,15 +1746,16 @@
// This computes value == 0 ? 1 : floor(log2(value)) / 7 + 1
// Use an explicit multiplication to implement the divide of
// a number in the 1..63 range.
- // Explicit OR 0x1 to avoid calling Bits::Log2FloorNonZero(0), which is
- // undefined.
- uint32_t log2value = Bits::Log2FloorNonZero64(value | 0x1);
+ //
+ // Explicit OR 0x1 to avoid calling absl::bit_width(0), which is
+ // requires a branch to check for on many platforms.
+ uint32_t log2value = absl::bit_width(value | 0x1) - 1;
return static_cast<size_t>((log2value * 9 + 73) / 64);
}
inline size_t CodedOutputStream::VarintSize64PlusOne(uint64_t value) {
// Same as above, but one more.
- uint32_t log2value = Bits::Log2FloorNonZero64(value | 0x1);
+ uint32_t log2value = absl::bit_width(value | 0x1) - 1;
return static_cast<size_t>((log2value * 9 + 73 + 64) / 64);
}
@@ -1777,7 +1779,7 @@
inline uint8_t* CodedOutputStream::WriteRawToArray(const void* data, int size,
uint8_t* target) {
- memcpy(target, data, size);
+ memcpy(target, data, static_cast<unsigned int>(size));
return target + size;
}
@@ -1794,6 +1796,6 @@
#pragma runtime_checks("c", restore)
#endif // _MSC_VER && !defined(__INTEL_COMPILER)
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_IO_CODED_STREAM_H__
diff --git a/src/google/protobuf/io/coded_stream_unittest.cc b/src/google/protobuf/io/coded_stream_unittest.cc
index b32bf45..1fca15c 100644
--- a/src/google/protobuf/io/coded_stream_unittest.cc
+++ b/src/google/protobuf/io/coded_stream_unittest.cc
@@ -34,7 +34,7 @@
//
// This file contains tests and benchmarks.
-#include <google/protobuf/io/coded_stream.h>
+#include "google/protobuf/io/coded_stream.h"
#include <limits.h>
@@ -43,17 +43,19 @@
#include <string>
#include <vector>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/testing/googletest.h>
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/stubs/logging.h"
#include <gtest/gtest.h>
-#include <google/protobuf/stubs/casts.h>
+#include "absl/base/casts.h"
+#include "google/protobuf/stubs/logging.h"
+#include "absl/strings/string_view.h"
+#include "google/protobuf/io/zero_copy_stream_impl.h"
+
+#include "google/protobuf/testing/googletest.h"
+
// Must be included last.
-#include <google/protobuf/port_def.inc>
-
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -69,7 +71,7 @@
// run multiple times, once for each item in some input array. TEST_1D
// tests all cases in a single input array. TEST_2D tests all
// combinations of cases from two arrays. The arrays must be statically
-// defined such that the GOOGLE_ARRAYSIZE() macro works on them. Example:
+// defined such that the ABSL_ARRAYSIZE() macro works on them. Example:
//
// int kCases[] = {1, 2, 3, 4}
// TEST_1D(MyFixture, MyTest, kCases) {
@@ -92,7 +94,7 @@
}; \
\
TEST_F(FIXTURE##_##NAME##_DD, NAME) { \
- for (size_t i = 0; i < GOOGLE_ARRAYSIZE(CASES); i++) { \
+ for (size_t i = 0; i < ABSL_ARRAYSIZE(CASES); i++) { \
SCOPED_TRACE(testing::Message() \
<< #CASES " case #" << i << ": " << CASES[i]); \
DoSingleCase(CASES[i]); \
@@ -111,8 +113,8 @@
}; \
\
TEST_F(FIXTURE##_##NAME##_DD, NAME) { \
- for (size_t i = 0; i < GOOGLE_ARRAYSIZE(CASES1); i++) { \
- for (size_t j = 0; j < GOOGLE_ARRAYSIZE(CASES2); j++) { \
+ for (size_t i = 0; i < ABSL_ARRAYSIZE(CASES1); i++) { \
+ for (size_t j = 0; j < ABSL_ARRAYSIZE(CASES2); j++) { \
SCOPED_TRACE(testing::Message() \
<< #CASES1 " case #" << i << ": " << CASES1[i] << ", " \
<< #CASES2 " case #" << j << ": " << CASES2[j]); \
@@ -134,7 +136,7 @@
static uint8_t buffer_[kBufferSize];
};
-uint8_t CodedStreamTest::buffer_[CodedStreamTest::kBufferSize];
+uint8_t CodedStreamTest::buffer_[CodedStreamTest::kBufferSize] = {};
// We test each operation over a variety of block sizes to insure that
// we test cases where reads or writes cross buffer boundaries, cases
@@ -725,7 +727,7 @@
TEST_F(CodedStreamTest, ReadStringImpossiblyLargeFromStringOnStack) {
// Same test as above, except directly use a buffer. This used to cause
// crashes while the above did not.
- uint8_t buffer[8];
+ uint8_t buffer[8] = {};
CodedInputStream coded_input(buffer, 8);
std::string str;
EXPECT_FALSE(coded_input.ReadString(&str, 1 << 30));
@@ -1316,7 +1318,7 @@
int backup_amount_;
private:
- char buffer_[1024];
+ char buffer_[1024] = {};
int64_t buffer_count_;
};
@@ -1345,4 +1347,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/io/gzip_stream.cc b/src/google/protobuf/io/gzip_stream.cc
index a5284b3..d9d44a0 100644
--- a/src/google/protobuf/io/gzip_stream.cc
+++ b/src/google/protobuf/io/gzip_stream.cc
@@ -35,11 +35,11 @@
#if HAVE_ZLIB
-#include <google/protobuf/io/gzip_stream.h>
-#include <google/protobuf/port.h>
+#include "google/protobuf/io/gzip_stream.h"
+#include "google/protobuf/port.h"
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/logging.h>
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/stubs/logging.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/io/gzip_stream.h b/src/google/protobuf/io/gzip_stream.h
index 4cf71b6..eec111c 100644
--- a/src/google/protobuf/io/gzip_stream.h
+++ b/src/google/protobuf/io/gzip_stream.h
@@ -43,14 +43,13 @@
#ifndef GOOGLE_PROTOBUF_IO_GZIP_STREAM_H__
#define GOOGLE_PROTOBUF_IO_GZIP_STREAM_H__
-
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/port.h>
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/io/zero_copy_stream.h"
+#include "google/protobuf/port.h"
#include "zlib.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -75,7 +74,9 @@
// buffer_size and format may be -1 for default of 64kB and GZIP format
explicit GzipInputStream(ZeroCopyInputStream* sub_stream,
Format format = AUTO, int buffer_size = -1);
- virtual ~GzipInputStream();
+ GzipInputStream(const GzipInputStream&) = delete;
+ GzipInputStream& operator=(const GzipInputStream&) = delete;
+ ~GzipInputStream() override;
// Return last error message or NULL if no error.
inline const char* ZlibErrorMessage() const { return zcontext_.msg; }
@@ -102,8 +103,6 @@
int Inflate(int flush);
void DoNextOutput(const void** data, int* size);
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(GzipInputStream);
};
class PROTOBUF_EXPORT GzipOutputStream PROTOBUF_FUTURE_FINAL
@@ -142,8 +141,10 @@
// Create a GzipOutputStream with the given options.
GzipOutputStream(ZeroCopyOutputStream* sub_stream, const Options& options);
+ GzipOutputStream(const GzipOutputStream&) = delete;
+ GzipOutputStream& operator=(const GzipOutputStream&) = delete;
- virtual ~GzipOutputStream();
+ ~GzipOutputStream() override;
// Return last error message or NULL if no error.
inline const char* ZlibErrorMessage() const { return zcontext_.msg; }
@@ -192,14 +193,12 @@
// Takes zlib flush mode.
// Returns zlib error code.
int Deflate(int flush);
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(GzipOutputStream);
};
} // namespace io
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_IO_GZIP_STREAM_H__
diff --git a/src/google/protobuf/io/io_win32.cc b/src/google/protobuf/io/io_win32.cc
index 4e81908..684c567 100644
--- a/src/google/protobuf/io/io_win32.cc
+++ b/src/google/protobuf/io/io_win32.cc
@@ -49,7 +49,7 @@
// debug failing tests if that's caused by the long path support.
#define SUPPORT_LONGPATHS
-#include <google/protobuf/io/io_win32.h>
+#include "google/protobuf/io/io_win32.h"
#include <ctype.h>
#include <direct.h>
diff --git a/src/google/protobuf/io/io_win32.h b/src/google/protobuf/io/io_win32.h
index a72b4ea..370bcaa 100644
--- a/src/google/protobuf/io/io_win32.h
+++ b/src/google/protobuf/io/io_win32.h
@@ -52,10 +52,10 @@
#include <functional>
#include <string>
-#include <google/protobuf/port.h>
+#include "google/protobuf/port.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
// Compilers on Windows other than MSVC (e.g. Cygwin, MinGW32) define the
// following functions already, except for mkdir.
@@ -134,7 +134,7 @@
#define STDOUT_FILENO 1
#endif
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // defined(_WIN32)
diff --git a/src/google/protobuf/io/io_win32_unittest.cc b/src/google/protobuf/io/io_win32_unittest.cc
index e8f378f..d4e50b8 100644
--- a/src/google/protobuf/io/io_win32_unittest.cc
+++ b/src/google/protobuf/io/io_win32_unittest.cc
@@ -40,7 +40,7 @@
#if defined(_WIN32)
#define WIN32_LEAN_AND_MEAN
-#include <google/protobuf/io/io_win32.h>
+#include "google/protobuf/io/io_win32.h"
#include <errno.h>
#include <fcntl.h>
diff --git a/src/google/protobuf/io/printer.cc b/src/google/protobuf/io/printer.cc
index 47bd00b..4ea62d3 100644
--- a/src/google/protobuf/io/printer.cc
+++ b/src/google/protobuf/io/printer.cc
@@ -32,195 +32,230 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/io/printer.h>
+#include "google/protobuf/io/printer.h"
-#include <cctype>
+#include <stdlib.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/io/zero_copy_stream.h>
+#include <cstddef>
+#include <functional>
+#include <map>
+#include <string>
+#include <type_traits>
+#include <utility>
+#include <vector>
+
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "absl/container/flat_hash_map.h"
+#include "absl/strings/ascii.h"
+#include "absl/strings/escaping.h"
+#include "absl/strings/match.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/str_format.h"
+#include "absl/strings/string_view.h"
+#include "absl/strings/strip.h"
+#include "absl/types/optional.h"
+#include "absl/types/span.h"
+#include "absl/types/variant.h"
namespace google {
namespace protobuf {
namespace io {
-
-Printer::Printer(ZeroCopyOutputStream* output, char variable_delimiter)
- : variable_delimiter_(variable_delimiter),
- output_(output),
- buffer_(NULL),
- buffer_size_(0),
- offset_(0),
- at_start_of_line_(true),
- failed_(false),
- annotation_collector_(NULL) {}
-
-Printer::Printer(ZeroCopyOutputStream* output, char variable_delimiter,
- AnnotationCollector* annotation_collector)
- : variable_delimiter_(variable_delimiter),
- output_(output),
- buffer_(NULL),
- buffer_size_(0),
- offset_(0),
- at_start_of_line_(true),
- failed_(false),
- annotation_collector_(annotation_collector) {}
-
-Printer::~Printer() {
- // Only BackUp() if we invoked Next() at least once, and we have never failed.
- // Note that we always call `Backup`, i.e. we call BackUp(0) as some output
- // streams have buffered output, and BackUp() serves as a flush event in such
- // implementations.
- if (buffer_ != nullptr && !failed_) {
- output_->BackUp(buffer_size_);
+namespace {
+// Returns the number of spaces of the first non empty line.
+size_t RawStringIndentLen(absl::string_view format) {
+ // We are processing a call that looks like
+ //
+ // p->Emit(R"cc(
+ // class Foo {
+ // int x, y, z;
+ // };
+ // )cc");
+ //
+ // or
+ //
+ // p->Emit(R"cc(
+ //
+ // class Foo {
+ // int x, y, z;
+ // };
+ // )cc");
+ //
+ // To compute the indent, we need to discard all leading newlines, then
+ // count all spaces until we reach a non-space; this run of spaces is
+ // stripped off at the start of each line.
+ size_t len = 0;
+ while (absl::ConsumePrefix(&format, "\n")) {
}
+
+ while (absl::ConsumePrefix(&format, " ")) {
+ ++len;
+ }
+
+ return len;
}
-bool Printer::GetSubstitutionRange(const char* varname,
- std::pair<size_t, size_t>* range) {
- std::map<std::string, std::pair<size_t, size_t> >::const_iterator iter =
- substitutions_.find(varname);
- if (iter == substitutions_.end()) {
- GOOGLE_LOG(DFATAL) << " Undefined variable in annotation: " << varname;
- return false;
+// Returns the amount of additional indenting past `raw_string_indent_len`.
+size_t ConsumeIndentForLine(size_t raw_string_indent_len,
+ absl::string_view& format) {
+ size_t total_indent = 0;
+ while (absl::ConsumePrefix(&format, " ")) {
+ ++total_indent;
}
- if (iter->second.first > iter->second.second) {
- GOOGLE_LOG(DFATAL) << " Variable used for annotation used multiple times: "
- << varname;
- return false;
- }
- *range = iter->second;
- return true;
-}
-
-void Printer::Annotate(const char* begin_varname, const char* end_varname,
- const std::string& file_path,
- const std::vector<int>& path) {
- if (annotation_collector_ == NULL) {
- // Can't generate signatures with this Printer.
- return;
- }
- std::pair<size_t, size_t> begin, end;
- if (!GetSubstitutionRange(begin_varname, &begin) ||
- !GetSubstitutionRange(end_varname, &end)) {
- return;
- }
- if (begin.first > end.second) {
- GOOGLE_LOG(DFATAL) << " Annotation has negative length from " << begin_varname
- << " to " << end_varname;
+ if (total_indent < raw_string_indent_len) {
+ total_indent = 0;
} else {
- annotation_collector_->AddAnnotation(begin.first, end.second, file_path,
- path);
+ total_indent -= raw_string_indent_len;
}
+ return total_indent;
}
-void Printer::Print(const std::map<std::string, std::string>& variables,
- const char* text) {
- int size = strlen(text);
- int pos = 0; // The number of bytes we've written so far.
- substitutions_.clear();
- line_start_variables_.clear();
-
- for (int i = 0; i < size; i++) {
- if (text[i] == '\n') {
- // Saw newline. If there is more text, we may need to insert an indent
- // here. So, write what we have so far, including the '\n'.
- WriteRaw(text + pos, i - pos + 1);
- pos = i + 1;
-
- // Setting this true will cause the next WriteRaw() to insert an indent
- // first.
- at_start_of_line_ = true;
- line_start_variables_.clear();
-
- } else if (text[i] == variable_delimiter_) {
- // Saw the start of a variable name.
-
- // Write what we have so far.
- WriteRaw(text + pos, i - pos);
- pos = i + 1;
-
- // Find closing delimiter.
- const char* end = strchr(text + pos, variable_delimiter_);
- if (end == NULL) {
- GOOGLE_LOG(DFATAL) << " Unclosed variable name.";
- end = text + pos;
- }
- int endpos = end - text;
-
- std::string varname(text + pos, endpos - pos);
- if (varname.empty()) {
- // Two delimiters in a row reduce to a literal delimiter character.
- WriteRaw(&variable_delimiter_, 1);
- } else {
- // Replace with the variable's value.
- std::map<std::string, std::string>::const_iterator iter =
- variables.find(varname);
- if (iter == variables.end()) {
- GOOGLE_LOG(DFATAL) << " Undefined variable: " << varname;
- } else {
- if (at_start_of_line_ && iter->second.empty()) {
- line_start_variables_.push_back(varname);
- }
- WriteRaw(iter->second.data(), iter->second.size());
- std::pair<std::map<std::string, std::pair<size_t, size_t> >::iterator,
- bool>
- inserted = substitutions_.insert(std::make_pair(
- varname,
- std::make_pair(offset_ - iter->second.size(), offset_)));
- if (!inserted.second) {
- // This variable was used multiple times. Make its span have
- // negative length so we can detect it if it gets used in an
- // annotation.
- inserted.first->second = std::make_pair(1, 0);
- }
- }
- }
-
- // Advance past this variable.
- i = endpos;
- pos = endpos + 1;
+template <typename T>
+absl::optional<T> LookupInFrameStack(
+ absl::string_view var,
+ absl::Span<std::function<absl::optional<T>(absl::string_view)>> frames) {
+ for (size_t i = frames.size(); i >= 1; --i) {
+ auto val = frames[i - 1](var);
+ if (val.has_value()) {
+ return val;
}
}
+ return absl::nullopt;
+}
+} // namespace
- // Write the rest.
- WriteRaw(text + pos, size - pos);
+constexpr absl::string_view Printer::kProtocCodegenTrace;
+
+Printer::Printer(ZeroCopyOutputStream* output, Options options)
+ : sink_(output), options_(options) {
+ if (!options_.enable_codegen_trace.has_value()) {
+ // Trace-by-default is threaded through via an env var, rather than a
+ // global, so that child processes can pick it up as well. The flag
+ // --enable_codegen_trace setenv()'s this in protoc's startup code.
+ static const bool kEnableCodegenTrace =
+ ::getenv(kProtocCodegenTrace.data()) != nullptr;
+ options_.enable_codegen_trace = kEnableCodegenTrace;
+ }
}
-void Printer::Indent() { indent_ += " "; }
+absl::string_view Printer::LookupVar(absl::string_view var) {
+ LookupResult result = LookupInFrameStack(var, absl::MakeSpan(var_lookups_));
+ GOOGLE_CHECK(result.has_value()) << "could not find " << var;
+ auto* view = absl::get_if<absl::string_view>(&*result);
+ GOOGLE_CHECK(view != nullptr) << "could not find " << var
+ << "; found callback instead";
+ return *view;
+}
+
+bool Printer::Validate(bool cond, Printer::PrintOptions opts,
+ absl::FunctionRef<std::string()> message) {
+ if (!cond) {
+ if (opts.checks_are_debug_only) {
+ GOOGLE_LOG(DFATAL) << message();
+ } else {
+ GOOGLE_LOG(FATAL) << message();
+ }
+ }
+ return cond;
+}
+
+bool Printer::Validate(bool cond, Printer::PrintOptions opts,
+ absl::string_view message) {
+ return Validate(cond, opts, [=] { return std::string(message); });
+}
+
+// This function is outlined to isolate the use of
+// GOOGLE_CHECK into the .cc file.
void Printer::Outdent() {
- if (indent_.empty()) {
- GOOGLE_LOG(DFATAL) << " Outdent() without matching Indent().";
+ PrintOptions opts;
+ opts.checks_are_debug_only = true;
+ if (!Validate(indent_ >= options_.spaces_per_indent, opts,
+ "Outdent() without matching Indent()")) {
+ return;
+ }
+ indent_ -= options_.spaces_per_indent;
+}
+
+void Printer::Emit(
+ std::initializer_list<
+ VarDefinition<absl::string_view, /*allow_callbacks=*/true>>
+ vars,
+ absl::string_view format, SourceLocation loc) {
+ PrintOptions opts;
+ opts.strip_raw_string_indentation = true;
+ opts.loc = loc;
+
+ auto defs = WithDefs(vars);
+
+ PrintImpl(format, {}, opts);
+}
+
+absl::optional<std::pair<size_t, size_t>> Printer::GetSubstitutionRange(
+ absl::string_view varname, PrintOptions opts) {
+ auto it = substitutions_.find(std::string(varname));
+ if (!Validate(it != substitutions_.end(), opts, [varname] {
+ return absl::StrCat("undefined variable in annotation: ", varname);
+ })) {
+ return absl::nullopt;
+ }
+
+ std::pair<size_t, size_t> range = it->second;
+ if (!Validate(range.first <= range.second, opts, [varname] {
+ return absl::StrCat(
+ "variable used for annotation used multiple times: ", varname);
+ })) {
+ return absl::nullopt;
+ }
+
+ return range;
+}
+
+void Printer::Annotate(absl::string_view begin_varname,
+ absl::string_view end_varname,
+ absl::string_view file_path,
+ const std::vector<int>& path) {
+ if (options_.annotation_collector == nullptr) {
return;
}
- indent_.resize(indent_.size() - 2);
+ PrintOptions opts;
+ opts.checks_are_debug_only = true;
+ auto begin = GetSubstitutionRange(begin_varname, opts);
+ auto end = GetSubstitutionRange(end_varname, opts);
+ if (!begin.has_value() || !end.has_value()) {
+ return;
+ }
+ if (begin->first > end->second) {
+ GOOGLE_LOG(DFATAL) << "annotation has negative length from " << begin_varname
+ << " to " << end_varname;
+ return;
+ }
+ options_.annotation_collector->AddAnnotation(begin->first, end->second,
+ std::string(file_path), path);
}
-void Printer::PrintRaw(const std::string& data) {
- WriteRaw(data.data(), data.size());
-}
+void Printer::WriteRaw(const char* data, size_t size) {
+ if (failed_ || size == 0) {
+ return;
+ }
-void Printer::PrintRaw(const char* data) {
- if (failed_) return;
- WriteRaw(data, strlen(data));
-}
-
-void Printer::WriteRaw(const char* data, int size) {
- if (failed_) return;
- if (size == 0) return;
-
- if (at_start_of_line_ && (size > 0) && (data[0] != '\n')) {
+ if (at_start_of_line_ && data[0] != '\n') {
// Insert an indent.
at_start_of_line_ = false;
- CopyToBuffer(indent_.data(), indent_.size());
- if (failed_) return;
+ for (size_t i = 0; i < indent_; ++i) {
+ sink_.Write(" ");
+ }
+
+ if (failed_) {
+ return;
+ }
+
// Fix up empty variables (e.g., "{") that should be annotated as
// coming after the indent.
- for (std::vector<std::string>::iterator i = line_start_variables_.begin();
- i != line_start_variables_.end(); ++i) {
- substitutions_[*i].first += indent_.size();
- substitutions_[*i].second += indent_.size();
+ for (const std::string& var : line_start_variables_) {
+ substitutions_[var].first += indent_;
+ substitutions_[var].second += indent_;
}
}
@@ -229,175 +264,398 @@
// the current line.
line_start_variables_.clear();
- CopyToBuffer(data, size);
-}
-
-bool Printer::Next() {
- do {
- void* void_buffer;
- if (!output_->Next(&void_buffer, &buffer_size_)) {
- failed_ = true;
- return false;
- }
- buffer_ = reinterpret_cast<char*>(void_buffer);
- } while (buffer_size_ == 0);
- return true;
-}
-
-void Printer::CopyToBuffer(const char* data, int size) {
- if (failed_) return;
- if (size == 0) return;
-
- while (size > buffer_size_) {
- // Data exceeds space in the buffer. Copy what we can and request a
- // new buffer.
- if (buffer_size_ > 0) {
- memcpy(buffer_, data, buffer_size_);
- offset_ += buffer_size_;
- data += buffer_size_;
- size -= buffer_size_;
- }
- void* void_buffer;
- failed_ = !output_->Next(&void_buffer, &buffer_size_);
- if (failed_) return;
- buffer_ = reinterpret_cast<char*>(void_buffer);
- }
-
- // Buffer is big enough to receive the data; copy it.
- memcpy(buffer_, data, size);
- buffer_ += size;
- buffer_size_ -= size;
- offset_ += size;
+ sink_.Append(data, size);
+ failed_ |= sink_.failed();
}
void Printer::IndentIfAtStart() {
- if (at_start_of_line_) {
- CopyToBuffer(indent_.data(), indent_.size());
- at_start_of_line_ = false;
+ if (!at_start_of_line_) {
+ return;
}
+
+ for (size_t i = 0; i < indent_; ++i) {
+ sink_.Write(" ");
+ }
+ at_start_of_line_ = false;
}
-void Printer::FormatInternal(const std::vector<std::string>& args,
- const std::map<std::string, std::string>& vars,
- const char* format) {
- auto save = format;
- int arg_index = 0;
- std::vector<AnnotationCollector::Annotation> annotations;
- while (*format) {
- char c = *format++;
- switch (c) {
- case '$':
- format = WriteVariable(args, vars, format, &arg_index, &annotations);
+void Printer::PrintCodegenTrace(absl::optional<SourceLocation> loc) {
+ if (!options_.enable_codegen_trace.value_or(false) || !loc.has_value()) {
+ return;
+ }
+
+ if (!at_start_of_line_) {
+ at_start_of_line_ = true;
+ line_start_variables_.clear();
+ sink_.Write("\n");
+ }
+
+ PrintRaw(absl::StrFormat("%s @%s:%d\n", options_.comment_start,
+ loc->file_name(), loc->line()));
+ at_start_of_line_ = true;
+}
+
+bool Printer::ValidateIndexLookupInBounds(size_t index,
+ size_t current_arg_index,
+ size_t args_len, PrintOptions opts) {
+ if (!Validate(index < args_len, opts, [this, index] {
+ return absl::StrFormat("annotation %c{%d%c is out of bounds",
+ options_.variable_delimiter, index + 1,
+ options_.variable_delimiter);
+ })) {
+ return false;
+ }
+ if (!Validate(
+ index <= current_arg_index, opts, [this, index, current_arg_index] {
+ return absl::StrFormat(
+ "annotation arg must be in correct order as given; expected "
+ "%c{%d%c but got %c{%d%c",
+ options_.variable_delimiter, current_arg_index + 1,
+ options_.variable_delimiter, options_.variable_delimiter,
+ index + 1, options_.variable_delimiter);
+ })) {
+ return false;
+ }
+ return true;
+}
+
+void Printer::PrintImpl(absl::string_view format,
+ absl::Span<const std::string> args, PrintOptions opts) {
+ // Inside of this function, we set indentation as we print new lines from the
+ // format string. No matter how we exit this function, we should fix up the
+ // indent to what it was before we entered; a cleanup makes it easy to avoid
+ // this mistake.
+ size_t original_indent = indent_;
+ auto unindent =
+ absl::MakeCleanup([this, original_indent] { indent_ = original_indent; });
+
+ absl::string_view original = format;
+
+ line_start_variables_.clear();
+
+ if (opts.use_substitution_map) {
+ substitutions_.clear();
+ }
+
+ size_t raw_string_indent_len =
+ opts.strip_raw_string_indentation ? RawStringIndentLen(format) : 0;
+
+ if (opts.strip_raw_string_indentation) {
+ // We only want to remove a single newline from the input string to allow
+ // extra newlines at the start to go into the generated code.
+ absl::ConsumePrefix(&format, "\n");
+ while (absl::ConsumePrefix(&format, " ")) {
+ }
+ }
+
+ PrintCodegenTrace(opts.loc);
+
+ size_t arg_index = 0;
+ std::vector<AnnotationCollector::Annotation> annot_stack;
+ std::vector<std::pair<absl::string_view, size_t>> annot_records;
+ while (!format.empty()) {
+ // Skip to the next special character. We do this so that we can delay
+ // printing "normal" text until we know what kind of variable substitution
+ // we're doing, since that may require trimming whitespace.
+ size_t next_special = 0;
+ for (; next_special < format.size(); ++next_special) {
+ if (format[next_special] == options_.variable_delimiter ||
+ format[next_special] == '\n') {
+ break;
+ }
+ }
+
+ absl::string_view next_chunk = format.substr(0, next_special);
+ format = format.substr(next_special);
+
+ if (format.empty()) {
+ PrintRaw(next_chunk);
+ break;
+ }
+
+ char c = format.front();
+ format = format.substr(1);
+ if (c == '\n') {
+ PrintRaw(next_chunk);
+ at_start_of_line_ = true;
+ line_start_variables_.clear();
+ sink_.Write("\n");
+ indent_ =
+ original_indent + ConsumeIndentForLine(raw_string_indent_len, format);
+ continue;
+ } else if (c != options_.variable_delimiter) {
+ PrintRaw(next_chunk);
+ continue;
+ }
+
+ size_t end = format.find(options_.variable_delimiter);
+ if (!Validate(end != absl::string_view::npos, opts, [format] {
+ return absl::StrCat("unclosed variable name: \"",
+ absl::CHexEscape(format), "\"");
+ })) {
+ PrintRaw(next_chunk);
+ WriteRaw(&options_.variable_delimiter, 1);
+ PrintRaw(format);
+ break;
+ }
+
+ absl::string_view match = format.substr(0, end);
+ absl::string_view var = match;
+ format = format.substr(end + 1);
+
+ if (var.empty()) {
+ // `$$` is an escape for just `$`.
+ PrintRaw(next_chunk);
+ WriteRaw(&options_.variable_delimiter, 1);
+ continue;
+ }
+
+ if (opts.use_curly_brace_substitutions && absl::ConsumePrefix(&var, "{")) {
+ PrintRaw(next_chunk);
+
+ if (!Validate(var.size() == 1u, opts, "expected single-digit variable")) {
continue;
- case '\n':
- at_start_of_line_ = true;
- line_start_variables_.clear();
- break;
- default:
+ }
+
+ if (!Validate(absl::ascii_isdigit(var[0]), opts,
+ "expected digit after {")) {
+ continue;
+ }
+
+ size_t idx = var[0] - '1';
+ if (!ValidateIndexLookupInBounds(idx, arg_index, args.size(), opts)) {
+ continue;
+ }
+
+ if (idx == arg_index) {
+ ++arg_index;
+ }
+
+ IndentIfAtStart();
+ annot_stack.push_back({{sink_.bytes_written(), 0}, args[idx]});
+ continue;
+ } else if (opts.use_curly_brace_substitutions &&
+ absl::ConsumePrefix(&var, "}")) {
+ PrintRaw(next_chunk);
+
+ // The rest of var is actually ignored, and this is apparently
+ // public API now. Oops?
+ if (!Validate(!annot_stack.empty(), opts,
+ "unexpected end of annotation")) {
+ continue;
+ }
+
+ annot_stack.back().first.second = sink_.bytes_written();
+ if (options_.annotation_collector != nullptr) {
+ options_.annotation_collector->AddAnnotationNew(annot_stack.back());
+ }
+ IndentIfAtStart();
+ annot_stack.pop_back();
+ continue;
+ }
+
+ absl::string_view prefix, suffix;
+ if (opts.strip_spaces_around_vars) {
+ var = absl::StripLeadingAsciiWhitespace(var);
+ prefix = match.substr(0, match.size() - var.size());
+ var = absl::StripTrailingAsciiWhitespace(var);
+ suffix = match.substr(prefix.size() + var.size());
+ }
+
+ if (!Validate(!var.empty(), opts, "unexpected empty variable")) {
+ PrintRaw(next_chunk);
+ continue;
+ }
+
+ LookupResult sub;
+ absl::optional<AnnotationRecord> same_name_record;
+ if (opts.allow_digit_substitions && absl::ascii_isdigit(var[0])) {
+ PrintRaw(next_chunk);
+
+ if (!Validate(var.size() == 1u, opts, "expected single-digit variable")) {
+ continue;
+ }
+
+ size_t idx = var[0] - '1';
+ if (!ValidateIndexLookupInBounds(idx, arg_index, args.size(), opts)) {
+ continue;
+ }
+ if (idx == arg_index) {
+ ++arg_index;
+ }
+ sub = args[idx];
+ } else if (opts.use_annotation_frames &&
+ (var == "_start" || var == "_end")) {
+ bool is_start = var == "_start";
+
+ size_t next_delim = format.find('$');
+ if (!Validate(next_delim != absl::string_view::npos, opts,
+ "$_start$ must be followed by a name and another $")) {
+ PrintRaw(next_chunk);
+ continue;
+ }
+
+ auto var = format.substr(0, next_delim);
+ format = format.substr(next_delim + 1);
+
+ if (is_start) {
+ PrintRaw(next_chunk);
IndentIfAtStart();
- break;
+ annot_records.push_back({var, sink_.bytes_written()});
+ // Skip all whitespace immediately after a _start.
+ while (!format.empty() && absl::ascii_isspace(format.front())) {
+ format = format.substr(1);
+ }
+ } else {
+ // Skip all whitespace immediately *before* an _end.
+ while (!next_chunk.empty() && absl::ascii_isspace(next_chunk.back())) {
+ next_chunk = next_chunk.substr(0, next_chunk.size() - 1);
+ }
+ PrintRaw(next_chunk);
+
+ // If a line consisted *only* of an _end, this will likely result in
+ // a blank line if we do not zap the newline after it, and any
+ // indentation beyond that.
+ if (at_start_of_line_) {
+ absl::ConsumePrefix(&format, "\n");
+ indent_ = original_indent +
+ ConsumeIndentForLine(raw_string_indent_len, format);
+ }
+
+ auto record_var = annot_records.back();
+ annot_records.pop_back();
+
+ if (!Validate(record_var.first == var, opts, [record_var, var] {
+ return absl::StrFormat(
+ "_start and _end variables must match, but got %s and %s, "
+ "respectively",
+ record_var.first, var);
+ })) {
+ continue;
+ }
+
+ absl::optional<AnnotationRecord> record =
+ LookupInFrameStack(var, absl::MakeSpan(annotation_lookups_));
+
+ if (!Validate(record.has_value(), opts, [var] {
+ return absl::StrCat("undefined variable: \"",
+ absl::CHexEscape(var), "\"");
+ })) {
+ continue;
+ }
+
+ if (options_.annotation_collector != nullptr) {
+ options_.annotation_collector->AddAnnotation(
+ record_var.second, sink_.bytes_written(), record->file_path,
+ record->path);
+ }
+ }
+
+ continue;
+ } else {
+ PrintRaw(next_chunk);
+ sub = LookupInFrameStack(var, absl::MakeSpan(var_lookups_));
+
+ if (opts.use_annotation_frames) {
+ same_name_record =
+ LookupInFrameStack(var, absl::MakeSpan(annotation_lookups_));
+ }
}
- push_back(c);
+
+ // By returning here in case of empty we also skip possible spaces inside
+ // the $...$, i.e. "void$ dllexpor$ f();" -> "void f();" in the empty case.
+ if (!Validate(sub.has_value(), opts, [var] {
+ return absl::StrCat("undefined variable: \"", absl::CHexEscape(var),
+ "\"");
+ })) {
+ continue;
+ }
+
+ size_t range_start = sink_.bytes_written();
+ size_t range_end = sink_.bytes_written();
+
+ if (auto* str = absl::get_if<absl::string_view>(&*sub)) {
+ if (at_start_of_line_ && str->empty()) {
+ line_start_variables_.emplace_back(var);
+ }
+
+ if (!str->empty()) {
+ // If `sub` is empty, we do not print the spaces around it.
+ PrintRaw(prefix);
+ PrintRaw(*str);
+ range_end = sink_.bytes_written();
+ range_start = range_end - str->size();
+ PrintRaw(suffix);
+ }
+ } else {
+ auto* fnc = absl::get_if<std::function<void()>>(&*sub);
+ GOOGLE_CHECK(fnc != nullptr);
+
+ Validate(
+ prefix.empty() && suffix.empty(), opts,
+ "substitution that resolves to callback cannot contain whitespace");
+
+ IndentIfAtStart();
+ range_start = sink_.bytes_written();
+ (*fnc)();
+ range_end = sink_.bytes_written();
+
+ // If we just evaluated a closure, and we are at the start of a line, that
+ // means it finished with a newline. If a newline follows immediately
+ // after, we drop it. This helps callback formatting "work as expected"
+ // with respect to forms like
+ //
+ // class Foo {
+ // $methods$;
+ // };
+ //
+ // Without this line, this would turn into something like
+ //
+ // class Foo {
+ // void Bar() {}
+ //
+ // };
+ //
+ // in many cases. We *also* do this if a ; or , follows the substitution,
+ // because this helps clang-format keep its head on in many cases.
+ // Users that need to keep the semi can write $foo$/**/;
+ if (!absl::ConsumePrefix(&format, ";")) {
+ absl::ConsumePrefix(&format, ",");
+ }
+ absl::ConsumePrefix(&format, "\n");
+ indent_ =
+ original_indent + ConsumeIndentForLine(raw_string_indent_len, format);
+ }
+
+ if (same_name_record.has_value() &&
+ options_.annotation_collector != nullptr) {
+ options_.annotation_collector->AddAnnotation(range_start, range_end,
+ same_name_record->file_path,
+ same_name_record->path);
+ }
+
+ if (opts.use_substitution_map) {
+ auto insertion = substitutions_.emplace(
+ std::string(var), std::make_pair(range_start, range_end));
+
+ if (!insertion.second) {
+ // This variable was used multiple times.
+ // Make its span have negative length so
+ // we can detect it if it gets used in an
+ // annotation.
+ insertion.first->second = {1, 0};
+ }
+ }
}
- if (arg_index != static_cast<int>(args.size())) {
- GOOGLE_LOG(FATAL) << " Unused arguments. " << save;
- }
- if (!annotations.empty()) {
- GOOGLE_LOG(FATAL) << " Annotation range is not-closed, expect $}$. " << save;
- }
+
+ Validate(arg_index == args.size(), opts,
+ [original] { return absl::StrCat("unused args: ", original); });
+ Validate(annot_stack.empty(), opts, [this, original] {
+ return absl::StrFormat(
+ "annotation range was not closed; expected %c}%c: %s",
+ options_.variable_delimiter, options_.variable_delimiter, original);
+ });
}
-
-const char* Printer::WriteVariable(
- const std::vector<std::string>& args,
- const std::map<std::string, std::string>& vars, const char* format,
- int* arg_index, std::vector<AnnotationCollector::Annotation>* annotations) {
- auto start = format;
- auto end = strchr(format, '$');
- if (!end) {
- GOOGLE_LOG(FATAL) << " Unclosed variable name.";
- }
- format = end + 1;
- if (end == start) {
- // "$$" is an escape for just '$'
- IndentIfAtStart();
- push_back('$');
- return format;
- }
- if (*start == '{') {
- GOOGLE_CHECK(std::isdigit(start[1]));
- GOOGLE_CHECK_EQ(end - start, 2);
- int idx = start[1] - '1';
- if (idx < 0 || static_cast<size_t>(idx) >= args.size()) {
- GOOGLE_LOG(FATAL) << "Annotation ${" << idx + 1 << "$ is out of bounds.";
- }
- if (idx > *arg_index) {
- GOOGLE_LOG(FATAL) << "Annotation arg must be in correct order as given. Expected"
- << " ${" << (*arg_index) + 1 << "$ got ${" << idx + 1 << "$.";
- } else if (idx == *arg_index) {
- (*arg_index)++;
- }
- IndentIfAtStart();
- annotations->push_back({{offset_, 0}, args[idx]});
- return format;
- } else if (*start == '}') {
- GOOGLE_CHECK(annotations);
- if (annotations->empty()) {
- GOOGLE_LOG(FATAL) << "Unexpected end of annotation found.";
- }
- auto& a = annotations->back();
- a.first.second = offset_;
- if (annotation_collector_) annotation_collector_->AddAnnotationNew(a);
- annotations->pop_back();
- return format;
- }
- auto start_var = start;
- while (start_var < end && *start_var == ' ') start_var++;
- if (start_var == end) {
- GOOGLE_LOG(FATAL) << " Empty variable.";
- }
- auto end_var = end;
- while (start_var < end_var && *(end_var - 1) == ' ') end_var--;
- std::string var_name{
- start_var, static_cast<std::string::size_type>(end_var - start_var)};
- std::string sub;
- if (std::isdigit(var_name[0])) {
- GOOGLE_CHECK_EQ(var_name.size(), 1U); // No need for multi-digits
- int idx = var_name[0] - '1'; // Start counting at 1
- GOOGLE_CHECK_GE(idx, 0);
- if (static_cast<size_t>(idx) >= args.size()) {
- GOOGLE_LOG(FATAL) << "Argument $" << idx + 1 << "$ is out of bounds.";
- }
- if (idx > *arg_index) {
- GOOGLE_LOG(FATAL) << "Arguments must be used in same order as given. Expected $"
- << (*arg_index) + 1 << "$ got $" << idx + 1 << "$.";
- } else if (idx == *arg_index) {
- (*arg_index)++;
- }
- sub = args[idx];
- } else {
- auto it = vars.find(var_name);
- if (it == vars.end()) {
- GOOGLE_LOG(FATAL) << " Unknown variable: " << var_name << ".";
- }
- sub = it->second;
- }
-
- // By returning here in case of empty we also skip possible spaces inside
- // the $...$, i.e. "void$ dllexpor$ f();" -> "void f();" in the empty case.
- if (sub.empty()) return format;
-
- // We're going to write something non-empty so we need a possible indent.
- IndentIfAtStart();
-
- // Write the possible spaces in front.
- CopyToBuffer(start, start_var - start);
- // Write a non-empty substituted variable.
- CopyToBuffer(sub.c_str(), sub.size());
- // Finish off with writing possible trailing spaces.
- CopyToBuffer(end_var, end - end_var);
- return format;
-}
-
} // namespace io
} // namespace protobuf
} // namespace google
diff --git a/src/google/protobuf/io/printer.h b/src/google/protobuf/io/printer.h
index 92a4321..fb41ef0 100644
--- a/src/google/protobuf/io/printer.h
+++ b/src/google/protobuf/io/printer.h
@@ -37,27 +37,41 @@
#ifndef GOOGLE_PROTOBUF_IO_PRINTER_H__
#define GOOGLE_PROTOBUF_IO_PRINTER_H__
-
+#include <cstddef>
+#include <functional>
+#include <initializer_list>
#include <map>
#include <string>
+#include <type_traits>
+#include <utility>
#include <vector>
-#include <google/protobuf/stubs/common.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "absl/cleanup/cleanup.h"
+#include "absl/container/flat_hash_map.h"
+#include "absl/functional/function_ref.h"
+#include "absl/strings/str_format.h"
+#include "absl/strings/string_view.h"
+#include "absl/types/optional.h"
+#include "absl/types/variant.h"
+#include "google/protobuf/io/zero_copy_sink.h"
+
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
namespace io {
-
-class ZeroCopyOutputStream; // zero_copy_stream.h
-
// Records annotations about a Printer's output.
class PROTOBUF_EXPORT AnnotationCollector {
public:
- // Annotation is a offset range and a payload pair.
- typedef std::pair<std::pair<size_t, size_t>, std::string> Annotation;
+ // Annotation is a offset range and a payload pair. This payload's layout is
+ // specific to derived types of AnnotationCollector.
+ using Annotation = std::pair<std::pair<size_t, size_t>, std::string>;
+
+ virtual ~AnnotationCollector() = default;
// Records that the bytes in file_path beginning with begin_offset and ending
// before end_offset are associated with the SourceCodeInfo-style path.
@@ -67,28 +81,29 @@
// TODO(gerbens) I don't see why we need virtuals here. Just a vector of
// range, payload pairs stored in a context should suffice.
- virtual void AddAnnotationNew(Annotation& /* a */) {}
-
- virtual ~AnnotationCollector() {}
+ virtual void AddAnnotationNew(Annotation&) {}
};
-// Records annotations about a Printer's output to the given protocol buffer,
-// assuming that the buffer has an ::Annotation message exposing path,
-// source_file, begin and end fields.
+// Records annotations about a Printer's output to a Protobuf message,
+// assuming that it has a repeated submessage field named `annotation` with
+// fields matching
+//
+// message ??? {
+// repeated int32 path = 1;
+// optional string source_file = 2;
+// optional int32 begin = 3;
+// optional int32 end = 4;
+// }
template <typename AnnotationProto>
class AnnotationProtoCollector : public AnnotationCollector {
public:
- // annotation_proto is the protocol buffer to which new Annotations should be
- // added. It is not owned by the AnnotationProtoCollector.
explicit AnnotationProtoCollector(AnnotationProto* annotation_proto)
: annotation_proto_(annotation_proto) {}
- // Override for AnnotationCollector::AddAnnotation.
void AddAnnotation(size_t begin_offset, size_t end_offset,
const std::string& file_path,
const std::vector<int>& path) override {
- typename AnnotationProto::Annotation* annotation =
- annotation_proto_->add_annotation();
+ auto* annotation = annotation_proto_->add_annotation();
for (int i = 0; i < path.size(); ++i) {
annotation->add_path(path[i]);
}
@@ -96,7 +111,7 @@
annotation->set_begin(begin_offset);
annotation->set_end(end_offset);
}
- // Override for AnnotationCollector::AddAnnotation.
+
void AddAnnotationNew(Annotation& a) override {
auto* annotation = annotation_proto_->add_annotation();
annotation->ParseFromString(a.second);
@@ -105,10 +120,202 @@
}
private:
- // The protocol buffer to which new annotations should be added.
- AnnotationProto* const annotation_proto_;
+ AnnotationProto* annotation_proto_;
};
+// A source code printer for assisting in code generation.
+//
+// This type implements a simple templating language for substiting variables
+// into static, user-provided strings, and also tracks indentation
+// automatically.
+//
+// The main entry-point for this type is the Emit function, which can be used
+// thus:
+//
+// Printer p(output);
+// p.Emit({{"class", my_class_name}}, R"cc(
+// class $class$ {
+// public:
+// $class$(int x) : x_(x) {}
+// private:
+// int x_;
+// };
+// )cc");
+//
+// Substitutions are of the form $var$, which is looked up in the map passed in
+// as the first argument. The variable delimiter character, $, can be chosen to
+// be something convenient for the target language. For example, in PHP, which
+// makes heavy use of $, it can be made into something like # instead.
+//
+// A literal $ can be emitted by writing $$.
+//
+// Substitutions may contain spaces around the name of the variable, which will
+// be ignored for the purposes of looking up the variable to substitute in, but
+// which will be reproduced in the output:
+//
+// p.Emit({{"foo", "bar"}}, "$ foo $");
+//
+// emits the string " bar ". If the substituted-in variable is the empty string,
+// then the surrounding spaces are *not* printed:
+//
+// p.Emit({{"xzy", xyz}}, "$xyz $Thing");
+//
+// If xyz is "Foo", this will become "Foo Thing", but if it is "", this becomes
+// "Thing", rather than " Thing". This helps minimize awkward whitespace in the
+// output.
+//
+// The value may be any type that can be stringified with `absl::StrCat`:
+//
+// p.Emit({{"num", 5}}, "x = $num$;");
+//
+// If a variable is referenced in the format string that is missing, the program
+// will crash. Callers must statically know that every variable reference is
+// valid, and MUST NOT pass user-provided strings directly into Emit().
+//
+// # Callback Substitution
+//
+// Instead of passing a string into Emit(), it is possible to pass in a callback
+// as a variable mapping. This will take indentation into account, which allows
+// factoring out parts of a formatting string while ensuring braces are
+// balanced:
+//
+// p.Emit(
+// {{"methods", [&] {
+// p.Emit(R"cc(
+// int Bar() {
+// return 42;
+// }
+// )cc");
+// }}},
+// R"cc(
+// class Foo {
+// public:
+// $methods$;
+// };
+// )cc"
+// );
+//
+// This emits
+//
+// class Foo {
+// public:
+// int Bar() {
+// return 42;
+// }
+// };
+//
+// # Lookup Frames
+//
+// If many calls to Emit() use the same set of variables, they can be stored
+// in a *variable lookup frame*, like so:
+//
+// auto vars = p.WithVars({{"class_name", my_class_name}});
+// p.Emit(R"cc(
+// class $class_name$ {
+// public:
+// $class_name$(int x);
+// // Etc.
+// };
+// )cc");
+//
+// WithVars() returns an RAII object that will "pop" the lookup frame on scope
+// exit, ensuring that the variables remain local. There are a few different
+// overloads of WithVars(); it accepts a map type, like absl::flat_hash_map,
+// either by-value (which will cause the Printer to store a copy), or by
+// pointer (which will cause the Printer to store a pointer, potentially
+// avoiding a copy.)
+//
+// p.Emit(vars, "..."); is effectively syntax sugar for
+//
+// { auto v = p.WithVars(vars); p.Emit("..."); }
+//
+// NOTE: callbacks are *not* allowed with WithVars; callbacks should be local
+// to a specific Emit() call.
+//
+// # Annotations
+//
+// If Printer is given an AnnotationCollector, it will use it to record which
+// spans of generated code correspond to user-indicated descriptors. There are
+// a few different ways of indicating when to emit annotations.
+//
+// The WithAnnotations() function is like WithVars(), but accepts maps with
+// string keys and descriptor values. It adds an annotation variable frame and
+// returns an RAII object that pops the frame.
+//
+// There are two different ways to annotate code. In the first, when
+// substituting a variable, if there is an annotation with the same name, then
+// the resulting expanded value's span will be annotated with that annotation.
+// For example:
+//
+// auto v = p.WithVars({{"class_name", my_class_name}});
+// auto a = p.WithAnnotations({{"class_name", message_descriptor}});
+// p.Emit(R"cc(
+// class $class_name$ {
+// public:
+// $class_name$(int x);
+// // Etc.
+// };
+// )cc");
+//
+// The span corresponding to whatever $class_name$ expands to will be annotated
+// as having come from message_descriptor.
+//
+// For convenience, this can be done with a single WithVars(), using the special
+// three-argument form:
+//
+// auto v = p.WithVars({{"class_name", my_class_name, message_descriptor}});
+// p.Emit(R"cc(
+// class $class_name$ {
+// public:
+// $class_name$(int x);
+// // Etc.
+// };
+// )cc");
+//
+//
+// Alternatively, a range may be given explicitly:
+//
+// auto a = p.WithAnnotations({{"my_desc", message_descriptor}});
+// p.Emit(R"cc(
+// $_start$my_desc$
+// class Foo {
+// // Etc.
+// };
+// $_end$my_desc$
+// )cc");
+//
+// The special $_start$ and $_end$ variables indicate the start and end of an
+// annotated span, which is annotated with the variable that follows. This
+// form can produce somewhat unreadable format strings and is not recommended.
+//
+// Note that whitespace after a $_start$ and before an $_end$ is not printed.
+//
+// # Indentation
+//
+// Printer tracks an indentation amount to add to each new line, independent
+// from indentation in an Emit() call's literal. The amount of indentation to
+// add is controlled by the WithIndent() function:
+//
+// p.Emit("class $class_name$ {");
+// {
+// auto indent = p.WithIndent();
+// p.Emit(R"cc(
+// public:
+// $class_name$(int x);
+// )cc");
+// }
+// p.Emit("};");
+//
+// This will automatically add one level of indentation to all code in scope of
+// `indent`, which is an RAII object much like the return value of `WithVars()`.
+//
+// # Old API
+// TODO(b/242326974): Delete this documentation.
+//
+// Printer supports an older-style API that is in the process of being
+// re-written. The old documentation is reproduced here until all use-cases are
+// handled.
+//
// This simple utility class assists in code generation. It basically
// allows the caller to define a set of variables and then output some
// text with variable substitutions. Example usage:
@@ -180,26 +387,310 @@
//
// This code associates the span covering "call(bar,bar)" in the output with the
// call_ descriptor.
-
class PROTOBUF_EXPORT Printer {
+ private:
+ // This type exists to work around an absl type that has not yet been
+ // released.
+ struct SourceLocation {
+ static SourceLocation current() { return {}; }
+ absl::string_view file_name() { return "<unknown>"; }
+ int line() { return 0; }
+ };
+
+ struct AnnotationRecord {
+ std::vector<int> path;
+ std::string file_path;
+
+ // AnnotationRecord's constructors are *not* marked as explicit,
+ // specifically so that it is possible to construct a
+ // map<string, AnnotationRecord> by writing
+ //
+ // {{"foo", my_cool_descriptor}, {"bar", "file.proto"}}
+
+ template <
+ typename String,
+ std::enable_if_t<std::is_convertible<const String&, std::string>::value,
+ int> = 0>
+ AnnotationRecord( // NOLINT(google-explicit-constructor)
+ const String& file_path)
+ : file_path(file_path) {}
+
+ template <typename Desc,
+ // This SFINAE clause excludes char* from matching this
+ // constructor.
+ std::enable_if_t<std::is_class<Desc>::value, int> = 0>
+ AnnotationRecord(const Desc* desc) // NOLINT(google-explicit-constructor)
+ : file_path(desc->file()->name()) {
+ desc->GetLocationPath(&path);
+ }
+ };
+
+ // Sink type for constructing values to pass to WithVars() and Emit().
+ template <typename K, bool allow_callbacks>
+ struct VarDefinition {
+ using StringOrCallback = absl::variant<std::string, std::function<void()>>;
+
+ template <typename Key, typename Value>
+ VarDefinition(Key&& key, Value&& value)
+ : key(std::forward<Key>(key)),
+ value(ToStringOrCallback(std::forward<Value>(value), Rank2{})),
+ annotation(absl::nullopt) {}
+
+ // NOTE: This is an overload rather than taking optional<AnnotationRecord>
+ // with a default argument of nullopt, because we want to pick up
+ // AnnotationRecord's user-defined conversions. Because going from
+ // e.g. Descriptor* -> optional<AnnotationRecord> requires two user-defined
+ // conversions, this does not work.
+ template <typename Key, typename Value>
+ VarDefinition(Key&& key, Value&& value, AnnotationRecord annotation)
+ : key(std::forward<Key>(key)),
+ value(ToStringOrCallback(std::forward<Value>(value), Rank2{})),
+ annotation(std::move(annotation)) {}
+
+ K key;
+ StringOrCallback value;
+ absl::optional<AnnotationRecord> annotation;
+
+ private:
+ // go/ranked-overloads
+ struct Rank0 {};
+ struct Rank1 : Rank0 {};
+ struct Rank2 : Rank1 {};
+
+ // Dummy template for delayed instantiation, which is required for the
+ // static assert below to kick in only when this function is called when it
+ // shouldn't.
+ //
+ // This is done to produce a better error message than the "candidate does
+ // not match" SFINAE errors.
+ template <bool allowed = allow_callbacks>
+ StringOrCallback ToStringOrCallback(std::function<void()> cb, Rank2) {
+ static_assert(
+ allowed, "callback-typed variables are not allowed in this location");
+ return cb;
+ }
+
+ // Separate from the AlphaNum overload to avoid copies when taking strings
+ // by value.
+ StringOrCallback ToStringOrCallback(std::string s, Rank1) { return s; }
+
+ StringOrCallback ToStringOrCallback(const absl::AlphaNum& s, Rank0) {
+ return std::string(s.Piece());
+ }
+ };
+
public:
- // Create a printer that writes text to the given output stream. Use the
- // given character as the delimiter for variables.
- Printer(ZeroCopyOutputStream* output, char variable_delimiter);
+ static constexpr char kDefaultVariableDelimiter = '$';
+ static constexpr absl::string_view kProtocCodegenTrace =
+ "PROTOC_CODEGEN_TRACE";
- // Create a printer that writes text to the given output stream. Use the
- // given character as the delimiter for variables. If annotation_collector
- // is not null, Printer will provide it with annotations about code written
- // to the stream. annotation_collector is not owned by Printer.
+ // Options for controlling how the output of a Printer is formatted.
+ struct Options {
+ Options() = default;
+ Options(const Options&) = default;
+ Options(Options&&) = default;
+ Options(char variable_delimiter, AnnotationCollector* annotation_collector)
+ : variable_delimiter(variable_delimiter),
+ annotation_collector(annotation_collector) {}
+
+ // The delimiter for variable substitutions, e.g. $foo$.
+ char variable_delimiter = kDefaultVariableDelimiter;
+ // An optional listener the Printer calls whenever it emits a source
+ // annotation; may be null.
+ AnnotationCollector* annotation_collector = nullptr;
+ // The "comment start" token for the language being generated. This is used
+ // to allow the Printer to emit debugging annotations in the source code
+ // output.
+ absl::string_view comment_start = "//";
+ // The number of spaces that a single level of indentation adds by default;
+ // this is the amount that WithIndent() increases indentation by.
+ size_t spaces_per_indent = 2;
+ // Whether to emit a "codegen trace" for calls to Emit(). If true, each call
+ // to Emit() will print a comment indicating where in the source of the
+ // compiler the Emit() call occurred.
+ //
+ // If disengaged, defaults to whether or not the environment variable
+ // `PROTOC_CODEGEN_TRACE` is set.
+ absl::optional<bool> enable_codegen_trace = absl::nullopt;
+ };
+
+ // Constructs a new Printer with the default options to output to
+ // `output`.
+ explicit Printer(ZeroCopyOutputStream* output) : Printer(output, Options{}) {}
+
+ // Constructs a new printer with the given set of options to output to
+ // `output`.
+ Printer(ZeroCopyOutputStream* output, Options options);
+
+ // Old-style constructor. Avoid in preference to the two constructors above.
+ //
+ // Will eventually be marked as deprecated.
Printer(ZeroCopyOutputStream* output, char variable_delimiter,
- AnnotationCollector* annotation_collector);
+ AnnotationCollector* annotation_collector = nullptr)
+ : Printer(output, Options{variable_delimiter, annotation_collector}) {}
- ~Printer();
+ Printer(const Printer&) = delete;
+ Printer& operator=(const Printer&) = delete;
+
+ // Pushes a new variable lookup frame that stores `vars` by reference.
+ //
+ // Returns an RAII object that pops the lookup frame.
+ template <typename Map>
+ auto WithVars(const Map* vars) {
+ var_lookups_.emplace_back([vars](absl::string_view var) -> LookupResult {
+ auto it = vars->find(std::string(var));
+ if (it == vars->end()) {
+ return absl::nullopt;
+ }
+ return absl::string_view(it->second);
+ });
+ return absl::MakeCleanup([this] { var_lookups_.pop_back(); });
+ }
+
+ // Pushes a new variable lookup frame that stores `vars` by value.
+ //
+ // When writing `WithVars({...})`, this is the overload that will be called,
+ // and it will synthesize an `absl::flat_hash_map`.
+ //
+ // Returns an RAII object that pops the lookup frame.
+ template <typename Map = absl::flat_hash_map<std::string, std::string>,
+ std::enable_if_t<!std::is_pointer<Map>::value, int> = 0>
+ auto WithVars(Map&& vars) {
+ var_lookups_.emplace_back([vars = std::forward<Map>(vars)](
+ absl::string_view var) -> LookupResult {
+ auto it = vars.find(std::string(var));
+ if (it == vars.end()) {
+ return absl::nullopt;
+ }
+ return absl::string_view(it->second);
+ });
+ return absl::MakeCleanup([this] { var_lookups_.pop_back(); });
+ }
+
+ auto WithVars(std::initializer_list<
+ VarDefinition<std::string, /*allow_callbacks=*/false>>
+ vars);
+
+ // Looks up a variable set with WithVars().
+ //
+ // Will crash if:
+ // - `var` is not present in the lookup frame table.
+ // - `var` is a callback, rather than a string.
+ absl::string_view LookupVar(absl::string_view var);
+
+ // Pushes a new annotation lookup frame that stores `vars` by reference.
+ //
+ // Returns an RAII object that pops the lookup frame.
+ template <typename Map>
+ auto WithAnnotations(const Map* vars) {
+ annotation_lookups_.emplace_back(
+ [vars](absl::string_view var) -> absl::optional<AnnotationRecord> {
+ auto it = vars->find(std::string(var));
+ if (it == vars->end()) {
+ return absl::nullopt;
+ }
+ return AnnotationRecord(it->second);
+ });
+ return absl::MakeCleanup([this] { annotation_lookups_.pop_back(); });
+ }
+
+ // Pushes a new variable lookup frame that stores `vars` by value.
+ //
+ // When writing `WithAnnotations({...})`, this is the overload that will be
+ // called, and it will synthesize an `absl::flat_hash_map`.
+ //
+ // Returns an RAII object that pops the lookup frame.
+ template <typename Map = absl::flat_hash_map<std::string, AnnotationRecord>>
+ auto WithAnnotations(Map&& vars) {
+ annotation_lookups_.emplace_back(
+ [vars = std::forward<Map>(vars)](
+ absl::string_view var) -> absl::optional<AnnotationRecord> {
+ auto it = vars.find(std::string(var));
+ if (it == vars.end()) {
+ return absl::nullopt;
+ }
+ return AnnotationRecord(it->second);
+ });
+ return absl::MakeCleanup([this] { annotation_lookups_.pop_back(); });
+ }
+
+ // Increases the indentation by `indent` spaces; when nullopt, increments
+ // indentation by the configured default spaces_per_indent.
+ //
+ // Returns an RAII object that removes this indentation.
+ auto WithIndent(absl::optional<size_t> indent = absl::nullopt) {
+ size_t delta = indent.value_or(options_.spaces_per_indent);
+ indent_ += delta;
+ return absl::MakeCleanup([this, delta] { indent_ -= delta; });
+ }
+
+ // Emits formatted source code to the underlying output. See the class
+ // documentation for more details.
+ //
+ // `format` MUST be a string constant.
+ void Emit(absl::string_view format,
+ SourceLocation loc = SourceLocation::current()) {
+ Emit({}, format, loc);
+ }
+
+ // Emits formatted source code to the underlying output, injecting
+ // additional variables as a lookup frame for just this call. See the class
+ // documentation for more details.
+ //
+ // `format` MUST be a string constant.
+ void Emit(std::initializer_list<
+ VarDefinition<absl::string_view, /*allow_callbacks=*/true>>
+ vars,
+ absl::string_view format,
+ SourceLocation loc = SourceLocation::current());
+
+ // Write a string directly to the underlying output, performing no formatting
+ // of any sort.
+ void PrintRaw(absl::string_view data) { WriteRaw(data.data(), data.size()); }
+
+ // Write a string directly to the underlying output, performing no formatting
+ // of any sort.
+ void WriteRaw(const char* data, size_t size);
+
+ // True if any write to the underlying stream failed. (We don't just
+ // crash in this case because this is an I/O failure, not a programming
+ // error.)
+ bool failed() const { return failed_; }
+
+ // -- Old-style API below; to be deprecated and removed. --
+ // TODO(b/242326974): Deprecate these APIs.
+
+ template <typename Map = absl::flat_hash_map<std::string, std::string>>
+ void Print(const Map& vars, absl::string_view text) {
+ PrintOptions opts;
+ opts.checks_are_debug_only = true;
+ opts.use_substitution_map = true;
+ opts.allow_digit_substitions = false;
+
+ auto pop = WithVars(&vars);
+ PrintImpl(text, {}, opts);
+ }
+
+ template <typename... Args>
+ void Print(absl::string_view text, const Args&... args) {
+ static_assert(sizeof...(args) % 2 == 0, "");
+
+ // Include an extra arg, since a zero-length array is ill-formed, and
+ // MSVC complains.
+ absl::string_view vars[] = {args..., ""};
+ absl::flat_hash_map<std::string, std::string> map;
+ map.reserve(sizeof...(args) / 2);
+ for (size_t i = 0; i < sizeof...(args); i += 2) {
+ map.emplace(std::string(vars[i]), std::string(vars[i + 1]));
+ }
+
+ Print(map, text);
+ }
// Link a substitution variable emitted by the last call to Print to the
// object described by descriptor.
template <typename SomeDescriptor>
- void Annotate(const char* varname, const SomeDescriptor* descriptor) {
+ void Annotate(absl::string_view varname, const SomeDescriptor* descriptor) {
Annotate(varname, varname, descriptor);
}
@@ -208,13 +699,12 @@
// begins at begin_varname's value and ends after the last character of the
// value substituted for end_varname.
template <typename SomeDescriptor>
- void Annotate(const char* begin_varname, const char* end_varname,
+ void Annotate(absl::string_view begin_varname, absl::string_view end_varname,
const SomeDescriptor* descriptor) {
- if (annotation_collector_ == NULL) {
- // Annotations aren't turned on for this Printer, so don't pay the cost
- // of building the location path.
+ if (options_.annotation_collector == nullptr) {
return;
}
+
std::vector<int> path;
descriptor->GetLocationPath(&path);
Annotate(begin_varname, end_varname, descriptor->file()->name(), path);
@@ -222,7 +712,7 @@
// Link a substitution variable emitted by the last call to Print to the file
// with path file_name.
- void Annotate(const char* varname, const std::string& file_name) {
+ void Annotate(absl::string_view varname, absl::string_view file_name) {
Annotate(varname, varname, file_name);
}
@@ -230,158 +720,203 @@
// the last call to Print to the file with path file_name. The range begins
// at begin_varname's value and ends after the last character of the value
// substituted for end_varname.
- void Annotate(const char* begin_varname, const char* end_varname,
- const std::string& file_name) {
- if (annotation_collector_ == NULL) {
- // Annotations aren't turned on for this Printer.
+ void Annotate(absl::string_view begin_varname, absl::string_view end_varname,
+ absl::string_view file_name) {
+ if (options_.annotation_collector == nullptr) {
return;
}
- std::vector<int> empty_path;
- Annotate(begin_varname, end_varname, file_name, empty_path);
+
+ Annotate(begin_varname, end_varname, file_name, {});
}
- // Print some text after applying variable substitutions. If a particular
- // variable in the text is not defined, this will crash. Variables to be
- // substituted are identified by their names surrounded by delimiter
- // characters (as given to the constructor). The variable bindings are
- // defined by the given map.
- void Print(const std::map<std::string, std::string>& variables,
- const char* text);
+ // Indent text by `options.spaces_per_indent`; undone by Outdent().
+ void Indent() { indent_ += options_.spaces_per_indent; }
- // Like the first Print(), except the substitutions are given as parameters.
- template <typename... Args>
- void Print(const char* text, const Args&... args) {
- std::map<std::string, std::string> vars;
- PrintInternal(&vars, text, args...);
- }
-
- // Indent text by two spaces. After calling Indent(), two spaces will be
- // inserted at the beginning of each line of text. Indent() may be called
- // multiple times to produce deeper indents.
- void Indent();
-
- // Reduces the current indent level by two spaces, or crashes if the indent
- // level is zero.
+ // Undoes a call to Indent().
void Outdent();
- // Write a string to the output buffer.
- // This method does not look for newlines to add indentation.
- void PrintRaw(const std::string& data);
-
- // Write a zero-delimited string to output buffer.
- // This method does not look for newlines to add indentation.
- void PrintRaw(const char* data);
-
- // Write some bytes to the output buffer.
- // This method does not look for newlines to add indentation.
- void WriteRaw(const char* data, int size);
-
// FormatInternal is a helper function not meant to use directly, use
- // compiler::cpp::Formatter instead. This function is meant to support
- // formatting text using named variables (eq. "$foo$) from a lookup map (vars)
- // and variables directly supplied by arguments (eq "$1$" meaning first
- // argument which is the zero index element of args).
- void FormatInternal(const std::vector<std::string>& args,
+ // compiler::cpp::Formatter instead.
+ void FormatInternal(absl::Span<const std::string> args,
const std::map<std::string, std::string>& vars,
- const char* format);
+ absl::string_view format) {
+ PrintOptions opts;
+ opts.use_curly_brace_substitutions = true;
+ opts.strip_spaces_around_vars = true;
- // True if any write to the underlying stream failed. (We don't just
- // crash in this case because this is an I/O failure, not a programming
- // error.)
- bool failed() const { return failed_; }
+ auto pop = WithVars(&vars);
+ PrintImpl(format, args, opts);
+ }
private:
- // Link the output range defined by the substitution variables as emitted by
- // the last call to Print to the object found at the SourceCodeInfo-style path
- // in a file with path file_path. The range begins at the start of
- // begin_varname's value and ends after the last character of the value
- // substituted for end_varname. Note that begin_varname and end_varname
- // may refer to the same variable.
- void Annotate(const char* begin_varname, const char* end_varname,
- const std::string& file_path, const std::vector<int>& path);
+ // Options for PrintImpl().
+ struct PrintOptions {
+ // The callsite of the public entry-point. Only Emit() sets this.
+ absl::optional<SourceLocation> loc;
+ // If set, Validate() calls will not crash the program.
+ bool checks_are_debug_only = false;
+ // If set, the `substitutions_` map will be populated as variables are
+ // substituted.
+ bool use_substitution_map = false;
+ // If set, the ${1$ and $}$ forms will be substituted. These are used for
+ // a slightly janky annotation-insertion mechanism in FormatInternal, that
+ // requires that passed-in substitution variables be serialized protos.
+ bool use_curly_brace_substitutions = false;
+ // If set, the $n$ forms will be substituted, pulling from the `args`
+ // argument to PrintImpl().
+ bool allow_digit_substitions = true;
+ // If set, when a variable substitution with spaces in it, such as $ var$,
+ // is encountered, the spaces are stripped, so that it is as if it was
+ // $var$. If $var$ substitutes to a non-empty string, the removed spaces are
+ // printed around the substituted value.
+ //
+ // See the class documentation for more information on this behavior.
+ bool strip_spaces_around_vars = true;
+ // If set, leading whitespace will be stripped from the format string to
+ // determine the "extraneous indentation" that is produced when the format
+ // string is a C++ raw string. This is used to remove leading spaces from
+ // a raw string that would otherwise result in erratic indentation in the
+ // output.
+ bool strip_raw_string_indentation = false;
+ // If set, the annotation lookup frames are searched, per the annotation
+ // semantics of Emit() described in the class documentation.
+ bool use_annotation_frames = true;
+ };
- // Base case
- void PrintInternal(std::map<std::string, std::string>* vars,
- const char* text) {
- Print(*vars, text);
- }
+ // Emit an annotation for the range defined by the given substitution
+ // variables, as set by the most recent call to PrintImpl() that set
+ // `use_substitution_map` to true.
+ //
+ // The range begins at the start of `begin_varname`'s value and ends after the
+ // last byte of `end_varname`'s value.
+ //
+ // `begin_varname` and `end_varname may` refer to the same variable.
+ void Annotate(absl::string_view begin_varname, absl::string_view end_varname,
+ absl::string_view file_path, const std::vector<int>& path);
- template <typename... Args>
- void PrintInternal(std::map<std::string, std::string>* vars, const char* text,
- const char* key, const std::string& value,
- const Args&... args) {
- (*vars)[key] = value;
- PrintInternal(vars, text, args...);
- }
+ // The core printing implementation. There are three public entry points,
+ // which enable different slices of functionality that are controlled by the
+ // `opts` argument.
+ void PrintImpl(absl::string_view format, absl::Span<const std::string> args,
+ PrintOptions opts);
- // Copy size worth of bytes from data to buffer_.
- void CopyToBuffer(const char* data, int size);
+ // This is a private function only so that it can see PrintOptions.
+ static bool Validate(bool cond, PrintOptions opts,
+ absl::FunctionRef<std::string()> message);
+ static bool Validate(bool cond, PrintOptions opts, absl::string_view message);
- void push_back(char c) {
- if (failed_) return;
- if (buffer_size_ == 0) {
- if (!Next()) return;
- }
- *buffer_++ = c;
- buffer_size_--;
- offset_++;
- }
+ // Performs calls to `Validate()` to check that `index < current_arg_index`
+ // and `index < args_len`, producing appropriate log lines if the checks fail,
+ // and crashing if necessary.
+ bool ValidateIndexLookupInBounds(size_t index, size_t current_arg_index,
+ size_t args_len, PrintOptions opts);
- bool Next();
+ // Prints indentation if `at_start_of_line_` is true.
+ void IndentIfAtStart();
- inline void IndentIfAtStart();
- const char* WriteVariable(
- const std::vector<std::string>& args,
- const std::map<std::string, std::string>& vars, const char* format,
- int* arg_index,
- std::vector<AnnotationCollector::Annotation>* annotations);
+ // Prints a codegen trace, for the given location in the compiler's source.
+ void PrintCodegenTrace(absl::optional<SourceLocation> loc);
- const char variable_delimiter_;
+ // The core implementation for "fully-elaborated" variable definitions. This
+ // is a private function to avoid users being able to set `allow_callbacks`.
+ template <typename K, bool allow_callbacks>
+ auto WithDefs(std::initializer_list<VarDefinition<K, allow_callbacks>> vars);
- ZeroCopyOutputStream* const output_;
- char* buffer_;
- int buffer_size_;
- // The current position, in bytes, in the output stream. This is equivalent
- // to the total number of bytes that have been written so far. This value is
- // used to calculate annotation ranges in the substitutions_ map below.
- size_t offset_;
+ // Returns the start and end of the value that was substituted in place of
+ // the variable `varname` in the last call to PrintImpl() (with
+ // `use_substitution_map` set), if such a variable was substituted exactly
+ // once.
+ absl::optional<std::pair<size_t, size_t>> GetSubstitutionRange(
+ absl::string_view varname, PrintOptions opts);
- std::string indent_;
- bool at_start_of_line_;
- bool failed_;
+ google::protobuf::io::zc_sink_internal::ZeroCopyStreamByteSink sink_;
+ Options options_;
+ size_t indent_ = 0;
+ bool at_start_of_line_ = true;
+ bool failed_ = false;
+
+ using LookupResult =
+ absl::optional<absl::variant<absl::string_view, std::function<void()>>>;
+
+ std::vector<std::function<LookupResult(absl::string_view)>> var_lookups_;
+
+ std::vector<
+ std::function<absl::optional<AnnotationRecord>(absl::string_view)>>
+ annotation_lookups_;
// A map from variable name to [start, end) offsets in the output buffer.
- // These refer to the offsets used for a variable after the last call to
- // Print. If a variable was used more than once, the entry used in
- // this map is set to a negative-length span. For singly-used variables, the
- // start offset is the beginning of the substitution; the end offset is the
- // last byte of the substitution plus one (such that (end - start) is the
- // length of the substituted string).
- std::map<std::string, std::pair<size_t, size_t> > substitutions_;
-
- // Keeps track of the keys in substitutions_ that need to be updated when
+ //
+ // This stores the data looked up by GetSubstitutionRange().
+ std::map<std::string, std::pair<size_t, size_t>> substitutions_;
+ // Keeps track of the keys in `substitutions_` that need to be updated when
// indents are inserted. These are keys that refer to the beginning of the
// current line.
std::vector<std::string> line_start_variables_;
-
- // Returns true and sets range to the substitution range in the output for
- // varname if varname was used once in the last call to Print. If varname
- // was not used, or if it was used multiple times, returns false (and
- // fails a debug assertion).
- bool GetSubstitutionRange(const char* varname,
- std::pair<size_t, size_t>* range);
-
- // If non-null, annotation_collector_ is used to store annotations about
- // generated code.
- AnnotationCollector* const annotation_collector_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Printer);
};
+template <typename K, bool allow_callbacks>
+auto Printer::WithDefs(
+ std::initializer_list<VarDefinition<K, allow_callbacks>> vars) {
+ absl::flat_hash_map<K, absl::variant<std::string, std::function<void()>>>
+ var_map;
+ var_map.reserve(vars.size());
+
+ absl::flat_hash_map<K, AnnotationRecord> annotation_map;
+
+ for (auto& var : vars) {
+ auto result = var_map.insert({var.key, var.value});
+ GOOGLE_CHECK(result.second) << "repeated variable in Emit() or WithVars() call: \""
+ << var.key << "\"";
+ if (var.annotation.has_value()) {
+ annotation_map.insert({var.key, *var.annotation});
+ }
+ }
+
+ var_lookups_.emplace_back(
+ [map = std::move(var_map)](absl::string_view var) -> LookupResult {
+ auto it = map.find(var);
+ if (it == map.end()) {
+ return absl::nullopt;
+ }
+ if (auto* str = absl::get_if<std::string>(&it->second)) {
+ return *str;
+ }
+
+ auto* f = absl::get_if<std::function<void()>>(&it->second);
+ GOOGLE_CHECK(f != nullptr);
+ return *f;
+ });
+
+ bool has_annotations = !annotation_map.empty();
+ if (has_annotations) {
+ annotation_lookups_.emplace_back(
+ [map = std::move(annotation_map)](
+ absl::string_view var) -> absl::optional<AnnotationRecord> {
+ auto it = map.find(var);
+ if (it == map.end()) {
+ return absl::nullopt;
+ }
+ return it->second;
+ });
+ }
+
+ return absl::MakeCleanup([this, has_annotations] {
+ var_lookups_.pop_back();
+ if (has_annotations) {
+ annotation_lookups_.pop_back();
+ }
+ });
+}
+
+inline auto Printer::WithVars(
+ std::initializer_list<VarDefinition<std::string, /*allow_callbacks=*/false>>
+ vars) {
+ return WithDefs(vars);
+}
} // namespace io
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_IO_PRINTER_H__
diff --git a/src/google/protobuf/io/printer_death_test.cc b/src/google/protobuf/io/printer_death_test.cc
new file mode 100644
index 0000000..5497168
--- /dev/null
+++ b/src/google/protobuf/io/printer_death_test.cc
@@ -0,0 +1,174 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Author: kenton@google.com (Kenton Varda)
+// Based on original Protocol Buffers design by
+// Sanjay Ghemawat, Jeff Dean, and others.
+
+#include "google/protobuf/io/printer.h"
+
+#include <ostream>
+#include <string>
+#include <tuple>
+#include <vector>
+
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/descriptor.pb.h"
+#include <gmock/gmock.h>
+#include "google/protobuf/testing/googletest.h"
+#include <gtest/gtest.h>
+#include "absl/container/flat_hash_map.h"
+#include "absl/strings/str_join.h"
+#include "absl/strings/string_view.h"
+#include "google/protobuf/io/zero_copy_stream.h"
+#include "google/protobuf/io/zero_copy_stream_impl.h"
+#include "google/protobuf/io/zero_copy_stream_impl_lite.h"
+
+namespace google {
+namespace protobuf {
+namespace io {
+class PrinterTest : public testing::Test {
+ protected:
+ ZeroCopyOutputStream* output() {
+ GOOGLE_CHECK(stream_.has_value());
+ return &*stream_;
+ }
+ absl::string_view written() {
+ stream_.reset();
+ return out_;
+ }
+
+ std::string out_;
+ absl::optional<StringOutputStream> stream_{&out_};
+};
+
+// FakeDescriptorFile defines only those members that Printer uses to write out
+// annotations.
+struct FakeDescriptorFile {
+ const std::string& name() const { return filename; }
+ std::string filename;
+};
+
+// FakeDescriptor defines only those members that Printer uses to write out
+// annotations.
+struct FakeDescriptor {
+ const FakeDescriptorFile* file() const { return &fake_file; }
+ void GetLocationPath(std::vector<int>* output) const { *output = path; }
+
+ FakeDescriptorFile fake_file;
+ std::vector<int> path;
+};
+
+class FakeAnnotationCollector : public AnnotationCollector {
+ public:
+ ~FakeAnnotationCollector() override = default;
+
+ void AddAnnotation(size_t begin_offset, size_t end_offset,
+ const std::string& file_path,
+ const std::vector<int>& path) override {
+ }
+};
+
+#ifdef PROTOBUF_HAS_DEATH_TEST
+TEST_F(PrinterTest, Death) {
+ Printer printer(output(), '$');
+
+ EXPECT_DEBUG_DEATH(printer.Print("$nosuchvar$"), "");
+ EXPECT_DEBUG_DEATH(printer.Print("$unclosed"), "");
+ EXPECT_DEBUG_DEATH(printer.Outdent(), "");
+}
+
+TEST_F(PrinterTest, AnnotateMultipleUsesDeath) {
+ FakeAnnotationCollector collector;
+ Printer printer(output(), '$', &collector);
+ printer.Print("012$foo$4$foo$\n", "foo", "3");
+
+ FakeDescriptor descriptor{{"path"}, {33}};
+ EXPECT_DEBUG_DEATH(printer.Annotate("foo", "foo", &descriptor), "");
+}
+
+TEST_F(PrinterTest, AnnotateNegativeLengthDeath) {
+ FakeAnnotationCollector collector;
+ Printer printer(output(), '$', &collector);
+ printer.Print("012$foo$4$bar$\n", "foo", "3", "bar", "5");
+
+ FakeDescriptor descriptor{{"path"}, {33}};
+ EXPECT_DEBUG_DEATH(printer.Annotate("bar", "foo", &descriptor), "");
+}
+
+TEST_F(PrinterTest, AnnotateUndefinedDeath) {
+ FakeAnnotationCollector collector;
+ Printer printer(output(), '$', &collector);
+ printer.Print("012$foo$4$foo$\n", "foo", "3");
+
+ FakeDescriptor descriptor{{"path"}, {33}};
+ EXPECT_DEBUG_DEATH(printer.Annotate("bar", "bar", &descriptor), "");
+}
+
+TEST_F(PrinterTest, FormatInternalUnusedArgs) {
+ FakeAnnotationCollector collector;
+ Printer printer(output(), '$', &collector);
+
+ EXPECT_DEATH(printer.FormatInternal({"arg1", "arg2"}, {}, "$1$"), "");
+}
+
+TEST_F(PrinterTest, FormatInternalOutOfOrderArgs) {
+ FakeAnnotationCollector collector;
+ Printer printer(output(), '$', &collector);
+
+ EXPECT_DEATH(printer.FormatInternal({"arg1", "arg2"}, {}, "$2$ $1$"), "");
+}
+
+TEST_F(PrinterTest, FormatInternalZeroArg) {
+ FakeAnnotationCollector collector;
+ Printer printer(output(), '$', &collector);
+
+ EXPECT_DEATH(printer.FormatInternal({"arg1", "arg2"}, {}, "$0$"), "");
+}
+
+TEST_F(PrinterTest, FormatInternalOutOfBounds) {
+ FakeAnnotationCollector collector;
+ Printer printer(output(), '$', &collector);
+
+ EXPECT_DEATH(printer.FormatInternal({"arg1", "arg2"}, {}, "$1$ $2$ $3$"), "");
+}
+
+TEST_F(PrinterTest, FormatInternalUnknownVar) {
+ FakeAnnotationCollector collector;
+ Printer printer(output(), '$', &collector);
+
+ EXPECT_DEATH(printer.FormatInternal({}, {}, "$huh$"), "");
+ EXPECT_DEATH(printer.FormatInternal({}, {}, "$ $"), "");
+}
+#endif // PROTOBUF_HAS_DEATH_TEST
+} // namespace io
+} // namespace protobuf
+} // namespace google
diff --git a/src/google/protobuf/io/printer_unittest.cc b/src/google/protobuf/io/printer_unittest.cc
index ed54d1d..4e2dd7a 100644
--- a/src/google/protobuf/io/printer_unittest.cc
+++ b/src/google/protobuf/io/printer_unittest.cc
@@ -32,530 +32,388 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/io/printer.h>
+#include "google/protobuf/io/printer.h"
+#include <ostream>
+#include <string>
+#include <tuple>
#include <vector>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/testing/googletest.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/descriptor.pb.h"
+#include <gmock/gmock.h>
+#include "google/protobuf/testing/googletest.h"
#include <gtest/gtest.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
+#include "absl/container/flat_hash_map.h"
+#include "absl/strings/str_join.h"
+#include "absl/strings/string_view.h"
+#include "google/protobuf/io/zero_copy_stream.h"
+#include "google/protobuf/io/zero_copy_stream_impl.h"
+#include "google/protobuf/io/zero_copy_stream_impl_lite.h"
namespace google {
namespace protobuf {
namespace io {
+using ::testing::AllOf;
+using ::testing::ElementsAre;
+using ::testing::ExplainMatchResult;
+using ::testing::Field;
+using ::testing::IsEmpty;
+using ::testing::MatchesRegex;
-// Each test repeats over several block sizes in order to test both cases
-// where particular writes cross a buffer boundary and cases where they do
-// not.
-
-TEST(Printer, EmptyPrinter) {
- char buffer[8192];
- const int block_size = 100;
- ArrayOutputStream output(buffer, GOOGLE_ARRAYSIZE(buffer), block_size);
- Printer printer(&output, '\0');
- EXPECT_TRUE(!printer.failed());
-}
-
-TEST(Printer, BasicPrinting) {
- char buffer[8192];
-
- for (int block_size = 1; block_size < 512; block_size *= 2) {
- ArrayOutputStream output(buffer, sizeof(buffer), block_size);
-
- {
- Printer printer(&output, '\0');
-
- printer.Print("Hello World!");
- printer.Print(" This is the same line.\n");
- printer.Print("But this is a new one.\nAnd this is another one.");
-
- EXPECT_FALSE(printer.failed());
- }
-
- buffer[output.ByteCount()] = '\0';
-
- EXPECT_STREQ(
- "Hello World! This is the same line.\n"
- "But this is a new one.\n"
- "And this is another one.",
- buffer);
+class PrinterTest : public testing::Test {
+ protected:
+ ZeroCopyOutputStream* output() {
+ GOOGLE_CHECK(stream_.has_value());
+ return &*stream_;
}
-}
-
-TEST(Printer, WriteRaw) {
- char buffer[8192];
-
- for (int block_size = 1; block_size < 512; block_size *= 2) {
- ArrayOutputStream output(buffer, sizeof(buffer), block_size);
-
- {
- std::string string_obj = "From an object\n";
- Printer printer(&output, '$');
- printer.WriteRaw("Hello World!", 12);
- printer.PrintRaw(" This is the same line.\n");
- printer.PrintRaw("But this is a new one.\nAnd this is another one.");
- printer.WriteRaw("\n", 1);
- printer.PrintRaw(string_obj);
- EXPECT_FALSE(printer.failed());
- }
-
- buffer[output.ByteCount()] = '\0';
-
- EXPECT_STREQ(
- "Hello World! This is the same line.\n"
- "But this is a new one.\n"
- "And this is another one."
- "\n"
- "From an object\n",
- buffer);
+ absl::string_view written() {
+ stream_.reset();
+ return out_;
}
+
+ std::string out_;
+ absl::optional<StringOutputStream> stream_{&out_};
+};
+
+TEST_F(PrinterTest, EmptyPrinter) {
+ Printer printer(output(), '\0');
+ EXPECT_FALSE(printer.failed());
}
-TEST(Printer, VariableSubstitution) {
- char buffer[8192];
-
- for (int block_size = 1; block_size < 512; block_size *= 2) {
- ArrayOutputStream output(buffer, sizeof(buffer), block_size);
-
- {
- Printer printer(&output, '$');
- std::map<std::string, std::string> vars;
-
- vars["foo"] = "World";
- vars["bar"] = "$foo$";
- vars["abcdefg"] = "1234";
-
- printer.Print(vars, "Hello $foo$!\nbar = $bar$\n");
- printer.PrintRaw("RawBit\n");
- printer.Print(vars, "$abcdefg$\nA literal dollar sign: $$");
-
- vars["foo"] = "blah";
- printer.Print(vars, "\nNow foo = $foo$.");
-
- EXPECT_FALSE(printer.failed());
- }
-
- buffer[output.ByteCount()] = '\0';
-
- EXPECT_STREQ(
- "Hello World!\n"
- "bar = $foo$\n"
- "RawBit\n"
- "1234\n"
- "A literal dollar sign: $\n"
- "Now foo = blah.",
- buffer);
- }
-}
-
-TEST(Printer, InlineVariableSubstitution) {
- char buffer[8192];
-
- ArrayOutputStream output(buffer, sizeof(buffer));
-
+TEST_F(PrinterTest, BasicPrinting) {
{
- Printer printer(&output, '$');
+ Printer printer(output(), '\0');
+
+ printer.Print("Hello World!");
+ printer.Print(" This is the same line.\n");
+ printer.Print("But this is a new one.\nAnd this is another one.");
+ EXPECT_FALSE(printer.failed());
+ }
+
+ EXPECT_EQ(written(),
+ "Hello World! This is the same line.\n"
+ "But this is a new one.\n"
+ "And this is another one.");
+}
+
+TEST_F(PrinterTest, WriteRaw) {
+ {
+ absl::string_view string_obj = "From an object\n";
+ Printer printer(output(), '$');
+ printer.WriteRaw("Hello World!", 12);
+ printer.PrintRaw(" This is the same line.\n");
+ printer.PrintRaw("But this is a new one.\nAnd this is another one.");
+ printer.WriteRaw("\n", 1);
+ printer.PrintRaw(string_obj);
+ EXPECT_FALSE(printer.failed());
+ }
+
+ EXPECT_EQ(written(),
+ "Hello World! This is the same line.\n"
+ "But this is a new one.\n"
+ "And this is another one."
+ "\n"
+ "From an object\n");
+}
+
+TEST_F(PrinterTest, VariableSubstitution) {
+ {
+ Printer printer(output(), '$');
+
+ absl::flat_hash_map<std::string, std::string> vars{
+ {"foo", "World"},
+ {"bar", "$foo$"},
+ {"abcdefg", "1234"},
+ };
+
+ printer.Print(vars, "Hello $foo$!\nbar = $bar$\n");
+ printer.PrintRaw("RawBit\n");
+ printer.Print(vars, "$abcdefg$\nA literal dollar sign: $$");
+
+ vars["foo"] = "blah";
+ printer.Print(vars, "\nNow foo = $foo$.");
+
+ EXPECT_FALSE(printer.failed());
+ }
+
+ EXPECT_EQ(written(),
+ "Hello World!\n"
+ "bar = $foo$\n"
+ "RawBit\n"
+ "1234\n"
+ "A literal dollar sign: $\n"
+ "Now foo = blah.");
+}
+
+TEST_F(PrinterTest, InlineVariableSubstitution) {
+ {
+ Printer printer(output(), '$');
printer.Print("Hello $foo$!\n", "foo", "World");
printer.PrintRaw("RawBit\n");
printer.Print("$foo$ $bar$\n", "foo", "one", "bar", "two");
EXPECT_FALSE(printer.failed());
}
- buffer[output.ByteCount()] = '\0';
-
- EXPECT_STREQ(
- "Hello World!\n"
- "RawBit\n"
- "one two\n",
- buffer);
+ EXPECT_EQ(written(),
+ "Hello World!\n"
+ "RawBit\n"
+ "one two\n");
}
-// MockDescriptorFile defines only those members that Printer uses to write out
+// FakeDescriptorFile defines only those members that Printer uses to write out
// annotations.
-class MockDescriptorFile {
- public:
- explicit MockDescriptorFile(const std::string& file) : file_(file) {}
-
- // The mock filename for this file.
- const std::string& name() const { return file_; }
-
- private:
- std::string file_;
+struct FakeDescriptorFile {
+ const std::string& name() const { return filename; }
+ std::string filename;
};
-// MockDescriptor defines only those members that Printer uses to write out
+// FakeDescriptor defines only those members that Printer uses to write out
// annotations.
-class MockDescriptor {
- public:
- MockDescriptor(const std::string& file, const std::vector<int>& path)
- : file_(file), path_(path) {}
+struct FakeDescriptor {
+ const FakeDescriptorFile* file() const { return &fake_file; }
+ void GetLocationPath(std::vector<int>* output) const { *output = path; }
- // The mock file in which this descriptor was defined.
- const MockDescriptorFile* file() const { return &file_; }
-
- private:
- // Allows access to GetLocationPath.
- friend class Printer;
-
- // Copies the pre-stored path to output.
- void GetLocationPath(std::vector<int>* output) const { *output = path_; }
-
- MockDescriptorFile file_;
- std::vector<int> path_;
+ FakeDescriptorFile fake_file;
+ std::vector<int> path;
};
-TEST(Printer, AnnotateMap) {
- char buffer[8192];
- ArrayOutputStream output(buffer, sizeof(buffer));
- GeneratedCodeInfo info;
- AnnotationProtoCollector<GeneratedCodeInfo> info_collector(&info);
- {
- Printer printer(&output, '$', &info_collector);
- std::map<std::string, std::string> vars;
- vars["foo"] = "3";
- vars["bar"] = "5";
- printer.Print(vars, "012$foo$4$bar$\n");
- std::vector<int> path_1;
- path_1.push_back(33);
- std::vector<int> path_2;
- path_2.push_back(11);
- path_2.push_back(22);
- MockDescriptor descriptor_1("path_1", path_1);
- MockDescriptor descriptor_2("path_2", path_2);
- printer.Annotate("foo", "foo", &descriptor_1);
- printer.Annotate("bar", "bar", &descriptor_2);
+class FakeAnnotationCollector : public AnnotationCollector {
+ public:
+ ~FakeAnnotationCollector() override = default;
+
+ // Records that the bytes in file_path beginning with begin_offset and ending
+ // before end_offset are associated with the SourceCodeInfo-style path.
+ void AddAnnotation(size_t begin_offset, size_t end_offset,
+ const std::string& file_path,
+ const std::vector<int>& path) override {
+ annotations_.emplace_back(
+ Record{begin_offset, end_offset, file_path, path});
}
- buffer[output.ByteCount()] = '\0';
- EXPECT_STREQ("012345\n", buffer);
- ASSERT_EQ(2, info.annotation_size());
- const GeneratedCodeInfo::Annotation* foo = info.annotation(0).path_size() == 1
- ? &info.annotation(0)
- : &info.annotation(1);
- const GeneratedCodeInfo::Annotation* bar = info.annotation(0).path_size() == 1
- ? &info.annotation(1)
- : &info.annotation(0);
- ASSERT_EQ(1, foo->path_size());
- ASSERT_EQ(2, bar->path_size());
- EXPECT_EQ(33, foo->path(0));
- EXPECT_EQ(11, bar->path(0));
- EXPECT_EQ(22, bar->path(1));
- EXPECT_EQ("path_1", foo->source_file());
- EXPECT_EQ("path_2", bar->source_file());
- EXPECT_EQ(3, foo->begin());
- EXPECT_EQ(4, foo->end());
- EXPECT_EQ(5, bar->begin());
- EXPECT_EQ(6, bar->end());
-}
-TEST(Printer, AnnotateInline) {
- char buffer[8192];
- ArrayOutputStream output(buffer, sizeof(buffer));
- GeneratedCodeInfo info;
- AnnotationProtoCollector<GeneratedCodeInfo> info_collector(&info);
- {
- Printer printer(&output, '$', &info_collector);
- printer.Print("012$foo$4$bar$\n", "foo", "3", "bar", "5");
- std::vector<int> path_1;
- path_1.push_back(33);
- std::vector<int> path_2;
- path_2.push_back(11);
- path_2.push_back(22);
- MockDescriptor descriptor_1("path_1", path_1);
- MockDescriptor descriptor_2("path_2", path_2);
- printer.Annotate("foo", "foo", &descriptor_1);
- printer.Annotate("bar", "bar", &descriptor_2);
- }
- buffer[output.ByteCount()] = '\0';
- EXPECT_STREQ("012345\n", buffer);
- ASSERT_EQ(2, info.annotation_size());
- const GeneratedCodeInfo::Annotation* foo = info.annotation(0).path_size() == 1
- ? &info.annotation(0)
- : &info.annotation(1);
- const GeneratedCodeInfo::Annotation* bar = info.annotation(0).path_size() == 1
- ? &info.annotation(1)
- : &info.annotation(0);
- ASSERT_EQ(1, foo->path_size());
- ASSERT_EQ(2, bar->path_size());
- EXPECT_EQ(33, foo->path(0));
- EXPECT_EQ(11, bar->path(0));
- EXPECT_EQ(22, bar->path(1));
- EXPECT_EQ("path_1", foo->source_file());
- EXPECT_EQ("path_2", bar->source_file());
- EXPECT_EQ(3, foo->begin());
- EXPECT_EQ(4, foo->end());
- EXPECT_EQ(5, bar->begin());
- EXPECT_EQ(6, bar->end());
-}
+ void AddAnnotationNew(Annotation& a) override {
+ GeneratedCodeInfo::Annotation annotation;
+ annotation.ParseFromString(a.second);
-TEST(Printer, AnnotateRange) {
- char buffer[8192];
- ArrayOutputStream output(buffer, sizeof(buffer));
- GeneratedCodeInfo info;
- AnnotationProtoCollector<GeneratedCodeInfo> info_collector(&info);
- {
- Printer printer(&output, '$', &info_collector);
- printer.Print("012$foo$4$bar$\n", "foo", "3", "bar", "5");
- std::vector<int> path;
- path.push_back(33);
- MockDescriptor descriptor("path", path);
- printer.Annotate("foo", "bar", &descriptor);
- }
- buffer[output.ByteCount()] = '\0';
- EXPECT_STREQ("012345\n", buffer);
- ASSERT_EQ(1, info.annotation_size());
- const GeneratedCodeInfo::Annotation* foobar = &info.annotation(0);
- ASSERT_EQ(1, foobar->path_size());
- EXPECT_EQ(33, foobar->path(0));
- EXPECT_EQ("path", foobar->source_file());
- EXPECT_EQ(3, foobar->begin());
- EXPECT_EQ(6, foobar->end());
-}
-
-TEST(Printer, AnnotateEmptyRange) {
- char buffer[8192];
- ArrayOutputStream output(buffer, sizeof(buffer));
- GeneratedCodeInfo info;
- AnnotationProtoCollector<GeneratedCodeInfo> info_collector(&info);
- {
- Printer printer(&output, '$', &info_collector);
- printer.Print("012$foo$4$baz$$bam$$bar$\n", "foo", "3", "bar", "5", "baz",
- "", "bam", "");
- std::vector<int> path;
- path.push_back(33);
- MockDescriptor descriptor("path", path);
- printer.Annotate("baz", "bam", &descriptor);
- }
- buffer[output.ByteCount()] = '\0';
- EXPECT_STREQ("012345\n", buffer);
- ASSERT_EQ(1, info.annotation_size());
- const GeneratedCodeInfo::Annotation* bazbam = &info.annotation(0);
- ASSERT_EQ(1, bazbam->path_size());
- EXPECT_EQ(33, bazbam->path(0));
- EXPECT_EQ("path", bazbam->source_file());
- EXPECT_EQ(5, bazbam->begin());
- EXPECT_EQ(5, bazbam->end());
-}
-
-TEST(Printer, AnnotateDespiteUnrelatedMultipleUses) {
- char buffer[8192];
- ArrayOutputStream output(buffer, sizeof(buffer));
- GeneratedCodeInfo info;
- AnnotationProtoCollector<GeneratedCodeInfo> info_collector(&info);
- {
- Printer printer(&output, '$', &info_collector);
- printer.Print("012$foo$4$foo$$bar$\n", "foo", "3", "bar", "5");
- std::vector<int> path;
- path.push_back(33);
- MockDescriptor descriptor("path", path);
- printer.Annotate("bar", "bar", &descriptor);
- }
- buffer[output.ByteCount()] = '\0';
- EXPECT_STREQ("0123435\n", buffer);
- ASSERT_EQ(1, info.annotation_size());
- const GeneratedCodeInfo::Annotation* bar = &info.annotation(0);
- ASSERT_EQ(1, bar->path_size());
- EXPECT_EQ(33, bar->path(0));
- EXPECT_EQ("path", bar->source_file());
- EXPECT_EQ(6, bar->begin());
- EXPECT_EQ(7, bar->end());
-}
-
-TEST(Printer, AnnotateIndent) {
- char buffer[8192];
- ArrayOutputStream output(buffer, sizeof(buffer));
- GeneratedCodeInfo info;
- AnnotationProtoCollector<GeneratedCodeInfo> info_collector(&info);
- {
- Printer printer(&output, '$', &info_collector);
- printer.Print("0\n");
- printer.Indent();
- printer.Print("$foo$", "foo", "4");
- std::vector<int> path;
- path.push_back(44);
- MockDescriptor descriptor("path", path);
- printer.Annotate("foo", &descriptor);
- printer.Print(",\n");
- printer.Print("$bar$", "bar", "9");
- path[0] = 99;
- MockDescriptor descriptor_two("path", path);
- printer.Annotate("bar", &descriptor_two);
- printer.Print("\n${$$D$$}$\n", "{", "", "}", "", "D", "d");
- path[0] = 1313;
- MockDescriptor descriptor_three("path", path);
- printer.Annotate("{", "}", &descriptor_three);
- printer.Outdent();
- printer.Print("\n");
- }
- buffer[output.ByteCount()] = '\0';
- EXPECT_STREQ("0\n 4,\n 9\n d\n\n", buffer);
- ASSERT_EQ(3, info.annotation_size());
- const GeneratedCodeInfo::Annotation* foo = &info.annotation(0);
- ASSERT_EQ(1, foo->path_size());
- EXPECT_EQ(44, foo->path(0));
- EXPECT_EQ("path", foo->source_file());
- EXPECT_EQ(4, foo->begin());
- EXPECT_EQ(5, foo->end());
- const GeneratedCodeInfo::Annotation* bar = &info.annotation(1);
- ASSERT_EQ(1, bar->path_size());
- EXPECT_EQ(99, bar->path(0));
- EXPECT_EQ("path", bar->source_file());
- EXPECT_EQ(9, bar->begin());
- EXPECT_EQ(10, bar->end());
- const GeneratedCodeInfo::Annotation* braces = &info.annotation(2);
- ASSERT_EQ(1, braces->path_size());
- EXPECT_EQ(1313, braces->path(0));
- EXPECT_EQ("path", braces->source_file());
- EXPECT_EQ(13, braces->begin());
- EXPECT_EQ(14, braces->end());
-}
-
-TEST(Printer, AnnotateIndentNewline) {
- char buffer[8192];
- ArrayOutputStream output(buffer, sizeof(buffer));
- GeneratedCodeInfo info;
- AnnotationProtoCollector<GeneratedCodeInfo> info_collector(&info);
- {
- Printer printer(&output, '$', &info_collector);
- printer.Indent();
- printer.Print("$A$$N$$B$C\n", "A", "", "N", "\nz", "B", "");
- std::vector<int> path;
- path.push_back(0);
- MockDescriptor descriptor("path", path);
- printer.Annotate("A", "B", &descriptor);
- printer.Outdent();
- printer.Print("\n");
- }
- buffer[output.ByteCount()] = '\0';
- EXPECT_STREQ("\nz C\n\n", buffer);
- ASSERT_EQ(1, info.annotation_size());
- const GeneratedCodeInfo::Annotation* ab = &info.annotation(0);
- ASSERT_EQ(1, ab->path_size());
- EXPECT_EQ(0, ab->path(0));
- EXPECT_EQ("path", ab->source_file());
- EXPECT_EQ(0, ab->begin());
- EXPECT_EQ(4, ab->end());
-}
-
-TEST(Printer, Indenting) {
- char buffer[8192];
-
- for (int block_size = 1; block_size < 512; block_size *= 2) {
- ArrayOutputStream output(buffer, sizeof(buffer), block_size);
-
- {
- Printer printer(&output, '$');
- std::map<std::string, std::string> vars;
-
- vars["newline"] = "\n";
-
- printer.Print("This is not indented.\n");
- printer.Indent();
- printer.Print("This is indented\nAnd so is this\n");
- printer.Outdent();
- printer.Print("But this is not.");
- printer.Indent();
- printer.Print(
- " And this is still the same line.\n"
- "But this is indented.\n");
- printer.PrintRaw("RawBit has indent at start\n");
- printer.PrintRaw("but not after a raw newline\n");
- printer.Print(vars,
- "Note that a newline in a variable will break "
- "indenting, as we see$newline$here.\n");
- printer.Indent();
- printer.Print("And this");
- printer.Outdent();
- printer.Outdent();
- printer.Print(" is double-indented\nBack to normal.");
-
- EXPECT_FALSE(printer.failed());
+ Record r{a.first.first, a.first.second, annotation.source_file(), {}};
+ for (int i : annotation.path()) {
+ r.path.push_back(i);
}
- buffer[output.ByteCount()] = '\0';
-
- EXPECT_STREQ(
- "This is not indented.\n"
- " This is indented\n"
- " And so is this\n"
- "But this is not. And this is still the same line.\n"
- " But this is indented.\n"
- " RawBit has indent at start\n"
- "but not after a raw newline\n"
- "Note that a newline in a variable will break indenting, as we see\n"
- "here.\n"
- " And this is double-indented\n"
- "Back to normal.",
- buffer);
+ annotations_.emplace_back(r);
}
-}
-// Death tests do not work on Windows as of yet.
-#ifdef PROTOBUF_HAS_DEATH_TEST
-TEST(Printer, Death) {
- char buffer[8192];
-
- ArrayOutputStream output(buffer, sizeof(buffer));
- Printer printer(&output, '$');
-
- EXPECT_DEBUG_DEATH(printer.Print("$nosuchvar$"), "Undefined variable");
- EXPECT_DEBUG_DEATH(printer.Print("$unclosed"), "Unclosed variable name");
- EXPECT_DEBUG_DEATH(printer.Outdent(), "without matching Indent");
-}
-
-TEST(Printer, AnnotateMultipleUsesDeath) {
- char buffer[8192];
- ArrayOutputStream output(buffer, sizeof(buffer));
- GeneratedCodeInfo info;
- AnnotationProtoCollector<GeneratedCodeInfo> info_collector(&info);
- {
- Printer printer(&output, '$', &info_collector);
- printer.Print("012$foo$4$foo$\n", "foo", "3");
+ struct Record {
+ size_t start, end;
+ std::string file_path;
std::vector<int> path;
- path.push_back(33);
- MockDescriptor descriptor("path", path);
- EXPECT_DEBUG_DEATH(printer.Annotate("foo", "foo", &descriptor), "multiple");
- }
+
+ friend std::ostream& operator<<(std::ostream& out, const Record& record) {
+ return out << "Record{" << record.start << ", " << record.end << ", \""
+ << record.file_path << "\", ["
+ << absl::StrJoin(record.path, ", ") << "]}";
+ }
+ };
+
+ absl::Span<const Record> Get() const { return annotations_; }
+
+ private:
+ std::vector<Record> annotations_;
+};
+
+template <typename Start, typename End, typename FilePath, typename Path>
+testing::Matcher<FakeAnnotationCollector::Record> Annotation(Start start,
+ End end,
+ FilePath file_path,
+ Path path) {
+ return AllOf(Field("start", &FakeAnnotationCollector::Record::start, start),
+ Field("end", &FakeAnnotationCollector::Record::end, end),
+ Field("file_path", &FakeAnnotationCollector::Record::file_path,
+ file_path),
+ Field("path", &FakeAnnotationCollector::Record::path, path));
}
-TEST(Printer, AnnotateNegativeLengthDeath) {
- char buffer[8192];
- ArrayOutputStream output(buffer, sizeof(buffer));
- GeneratedCodeInfo info;
- AnnotationProtoCollector<GeneratedCodeInfo> info_collector(&info);
+TEST_F(PrinterTest, AnnotateMap) {
+ FakeAnnotationCollector collector;
{
- Printer printer(&output, '$', &info_collector);
+ Printer printer(output(), '$', &collector);
+ absl::flat_hash_map<std::string, std::string> vars = {{"foo", "3"},
+ {"bar", "5"}};
+ printer.Print(vars, "012$foo$4$bar$\n");
+
+ FakeDescriptor descriptor_1{{"path_1"}, {33}};
+ FakeDescriptor descriptor_2{{"path_2"}, {11, 22}};
+ printer.Annotate("foo", "foo", &descriptor_1);
+ printer.Annotate("bar", "bar", &descriptor_2);
+ }
+
+ EXPECT_EQ(written(), "012345\n");
+ EXPECT_THAT(collector.Get(),
+ ElementsAre(Annotation(3, 4, "path_1", ElementsAre(33)),
+ Annotation(5, 6, "path_2", ElementsAre(11, 22))));
+}
+
+TEST_F(PrinterTest, AnnotateInline) {
+ FakeAnnotationCollector collector;
+ {
+ Printer printer(output(), '$', &collector);
printer.Print("012$foo$4$bar$\n", "foo", "3", "bar", "5");
- std::vector<int> path;
- path.push_back(33);
- MockDescriptor descriptor("path", path);
- EXPECT_DEBUG_DEATH(printer.Annotate("bar", "foo", &descriptor), "negative");
+
+ FakeDescriptor descriptor_1{{"path_1"}, {33}};
+ FakeDescriptor descriptor_2{{"path_2"}, {11, 22}};
+ printer.Annotate("foo", "foo", &descriptor_1);
+ printer.Annotate("bar", "bar", &descriptor_2);
}
+
+ EXPECT_EQ(written(), "012345\n");
+ EXPECT_THAT(collector.Get(),
+ ElementsAre(Annotation(3, 4, "path_1", ElementsAre(33)),
+ Annotation(5, 6, "path_2", ElementsAre(11, 22))));
}
-TEST(Printer, AnnotateUndefinedDeath) {
- char buffer[8192];
- ArrayOutputStream output(buffer, sizeof(buffer));
- GeneratedCodeInfo info;
- AnnotationProtoCollector<GeneratedCodeInfo> info_collector(&info);
+TEST_F(PrinterTest, AnnotateRange) {
+ FakeAnnotationCollector collector;
{
- Printer printer(&output, '$', &info_collector);
- printer.Print("012$foo$4$foo$\n", "foo", "3");
- std::vector<int> path;
- path.push_back(33);
- MockDescriptor descriptor("path", path);
- EXPECT_DEBUG_DEATH(printer.Annotate("bar", "bar", &descriptor),
- "Undefined");
+ Printer printer(output(), '$', &collector);
+ printer.Print("012$foo$4$bar$\n", "foo", "3", "bar", "5");
+
+ FakeDescriptor descriptor{{"path"}, {33}};
+ printer.Annotate("foo", "bar", &descriptor);
}
+
+ EXPECT_EQ(written(), "012345\n");
+ EXPECT_THAT(collector.Get(),
+ ElementsAre(Annotation(3, 6, "path", ElementsAre(33))));
}
-#endif // PROTOBUF_HAS_DEATH_TEST
-TEST(Printer, WriteFailurePartial) {
- char buffer[17];
+TEST_F(PrinterTest, AnnotateEmptyRange) {
+ FakeAnnotationCollector collector;
+ {
+ Printer printer(output(), '$', &collector);
+ printer.Print("012$foo$4$baz$$bam$$bar$\n", "foo", "3", "bar", "5", "baz",
+ "", "bam", "");
- ArrayOutputStream output(buffer, sizeof(buffer));
+ FakeDescriptor descriptor{{"path"}, {33}};
+ printer.Annotate("baz", "bam", &descriptor);
+ }
+
+ EXPECT_EQ(written(), "012345\n");
+ EXPECT_THAT(collector.Get(),
+ ElementsAre(Annotation(5, 5, "path", ElementsAre(33))));
+}
+
+TEST_F(PrinterTest, AnnotateDespiteUnrelatedMultipleUses) {
+ FakeAnnotationCollector collector;
+ {
+ Printer printer(output(), '$', &collector);
+ printer.Print("012$foo$4$foo$$bar$\n", "foo", "3", "bar", "5");
+
+ FakeDescriptor descriptor{{"path"}, {33}};
+ printer.Annotate("bar", "bar", &descriptor);
+ }
+
+ EXPECT_EQ(written(), "0123435\n");
+ EXPECT_THAT(collector.Get(),
+ ElementsAre(Annotation(6, 7, "path", ElementsAre(33))));
+}
+
+TEST_F(PrinterTest, AnnotateIndent) {
+ FakeAnnotationCollector collector;
+ {
+ Printer printer(output(), '$', &collector);
+ printer.Print("0\n");
+ printer.Indent();
+
+ printer.Print("$foo$", "foo", "4");
+ FakeDescriptor descriptor1{{"path"}, {44}};
+ printer.Annotate("foo", &descriptor1);
+
+ printer.Print(",\n");
+ printer.Print("$bar$", "bar", "9");
+ FakeDescriptor descriptor2{{"path"}, {99}};
+ printer.Annotate("bar", &descriptor2);
+
+ printer.Print("\n${$$D$$}$\n", "{", "", "}", "", "D", "d");
+ FakeDescriptor descriptor3{{"path"}, {1313}};
+ printer.Annotate("{", "}", &descriptor3);
+
+ printer.Outdent();
+ printer.Print("\n");
+ }
+
+ EXPECT_EQ(written(), "0\n 4,\n 9\n d\n\n");
+ EXPECT_THAT(collector.Get(),
+ ElementsAre(Annotation(4, 5, "path", ElementsAre(44)),
+ Annotation(9, 10, "path", ElementsAre(99)),
+ Annotation(13, 14, "path", ElementsAre(1313))));
+}
+
+TEST_F(PrinterTest, AnnotateIndentNewline) {
+ FakeAnnotationCollector collector;
+ {
+ Printer printer(output(), '$', &collector);
+ printer.Indent();
+
+ printer.Print("$A$$N$$B$C\n", "A", "", "N", "\nz", "B", "");
+ FakeDescriptor descriptor{{"path"}, {0}};
+ printer.Annotate("A", "B", &descriptor);
+
+ printer.Outdent();
+ printer.Print("\n");
+ }
+ EXPECT_EQ(written(), "\nz C\n\n");
+
+ EXPECT_THAT(collector.Get(),
+ ElementsAre(Annotation(0, 4, "path", ElementsAre(0))));
+}
+
+TEST_F(PrinterTest, Indenting) {
+ {
+ Printer printer(output(), '$');
+ absl::flat_hash_map<std::string, std::string> vars = {{"newline", "\n"}};
+
+ printer.Print("This is not indented.\n");
+ printer.Indent();
+ printer.Print("This is indented\nAnd so is this\n");
+ printer.Outdent();
+ printer.Print("But this is not.");
+ printer.Indent();
+ printer.Print(
+ " And this is still the same line.\n"
+ "But this is indented.\n");
+ printer.PrintRaw("RawBit has indent at start\n");
+ printer.PrintRaw("but not after a raw newline\n");
+ printer.Print(vars,
+ "Note that a newline in a variable will break "
+ "indenting, as we see$newline$here.\n");
+ printer.Indent();
+ printer.Print("And this");
+ printer.Outdent();
+ printer.Outdent();
+ printer.Print(" is double-indented\nBack to normal.");
+
+ EXPECT_FALSE(printer.failed());
+ }
+
+ EXPECT_EQ(
+ written(),
+ "This is not indented.\n"
+ " This is indented\n"
+ " And so is this\n"
+ "But this is not. And this is still the same line.\n"
+ " But this is indented.\n"
+ " RawBit has indent at start\n"
+ "but not after a raw newline\n"
+ "Note that a newline in a variable will break indenting, as we see\n"
+ "here.\n"
+ " And this is double-indented\n"
+ "Back to normal.");
+}
+
+TEST_F(PrinterTest, WriteFailurePartial) {
+ std::string buffer(17, '\xaa');
+ ArrayOutputStream output(&buffer[0], buffer.size());
Printer printer(&output, '$');
// Print 16 bytes to almost fill the buffer (should not fail).
@@ -573,13 +431,12 @@
EXPECT_TRUE(printer.failed());
// Buffer should contain the first 17 bytes written.
- EXPECT_EQ("0123456789abcdef<", std::string(buffer, sizeof(buffer)));
+ EXPECT_EQ(buffer, "0123456789abcdef<");
}
-TEST(Printer, WriteFailureExact) {
- char buffer[16];
-
- ArrayOutputStream output(buffer, sizeof(buffer));
+TEST_F(PrinterTest, WriteFailureExact) {
+ std::string buffer(16, '\xaa');
+ ArrayOutputStream output(&buffer[0], buffer.size());
Printer printer(&output, '$');
// Print 16 bytes to fill the buffer exactly (should not fail).
@@ -595,139 +452,358 @@
EXPECT_TRUE(printer.failed());
// Buffer should contain the first 16 bytes written.
- EXPECT_EQ("0123456789abcdef", std::string(buffer, sizeof(buffer)));
+ EXPECT_EQ(buffer, "0123456789abcdef");
}
-TEST(Printer, FormatInternal) {
- std::vector<std::string> args{"arg1", "arg2"};
- std::map<std::string, std::string> vars{
- {"foo", "bar"}, {"baz", "bla"}, {"empty", ""}};
- // Substitution tests
+TEST_F(PrinterTest, FormatInternalDirectSub) {
{
- // Direct arg substitution
- std::string s;
- {
- StringOutputStream output(&s);
- Printer printer(&output, '$');
- printer.FormatInternal(args, vars, "$1$ $2$");
- }
- EXPECT_EQ("arg1 arg2", s);
+ Printer printer(output(), '$');
+ printer.FormatInternal({"arg1", "arg2"}, {}, "$1$ $2$");
}
+ EXPECT_EQ(written(), "arg1 arg2");
+}
+
+TEST_F(PrinterTest, FormatInternalSubWithSpacesLeft) {
{
- // Variable substitution including spaces left
- std::string s;
- {
- StringOutputStream output(&s);
- Printer printer(&output, '$');
- printer.FormatInternal({}, vars, "$foo$$ baz$$ empty$");
- }
- EXPECT_EQ("bar bla", s);
+ Printer printer(output(), '$');
+ printer.FormatInternal({}, {{"foo", "bar"}, {"baz", "bla"}, {"empty", ""}},
+ "$foo$$ baz$$ empty$");
}
+ EXPECT_EQ(written(), "bar bla");
+}
+
+TEST_F(PrinterTest, FormatInternalSubWithSpacesRight) {
{
- // Variable substitution including spaces right
- std::string s;
- {
- StringOutputStream output(&s);
- Printer printer(&output, '$');
- printer.FormatInternal({}, vars, "$empty $$foo $$baz$");
- }
- EXPECT_EQ("bar bla", s);
+ Printer printer(output(), '$');
+ printer.FormatInternal({}, {{"foo", "bar"}, {"baz", "bla"}, {"empty", ""}},
+ "$empty $$foo $$baz$");
}
+ EXPECT_EQ(written(), "bar bla");
+}
+
+TEST_F(PrinterTest, FormatInternalSubMixed) {
{
- // Mixed variable substitution
- std::string s;
- {
- StringOutputStream output(&s);
- Printer printer(&output, '$');
- printer.FormatInternal(args, vars, "$empty $$1$ $foo $$2$ $baz$");
- }
- EXPECT_EQ("arg1 bar arg2 bla", s);
+ Printer printer(output(), '$');
+ printer.FormatInternal({"arg1", "arg2"},
+ {{"foo", "bar"}, {"baz", "bla"}, {"empty", ""}},
+ "$empty $$1$ $foo $$2$ $baz$");
+ }
+ EXPECT_EQ(written(), "arg1 bar arg2 bla");
+}
+
+TEST_F(PrinterTest, FormatInternalIndent) {
+ {
+ Printer printer(output(), '$');
+ printer.Indent();
+ printer.FormatInternal({"arg1", "arg2"},
+ {{"foo", "bar"}, {"baz", "bla"}, {"empty", ""}},
+ "$empty $\n\n$1$ $foo $$2$\n$baz$");
+ printer.Outdent();
+ }
+ EXPECT_EQ(written(), "\n\n arg1 bar arg2\n bla");
+}
+
+TEST_F(PrinterTest, FormatInternalAnnotations) {
+ FakeAnnotationCollector collector;
+ {
+ Printer printer(output(), '$', &collector);
+
+ printer.Indent();
+ GeneratedCodeInfo::Annotation annotation;
+ annotation.set_source_file("file.proto");
+ annotation.add_path(33);
+
+ printer.FormatInternal({annotation.SerializeAsString(), "arg1", "arg2"},
+ {{"foo", "bar"}, {"baz", "bla"}, {"empty", ""}},
+ "$empty $\n\n${1$$2$$}$ $3$\n$baz$");
+ printer.Outdent();
}
- // Indentation tests
+ EXPECT_EQ(written(), "\n\n arg1 arg2\n bla");
+ EXPECT_THAT(collector.Get(),
+ ElementsAre(Annotation(4, 8, "file.proto", ElementsAre(33))));
+}
+
+TEST_F(PrinterTest, Emit) {
{
- // Empty lines shouldn't indent.
- std::string s;
- {
- StringOutputStream output(&s);
- Printer printer(&output, '$');
- printer.Indent();
- printer.FormatInternal(args, vars, "$empty $\n\n$1$ $foo $$2$\n$baz$");
- printer.Outdent();
- }
- EXPECT_EQ("\n\n arg1 bar arg2\n bla", s);
+ Printer printer(output());
+ printer.Emit(R"cc(
+ class Foo {
+ int x, y, z;
+ };
+ )cc");
+ printer.Emit(R"java(
+ public final class Bar {
+ Bar() {}
+ }
+ )java");
}
+
+ EXPECT_EQ(written(),
+ "class Foo {\n"
+ " int x, y, z;\n"
+ "};\n"
+ "public final class Bar {\n"
+ " Bar() {}\n"
+ "}\n");
+}
+
+TEST_F(PrinterTest, EmitKeepsExtraLine) {
{
- // Annotations should respect indentation.
- std::string s;
- GeneratedCodeInfo info;
- {
- StringOutputStream output(&s);
- AnnotationProtoCollector<GeneratedCodeInfo> info_collector(&info);
- Printer printer(&output, '$', &info_collector);
- printer.Indent();
- GeneratedCodeInfo::Annotation annotation;
- annotation.set_source_file("file.proto");
- annotation.add_path(33);
- std::vector<std::string> args{annotation.SerializeAsString(), "arg1",
- "arg2"};
- printer.FormatInternal(args, vars, "$empty $\n\n${1$$2$$}$ $3$\n$baz$");
- printer.Outdent();
- }
- EXPECT_EQ("\n\n arg1 arg2\n bla", s);
- ASSERT_EQ(1, info.annotation_size());
- const GeneratedCodeInfo::Annotation* arg1 = &info.annotation(0);
- ASSERT_EQ(1, arg1->path_size());
- EXPECT_EQ(33, arg1->path(0));
- EXPECT_EQ("file.proto", arg1->source_file());
- EXPECT_EQ(4, arg1->begin());
- EXPECT_EQ(8, arg1->end());
+ Printer printer(output());
+ printer.Emit(R"cc(
+
+ class Foo {
+ int x, y, z;
+ };
+ )cc");
+ printer.Emit(R"java(
+
+ public final class Bar {
+ Bar() {}
+ }
+ )java");
}
-#ifdef PROTOBUF_HAS_DEATH_TEST
- // Death tests in case of illegal format strings.
+
+ EXPECT_EQ(written(),
+ "\n"
+ "class Foo {\n"
+ " int x, y, z;\n"
+ "};\n"
+ "\n"
+ "public final class Bar {\n"
+ " Bar() {}\n"
+ "}\n");
+}
+
+TEST_F(PrinterTest, EmitWithSubs) {
{
- // Unused arguments
- std::string s;
- StringOutputStream output(&s);
- Printer printer(&output, '$');
- EXPECT_DEATH(printer.FormatInternal(args, vars, "$empty $$1$"), "Unused");
+ Printer printer(output());
+ printer.Emit(
+ {{"class", "Foo"}, {"f1", "x"}, {"f2", "y"}, {"f3", "z"}, {"init", 42}},
+ R"cc(
+ class $class$ {
+ int $f1$, $f2$, $f3$ = $init$;
+ };
+ )cc");
}
+
+ EXPECT_EQ(written(),
+ "class Foo {\n"
+ " int x, y, z = 42;\n"
+ "};\n");
+}
+
+TEST_F(PrinterTest, EmitWithVars) {
{
- // Wrong order arguments
- std::string s;
- StringOutputStream output(&s);
- Printer printer(&output, '$');
- EXPECT_DEATH(printer.FormatInternal(args, vars, "$2$ $1$"), "order");
+ Printer printer(output());
+ auto v = printer.WithVars({
+ {"class", "Foo"},
+ {"f1", "x"},
+ {"f2", "y"},
+ {"f3", "z"},
+ {"init", 42},
+ });
+ printer.Emit(R"cc(
+ class $class$ {
+ int $f1$, $f2$, $f3$ = $init$;
+ };
+ )cc");
}
+
+ EXPECT_EQ(written(),
+ "class Foo {\n"
+ " int x, y, z = 42;\n"
+ "};\n");
+}
+
+TEST_F(PrinterTest, EmitWithSpacedVars) {
{
- // Zero is illegal argument
- std::string s;
- StringOutputStream output(&s);
- Printer printer(&output, '$');
- EXPECT_DEATH(printer.FormatInternal(args, vars, "$0$"), "failed");
+ Printer printer(output());
+ auto v = printer.WithVars({
+ {"is_final", "final"},
+ {"isnt_final", ""},
+ {"class", "Foo"},
+ });
+ printer.Emit(R"java(
+ public $is_final $class $class$ {
+ // Stuff.
+ }
+ )java");
+ printer.Emit(R"java(
+ public $isnt_final $class $class$ {
+ // Stuff.
+ }
+ )java");
}
+
+ EXPECT_EQ(written(),
+ "public final class Foo {\n"
+ " // Stuff.\n"
+ "}\n"
+ "public class Foo {\n"
+ " // Stuff.\n"
+ "}\n");
+}
+
+TEST_F(PrinterTest, EmitWithIndent) {
{
- // Argument out of bounds
- std::string s;
- StringOutputStream output(&s);
- Printer printer(&output, '$');
- EXPECT_DEATH(printer.FormatInternal(args, vars, "$1$ $2$ $3$"), "bounds");
+ Printer printer(output());
+ auto v = printer.WithIndent();
+ printer.Emit({{"f1", "x"}, {"f2", "y"}, {"f3", "z"}}, R"cc(
+ class Foo {
+ int $f1$, $f2$, $f3$;
+ };
+ )cc");
}
+
+ EXPECT_EQ(written(),
+ " class Foo {\n"
+ " int x, y, z;\n"
+ " };\n");
+}
+
+
+TEST_F(PrinterTest, EmitSameNameAnnotation) {
+ FakeAnnotationCollector collector;
{
- // Unknown variable
- std::string s;
- StringOutputStream output(&s);
- Printer printer(&output, '$');
- EXPECT_DEATH(printer.FormatInternal(args, vars, "$huh$ $1$$2$"), "Unknown");
+ Printer printer(output(), '$', &collector);
+ FakeDescriptor descriptor{{"file.proto"}, {33}};
+ auto v = printer.WithVars({{"class", "Foo"}});
+ auto a = printer.WithAnnotations({{"class", &descriptor}});
+
+ printer.Emit({{"f1", "x"}, {"f2", "y"}, {"f3", "z"}}, R"cc(
+ class $class$ {
+ int $f1$, $f2$, $f3$;
+ };
+ )cc");
}
+
+ EXPECT_EQ(written(),
+ "class Foo {\n"
+ " int x, y, z;\n"
+ "};\n");
+
+ EXPECT_THAT(collector.Get(),
+ ElementsAre(Annotation(6, 9, "file.proto", ElementsAre(33))));
+}
+
+TEST_F(PrinterTest, EmitSameNameAnnotationFileNameOnly) {
+ FakeAnnotationCollector collector;
{
- // Illegal variable
- std::string s;
- StringOutputStream output(&s);
- Printer printer(&output, '$');
- EXPECT_DEATH(printer.FormatInternal({}, vars, "$ $"), "Empty");
+ Printer printer(output(), '$', &collector);
+ auto v = printer.WithVars({{"class", "Foo"}});
+ auto a = printer.WithAnnotations({{"class", "file.proto"}});
+
+ printer.Emit({{"f1", "x"}, {"f2", "y"}, {"f3", "z"}}, R"cc(
+ class $class$ {
+ int $f1$, $f2$, $f3$;
+ };
+ )cc");
}
-#endif // PROTOBUF_HAS_DEATH_TEST
+
+ EXPECT_EQ(written(),
+ "class Foo {\n"
+ " int x, y, z;\n"
+ "};\n");
+
+ EXPECT_THAT(collector.Get(),
+ ElementsAre(Annotation(6, 9, "file.proto", IsEmpty())));
+}
+
+TEST_F(PrinterTest, EmitThreeArgWithVars) {
+ FakeAnnotationCollector collector;
+ {
+ Printer printer(output(), '$', &collector);
+ auto v = printer.WithVars({{"class", "Foo", "file.proto"}});
+
+ printer.Emit({{"f1", "x"}, {"f2", "y"}, {"f3", "z"}}, R"cc(
+ class $class$ {
+ int $f1$, $f2$, $f3$;
+ };
+ )cc");
+ }
+
+ EXPECT_EQ(written(),
+ "class Foo {\n"
+ " int x, y, z;\n"
+ "};\n");
+
+ EXPECT_THAT(collector.Get(),
+ ElementsAre(Annotation(6, 9, "file.proto", IsEmpty())));
+}
+
+TEST_F(PrinterTest, EmitRangeAnnotation) {
+ FakeAnnotationCollector collector;
+ {
+ Printer printer(output(), '$', &collector);
+ FakeDescriptor descriptor1{{"file1.proto"}, {33}};
+ FakeDescriptor descriptor2{{"file2.proto"}, {11, 22}};
+ auto v = printer.WithVars({{"class", "Foo"}});
+ auto a = printer.WithAnnotations({
+ {"message", &descriptor1},
+ {"field", &descriptor2},
+ });
+
+ printer.Emit({{"f1", "x"}, {"f2", "y"}, {"f3", "z"}}, R"cc(
+ $_start$message$ class $class$ {
+ $_start$field$ int $f1$, $f2$, $f3$;
+ $_end$field$
+ };
+ $_end$message$
+ )cc");
+ }
+
+ EXPECT_EQ(written(),
+ "class Foo {\n"
+ " int x, y, z;\n"
+ "};\n");
+
+ EXPECT_THAT(
+ collector.Get(),
+ ElementsAre(Annotation(14, 27, "file2.proto", ElementsAre(11, 22)),
+ Annotation(0, 30, "file1.proto", ElementsAre(33))));
+}
+
+TEST_F(PrinterTest, EmitCallbacks) {
+ {
+ Printer printer(output());
+ printer.Emit(
+ {
+ {"class", "Foo"},
+ {"method", "bar"},
+ {"methods",
+ [&] {
+ printer.Emit(R"cc(
+ int $method$() { return 42; }
+ )cc");
+ }},
+ {"fields",
+ [&] {
+ printer.Emit(R"cc(
+ int $method$_;
+ )cc");
+ }},
+ },
+ R"cc(
+ class $class$ {
+ public:
+ $methods$;
+
+ private:
+ $fields$;
+ };
+ )cc");
+ }
+
+ EXPECT_EQ(written(),
+ "class Foo {\n"
+ " public:\n"
+ " int bar() { return 42; }\n"
+ "\n"
+ " private:\n"
+ " int bar_;\n"
+ "};\n");
}
} // namespace io
diff --git a/src/google/protobuf/io/strtod.cc b/src/google/protobuf/io/strtod.cc
index 03acb5b..61c6c29 100644
--- a/src/google/protobuf/io/strtod.cc
+++ b/src/google/protobuf/io/strtod.cc
@@ -28,17 +28,17 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/io/strtod.h>
+#include "google/protobuf/io/strtod.h"
#include <cstdio>
#include <cstring>
#include <limits>
#include <string>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
-#include <google/protobuf/stubs/strutil.h>
+#include "google/protobuf/stubs/strutil.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/io/tokenizer.cc b/src/google/protobuf/io/tokenizer.cc
index f9e0776..4d7f56c 100644
--- a/src/google/protobuf/io/tokenizer.cc
+++ b/src/google/protobuf/io/tokenizer.cc
@@ -88,18 +88,18 @@
// I'd love to hear about other alternatives, though, as this code isn't
// exactly pretty.
-#include <google/protobuf/io/tokenizer.h>
+#include "google/protobuf/io/tokenizer.h"
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/stringprintf.h>
-#include <google/protobuf/io/strtod.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/stubs/stl_util.h>
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/stubs/logging.h"
+#include "absl/strings/escaping.h"
+#include "absl/strings/str_format.h"
+#include "google/protobuf/io/strtod.h"
+#include "google/protobuf/io/zero_copy_stream.h"
+#include "google/protobuf/stubs/stl_util.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -406,7 +406,7 @@
case '\n': {
if (!allow_multiline_strings_) {
- AddError("String literals cannot cross line boundaries.");
+ AddError("Multiline strings are not allowed. Did you miss a \"?.");
return;
}
NextChar();
@@ -708,7 +708,7 @@
if (current_char_ & 0x80) {
error_collector_->AddError(
line_, column_,
- StringPrintf("Interpreting non ascii codepoint %d.",
+ absl::StrFormat("Interpreting non ascii codepoint %d.",
static_cast<unsigned char>(current_char_)));
}
NextChar();
@@ -746,6 +746,8 @@
: prev_trailing_comments_(prev_trailing_comments),
detached_comments_(detached_comments),
next_leading_comments_(next_leading_comments),
+ num_comments_(0),
+ has_trailing_comment_(false),
has_comment_(false),
is_line_comment_(false),
can_attach_to_prev_(true) {
@@ -797,6 +799,7 @@
if (prev_trailing_comments_ != NULL) {
prev_trailing_comments_->append(comment_buffer_);
}
+ has_trailing_comment_ = true;
can_attach_to_prev_ = false;
} else {
if (detached_comments_ != NULL) {
@@ -804,17 +807,39 @@
}
}
ClearBuffer();
+ num_comments_++;
}
}
void DetachFromPrev() { can_attach_to_prev_ = false; }
+ void MaybeDetachComment() {
+ int count = num_comments_;
+ if (has_comment_) count++;
+
+ // If there's one comment, make sure it is detached.
+ if (count == 1) {
+ if (has_trailing_comment_ && prev_trailing_comments_ != NULL) {
+ std::string trail = *prev_trailing_comments_;
+ if (detached_comments_ != NULL) {
+ // push trailing comment to front of detached
+ detached_comments_->insert(detached_comments_->begin(), 1, trail);
+ }
+ prev_trailing_comments_->clear();
+ }
+ // flush pending comment so it's detached instead of leading
+ Flush();
+ }
+ }
+
private:
std::string* prev_trailing_comments_;
std::vector<std::string>* detached_comments_;
std::string* next_leading_comments_;
std::string comment_buffer_;
+ int num_comments_;
+ bool has_trailing_comment_;
// True if any comments were read into comment_buffer_. This can be true even
// if comment_buffer_ is empty, namely if the comment was "/**/".
@@ -836,6 +861,9 @@
CommentCollector collector(prev_trailing_comments, detached_comments,
next_leading_comments);
+ int prev_line = line_;
+ int trailing_comment_end_line = -1;
+
if (current_.type == TYPE_START) {
// Ignore unicode byte order mark(BOM) if it appears at the file
// beginning. Only UTF-8 BOM (0xEF 0xBB 0xBF) is accepted.
@@ -849,12 +877,14 @@
}
}
collector.DetachFromPrev();
+ prev_line = -1;
} else {
// A comment appearing on the same line must be attached to the previous
// declaration.
ConsumeZeroOrMore<WhitespaceNoNewline>();
switch (TryConsumeCommentStart()) {
case LINE_COMMENT:
+ trailing_comment_end_line = line_;
ConsumeLineComment(collector.GetBufferForLineComment());
// Don't allow comments on subsequent lines to be attached to a trailing
@@ -863,14 +893,8 @@
break;
case BLOCK_COMMENT:
ConsumeBlockComment(collector.GetBufferForBlockComment());
-
+ trailing_comment_end_line = line_;
ConsumeZeroOrMore<WhitespaceNoNewline>();
- if (!TryConsume('\n')) {
- // Oops, the next token is on the same line. If we recorded a comment
- // we really have no idea which token it should be attached to.
- collector.ClearBuffer();
- return Next();
- }
// Don't allow comments on subsequent lines to be attached to a trailing
// comment.
@@ -918,6 +942,13 @@
// makes no sense to attach a comment to the following token.
collector.Flush();
}
+ if (prev_line == line_ || trailing_comment_end_line == line_) {
+ // When previous token and this one are on the same line, or
+ // even if a multi-line trailing comment ends on the same line
+ // as this token, it's unclear to what token the comment
+ // should be attached. So we detach it.
+ collector.MaybeDetachComment();
+ }
return result;
}
break;
@@ -1002,9 +1033,20 @@
}
double Tokenizer::ParseFloat(const std::string& text) {
+ double result = 0;
+ if (!TryParseFloat(text, &result)) {
+ GOOGLE_LOG(DFATAL)
+ << " Tokenizer::ParseFloat() passed text that could not have been"
+ " tokenized as a float: "
+ << absl::CEscape(text);
+ }
+ return result;
+}
+
+bool Tokenizer::TryParseFloat(const std::string& text, double* result) {
const char* start = text.c_str();
char* end;
- double result = NoLocaleStrtod(start, &end);
+ *result = NoLocaleStrtod(start, &end);
// "1e" is not a valid float, but if the tokenizer reads it, it will
// report an error but still return it as a valid token. We need to
@@ -1020,12 +1062,7 @@
++end;
}
- GOOGLE_LOG_IF(DFATAL,
- static_cast<size_t>(end - start) != text.size() || *start == '-')
- << " Tokenizer::ParseFloat() passed text that could not have been"
- " tokenized as a float: "
- << CEscape(text);
- return result;
+ return static_cast<size_t>(end - start) == text.size() && *start != '-';
}
// Helper to append a Unicode code point to a string as UTF8, without bringing
@@ -1052,7 +1089,7 @@
// Unicode code points end at 0x10FFFF, so this is out-of-range.
// ConsumeString permits hex values up to 0x1FFFFF, and FetchUnicodePoint
// doesn't perform a range check.
- StringAppendF(output, "\\U%08x", code_point);
+ absl::StrAppendFormat(output, "\\U%08x", code_point);
return;
}
tmp = ghtonl(tmp);
@@ -1145,7 +1182,7 @@
if (text_size == 0) {
GOOGLE_LOG(DFATAL) << " Tokenizer::ParseStringAppend() passed text that could not"
" have been tokenized as a string: "
- << CEscape(text);
+ << absl::CEscape(text);
return;
}
@@ -1236,4 +1273,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/io/tokenizer.h b/src/google/protobuf/io/tokenizer.h
index 4abab7e..73877cc 100644
--- a/src/google/protobuf/io/tokenizer.h
+++ b/src/google/protobuf/io/tokenizer.h
@@ -37,15 +37,15 @@
#ifndef GOOGLE_PROTOBUF_IO_TOKENIZER_H__
#define GOOGLE_PROTOBUF_IO_TOKENIZER_H__
-
#include <string>
#include <vector>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/logging.h>
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/port.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -69,6 +69,8 @@
class PROTOBUF_EXPORT ErrorCollector {
public:
inline ErrorCollector() {}
+ ErrorCollector(const ErrorCollector&) = delete;
+ ErrorCollector& operator=(const ErrorCollector&) = delete;
virtual ~ErrorCollector();
// Indicates that there was an error in the input at the given line and
@@ -82,9 +84,6 @@
// 1 to each before printing them.
virtual void AddWarning(int /* line */, ColumnNumber /* column */,
const std::string& /* message */) {}
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ErrorCollector);
};
// This class converts a stream of raw text into a stream of tokens for
@@ -99,6 +98,8 @@
// input stream and writes errors to the given error_collector.
// The caller keeps ownership of input and error_collector.
Tokenizer(ZeroCopyInputStream* input, ErrorCollector* error_collector);
+ Tokenizer(const Tokenizer&) = delete;
+ Tokenizer& operator=(const Tokenizer&) = delete;
~Tokenizer();
enum TokenType {
@@ -149,11 +150,11 @@
// Get the current token. This is updated when Next() is called. Before
// the first call to Next(), current() has type TYPE_START and no contents.
- const Token& current();
+ const Token& current() const;
// Return the previous token -- i.e. what current() returned before the
// previous call to Next().
- const Token& previous();
+ const Token& previous() const;
// Advance to the next token. Returns false if the end of the input is
// reached.
@@ -213,6 +214,10 @@
// result is undefined (possibly an assert failure).
static double ParseFloat(const std::string& text);
+ // Parses given text as if it were a TYPE_FLOAT token. Returns false if the
+ // given text is not actually a valid float literal.
+ static bool TryParseFloat(const std::string& text, double* result);
+
// Parses a TYPE_STRING token. This never fails, so long as the text actually
// comes from a TYPE_STRING token parsed by Tokenizer. If it doesn't, the
// result is undefined (possibly an assert failure).
@@ -276,8 +281,6 @@
// -----------------------------------------------------------------
private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Tokenizer);
-
Token current_; // Returned by current().
Token previous_; // Returned by previous().
@@ -423,9 +426,9 @@
};
// inline methods ====================================================
-inline const Tokenizer::Token& Tokenizer::current() { return current_; }
+inline const Tokenizer::Token& Tokenizer::current() const { return current_; }
-inline const Tokenizer::Token& Tokenizer::previous() { return previous_; }
+inline const Tokenizer::Token& Tokenizer::previous() const { return previous_; }
inline void Tokenizer::ParseString(const std::string& text,
std::string* output) {
@@ -437,6 +440,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_IO_TOKENIZER_H__
diff --git a/src/google/protobuf/io/tokenizer_unittest.cc b/src/google/protobuf/io/tokenizer_unittest.cc
index 16ba940..f4d70f0 100644
--- a/src/google/protobuf/io/tokenizer_unittest.cc
+++ b/src/google/protobuf/io/tokenizer_unittest.cc
@@ -32,19 +32,19 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/io/tokenizer.h>
+#include "google/protobuf/io/tokenizer.h"
#include <limits.h>
#include <math.h>
#include <vector>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/substitute.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/testing/googletest.h>
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/stubs/logging.h"
+#include "absl/strings/escaping.h"
+#include "absl/strings/substitute.h"
+#include "google/protobuf/io/zero_copy_stream_impl.h"
+#include "google/protobuf/testing/googletest.h"
#include <gtest/gtest.h>
namespace google {
@@ -63,7 +63,7 @@
// run multiple times, once for each item in some input array. TEST_1D
// tests all cases in a single input array. TEST_2D tests all
// combinations of cases from two arrays. The arrays must be statically
-// defined such that the GOOGLE_ARRAYSIZE() macro works on them. Example:
+// defined such that the ABSL_ARRAYSIZE() macro works on them. Example:
//
// int kCases[] = {1, 2, 3, 4}
// TEST_1D(MyFixture, MyTest, kCases) {
@@ -83,7 +83,7 @@
}; \
\
TEST_F(FIXTURE##_##NAME##_DD, NAME) { \
- for (int i = 0; i < GOOGLE_ARRAYSIZE(CASES); i++) { \
+ for (int i = 0; i < ABSL_ARRAYSIZE(CASES); i++) { \
SCOPED_TRACE(testing::Message() \
<< #CASES " case #" << i << ": " << CASES[i]); \
DoSingleCase(CASES[i]); \
@@ -102,8 +102,8 @@
}; \
\
TEST_F(FIXTURE##_##NAME##_DD, NAME) { \
- for (int i = 0; i < GOOGLE_ARRAYSIZE(CASES1); i++) { \
- for (int j = 0; j < GOOGLE_ARRAYSIZE(CASES2); j++) { \
+ for (int i = 0; i < ABSL_ARRAYSIZE(CASES1); i++) { \
+ for (int j = 0; j < ABSL_ARRAYSIZE(CASES2); j++) { \
SCOPED_TRACE(testing::Message() \
<< #CASES1 " case #" << i << ": " << CASES1[i] << ", " \
<< #CASES2 " case #" << j << ": " << CASES2[j]); \
@@ -163,7 +163,7 @@
// implements ErrorCollector ---------------------------------------
void AddError(int line, int column, const std::string& message) {
- strings::SubstituteAndAppend(&text_, "$0:$1: $2\n", line, column, message);
+ absl::SubstituteAndAppend(&text_, "$0:$1: $2\n", line, column, message);
}
};
@@ -201,7 +201,7 @@
inline std::ostream& operator<<(std::ostream& out,
const SimpleTokenCase& test_case) {
- return out << CEscape(test_case.input);
+ return out << absl::CEscape(test_case.input);
}
SimpleTokenCase kSimpleTokenCases[] = {
@@ -370,7 +370,7 @@
inline std::ostream& operator<<(std::ostream& out,
const MultiTokenCase& test_case) {
- return out << CEscape(test_case.input);
+ return out << absl::CEscape(test_case.input);
}
MultiTokenCase kMultiTokenCases[] = {
@@ -614,7 +614,7 @@
tokenizer.set_comment_style(Tokenizer::SH_COMMENT_STYLE);
// Advance through tokens and check that they are parsed as expected.
- for (int i = 0; i < GOOGLE_ARRAYSIZE(kTokens); i++) {
+ for (int i = 0; i < ABSL_ARRAYSIZE(kTokens); i++) {
EXPECT_TRUE(tokenizer.Next());
EXPECT_EQ(tokenizer.current().text, kTokens[i]);
}
@@ -641,7 +641,7 @@
inline std::ostream& operator<<(std::ostream& out,
const DocCommentCase& test_case) {
- return out << CEscape(test_case.input);
+ return out << absl::CEscape(test_case.input);
}
DocCommentCase kDocCommentCases[] = {
@@ -651,10 +651,10 @@
{},
""},
- {"prev /* ignored */ next",
+ {"prev /* detached */ next",
"",
- {},
+ {" detached "},
""},
{"prev // trailing comment\n"
@@ -665,6 +665,13 @@
""},
{"prev\n"
+ "/* leading comment */ next",
+
+ "",
+ {},
+ " leading comment "},
+
+ {"prev\n"
"// leading comment\n"
"// line 2\n"
"next",
@@ -763,6 +770,45 @@
"",
{},
" leading comment\n"},
+
+ {"prev /* many comments*/ /* all inline */ /* will be handled */ next",
+
+ " many comments",
+ {" all inline "},
+ " will be handled "},
+
+ {R"pb(
+ prev /* a single block comment
+ that spans multiple lines
+ is detached if it ends
+ on the same line as next */ next"
+ )pb",
+
+ "",
+ {" a single block comment\n"
+ "that spans multiple lines\n"
+ "is detached if it ends\n"
+ "on the same line as next "},
+ ""},
+
+ {R"pb(
+ prev /* trailing */ /* leading */ next"
+ )pb",
+
+ " trailing ",
+ {},
+ " leading "},
+
+ {R"pb(
+ prev /* multi-line
+ trailing */ /* an oddly
+ placed detached */ /* an oddly
+ placed leading */ next"
+ )pb",
+
+ " multi-line\ntrailing ",
+ {" an oddly\nplaced detached "},
+ " an oddly\nplaced leading "},
};
TEST_2D(TokenizerTest, DocComments, kDocCommentCases, kBlockSizes) {
@@ -796,7 +842,7 @@
prev_trailing_comments);
for (int i = 0; i < detached_comments.size(); i++) {
- ASSERT_LT(i, GOOGLE_ARRAYSIZE(kDocCommentCases));
+ ASSERT_LT(i, ABSL_ARRAYSIZE(kDocCommentCases));
ASSERT_TRUE(kDocCommentCases_case.detached_comments[i] != NULL);
EXPECT_EQ(kDocCommentCases_case.detached_comments[i], detached_comments[i]);
}
@@ -1058,7 +1104,7 @@
};
inline std::ostream& operator<<(std::ostream& out, const ErrorCase& test_case) {
- return out << CEscape(test_case.input);
+ return out << absl::CEscape(test_case.input);
}
ErrorCase kErrorCases[] = {
@@ -1067,7 +1113,8 @@
{"'\\X' foo", true, "0:2: Invalid escape sequence in string literal.\n"},
{"'\\x' foo", true, "0:3: Expected hex digits for escape sequence.\n"},
{"'foo", false, "0:4: Unexpected end of string.\n"},
- {"'bar\nfoo", true, "0:4: String literals cannot cross line boundaries.\n"},
+ {"'bar\nfoo", true,
+ "0:4: Multiline strings are not allowed. Did you miss a \"?.\n"},
{"'\\u01' foo", true,
"0:5: Expected four hex digits for \\u escape sequence.\n"},
{"'\\u01' foo", true,
diff --git a/src/google/protobuf/stubs/statusor.cc b/src/google/protobuf/io/zero_copy_sink.cc
similarity index 67%
copy from src/google/protobuf/stubs/statusor.cc
copy to src/google/protobuf/io/zero_copy_sink.cc
index 9c0a178..7045648 100644
--- a/src/google/protobuf/stubs/statusor.cc
+++ b/src/google/protobuf/io/zero_copy_sink.cc
@@ -28,21 +28,41 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/stubs/statusor.h>
+#include "google/protobuf/io/zero_copy_sink.h"
-#include <google/protobuf/stubs/logging.h>
+#include <algorithm>
+#include <cstddef>
namespace google {
namespace protobuf {
-namespace util {
-namespace statusor_internal {
+namespace io {
+namespace zc_sink_internal {
+void ZeroCopyStreamByteSink::Append(const char* bytes, size_t len) {
+ while (!failed_ && len > 0) {
+ if (buffer_size_ == 0) {
+ int size;
+ if (!stream_->Next(&buffer_, &size)) {
+ // There isn't a way for ByteSink to report errors.
+ buffer_size_ = 0;
+ failed_ = true;
+ return;
+ }
+ buffer_size_ = static_cast<unsigned int>(size);
+ }
-void StatusOrHelper::Crash(const Status& status) {
- GOOGLE_LOG(FATAL) << "Attempting to fetch value instead of handling error "
- << status.ToString();
+ auto to_write = std::min(len, buffer_size_);
+ memcpy(buffer_, bytes, to_write);
+
+ buffer_ = static_cast<char*>(buffer_) + to_write;
+ buffer_size_ -= to_write;
+
+ bytes += to_write;
+ len -= to_write;
+
+ bytes_written_ += to_write;
+ }
}
-
-} // namespace statusor_internal
-} // namespace util
+} // namespace zc_sink_internal
+} // namespace io
} // namespace protobuf
} // namespace google
diff --git a/src/google/protobuf/io/zero_copy_sink.h b/src/google/protobuf/io/zero_copy_sink.h
new file mode 100644
index 0000000..4d70d39
--- /dev/null
+++ b/src/google/protobuf/io/zero_copy_sink.h
@@ -0,0 +1,80 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef GOOGLE_PROTOBUF_UTIL_ZERO_COPY_SINK_H__
+#define GOOGLE_PROTOBUF_UTIL_ZERO_COPY_SINK_H__
+
+#include <cstddef>
+
+#include "google/protobuf/stubs/bytestream.h"
+#include "google/protobuf/io/zero_copy_stream.h"
+#include "google/protobuf/port.h"
+
+// Must be included last.
+#include "google/protobuf/port_def.inc"
+
+namespace google {
+namespace protobuf {
+namespace io {
+namespace zc_sink_internal {
+// Internal helper class, for turning a ZeroCopyOutputStream into a sink.
+class PROTOBUF_EXPORT ZeroCopyStreamByteSink : public strings::ByteSink {
+ public:
+ explicit ZeroCopyStreamByteSink(io::ZeroCopyOutputStream* stream)
+ : stream_(stream) {}
+ ZeroCopyStreamByteSink(const ZeroCopyStreamByteSink&) = delete;
+ ZeroCopyStreamByteSink& operator=(const ZeroCopyStreamByteSink&) = delete;
+
+ ~ZeroCopyStreamByteSink() override {
+ if (buffer_size_ > 0) {
+ stream_->BackUp(buffer_size_);
+ }
+ }
+
+ void Append(const char* bytes, size_t len) override;
+ void Write(absl::string_view str) { Append(str.data(), str.size()); }
+
+ size_t bytes_written() { return bytes_written_; }
+ bool failed() { return failed_; }
+
+ private:
+ io::ZeroCopyOutputStream* stream_;
+ void* buffer_ = nullptr;
+ size_t buffer_size_ = 0;
+ size_t bytes_written_ = 0;
+ bool failed_ = false;
+};
+} // namespace zc_sink_internal
+} // namespace io
+} // namespace protobuf
+} // namespace google
+
+#include "google/protobuf/port_undef.inc"
+#endif // GOOGLE_PROTOBUF_UTIL_ZERO_COPY_SINK_H__
diff --git a/src/google/protobuf/io/zero_copy_sink_test.cc b/src/google/protobuf/io/zero_copy_sink_test.cc
new file mode 100644
index 0000000..7c69eda
--- /dev/null
+++ b/src/google/protobuf/io/zero_copy_sink_test.cc
@@ -0,0 +1,228 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "google/protobuf/io/zero_copy_sink.h"
+
+#include <algorithm>
+#include <array>
+#include <cstdint>
+#include <string>
+#include <vector>
+
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include <gtest/gtest.h>
+#include "absl/strings/escaping.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/string_view.h"
+
+namespace google {
+namespace protobuf {
+namespace io {
+namespace zc_sink_internal {
+namespace {
+
+class ChunkedString {
+ public:
+ explicit ChunkedString(absl::string_view data, size_t skipped_patterns)
+ : data_(data), skipped_patterns_(skipped_patterns) {}
+
+ // Returns the next chunk; empty if out of chunks.
+ absl::string_view NextChunk() {
+ if (pattern_bit_idx_ == data_.size()) {
+ return "";
+ }
+ size_t start = pattern_bit_idx_;
+ do {
+ ++pattern_bit_idx_;
+ } while (pattern_bit_idx_ < data_.size() &&
+ (pattern_ >> pattern_bit_idx_ & 1) == 0);
+ size_t end = pattern_bit_idx_;
+ return data_.substr(start, end - start);
+ }
+
+ // Resets the stream and runs the next pattern of splits.
+ bool NextPattern() {
+ pattern_ += skipped_patterns_;
+ if (pattern_ >= (1 << data_.size())) {
+ return false;
+ }
+ pattern_bit_idx_ = 0;
+ return true;
+ }
+
+ // prints out the pattern as a sequence of quoted strings.
+ std::string PatternAsQuotedString() {
+ std::string out;
+ size_t start = 0;
+ for (size_t i = 0; i <= data_.size(); ++i) {
+ if (i == data_.size() || (pattern_ >> start & 1) != 0) {
+ if (!out.empty()) {
+ absl::StrAppend(&out, " ");
+ }
+ absl::StrAppend(
+ &out, "\"",
+ absl::CHexEscape(std::string{data_.substr(start, i - start)}),
+ "\"");
+ start = i;
+ }
+ }
+ return out;
+ }
+
+ private:
+ absl::string_view data_;
+ size_t skipped_patterns_;
+ // pattern_ is a bitset indicating at which indices we insert a seam.
+ uint64_t pattern_ = 0;
+ size_t pattern_bit_idx_ = 0;
+};
+
+class PatternedOutputStream : public io::ZeroCopyOutputStream {
+ public:
+ explicit PatternedOutputStream(ChunkedString data) : data_(data) {}
+
+ bool Next(void** buffer, int* length) override {
+ absl::string_view segment;
+ if (!back_up_.empty()) {
+ segment = back_up_.back();
+ back_up_.pop_back();
+ } else {
+ segment_ = data_.NextChunk();
+ segment = segment_;
+ }
+
+ if (segment_.empty()) {
+ return false;
+ }
+
+ // TODO(b/234159981): This is only ever constructed in test code, and only
+ // from non-const bytes, so this is a valid cast. We need to do this since
+ // OSS proto does not yet have absl::Span; once we take a full Abseil
+ // dependency we should use that here instead.
+ *buffer = const_cast<char*>(segment.data());
+ *length = static_cast<int>(segment.size());
+ byte_count_ += static_cast<int64_t>(segment.size());
+ return true;
+ }
+
+ void BackUp(int length) override {
+ GOOGLE_CHECK(length <= static_cast<int>(segment_.size()));
+
+ size_t backup = segment_.size() - static_cast<size_t>(length);
+ back_up_.push_back(segment_.substr(backup));
+ segment_ = segment_.substr(0, backup);
+ byte_count_ -= static_cast<int64_t>(length);
+ }
+
+ int64_t ByteCount() const override { return byte_count_; }
+
+ private:
+ ChunkedString data_;
+ absl::string_view segment_;
+
+ std::vector<absl::string_view> back_up_;
+ int64_t byte_count_ = 0;
+};
+
+class ZeroCopyStreamByteSinkTest : public testing::Test {
+ protected:
+ std::array<char, 10> output_{};
+ absl::string_view output_view_{output_.data(), output_.size()};
+ ChunkedString output_chunks_{output_view_, 7};
+};
+
+TEST_F(ZeroCopyStreamByteSinkTest, WriteExact) {
+ do {
+ SCOPED_TRACE(output_chunks_.PatternAsQuotedString());
+ ChunkedString input("0123456789", 1);
+
+ do {
+ SCOPED_TRACE(input.PatternAsQuotedString());
+ output_ = {};
+ PatternedOutputStream output_stream(output_chunks_);
+ ZeroCopyStreamByteSink byte_sink(&output_stream);
+ SCOPED_TRACE(input.PatternAsQuotedString());
+ absl::string_view chunk;
+ while (!(chunk = input.NextChunk()).empty()) {
+ byte_sink.Append(chunk.data(), chunk.size());
+ }
+ } while (input.NextPattern());
+
+ ASSERT_EQ(output_view_, "0123456789");
+ } while (output_chunks_.NextPattern());
+}
+
+TEST_F(ZeroCopyStreamByteSinkTest, WriteShort) {
+ do {
+ SCOPED_TRACE(output_chunks_.PatternAsQuotedString());
+ ChunkedString input("012345678", 1);
+
+ do {
+ SCOPED_TRACE(input.PatternAsQuotedString());
+ output_ = {};
+ PatternedOutputStream output_stream(output_chunks_);
+ ZeroCopyStreamByteSink byte_sink(&output_stream);
+ SCOPED_TRACE(input.PatternAsQuotedString());
+ absl::string_view chunk;
+ while (!(chunk = input.NextChunk()).empty()) {
+ byte_sink.Append(chunk.data(), chunk.size());
+ }
+ } while (input.NextPattern());
+
+ ASSERT_EQ(output_view_, absl::string_view("012345678\0", 10));
+ } while (output_chunks_.NextPattern());
+}
+
+TEST_F(ZeroCopyStreamByteSinkTest, WriteLong) {
+ do {
+ SCOPED_TRACE(output_chunks_.PatternAsQuotedString());
+ ChunkedString input("0123456789A", 1);
+
+ do {
+ SCOPED_TRACE(input.PatternAsQuotedString());
+ output_ = {};
+ PatternedOutputStream output_stream(output_chunks_);
+ ZeroCopyStreamByteSink byte_sink(&output_stream);
+ SCOPED_TRACE(input.PatternAsQuotedString());
+ absl::string_view chunk;
+ while (!(chunk = input.NextChunk()).empty()) {
+ byte_sink.Append(chunk.data(), chunk.size());
+ }
+ } while (input.NextPattern());
+
+ ASSERT_EQ(output_view_, "0123456789");
+ } while (output_chunks_.NextPattern());
+}
+} // namespace
+} // namespace zc_sink_internal
+} // namespace io
+} // namespace protobuf
+} // namespace google
diff --git a/src/google/protobuf/io/zero_copy_stream.cc b/src/google/protobuf/io/zero_copy_stream.cc
index f81555e..83b7225 100644
--- a/src/google/protobuf/io/zero_copy_stream.cc
+++ b/src/google/protobuf/io/zero_copy_stream.cc
@@ -32,10 +32,10 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/io/zero_copy_stream.h>
+#include "google/protobuf/io/zero_copy_stream.h"
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/io/zero_copy_stream.h b/src/google/protobuf/io/zero_copy_stream.h
index 2041cbf..ad27345 100644
--- a/src/google/protobuf/io/zero_copy_stream.h
+++ b/src/google/protobuf/io/zero_copy_stream.h
@@ -107,12 +107,12 @@
#ifndef GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_H__
#define GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_H__
-
-#include <google/protobuf/stubs/common.h>
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/port.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -127,6 +127,8 @@
class PROTOBUF_EXPORT ZeroCopyInputStream {
public:
ZeroCopyInputStream() {}
+ ZeroCopyInputStream(const ZeroCopyInputStream&) = delete;
+ ZeroCopyInputStream& operator=(const ZeroCopyInputStream&) = delete;
virtual ~ZeroCopyInputStream() {}
// Obtains a chunk of data from the stream.
@@ -181,9 +183,6 @@
// Returns the total number of bytes read since this object was created.
virtual int64_t ByteCount() const = 0;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ZeroCopyInputStream);
};
// Abstract interface similar to an output stream but designed to minimize
@@ -191,6 +190,8 @@
class PROTOBUF_EXPORT ZeroCopyOutputStream {
public:
ZeroCopyOutputStream() {}
+ ZeroCopyOutputStream(const ZeroCopyOutputStream&) = delete;
+ ZeroCopyOutputStream& operator=(const ZeroCopyOutputStream&) = delete;
virtual ~ZeroCopyOutputStream() {}
// Obtains a buffer into which data can be written. Any data written
@@ -246,15 +247,12 @@
virtual bool WriteAliasedRaw(const void* data, int size);
virtual bool AllowsAliasing() const { return false; }
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ZeroCopyOutputStream);
};
} // namespace io
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_H__
diff --git a/src/google/protobuf/io/zero_copy_stream_impl.cc b/src/google/protobuf/io/zero_copy_stream_impl.cc
index c66bc86..2955c7b 100644
--- a/src/google/protobuf/io/zero_copy_stream_impl.cc
+++ b/src/google/protobuf/io/zero_copy_stream_impl.cc
@@ -43,11 +43,11 @@
#include <algorithm>
#include <iostream>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/io/io_win32.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/stubs/stl_util.h>
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/io/io_win32.h"
+#include "google/protobuf/io/zero_copy_stream_impl.h"
+#include "google/protobuf/stubs/stl_util.h"
namespace google {
diff --git a/src/google/protobuf/io/zero_copy_stream_impl.h b/src/google/protobuf/io/zero_copy_stream_impl.h
index a385992..d5a119c 100644
--- a/src/google/protobuf/io/zero_copy_stream_impl.h
+++ b/src/google/protobuf/io/zero_copy_stream_impl.h
@@ -40,16 +40,15 @@
#ifndef GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_IMPL_H__
#define GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_IMPL_H__
-
#include <iosfwd>
#include <string>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/io/zero_copy_stream.h"
+#include "google/protobuf/io/zero_copy_stream_impl_lite.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -71,6 +70,8 @@
// should be read and returned with each call to Next(). Otherwise,
// a reasonable default is used.
explicit FileInputStream(int file_descriptor, int block_size = -1);
+ FileInputStream(const FileInputStream&) = delete;
+ FileInputStream& operator=(const FileInputStream&) = delete;
// Flushes any buffers and closes the underlying file. Returns false if
// an error occurs during the process; use GetErrno() to examine the error.
@@ -101,6 +102,8 @@
: public CopyingInputStream {
public:
CopyingFileInputStream(int file_descriptor);
+ CopyingFileInputStream(const CopyingFileInputStream&) = delete;
+ CopyingFileInputStream& operator=(const CopyingFileInputStream&) = delete;
~CopyingFileInputStream() override;
bool Close();
@@ -123,14 +126,10 @@
// Did we try to seek once and fail? If so, we assume this file descriptor
// doesn't support seeking and won't try again.
bool previous_seek_failed_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CopyingFileInputStream);
};
CopyingFileInputStream copying_input_;
CopyingInputStreamAdaptor impl_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FileInputStream);
};
// ===================================================================
@@ -150,6 +149,8 @@
// that should be returned by Next(). Otherwise, a reasonable default
// is used.
explicit FileOutputStream(int file_descriptor, int block_size = -1);
+ FileOutputStream(const FileOutputStream&) = delete;
+ FileOutputStream& operator=(const FileOutputStream&) = delete;
~FileOutputStream() override;
@@ -176,6 +177,8 @@
: public CopyingOutputStream {
public:
CopyingFileOutputStream(int file_descriptor);
+ CopyingFileOutputStream(const CopyingFileOutputStream&) = delete;
+ CopyingFileOutputStream& operator=(const CopyingFileOutputStream&) = delete;
~CopyingFileOutputStream() override;
bool Close();
@@ -193,13 +196,9 @@
// The errno of the I/O error, if one has occurred. Otherwise, zero.
int errno_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CopyingFileOutputStream);
};
CopyingFileOutputStream copying_output_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FileOutputStream);
};
// ===================================================================
@@ -216,6 +215,8 @@
// should be read and returned with each call to Next(). Otherwise,
// a reasonable default is used.
explicit IstreamInputStream(std::istream* stream, int block_size = -1);
+ IstreamInputStream(const IstreamInputStream&) = delete;
+ IstreamInputStream& operator=(const IstreamInputStream&) = delete;
// implements ZeroCopyInputStream ----------------------------------
bool Next(const void** data, int* size) override;
@@ -228,6 +229,9 @@
: public CopyingInputStream {
public:
CopyingIstreamInputStream(std::istream* input);
+ CopyingIstreamInputStream(const CopyingIstreamInputStream&) = delete;
+ CopyingIstreamInputStream& operator=(const CopyingIstreamInputStream&) =
+ delete;
~CopyingIstreamInputStream() override;
// implements CopyingInputStream ---------------------------------
@@ -237,14 +241,10 @@
private:
// The stream.
std::istream* input_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CopyingIstreamInputStream);
};
CopyingIstreamInputStream copying_input_;
CopyingInputStreamAdaptor impl_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(IstreamInputStream);
};
// ===================================================================
@@ -261,6 +261,8 @@
// that should be returned by Next(). Otherwise, a reasonable default
// is used.
explicit OstreamOutputStream(std::ostream* stream, int block_size = -1);
+ OstreamOutputStream(const OstreamOutputStream&) = delete;
+ OstreamOutputStream& operator=(const OstreamOutputStream&) = delete;
~OstreamOutputStream() override;
// implements ZeroCopyOutputStream ---------------------------------
@@ -273,6 +275,9 @@
: public CopyingOutputStream {
public:
CopyingOstreamOutputStream(std::ostream* output);
+ CopyingOstreamOutputStream(const CopyingOstreamOutputStream&) = delete;
+ CopyingOstreamOutputStream& operator=(const CopyingOstreamOutputStream&) =
+ delete;
~CopyingOstreamOutputStream() override;
// implements CopyingOutputStream --------------------------------
@@ -281,14 +286,10 @@
private:
// The stream.
std::ostream* output_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CopyingOstreamOutputStream);
};
CopyingOstreamOutputStream copying_output_;
CopyingOutputStreamAdaptor impl_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(OstreamOutputStream);
};
// ===================================================================
@@ -306,6 +307,8 @@
// All streams passed in as well as the array itself must remain valid
// until the ConcatenatingInputStream is destroyed.
ConcatenatingInputStream(ZeroCopyInputStream* const streams[], int count);
+ ConcatenatingInputStream(const ConcatenatingInputStream&) = delete;
+ ConcatenatingInputStream& operator=(const ConcatenatingInputStream&) = delete;
~ConcatenatingInputStream() override = default;
// implements ZeroCopyInputStream ----------------------------------
@@ -321,8 +324,6 @@
ZeroCopyInputStream* const* streams_;
int stream_count_;
int64_t bytes_retired_; // Bytes read from previous streams.
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ConcatenatingInputStream);
};
// ===================================================================
@@ -331,6 +332,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_IMPL_H__
diff --git a/src/google/protobuf/io/zero_copy_stream_impl_lite.cc b/src/google/protobuf/io/zero_copy_stream_impl_lite.cc
index b3dfd84..9becd2c 100644
--- a/src/google/protobuf/io/zero_copy_stream_impl_lite.cc
+++ b/src/google/protobuf/io/zero_copy_stream_impl_lite.cc
@@ -32,15 +32,19 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
+#include "google/protobuf/io/zero_copy_stream_impl_lite.h"
#include <algorithm>
#include <limits>
+#include <utility>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/casts.h>
-#include <google/protobuf/stubs/stl_util.h>
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/stubs/logging.h"
+#include "absl/base/casts.h"
+#include "absl/strings/internal/resize_uninitialized.h"
+
+// Must be included last
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -154,7 +158,7 @@
// Avoid integer overflow in returned '*size'.
new_size = std::min(new_size, old_size + std::numeric_limits<int>::max());
// Increase the size, also make sure that it is at least kMinimumSize.
- STLStringResizeUninitialized(
+ absl::strings_internal::STLStringResizeUninitialized(
target_,
std::max(new_size,
kMinimumSize + 0)); // "+ 0" works around GCC4 weirdness.
@@ -183,7 +187,7 @@
int skipped = 0;
while (skipped < count) {
int bytes = Read(junk, std::min(count - skipped,
- implicit_cast<int>(sizeof(junk))));
+ absl::implicit_cast<int>(sizeof(junk))));
if (bytes <= 0) {
// EOF or read error.
return skipped;
diff --git a/src/google/protobuf/io/zero_copy_stream_impl_lite.h b/src/google/protobuf/io/zero_copy_stream_impl_lite.h
index cbda328..28ad9d6 100644
--- a/src/google/protobuf/io/zero_copy_stream_impl_lite.h
+++ b/src/google/protobuf/io/zero_copy_stream_impl_lite.h
@@ -44,19 +44,20 @@
#ifndef GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_IMPL_LITE_H__
#define GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_IMPL_LITE_H__
-
#include <iosfwd>
#include <memory>
#include <string>
+#include <utility>
-#include <google/protobuf/stubs/callback.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/stubs/stl_util.h>
+#include "google/protobuf/stubs/callback.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/io/zero_copy_stream.h"
+#include "google/protobuf/port.h"
+#include "google/protobuf/stubs/stl_util.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -78,6 +79,10 @@
ArrayInputStream(const void* data, int size, int block_size = -1);
~ArrayInputStream() override = default;
+ // `ArrayInputStream` is neither copiable nor assignable
+ ArrayInputStream(const ArrayInputStream&) = delete;
+ ArrayInputStream& operator=(const ArrayInputStream&) = delete;
+
// implements ZeroCopyInputStream ----------------------------------
bool Next(const void** data, int* size) override;
void BackUp(int count) override;
@@ -93,8 +98,6 @@
int position_;
int last_returned_size_; // How many bytes we returned last time Next()
// was called (used for error checking only).
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ArrayInputStream);
};
// ===================================================================
@@ -113,6 +116,10 @@
ArrayOutputStream(void* data, int size, int block_size = -1);
~ArrayOutputStream() override = default;
+ // `ArrayOutputStream` is neither copiable nor assignable
+ ArrayOutputStream(const ArrayOutputStream&) = delete;
+ ArrayOutputStream& operator=(const ArrayOutputStream&) = delete;
+
// implements ZeroCopyOutputStream ---------------------------------
bool Next(void** data, int* size) override;
void BackUp(int count) override;
@@ -126,8 +133,6 @@
int position_;
int last_returned_size_; // How many bytes we returned last time Next()
// was called (used for error checking only).
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ArrayOutputStream);
};
// ===================================================================
@@ -148,6 +153,10 @@
explicit StringOutputStream(std::string* target);
~StringOutputStream() override = default;
+ // `StringOutputStream` is neither copiable nor assignable
+ StringOutputStream(const StringOutputStream&) = delete;
+ StringOutputStream& operator=(const StringOutputStream&) = delete;
+
// implements ZeroCopyOutputStream ---------------------------------
bool Next(void** data, int* size) override;
void BackUp(int count) override;
@@ -157,8 +166,6 @@
static constexpr size_t kMinimumSize = 16;
std::string* target_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(StringOutputStream);
};
// Note: There is no StringInputStream. Instead, just create an
@@ -215,6 +222,10 @@
int block_size = -1);
~CopyingInputStreamAdaptor() override;
+ // `CopyingInputStreamAdaptor` is neither copiable nor assignable
+ CopyingInputStreamAdaptor(const CopyingInputStreamAdaptor&) = delete;
+ CopyingInputStreamAdaptor& operator=(const CopyingInputStreamAdaptor&) = delete;
+
// Call SetOwnsCopyingStream(true) to tell the CopyingInputStreamAdaptor to
// delete the underlying CopyingInputStream when it is destroyed.
void SetOwnsCopyingStream(bool value) { owns_copying_stream_ = value; }
@@ -255,8 +266,6 @@
// BackUp(). These need to be returned again.
// 0 <= backup_bytes_ <= buffer_used_
int backup_bytes_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CopyingInputStreamAdaptor);
};
// ===================================================================
@@ -298,6 +307,10 @@
int block_size = -1);
~CopyingOutputStreamAdaptor() override;
+ // `CopyingOutputStreamAdaptor` is neither copiable nor assignable
+ CopyingOutputStreamAdaptor(const CopyingOutputStreamAdaptor&) = delete;
+ CopyingOutputStreamAdaptor& operator=(const CopyingOutputStreamAdaptor&) = delete;
+
// Writes all pending data to the underlying stream. Returns false if a
// write error occurred on the underlying stream. (The underlying
// stream itself is not necessarily flushed.)
@@ -342,8 +355,6 @@
// returned by Next()). When BackUp() is called, we just reduce this.
// 0 <= buffer_used_ <= buffer_size_.
int buffer_used_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CopyingOutputStreamAdaptor);
};
// ===================================================================
@@ -356,6 +367,10 @@
LimitingInputStream(ZeroCopyInputStream* input, int64_t limit);
~LimitingInputStream() override;
+ // `LimitingInputStream` is neither copiable nor assignable
+ LimitingInputStream(const LimitingInputStream&) = delete;
+ LimitingInputStream& operator=(const LimitingInputStream&) = delete;
+
// implements ZeroCopyInputStream ----------------------------------
bool Next(const void** data, int* size) override;
void BackUp(int count) override;
@@ -367,8 +382,6 @@
ZeroCopyInputStream* input_;
int64_t limit_; // Decreases as we go, becomes negative if we overshoot.
int64_t prior_bytes_read_; // Bytes read on underlying stream at construction
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(LimitingInputStream);
};
@@ -408,6 +421,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_IMPL_LITE_H__
diff --git a/src/google/protobuf/io/zero_copy_stream_unittest.cc b/src/google/protobuf/io/zero_copy_stream_unittest.cc
index d4e5b54..d656da5 100644
--- a/src/google/protobuf/io/zero_copy_stream_unittest.cc
+++ b/src/google/protobuf/io/zero_copy_stream_unittest.cc
@@ -61,21 +61,22 @@
#include <memory>
#include <sstream>
+#include <utility>
-#include <google/protobuf/testing/file.h>
-#include <google/protobuf/test_util2.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/io_win32.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
+#include "google/protobuf/testing/file.h"
+#include "google/protobuf/test_util2.h"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/io/io_win32.h"
+#include "google/protobuf/io/zero_copy_stream_impl.h"
#if HAVE_ZLIB
-#include <google/protobuf/io/gzip_stream.h>
+#include "google/protobuf/io/gzip_stream.h"
#endif
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/testing/file.h>
-#include <google/protobuf/testing/googletest.h>
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/testing/file.h"
+#include "google/protobuf/testing/googletest.h"
#include <gtest/gtest.h>
namespace google {
@@ -139,7 +140,7 @@
};
const int IoTest::kBlockSizes[] = {-1, 1, 2, 5, 7, 10, 23, 64};
-const int IoTest::kBlockSizeCount = GOOGLE_ARRAYSIZE(IoTest::kBlockSizes);
+const int IoTest::kBlockSizeCount = ABSL_ARRAYSIZE(IoTest::kBlockSizes);
bool IoTest::WriteToOutput(ZeroCopyOutputStream* output, const void* data,
int size) {
@@ -570,7 +571,7 @@
// Some ad-hoc testing of compression options.
std::string golden_filename =
- TestUtil::GetTestDataPath("net/proto2/internal/testdata/golden_message");
+ TestUtil::GetTestDataPath("third_party/protobuf/testdata/golden_message");
std::string golden;
GOOGLE_CHECK_OK(File::GetContents(golden_filename, &golden, true));
@@ -719,6 +720,9 @@
// Verifies that outputs up to kint32max can be created.
TEST_F(IoTest, LargeOutput) {
+ // Filter out this test on 32-bit architectures.
+ if(sizeof(void*) < 8) return;
+
std::string str;
StringOutputStream output(&str);
void* unused_data;
@@ -1024,7 +1028,7 @@
&input5, &input6, &input7};
// Create the concatenating stream and read.
- ConcatenatingInputStream input(streams, GOOGLE_ARRAYSIZE(streams));
+ ConcatenatingInputStream input(streams, ABSL_ARRAYSIZE(streams));
ReadStuff(&input);
}
@@ -1052,7 +1056,7 @@
TEST_F(IoTest, LimitingInputStreamByteCount) {
const int kHalfBufferSize = 128;
const int kBufferSize = kHalfBufferSize * 2;
- uint8 buffer[kBufferSize];
+ uint8 buffer[kBufferSize] = {};
// Set up input. Only allow half to be read at once.
ArrayInputStream array_input(buffer, kBufferSize, kHalfBufferSize);
diff --git a/src/google/protobuf/lite_arena_unittest.cc b/src/google/protobuf/lite_arena_unittest.cc
index d68c6c9..927663d 100644
--- a/src/google/protobuf/lite_arena_unittest.cc
+++ b/src/google/protobuf/lite_arena_unittest.cc
@@ -28,8 +28,8 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/arena_test_util.h>
-#include <google/protobuf/map_lite_test_util.h>
+#include "google/protobuf/arena_test_util.h"
+#include "google/protobuf/map_lite_test_util.h"
#include <gtest/gtest.h>
namespace google {
diff --git a/src/google/protobuf/lite_unittest.cc b/src/google/protobuf/lite_unittest.cc
index 583d325..3b615b7 100644
--- a/src/google/protobuf/lite_unittest.cc
+++ b/src/google/protobuf/lite_unittest.cc
@@ -34,21 +34,22 @@
#include <iostream>
#include <string>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/map_lite_unittest.pb.h>
-#include <google/protobuf/unittest_lite.pb.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/map_lite_unittest.pb.h"
+#include "google/protobuf/unittest_lite.pb.h"
#include <gtest/gtest.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/arena_test_util.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
-#include <google/protobuf/map_lite_test_util.h>
-#include <google/protobuf/parse_context.h>
-#include <google/protobuf/test_util_lite.h>
-#include <google/protobuf/wire_format_lite.h>
+#include "absl/strings/match.h"
+#include "absl/strings/string_view.h"
+#include "google/protobuf/arena_test_util.h"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/io/zero_copy_stream.h"
+#include "google/protobuf/io/zero_copy_stream_impl.h"
+#include "google/protobuf/io/zero_copy_stream_impl_lite.h"
+#include "google/protobuf/map_lite_test_util.h"
+#include "google/protobuf/parse_context.h"
+#include "google/protobuf/test_util_lite.h"
+#include "google/protobuf/wire_format_lite.h"
namespace google {
namespace protobuf {
@@ -1143,8 +1144,8 @@
TEST(Lite, DebugString) {
protobuf_unittest::TestAllTypesLite message1, message2;
- EXPECT_TRUE(HasPrefixString(message1.DebugString(), "MessageLite at 0x"));
- EXPECT_TRUE(HasPrefixString(message2.DebugString(), "MessageLite at 0x"));
+ EXPECT_TRUE(absl::StartsWith(message1.DebugString(), "MessageLite at 0x"));
+ EXPECT_TRUE(absl::StartsWith(message2.DebugString(), "MessageLite at 0x"));
// DebugString() and ShortDebugString() are the same for now.
EXPECT_EQ(message1.DebugString(), message1.ShortDebugString());
diff --git a/src/google/protobuf/map.cc b/src/google/protobuf/map.cc
index d60a9a2..1d7535d 100644
--- a/src/google/protobuf/map.cc
+++ b/src/google/protobuf/map.cc
@@ -28,7 +28,7 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/map.h>
+#include "google/protobuf/map.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/map.h b/src/google/protobuf/map.h
index 008c192..9f7c200 100644
--- a/src/google/protobuf/map.h
+++ b/src/google/protobuf/map.h
@@ -55,19 +55,19 @@
#include <mach/mach_time.h>
#endif
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/arena.h>
-#include <google/protobuf/generated_enum_util.h>
-#include <google/protobuf/map_type_handler.h>
-#include <google/protobuf/port.h>
-#include <google/protobuf/stubs/hash.h>
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/arena.h"
+#include "google/protobuf/generated_enum_util.h"
+#include "google/protobuf/map_type_handler.h"
+#include "google/protobuf/port.h"
+
#ifdef SWIG
#error "You cannot SWIG proto headers"
#endif
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -333,6 +333,11 @@
} // namespace internal
+#ifdef PROTOBUF_FUTURE_MAP_PAIR_UPGRADE
+// This is the class for Map's internal value_type.
+template <typename Key, typename T>
+using MapPair = std::pair<const Key, T>;
+#else
// This is the class for Map's internal value_type. Instead of using
// std::pair as value_type, we use this class which provides us more control of
// its process of construction and destruction.
@@ -363,6 +368,7 @@
friend class Arena;
friend class Map<Key, T>;
};
+#endif
// Map is an associative container type used to store protobuf map
// fields. Each Map instance may or may not use a different hash function, a
@@ -379,6 +385,7 @@
public:
using key_type = Key;
using mapped_type = T;
+ using init_type = std::pair<Key, T>;
using value_type = MapPair<Key, T>;
using pointer = value_type*;
@@ -421,6 +428,22 @@
~Map() {}
private:
+ template <typename P>
+ struct SameAsElementReference
+ : std::is_same<typename std::remove_cv<
+ typename std::remove_reference<reference>::type>::type,
+ typename std::remove_cv<
+ typename std::remove_reference<P>::type>::type> {};
+
+ template <class P>
+ using RequiresInsertable =
+ typename std::enable_if<std::is_convertible<P, init_type>::value ||
+ SameAsElementReference<P>::value,
+ int>::type;
+ template <class P>
+ using RequiresNotInit =
+ typename std::enable_if<!std::is_same<P, init_type>::value, int>::type;
+
using Allocator = internal::MapAllocator<void*>;
// InnerMap is a generic hash-based map. It doesn't contain any
@@ -466,6 +489,9 @@
table_(const_cast<void**>(internal::kGlobalEmptyTable)),
alloc_(arena) {}
+ InnerMap(const InnerMap&) = delete;
+ InnerMap& operator=(const InnerMap&) = delete;
+
~InnerMap() {
if (alloc_.arena() == nullptr &&
num_buckets_ != internal::kGlobalEmptyTableSize) {
@@ -1181,7 +1207,6 @@
size_type index_of_first_non_null_;
void** table_; // an array with num_buckets_ entries
Allocator alloc_;
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(InnerMap);
}; // end of class InnerMap
template <typename LookupKey>
@@ -1270,7 +1295,6 @@
const_iterator cbegin() const { return begin(); }
const_iterator cend() const { return end(); }
- // Capacity
size_type size() const { return elements_.size(); }
bool empty() const { return size() == 0; }
@@ -1351,23 +1375,31 @@
elements_.try_emplace(std::forward<K>(k), std::forward<Args>(args)...);
return std::pair<iterator, bool>(iterator(p.first), p.second);
}
- std::pair<iterator, bool> insert(const value_type& value) {
- return try_emplace(value.first, value.second);
+ std::pair<iterator, bool> insert(init_type&& value) {
+ return try_emplace(std::move(value.first), std::move(value.second));
}
- std::pair<iterator, bool> insert(value_type&& value) {
- return try_emplace(value.first, std::move(value.second));
+ template <typename P, RequiresInsertable<P> = 0>
+ std::pair<iterator, bool> insert(P&& value) {
+ return try_emplace(std::forward<P>(value).first,
+ std::forward<P>(value).second);
}
template <typename... Args>
std::pair<iterator, bool> emplace(Args&&... args) {
- return insert(value_type(std::forward<Args>(args)...));
+ return EmplaceInternal(Rank0{}, std::forward<Args>(args)...);
}
template <class InputIt>
void insert(InputIt first, InputIt last) {
for (; first != last; ++first) {
- try_emplace(first->first, first->second);
+ auto&& pair = *first;
+ try_emplace(pair.first, pair.second);
}
}
- void insert(std::initializer_list<value_type> values) {
+ void insert(std::initializer_list<init_type> values) {
+ insert(values.begin(), values.end());
+ }
+ template <typename P, RequiresNotInit<P> = 0,
+ RequiresInsertable<const P&> = 0>
+ void insert(std::initializer_list<P> values) {
insert(values.begin(), values.end());
}
@@ -1405,7 +1437,7 @@
void swap(Map& other) {
if (arena() == other.arena()) {
- InternalSwap(other);
+ InternalSwap(&other);
} else {
// TODO(zuguang): optimize this. The temporary copy can be allocated
// in the same arena as the other message, and the "other = copy" can
@@ -1416,7 +1448,7 @@
}
}
- void InternalSwap(Map& other) { elements_.Swap(&other.elements_); }
+ void InternalSwap(Map* other) { elements_.Swap(&other->elements_); }
// Access to hasher. Currently this returns a copy, but it may
// be modified to return a const reference in the future.
@@ -1428,6 +1460,23 @@
}
private:
+ struct Rank1 {};
+ struct Rank0 : Rank1 {};
+
+ // We try to construct `init_type` from `Args` with a fall back to
+ // `value_type`. The latter is less desired as it unconditionally makes a copy
+ // of `value_type::first`.
+ template <typename... Args>
+ auto EmplaceInternal(Rank0, Args&&... args) ->
+ typename std::enable_if<std::is_constructible<init_type, Args...>::value,
+ std::pair<iterator, bool>>::type {
+ return insert(init_type(std::forward<Args>(args)...));
+ }
+ template <typename... Args>
+ std::pair<iterator, bool> EmplaceInternal(Rank1, Args&&... args) {
+ return insert(value_type(std::forward<Args>(args)...));
+ }
+
Arena* arena() const { return elements_.arena(); }
InnerMap elements_;
@@ -1443,6 +1492,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_MAP_H__
diff --git a/src/google/protobuf/map_entry.h b/src/google/protobuf/map_entry.h
index 536dec9..d220d90 100644
--- a/src/google/protobuf/map_entry.h
+++ b/src/google/protobuf/map_entry.h
@@ -31,16 +31,16 @@
#ifndef GOOGLE_PROTOBUF_MAP_ENTRY_H__
#define GOOGLE_PROTOBUF_MAP_ENTRY_H__
-#include <google/protobuf/port.h>
-#include <google/protobuf/generated_message_reflection.h>
-#include <google/protobuf/map_entry_lite.h>
-#include <google/protobuf/map_type_handler.h>
-#include <google/protobuf/reflection_ops.h>
-#include <google/protobuf/unknown_field_set.h>
-#include <google/protobuf/wire_format_lite.h>
+#include "google/protobuf/port.h"
+#include "google/protobuf/generated_message_reflection.h"
+#include "google/protobuf/map_entry_lite.h"
+#include "google/protobuf/map_type_handler.h"
+#include "google/protobuf/reflection_ops.h"
+#include "google/protobuf/unknown_field_set.h"
+#include "google/protobuf/wire_format_lite.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
#ifdef SWIG
#error "You cannot SWIG proto headers"
@@ -98,6 +98,8 @@
explicit MapEntry(Arena* arena)
: MapEntryImpl<Derived, Message, Key, Value, kKeyFieldType,
kValueFieldType>(arena) {}
+ MapEntry(const MapEntry&) = delete;
+ MapEntry& operator=(const MapEntry&) = delete;
~MapEntry() override {
Message::_internal_metadata_.template Delete<UnknownFieldSet>();
}
@@ -121,14 +123,12 @@
template <typename C, typename K, typename V,
WireFormatLite::FieldType k_wire_type, WireFormatLite::FieldType>
friend class internal::MapField;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MapEntry);
};
} // namespace internal
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_MAP_ENTRY_H__
diff --git a/src/google/protobuf/map_entry_lite.h b/src/google/protobuf/map_entry_lite.h
index 6b08cd9..78ed4f2 100644
--- a/src/google/protobuf/map_entry_lite.h
+++ b/src/google/protobuf/map_entry_lite.h
@@ -37,19 +37,20 @@
#include <string>
#include <utility>
-#include <google/protobuf/stubs/casts.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/arena.h>
-#include <google/protobuf/port.h>
-#include <google/protobuf/arenastring.h>
-#include <google/protobuf/generated_message_util.h>
-#include <google/protobuf/map.h>
-#include <google/protobuf/map_type_handler.h>
-#include <google/protobuf/parse_context.h>
-#include <google/protobuf/wire_format_lite.h>
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/arena.h"
+#include "absl/base/casts.h"
+#include "google/protobuf/arenastring.h"
+#include "google/protobuf/generated_message_util.h"
+#include "google/protobuf/map.h"
+#include "google/protobuf/map_type_handler.h"
+#include "google/protobuf/parse_context.h"
+#include "google/protobuf/port.h"
+#include "google/protobuf/wire_format_lite.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
+
#ifdef SWIG
#error "You cannot SWIG proto headers"
#endif
@@ -159,6 +160,9 @@
value_(ValueTypeHandler::Constinit()),
_has_bits_{} {}
+ MapEntryImpl(const MapEntryImpl&) = delete;
+ MapEntryImpl& operator=(const MapEntryImpl&) = delete;
+
~MapEntryImpl() override {
if (Base::GetArenaForAllocation() != nullptr) return;
KeyTypeHandler::DeleteNoArena(key_);
@@ -429,8 +433,6 @@
template <typename C, typename K, typename V, WireFormatLite::FieldType,
WireFormatLite::FieldType>
friend class internal::MapFieldLite;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MapEntryImpl);
};
template <typename T, typename Key, typename Value,
@@ -443,14 +445,13 @@
kValueFieldType>
SuperType;
constexpr MapEntryLite() {}
+ MapEntryLite(const MapEntryLite&) = delete;
+ MapEntryLite& operator=(const MapEntryLite&) = delete;
explicit MapEntryLite(Arena* arena) : SuperType(arena) {}
~MapEntryLite() override {
MessageLite::_internal_metadata_.template Delete<std::string>();
}
void MergeFrom(const MapEntryLite& other) { MergeFromInternal(other); }
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MapEntryLite);
};
// Helpers for deterministic serialization =============================
@@ -558,6 +559,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_MAP_ENTRY_LITE_H__
diff --git a/src/google/protobuf/map_field.cc b/src/google/protobuf/map_field.cc
index ed662df..b340104 100644
--- a/src/google/protobuf/map_field.cc
+++ b/src/google/protobuf/map_field.cc
@@ -28,18 +28,20 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/map_field.h>
+#include "google/protobuf/map_field.h"
#include <vector>
-#include <google/protobuf/map_field_inl.h>
+#include "google/protobuf/port.h"
+#include "google/protobuf/map_field_inl.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
namespace internal {
+using ::google::protobuf::internal::DownCast;
void MapFieldBase::Destruct() {
if (arena_ == nullptr) {
@@ -427,7 +429,7 @@
}
void DynamicMapField::Swap(MapFieldBase* other) {
- DynamicMapField* other_field = down_cast<DynamicMapField*>(other);
+ DynamicMapField* other_field = DownCast<DynamicMapField*>(other);
std::swap(this->MapFieldBase::repeated_field_, other_field->repeated_field_);
map_.swap(other_field->map_);
// a relaxed swap of the atomic
@@ -651,4 +653,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/map_field.h b/src/google/protobuf/map_field.h
index 287d58f..0f1a607 100644
--- a/src/google/protobuf/map_field.h
+++ b/src/google/protobuf/map_field.h
@@ -34,22 +34,22 @@
#include <atomic>
#include <functional>
-#include <google/protobuf/arena.h>
-#include <google/protobuf/stubs/mutex.h>
-#include <google/protobuf/port.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/generated_message_reflection.h>
-#include <google/protobuf/generated_message_util.h>
-#include <google/protobuf/map_entry.h>
-#include <google/protobuf/map_field_lite.h>
-#include <google/protobuf/map_type_handler.h>
-#include <google/protobuf/message.h>
-#include <google/protobuf/repeated_field.h>
-#include <google/protobuf/unknown_field_set.h>
+#include "google/protobuf/arena.h"
+#include "google/protobuf/port.h"
+#include "absl/synchronization/mutex.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/generated_message_reflection.h"
+#include "google/protobuf/generated_message_util.h"
+#include "google/protobuf/map_entry.h"
+#include "google/protobuf/map_field_lite.h"
+#include "google/protobuf/map_type_handler.h"
+#include "google/protobuf/message.h"
+#include "google/protobuf/repeated_field.h"
+#include "google/protobuf/unknown_field_set.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
#ifdef SWIG
#error "You cannot SWIG proto headers"
@@ -342,10 +342,12 @@
constexpr MapFieldBase(ConstantInitialized)
: arena_(nullptr),
repeated_field_(nullptr),
- mutex_(GOOGLE_PROTOBUF_LINKER_INITIALIZED),
+ mutex_(absl::kConstInit),
state_(STATE_MODIFIED_MAP) {}
explicit MapFieldBase(Arena* arena)
: arena_(arena), repeated_field_(nullptr), state_(STATE_MODIFIED_MAP) {}
+ MapFieldBase(const MapFieldBase&) = delete;
+ MapFieldBase& operator=(const MapFieldBase&) = delete;
protected:
~MapFieldBase() { // "protected" stops users from deleting a `MapFieldBase *`
@@ -449,9 +451,8 @@
Arena* arena_;
mutable RepeatedPtrField<Message>* repeated_field_;
- mutable internal::WrappedMutex
- mutex_; // The thread to synchronize map and repeated field
- // needs to get lock first;
+ mutable absl::Mutex mutex_; // The thread to synchronize map and repeated
+ // field needs to get lock first;
mutable std::atomic<State> state_;
private:
@@ -484,8 +485,6 @@
// Swaps state_ with another MapFieldBase
void SwapState(MapFieldBase* other);
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MapFieldBase);
};
// This class provides common Map Reflection implementations for generated
@@ -494,6 +493,8 @@
class TypeDefinedMapFieldBase : public MapFieldBase {
public:
TypeDefinedMapFieldBase() {}
+ TypeDefinedMapFieldBase(const TypeDefinedMapFieldBase&) = delete;
+ TypeDefinedMapFieldBase& operator=(const TypeDefinedMapFieldBase&) = delete;
// This constructor is for constant initialized global instances.
// It uses a linker initialized mutex, so it is not compatible with regular
@@ -529,7 +530,6 @@
void IncreaseIterator(MapIterator* map_iter) const override;
virtual void SetMapIteratorValue(MapIterator* map_iter) const = 0;
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TypeDefinedMapFieldBase);
};
// This class provides access to map field using generated api. It is used for
@@ -562,6 +562,8 @@
typedef Map<Key, T> MapType;
MapField() : impl_() {}
+ MapField(const MapField&) = delete;
+ MapField& operator=(const MapField&) = delete;
virtual ~MapField() {} // Destruct() must already have been called!
void Destruct() {
impl_.Destruct();
@@ -635,7 +637,6 @@
friend class ::PROTOBUF_NAMESPACE_ID::Arena;
friend class MapFieldStateTest; // For testing, it needs raw access to impl_
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MapField);
};
template <typename Derived, typename Key, typename T,
@@ -664,6 +665,8 @@
public:
explicit DynamicMapField(const Message* default_entry);
DynamicMapField(const Message* default_entry, Arena* arena);
+ DynamicMapField(const DynamicMapField&) = delete;
+ DynamicMapField& operator=(const DynamicMapField&) = delete;
virtual ~DynamicMapField();
// Implement MapFieldBase
@@ -694,7 +697,6 @@
void SyncMapWithRepeatedFieldNoLock() const override;
size_t SpaceUsedExcludingSelfNoLock() const override;
void SetMapIteratorValue(MapIterator* map_iter) const override;
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DynamicMapField);
};
} // namespace internal
@@ -941,6 +943,6 @@
#pragma warning(pop) // restore warning C4265
#endif // _MSC_VER
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_MAP_FIELD_H__
diff --git a/src/google/protobuf/map_field_inl.h b/src/google/protobuf/map_field_inl.h
index 7c4c232..9311abd 100644
--- a/src/google/protobuf/map_field_inl.h
+++ b/src/google/protobuf/map_field_inl.h
@@ -33,10 +33,14 @@
#include <memory>
-#include <google/protobuf/stubs/casts.h>
-#include <google/protobuf/map.h>
-#include <google/protobuf/map_field.h>
-#include <google/protobuf/map_type_handler.h>
+#include "absl/base/casts.h"
+#include "google/protobuf/map.h"
+#include "google/protobuf/map_field.h"
+#include "google/protobuf/map_type_handler.h"
+#include "google/protobuf/port.h"
+
+// must be last
+#include "google/protobuf/port_def.inc"
#ifdef SWIG
#error "You cannot SWIG proto headers"
@@ -278,7 +282,7 @@
void MapField<Derived, Key, T, kKeyFieldType, kValueFieldType>::Swap(
MapFieldBase* other) {
MapFieldBase::Swap(other);
- MapField* other_field = down_cast<MapField*>(other);
+ MapField* other_field = DownCast<MapField*>(other);
impl_.Swap(&other_field->impl_);
}
@@ -287,7 +291,7 @@
WireFormatLite::FieldType kValueFieldType>
void MapField<Derived, Key, T, kKeyFieldType,
kValueFieldType>::UnsafeShallowSwap(MapFieldBase* other) {
- InternalSwap(down_cast<MapField*>(other));
+ InternalSwap(DownCast<MapField*>(other));
}
template <typename Derived, typename Key, typename T,
@@ -325,7 +329,7 @@
for (typename Map<Key, T>::const_iterator it = map.begin(); it != map.end();
++it) {
EntryType* new_entry =
- down_cast<EntryType*>(default_entry->New(this->MapFieldBase::arena_));
+ DownCast<EntryType*>(default_entry->New(this->MapFieldBase::arena_));
repeated_field->AddAllocated(new_entry);
(*new_entry->mutable_key()) = it->first;
(*new_entry->mutable_value()) = it->second;
@@ -372,4 +376,6 @@
} // namespace protobuf
} // namespace google
+#include "google/protobuf/port_undef.inc"
+
#endif // GOOGLE_PROTOBUF_MAP_FIELD_INL_H__
diff --git a/src/google/protobuf/map_field_lite.h b/src/google/protobuf/map_field_lite.h
index 53bf7a0..d8e539c 100644
--- a/src/google/protobuf/map_field_lite.h
+++ b/src/google/protobuf/map_field_lite.h
@@ -33,15 +33,15 @@
#include <type_traits>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/port.h>
-#include <google/protobuf/map.h>
-#include <google/protobuf/map_entry_lite.h>
-#include <google/protobuf/parse_context.h>
-#include <google/protobuf/wire_format_lite.h>
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/port.h"
+#include "google/protobuf/map.h"
+#include "google/protobuf/map_entry_lite.h"
+#include "google/protobuf/parse_context.h"
+#include "google/protobuf/wire_format_lite.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
#ifdef SWIG
#error "You cannot SWIG proto headers"
@@ -83,7 +83,7 @@
// data in it, as would happen if a vector was resize'd to zero.
// Map::Swap with an empty map accomplishes that.
decltype(map_) swapped_map(map_.arena());
- map_.InternalSwap(swapped_map);
+ map_.InternalSwap(&swapped_map);
}
~MapFieldLite() {
if (map_.arena() == nullptr && !map_.empty()) {
@@ -105,7 +105,7 @@
}
}
void Swap(MapFieldLite* other) { map_.swap(other->map_); }
- void InternalSwap(MapFieldLite* other) { map_.InternalSwap(other->map_); }
+ void InternalSwap(MapFieldLite* other) { map_.InternalSwap(&other->map_); }
// Used in the implementation of parsing. Caller should take the ownership iff
// arena_ is nullptr.
@@ -204,6 +204,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_MAP_FIELD_LITE_H__
diff --git a/src/google/protobuf/map_field_test.cc b/src/google/protobuf/map_field_test.cc
index 1659c95..e5c296f 100644
--- a/src/google/protobuf/map_field_test.cc
+++ b/src/google/protobuf/map_field_test.cc
@@ -32,21 +32,22 @@
#include <memory>
#include <unordered_map>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/map_unittest.pb.h>
-#include <google/protobuf/unittest.pb.h>
-#include <google/protobuf/arena.h>
-#include <google/protobuf/map.h>
-#include <google/protobuf/map_field_inl.h>
-#include <google/protobuf/message.h>
-#include <google/protobuf/repeated_field.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/map_unittest.pb.h"
+#include "google/protobuf/unittest.pb.h"
+#include "google/protobuf/arena.h"
+#include "google/protobuf/map.h"
+#include "google/protobuf/map_field_inl.h"
+#include "google/protobuf/message.h"
+#include "google/protobuf/repeated_field.h"
#include <gtest/gtest.h>
-#include <google/protobuf/arena_test_util.h>
-#include <google/protobuf/map_test_util.h>
+#include "absl/strings/str_format.h"
+#include "google/protobuf/arena_test_util.h"
+#include "google/protobuf/map_test_util.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/map_lite_test_util.cc b/src/google/protobuf/map_lite_test_util.cc
index 121f267..d519ba4 100644
--- a/src/google/protobuf/map_lite_test_util.cc
+++ b/src/google/protobuf/map_lite_test_util.cc
@@ -28,10 +28,10 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/map_lite_test_util.h>
+#include "google/protobuf/map_lite_test_util.h"
-#include <google/protobuf/map_lite_unittest.pb.h>
-#include <google/protobuf/map_test_util_impl.h>
+#include "google/protobuf/map_lite_unittest.pb.h"
+#include "google/protobuf/map_test_util_impl.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/map_lite_test_util.h b/src/google/protobuf/map_lite_test_util.h
index 573de7b..a4a1e61 100644
--- a/src/google/protobuf/map_lite_test_util.h
+++ b/src/google/protobuf/map_lite_test_util.h
@@ -31,7 +31,7 @@
#ifndef GOOGLE_PROTOBUF_MAP_LITE_TEST_UTIL_H__
#define GOOGLE_PROTOBUF_MAP_LITE_TEST_UTIL_H__
-#include <google/protobuf/map_lite_unittest.pb.h>
+#include "google/protobuf/map_lite_unittest.pb.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/map_test.cc b/src/google/protobuf/map_test.cc
index f7c024c..4eee747 100644
--- a/src/google/protobuf/map_test.cc
+++ b/src/google/protobuf/map_test.cc
@@ -28,10 +28,10 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/map_proto2_unittest.pb.h>
-#include <google/protobuf/map_unittest.pb.h>
-#include <google/protobuf/reflection_tester.h>
-#include <google/protobuf/test_util2.h>
+#include "google/protobuf/map_proto2_unittest.pb.h"
+#include "google/protobuf/map_unittest.pb.h"
+#include "google/protobuf/reflection_tester.h"
+#include "google/protobuf/test_util2.h"
#define BRIDGE_UNITTEST ::google::protobuf::bridge_unittest
@@ -41,13 +41,13 @@
// Must include after defining UNITTEST, etc.
// clang-format off
-#include <google/protobuf/test_util.inc>
-#include <google/protobuf/map_test_util.inc>
-#include <google/protobuf/map_test.inc>
+#include "google/protobuf/test_util.inc"
+#include "google/protobuf/map_test_util.inc"
+#include "google/protobuf/map_test.inc"
// clang-format on
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -84,3 +84,5 @@
} // namespace internal
} // namespace protobuf
} // namespace google
+
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/map_test.inc b/src/google/protobuf/map_test.inc
index 18a7bfb..baf3c82 100644
--- a/src/google/protobuf/map_test.inc
+++ b/src/google/protobuf/map_test.inc
@@ -46,36 +46,36 @@
#include <unordered_set>
#include <vector>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/testing/file.h>
-#include <google/protobuf/descriptor.pb.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/testing/file.h"
+#include "google/protobuf/descriptor.pb.h"
#include <gmock/gmock.h>
-#include <google/protobuf/testing/googletest.h>
+#include "google/protobuf/testing/googletest.h"
#include <gtest/gtest.h>
-#include <google/protobuf/stubs/casts.h>
-#include <google/protobuf/stubs/substitute.h>
-#include <google/protobuf/arena_test_util.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/descriptor_database.h>
-#include <google/protobuf/dynamic_message.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/tokenizer.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/map.h>
-#include <google/protobuf/map_field_inl.h>
-#include <google/protobuf/message.h>
-#include <google/protobuf/reflection.h>
-#include <google/protobuf/reflection_ops.h>
-#include <google/protobuf/test_util2.h>
-#include <google/protobuf/text_format.h>
-#include <google/protobuf/util/message_differencer.h>
-#include <google/protobuf/util/time_util.h>
-#include <google/protobuf/wire_format.h>
+#include "absl/base/casts.h"
+#include "absl/strings/substitute.h"
+#include "google/protobuf/arena_test_util.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/descriptor_database.h"
+#include "google/protobuf/dynamic_message.h"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/io/tokenizer.h"
+#include "google/protobuf/io/zero_copy_stream_impl.h"
+#include "google/protobuf/map.h"
+#include "google/protobuf/map_field_inl.h"
+#include "google/protobuf/message.h"
+#include "google/protobuf/reflection.h"
+#include "google/protobuf/reflection_ops.h"
+#include "google/protobuf/test_util2.h"
+#include "google/protobuf/text_format.h"
+#include "google/protobuf/util/message_differencer.h"
+#include "google/protobuf/util/time_util.h"
+#include "google/protobuf/wire_format.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -92,6 +92,7 @@
}
namespace {
+using internal::DownCast;
// Map API Test =====================================================
@@ -737,6 +738,47 @@
EXPECT_FALSE(result2.second);
}
+TEST_F(MapImplTest, InsertSingleBraceInitList) {
+ int32_t key = 0;
+ int32_t value1 = 100;
+ int32_t value2 = 101;
+
+ // Insert a non-existing key.
+ auto result1 = map_.insert({key, value1});
+ ExpectSingleElement(key, value1);
+
+ auto it1 = result1.first;
+ EXPECT_EQ(key, it1->first);
+ EXPECT_EQ(value1, it1->second);
+ EXPECT_TRUE(result1.second);
+
+ // Insert an existing key.
+ auto result2 = map_.insert({key, value2});
+ ExpectSingleElement(key, value1);
+
+ auto it2 = result2.first;
+ EXPECT_TRUE(it1 == it2);
+ EXPECT_FALSE(result2.second);
+}
+
+TEST_F(MapImplTest, InsertSingleBraceInitListTypeMismatch) {
+ int32_t key = 0;
+ int32_t value1 = 100;
+ int32_t value2 = 101;
+ Map<int64_t, int64_t> m;
+
+ // Insert a non-existing key.
+ auto result1 = m.insert({key, value1});
+ EXPECT_TRUE(result1.second);
+
+ // Insert an existing key.
+ auto result2 = m.insert({key, value2});
+ EXPECT_FALSE(result2.second);
+
+ EXPECT_TRUE(result1.first == result2.first);
+}
+
+
TEST_F(MapImplTest, TryEmplace) {
using ::testing::Pair;
using ::testing::UnorderedElementsAre;
@@ -769,6 +811,59 @@
m, UnorderedElementsAre(Pair(1, "one"), Pair(2, "two"), Pair(42, "aaa")));
}
+#ifndef PROTOBUF_FUTURE_MAP_PAIR_UPGRADE
+
+TEST_F(MapImplTest, EmplaceKeyOnly) {
+ using ::testing::Pair;
+ using ::testing::UnorderedElementsAre;
+
+ Map<int32_t, std::string> m;
+
+ m.emplace(1);
+ EXPECT_EQ(m.size(), 1);
+
+ const int32_t key = 42;
+ m.emplace(key);
+ EXPECT_THAT(m, UnorderedElementsAre(Pair(1, ""), Pair(42, "")));
+}
+
+#else
+
+TEST_F(MapImplTest, ValueTypeNoImplicitConversion) {
+ using vt = typename Map<const char*, int>::value_type;
+
+ EXPECT_FALSE((std::is_convertible<
+ vt, std::pair<std::string, std::vector<std::string>>>::value));
+}
+
+enum class ConstructorType {
+ kDefault,
+ kCopy,
+ kMove,
+};
+
+struct ConstructorTag {
+ ConstructorTag() : invoked_constructor(ConstructorType::kDefault) {}
+ ConstructorTag(const ConstructorTag&)
+ : invoked_constructor(ConstructorType::kCopy) {}
+ ConstructorTag(ConstructorTag&&)
+ : invoked_constructor(ConstructorType::kMove) {}
+
+ ConstructorType invoked_constructor;
+};
+
+TEST_F(MapImplTest, ValueTypeHasMoveConstructor) {
+ using vt = typename Map<ConstructorTag, ConstructorTag>::value_type;
+ ConstructorTag l, r;
+
+ vt pair(l, std::move(r));
+
+ EXPECT_EQ(pair.first.invoked_constructor, ConstructorType::kCopy);
+ EXPECT_EQ(pair.second.invoked_constructor, ConstructorType::kMove);
+}
+
+#endif // !PROTOBUF_FUTURE_MAP_PAIR_UPGRADE
+
struct CountedInstance {
CountedInstance() { ++num_created; }
CountedInstance(const CountedInstance&) : CountedInstance() {}
@@ -1393,7 +1488,7 @@
static int Func(int i, int j) { return i * j; }
-static std::string StrFunc(int i, int j) { return StrCat(Func(i, j)); }
+static std::string StrFunc(int i, int j) { return absl::StrCat(Func(i, j)); }
static int Int(const std::string& value) {
int result = 0;
@@ -1516,7 +1611,7 @@
message_int32_message.GetReflection()->GetInt32(
message_int32_message, fd_map_int32_foreign_message_key);
const ForeignMessage& value_int32_message =
- down_cast<const ForeignMessage&>(
+ DownCast<const ForeignMessage&>(
message_int32_message.GetReflection()->GetMessage(
message_int32_message, fd_map_int32_foreign_message_value));
EXPECT_EQ(value_int32_message.c(), Func(key_int32_message, 6));
@@ -1553,7 +1648,7 @@
message_int32_message.GetReflection()->GetInt32(
message_int32_message, fd_map_int32_foreign_message_key);
const ForeignMessage& value_int32_message =
- down_cast<const ForeignMessage&>(
+ DownCast<const ForeignMessage&>(
message_int32_message.GetReflection()->GetMessage(
message_int32_message, fd_map_int32_foreign_message_value));
EXPECT_EQ(value_int32_message.c(), Func(key_int32_message, 6));
@@ -1590,7 +1685,7 @@
int32_t key_int32_message =
message_int32_message->GetReflection()->GetInt32(
*message_int32_message, fd_map_int32_foreign_message_key);
- ForeignMessage* value_int32_message = down_cast<ForeignMessage*>(
+ ForeignMessage* value_int32_message = DownCast<ForeignMessage*>(
message_int32_message->GetReflection()->MutableMessage(
message_int32_message, fd_map_int32_foreign_message_value));
value_int32_message->set_c(Func(key_int32_message, -6));
@@ -1746,7 +1841,7 @@
message_int32_message.GetReflection()->GetInt32(
message_int32_message, fd_map_int32_foreign_message_key);
const ForeignMessage& value_int32_message =
- down_cast<const ForeignMessage&>(
+ DownCast<const ForeignMessage&>(
message_int32_message.GetReflection()->GetMessage(
message_int32_message, fd_map_int32_foreign_message_value));
EXPECT_EQ(value_int32_message.c(), Func(key_int32_message, 6));
@@ -1787,7 +1882,7 @@
message_int32_message.GetReflection()->GetInt32(
message_int32_message, fd_map_int32_foreign_message_key);
const ForeignMessage& value_int32_message =
- down_cast<const ForeignMessage&>(
+ DownCast<const ForeignMessage&>(
message_int32_message.GetReflection()->GetMessage(
message_int32_message, fd_map_int32_foreign_message_value));
EXPECT_EQ(value_int32_message.c(), Func(key_int32_message, 6));
@@ -1917,7 +2012,7 @@
int32_t key = message.GetReflection()->GetInt32(
message, fd_map_int32_foreign_message_key);
const ForeignMessage& sub_message =
- down_cast<const ForeignMessage&>(message.GetReflection()->GetMessage(
+ DownCast<const ForeignMessage&>(message.GetReflection()->GetMessage(
message, fd_map_int32_foreign_message_value));
result[key].MergeFrom(sub_message);
++index;
@@ -2072,13 +2167,13 @@
const Message& message0a =
mmf_int32_foreign_message.Get(0, entry_int32_foreign_message.get());
const ForeignMessage& sub_message0a =
- down_cast<const ForeignMessage&>(message0a.GetReflection()->GetMessage(
+ DownCast<const ForeignMessage&>(message0a.GetReflection()->GetMessage(
message0a, fd_map_int32_foreign_message_value));
int32_t int32_value0a = sub_message0a.c();
const Message& message9a =
mmf_int32_foreign_message.Get(9, entry_int32_foreign_message.get());
const ForeignMessage& sub_message9a =
- down_cast<const ForeignMessage&>(message9a.GetReflection()->GetMessage(
+ DownCast<const ForeignMessage&>(message9a.GetReflection()->GetMessage(
message9a, fd_map_int32_foreign_message_value));
int32_t int32_value9a = sub_message9a.c();
@@ -2087,13 +2182,13 @@
const Message& message0b =
mmf_int32_foreign_message.Get(0, entry_int32_foreign_message.get());
const ForeignMessage& sub_message0b =
- down_cast<const ForeignMessage&>(message0b.GetReflection()->GetMessage(
+ DownCast<const ForeignMessage&>(message0b.GetReflection()->GetMessage(
message0b, fd_map_int32_foreign_message_value));
int32_t int32_value0b = sub_message0b.c();
const Message& message9b =
mmf_int32_foreign_message.Get(9, entry_int32_foreign_message.get());
const ForeignMessage& sub_message9b =
- down_cast<const ForeignMessage&>(message9b.GetReflection()->GetMessage(
+ DownCast<const ForeignMessage&>(message9b.GetReflection()->GetMessage(
message9b, fd_map_int32_foreign_message_value));
int32_t int32_value9b = sub_message9b.c();
@@ -2431,7 +2526,7 @@
MapTestUtil::SetMapFields(&message1);
- const Message* source = implicit_cast<const Message*>(&message1);
+ const Message* source = absl::implicit_cast<const Message*>(&message1);
message2.CopyFrom(*source);
MapTestUtil::ExpectMapFieldsSet(message2);
@@ -2938,7 +3033,7 @@
*p++ = 0;
*p++ = WireFormatLite::MakeTag(2, WireFormatLite::WIRETYPE_LENGTH_DELIMITED);
*p++ = payload_size;
- StrAppend(&s, dummy4_s, dummy5_s);
+ absl::StrAppend(&s, dummy4_s, dummy5_s);
// Test key then value then value.
int key = 0;
@@ -3689,7 +3784,7 @@
static std::string ConstructKey(uint64_t n) {
std::string s(n % static_cast<uint64_t>(9), '\0');
if (s.empty()) {
- return StrCat(n);
+ return absl::StrCat(n);
} else {
while (n != 0) {
s[n % s.size()] = (n >> 10) & 0x7f;
@@ -3749,7 +3844,7 @@
const std::string filename = "golden_message_maps";
std::string golden;
GOOGLE_CHECK_OK(File::GetContents(
- TestUtil::GetTestDataPath("net/proto2/internal/testdata/" + filename),
+ TestUtil::GetTestDataPath("third_party/protobuf/testdata/" + filename),
&golden, true));
t.ParseFromString(golden);
*(p.mutable_m()) = t;
@@ -3791,11 +3886,10 @@
std::string expected_text;
GOOGLE_CHECK_OK(
- File::GetContents(TestUtil::GetTestDataPath("net/proto2/internal/"
+ File::GetContents(TestUtil::GetTestDataPath("third_party/protobuf/"
"testdata/map_test_data.txt"),
&expected_text, true));
- CleanStringLineEndings(&expected_text, false);
std::string actual_text;
TextFormat::PrintToString(*message, &actual_text);
EXPECT_EQ(actual_text, expected_text);
@@ -3808,11 +3902,10 @@
std::string expected_text;
GOOGLE_CHECK_OK(
- File::GetContents(TestUtil::GetTestDataPath("net/proto2/internal/"
+ File::GetContents(TestUtil::GetTestDataPath("third_party/protobuf/"
"testdata/map_test_data.txt"),
&expected_text, true));
- CleanStringLineEndings(&expected_text, false);
TextFormat::Printer printer;
std::string actual_text;
printer.PrintToString(message, &actual_text);
@@ -3828,10 +3921,10 @@
TEST(TextFormatMapTest, ParseCorruptedString) {
std::string serialized_message;
- GOOGLE_CHECK_OK(
- File::GetContents(TestUtil::GetTestDataPath(
- "net/proto2/internal/testdata/golden_message_maps"),
- &serialized_message, true));
+ GOOGLE_CHECK_OK(File::GetContents(
+ TestUtil::GetTestDataPath(
+ "third_party/protobuf/testdata/golden_message_maps"),
+ &serialized_message, true));
UNITTEST::TestMaps message;
GOOGLE_CHECK(message.ParseFromString(serialized_message));
TestParseCorruptedString<UNITTEST::TestMaps, true>(message);
@@ -4068,4 +4161,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/map_test_util.h b/src/google/protobuf/map_test_util.h
index f3215db..130e494 100644
--- a/src/google/protobuf/map_test_util.h
+++ b/src/google/protobuf/map_test_util.h
@@ -31,14 +31,14 @@
#ifndef GOOGLE_PROTOBUF_MAP_TEST_UTIL_H__
#define GOOGLE_PROTOBUF_MAP_TEST_UTIL_H__
-#include <google/protobuf/map_unittest.pb.h>
-#include <google/protobuf/reflection_tester.h>
+#include "google/protobuf/map_unittest.pb.h"
+#include "google/protobuf/reflection_tester.h"
#define UNITTEST ::protobuf_unittest
#define BRIDGE_UNITTEST ::google::protobuf::bridge_unittest
// Must be included after defining UNITTEST, etc.
-#include <google/protobuf/map_test_util.inc>
+#include "google/protobuf/map_test_util.inc"
#undef UNITTEST
#undef BRIDGE_UNITTEST
diff --git a/src/google/protobuf/map_test_util.inc b/src/google/protobuf/map_test_util.inc
index 5b12c76..14b781a 100644
--- a/src/google/protobuf/map_test_util.inc
+++ b/src/google/protobuf/map_test_util.inc
@@ -28,9 +28,9 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/map_test_util_impl.h>
-#include <google/protobuf/message.h>
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/map_test_util_impl.h"
+#include "google/protobuf/message.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/map_test_util_impl.h b/src/google/protobuf/map_test_util_impl.h
index 655aec8..adbc3fc 100644
--- a/src/google/protobuf/map_test_util_impl.h
+++ b/src/google/protobuf/map_test_util_impl.h
@@ -31,8 +31,8 @@
#ifndef GOOGLE_PROTOBUF_MAP_TEST_UTIL_IMPL_H__
#define GOOGLE_PROTOBUF_MAP_TEST_UTIL_IMPL_H__
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
#include <gtest/gtest.h>
diff --git a/src/google/protobuf/map_type_handler.h b/src/google/protobuf/map_type_handler.h
index c210c63d..c092792 100644
--- a/src/google/protobuf/map_type_handler.h
+++ b/src/google/protobuf/map_type_handler.h
@@ -31,11 +31,11 @@
#ifndef GOOGLE_PROTOBUF_MAP_TYPE_HANDLER_H__
#define GOOGLE_PROTOBUF_MAP_TYPE_HANDLER_H__
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/arena.h>
-#include <google/protobuf/arenastring.h>
-#include <google/protobuf/parse_context.h>
-#include <google/protobuf/wire_format_lite.h>
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/arena.h"
+#include "google/protobuf/arenastring.h"
+#include "google/protobuf/parse_context.h"
+#include "google/protobuf/wire_format_lite.h"
#ifdef SWIG
#error "You cannot SWIG proto headers"
diff --git a/src/google/protobuf/message.cc b/src/google/protobuf/message.cc
index 6cdc6c8..4cad7af 100644
--- a/src/google/protobuf/message.cc
+++ b/src/google/protobuf/message.cc
@@ -32,40 +32,43 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/message.h>
+#include "google/protobuf/message.h"
#include <iostream>
#include <stack>
#include <unordered_map>
-#include <google/protobuf/stubs/casts.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/generated_message_reflection.h>
-#include <google/protobuf/generated_message_util.h>
-#include <google/protobuf/map_field.h>
-#include <google/protobuf/map_field_inl.h>
-#include <google/protobuf/parse_context.h>
-#include <google/protobuf/reflection_internal.h>
-#include <google/protobuf/reflection_ops.h>
-#include <google/protobuf/unknown_field_set.h>
-#include <google/protobuf/wire_format.h>
-#include <google/protobuf/wire_format_lite.h>
-#include <google/protobuf/stubs/map_util.h>
-#include <google/protobuf/stubs/stl_util.h>
-#include <google/protobuf/stubs/hash.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/io/zero_copy_stream_impl.h"
+#include "absl/base/casts.h"
+#include "absl/container/flat_hash_map.h"
+#include "absl/container/flat_hash_set.h"
+#include "absl/strings/str_join.h"
+#include "absl/strings/string_view.h"
+#include "absl/synchronization/mutex.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/generated_message_reflection.h"
+#include "google/protobuf/generated_message_tctable_impl.h"
+#include "google/protobuf/generated_message_util.h"
+#include "google/protobuf/map_field.h"
+#include "google/protobuf/map_field_inl.h"
+#include "google/protobuf/parse_context.h"
+#include "google/protobuf/reflection_internal.h"
+#include "google/protobuf/reflection_ops.h"
+#include "google/protobuf/unknown_field_set.h"
+#include "google/protobuf/wire_format.h"
+#include "google/protobuf/wire_format_lite.h"
+#include "google/protobuf/stubs/stl_util.h"
+
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
-
namespace internal {
// TODO(gerbens) make this factorized better. This should not have to hop
@@ -75,6 +78,7 @@
} // namespace internal
+using internal::DownCast;
using internal::ReflectionOps;
using internal::WireFormat;
using internal::WireFormatLite;
@@ -92,7 +96,7 @@
}
void Message::CheckTypeAndMergeFrom(const MessageLite& other) {
- MergeFrom(*down_cast<const Message*>(&other));
+ MergeFrom(*DownCast<const Message*>(&other));
}
void Message::CopyFrom(const Message& from) {
@@ -152,7 +156,7 @@
std::string Message::InitializationErrorString() const {
std::vector<std::string> errors;
FindInitializationErrors(&errors);
- return Join(errors, ", ");
+ return absl::StrJoin(errors, ", ");
}
void Message::CheckInitialized() const {
@@ -167,7 +171,15 @@
const char* Message::_InternalParse(const char* ptr,
internal::ParseContext* ctx) {
+#if defined(PROTOBUF_USE_TABLE_PARSER_ON_REFLECTION)
+ auto meta = GetMetadata();
+ ptr = internal::TcParser::ParseLoop(this, ptr, ctx,
+ meta.reflection->GetTcParseTable());
+
+ return ptr;
+#else
return WireFormat::_InternalParse(this, ptr, ctx);
+#endif
}
uint8_t* Message::_InternalSerialize(uint8_t* target,
@@ -213,6 +225,18 @@
return salt;
}
+namespace internal {
+void* CreateSplitMessageGeneric(Arena* arena, const void* default_split,
+ size_t size, const void* message,
+ const void* default_message) {
+ GOOGLE_DCHECK_NE(message, default_message);
+ void* split =
+ (arena == nullptr) ? ::operator new(size) : arena->AllocateAligned(size);
+ memcpy(split, default_split, size);
+ return split;
+}
+} // namespace internal
+
// =============================================================================
// MessageFactory
@@ -220,11 +244,6 @@
namespace {
-
-#define HASH_MAP std::unordered_map
-#define STR_HASH_FXN hash<::google::protobuf::StringPiece>
-
-
class GeneratedMessageFactory final : public MessageFactory {
public:
static GeneratedMessageFactory* singleton();
@@ -236,14 +255,58 @@
const Message* GetPrototype(const Descriptor* type) override;
private:
- // Only written at static init time, so does not require locking.
- HASH_MAP<StringPiece, const google::protobuf::internal::DescriptorTable*,
- STR_HASH_FXN>
- file_map_;
+ const Message* FindInTypeMap(const Descriptor* type)
+ ABSL_SHARED_LOCKS_REQUIRED(mutex_)
+ {
+ auto it = type_map_.find(type);
+ if (it == type_map_.end()) return nullptr;
+ return it->second;
+ }
- internal::WrappedMutex mutex_;
- // Initialized lazily, so requires locking.
- std::unordered_map<const Descriptor*, const Message*> type_map_;
+ const google::protobuf::internal::DescriptorTable* FindInFileMap(
+ absl::string_view name) {
+ auto it = files_.find(name);
+ if (it == files_.end()) return nullptr;
+ return *it;
+ }
+
+ struct DescriptorByNameHash {
+ using is_transparent = void;
+ size_t operator()(const google::protobuf::internal::DescriptorTable* t) const {
+ return absl::HashOf(absl::string_view{t->filename});
+ }
+
+ size_t operator()(absl::string_view name) const {
+ return absl::HashOf(name);
+ }
+ };
+ struct DescriptorByNameEq {
+ using is_transparent = void;
+ bool operator()(const google::protobuf::internal::DescriptorTable* lhs,
+ const google::protobuf::internal::DescriptorTable* rhs) const {
+ return lhs == rhs || (*this)(lhs->filename, rhs->filename);
+ }
+ bool operator()(absl::string_view lhs,
+ const google::protobuf::internal::DescriptorTable* rhs) const {
+ return (*this)(lhs, rhs->filename);
+ }
+ bool operator()(const google::protobuf::internal::DescriptorTable* lhs,
+ absl::string_view rhs) const {
+ return (*this)(lhs->filename, rhs);
+ }
+ bool operator()(absl::string_view lhs, absl::string_view rhs) const {
+ return lhs == rhs;
+ }
+ };
+
+ // Only written at static init time, so does not require locking.
+ absl::flat_hash_set<const google::protobuf::internal::DescriptorTable*,
+ DescriptorByNameHash, DescriptorByNameEq>
+ files_;
+
+ absl::Mutex mutex_;
+ absl::flat_hash_map<const Descriptor*, const Message*> type_map_
+ ABSL_GUARDED_BY(mutex_);
};
GeneratedMessageFactory* GeneratedMessageFactory::singleton() {
@@ -254,7 +317,7 @@
void GeneratedMessageFactory::RegisterFile(
const google::protobuf::internal::DescriptorTable* table) {
- if (!InsertIfNotPresent(&file_map_, table->filename, table)) {
+ if (!files_.insert(table).second) {
GOOGLE_LOG(FATAL) << "File is already registered: " << table->filename;
}
}
@@ -269,7 +332,7 @@
// function during GetPrototype(), in which case we already have locked
// the mutex.
mutex_.AssertHeld();
- if (!InsertIfNotPresent(&type_map_, descriptor, prototype)) {
+ if (!type_map_.try_emplace(descriptor, prototype).second) {
GOOGLE_LOG(DFATAL) << "Type is already registered: " << descriptor->full_name();
}
}
@@ -277,8 +340,8 @@
const Message* GeneratedMessageFactory::GetPrototype(const Descriptor* type) {
{
- ReaderMutexLock lock(&mutex_);
- const Message* result = FindPtrOrNull(type_map_, type);
+ absl::ReaderMutexLock lock(&mutex_);
+ const Message* result = FindInTypeMap(type);
if (result != nullptr) return result;
}
@@ -288,7 +351,7 @@
// Apparently the file hasn't been registered yet. Let's do that now.
const internal::DescriptorTable* registration_data =
- FindPtrOrNull(file_map_, type->file()->name().c_str());
+ FindInFileMap(type->file()->name());
if (registration_data == nullptr) {
GOOGLE_LOG(DFATAL) << "File appears to be in generated pool but wasn't "
"registered: "
@@ -296,15 +359,15 @@
return nullptr;
}
- WriterMutexLock lock(&mutex_);
+ absl::WriterMutexLock lock(&mutex_);
// Check if another thread preempted us.
- const Message* result = FindPtrOrNull(type_map_, type);
+ const Message* result = FindInTypeMap(type);
if (result == nullptr) {
// Nope. OK, register everything.
internal::RegisterFileLevelMetadata(registration_data);
// Should be here now.
- result = FindPtrOrNull(type_map_, type);
+ result = FindInTypeMap(type);
}
if (result == nullptr) {
@@ -396,9 +459,18 @@
GenericTypeHandler<Message>::GetOwningArena(Message* value) {
return value->GetOwningArena();
}
+
+template void InternalMetadata::DoClear<UnknownFieldSet>();
+template void InternalMetadata::DoMergeFrom<UnknownFieldSet>(
+ const UnknownFieldSet& other);
+template void InternalMetadata::DoSwap<UnknownFieldSet>(UnknownFieldSet* other);
+template Arena* InternalMetadata::DeleteOutOfLineHelper<UnknownFieldSet>();
+template UnknownFieldSet*
+InternalMetadata::mutable_unknown_fields_slow<UnknownFieldSet>();
+
} // namespace internal
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/message.h b/src/google/protobuf/message.h
index 39ec154..fd03c6b 100644
--- a/src/google/protobuf/message.h
+++ b/src/google/protobuf/message.h
@@ -116,19 +116,23 @@
#include <type_traits>
#include <vector>
-#include <google/protobuf/stubs/casts.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/arena.h>
-#include <google/protobuf/port.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/generated_message_reflection.h>
-#include <google/protobuf/generated_message_util.h>
-#include <google/protobuf/map.h> // TODO(b/211442718): cleanup
-#include <google/protobuf/message_lite.h>
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/arena.h"
+#include "google/protobuf/port.h"
+#include "absl/base/call_once.h"
+#include "absl/base/casts.h"
+#include "absl/strings/string_view.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/generated_message_reflection.h"
+#include "google/protobuf/generated_message_tctable_decl.h"
+#include "google/protobuf/generated_message_util.h"
+#include "google/protobuf/map.h" // TODO(b/211442718): cleanup
+#include "google/protobuf/message_lite.h"
+#include "google/protobuf/port.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
#ifdef SWIG
#error "You cannot SWIG proto headers"
@@ -157,6 +161,7 @@
class MapFieldBase;
class SwapFieldHelper;
class CachedSize;
+struct TailCallTableInfo;
} // namespace internal
class UnknownFieldSet; // unknown_field_set.h
namespace io {
@@ -203,12 +208,12 @@
namespace internal {
template <class To>
-inline To* GetPointerAtOffset(Message* message, uint32_t offset) {
+inline To* GetPointerAtOffset(void* message, uint32_t offset) {
return reinterpret_cast<To*>(reinterpret_cast<char*>(message) + offset);
}
template <class To>
-const To* GetConstPointerAtOffset(const Message* message, uint32_t offset) {
+const To* GetConstPointerAtOffset(const void* message, uint32_t offset) {
return reinterpret_cast<const To*>(reinterpret_cast<const char*>(message) +
offset);
}
@@ -240,6 +245,8 @@
class PROTOBUF_EXPORT Message : public MessageLite {
public:
constexpr Message() {}
+ Message(const Message&) = delete;
+ Message& operator=(const Message&) = delete;
// Basic Operations ------------------------------------------------
@@ -298,6 +305,10 @@
// using reflection (rather than the generated code implementation for
// ByteSize()). Like ByteSize(), its CPU time is linear in the number of
// fields defined for the proto.
+ //
+ // Note: The precise value of this method should never be depended on, and can
+ // change substantially due to internal details. In debug builds, this will
+ // include a random fuzz factor to prevent these dependencies.
virtual size_t SpaceUsedLong() const;
PROTOBUF_DEPRECATED_MSG("Please use SpaceUsedLong() instead")
@@ -400,12 +411,14 @@
protected:
static uint64_t GetInvariantPerBuild(uint64_t salt);
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Message);
};
namespace internal {
+// Creates and returns an allocation for a split message.
+void* CreateSplitMessageGeneric(Arena* arena, const void* default_split,
+ size_t size, const void* message,
+ const void* default_message);
+
// Forward-declare interfaces used to implement RepeatedFieldRef.
// These are protobuf internals that users shouldn't care about.
class RepeatedFieldAccessor;
@@ -459,6 +472,10 @@
// memory leaks. So, instead we ended up with this flat interface.
class PROTOBUF_EXPORT Reflection final {
public:
+ Reflection(const Reflection&) = delete;
+ Reflection& operator=(const Reflection&) = delete;
+ ~Reflection();
+
// Get the UnknownFieldSet for the message. This contains fields which
// were seen when the Message was parsed but were not recognized according
// to the Message's definition.
@@ -476,6 +493,11 @@
return internal::ToIntSize(SpaceUsedLong(message));
}
+ // Returns true if the given message is a default message instance.
+ bool IsDefaultInstance(const Message& message) const {
+ return schema_.IsDefaultInstance(message);
+ }
+
// Check if the given non-repeated field is set.
bool HasField(const Message& message, const FieldDescriptor* field) const;
@@ -1029,6 +1051,11 @@
bool IsLazilyVerifiedLazyField(const FieldDescriptor* field) const;
bool IsEagerlyVerifiedLazyField(const FieldDescriptor* field) const;
+ bool IsSplit(const FieldDescriptor* field) const {
+ return schema_.IsSplit(field);
+ }
+
+ friend class FastReflectionBase;
friend class FastReflectionMessageMutator;
friend bool internal::IsDescendant(Message& root, const Message& message);
@@ -1042,10 +1069,34 @@
// contain weak fields, then this field equals descriptor_->field_count().
int last_non_weak_field_index_;
+ // The table-driven parser table.
+ // This table is generated on demand for Message types that did not override
+ // _InternalParse. It uses the reflection information to do so.
+ mutable absl::once_flag tcparse_table_once_;
+ using TcParseTableBase = internal::TcParseTableBase;
+ mutable const TcParseTableBase* tcparse_table_ = nullptr;
+
+ const TcParseTableBase* GetTcParseTable() const {
+ absl::call_once(tcparse_table_once_,
+ [&] { tcparse_table_ = CreateTcParseTable(); });
+ return tcparse_table_;
+ }
+
+ const TcParseTableBase* CreateTcParseTable() const;
+ const TcParseTableBase* CreateTcParseTableForMessageSet() const;
+ void PopulateTcParseFastEntries(
+ const internal::TailCallTableInfo& table_info,
+ TcParseTableBase::FastFieldEntry* fast_entries) const;
+ void PopulateTcParseEntries(internal::TailCallTableInfo& table_info,
+ TcParseTableBase::FieldEntry* entries) const;
+ void PopulateTcParseFieldAux(const internal::TailCallTableInfo& table_info,
+ TcParseTableBase::FieldAux* field_aux) const;
+
template <typename T, typename Enable>
friend class RepeatedFieldRef;
template <typename T, typename Enable>
friend class MutableRepeatedFieldRef;
+ friend class Message;
friend class ::PROTOBUF_NAMESPACE_ID::MessageLayoutInspector;
friend class ::PROTOBUF_NAMESPACE_ID::AssignDescriptorsHelper;
friend class DynamicMessageFactory;
@@ -1174,6 +1225,14 @@
inline void SwapInlinedStringDonated(Message* lhs, Message* rhs,
const FieldDescriptor* field) const;
+ // Returns the `_split_` pointer. Requires: IsSplit() == true.
+ inline const void* GetSplitField(const Message* message) const;
+ // Returns the address of the `_split_` pointer. Requires: IsSplit() == true.
+ inline void** MutableSplitField(Message* message) const;
+
+ // Allocate the split instance if needed.
+ void PrepareSplitMessageForWrite(Message* message) const;
+
// Shallow-swap fields listed in fields vector of two messages. It is the
// caller's responsibility to make sure shallow swap is safe.
void UnsafeShallowSwapFields(
@@ -1197,6 +1256,8 @@
void SwapOneofField(Message* lhs, Message* rhs,
const OneofDescriptor* oneof_descriptor) const;
+ void InternalSwap(Message* lhs, Message* rhs) const;
+
inline bool HasOneofField(const Message& message,
const FieldDescriptor* field) const;
inline void SetOneofCase(Message* message,
@@ -1260,14 +1321,17 @@
const Reflection* reflection,
const char* ptr,
internal::ParseContext* ctx);
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Reflection);
};
// Abstract interface for a factory for message objects.
+//
+// The thread safety for this class is implementation dependent, see comments
+// around GetPrototype for details
class PROTOBUF_EXPORT MessageFactory {
public:
inline MessageFactory() {}
+ MessageFactory(const MessageFactory&) = delete;
+ MessageFactory& operator=(const MessageFactory&) = delete;
virtual ~MessageFactory();
// Given a Descriptor, gets or constructs the default (prototype) Message
@@ -1323,9 +1387,6 @@
static void InternalRegisterGeneratedMessage(const Descriptor* descriptor,
const Message* prototype);
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageFactory);
};
#define DECLARE_GET_REPEATED_FIELD(TYPE) \
@@ -1372,7 +1433,7 @@
#else
bool ok = from != nullptr &&
T::default_instance().GetReflection() == from->GetReflection();
- return ok ? down_cast<const T*>(from) : nullptr;
+ return ok ? internal::DownCast<const T*>(from) : nullptr;
#endif
}
@@ -1481,17 +1542,32 @@
static_cast<uint32_t>(field->number()));
}
+const void* Reflection::GetSplitField(const Message* message) const {
+ GOOGLE_DCHECK(schema_.IsSplit());
+ return *internal::GetConstPointerAtOffset<void*>(message,
+ schema_.SplitOffset());
+}
+
+void** Reflection::MutableSplitField(Message* message) const {
+ GOOGLE_DCHECK(schema_.IsSplit());
+ return internal::GetPointerAtOffset<void*>(message, schema_.SplitOffset());
+}
+
template <typename Type>
const Type& Reflection::GetRaw(const Message& message,
const FieldDescriptor* field) const {
GOOGLE_DCHECK(!schema_.InRealOneof(field) || HasOneofField(message, field))
<< "Field = " << field->full_name();
+ if (schema_.IsSplit(field)) {
+ return *internal::GetConstPointerAtOffset<Type>(
+ GetSplitField(&message), schema_.GetFieldOffset(field));
+ }
return internal::GetConstRefAtOffset<Type>(message,
schema_.GetFieldOffset(field));
}
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_MESSAGE_H__
diff --git a/src/google/protobuf/message_lite.cc b/src/google/protobuf/message_lite.cc
index da66c19..defc815 100644
--- a/src/google/protobuf/message_lite.cc
+++ b/src/google/protobuf/message_lite.cc
@@ -33,39 +33,47 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/message_lite.h>
+#include "google/protobuf/message_lite.h"
#include <climits>
#include <cstdint>
#include <string>
+#include <utility>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/parse_context.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
-#include <google/protobuf/arena.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/generated_message_util.h>
-#include <google/protobuf/repeated_field.h>
-#include <google/protobuf/stubs/stl_util.h>
-#include <google/protobuf/stubs/mutex.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/io/zero_copy_stream.h"
+#include "google/protobuf/io/zero_copy_stream_impl.h"
+#include "google/protobuf/io/zero_copy_stream_impl_lite.h"
+#include "google/protobuf/arena.h"
+#include "absl/base/dynamic_annotations.h"
+#include "absl/strings/internal/resize_uninitialized.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/string_view.h"
+#include "absl/synchronization/mutex.h"
+#include "google/protobuf/generated_message_util.h"
+#include "google/protobuf/parse_context.h"
+#include "google/protobuf/repeated_field.h"
+
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
+MessageLite::~MessageLite(){
+// Defined out of line to save code space
+}
+
std::string MessageLite::InitializationErrorString() const {
return "(cannot determine missing fields for lite message)";
}
std::string MessageLite::DebugString() const {
std::uintptr_t address = reinterpret_cast<std::uintptr_t>(this);
- return StrCat("MessageLite at 0x", strings::Hex(address));
+ return absl::StrCat("MessageLite at 0x", absl::Hex(address));
}
namespace {
@@ -112,8 +120,8 @@
return result;
}
-inline StringPiece as_string_view(const void* data, int size) {
- return StringPiece(static_cast<const char*>(data), size);
+inline absl::string_view as_string_view(const void* data, int size) {
+ return absl::string_view(static_cast<const char*>(data), size);
}
// Returns true of all required fields are present / have values.
@@ -136,7 +144,7 @@
namespace internal {
template <bool aliasing>
-bool MergeFromImpl(StringPiece input, MessageLite* msg,
+bool MergeFromImpl(absl::string_view input, MessageLite* msg,
MessageLite::ParseFlags parse_flags) {
const char* ptr;
internal::ParseContext ctx(io::CodedInputStream::GetDefaultRecursionLimit(),
@@ -178,9 +186,9 @@
return false;
}
-template bool MergeFromImpl<false>(StringPiece input, MessageLite* msg,
+template bool MergeFromImpl<false>(absl::string_view input, MessageLite* msg,
MessageLite::ParseFlags parse_flags);
-template bool MergeFromImpl<true>(StringPiece input, MessageLite* msg,
+template bool MergeFromImpl<true>(absl::string_view input, MessageLite* msg,
MessageLite::ParseFlags parse_flags);
template bool MergeFromImpl<false>(io::ZeroCopyInputStream* input,
MessageLite* msg,
@@ -305,11 +313,11 @@
return ParseFrom<kParsePartial>(internal::BoundedZCIS{input, size});
}
-bool MessageLite::ParseFromString(ConstStringParam data) {
+bool MessageLite::ParseFromString(absl::string_view data) {
return ParseFrom<kParse>(data);
}
-bool MessageLite::ParsePartialFromString(ConstStringParam data) {
+bool MessageLite::ParsePartialFromString(absl::string_view data) {
return ParseFrom<kParsePartial>(data);
}
@@ -321,7 +329,7 @@
return ParseFrom<kParsePartial>(as_string_view(data, size));
}
-bool MessageLite::MergeFromString(ConstStringParam data) {
+bool MessageLite::MergeFromString(absl::string_view data) {
return ParseFrom<kMerge>(data);
}
@@ -451,7 +459,8 @@
return false;
}
- STLStringResizeUninitializedAmortized(output, old_size + byte_size);
+ absl::strings_internal::STLStringResizeUninitializedAmortized(
+ output, old_size + byte_size);
uint8_t* start =
reinterpret_cast<uint8_t*>(io::mutable_string_data(output) + old_size);
SerializeToArrayImpl(*this, start, byte_size);
@@ -566,7 +575,7 @@
}
std::vector<std::pair<void (*)(const void*), const void*>> functions;
- Mutex mutex;
+ absl::Mutex mutex;
};
static void RunZeroArgFunc(const void* arg) {
@@ -580,7 +589,7 @@
void OnShutdownRun(void (*f)(const void*), const void* arg) {
auto shutdown_data = ShutdownData::get();
- MutexLock lock(&shutdown_data->mutex);
+ absl::MutexLock lock(&shutdown_data->mutex);
shutdown_data->functions.push_back(std::make_pair(f, arg));
}
@@ -599,4 +608,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/message_lite.h b/src/google/protobuf/message_lite.h
index 950ae1a..92e5b73 100644
--- a/src/google/protobuf/message_lite.h
+++ b/src/google/protobuf/message_lite.h
@@ -43,19 +43,20 @@
#include <climits>
#include <string>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/arena.h>
-#include <google/protobuf/stubs/once.h>
-#include <google/protobuf/port.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/explicitly_constructed.h>
-#include <google/protobuf/metadata_lite.h>
-#include <google/protobuf/stubs/hash.h> // TODO(b/211442718): cleanup
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/arena.h"
+#include "google/protobuf/port.h"
+#include "absl/base/call_once.h"
+#include "absl/strings/string_view.h"
+#include "google/protobuf/explicitly_constructed.h"
+#include "google/protobuf/metadata_lite.h"
+#include "google/protobuf/port.h"
+
// clang-format off
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
// clang-format on
#ifdef SWIG
@@ -168,7 +169,9 @@
class PROTOBUF_EXPORT MessageLite {
public:
constexpr MessageLite() {}
- virtual ~MessageLite() = default;
+ MessageLite(const MessageLite&) = delete;
+ MessageLite& operator=(const MessageLite&) = delete;
+ virtual ~MessageLite();
// Basic Operations ------------------------------------------------
@@ -277,11 +280,11 @@
// format, matching the encoding output by MessageLite::SerializeToString().
// If you'd like to convert a human-readable string into a protocol buffer
// object, see google::protobuf::TextFormat::ParseFromString().
- PROTOBUF_ATTRIBUTE_REINITIALIZES bool ParseFromString(ConstStringParam data);
+ PROTOBUF_ATTRIBUTE_REINITIALIZES bool ParseFromString(absl::string_view data);
// Like ParseFromString(), but accepts messages that are missing
// required fields.
PROTOBUF_ATTRIBUTE_REINITIALIZES bool ParsePartialFromString(
- ConstStringParam data);
+ absl::string_view data);
// Parse a protocol buffer contained in an array of bytes.
PROTOBUF_ATTRIBUTE_REINITIALIZES bool ParseFromArray(const void* data,
int size);
@@ -312,7 +315,7 @@
bool MergePartialFromCodedStream(io::CodedInputStream* input);
// Merge a protocol buffer contained in a string.
- bool MergeFromString(ConstStringParam data);
+ bool MergeFromString(absl::string_view data);
// Serialization ---------------------------------------------------
@@ -492,19 +495,17 @@
void LogInitializationErrorMessage() const;
bool MergeFromImpl(io::CodedInputStream* input, ParseFlags parse_flags);
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageLite);
};
namespace internal {
template <bool alias>
-bool MergeFromImpl(StringPiece input, MessageLite* msg,
+bool MergeFromImpl(absl::string_view input, MessageLite* msg,
MessageLite::ParseFlags parse_flags);
-extern template bool MergeFromImpl<false>(StringPiece input,
+extern template bool MergeFromImpl<false>(absl::string_view input,
MessageLite* msg,
MessageLite::ParseFlags parse_flags);
-extern template bool MergeFromImpl<true>(StringPiece input,
+extern template bool MergeFromImpl<true>(absl::string_view input,
MessageLite* msg,
MessageLite::ParseFlags parse_flags);
@@ -586,6 +587,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_MESSAGE_LITE_H__
diff --git a/src/google/protobuf/message_unittest.cc b/src/google/protobuf/message_unittest.cc
index f71f60c..dbf84b6 100644
--- a/src/google/protobuf/message_unittest.cc
+++ b/src/google/protobuf/message_unittest.cc
@@ -32,7 +32,7 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/unittest.pb.h>
+#include "google/protobuf/unittest.pb.h"
#define MESSAGE_TEST_NAME MessageTest
#define MESSAGE_FACTORY_TEST_NAME MessageFactoryTest
@@ -42,7 +42,7 @@
// Must include after the above macros.
// clang-format off
-#include <google/protobuf/test_util.inc>
-#include <google/protobuf/message_unittest.inc>
-#include <google/protobuf/arena.h>
+#include "google/protobuf/test_util.inc"
+#include "google/protobuf/message_unittest.inc"
+#include "google/protobuf/arena.h"
// clang-format on
diff --git a/src/google/protobuf/message_unittest.inc b/src/google/protobuf/message_unittest.inc
index fa2bbbf..1217c40 100644
--- a/src/google/protobuf/message_unittest.inc
+++ b/src/google/protobuf/message_unittest.inc
@@ -40,31 +40,33 @@
#include <sys/types.h>
#include <cmath>
+#include <functional>
#include <limits>
+#include <vector>
-#include <google/protobuf/message.h>
+#include "google/protobuf/message.h"
#ifndef _MSC_VER
#include <unistd.h>
#endif
#include <fstream>
#include <sstream>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/descriptor.pb.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/descriptor.pb.h"
#include <gmock/gmock.h>
-#include <google/protobuf/testing/googletest.h>
+#include "google/protobuf/testing/googletest.h"
#include <gtest/gtest.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/substitute.h>
-#include <google/protobuf/arena.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/io/io_win32.h>
-#include <google/protobuf/generated_message_reflection.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/test_util2.h>
+#include "google/protobuf/stubs/logging.h"
+#include "absl/strings/substitute.h"
+#include "google/protobuf/arena.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/generated_message_reflection.h"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/io/io_win32.h"
+#include "google/protobuf/io/zero_copy_stream.h"
+#include "google/protobuf/io/zero_copy_stream_impl.h"
+#include "google/protobuf/test_util2.h"
namespace google {
@@ -124,7 +126,7 @@
TEST(MESSAGE_TEST_NAME, ParseFromFileDescriptor) {
std::string filename =
- TestUtil::GetTestDataPath("net/proto2/internal/testdata/golden_message");
+ TestUtil::GetTestDataPath("third_party/protobuf/testdata/golden_message");
int file = open(filename.c_str(), O_RDONLY | O_BINARY);
ASSERT_GE(file, 0);
@@ -137,7 +139,7 @@
TEST(MESSAGE_TEST_NAME, ParsePackedFromFileDescriptor) {
std::string filename = TestUtil::GetTestDataPath(
- "net/proto2/internal/testdata/golden_packed_fields_message");
+ "third_party/protobuf/testdata/golden_packed_fields_message");
int file = open(filename.c_str(), O_RDONLY | O_BINARY);
ASSERT_GE(file, 0);
@@ -255,7 +257,7 @@
}
EXPECT_THAT(errors,
- testing::ElementsAre(strings::Substitute(
+ testing::ElementsAre(absl::Substitute(
"Can't parse message of type \"$0.TestChildExtension\" "
"because it is missing required fields: "
"optional_extension.($0.TestRequired.single).a, "
@@ -285,6 +287,32 @@
EXPECT_TRUE(TestUtil::EqualsToSerialized(q, p.SerializePartialAsString()));
}
+TEST(MESSAGE_TEST_NAME, UninitializedAndTooDeep) {
+ UNITTEST::TestRequiredForeign original;
+ original.mutable_optional_message()->set_a(1);
+ original.mutable_optional_lazy_message()
+ ->mutable_child()
+ ->mutable_payload()
+ ->set_optional_int64(0);
+
+ std::string data;
+ ASSERT_TRUE(original.SerializePartialToString(&data));
+
+ UNITTEST::TestRequiredForeign pass;
+ ASSERT_TRUE(pass.ParsePartialFromString(data));
+ ASSERT_FALSE(pass.IsInitialized());
+
+ io::ArrayInputStream array_stream(data.data(), data.size());
+ io::CodedInputStream input_stream(&array_stream);
+ input_stream.SetRecursionLimit(2);
+
+ UNITTEST::TestRequiredForeign fail;
+ EXPECT_FALSE(fail.ParsePartialFromCodedStream(&input_stream));
+
+ UNITTEST::TestRequiredForeign fail_uninitialized;
+ EXPECT_FALSE(fail_uninitialized.ParseFromString(data));
+}
+
TEST(MESSAGE_TEST_NAME, ExplicitLazyExceedRecursionLimit) {
UNITTEST::NestedTestAllTypes original, parsed;
// Build proto with recursion depth of 3.
@@ -422,6 +450,25 @@
EXPECT_FALSE(p.ParseFromString(serialized));
}
+TEST(MESSAGE_TEST_NAME, ParseFailsIfGroupFieldMalformed) {
+ UNITTEST::TestMutualRecursionA original, parsed;
+ original.mutable_bb()
+ ->mutable_a()
+ ->mutable_subgroup()
+ ->mutable_sub_message()
+ ->mutable_b()
+ ->set_optional_int32(-1);
+
+ std::string data;
+ ASSERT_TRUE(original.SerializeToString(&data));
+ // Should parse correctly.
+ ASSERT_TRUE(parsed.ParseFromString(data));
+ // Overwriting the last byte of varint (-1) to 0xFF results in malformed wire.
+ data[data.size() - 2] = 0xFF;
+
+ EXPECT_FALSE(parsed.ParseFromString(data));
+}
+
TEST(MESSAGE_TEST_NAME, UninitializedAndMalformed) {
UNITTEST::TestRequiredForeign o, p1, p2;
o.mutable_optional_message()->set_a(-1);
@@ -1127,5 +1174,261 @@
std::signbit(out_message.optional_double()));
}
+// Adds `non_canonical_bytes` bytes to the varint representation at the tail of
+// the buffer.
+// `buf` points to the start of the buffer, `p` points to one-past-the-end.
+// Returns the new one-past-the-end pointer.
+uint8_t* AddNonCanonicalBytes(const uint8_t* buf, uint8_t* p,
+ int non_canonical_bytes) {
+ // varint can have a max of 10 bytes.
+ while (non_canonical_bytes-- > 0 && p - buf < 10) {
+ // Add a dummy byte at the end.
+ p[-1] |= 0x80;
+ p[0] = 0;
+ ++p;
+ }
+ return p;
+}
+
+std::string EncodeEnumValue(int number, int value, int non_canonical_bytes) {
+ uint8_t buf[100];
+ uint8_t* p = buf;
+
+ p = internal::WireFormatLite::WriteEnumToArray(number, value, p);
+ p = AddNonCanonicalBytes(buf, p, non_canonical_bytes);
+ return std::string(buf, p);
+}
+
+std::string EncodeOtherField() {
+ UNITTEST::EnumParseTester obj;
+ obj.set_other_field(1);
+ return obj.SerializeAsString();
+}
+
+TEST(MESSAGE_TEST_NAME, TestEnumParsers) {
+ UNITTEST::EnumParseTester obj;
+
+ const auto other_field = EncodeOtherField();
+
+ // Encode a boolean field for many different cases and verify that it can be
+ // parsed as expected.
+ // There are:
+ // - optional/repeated/packed fields
+ // - field tags that encode in 1/2/3 bytes
+ // - canonical and non-canonical encodings of the varint
+ // - last vs not last field
+ // - label combinations to trigger different parsers: sequential, small
+ // sequential, non-validated.
+
+ constexpr int kInvalidValue = 0x900913;
+ auto* ref = obj.GetReflection();
+ auto* descriptor = obj.descriptor();
+ for (bool use_tail_field : {false, true}) {
+ SCOPED_TRACE(use_tail_field);
+ for (int non_canonical_bytes = 0; non_canonical_bytes < 5;
+ ++non_canonical_bytes) {
+ SCOPED_TRACE(non_canonical_bytes);
+ for (int i = 0; i < descriptor->field_count(); ++i) {
+ const auto* field = descriptor->field(i);
+ if (field->name() == "other_field") continue;
+ SCOPED_TRACE(field->full_name());
+ const auto* enum_desc = field->enum_type();
+ for (int e = 0; e < enum_desc->value_count(); ++e) {
+ const auto* value_desc = enum_desc->value(e);
+ if (value_desc->number() < 0 && non_canonical_bytes > 0) {
+ // Negative numbers only have a canonical representation.
+ continue;
+ }
+ SCOPED_TRACE(value_desc->number());
+ GOOGLE_CHECK_NE(value_desc->number(), kInvalidValue)
+ << "Invalid value is a real label.";
+ auto encoded = EncodeEnumValue(field->number(), value_desc->number(),
+ non_canonical_bytes);
+ if (use_tail_field) {
+ // Make sure that fields after this one can be parsed too. ie test
+ // that the "next" jump is correct too.
+ encoded += other_field;
+ }
+
+ EXPECT_TRUE(obj.ParseFromString(encoded));
+ if (field->is_repeated()) {
+ ASSERT_EQ(ref->FieldSize(obj, field), 1);
+ EXPECT_EQ(ref->GetRepeatedEnumValue(obj, field, 0),
+ value_desc->number());
+ } else {
+ EXPECT_TRUE(ref->HasField(obj, field));
+ EXPECT_EQ(ref->GetEnumValue(obj, field), value_desc->number());
+ }
+ auto& unknown = ref->GetUnknownFields(obj);
+ ASSERT_EQ(unknown.field_count(), 0);
+ }
+
+ SCOPED_TRACE("Invalid value");
+ // Try an invalid value, which should go to the unknown fields.
+ EXPECT_TRUE(obj.ParseFromString(EncodeEnumValue(
+ field->number(), kInvalidValue, non_canonical_bytes)));
+ if (field->is_repeated()) {
+ ASSERT_EQ(ref->FieldSize(obj, field), 0);
+ } else {
+ EXPECT_FALSE(ref->HasField(obj, field));
+ EXPECT_EQ(ref->GetEnumValue(obj, field),
+ enum_desc->value(0)->number());
+ }
+ auto& unknown = ref->GetUnknownFields(obj);
+ ASSERT_EQ(unknown.field_count(), 1);
+ EXPECT_EQ(unknown.field(0).number(), field->number());
+ EXPECT_EQ(unknown.field(0).type(), unknown.field(0).TYPE_VARINT);
+ EXPECT_EQ(unknown.field(0).varint(), kInvalidValue);
+ }
+ }
+ }
+}
+
+std::string EncodeBoolValue(int number, bool value, int non_canonical_bytes) {
+ uint8_t buf[100];
+ uint8_t* p = buf;
+
+ p = internal::WireFormatLite::WriteBoolToArray(number, value, p);
+ p = AddNonCanonicalBytes(buf, p, non_canonical_bytes);
+ return std::string(buf, p);
+}
+
+TEST(MESSAGE_TEST_NAME, TestBoolParsers) {
+ UNITTEST::BoolParseTester obj;
+
+ const auto other_field = EncodeOtherField();
+
+ // Encode a boolean field for many different cases and verify that it can be
+ // parsed as expected.
+ // There are:
+ // - optional/repeated/packed fields
+ // - field tags that encode in 1/2/3 bytes
+ // - canonical and non-canonical encodings of the varint
+ // - last vs not last field
+
+ auto* ref = obj.GetReflection();
+ auto* descriptor = obj.descriptor();
+ for (bool use_tail_field : {false, true}) {
+ SCOPED_TRACE(use_tail_field);
+ for (int non_canonical_bytes = 0; non_canonical_bytes < 10;
+ ++non_canonical_bytes) {
+ SCOPED_TRACE(non_canonical_bytes);
+ for (int i = 0; i < descriptor->field_count(); ++i) {
+ const auto* field = descriptor->field(i);
+ if (field->name() == "other_field") continue;
+ SCOPED_TRACE(field->full_name());
+ for (bool value : {false, true}) {
+ SCOPED_TRACE(value);
+ auto encoded =
+ EncodeBoolValue(field->number(), value, non_canonical_bytes);
+ if (use_tail_field) {
+ // Make sure that fields after this one can be parsed too. ie test
+ // that the "next" jump is correct too.
+ encoded += other_field;
+ }
+
+ EXPECT_TRUE(obj.ParseFromString(encoded));
+ if (field->is_repeated()) {
+ ASSERT_EQ(ref->FieldSize(obj, field), 1);
+ EXPECT_EQ(ref->GetRepeatedBool(obj, field, 0), value);
+ } else {
+ EXPECT_TRUE(ref->HasField(obj, field));
+ EXPECT_EQ(ref->GetBool(obj, field), value);
+ }
+ auto& unknown = ref->GetUnknownFields(obj);
+ ASSERT_EQ(unknown.field_count(), 0);
+ }
+ }
+ }
+ }
+}
+
+TEST(MESSAGE_TEST_NAME, IsDefaultInstance) {
+ UNITTEST::TestAllTypes msg;
+ const auto& default_msg = UNITTEST::TestAllTypes::default_instance();
+ const auto* r = msg.GetReflection();
+ EXPECT_TRUE(r->IsDefaultInstance(default_msg));
+ EXPECT_FALSE(r->IsDefaultInstance(msg));
+}
+
+std::string EncodeStringValue(int number, const std::string& value) {
+ uint8_t buf[100];
+ return std::string(
+ buf, internal::WireFormatLite::WriteStringToArray(number, value, buf));
+}
+
+class TestInputStream final : public io::ZeroCopyInputStream {
+ public:
+ explicit TestInputStream(absl::string_view payload, size_t break_pos)
+ : payload_(payload), break_pos_(break_pos) {}
+
+ bool Next(const void** data, int* size) override {
+ if (payload_.empty()) return false;
+ const auto to_consume = payload_.substr(0, break_pos_);
+ *data = to_consume.data();
+ *size = to_consume.size();
+ payload_.remove_prefix(to_consume.size());
+ // The next time will consume the rest.
+ break_pos_ = payload_.npos;
+
+ return true;
+ }
+
+ void BackUp(int) override { GOOGLE_CHECK(false); }
+ bool Skip(int) override {
+ GOOGLE_CHECK(false);
+ return false;
+ }
+ int64_t ByteCount() const override {
+ GOOGLE_CHECK(false);
+ return 0;
+ }
+
+ private:
+ absl::string_view payload_;
+ size_t break_pos_;
+};
+
+TEST(MESSAGE_TEST_NAME, TestRepeatedStringParsers) {
+ google::protobuf::Arena arena;
+
+ const std::string sample =
+ "abcdefghijklmnopqrstuvwxyz"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+
+ const auto* const descriptor = UNITTEST::StringParseTester::descriptor();
+
+ static const size_t sso_capacity = std::string().capacity();
+ if (sso_capacity == 0) GTEST_SKIP();
+ // SSO, !SSO, and off-by-one just in case
+ for (size_t size :
+ {sso_capacity - 1, sso_capacity, sso_capacity + 1, sso_capacity + 2}) {
+ SCOPED_TRACE(size);
+ const std::string value = sample.substr(0, size);
+ for (int i = 0; i < descriptor->field_count(); ++i) {
+ const auto* field = descriptor->field(i);
+ SCOPED_TRACE(field->full_name());
+ const auto encoded = EncodeStringValue(field->number(), sample) +
+ EncodeStringValue(field->number(), value);
+ // Check for different breaks in the input stream to test cases where
+ // the payload can be read and can't be read in one go.
+ for (size_t i = 1; i <= encoded.size(); ++i) {
+ TestInputStream input_stream(encoded, i);
+
+ auto& obj = *arena.CreateMessage<UNITTEST::StringParseTester>(&arena);
+ auto* ref = obj.GetReflection();
+ EXPECT_TRUE(obj.ParseFromZeroCopyStream(&input_stream));
+ if (field->is_repeated()) {
+ ASSERT_EQ(ref->FieldSize(obj, field), 2);
+ EXPECT_EQ(ref->GetRepeatedString(obj, field, 0), sample);
+ EXPECT_EQ(ref->GetRepeatedString(obj, field, 1), value);
+ } else {
+ EXPECT_EQ(ref->GetString(obj, field), value);
+ }
+ }
+ }
+ }
+}
+
} // namespace protobuf
} // namespace google
diff --git a/src/google/protobuf/metadata_lite.h b/src/google/protobuf/metadata_lite.h
index 0c31517..0700327 100644
--- a/src/google/protobuf/metadata_lite.h
+++ b/src/google/protobuf/metadata_lite.h
@@ -32,12 +32,13 @@
#define GOOGLE_PROTOBUF_METADATA_LITE_H__
#include <string>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/arena.h>
-#include <google/protobuf/port.h>
+
+#include "google/protobuf/arena.h"
+#include "google/protobuf/port.h"
+#include "google/protobuf/port.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
#ifdef SWIG
#error "You cannot SWIG proto headers"
@@ -45,6 +46,9 @@
namespace google {
namespace protobuf {
+
+class UnknownFieldSet;
+
namespace internal {
// This is the representation for messages that support arena allocation. It
@@ -280,6 +284,19 @@
template <>
PROTOBUF_EXPORT void InternalMetadata::DoSwap<std::string>(std::string* other);
+// Instantiated once in message.cc (where the definition of UnknownFieldSet is
+// known) to prevent much duplication across translation units of a large build.
+extern template PROTOBUF_EXPORT void
+InternalMetadata::DoClear<UnknownFieldSet>();
+extern template PROTOBUF_EXPORT void
+InternalMetadata::DoMergeFrom<UnknownFieldSet>(const UnknownFieldSet& other);
+extern template PROTOBUF_EXPORT void
+InternalMetadata::DoSwap<UnknownFieldSet>(UnknownFieldSet* other);
+extern template PROTOBUF_EXPORT Arena*
+InternalMetadata::DeleteOutOfLineHelper<UnknownFieldSet>();
+extern template PROTOBUF_EXPORT UnknownFieldSet*
+InternalMetadata::mutable_unknown_fields_slow<UnknownFieldSet>();
+
// This helper RAII class is needed to efficiently parse unknown fields. We
// should only call mutable_unknown_fields if there are actual unknown fields.
// The obvious thing to just use a stack string and swap it at the end of
@@ -311,6 +328,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_METADATA_LITE_H__
diff --git a/src/google/protobuf/no_field_presence_test.cc b/src/google/protobuf/no_field_presence_test.cc
index 2582cfe..d28fb14 100644
--- a/src/google/protobuf/no_field_presence_test.cc
+++ b/src/google/protobuf/no_field_presence_test.cc
@@ -30,10 +30,10 @@
#include <string>
-#include <google/protobuf/unittest.pb.h>
-#include <google/protobuf/unittest_no_field_presence.pb.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/descriptor.h>
+#include "google/protobuf/unittest.pb.h"
+#include "google/protobuf/unittest_no_field_presence.pb.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/descriptor.h"
#include <gtest/gtest.h>
namespace google {
diff --git a/src/google/protobuf/parse_context.cc b/src/google/protobuf/parse_context.cc
index 59852fd..3406319 100644
--- a/src/google/protobuf/parse_context.cc
+++ b/src/google/protobuf/parse_context.cc
@@ -28,19 +28,19 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/parse_context.h>
+#include "google/protobuf/parse_context.h"
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/arenastring.h>
-#include <google/protobuf/endian.h>
-#include <google/protobuf/message_lite.h>
-#include <google/protobuf/repeated_field.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/wire_format_lite.h>
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/io/zero_copy_stream.h"
+#include "google/protobuf/arenastring.h"
+#include "google/protobuf/endian.h"
+#include "google/protobuf/message_lite.h"
+#include "google/protobuf/repeated_field.h"
+#include "absl/strings/string_view.h"
+#include "google/protobuf/wire_format_lite.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -279,7 +279,8 @@
const char* ParseContext::ParseMessage(MessageLite* msg, const char* ptr) {
int old;
ptr = ReadSizeAndPushLimitAndDepth(ptr, &old);
- ptr = ptr ? msg->_InternalParse(ptr, this) : nullptr;
+ if (ptr == nullptr) return ptr;
+ ptr = msg->_InternalParse(ptr, this);
depth_++;
if (!PopLimit(old)) return nullptr;
return ptr;
@@ -299,7 +300,7 @@
WriteVarint(val, s);
}
-void WriteLengthDelimited(uint32_t num, StringPiece val, std::string* s) {
+void WriteLengthDelimited(uint32_t num, absl::string_view val, std::string* s) {
WriteVarint((num << 3) + 2, s);
WriteVarint(val.size(), s);
s->append(val.data(), val.size());
@@ -307,7 +308,7 @@
std::pair<const char*, uint32_t> VarintParseSlow32(const char* p,
uint32_t res) {
- for (std::uint32_t i = 2; i < 5; i++) {
+ for (std::uint32_t i = 1; i < 5; i++) {
uint32_t byte = static_cast<uint8_t>(p[i]);
res += (byte - 1) << (7 * i);
if (PROTOBUF_PREDICT_TRUE(byte < 128)) {
@@ -327,7 +328,7 @@
std::pair<const char*, uint64_t> VarintParseSlow64(const char* p,
uint32_t res32) {
uint64_t res = res32;
- for (std::uint32_t i = 2; i < 10; i++) {
+ for (std::uint32_t i = 1; i < 10; i++) {
uint64_t byte = static_cast<uint8_t>(p[i]);
res += (byte - 1) << (7 * i);
if (PROTOBUF_PREDICT_TRUE(byte < 128)) {
@@ -376,11 +377,11 @@
}
// Defined in wire_format_lite.cc
-void PrintUTF8ErrorLog(StringPiece message_name,
- StringPiece field_name, const char* operation_str,
+void PrintUTF8ErrorLog(absl::string_view message_name,
+ absl::string_view field_name, const char* operation_str,
bool emit_stacktrace);
-bool VerifyUTF8(StringPiece str, const char* field_name) {
+bool VerifyUTF8(absl::string_view str, const char* field_name) {
if (!IsStructurallyValidUTF8(str)) {
PrintUTF8ErrorLog("", field_name, "parsing", false);
return false;
@@ -541,8 +542,226 @@
return FieldParser(tag, field_parser, ptr, ctx);
}
+#ifdef __aarch64__
+// Generally, speaking, the ARM-optimized Varint decode algorithm is to extract
+// and concatenate all potentially valid data bits, compute the actual length
+// of the Varint, and mask off the data bits which are not actually part of the
+// result. More detail on the two main parts is shown below.
+//
+// 1) Extract and concatenate all potentially valid data bits.
+// Two ARM-specific features help significantly:
+// a) Efficient and non-destructive bit extraction (UBFX)
+// b) A single instruction can perform both an OR with a shifted
+// second operand in one cycle. E.g., the following two lines do the same
+// thing
+// ```result = operand_1 | (operand2 << 7);```
+// ```ORR %[result], %[operand_1], %[operand_2], LSL #7```
+// The figure below shows the implementation for handling four chunks.
+//
+// Bits 32 31-24 23 22-16 15 14-8 7 6-0
+// +----+---------+----+---------+----+---------+----+---------+
+// |CB 3| Chunk 3 |CB 2| Chunk 2 |CB 1| Chunk 1 |CB 0| Chunk 0 |
+// +----+---------+----+---------+----+---------+----+---------+
+// | | | |
+// UBFX UBFX UBFX UBFX -- cycle 1
+// | | | |
+// V V V V
+// Combined LSL #7 and ORR Combined LSL #7 and ORR -- cycle 2
+// | |
+// V V
+// Combined LSL #14 and ORR -- cycle 3
+// |
+// V
+// Parsed bits 0-27
+//
+//
+// 2) Calculate the index of the cleared continuation bit in order to determine
+// where the encoded Varint ends and the size of the decoded value. The
+// easiest way to do this is mask off all data bits, leaving just the
+// continuation bits. We actually need to do the masking on an inverted
+// copy of the data, which leaves a 1 in all continuation bits which were
+// originally clear. The number of trailing zeroes in this value indicates
+// the size of the Varint.
+//
+// AND 0x80 0x80 0x80 0x80 0x80 0x80 0x80 0x80
+//
+// Bits 63 55 47 39 31 23 15 7
+// +----+--+----+--+----+--+----+--+----+--+----+--+----+--+----+--+
+// ~ |CB 7| |CB 6| |CB 5| |CB 4| |CB 3| |CB 2| |CB 1| |CB 0| |
+// +----+--+----+--+----+--+----+--+----+--+----+--+----+--+----+--+
+// | | | | | | | |
+// V V V V V V V V
+// Bits 63 55 47 39 31 23 15 7
+// +----+--+----+--+----+--+----+--+----+--+----+--+----+--+----+--+
+// |~CB 7|0|~CB 6|0|~CB 5|0|~CB 4|0|~CB 3|0|~CB 2|0|~CB 1|0|~CB 0|0|
+// +----+--+----+--+----+--+----+--+----+--+----+--+----+--+----+--+
+// |
+// CTZ
+// V
+// Index of first cleared continuation bit
+//
+//
+// While this is implemented in C++ significant care has been taken to ensure
+// the compiler emits the best instruction sequence. In some cases we use the
+// following two functions to manipulate the compiler's scheduling decisions.
+//
+// Controls compiler scheduling by telling it that the first value is modified
+// by the second value the callsite. This is useful if non-critical path
+// instructions are too aggressively scheduled, resulting in a slowdown of the
+// actual critical path due to opportunity costs. An example usage is shown
+// where a false dependence of num_bits on result is added to prevent checking
+// for a very unlikely error until all critical path instructions have been
+// fetched.
+//
+// ```
+// num_bits = <multiple operations to calculate new num_bits value>
+// result = <multiple operations to calculate result>
+// num_bits = ValueBarrier(num_bits, result);
+// if (num_bits == 63) {
+// GOOGLE_LOG(FATAL) << "Invalid num_bits value";
+// }
+// ```
+template <typename V1Type, typename V2Type>
+PROTOBUF_ALWAYS_INLINE inline V1Type ValueBarrier(V1Type value1,
+ V2Type value2) {
+ asm("" : "+r"(value1) : "r"(value2));
+ return value1;
+}
+
+// Falsely indicate that the specific value is modified at this location. This
+// prevents code which depends on this value from being scheduled earlier.
+template <typename V1Type>
+PROTOBUF_ALWAYS_INLINE inline V1Type ValueBarrier(V1Type value1) {
+ asm("" : "+r"(value1));
+ return value1;
+}
+
+PROTOBUF_ALWAYS_INLINE inline uint64_t ExtractAndMergeTwoChunks(
+ uint64_t data, uint64_t first_byte) {
+ GOOGLE_DCHECK(first_byte <= 6);
+ uint64_t first = Ubfx7(data, first_byte * 8);
+ uint64_t second = Ubfx7(data, (first_byte + 1) * 8);
+ return ForceToRegister(first | (second << 7));
+}
+
+struct SlowPathEncodedInfo {
+ const char* p;
+ uint64_t last8;
+ uint64_t valid_bits;
+ uint64_t valid_chunk_bits;
+ uint64_t masked_cont_bits;
+};
+
+// Performs multiple actions which are identical between 32 and 64 bit Varints
+// in order to compute the length of the encoded Varint and compute the new
+// of p.
+PROTOBUF_ALWAYS_INLINE inline SlowPathEncodedInfo ComputeLengthAndUpdateP(
+ const char* p) {
+ SlowPathEncodedInfo result;
+ // Load the last two bytes of the encoded Varint.
+ std::memcpy(&result.last8, p + 2, sizeof(result.last8));
+ uint64_t mask = ForceToRegister(0x8080808080808080);
+ // Only set continuation bits remain
+ result.masked_cont_bits = ForceToRegister(mask & (~result.last8));
+ // The first cleared continuation bit is the most significant 1 in the
+ // reversed value. Result is undefined for an input of 0 and we handle that
+ // case below.
+ result.valid_bits = absl::countr_zero(result.masked_cont_bits);
+ // Calculates the number of chunks in the encoded Varint. This value is low
+ // by three as neither the cleared continuation chunk nor the first two chunks
+ // are counted.
+ uint64_t set_continuation_bits = result.valid_bits >> 3;
+ // Update p to point past the encoded Varint.
+ result.p = p + set_continuation_bits + 3;
+ // Calculate number of valid data bits in the decoded value so invalid bits
+ // can be masked off. Value is too low by 14 but we account for that when
+ // calculating the mask.
+ result.valid_chunk_bits = result.valid_bits - set_continuation_bits;
+ return result;
+}
+
+constexpr uint64_t kResultMaskUnshifted = 0xffffffffffffc000ULL;
+constexpr uint64_t kFirstResultBitChunk1 = 1 * 7;
+constexpr uint64_t kFirstResultBitChunk2 = 2 * 7;
+constexpr uint64_t kFirstResultBitChunk3 = 3 * 7;
+constexpr uint64_t kFirstResultBitChunk4 = 4 * 7;
+constexpr uint64_t kFirstResultBitChunk6 = 6 * 7;
+constexpr uint64_t kFirstResultBitChunk8 = 8 * 7;
+constexpr uint64_t kValidBitsForInvalidVarint = 0x60;
+
+PROTOBUF_NOINLINE const char* VarintParseSlowArm64(const char* p, uint64_t* out,
+ uint64_t first8) {
+ SlowPathEncodedInfo info = ComputeLengthAndUpdateP(p);
+ // Extract data bits from the low six chunks. This includes chunks zero and
+ // one which we already know are valid.
+ uint64_t merged_01 = ExtractAndMergeTwoChunks(first8, /*first_chunk=*/0);
+ uint64_t merged_23 = ExtractAndMergeTwoChunks(first8, /*first_chunk=*/2);
+ uint64_t merged_45 = ExtractAndMergeTwoChunks(first8, /*first_chunk=*/4);
+ // Low 42 bits of decoded value.
+ uint64_t result = merged_01 | merged_23 << kFirstResultBitChunk2 |
+ merged_45 << kFirstResultBitChunk4;
+ // This immediate ends in 14 zeroes since valid_chunk_bits is too low by 14.
+ uint64_t result_mask = kResultMaskUnshifted << info.valid_chunk_bits;
+ // masked_cont_bits is 0 iff the Varint is invalid. In that case
+ info.valid_bits =
+ info.masked_cont_bits ? info.valid_bits : kValidBitsForInvalidVarint;
+ // Test for early exit if Varint does not exceed 6 chunks. Branching on one
+ // bit is faster on ARM than via a compare and branch.
+ if (PROTOBUF_PREDICT_FALSE((info.valid_bits & 0x20) != 0)) {
+ // Extract data bits from high four chunks.
+ uint64_t merged_67 = ExtractAndMergeTwoChunks(first8, /*first_chunk=*/6);
+ // Last two chunks come from last two bytes of info.last8.
+ uint64_t merged_89 =
+ ExtractAndMergeTwoChunks(info.last8, /*first_chunk=*/6);
+ result |= merged_67 << kFirstResultBitChunk6;
+ result |= merged_89 << kFirstResultBitChunk8;
+ // Handle an invalid Varint with all 10 continuation bits set.
+ info.masked_cont_bits = ValueBarrier(info.masked_cont_bits);
+ if (PROTOBUF_PREDICT_FALSE(info.masked_cont_bits == 0)) {
+ *out = 0;
+ return nullptr;
+ }
+ }
+ // Mask off invalid data bytes.
+ result &= ~result_mask;
+ *out = result;
+ return info.p;
+}
+
+// See comments in VarintParseSlowArm64 for a description of the algorithm.
+// Differences in the 32 bit version are noted below.
+PROTOBUF_NOINLINE const char* VarintParseSlowArm32(const char* p, uint32_t* out,
+ uint64_t first8) {
+ // This also skips the slop bytes.
+ SlowPathEncodedInfo info = ComputeLengthAndUpdateP(p);
+ // Extract data bits from chunks 1-4. Chunk zero is merged in below.
+ uint64_t merged_12 = ExtractAndMergeTwoChunks(first8, /*first_chunk=*/1);
+ uint64_t merged_34 = ExtractAndMergeTwoChunks(first8, /*first_chunk=*/3);
+ first8 = ValueBarrier(first8, p);
+ uint64_t result = Ubfx7(first8, /*start=*/0);
+ result = ForceToRegister(result | merged_12 << kFirstResultBitChunk1);
+ result = ForceToRegister(result | merged_34 << kFirstResultBitChunk3);
+ uint64_t result_mask = kResultMaskUnshifted << info.valid_chunk_bits;
+ result &= ~result_mask;
+ // It is extremely unlikely that a Varint is invalid so checking that
+ // condition isn't on the critical path. Here we make sure that we don't do so
+ // until result has been computed.
+ info.masked_cont_bits = ValueBarrier(info.masked_cont_bits, result);
+ if (PROTOBUF_PREDICT_FALSE(info.masked_cont_bits == 0)) {
+ // Makes the compiler think out was modified here. This ensures it won't
+ // predicate this extremely predictable branch.
+ out = ValueBarrier(out);
+ *out = 0;
+ return nullptr;
+ }
+ *out = result;
+ return info.p;
+}
+
+#endif // __aarch64__
+
} // namespace internal
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/parse_context.h b/src/google/protobuf/parse_context.h
index 7aea50c..12d51f5 100644
--- a/src/google/protobuf/parse_context.h
+++ b/src/google/protobuf/parse_context.h
@@ -36,21 +36,23 @@
#include <string>
#include <type_traits>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/arena.h>
-#include <google/protobuf/port.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/arenastring.h>
-#include <google/protobuf/endian.h>
-#include <google/protobuf/implicit_weak_message.h>
-#include <google/protobuf/inlined_string_field.h>
-#include <google/protobuf/metadata_lite.h>
-#include <google/protobuf/repeated_field.h>
-#include <google/protobuf/wire_format_lite.h>
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/io/zero_copy_stream.h"
+#include "google/protobuf/arena.h"
+#include "absl/strings/internal/resize_uninitialized.h"
+#include "absl/strings/string_view.h"
+#include "google/protobuf/arenastring.h"
+#include "google/protobuf/endian.h"
+#include "google/protobuf/implicit_weak_message.h"
+#include "google/protobuf/inlined_string_field.h"
+#include "google/protobuf/metadata_lite.h"
+#include "google/protobuf/port.h"
+#include "google/protobuf/repeated_field.h"
+#include "google/protobuf/wire_format_lite.h"
+
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
@@ -64,11 +66,11 @@
// Template code below needs to know about the existence of these functions.
PROTOBUF_EXPORT void WriteVarint(uint32_t num, uint64_t val, std::string* s);
-PROTOBUF_EXPORT void WriteLengthDelimited(uint32_t num, StringPiece val,
+PROTOBUF_EXPORT void WriteLengthDelimited(uint32_t num, absl::string_view val,
std::string* s);
// Inline because it is just forwarding to s->WriteVarint
inline void WriteVarint(uint32_t num, uint64_t val, UnknownFieldSet* s);
-inline void WriteLengthDelimited(uint32_t num, StringPiece val,
+inline void WriteLengthDelimited(uint32_t num, absl::string_view val,
UnknownFieldSet* s);
@@ -157,7 +159,13 @@
PROTOBUF_NODISCARD const char* ReadString(const char* ptr, int size,
std::string* s) {
if (size <= buffer_end_ + kSlopBytes - ptr) {
- s->assign(ptr, size);
+ // Fundamentally we just want to do assign to the string.
+ // However micro-benchmarks regress on string reading cases. So we copy
+ // the same logic from the old CodedInputStream ReadString. Note: as of
+ // Apr 2021, this is still a significant win over `assign()`.
+ absl::strings_internal::STLStringResizeUninitialized(s, size);
+ char* z = &(*s)[0];
+ memcpy(z, ptr, size);
return ptr + size;
}
return ReadStringFallback(ptr, size, s);
@@ -204,6 +212,10 @@
int BytesUntilLimit(const char* ptr) const {
return limit_ + static_cast<int>(buffer_end_ - ptr);
}
+ // Maximum number of sequential bytes that can be read starting from `ptr`.
+ int MaximumReadSize(const char* ptr) const {
+ return static_cast<int>(limit_end_ - ptr) + kSlopBytes;
+ }
// Returns true if more data is available, if false is returned one has to
// call Done for further checks.
bool DataAvailable(const char* ptr) { return ptr < limit_end_; }
@@ -229,7 +241,7 @@
return res.second;
}
- const char* InitFrom(StringPiece flat) {
+ const char* InitFrom(absl::string_view flat) {
overall_limit_ = 0;
if (flat.size() > kSlopBytes) {
limit_ = kSlopBytes;
@@ -325,7 +337,7 @@
template <typename A>
const char* AppendSize(const char* ptr, int size, const A& append) {
- int chunk_size = buffer_end_ + kSlopBytes - ptr;
+ int chunk_size = static_cast<int>(buffer_end_ + kSlopBytes - ptr);
do {
GOOGLE_DCHECK(size > chunk_size);
if (next_chunk_ == nullptr) return nullptr;
@@ -339,7 +351,7 @@
ptr = Next();
if (ptr == nullptr) return nullptr; // passed the limit
ptr += kSlopBytes;
- chunk_size = buffer_end_ + kSlopBytes - ptr;
+ chunk_size = static_cast<int>(buffer_end_ + kSlopBytes - ptr);
} while (size > chunk_size);
append(ptr, size);
return ptr + size;
@@ -387,7 +399,6 @@
struct Data {
const DescriptorPool* pool = nullptr;
MessageFactory* factory = nullptr;
- Arena* arena = nullptr;
};
template <typename... T>
@@ -427,6 +438,17 @@
bool>::type = true>
PROTOBUF_NODISCARD const char* ParseMessage(T* msg, const char* ptr);
+ template <typename TcParser, typename Table>
+ PROTOBUF_NODISCARD PROTOBUF_ALWAYS_INLINE const char* ParseMessage(
+ MessageLite* msg, const char* ptr, const Table* table) {
+ int old;
+ ptr = ReadSizeAndPushLimitAndDepthInlined(ptr, &old);
+ ptr = ptr ? TcParser::ParseLoop(msg, ptr, this, table) : nullptr;
+ depth_++;
+ if (!PopLimit(old)) return nullptr;
+ return ptr;
+ }
+
template <typename T>
PROTOBUF_NODISCARD PROTOBUF_NDEBUG_INLINE const char* ParseGroup(
T* msg, const char* ptr, uint32_t tag) {
@@ -439,6 +461,18 @@
return ptr;
}
+ template <typename TcParser, typename Table>
+ PROTOBUF_NODISCARD PROTOBUF_ALWAYS_INLINE const char* ParseGroup(
+ MessageLite* msg, const char* ptr, uint32_t tag, const Table* table) {
+ if (--depth_ < 0) return nullptr;
+ group_depth_++;
+ ptr = TcParser::ParseLoop(msg, ptr, this, table);
+ group_depth_--;
+ depth_++;
+ if (PROTOBUF_PREDICT_FALSE(!ConsumeEndGroup(tag))) return nullptr;
+ return ptr;
+ }
+
private:
// Out-of-line routine to save space in ParseContext::ParseMessage<T>
// int old;
@@ -451,6 +485,11 @@
PROTOBUF_NODISCARD const char* ReadSizeAndPushLimitAndDepth(const char* ptr,
int* old_limit);
+ // As above, but fully inlined for the cases where we care about performance
+ // more than size. eg TcParser.
+ PROTOBUF_NODISCARD PROTOBUF_ALWAYS_INLINE const char*
+ ReadSizeAndPushLimitAndDepthInlined(const char* ptr, int* old_limit);
+
// The context keeps an internal stack to keep track of the recursive
// part of the parse state.
// Current depth of the active parser, depth counts down.
@@ -534,21 +573,64 @@
return tmp.first;
}
+#ifdef __aarch64__
+const char* VarintParseSlowArm64(const char* p, uint64_t* out, uint64_t first8);
+const char* VarintParseSlowArm32(const char* p, uint32_t* out, uint64_t first8);
+
+inline const char* VarintParseSlowArm(const char* p, uint32_t* out,
+ uint64_t first8) {
+ return VarintParseSlowArm32(p, out, first8);
+}
+
+inline const char* VarintParseSlowArm(const char* p, uint64_t* out,
+ uint64_t first8) {
+ return VarintParseSlowArm64(p, out, first8);
+}
+
+// Moves data into a register and returns data. This impacts the compiler's
+// scheduling and instruction selection decisions.
+static PROTOBUF_ALWAYS_INLINE inline uint64_t ForceToRegister(uint64_t data) {
+ asm("" : "+r"(data));
+ return data;
+}
+
+// Performs a 7 bit UBFX (Unsigned Bit Extract) starting at the indicated bit.
+static PROTOBUF_ALWAYS_INLINE inline uint64_t Ubfx7(uint64_t data,
+ uint64_t start) {
+ return ForceToRegister((data >> start) & 0x7f);
+}
+
+#endif // __aarch64__
+
template <typename T>
PROTOBUF_NODISCARD const char* VarintParse(const char* p, T* out) {
+#if defined(__aarch64__) && defined(PROTOBUF_LITTLE_ENDIAN)
+ // This optimization is not supported in big endian mode
+ uint64_t first8;
+ std::memcpy(&first8, p, sizeof(first8));
+ if (PROTOBUF_PREDICT_TRUE((first8 & 0x80) == 0)) {
+ *out = static_cast<uint8_t>(first8);
+ return p + 1;
+ }
+ if (PROTOBUF_PREDICT_TRUE((first8 & 0x8000) == 0)) {
+ uint64_t chunk1;
+ uint64_t chunk2;
+ // Extracting the two chunks this way gives a speedup for this path.
+ chunk1 = Ubfx7(first8, 0);
+ chunk2 = Ubfx7(first8, 8);
+ *out = chunk1 | (chunk2 << 7);
+ return p + 2;
+ }
+ return VarintParseSlowArm(p, out, first8);
+#else // __aarch64__
auto ptr = reinterpret_cast<const uint8_t*>(p);
uint32_t res = ptr[0];
- if (!(res & 0x80)) {
+ if ((res & 0x80) == 0) {
*out = res;
return p + 1;
}
- uint32_t byte = ptr[1];
- res += (byte - 1) << 7;
- if (!(byte & 0x80)) {
- *out = res;
- return p + 2;
- }
return VarintParseSlow(p, res, out);
+#endif // __aarch64__
}
// Used for tags, could read up to 5 bytes which must be available.
@@ -590,6 +672,7 @@
PROTOBUF_NODISCARD inline PROTOBUF_ALWAYS_INLINE uint64_t
RotRight7AndReplaceLowByte(uint64_t res, const char& byte) {
+ // TODO(b/239808098): remove the inline assembly
#if defined(__x86_64__) && defined(__GNUC__)
// This will only use one register for `res`.
// `byte` comes as a reference to allow the compiler to generate code like:
@@ -749,12 +832,26 @@
const char* ptr) {
int old;
ptr = ReadSizeAndPushLimitAndDepth(ptr, &old);
- ptr = ptr ? msg->_InternalParse(ptr, this) : nullptr;
+ if (ptr == nullptr) return ptr;
+ ptr = msg->_InternalParse(ptr, this);
depth_++;
if (!PopLimit(old)) return nullptr;
return ptr;
}
+inline const char* ParseContext::ReadSizeAndPushLimitAndDepthInlined(
+ const char* ptr, int* old_limit) {
+ int size = ReadSize(&ptr);
+ if (PROTOBUF_PREDICT_FALSE(!ptr)) {
+ // Make sure this isn't uninitialized even on error return
+ *old_limit = 0;
+ return nullptr;
+ }
+ *old_limit = PushLimit(ptr, size);
+ if (--depth_ < 0) return nullptr;
+ return ptr;
+}
+
template <typename Tag, typename T>
const char* EpsCopyInputStream::ReadRepeatedFixed(const char* ptr,
Tag expected_tag,
@@ -783,7 +880,7 @@
const char* EpsCopyInputStream::ReadPackedFixed(const char* ptr, int size,
RepeatedField<T>* out) {
GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
- int nbytes = buffer_end_ + kSlopBytes - ptr;
+ int nbytes = static_cast<int>(buffer_end_ + kSlopBytes - ptr);
while (size > nbytes) {
int num = nbytes / sizeof(T);
int old_entries = out->size();
@@ -801,7 +898,7 @@
ptr = Next();
if (ptr == nullptr) return nullptr;
ptr += kSlopBytes - (nbytes - block_size);
- nbytes = buffer_end_ + kSlopBytes - ptr;
+ nbytes = static_cast<int>(buffer_end_ + kSlopBytes - ptr);
}
int num = size / sizeof(T);
int old_entries = out->size();
@@ -833,11 +930,11 @@
const char* EpsCopyInputStream::ReadPackedVarint(const char* ptr, Add add) {
int size = ReadSize(&ptr);
GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
- int chunk_size = buffer_end_ - ptr;
+ int chunk_size = static_cast<int>(buffer_end_ - ptr);
while (size > chunk_size) {
ptr = ReadPackedVarintArray(ptr, buffer_end_, add);
if (ptr == nullptr) return nullptr;
- int overrun = ptr - buffer_end_;
+ int overrun = static_cast<int>(ptr - buffer_end_);
GOOGLE_DCHECK(overrun >= 0 && overrun <= kSlopBytes);
if (size - chunk_size <= kSlopBytes) {
// The current buffer contains all the information needed, we don't need
@@ -858,7 +955,7 @@
ptr = Next();
if (ptr == nullptr) return nullptr;
ptr += overrun;
- chunk_size = buffer_end_ - ptr;
+ chunk_size = static_cast<int>(buffer_end_ - ptr);
}
auto end = ptr + size;
ptr = ReadPackedVarintArray(ptr, end, add);
@@ -867,7 +964,7 @@
// Helper for verification of utf8
PROTOBUF_EXPORT
-bool VerifyUTF8(StringPiece s, const char* field_name);
+bool VerifyUTF8(absl::string_view s, const char* field_name);
inline bool VerifyUTF8(const std::string* s, const char* field_name) {
return VerifyUTF8(*s, field_name);
@@ -1020,6 +1117,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_PARSE_CONTEXT_H__
diff --git a/src/google/protobuf/port.h b/src/google/protobuf/port.h
index a5c060b..f3c6e66 100644
--- a/src/google/protobuf/port.h
+++ b/src/google/protobuf/port.h
@@ -36,17 +36,27 @@
#ifndef GOOGLE_PROTOBUF_PORT_H__
#define GOOGLE_PROTOBUF_PORT_H__
+#include <cassert>
#include <cstddef>
#include <new>
+#include <type_traits>
+
+
+// must be last
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
namespace internal {
+
+
inline void SizedDelete(void* p, size_t size) {
#if defined(__cpp_sized_deallocation)
::operator delete(p, size);
#else
+ // Avoid -Wunused-parameter
+ (void)size;
::operator delete(p);
#endif
}
@@ -54,6 +64,8 @@
#if defined(__cpp_sized_deallocation)
::operator delete[](p, size);
#else
+ // Avoid -Wunused-parameter
+ (void)size;
::operator delete[](p);
#endif
}
@@ -73,8 +85,35 @@
explicit ArenaInitialized() = default;
};
+template <typename To, typename From>
+inline To DownCast(From* f) {
+ static_assert(
+ std::is_base_of<From, typename std::remove_pointer<To>::type>::value,
+ "illegal DownCast");
+
+#if PROTOBUF_RTTI
+ // RTTI: debug mode only!
+ assert(f == nullptr || dynamic_cast<To>(f) != nullptr);
+#endif
+ return static_cast<To>(f);
+}
+
+template <typename ToRef, typename From>
+inline ToRef DownCast(From& f) {
+ using To = typename std::remove_reference<ToRef>::type;
+ static_assert(std::is_base_of<From, To>::value, "illegal DownCast");
+
+#if PROTOBUF_RTTI
+ // RTTI: debug mode only!
+ assert(dynamic_cast<To*>(&f) != nullptr);
+#endif
+ return *static_cast<To*>(&f);
+}
+
} // namespace internal
} // namespace protobuf
} // namespace google
+#include "google/protobuf/port_undef.inc"
+
#endif // GOOGLE_PROTOBUF_PORT_H__
diff --git a/src/google/protobuf/port_def.inc b/src/google/protobuf/port_def.inc
index 9b2156d..b7a576f 100644
--- a/src/google/protobuf/port_def.inc
+++ b/src/google/protobuf/port_def.inc
@@ -118,6 +118,15 @@
#define PROTOBUF_has_builtin_DEFINED_
#endif
+#ifdef ADDRESS_SANITIZER
+#include <sanitizer/asan_interface.h>
+#define PROTOBUF_POISON_MEMORY_REGION(p, n) ASAN_POISON_MEMORY_REGION(p, n)
+#define PROTOBUF_UNPOISON_MEMORY_REGION(p, n) ASAN_UNPOISON_MEMORY_REGION(p, n)
+#else // ADDRESS_SANITIZER
+#define PROTOBUF_POISON_MEMORY_REGION(p, n)
+#define PROTOBUF_UNPOISON_MEMORY_REGION(p, n)
+#endif // ADDRESS_SANITIZER
+
// Portable PROTOBUF_BUILTIN_BSWAPxx definitions
// Code must check for availability, e.g.: `defined(PROTOBUF_BUILTIN_BSWAP32)`
#ifdef PROTOBUF_BUILTIN_BSWAP16
@@ -139,6 +148,11 @@
#define PROTOBUF_BUILTIN_BSWAP64(x) __builtin_bswap64(x)
#endif
+// Portable check for gcc-style atomic built-ins
+#if __has_builtin(__atomic_load_n)
+#define PROTOBUF_BUILTIN_ATOMIC 1
+#endif
+
// Portable check for GCC minimum version:
// https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html
#if defined(__GNUC__) && defined(__GNUC_MINOR__) \
@@ -149,6 +163,13 @@
# define PROTOBUF_GNUC_MIN(x, y) 0
#endif
+#if defined(__clang__) && defined(__clang_major__) && defined(__clang_minor__)
+#define PROTOBUF_CLANG_MIN(x, y) \
+ (__clang_major__ > (x) || __clang_major__ == (x) && __clang_minor__ >= (y))
+#else
+#define PROTOBUF_CLANG_MIN(x, y) 0
+#endif
+
// Portable check for MSVC minimum version:
// https://docs.microsoft.com/en-us/cpp/preprocessor/predefined-macros
#if defined(_MSC_VER)
@@ -169,11 +190,33 @@
// Future versions of protobuf will include breaking changes to some APIs.
// This macro can be set to enable these API changes ahead of time, so that
// user code can be updated before upgrading versions of protobuf.
-// PROTOBUF_FUTURE_FINAL is used on classes that are historically not marked as
-// final, but that may be marked final in future (breaking) releases.
-// #define PROTOBUF_FUTURE_BREAKING_CHANGES 1
-// #define PROTOBUF_FUTURE_FINAL final
+
+#ifdef PROTOBUF_FUTURE_BREAKING_CHANGES
+
+// Used to upgrade google::protobuf::MapPair<K, V> to std::pair<const K, V>.
+// Owner: mordberg@
+#define PROTOBUF_FUTURE_MAP_PAIR_UPGRADE 1
+
+// Used on classes that are historically not marked as final, but that may be
+// marked final in future (breaking) releases.
+// Owner: kfm@
+#define PROTOBUF_FUTURE_FINAL final
+
+// Used to remove the RTTI checks for `DefaultFieldComparator`.
+// Owner: kfm@
+#define PROTOBUF_FUTURE_REMOVE_DEFAULT_FIELD_COMPARATOR 1
+
+// Used to remove the manipulation of cleared elements in RepeatedPtrField.
+// Owner: mkruskal@
+#define PROTOBUF_FUTURE_REMOVE_CLEARED_API 1
+
+// Used to escape C++20 keywords.
+// TODO(mkruskal): ping b/238664698 when this lands in opensource.
+// Owner: mkruskal@
+#define PROTOBUF_FUTURE_CPP20_KEYWORDS 1
+#else
#define PROTOBUF_FUTURE_FINAL
+#endif
#ifdef PROTOBUF_VERSION
#error PROTOBUF_VERSION was previously defined
@@ -356,15 +399,6 @@
# define PROTOBUF_DEPRECATED_ENUM
#endif
-#ifdef PROTOBUF_FUNC_ALIGN
-#error PROTOBUF_FUNC_ALIGN was previously defined
-#endif
-#if __has_attribute(aligned) || PROTOBUF_GNUC_MIN(4, 3)
-#define PROTOBUF_FUNC_ALIGN(bytes) __attribute__((aligned(bytes)))
-#else
-#define PROTOBUF_FUNC_ALIGN(bytes)
-#endif
-
#ifdef PROTOBUF_RETURNS_NONNULL
#error PROTOBUF_RETURNS_NONNULL was previously defined
#endif
@@ -527,12 +561,20 @@
#error PROTOBUF_FORCE_RESET_IN_CLEAR was previously defined
#endif
+#ifdef PROTOBUF_FUZZ_MESSAGE_SPACE_USED_LONG
+#error PROTOBUF_FUZZ_MESSAGE_SPACE_USED_LONG was previously defined
+#endif
+
// Force copy the default string to a string field so that non-optimized builds
// have harder-to-rely-on address stability.
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
#error PROTOBUF_FORCE_COPY_DEFAULT_STRING was previously defined
#endif
+#ifdef PROTOBUF_FORCE_ALLOCATION_ON_CONSTRUCTION
+#error PROTOBUF_FORCE_ALLOCATION_ON_CONSTRUCTION was previously defined
+#endif
+
#ifdef PROTOBUF_FALLTHROUGH_INTENDED
#error PROTOBUF_FALLTHROUGH_INTENDED was previously defined
#endif
@@ -635,30 +677,39 @@
// This experiment is purely for the purpose of gathering data. All code guarded
// by this flag is supposed to be removed after this experiment.
#define PROTOBUF_MESSAGE_OWNED_ARENA_EXPERIMENT
+
#ifdef PROTOBUF_CONSTINIT
#error PROTOBUF_CONSTINIT was previously defined
#endif
-#if defined(__cpp_constinit) && !defined(_MSC_VER)
-#define PROTOBUF_CONSTINIT constinit
-#define PROTOBUF_CONSTEXPR constexpr
+
+// Lexan sets both MSV_VER and clang, so handle it with the clang path.
+#if defined(_MSC_VER) && !defined(__clang__)
+// MSVC 17 currently seems to raise an error about constant-initialized pointers.
+# if PROTOBUF_MSC_VER_MIN(1930)
+# define PROTOBUF_CONSTINIT
+# define PROTOBUF_CONSTEXPR constexpr
+# endif
+#else
+# if defined(__cpp_constinit) && !defined(__CYGWIN__)
+# define PROTOBUF_CONSTINIT constinit
+# define PROTOBUF_CONSTEXPR constexpr
// Some older Clang versions incorrectly raise an error about
// constant-initializing weak default instance pointers. Versions 12.0 and
// higher seem to work, except that XCode 12.5.1 shows the error even though it
// uses Clang 12.0.5.
-// Clang-cl on Windows raises error also.
-#elif !defined(_MSC_VER) && __has_cpp_attribute(clang::require_constant_initialization) && \
- ((defined(__APPLE__) && __clang_major__ >= 13) || \
- (!defined(__APPLE__) && __clang_major__ >= 12))
-#define PROTOBUF_CONSTINIT [[clang::require_constant_initialization]]
-#define PROTOBUF_CONSTEXPR constexpr
-#elif PROTOBUF_GNUC_MIN(12, 2)
-#define PROTOBUF_CONSTINIT __constinit
-#define PROTOBUF_CONSTEXPR constexpr
-// MSVC 17 currently seems to raise an error about constant-initialized pointers.
-#elif defined(_MSC_VER) && _MSC_VER >= 1930
-#define PROTOBUF_CONSTINIT
-#define PROTOBUF_CONSTEXPR constexpr
-#else
+# elif !defined(__CYGWIN__) && \
+ __has_cpp_attribute(clang::require_constant_initialization) && \
+ ((defined(__APPLE__) && PROTOBUF_CLANG_MIN(13, 0)) || \
+ (!defined(__APPLE__) && PROTOBUF_CLANG_MIN(12, 0)))
+# define PROTOBUF_CONSTINIT [[clang::require_constant_initialization]]
+# define PROTOBUF_CONSTEXPR constexpr
+# elif PROTOBUF_GNUC_MIN(12, 2)
+# define PROTOBUF_CONSTINIT __constinit
+# define PROTOBUF_CONSTEXPR constexpr
+# endif
+#endif
+
+#ifndef PROTOBUF_CONSTINIT
#define PROTOBUF_CONSTINIT
#define PROTOBUF_CONSTEXPR
#endif
@@ -772,8 +823,8 @@
#endif
// Tail call table-driven parsing can be enabled by defining
-// PROTOBUF_EXPERIMENTAL_USE_TAIL_CALL_TABLE_PARSER at compilation time. Note
-// that this macro is for small-scale testing only, and is not supported.
+// PROTOBUF_EXPERIMENTAL_USE_TAIL_CALL_TABLE_PARSER at compilation time.
+// We hope to turn on table-driven parsing by default in Q4 2022.
#ifdef PROTOBUF_TAIL_CALL_TABLE_PARSER_ENABLED
#error PROTOBUF_TAIL_CALL_TABLE_PARSER_ENABLED was previously declared
#endif
@@ -781,11 +832,29 @@
#define PROTOBUF_TAIL_CALL_TABLE_PARSER_ENABLED 1
#endif
-#define PROTOBUF_TC_PARAM_DECL \
- ::google::protobuf::MessageLite *msg, const char *ptr, \
- ::google::protobuf::internal::ParseContext *ctx, \
- const ::google::protobuf::internal::TcParseTableBase *table, \
- uint64_t hasbits, ::google::protobuf::internal::TcFieldData data
+#ifdef PROTOBUF_USE_TABLE_PARSER_ON_REFLECTION
+#error PROTOBUF_USE_TABLE_PARSER_ON_REFLECTION was previously defined
+#endif
+#if !defined(PROTOBUF_TEMPORARY_DISABLE_TABLE_PARSER_ON_REFLECTION)
+#define PROTOBUF_USE_TABLE_PARSER_ON_REFLECTION 1
+#endif // PROTOBUF_ENABLE_FORCE_ALLOCATION_ON_CONSTRUCTION
+
+// Note that this is performance sensitive: changing the parameters will change
+// the registers used by the ABI calling convention, which subsequently affects
+// register selection logic inside the function.
+// Arguments `msg`, `ptr` and `ctx` are the 1st/2nd/3rd argument to match the
+// signature of ParseLoop.
+//
+// Note for x86_64: `data` must be the third or fourth argument for performance
+// reasons. In order to efficiently read the second byte of `data` we need it to
+// be passed in RDX or RCX.
+#define PROTOBUF_TC_PARAM_DECL \
+ ::google::protobuf::MessageLite *msg, const char *ptr, \
+ ::google::protobuf::internal::ParseContext *ctx, \
+ ::google::protobuf::internal::TcFieldData data, \
+ const ::google::protobuf::internal::TcParseTableBase *table, uint64_t hasbits
+// PROTOBUF_TC_PARAM_PASS passes values to match PROTOBUF_TC_PARAM_DECL.
+#define PROTOBUF_TC_PARAM_PASS msg, ptr, ctx, data, table, hasbits
#ifdef PROTOBUF_UNUSED
#error PROTOBUF_UNUSED was previously defined
@@ -801,13 +870,36 @@
// ThreadSafeArenaz is turned off completely in opensource builds.
+// autoheader defines this in some circumstances
+#ifdef PACKAGE
+#define PROTOBUF_DID_UNDEF_PACKAGE
+#pragma push_macro("PACKAGE")
+#undef PACKAGE
+#endif
+
+// autoheader defines this in some circumstances
+#ifdef PACKAGE
+#define PROTOBUF_DID_UNDEF_PACKAGE
+#pragma push_macro("PACKAGE")
+#undef PACKAGE
+#endif
+
+// linux is a legacy MACRO defined in most popular C++ standards.
+#ifdef linux
+#pragma push_macro("linux")
+#undef linux
+#define PROTOBUF_DID_UNDEF_LINUX
+#endif
+
// Windows declares several inconvenient macro names. We #undef them and then
// restore them in port_undef.inc.
-#ifdef _MSC_VER
+#ifdef _WIN32
#pragma push_macro("CREATE_NEW")
#undef CREATE_NEW
#pragma push_macro("DELETE")
#undef DELETE
+#pragma push_macro("DOMAIN")
+#undef DOMAIN
#pragma push_macro("DOUBLE_CLICK")
#undef DOUBLE_CLICK
#pragma push_macro("ERROR")
@@ -820,6 +912,8 @@
#undef ERROR_NOT_FOUND
#pragma push_macro("GetClassName")
#undef GetClassName
+#pragma push_macro("GetCurrentTime")
+#undef GetCurrentTime
#pragma push_macro("GetMessage")
#undef GetMessage
#pragma push_macro("GetObject")
@@ -856,7 +950,7 @@
#undef STRICT
#pragma push_macro("timezone")
#undef timezone
-#endif // _MSC_VER
+#endif // _WIN32
#ifdef __APPLE__
// Inconvenient macro names from usr/include/math.h in some macOS SDKs.
@@ -870,6 +964,11 @@
// Inconvenient macro names from usr/include/sys/syslimits.h in some macOS SDKs.
#pragma push_macro("UID_MAX")
#undef UID_MAX
+#pragma push_macro("GID_MAX")
+#undef GID_MAX
+// TYPE_BOOL is defined in the MacOS's ConditionalMacros.h.
+#pragma push_macro("TYPE_BOOL")
+#undef TYPE_BOOL
#endif // __APPLE__
#if defined(__clang__) || PROTOBUF_GNUC_MIN(3, 0) || defined(_MSC_VER)
@@ -903,6 +1002,23 @@
#pragma warning(disable: 4125)
#endif
+#if PROTOBUF_ENABLE_DEBUG_LOGGING_MAY_LEAK_PII
+#define PROTOBUF_DEBUG true
+#else
+#define PROTOBUF_DEBUG false
+#endif
+
+// This `for` allows us to condition the `GOOGLE_LOG` on the define above, so that
+// code can write `PROTOBUF_DLOG(INFO) << ...;` and have it turned off when
+// debug logging is off.
+//
+// This is a `for`, not and `if`, to avoid it accidentally chaining with an
+// `else` below it.
+#define PROTOBUF_DLOG(x) \
+ for (bool b = PROTOBUF_DEBUG; b; b = false) GOOGLE_LOG(x)
+
+#define PROTO2_IS_OSS true
+
// We don't want code outside port_def doing complex testing, so
// remove our portable condition test macros to nudge folks away from
// using it themselves.
diff --git a/src/google/protobuf/port_undef.inc b/src/google/protobuf/port_undef.inc
index e880fa5..00b721b 100644
--- a/src/google/protobuf/port_undef.inc
+++ b/src/google/protobuf/port_undef.inc
@@ -35,10 +35,14 @@
#error "port_undef.inc must be included after port_def.inc"
#endif
+#undef PROTOBUF_POISON_MEMORY_REGION
+#undef PROTOBUF_UNPOISON_MEMORY_REGION
#undef PROTOBUF_BUILTIN_BSWAP16
#undef PROTOBUF_BUILTIN_BSWAP32
#undef PROTOBUF_BUILTIN_BSWAP64
+#undef PROTOBUF_BUILTIN_ATOMIC
#undef PROTOBUF_GNUC_MIN
+#undef PROTOBUF_CLANG_MIN
#undef PROTOBUF_MSC_VER_MIN
#undef PROTOBUF_CPLUSPLUS_MIN
#undef PROTOBUF_NAMESPACE
@@ -53,7 +57,6 @@
#undef PROTOBUF_DEPRECATED
#undef PROTOBUF_DEPRECATED_ENUM
#undef PROTOBUF_DEPRECATED_MSG
-#undef PROTOBUF_FUNC_ALIGN
#undef PROTOBUF_RETURNS_NONNULL
#undef PROTOBUF_ATTRIBUTE_REINITIALIZES
#undef PROTOBUF_RTTI
@@ -72,7 +75,9 @@
#undef PROTOBUF_FORCE_COPY_IN_SWAP
#undef PROTOBUF_FORCE_COPY_IN_MOVE
#undef PROTOBUF_FORCE_RESET_IN_CLEAR
+#undef PROTOBUF_FUZZ_MESSAGE_SPACE_USED_LONG
#undef PROTOBUF_FORCE_COPY_DEFAULT_STRING
+#undef PROTOBUF_FORCE_ALLOCATION_ON_CONSTRUCTION
#undef PROTOBUF_NAMESPACE_OPEN
#undef PROTOBUF_NAMESPACE_CLOSE
#undef PROTOBUF_UNUSED
@@ -99,26 +104,47 @@
#undef PROTOBUF_MSAN
#undef PROTOBUF_TSAN
#undef PROTOBUF_TAIL_CALL_TABLE_PARSER_ENABLED
+#undef PROTOBUF_USE_TABLE_PARSER_ON_REFLECTION
#undef PROTOBUF_TC_PARAM_DECL
#undef PROTOBUF_EXCLUSIVE_LOCKS_REQUIRED
#undef PROTOBUF_LOCKS_EXCLUDED
#undef PROTOBUF_NO_THREAD_SAFETY_ANALYSIS
#undef PROTOBUF_GUARDED_BY
+#undef PROTOBUF_DEBUG
+#undef PROTOBUF_DLOG
+#undef PROTO2_IS_OSS
#ifdef PROTOBUF_FUTURE_BREAKING_CHANGES
#undef PROTOBUF_FUTURE_BREAKING_CHANGES
+#undef PROTOBUF_FUTURE_MAP_PAIR_UPGRADE
+#undef PROTOBUF_FUTURE_REMOVE_DEFAULT_FIELD_COMPARATOR
+#undef PROTOBUF_FUTURE_REMOVE_CLEARED_API
#endif
-// Restore macro that may have been #undef'd in port_def.inc.
-#ifdef _MSC_VER
+#undef PROTOBUF_FUTURE_FINAL
+
+// Restore macros that may have been #undef'd in port_def.inc.
+
+#ifdef PROTOBUF_DID_UNDEF_PACKAGE
+#pragma pop_macro("PACKAGE")
+#undef PROTOBUF_DID_UNDEF_PACKAGE
+#endif
+
+#ifdef PROTOBUF_DID_UNDEF_LINUX
+#pragma pop_macro("linux")
+#endif
+
+#ifdef _WIN32
#pragma pop_macro("CREATE_NEW")
#pragma pop_macro("DELETE")
+#pragma pop_macro("DOMAIN")
#pragma pop_macro("DOUBLE_CLICK")
#pragma pop_macro("ERROR")
#pragma pop_macro("ERROR_BUSY")
#pragma pop_macro("ERROR_INSTALL_FAILED")
#pragma pop_macro("ERROR_NOT_FOUND")
#pragma pop_macro("GetClassName")
+#pragma pop_macro("GetCurrentTime")
#pragma pop_macro("GetMessage")
#pragma pop_macro("GetObject")
#pragma pop_macro("IGNORE")
@@ -144,6 +170,8 @@
#pragma pop_macro("TRUE")
#pragma pop_macro("FALSE")
#pragma pop_macro("UID_MAX")
+#pragma pop_macro("GID_MAX")
+#pragma pop_macro("TYPE_BOOL")
#endif // __APPLE__
#if defined(__clang__) || defined(__GNUC__) || defined(_MSC_VER)
diff --git a/src/google/protobuf/preserve_unknown_enum_test.cc b/src/google/protobuf/preserve_unknown_enum_test.cc
index 7e6bbf1..64d8247 100644
--- a/src/google/protobuf/preserve_unknown_enum_test.cc
+++ b/src/google/protobuf/preserve_unknown_enum_test.cc
@@ -28,11 +28,11 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/unittest.pb.h>
-#include <google/protobuf/unittest_preserve_unknown_enum.pb.h>
-#include <google/protobuf/unittest_preserve_unknown_enum2.pb.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/dynamic_message.h>
+#include "google/protobuf/unittest.pb.h"
+#include "google/protobuf/unittest_preserve_unknown_enum.pb.h"
+#include "google/protobuf/unittest_preserve_unknown_enum2.pb.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/dynamic_message.h"
#include <gtest/gtest.h>
namespace google {
diff --git a/src/google/protobuf/proto3_arena_lite_unittest.cc b/src/google/protobuf/proto3_arena_lite_unittest.cc
index 06b8d08..7c37f3f 100644
--- a/src/google/protobuf/proto3_arena_lite_unittest.cc
+++ b/src/google/protobuf/proto3_arena_lite_unittest.cc
@@ -32,9 +32,8 @@
#include <string>
#include <vector>
-#include <google/protobuf/unittest_proto3_arena.pb.h>
-#include <google/protobuf/arena.h>
-#include <google/protobuf/testing/googletest.h>
+#include "google/protobuf/unittest_proto3_arena.pb.h"
+#include "google/protobuf/arena.h"
#include <gtest/gtest.h>
using proto3_arena_unittest::TestAllTypes;
diff --git a/src/google/protobuf/proto3_arena_unittest.cc b/src/google/protobuf/proto3_arena_unittest.cc
index cfbe198..0f55865 100644
--- a/src/google/protobuf/proto3_arena_unittest.cc
+++ b/src/google/protobuf/proto3_arena_unittest.cc
@@ -32,18 +32,17 @@
#include <string>
#include <vector>
-#include <google/protobuf/unittest.pb.h>
-#include <google/protobuf/unittest_proto3_arena.pb.h>
-#include <google/protobuf/unittest_proto3_optional.pb.h>
-#include <google/protobuf/arena.h>
-#include <google/protobuf/text_format.h>
-#include <google/protobuf/testing/googletest.h>
+#include "google/protobuf/unittest.pb.h"
+#include "google/protobuf/unittest_proto3_arena.pb.h"
+#include "google/protobuf/unittest_proto3_optional.pb.h"
+#include "google/protobuf/arena.h"
+#include "google/protobuf/text_format.h"
#include <gtest/gtest.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/test_util.h>
+#include "absl/strings/match.h"
+#include "google/protobuf/test_util.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
using proto3_arena_unittest::ForeignMessage;
using proto3_arena_unittest::TestAllTypes;
@@ -297,7 +296,7 @@
for (int i = 0; i < d->field_count(); i++) {
const FieldDescriptor* f = d->field(i);
- if (HasPrefixString(f->name(), "singular")) {
+ if (absl::StartsWith(f->name(), "singular")) {
EXPECT_FALSE(f->has_optional_keyword()) << f->full_name();
EXPECT_FALSE(f->has_presence()) << f->full_name();
EXPECT_FALSE(f->containing_oneof()) << f->full_name();
diff --git a/src/google/protobuf/proto3_lite_unittest.cc b/src/google/protobuf/proto3_lite_unittest.cc
index abeeedb..e3012db 100644
--- a/src/google/protobuf/proto3_lite_unittest.cc
+++ b/src/google/protobuf/proto3_lite_unittest.cc
@@ -28,13 +28,13 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/unittest_proto3.pb.h>
+#include "google/protobuf/unittest_proto3.pb.h"
#define LITE_TEST_NAME Proto3LiteTest
#define UNITTEST ::proto3_unittest
// Must include after the above macros.
-#include <google/protobuf/proto3_lite_unittest.inc>
+#include "google/protobuf/proto3_lite_unittest.inc"
// Make extract script happy.
namespace google {
diff --git a/src/google/protobuf/proto3_lite_unittest.inc b/src/google/protobuf/proto3_lite_unittest.inc
index 5878163..a60bb68 100644
--- a/src/google/protobuf/proto3_lite_unittest.inc
+++ b/src/google/protobuf/proto3_lite_unittest.inc
@@ -32,8 +32,7 @@
#include <string>
#include <vector>
-#include <google/protobuf/arena.h>
-#include <google/protobuf/testing/googletest.h>
+#include "google/protobuf/arena.h"
#include <gtest/gtest.h>
using UNITTEST::TestAllTypes;
diff --git a/src/google/protobuf/reflection.h b/src/google/protobuf/reflection.h
index 7b75a43..df9e5a7 100644
--- a/src/google/protobuf/reflection.h
+++ b/src/google/protobuf/reflection.h
@@ -36,15 +36,15 @@
#include <memory>
-#include <google/protobuf/message.h>
-#include <google/protobuf/generated_enum_util.h>
+#include "google/protobuf/message.h"
+#include "google/protobuf/generated_enum_util.h"
#ifdef SWIG
#error "You cannot SWIG proto headers"
#endif
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -565,6 +565,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_REFLECTION_H__
diff --git a/src/google/protobuf/reflection_internal.h b/src/google/protobuf/reflection_internal.h
index f749c3e..3fdee89 100644
--- a/src/google/protobuf/reflection_internal.h
+++ b/src/google/protobuf/reflection_internal.h
@@ -31,9 +31,9 @@
#ifndef GOOGLE_PROTOBUF_REFLECTION_INTERNAL_H__
#define GOOGLE_PROTOBUF_REFLECTION_INTERNAL_H__
-#include <google/protobuf/map_field.h>
-#include <google/protobuf/reflection.h>
-#include <google/protobuf/repeated_field.h>
+#include "google/protobuf/map_field.h"
+#include "google/protobuf/reflection.h"
+#include "google/protobuf/repeated_field.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/reflection_ops.cc b/src/google/protobuf/reflection_ops.cc
index 3a1972e..0ef6c9a 100644
--- a/src/google/protobuf/reflection_ops.cc
+++ b/src/google/protobuf/reflection_ops.cc
@@ -31,21 +31,22 @@
// Author: kenton@google.com (Kenton Varda)
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/reflection_ops.h>
+#include "google/protobuf/reflection_ops.h"
#include <string>
#include <vector>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/map_field.h>
-#include <google/protobuf/map_field_inl.h>
-#include <google/protobuf/unknown_field_set.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "absl/strings/str_cat.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/map_field.h"
+#include "google/protobuf/map_field_inl.h"
+#include "google/protobuf/unknown_field_set.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -374,7 +375,7 @@
}
if (index != -1) {
result.append("[");
- result.append(StrCat(index));
+ result.append(absl::StrCat(index));
result.append("]");
}
result.append(".");
@@ -456,4 +457,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/reflection_ops.h b/src/google/protobuf/reflection_ops.h
index 0a45702..b6f1bd2 100644
--- a/src/google/protobuf/reflection_ops.h
+++ b/src/google/protobuf/reflection_ops.h
@@ -38,15 +38,15 @@
#ifndef GOOGLE_PROTOBUF_REFLECTION_OPS_H__
#define GOOGLE_PROTOBUF_REFLECTION_OPS_H__
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/message.h>
+#include "google/protobuf/message.h"
+#include "google/protobuf/port.h"
#ifdef SWIG
#error "You cannot SWIG proto headers"
#endif
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -63,6 +63,8 @@
// This class is really a namespace that contains only static methods.
class PROTOBUF_EXPORT ReflectionOps {
public:
+ ReflectionOps() = delete;
+
static void Copy(const Message& from, Message* to);
static void Merge(const Message& from, Message* to);
static void Clear(Message* message);
@@ -77,16 +79,12 @@
static void FindInitializationErrors(const Message& message,
const std::string& prefix,
std::vector<std::string>* errors);
-
- private:
- // All methods are static. No need to construct.
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ReflectionOps);
};
} // namespace internal
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_REFLECTION_OPS_H__
diff --git a/src/google/protobuf/reflection_ops_unittest.cc b/src/google/protobuf/reflection_ops_unittest.cc
index 513ce47..282e4ae 100644
--- a/src/google/protobuf/reflection_ops_unittest.cc
+++ b/src/google/protobuf/reflection_ops_unittest.cc
@@ -32,17 +32,16 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/reflection_ops.h>
+#include "google/protobuf/reflection_ops.h"
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/unittest.pb.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/testing/googletest.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/unittest.pb.h"
+#include "google/protobuf/descriptor.h"
#include <gtest/gtest.h>
-#include <google/protobuf/test_util.h>
+#include "google/protobuf/test_util.h"
-#include <google/protobuf/stubs/strutil.h>
+#include "google/protobuf/stubs/strutil.h"
namespace google {
namespace protobuf {
@@ -460,7 +459,7 @@
static std::string FindInitializationErrors(const Message& message) {
std::vector<std::string> errors;
ReflectionOps::FindInitializationErrors(message, "", &errors);
- return Join(errors, ",");
+ return absl::StrJoin(errors, ",");
}
TEST(ReflectionOpsTest, FindInitializationErrors) {
diff --git a/src/google/protobuf/reflection_tester.cc b/src/google/protobuf/reflection_tester.cc
index 4c6db03..23084dc 100644
--- a/src/google/protobuf/reflection_tester.cc
+++ b/src/google/protobuf/reflection_tester.cc
@@ -28,14 +28,14 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/reflection_tester.h>
+#include "google/protobuf/reflection_tester.h"
#include <gtest/gtest.h>
-#include <google/protobuf/map_field.h>
-#include <google/protobuf/message.h>
+#include "google/protobuf/map_field.h"
+#include "google/protobuf/message.h"
// Must include last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -1670,4 +1670,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/reflection_tester.h b/src/google/protobuf/reflection_tester.h
index 3a2dc81..7a124af 100644
--- a/src/google/protobuf/reflection_tester.h
+++ b/src/google/protobuf/reflection_tester.h
@@ -31,10 +31,10 @@
#ifndef GOOGLE_PROTOBUF_REFLECTION_TESTER_H__
#define GOOGLE_PROTOBUF_REFLECTION_TESTER_H__
-#include <google/protobuf/message.h>
+#include "google/protobuf/message.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -117,6 +117,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_REFLECTION_TESTER_H__
diff --git a/src/google/protobuf/repeated_field.cc b/src/google/protobuf/repeated_field.cc
index 7264d0a..f8212e3 100644
--- a/src/google/protobuf/repeated_field.cc
+++ b/src/google/protobuf/repeated_field.cc
@@ -32,15 +32,15 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/repeated_field.h>
+#include "google/protobuf/repeated_field.h"
#include <algorithm>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -68,4 +68,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/repeated_field.h b/src/google/protobuf/repeated_field.h
index 3fb734e..bc70129 100644
--- a/src/google/protobuf/repeated_field.h
+++ b/src/google/protobuf/repeated_field.h
@@ -52,16 +52,17 @@
#include <type_traits>
#include <utility>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/arena.h>
-#include <google/protobuf/port.h>
-#include <google/protobuf/message_lite.h>
-#include <google/protobuf/repeated_ptr_field.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/arena.h"
+#include "google/protobuf/port.h"
+#include "google/protobuf/message_lite.h"
+#include "google/protobuf/port.h"
+#include "google/protobuf/repeated_ptr_field.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
#ifdef SWIG
#error "You cannot SWIG proto headers"
@@ -94,60 +95,41 @@
constexpr int kRepeatedFieldUpperClampLimit =
(std::numeric_limits<int>::max() / 2) + 1;
-template <typename Iter>
-inline int CalculateReserve(Iter begin, Iter end, std::forward_iterator_tag) {
- return static_cast<int>(std::distance(begin, end));
-}
-
-template <typename Iter>
-inline int CalculateReserve(Iter /*begin*/, Iter /*end*/,
- std::input_iterator_tag /*unused*/) {
- return -1;
-}
-
-template <typename Iter>
-inline int CalculateReserve(Iter begin, Iter end) {
- typedef typename std::iterator_traits<Iter>::iterator_category Category;
- return CalculateReserve(begin, end, Category());
-}
-
-// Swaps two blocks of memory of size sizeof(T).
-template <typename T>
-inline void SwapBlock(char* p, char* q) {
- T tmp;
- memcpy(&tmp, p, sizeof(T));
- memcpy(p, q, sizeof(T));
- memcpy(q, &tmp, sizeof(T));
-}
-
// Swaps two blocks of memory of size kSize:
-// template <int kSize> void memswap(char* p, char* q);
-template <int kSize>
-inline typename std::enable_if<(kSize == 0), void>::type memswap(char*, char*) {
-}
-
-#define PROTO_MEMSWAP_DEF_SIZE(reg_type, max_size) \
- template <int kSize> \
- typename std::enable_if<(kSize >= sizeof(reg_type) && kSize < (max_size)), \
- void>::type \
- memswap(char* p, char* q) { \
- SwapBlock<reg_type>(p, q); \
- memswap<kSize - sizeof(reg_type)>(p + sizeof(reg_type), \
- q + sizeof(reg_type)); \
- }
-
-PROTO_MEMSWAP_DEF_SIZE(uint8_t, 2)
-PROTO_MEMSWAP_DEF_SIZE(uint16_t, 4)
-PROTO_MEMSWAP_DEF_SIZE(uint32_t, 8)
-
-#ifdef __SIZEOF_INT128__
-PROTO_MEMSWAP_DEF_SIZE(uint64_t, 16)
-PROTO_MEMSWAP_DEF_SIZE(__uint128_t, (1u << 31))
+template <size_t kSize>
+void memswap(char* a, char* b) {
+#if __SIZEOF_INT128__
+ using Buffer = __uint128_t;
#else
-PROTO_MEMSWAP_DEF_SIZE(uint64_t, (1u << 31))
+ using Buffer = uint64_t;
#endif
-#undef PROTO_MEMSWAP_DEF_SIZE
+ constexpr size_t kBlockSize = sizeof(Buffer);
+ Buffer buf;
+ for (size_t i = 0; i < kSize / kBlockSize; ++i) {
+ memcpy(&buf, a, kBlockSize);
+ memcpy(a, b, kBlockSize);
+ memcpy(b, &buf, kBlockSize);
+ a += kBlockSize;
+ b += kBlockSize;
+ }
+
+#if defined(__GNUC__) && !defined(__clang__)
+ // Workaround GCC bug: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99578
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wpragmas"
+#pragma GCC diagnostic ignored "-Wstringop-overflow"
+#endif // __GNUC__
+
+ // Swap the leftover bytes, could be zero.
+ memcpy(&buf, a, kSize % kBlockSize);
+ memcpy(a, b, kSize % kBlockSize);
+ memcpy(b, &buf, kSize % kBlockSize);
+
+#if defined(__GNUC__) && !defined(__clang__)
+#pragma GCC diagnostic pop
+#endif // GCC
+}
template <typename Element>
class RepeatedIterator;
@@ -246,16 +228,10 @@
Element* mutable_data();
const Element* data() const;
- // Swaps entire contents with "other". If they are separate arenas then,
+ // Swaps entire contents with "other". If they are separate arenas, then
// copies data between each other.
void Swap(RepeatedField* other);
- // Swaps entire contents with "other". Should be called only if the caller can
- // guarantee that both repeated fields are on the same arena or are on the
- // heap. Swapping between different arenas is disallowed and caught by a
- // GOOGLE_DCHECK (see API docs for details).
- void UnsafeArenaSwap(RepeatedField* other);
-
// Swaps two elements.
void SwapElements(int index1, int index2);
@@ -313,8 +289,14 @@
iterator erase(const_iterator first, const_iterator last);
// Gets the Arena on which this RepeatedField stores its elements.
+ // Message-owned arenas are not exposed by this method, which will return
+ // nullptr for messages owned by MOAs.
inline Arena* GetArena() const {
- return GetOwningArena();
+ Arena* arena = GetOwningArena();
+ if (arena == nullptr || arena->InternalIsMessageOwnedArena()) {
+ return nullptr;
+ }
+ return arena;
}
// For internal use only.
@@ -322,6 +304,7 @@
// This is public due to it being called by generated code.
inline void InternalSwap(RepeatedField* other);
+
private:
template <typename T> friend class Arena::InternalHelper;
@@ -331,6 +314,12 @@
: rep()->arena;
}
+ // Swaps entire contents with "other". Should be called only if the caller can
+ // guarantee that both repeated fields are on the same arena or are on the
+ // heap. Swapping between different arenas is disallowed and caught by a
+ // GOOGLE_DCHECK (see API docs for details).
+ void UnsafeArenaSwap(RepeatedField* other);
+
static constexpr int kInitialSize = 0;
// A note on the representation here (see also comment below for
// RepeatedPtrFieldBase's struct Rep):
@@ -344,6 +333,16 @@
// RepeatedField class to avoid costly cache misses due to the indirection.
int current_size_;
int total_size_;
+
+ // Replaces current_size_ with new_size and returns the previous value of
+ // current_size_. This function is intended to be the only place where
+ // current_size_ is modified.
+ inline int ExchangeCurrentSize(int new_size) {
+ const int prev_size = current_size_;
+ current_size_ = new_size;
+ return prev_size;
+ }
+
// Pad the Rep after arena allow for power-of-two byte sizes when
// sizeof(Element) > sizeof(Arena*). eg for 16-byte objects.
static PROTOBUF_CONSTEXPR const size_t kRepHeaderSize =
@@ -356,6 +355,7 @@
}
};
+
// If total_size_ == 0 this points to an Arena otherwise it points to the
// elements member of a Rep struct. Using this invariant allows the storage of
// the arena pointer without an extra allocation in the constructor.
@@ -448,8 +448,13 @@
//
// Typically, due to the fact that adder is a local stack variable, the
// compiler will be successful in mem-to-reg transformation and the machine
- // code will be loop: cmp %size, %capacity jae fallback mov dword ptr [%buffer
- // + %size * 4], %val inc %size jmp loop
+ // code will be
+ // loop:
+ // cmp %size, %capacity
+ // jae fallback
+ // mov dword ptr [%buffer + %size * 4], %val
+ // inc %size
+ // jmp loop
//
// The first version executes at 7 cycles per iteration while the second
// version executes at only 1 or 2 cycles.
@@ -461,7 +466,11 @@
capacity_ = repeated_field_->total_size_;
buffer_ = repeated_field_->unsafe_elements();
}
- ~FastAdderImpl() { repeated_field_->current_size_ = index_; }
+ FastAdderImpl(const FastAdderImpl&) = delete;
+ FastAdderImpl& operator=(const FastAdderImpl&) = delete;
+ ~FastAdderImpl() {
+ repeated_field_->current_size_ = index_;
+ }
void Add(Element val) {
if (index_ == capacity_) {
@@ -478,8 +487,6 @@
int index_;
int capacity_;
Element* buffer_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FastAdderImpl);
};
// FastAdder is a wrapper for adding fields. The specialization above handles
@@ -488,11 +495,12 @@
class FastAdderImpl<I, false> {
public:
explicit FastAdderImpl(RepeatedField* rf) : repeated_field_(rf) {}
+ FastAdderImpl(const FastAdderImpl&) = delete;
+ FastAdderImpl& operator=(const FastAdderImpl&) = delete;
void Add(const Element& val) { repeated_field_->Add(val); }
private:
RepeatedField* repeated_field_;
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FastAdderImpl);
};
using FastAdder = FastAdderImpl<>;
@@ -616,13 +624,13 @@
template <typename Element>
inline void RepeatedField<Element>::AddAlreadyReserved(const Element& value) {
GOOGLE_DCHECK_LT(current_size_, total_size_);
- elements()[current_size_++] = value;
+ elements()[ExchangeCurrentSize(current_size_ + 1)] = value;
}
template <typename Element>
inline Element* RepeatedField<Element>::AddAlreadyReserved() {
GOOGLE_DCHECK_LT(current_size_, total_size_);
- return &elements()[current_size_++];
+ return &elements()[ExchangeCurrentSize(current_size_ + 1)];
}
template <typename Element>
@@ -633,9 +641,7 @@
// total_size_ == 0. In this case the return pointer points to a zero size
// array (n == 0). Hence we can just use unsafe_elements(), because the user
// cannot dereference the pointer anyway.
- Element* ret = unsafe_elements() + current_size_;
- current_size_ += elements;
- return ret;
+ return unsafe_elements() + ExchangeCurrentSize(current_size_ + elements);
}
template <typename Element>
@@ -643,9 +649,11 @@
GOOGLE_DCHECK_GE(new_size, 0);
if (new_size > current_size_) {
Reserve(new_size);
- std::fill(&elements()[current_size_], &elements()[new_size], value);
+ std::fill(&elements()[ExchangeCurrentSize(new_size)], &elements()[new_size],
+ value);
+ } else {
+ ExchangeCurrentSize(new_size);
}
- current_size_ = new_size;
}
template <typename Element>
@@ -685,46 +693,41 @@
template <typename Element>
inline void RepeatedField<Element>::Add(const Element& value) {
- uint32_t size = current_size_;
- if (static_cast<int>(size) == total_size_) {
+ if (current_size_ == total_size_) {
// value could reference an element of the array. Reserving new space will
// invalidate the reference. So we must make a copy first.
auto tmp = value;
Reserve(total_size_ + 1);
- elements()[size] = std::move(tmp);
+ elements()[ExchangeCurrentSize(current_size_ + 1)] = std::move(tmp);
} else {
- elements()[size] = value;
+ elements()[ExchangeCurrentSize(current_size_ + 1)] = value;
}
- current_size_ = size + 1;
}
template <typename Element>
inline Element* RepeatedField<Element>::Add() {
- uint32_t size = current_size_;
- if (static_cast<int>(size) == total_size_) Reserve(total_size_ + 1);
- auto ptr = &elements()[size];
- current_size_ = size + 1;
- return ptr;
+ if (current_size_ == total_size_) Reserve(total_size_ + 1);
+ return &elements()[ExchangeCurrentSize(current_size_ + 1)];
}
template <typename Element>
template <typename Iter>
inline void RepeatedField<Element>::Add(Iter begin, Iter end) {
- int reserve = internal::CalculateReserve(begin, end);
- if (reserve != -1) {
- if (reserve == 0) {
- return;
- }
+ if (std::is_base_of<
+ std::forward_iterator_tag,
+ typename std::iterator_traits<Iter>::iterator_category>::value) {
+ int additional = static_cast<int>(std::distance(begin, end));
+ if (additional == 0) return;
- Reserve(reserve + size());
+ int new_size = current_size_ + additional;
+ Reserve(new_size);
// TODO(ckennelly): The compiler loses track of the buffer freshly
// allocated by Reserve() by the time we call elements, so it cannot
// guarantee that elements does not alias [begin(), end()).
//
// If restrict is available, annotating the pointer obtained from elements()
// causes this to lower to memcpy instead of memmove.
- std::copy(begin, end, elements() + size());
- current_size_ = reserve + size();
+ std::copy(begin, end, elements() + ExchangeCurrentSize(new_size));
} else {
FastAdder fast_adder(this);
for (; begin != end; ++begin) fast_adder.Add(*begin);
@@ -734,7 +737,7 @@
template <typename Element>
inline void RepeatedField<Element>::RemoveLast() {
GOOGLE_DCHECK_GT(current_size_, 0);
- current_size_--;
+ ExchangeCurrentSize(current_size_ - 1);
}
template <typename Element>
@@ -759,7 +762,7 @@
template <typename Element>
inline void RepeatedField<Element>::Clear() {
- current_size_ = 0;
+ ExchangeCurrentSize(0);
}
template <typename Element>
@@ -980,7 +983,7 @@
inline void RepeatedField<Element>::Truncate(int new_size) {
GOOGLE_DCHECK_LE(new_size, current_size_);
if (current_size_ > 0) {
- current_size_ = new_size;
+ ExchangeCurrentSize(new_size);
}
}
@@ -1214,6 +1217,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_REPEATED_FIELD_H__
diff --git a/src/google/protobuf/repeated_field_reflection_unittest.cc b/src/google/protobuf/repeated_field_reflection_unittest.cc
index 25e8200..ccecdd0 100644
--- a/src/google/protobuf/repeated_field_reflection_unittest.cc
+++ b/src/google/protobuf/repeated_field_reflection_unittest.cc
@@ -33,25 +33,26 @@
// Test reflection methods for aggregate access to Repeated[Ptr]Fields.
// This test proto2 methods on a proto2 layout.
-#include <google/protobuf/stubs/casts.h>
-#include <google/protobuf/unittest.pb.h>
-#include <google/protobuf/dynamic_message.h>
-#include <google/protobuf/reflection.h>
+#include "google/protobuf/unittest.pb.h"
+#include "google/protobuf/dynamic_message.h"
+#include "google/protobuf/reflection.h"
#include <gtest/gtest.h>
-#include <google/protobuf/test_util.h>
+#include "absl/base/casts.h"
+#include "google/protobuf/port.h"
+#include "google/protobuf/test_util.h"
namespace google {
namespace protobuf {
+namespace {
+using internal::DownCast;
using unittest::ForeignMessage;
using unittest::TestAllExtensions;
using unittest::TestAllTypes;
-namespace {
-
static int Func(int i, int j) { return i * j; }
-static std::string StrFunc(int i, int j) { return StrCat(Func(i, 4)); }
+static std::string StrFunc(int i, int j) { return absl::StrCat(Func(i, 4)); }
TEST(RepeatedFieldReflectionTest, RegularFields) {
TestAllTypes message;
@@ -113,7 +114,7 @@
EXPECT_EQ(rf_double.Get(i), Func(i, 2));
EXPECT_EQ(rpf_string.Get(i), StrFunc(i, 5));
EXPECT_EQ(rpf_foreign_message.Get(i).c(), Func(i, 6));
- EXPECT_EQ(down_cast<const ForeignMessage*>(&rpf_message.Get(i))->c(),
+ EXPECT_EQ(DownCast<const ForeignMessage*>(&rpf_message.Get(i))->c(),
Func(i, 6));
// Check gets through mutable objects.
@@ -121,7 +122,7 @@
EXPECT_EQ(mrf_double->Get(i), Func(i, 2));
EXPECT_EQ(mrpf_string->Get(i), StrFunc(i, 5));
EXPECT_EQ(mrpf_foreign_message->Get(i).c(), Func(i, 6));
- EXPECT_EQ(down_cast<const ForeignMessage*>(&mrpf_message->Get(i))->c(),
+ EXPECT_EQ(DownCast<const ForeignMessage*>(&mrpf_message->Get(i))->c(),
Func(i, 6));
// Check sets through mutable objects.
@@ -133,7 +134,7 @@
EXPECT_EQ(message.repeated_double(i), Func(i, -2));
EXPECT_EQ(message.repeated_string(i), StrFunc(i, -5));
EXPECT_EQ(message.repeated_foreign_message(i).c(), Func(i, -6));
- down_cast<ForeignMessage*>(mrpf_message->Mutable(i))->set_c(Func(i, 7));
+ DownCast<ForeignMessage*>(mrpf_message->Mutable(i))->set_c(Func(i, 7));
EXPECT_EQ(message.repeated_foreign_message(i).c(), Func(i, 7));
}
@@ -293,7 +294,7 @@
ForeignMessage scratch_space;
EXPECT_EQ(rf_foreign_message.Get(i, &scratch_space).c(), Func(i, 6));
EXPECT_EQ(
- down_cast<const ForeignMessage&>(rf_message.Get(i, &scratch_space)).c(),
+ DownCast<const ForeignMessage&>(rf_message.Get(i, &scratch_space)).c(),
Func(i, 6));
// Check gets through mutable objects.
@@ -302,8 +303,7 @@
EXPECT_EQ(mrf_string.Get(i), StrFunc(i, 5));
EXPECT_EQ(mrf_foreign_message.Get(i, &scratch_space).c(), Func(i, 6));
EXPECT_EQ(
- down_cast<const ForeignMessage&>(mrf_message.Get(i, &scratch_space))
- .c(),
+ DownCast<const ForeignMessage&>(mrf_message.Get(i, &scratch_space)).c(),
Func(i, 6));
// Check sets through mutable objects.
diff --git a/src/google/protobuf/repeated_field_unittest.cc b/src/google/protobuf/repeated_field_unittest.cc
index d8a82bf..3baf6f2 100644
--- a/src/google/protobuf/repeated_field_unittest.cc
+++ b/src/google/protobuf/repeated_field_unittest.cc
@@ -35,7 +35,7 @@
// TODO(kenton): Improve this unittest to bring it up to the standards of
// other proto2 unittests.
-#include <google/protobuf/repeated_field.h>
+#include "google/protobuf/repeated_field.h"
#include <algorithm>
#include <cstdlib>
@@ -47,17 +47,18 @@
#include <type_traits>
#include <vector>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/unittest.pb.h>
-#include <google/protobuf/stubs/strutil.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/unittest.pb.h"
+#include "google/protobuf/stubs/strutil.h"
#include <gmock/gmock.h>
-#include <google/protobuf/testing/googletest.h>
#include <gtest/gtest.h>
-#include <google/protobuf/stubs/stl_util.h>
+#include "absl/numeric/bits.h"
+#include "absl/strings/str_cat.h"
+#include "google/protobuf/stubs/stl_util.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -179,7 +180,7 @@
// Must be `>= 16`, as expected by the Arena.
ASSERT_GE(last_alloc, 16);
// Must be of a power of two.
- size_t log2 = Bits::Log2FloorNonZero64(last_alloc);
+ size_t log2 = absl::bit_width(last_alloc) - 1;
ASSERT_EQ((1 << log2), last_alloc);
}
@@ -305,6 +306,60 @@
}
}
+template <int kSize>
+void TestMemswap() {
+ SCOPED_TRACE(kSize);
+
+ const auto a_char = [](int i) -> char { return (i % ('z' - 'a')) + 'a'; };
+ const auto b_char = [](int i) -> char { return (i % ('Z' - 'A')) + 'A'; };
+ std::string a, b;
+ for (int i = 0; i < kSize; ++i) {
+ a += a_char(i);
+ b += b_char(i);
+ }
+ // We will not swap these.
+ a += "+";
+ b += "-";
+
+ std::string expected_a = b, expected_b = a;
+ expected_a.back() = '+';
+ expected_b.back() = '-';
+
+ internal::memswap<kSize>(&a[0], &b[0]);
+
+ // ODR use the functions in a way that forces the linker to keep them. That
+ // way we can see their generated code.
+ volatile auto odr_use_for_asm_dump = &internal::memswap<kSize>;
+ (void)odr_use_for_asm_dump;
+
+ EXPECT_EQ(expected_a, a);
+ EXPECT_EQ(expected_b, b);
+}
+
+TEST(Memswap, VerifyWithSmallAndLargeSizes) {
+ // Arbitrary sizes
+ TestMemswap<0>();
+ TestMemswap<1>();
+ TestMemswap<10>();
+ TestMemswap<100>();
+ TestMemswap<1000>();
+ TestMemswap<10000>();
+ TestMemswap<100000>();
+ TestMemswap<1000000>();
+
+ // Pointer aligned sizes
+ TestMemswap<sizeof(void*) * 1>();
+ TestMemswap<sizeof(void*) * 7>();
+ TestMemswap<sizeof(void*) * 17>();
+ TestMemswap<sizeof(void*) * 27>();
+
+ // Test also just the block size and no leftover.
+ TestMemswap<64 * 1>();
+ TestMemswap<64 * 2>();
+ TestMemswap<64 * 3>();
+ TestMemswap<64 * 4>();
+}
+
// Determines how much space was reserved by the given field by adding elements
// to it until it re-allocates its space.
static int ReservedSpace(RepeatedField<int>* field) {
@@ -374,14 +429,14 @@
TEST(RepeatedField, ReserveLowerClamp) {
int clamped_value = internal::CalculateReserveSize<bool, sizeof(void*)>(0, 1);
- EXPECT_GE(clamped_value, 8 / sizeof(bool));
+ EXPECT_GE(clamped_value, sizeof(void*) / sizeof(bool));
EXPECT_EQ((internal::RepeatedFieldLowerClampLimit<bool, sizeof(void*)>()),
clamped_value);
// EXPECT_EQ(clamped_value, (internal::CalculateReserveSize<bool,
// sizeof(void*)>( clamped_value, 2)));
clamped_value = internal::CalculateReserveSize<int, sizeof(void*)>(0, 1);
- EXPECT_GE(clamped_value, 8 / sizeof(int));
+ EXPECT_GE(clamped_value, sizeof(void*) / sizeof(int));
EXPECT_EQ((internal::RepeatedFieldLowerClampLimit<int, sizeof(void*)>()),
clamped_value);
// EXPECT_EQ(clamped_value, (internal::CalculateReserveSize<int,
@@ -588,14 +643,16 @@
// an input iterator.
TEST(RepeatedField, AddRange5) {
RepeatedField<int> me;
+ me.Add(0);
std::stringstream ss;
ss << 1 << ' ' << 2;
me.Add(std::istream_iterator<int>(ss), std::istream_iterator<int>());
- ASSERT_EQ(me.size(), 2);
- ASSERT_EQ(me.Get(0), 1);
- ASSERT_EQ(me.Get(1), 2);
+ ASSERT_EQ(me.size(), 3);
+ ASSERT_EQ(me.Get(0), 0);
+ ASSERT_EQ(me.Get(1), 1);
+ ASSERT_EQ(me.Get(2), 2);
}
TEST(RepeatedField, AddAndAssignRanges) {
@@ -1258,7 +1315,7 @@
field.Clear();
EXPECT_EQ(field.ClearedCount(), 2);
-#ifndef PROTOBUF_FUTURE_BREAKING_CHANGES
+#ifndef PROTOBUF_FUTURE_REMOVE_CLEARED_API
EXPECT_EQ(field.ReleaseCleared(), original); // Take ownership again.
EXPECT_EQ(field.ClearedCount(), 1);
EXPECT_NE(field.Add(), original);
@@ -1270,7 +1327,7 @@
EXPECT_EQ(field.ClearedCount(), 1);
EXPECT_EQ(field.Add(), original);
EXPECT_EQ(field.ClearedCount(), 0);
-#endif // !PROTOBUF_FUTURE_BREAKING_CHANGES
+#endif // !PROTOBUF_FUTURE_REMOVE_CLEARED_API
}
// Test all code paths in AddAllocated().
@@ -2277,11 +2334,11 @@
TestAllTypes goldenproto;
for (int i = 0; i < 10; ++i) {
std::string* new_data = new std::string;
- *new_data = "name-" + StrCat(i);
+ *new_data = "name-" + absl::StrCat(i);
data.push_back(new_data);
new_data = goldenproto.add_repeated_string();
- *new_data = "name-" + StrCat(i);
+ *new_data = "name-" + absl::StrCat(i);
}
TestAllTypes testproto;
std::copy(data.begin(), data.end(),
@@ -2314,7 +2371,7 @@
auto* goldenproto = Arena::CreateMessage<TestAllTypes>(&arena);
for (int i = 0; i < 10; ++i) {
auto* new_data = goldenproto->add_repeated_string();
- *new_data = "name-" + StrCat(i);
+ *new_data = "name-" + absl::StrCat(i);
data.push_back(new_data);
}
auto* testproto = Arena::CreateMessage<TestAllTypes>(&arena);
@@ -2360,4 +2417,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/repeated_ptr_field.cc b/src/google/protobuf/repeated_ptr_field.cc
index 8e86727..1661474 100644
--- a/src/google/protobuf/repeated_ptr_field.cc
+++ b/src/google/protobuf/repeated_ptr_field.cc
@@ -34,14 +34,14 @@
#include <algorithm>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/implicit_weak_message.h>
-#include <google/protobuf/repeated_field.h>
-#include <google/protobuf/port.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/implicit_weak_message.h"
+#include "google/protobuf/repeated_field.h"
+#include "google/protobuf/port.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -116,7 +116,7 @@
InternalExtend(1); // Equivalent to "Reserve(total_size_ + 1)"
}
++rep_->allocated_size;
- rep_->elements[current_size_++] = obj;
+ rep_->elements[ExchangeCurrentSize(current_size_ + 1)] = obj;
return obj;
}
@@ -125,13 +125,14 @@
// Close up a gap of "num" elements starting at offset "start".
for (int i = start + num; i < rep_->allocated_size; ++i)
rep_->elements[i - num] = rep_->elements[i];
- current_size_ -= num;
+ ExchangeCurrentSize(current_size_ - num);
rep_->allocated_size -= num;
}
MessageLite* RepeatedPtrFieldBase::AddWeak(const MessageLite* prototype) {
if (rep_ != nullptr && current_size_ < rep_->allocated_size) {
- return reinterpret_cast<MessageLite*>(rep_->elements[current_size_++]);
+ return reinterpret_cast<MessageLite*>(
+ rep_->elements[ExchangeCurrentSize(current_size_ + 1)]);
}
if (!rep_ || rep_->allocated_size == total_size_) {
Reserve(total_size_ + 1);
@@ -140,7 +141,7 @@
MessageLite* result = prototype
? prototype->New(arena_)
: Arena::CreateMessage<ImplicitWeakMessage>(arena_);
- rep_->elements[current_size_++] = result;
+ rep_->elements[ExchangeCurrentSize(current_size_ + 1)] = result;
return result;
}
@@ -149,4 +150,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/repeated_ptr_field.h b/src/google/protobuf/repeated_ptr_field.h
index 401230b..706a005 100644
--- a/src/google/protobuf/repeated_ptr_field.h
+++ b/src/google/protobuf/repeated_ptr_field.h
@@ -58,15 +58,16 @@
#include <string>
#include <type_traits>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/arena.h>
-#include <google/protobuf/port.h>
-#include <google/protobuf/message_lite.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/arena.h"
+#include "google/protobuf/port.h"
+#include "google/protobuf/message_lite.h"
+#include "google/protobuf/port.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
#ifdef SWIG
#error "You cannot SWIG proto headers"
@@ -210,7 +211,8 @@
typename TypeHandler::Type* Add(
const typename TypeHandler::Type* prototype = nullptr) {
if (rep_ != nullptr && current_size_ < rep_->allocated_size) {
- return cast<TypeHandler>(rep_->elements[current_size_++]);
+ return cast<TypeHandler>(
+ rep_->elements[ExchangeCurrentSize(current_size_ + 1)]);
}
typename TypeHandler::Type* result =
TypeHandler::NewFromPrototype(prototype, arena_);
@@ -223,7 +225,9 @@
typename std::enable_if<TypeHandler::Movable::value>::type* = nullptr>
inline void Add(typename TypeHandler::Type&& value) {
if (rep_ != nullptr && current_size_ < rep_->allocated_size) {
- *cast<TypeHandler>(rep_->elements[current_size_++]) = std::move(value);
+ *cast<TypeHandler>(
+ rep_->elements[ExchangeCurrentSize(current_size_ + 1)]) =
+ std::move(value);
return;
}
if (!rep_ || rep_->allocated_size == total_size_) {
@@ -232,7 +236,7 @@
++rep_->allocated_size;
typename TypeHandler::Type* result =
TypeHandler::New(arena_, std::move(value));
- rep_->elements[current_size_++] = result;
+ rep_->elements[ExchangeCurrentSize(current_size_ + 1)] = result;
}
template <typename TypeHandler>
@@ -283,12 +287,7 @@
const int n = current_size_;
GOOGLE_DCHECK_GE(n, 0);
if (n > 0) {
- void* const* elements = rep_->elements;
- int i = 0;
- do {
- TypeHandler::Clear(cast<TypeHandler>(elements[i++]));
- } while (i < n);
- current_size_ = 0;
+ ClearNonEmpty<TypeHandler>();
}
}
@@ -317,11 +316,40 @@
std::tie(arena_, current_size_, total_size_, rep_) = temp;
}
+ // Prepares the container for adding elements via `AddAllocatedForParse`.
+ // It ensures some invariants to avoid checking then in the Add loop:
+ // - rep_ is not null.
+ // - there are no preallocated elements.
+ // Returns true if the invariants hold and `AddAllocatedForParse` can be
+ // used.
+ bool PrepareForParse() {
+ if (current_size_ == total_size_) {
+ InternalExtend(1);
+ }
+ return rep_->allocated_size == current_size_;
+ }
+
+ // Similar to `AddAllocated` but faster.
+ // Can only be invoked after a call to `PrepareForParse` that returned `true`,
+ // or other calls to `AddAllocatedForParse`.
+ template <typename TypeHandler>
+ void AddAllocatedForParse(typename TypeHandler::Type* value) {
+ PROTOBUF_ASSUME(rep_ != nullptr);
+ PROTOBUF_ASSUME(current_size_ == rep_->allocated_size);
+ if (current_size_ == total_size_) {
+ // The array is completely full with no cleared objects, so grow it.
+ InternalExtend(1);
+ }
+ rep_->elements[current_size_++] = value;
+ ++rep_->allocated_size;
+ }
+
protected:
template <typename TypeHandler>
void RemoveLast() {
GOOGLE_DCHECK_GT(current_size_, 0);
- TypeHandler::Clear(cast<TypeHandler>(rep_->elements[--current_size_]));
+ ExchangeCurrentSize(current_size_ - 1);
+ TypeHandler::Clear(cast<TypeHandler>(rep_->elements[current_size_]));
}
template <typename TypeHandler>
@@ -403,7 +431,8 @@
template <typename TypeHandler>
typename TypeHandler::Type* AddFromCleared() {
if (rep_ != nullptr && current_size_ < rep_->allocated_size) {
- return cast<TypeHandler>(rep_->elements[current_size_++]);
+ return cast<TypeHandler>(
+ rep_->elements[ExchangeCurrentSize(current_size_ + 1)]);
} else {
return nullptr;
}
@@ -439,7 +468,7 @@
++rep_->allocated_size;
}
- rep_->elements[current_size_++] = value;
+ rep_->elements[ExchangeCurrentSize(current_size_ + 1)] = value;
}
template <typename TypeHandler>
@@ -454,8 +483,9 @@
template <typename TypeHandler>
typename TypeHandler::Type* UnsafeArenaReleaseLast() {
GOOGLE_DCHECK_GT(current_size_, 0);
+ ExchangeCurrentSize(current_size_ - 1);
typename TypeHandler::Type* result =
- cast<TypeHandler>(rep_->elements[--current_size_]);
+ cast<TypeHandler>(rep_->elements[current_size_]);
--rep_->allocated_size;
if (current_size_ < rep_->allocated_size) {
// There are cleared elements on the end; replace the removed element
@@ -508,8 +538,7 @@
// allocated list.
elems[rep_->allocated_size] = elems[current_size_];
}
- elems[current_size_] = value;
- current_size_ = current_size_ + 1;
+ elems[ExchangeCurrentSize(current_size_ + 1)] = value;
rep_->allocated_size = rep_->allocated_size + 1;
} else {
AddAllocatedSlowWithCopy<TypeHandler>(value, element_arena, arena);
@@ -531,8 +560,7 @@
// allocated list.
elems[rep_->allocated_size] = elems[current_size_];
}
- elems[current_size_] = value;
- current_size_ = current_size_ + 1;
+ elems[ExchangeCurrentSize(current_size_ + 1)] = value;
++rep_->allocated_size;
} else {
UnsafeArenaAddAllocated<TypeHandler>(value);
@@ -612,7 +640,16 @@
temp.Destroy<TypeHandler>(); // Frees rep_ if `other` had no arena.
}
- inline Arena* GetArena() const { return arena_; }
+ // Gets the Arena on which this RepeatedPtrField stores its elements.
+ // Message-owned arenas are not exposed by this method, which will return
+ // nullptr for messages owned by MOAs.
+ inline Arena* GetArena() const {
+ Arena* arena = GetOwningArena();
+ if (arena == nullptr || arena->InternalIsMessageOwnedArena()) {
+ return nullptr;
+ }
+ return arena;
+ }
protected:
inline Arena* GetOwningArena() const { return arena_; }
@@ -635,6 +672,16 @@
Arena* arena_;
int current_size_;
int total_size_;
+
+ // Replaces current_size_ with new_size and returns the previous value of
+ // current_size_. This function is intended to be the only place where
+ // current_size_ is modified.
+ inline int ExchangeCurrentSize(int new_size) {
+ int prev_size = current_size_;
+ current_size_ = new_size;
+ return prev_size;
+ }
+
struct Rep {
int allocated_size;
// Here we declare a huge array as a way of approximating C's "flexible
@@ -654,12 +701,26 @@
return reinterpret_cast<const typename TypeHandler::Type*>(element);
}
+ // Out-of-line helper routine for Clear() once the inlined check has
+ // determined the container is non-empty
+ template <typename TypeHandler>
+ PROTOBUF_NOINLINE void ClearNonEmpty() {
+ const int n = current_size_;
+ void* const* elements = rep_->elements;
+ int i = 0;
+ GOOGLE_DCHECK_GT(n,
+ 0); // do/while loop to avoid initial test because we know n > 0
+ do {
+ TypeHandler::Clear(cast<TypeHandler>(elements[i++]));
+ } while (i < n);
+ ExchangeCurrentSize(0);
+ }
+
// Non-templated inner function to avoid code duplication. Takes a function
// pointer to the type-specific (templated) inner allocate/merge loop.
- void MergeFromInternal(const RepeatedPtrFieldBase& other,
- void (RepeatedPtrFieldBase::*inner_loop)(void**,
- void**, int,
- int)) {
+ PROTOBUF_NOINLINE void MergeFromInternal(
+ const RepeatedPtrFieldBase& other,
+ void (RepeatedPtrFieldBase::*inner_loop)(void**, void**, int, int)) {
// Note: wrapper has already guaranteed that other.rep_ != nullptr here.
int other_size = other.current_size_;
void** other_elements = other.rep_->elements;
@@ -667,7 +728,7 @@
int allocated_elems = rep_->allocated_size - current_size_;
(this->*inner_loop)(new_elements, other_elements, other_size,
allocated_elems);
- current_size_ += other_size;
+ ExchangeCurrentSize(current_size_ + other_size);
if (rep_->allocated_size < current_size_) {
rep_->allocated_size = current_size_;
}
@@ -762,7 +823,7 @@
}
}
static inline Arena* GetOwningArena(GenericType* value) {
- return Arena::GetOwningArena<Type>(value);
+ return Arena::InternalGetOwningArena(value);
}
static inline void Clear(GenericType* value) { value->Clear(); }
@@ -820,10 +881,10 @@
typedef std::string Type;
using Movable = IsMovable<Type>;
- static inline std::string* New(Arena* arena) {
+ static PROTOBUF_NOINLINE std::string* New(Arena* arena) {
return Arena::Create<std::string>(arena);
}
- static inline std::string* New(Arena* arena, std::string&& value) {
+ static PROTOBUF_NOINLINE std::string* New(Arena* arena, std::string&& value) {
return Arena::Create<std::string>(arena, std::move(value));
}
static inline std::string* NewFromPrototype(const std::string*,
@@ -1083,7 +1144,7 @@
// Gets the number of cleared objects that are currently being kept
// around for reuse.
int ClearedCount() const;
-#ifndef PROTOBUF_FUTURE_BREAKING_CHANGES
+#ifndef PROTOBUF_FUTURE_REMOVE_CLEARED_API
// Adds an element to the pool of cleared objects, passing ownership to
// the RepeatedPtrField. The element must be cleared prior to calling
// this method.
@@ -1098,7 +1159,7 @@
// This method cannot be called when the repeated field is on an arena; doing
// so will trigger a GOOGLE_DCHECK-failure.
PROTOBUF_NODISCARD Element* ReleaseCleared();
-#endif // !PROTOBUF_FUTURE_BREAKING_CHANGES
+#endif // !PROTOBUF_FUTURE_REMOVE_CLEARED_API
// Removes the element referenced by position.
//
@@ -1141,7 +1202,12 @@
void ExtractSubrangeInternal(int start, int num, Element** elements,
std::false_type);
+ void AddAllocatedForParse(Element* p) {
+ return RepeatedPtrFieldBase::AddAllocatedForParse<TypeHandler>(p);
+ }
+
friend class Arena;
+ friend class internal::TcParser;
template <typename T>
friend struct WeakRepeatedPtrField;
@@ -1270,7 +1336,7 @@
}
template <typename Element>
-inline Element* RepeatedPtrField<Element>::Add() {
+PROTOBUF_NOINLINE Element* RepeatedPtrField<Element>::Add() {
return RepeatedPtrFieldBase::Add<TypeHandler>();
}
@@ -1285,7 +1351,7 @@
if (std::is_base_of<
std::forward_iterator_tag,
typename std::iterator_traits<Iter>::iterator_category>::value) {
- int reserve = std::distance(begin, end);
+ int reserve = static_cast<int>(std::distance(begin, end));
Reserve(size() + reserve);
}
for (; begin != end; ++begin) {
@@ -1430,8 +1496,8 @@
template <typename Element>
inline typename RepeatedPtrField<Element>::iterator
RepeatedPtrField<Element>::erase(const_iterator first, const_iterator last) {
- size_type pos_offset = std::distance(cbegin(), first);
- size_type last_offset = std::distance(cbegin(), last);
+ size_type pos_offset = static_cast<size_type>(std::distance(cbegin(), first));
+ size_type last_offset = static_cast<size_type>(std::distance(cbegin(), last));
DeleteSubrange(pos_offset, last_offset - pos_offset);
return begin() + pos_offset;
}
@@ -1505,7 +1571,7 @@
return RepeatedPtrFieldBase::ClearedCount();
}
-#ifndef PROTOBUF_FUTURE_BREAKING_CHANGES
+#ifndef PROTOBUF_FUTURE_REMOVE_CLEARED_API
template <typename Element>
inline void RepeatedPtrField<Element>::AddCleared(Element* value) {
return RepeatedPtrFieldBase::AddCleared<TypeHandler>(value);
@@ -1515,7 +1581,7 @@
inline Element* RepeatedPtrField<Element>::ReleaseCleared() {
return RepeatedPtrFieldBase::ReleaseCleared<TypeHandler>();
}
-#endif // !PROTOBUF_FUTURE_BREAKING_CHANGES
+#endif // !PROTOBUF_FUTURE_REMOVE_CLEARED_API
template <typename Element>
inline void RepeatedPtrField<Element>::Reserve(int new_size) {
@@ -1965,6 +2031,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_REPEATED_PTR_FIELD_H__
diff --git a/src/google/protobuf/service.cc b/src/google/protobuf/service.cc
index 5394568..da1ae78 100644
--- a/src/google/protobuf/service.cc
+++ b/src/google/protobuf/service.cc
@@ -32,7 +32,7 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/service.h>
+#include "google/protobuf/service.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/service.h b/src/google/protobuf/service.h
index d288eb5..a512e71 100644
--- a/src/google/protobuf/service.h
+++ b/src/google/protobuf/service.h
@@ -102,15 +102,17 @@
#include <string>
-#include <google/protobuf/stubs/callback.h>
-#include <google/protobuf/stubs/common.h>
+
+#include "google/protobuf/stubs/callback.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/port.h"
#ifdef SWIG
#error "You cannot SWIG proto headers"
#endif
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -134,6 +136,8 @@
class PROTOBUF_EXPORT Service {
public:
inline Service() {}
+ Service(const Service&) = delete;
+ Service& operator=(const Service&) = delete;
virtual ~Service();
// When constructing a stub, you may pass STUB_OWNS_CHANNEL as the second
@@ -190,9 +194,6 @@
const MethodDescriptor* method) const = 0;
virtual const Message& GetResponsePrototype(
const MethodDescriptor* method) const = 0;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Service);
};
// An RpcController mediates a single method call. The primary purpose of
@@ -206,6 +207,8 @@
class PROTOBUF_EXPORT RpcController {
public:
inline RpcController() {}
+ RpcController(const RpcController&) = delete;
+ RpcController& operator=(const RpcController&) = delete;
virtual ~RpcController();
// Client-side methods ---------------------------------------------
@@ -256,9 +259,6 @@
//
// NotifyOnCancel() must be called no more than once per request.
virtual void NotifyOnCancel(Closure* callback) = 0;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RpcController);
};
// Abstract interface for an RPC channel. An RpcChannel represents a
@@ -272,6 +272,8 @@
class PROTOBUF_EXPORT RpcChannel {
public:
inline RpcChannel() {}
+ RpcChannel(const RpcChannel&) = delete;
+ RpcChannel& operator=(const RpcChannel&) = delete;
virtual ~RpcChannel();
// Call the given method of the remote service. The signature of this
@@ -282,14 +284,11 @@
virtual void CallMethod(const MethodDescriptor* method,
RpcController* controller, const Message* request,
Message* response, Closure* done) = 0;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RpcChannel);
};
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_SERVICE_H__
diff --git a/src/google/protobuf/source_context.pb.cc b/src/google/protobuf/source_context.pb.cc
index e7525e9..1959701 100644
--- a/src/google/protobuf/source_context.pb.cc
+++ b/src/google/protobuf/source_context.pb.cc
@@ -1,86 +1,110 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: google/protobuf/source_context.proto
-#include <google/protobuf/source_context.pb.h>
+#include "google/protobuf/source_context.pb.h"
#include <algorithm>
-
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/extension_set.h>
-#include <google/protobuf/wire_format_lite.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/generated_message_reflection.h>
-#include <google/protobuf/reflection_ops.h>
-#include <google/protobuf/wire_format.h>
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/extension_set.h"
+#include "google/protobuf/wire_format_lite.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/generated_message_reflection.h"
+#include "google/protobuf/reflection_ops.h"
+#include "google/protobuf/wire_format.h"
// @@protoc_insertion_point(includes)
-#include <google/protobuf/port_def.inc>
+// Must be included last.
+#include "google/protobuf/port_def.inc"
PROTOBUF_PRAGMA_INIT_SEG
-
namespace _pb = ::PROTOBUF_NAMESPACE_ID;
-namespace _pbi = _pb::internal;
-
+namespace _pbi = ::PROTOBUF_NAMESPACE_ID::internal;
PROTOBUF_NAMESPACE_OPEN
PROTOBUF_CONSTEXPR SourceContext::SourceContext(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_.file_name_)*/{&::_pbi::fixed_address_empty_string, ::_pbi::ConstantInitialized{}}
, /*decltype(_impl_._cached_size_)*/{}} {}
struct SourceContextDefaultTypeInternal {
- PROTOBUF_CONSTEXPR SourceContextDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR SourceContextDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~SourceContextDefaultTypeInternal() {}
union {
SourceContext _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 SourceContextDefaultTypeInternal _SourceContext_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 SourceContextDefaultTypeInternal _SourceContext_default_instance_;
PROTOBUF_NAMESPACE_CLOSE
static ::_pb::Metadata file_level_metadata_google_2fprotobuf_2fsource_5fcontext_2eproto[1];
-static constexpr ::_pb::EnumDescriptor const** file_level_enum_descriptors_google_2fprotobuf_2fsource_5fcontext_2eproto = nullptr;
-static constexpr ::_pb::ServiceDescriptor const** file_level_service_descriptors_google_2fprotobuf_2fsource_5fcontext_2eproto = nullptr;
-
-const uint32_t TableStruct_google_2fprotobuf_2fsource_5fcontext_2eproto::offsets[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
- ~0u, // no _has_bits_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::SourceContext, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::SourceContext, _impl_.file_name_),
+static constexpr const ::_pb::EnumDescriptor**
+ file_level_enum_descriptors_google_2fprotobuf_2fsource_5fcontext_2eproto = nullptr;
+static constexpr const ::_pb::ServiceDescriptor**
+ file_level_service_descriptors_google_2fprotobuf_2fsource_5fcontext_2eproto = nullptr;
+const uint32_t TableStruct_google_2fprotobuf_2fsource_5fcontext_2eproto::offsets[] PROTOBUF_SECTION_VARIABLE(
+ protodesc_cold) = {
+ ~0u, // no _has_bits_
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::SourceContext, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::SourceContext, _impl_.file_name_),
};
-static const ::_pbi::MigrationSchema schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
- { 0, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::SourceContext)},
+
+static const ::_pbi::MigrationSchema
+ schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
+ { 0, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::SourceContext)},
};
static const ::_pb::Message* const file_default_instances[] = {
- &::PROTOBUF_NAMESPACE_ID::_SourceContext_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_SourceContext_default_instance_._instance,
};
-
-const char descriptor_table_protodef_google_2fprotobuf_2fsource_5fcontext_2eproto[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) =
- "\n$google/protobuf/source_context.proto\022\017"
- "google.protobuf\"\"\n\rSourceContext\022\021\n\tfile"
- "_name\030\001 \001(\tB\212\001\n\023com.google.protobufB\022Sou"
- "rceContextProtoP\001Z6google.golang.org/pro"
- "tobuf/types/known/sourcecontextpb\242\002\003GPB\252"
- "\002\036Google.Protobuf.WellKnownTypesb\006proto3"
- ;
-static ::_pbi::once_flag descriptor_table_google_2fprotobuf_2fsource_5fcontext_2eproto_once;
+const char descriptor_table_protodef_google_2fprotobuf_2fsource_5fcontext_2eproto[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
+ "\n$google/protobuf/source_context.proto\022\017"
+ "google.protobuf\"\"\n\rSourceContext\022\021\n\tfile"
+ "_name\030\001 \001(\tB\212\001\n\023com.google.protobufB\022Sou"
+ "rceContextProtoP\001Z6google.golang.org/pro"
+ "tobuf/types/known/sourcecontextpb\242\002\003GPB\252"
+ "\002\036Google.Protobuf.WellKnownTypesb\006proto3"
+};
+static ::absl::once_flag descriptor_table_google_2fprotobuf_2fsource_5fcontext_2eproto_once;
const ::_pbi::DescriptorTable descriptor_table_google_2fprotobuf_2fsource_5fcontext_2eproto = {
- false, false, 240, descriptor_table_protodef_google_2fprotobuf_2fsource_5fcontext_2eproto,
+ false,
+ false,
+ 240,
+ descriptor_table_protodef_google_2fprotobuf_2fsource_5fcontext_2eproto,
"google/protobuf/source_context.proto",
- &descriptor_table_google_2fprotobuf_2fsource_5fcontext_2eproto_once, nullptr, 0, 1,
- schemas, file_default_instances, TableStruct_google_2fprotobuf_2fsource_5fcontext_2eproto::offsets,
- file_level_metadata_google_2fprotobuf_2fsource_5fcontext_2eproto, file_level_enum_descriptors_google_2fprotobuf_2fsource_5fcontext_2eproto,
+ &descriptor_table_google_2fprotobuf_2fsource_5fcontext_2eproto_once,
+ nullptr,
+ 0,
+ 1,
+ schemas,
+ file_default_instances,
+ TableStruct_google_2fprotobuf_2fsource_5fcontext_2eproto::offsets,
+ file_level_metadata_google_2fprotobuf_2fsource_5fcontext_2eproto,
+ file_level_enum_descriptors_google_2fprotobuf_2fsource_5fcontext_2eproto,
file_level_service_descriptors_google_2fprotobuf_2fsource_5fcontext_2eproto,
};
+
+// This function exists to be marked as weak.
+// It can significantly speed up compilation by breaking up LLVM's SCC
+// in the .pb.cc translation units. Large translation units see a
+// reduction of more than 35% of walltime for optimized builds. Without
+// the weak attribute all the messages in the file, including all the
+// vtables and everything they use become part of the same SCC through
+// a cycle like:
+// GetMetadata -> descriptor table -> default instances ->
+// vtables -> GetMetadata
+// By adding a weak function here we break the connection from the
+// individual vtables back into the descriptor table.
PROTOBUF_ATTRIBUTE_WEAK const ::_pbi::DescriptorTable* descriptor_table_google_2fprotobuf_2fsource_5fcontext_2eproto_getter() {
return &descriptor_table_google_2fprotobuf_2fsource_5fcontext_2eproto;
}
-
// Force running AddDescriptors() at dynamic initialization time.
-PROTOBUF_ATTRIBUTE_INIT_PRIORITY2 static ::_pbi::AddDescriptorsRunner dynamic_init_dummy_google_2fprotobuf_2fsource_5fcontext_2eproto(&descriptor_table_google_2fprotobuf_2fsource_5fcontext_2eproto);
+PROTOBUF_ATTRIBUTE_INIT_PRIORITY2
+static ::_pbi::AddDescriptorsRunner dynamic_init_dummy_google_2fprotobuf_2fsource_5fcontext_2eproto(&descriptor_table_google_2fprotobuf_2fsource_5fcontext_2eproto);
PROTOBUF_NAMESPACE_OPEN
-
// ===================================================================
class SourceContext::_Internal {
@@ -283,7 +307,6 @@
&descriptor_table_google_2fprotobuf_2fsource_5fcontext_2eproto_getter, &descriptor_table_google_2fprotobuf_2fsource_5fcontext_2eproto_once,
file_level_metadata_google_2fprotobuf_2fsource_5fcontext_2eproto[0]);
}
-
// @@protoc_insertion_point(namespace_scope)
PROTOBUF_NAMESPACE_CLOSE
PROTOBUF_NAMESPACE_OPEN
@@ -292,6 +315,5 @@
return Arena::CreateMessageInternal< ::PROTOBUF_NAMESPACE_ID::SourceContext >(arena);
}
PROTOBUF_NAMESPACE_CLOSE
-
// @@protoc_insertion_point(global_scope)
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/source_context.pb.h b/src/google/protobuf/source_context.pb.h
index ea9031c..8f1aeff 100644
--- a/src/google/protobuf/source_context.pb.h
+++ b/src/google/protobuf/source_context.pb.h
@@ -1,38 +1,43 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: google/protobuf/source_context.proto
-#ifndef GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fsource_5fcontext_2eproto
-#define GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fsource_5fcontext_2eproto
+#ifndef GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fsource_5fcontext_2eproto_2epb_2eh
+#define GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fsource_5fcontext_2eproto_2epb_2eh
#include <limits>
#include <string>
+#include <type_traits>
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
#if PROTOBUF_VERSION < 3021000
-#error This file was generated by a newer version of protoc which is
-#error incompatible with your Protocol Buffer headers. Please update
-#error your headers.
-#endif
-#if 3021007 < PROTOBUF_MIN_PROTOC_VERSION
-#error This file was generated by an older version of protoc which is
-#error incompatible with your Protocol Buffer headers. Please
-#error regenerate this file with a newer version of protoc.
-#endif
+#error "This file was generated by a newer version of protoc which is"
+#error "incompatible with your Protocol Buffer headers. Please update"
+#error "your headers."
+#endif // PROTOBUF_VERSION
-#include <google/protobuf/port_undef.inc>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/arena.h>
-#include <google/protobuf/arenastring.h>
-#include <google/protobuf/generated_message_util.h>
-#include <google/protobuf/metadata_lite.h>
-#include <google/protobuf/generated_message_reflection.h>
-#include <google/protobuf/message.h>
-#include <google/protobuf/repeated_field.h> // IWYU pragma: export
-#include <google/protobuf/extension_set.h> // IWYU pragma: export
-#include <google/protobuf/unknown_field_set.h>
+#if 3021007 < PROTOBUF_MIN_PROTOC_VERSION
+#error "This file was generated by an older version of protoc which is"
+#error "incompatible with your Protocol Buffer headers. Please"
+#error "regenerate this file with a newer version of protoc."
+#endif // PROTOBUF_MIN_PROTOC_VERSION
+#include "google/protobuf/port_undef.inc"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/arena.h"
+#include "google/protobuf/arenastring.h"
+#include "google/protobuf/generated_message_util.h"
+#include "google/protobuf/metadata_lite.h"
+#include "google/protobuf/generated_message_reflection.h"
+#include "google/protobuf/message.h"
+#include "google/protobuf/repeated_field.h" // IWYU pragma: export
+#include "google/protobuf/extension_set.h" // IWYU pragma: export
+#include "google/protobuf/unknown_field_set.h"
// @@protoc_insertion_point(includes)
-#include <google/protobuf/port_def.inc>
+
+// Must be included last.
+#include "google/protobuf/port_def.inc"
+
#define PROTOBUF_INTERNAL_EXPORT_google_2fprotobuf_2fsource_5fcontext_2eproto PROTOBUF_EXPORT
+
PROTOBUF_NAMESPACE_OPEN
namespace internal {
class AnyMetadata;
@@ -43,19 +48,23 @@
struct PROTOBUF_EXPORT TableStruct_google_2fprotobuf_2fsource_5fcontext_2eproto {
static const uint32_t offsets[];
};
-PROTOBUF_EXPORT extern const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_google_2fprotobuf_2fsource_5fcontext_2eproto;
+PROTOBUF_EXPORT extern const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable
+ descriptor_table_google_2fprotobuf_2fsource_5fcontext_2eproto;
PROTOBUF_NAMESPACE_OPEN
class SourceContext;
struct SourceContextDefaultTypeInternal;
PROTOBUF_EXPORT extern SourceContextDefaultTypeInternal _SourceContext_default_instance_;
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::SourceContext* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::SourceContext>(Arena*);
PROTOBUF_NAMESPACE_CLOSE
-PROTOBUF_NAMESPACE_OPEN
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::SourceContext* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::SourceContext>(Arena*);
-PROTOBUF_NAMESPACE_CLOSE
+
PROTOBUF_NAMESPACE_OPEN
// ===================================================================
+
+// -------------------------------------------------------------------
+
class PROTOBUF_EXPORT SourceContext final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.SourceContext) */ {
public:
@@ -159,7 +168,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.SourceContext";
}
protected:
@@ -210,12 +219,17 @@
// ===================================================================
+
+
// ===================================================================
+
#ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wstrict-aliasing"
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wstrict-aliasing"
#endif // __GNUC__
+// -------------------------------------------------------------------
+
// SourceContext
// string file_name = 1;
@@ -242,11 +256,11 @@
return _impl_.file_name_.Get();
}
inline void SourceContext::_internal_set_file_name(const std::string& value) {
-
+
_impl_.file_name_.Set(value, GetArenaForAllocation());
}
inline std::string* SourceContext::_internal_mutable_file_name() {
-
+
return _impl_.file_name_.Mutable(GetArenaForAllocation());
}
inline std::string* SourceContext::release_file_name() {
@@ -255,9 +269,9 @@
}
inline void SourceContext::set_allocated_file_name(std::string* file_name) {
if (file_name != nullptr) {
-
+
} else {
-
+
}
_impl_.file_name_.SetAllocated(file_name, GetArenaForAllocation());
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
@@ -269,14 +283,15 @@
}
#ifdef __GNUC__
- #pragma GCC diagnostic pop
+#pragma GCC diagnostic pop
#endif // __GNUC__
// @@protoc_insertion_point(namespace_scope)
-
PROTOBUF_NAMESPACE_CLOSE
+
// @@protoc_insertion_point(global_scope)
-#include <google/protobuf/port_undef.inc>
-#endif // GOOGLE_PROTOBUF_INCLUDED_GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fsource_5fcontext_2eproto
+#include "google/protobuf/port_undef.inc"
+
+#endif // GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fsource_5fcontext_2eproto_2epb_2eh
diff --git a/src/google/protobuf/string_member_robber.h b/src/google/protobuf/string_member_robber.h
index a4c1051..e16069a 100644
--- a/src/google/protobuf/string_member_robber.h
+++ b/src/google/protobuf/string_member_robber.h
@@ -34,5 +34,8 @@
#include <string>
#include <type_traits>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+
#endif // GOOGLE_PROTOBUF_STRING_MEMBER_ROBBER_H__
diff --git a/src/google/protobuf/struct.pb.cc b/src/google/protobuf/struct.pb.cc
index 87c72d4..aa53b79 100644
--- a/src/google/protobuf/struct.pb.cc
+++ b/src/google/protobuf/struct.pb.cc
@@ -1,168 +1,201 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: google/protobuf/struct.proto
-#include <google/protobuf/struct.pb.h>
+#include "google/protobuf/struct.pb.h"
#include <algorithm>
-
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/extension_set.h>
-#include <google/protobuf/wire_format_lite.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/generated_message_reflection.h>
-#include <google/protobuf/reflection_ops.h>
-#include <google/protobuf/wire_format.h>
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/extension_set.h"
+#include "google/protobuf/wire_format_lite.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/generated_message_reflection.h"
+#include "google/protobuf/reflection_ops.h"
+#include "google/protobuf/wire_format.h"
// @@protoc_insertion_point(includes)
-#include <google/protobuf/port_def.inc>
+// Must be included last.
+#include "google/protobuf/port_def.inc"
PROTOBUF_PRAGMA_INIT_SEG
-
namespace _pb = ::PROTOBUF_NAMESPACE_ID;
-namespace _pbi = _pb::internal;
-
+namespace _pbi = ::PROTOBUF_NAMESPACE_ID::internal;
PROTOBUF_NAMESPACE_OPEN
PROTOBUF_CONSTEXPR Struct_FieldsEntry_DoNotUse::Struct_FieldsEntry_DoNotUse(
::_pbi::ConstantInitialized) {}
struct Struct_FieldsEntry_DoNotUseDefaultTypeInternal {
- PROTOBUF_CONSTEXPR Struct_FieldsEntry_DoNotUseDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR Struct_FieldsEntry_DoNotUseDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~Struct_FieldsEntry_DoNotUseDefaultTypeInternal() {}
union {
Struct_FieldsEntry_DoNotUse _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 Struct_FieldsEntry_DoNotUseDefaultTypeInternal _Struct_FieldsEntry_DoNotUse_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 Struct_FieldsEntry_DoNotUseDefaultTypeInternal _Struct_FieldsEntry_DoNotUse_default_instance_;
PROTOBUF_CONSTEXPR Struct::Struct(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_.fields_)*/{::_pbi::ConstantInitialized()}
, /*decltype(_impl_._cached_size_)*/{}} {}
struct StructDefaultTypeInternal {
- PROTOBUF_CONSTEXPR StructDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR StructDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~StructDefaultTypeInternal() {}
union {
Struct _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 StructDefaultTypeInternal _Struct_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 StructDefaultTypeInternal _Struct_default_instance_;
PROTOBUF_CONSTEXPR Value::Value(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_.kind_)*/{}
, /*decltype(_impl_._cached_size_)*/{}
, /*decltype(_impl_._oneof_case_)*/{}} {}
struct ValueDefaultTypeInternal {
- PROTOBUF_CONSTEXPR ValueDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR ValueDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~ValueDefaultTypeInternal() {}
union {
Value _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 ValueDefaultTypeInternal _Value_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 ValueDefaultTypeInternal _Value_default_instance_;
PROTOBUF_CONSTEXPR ListValue::ListValue(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_.values_)*/{}
, /*decltype(_impl_._cached_size_)*/{}} {}
struct ListValueDefaultTypeInternal {
- PROTOBUF_CONSTEXPR ListValueDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR ListValueDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~ListValueDefaultTypeInternal() {}
union {
ListValue _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 ListValueDefaultTypeInternal _ListValue_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 ListValueDefaultTypeInternal _ListValue_default_instance_;
PROTOBUF_NAMESPACE_CLOSE
static ::_pb::Metadata file_level_metadata_google_2fprotobuf_2fstruct_2eproto[4];
static const ::_pb::EnumDescriptor* file_level_enum_descriptors_google_2fprotobuf_2fstruct_2eproto[1];
-static constexpr ::_pb::ServiceDescriptor const** file_level_service_descriptors_google_2fprotobuf_2fstruct_2eproto = nullptr;
-
-const uint32_t TableStruct_google_2fprotobuf_2fstruct_2eproto::offsets[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Struct_FieldsEntry_DoNotUse, _has_bits_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Struct_FieldsEntry_DoNotUse, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Struct_FieldsEntry_DoNotUse, key_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Struct_FieldsEntry_DoNotUse, value_),
- 0,
- 1,
- ~0u, // no _has_bits_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Struct, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Struct, _impl_.fields_),
- ~0u, // no _has_bits_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Value, _internal_metadata_),
- ~0u, // no _extensions_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Value, _impl_._oneof_case_[0]),
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- ::_pbi::kInvalidFieldOffsetTag,
- ::_pbi::kInvalidFieldOffsetTag,
- ::_pbi::kInvalidFieldOffsetTag,
- ::_pbi::kInvalidFieldOffsetTag,
- ::_pbi::kInvalidFieldOffsetTag,
- ::_pbi::kInvalidFieldOffsetTag,
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Value, _impl_.kind_),
- ~0u, // no _has_bits_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::ListValue, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::ListValue, _impl_.values_),
+static constexpr const ::_pb::ServiceDescriptor**
+ file_level_service_descriptors_google_2fprotobuf_2fstruct_2eproto = nullptr;
+const uint32_t TableStruct_google_2fprotobuf_2fstruct_2eproto::offsets[] PROTOBUF_SECTION_VARIABLE(
+ protodesc_cold) = {
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Struct_FieldsEntry_DoNotUse, _has_bits_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Struct_FieldsEntry_DoNotUse, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Struct_FieldsEntry_DoNotUse, key_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Struct_FieldsEntry_DoNotUse, value_),
+ 0,
+ 1,
+ ~0u, // no _has_bits_
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Struct, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Struct, _impl_.fields_),
+ ~0u, // no _has_bits_
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Value, _internal_metadata_),
+ ~0u, // no _extensions_
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Value, _impl_._oneof_case_[0]),
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ ::_pbi::kInvalidFieldOffsetTag,
+ ::_pbi::kInvalidFieldOffsetTag,
+ ::_pbi::kInvalidFieldOffsetTag,
+ ::_pbi::kInvalidFieldOffsetTag,
+ ::_pbi::kInvalidFieldOffsetTag,
+ ::_pbi::kInvalidFieldOffsetTag,
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Value, _impl_.kind_),
+ ~0u, // no _has_bits_
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::ListValue, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::ListValue, _impl_.values_),
};
-static const ::_pbi::MigrationSchema schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
- { 0, 8, -1, sizeof(::PROTOBUF_NAMESPACE_ID::Struct_FieldsEntry_DoNotUse)},
- { 10, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::Struct)},
- { 17, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::Value)},
- { 30, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::ListValue)},
+
+static const ::_pbi::MigrationSchema
+ schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
+ { 0, 10, -1, sizeof(::PROTOBUF_NAMESPACE_ID::Struct_FieldsEntry_DoNotUse)},
+ { 12, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::Struct)},
+ { 21, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::Value)},
+ { 36, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::ListValue)},
};
static const ::_pb::Message* const file_default_instances[] = {
- &::PROTOBUF_NAMESPACE_ID::_Struct_FieldsEntry_DoNotUse_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::_Struct_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::_Value_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::_ListValue_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_Struct_FieldsEntry_DoNotUse_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_Struct_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_Value_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_ListValue_default_instance_._instance,
};
-
-const char descriptor_table_protodef_google_2fprotobuf_2fstruct_2eproto[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) =
- "\n\034google/protobuf/struct.proto\022\017google.p"
- "rotobuf\"\204\001\n\006Struct\0223\n\006fields\030\001 \003(\0132#.goo"
- "gle.protobuf.Struct.FieldsEntry\032E\n\013Field"
- "sEntry\022\013\n\003key\030\001 \001(\t\022%\n\005value\030\002 \001(\0132\026.goo"
- "gle.protobuf.Value:\0028\001\"\352\001\n\005Value\0220\n\nnull"
- "_value\030\001 \001(\0162\032.google.protobuf.NullValue"
- "H\000\022\026\n\014number_value\030\002 \001(\001H\000\022\026\n\014string_val"
- "ue\030\003 \001(\tH\000\022\024\n\nbool_value\030\004 \001(\010H\000\022/\n\014stru"
- "ct_value\030\005 \001(\0132\027.google.protobuf.StructH"
- "\000\0220\n\nlist_value\030\006 \001(\0132\032.google.protobuf."
- "ListValueH\000B\006\n\004kind\"3\n\tListValue\022&\n\006valu"
- "es\030\001 \003(\0132\026.google.protobuf.Value*\033\n\tNull"
- "Value\022\016\n\nNULL_VALUE\020\000B\177\n\023com.google.prot"
- "obufB\013StructProtoP\001Z/google.golang.org/p"
- "rotobuf/types/known/structpb\370\001\001\242\002\003GPB\252\002\036"
- "Google.Protobuf.WellKnownTypesb\006proto3"
- ;
-static ::_pbi::once_flag descriptor_table_google_2fprotobuf_2fstruct_2eproto_once;
+const char descriptor_table_protodef_google_2fprotobuf_2fstruct_2eproto[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
+ "\n\034google/protobuf/struct.proto\022\017google.p"
+ "rotobuf\"\204\001\n\006Struct\0223\n\006fields\030\001 \003(\0132#.goo"
+ "gle.protobuf.Struct.FieldsEntry\032E\n\013Field"
+ "sEntry\022\013\n\003key\030\001 \001(\t\022%\n\005value\030\002 \001(\0132\026.goo"
+ "gle.protobuf.Value:\0028\001\"\352\001\n\005Value\0220\n\nnull"
+ "_value\030\001 \001(\0162\032.google.protobuf.NullValue"
+ "H\000\022\026\n\014number_value\030\002 \001(\001H\000\022\026\n\014string_val"
+ "ue\030\003 \001(\tH\000\022\024\n\nbool_value\030\004 \001(\010H\000\022/\n\014stru"
+ "ct_value\030\005 \001(\0132\027.google.protobuf.StructH"
+ "\000\0220\n\nlist_value\030\006 \001(\0132\032.google.protobuf."
+ "ListValueH\000B\006\n\004kind\"3\n\tListValue\022&\n\006valu"
+ "es\030\001 \003(\0132\026.google.protobuf.Value*\033\n\tNull"
+ "Value\022\016\n\nNULL_VALUE\020\000B\177\n\023com.google.prot"
+ "obufB\013StructProtoP\001Z/google.golang.org/p"
+ "rotobuf/types/known/structpb\370\001\001\242\002\003GPB\252\002\036"
+ "Google.Protobuf.WellKnownTypesb\006proto3"
+};
+static ::absl::once_flag descriptor_table_google_2fprotobuf_2fstruct_2eproto_once;
const ::_pbi::DescriptorTable descriptor_table_google_2fprotobuf_2fstruct_2eproto = {
- false, false, 638, descriptor_table_protodef_google_2fprotobuf_2fstruct_2eproto,
+ false,
+ false,
+ 638,
+ descriptor_table_protodef_google_2fprotobuf_2fstruct_2eproto,
"google/protobuf/struct.proto",
- &descriptor_table_google_2fprotobuf_2fstruct_2eproto_once, nullptr, 0, 4,
- schemas, file_default_instances, TableStruct_google_2fprotobuf_2fstruct_2eproto::offsets,
- file_level_metadata_google_2fprotobuf_2fstruct_2eproto, file_level_enum_descriptors_google_2fprotobuf_2fstruct_2eproto,
+ &descriptor_table_google_2fprotobuf_2fstruct_2eproto_once,
+ nullptr,
+ 0,
+ 4,
+ schemas,
+ file_default_instances,
+ TableStruct_google_2fprotobuf_2fstruct_2eproto::offsets,
+ file_level_metadata_google_2fprotobuf_2fstruct_2eproto,
+ file_level_enum_descriptors_google_2fprotobuf_2fstruct_2eproto,
file_level_service_descriptors_google_2fprotobuf_2fstruct_2eproto,
};
+
+// This function exists to be marked as weak.
+// It can significantly speed up compilation by breaking up LLVM's SCC
+// in the .pb.cc translation units. Large translation units see a
+// reduction of more than 35% of walltime for optimized builds. Without
+// the weak attribute all the messages in the file, including all the
+// vtables and everything they use become part of the same SCC through
+// a cycle like:
+// GetMetadata -> descriptor table -> default instances ->
+// vtables -> GetMetadata
+// By adding a weak function here we break the connection from the
+// individual vtables back into the descriptor table.
PROTOBUF_ATTRIBUTE_WEAK const ::_pbi::DescriptorTable* descriptor_table_google_2fprotobuf_2fstruct_2eproto_getter() {
return &descriptor_table_google_2fprotobuf_2fstruct_2eproto;
}
-
// Force running AddDescriptors() at dynamic initialization time.
-PROTOBUF_ATTRIBUTE_INIT_PRIORITY2 static ::_pbi::AddDescriptorsRunner dynamic_init_dummy_google_2fprotobuf_2fstruct_2eproto(&descriptor_table_google_2fprotobuf_2fstruct_2eproto);
+PROTOBUF_ATTRIBUTE_INIT_PRIORITY2
+static ::_pbi::AddDescriptorsRunner dynamic_init_dummy_google_2fprotobuf_2fstruct_2eproto(&descriptor_table_google_2fprotobuf_2fstruct_2eproto);
PROTOBUF_NAMESPACE_OPEN
const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* NullValue_descriptor() {
::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&descriptor_table_google_2fprotobuf_2fstruct_2eproto);
@@ -177,7 +210,6 @@
}
}
-
// ===================================================================
Struct_FieldsEntry_DoNotUse::Struct_FieldsEntry_DoNotUse() {}
@@ -191,7 +223,6 @@
&descriptor_table_google_2fprotobuf_2fstruct_2eproto_getter, &descriptor_table_google_2fprotobuf_2fstruct_2eproto_once,
file_level_metadata_google_2fprotobuf_2fstruct_2eproto[0]);
}
-
// ===================================================================
class Struct::_Internal {
@@ -406,11 +437,12 @@
&descriptor_table_google_2fprotobuf_2fstruct_2eproto_getter, &descriptor_table_google_2fprotobuf_2fstruct_2eproto_once,
file_level_metadata_google_2fprotobuf_2fstruct_2eproto[1]);
}
-
// ===================================================================
class Value::_Internal {
public:
+ static constexpr int32_t kOneofCaseOffset =
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Value, _impl_._oneof_case_);
static const ::PROTOBUF_NAMESPACE_ID::Struct& struct_value(const Value* msg);
static const ::PROTOBUF_NAMESPACE_ID::ListValue& list_value(const Value* msg);
};
@@ -593,7 +625,7 @@
// .google.protobuf.NullValue null_value = 1;
case 1:
if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 8)) {
- uint64_t val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr);
+ uint32_t val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr);
CHK_(ptr);
_internal_set_null_value(static_cast<::PROTOBUF_NAMESPACE_ID::NullValue>(val));
} else
@@ -846,7 +878,6 @@
&descriptor_table_google_2fprotobuf_2fstruct_2eproto_getter, &descriptor_table_google_2fprotobuf_2fstruct_2eproto_once,
file_level_metadata_google_2fprotobuf_2fstruct_2eproto[2]);
}
-
// ===================================================================
class ListValue::_Internal {
@@ -1031,7 +1062,6 @@
&descriptor_table_google_2fprotobuf_2fstruct_2eproto_getter, &descriptor_table_google_2fprotobuf_2fstruct_2eproto_once,
file_level_metadata_google_2fprotobuf_2fstruct_2eproto[3]);
}
-
// @@protoc_insertion_point(namespace_scope)
PROTOBUF_NAMESPACE_CLOSE
PROTOBUF_NAMESPACE_OPEN
@@ -1052,6 +1082,5 @@
return Arena::CreateMessageInternal< ::PROTOBUF_NAMESPACE_ID::ListValue >(arena);
}
PROTOBUF_NAMESPACE_CLOSE
-
// @@protoc_insertion_point(global_scope)
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/struct.pb.h b/src/google/protobuf/struct.pb.h
index 82280ea..36ae0b8 100644
--- a/src/google/protobuf/struct.pb.h
+++ b/src/google/protobuf/struct.pb.h
@@ -1,42 +1,47 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: google/protobuf/struct.proto
-#ifndef GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fstruct_2eproto
-#define GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fstruct_2eproto
+#ifndef GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fstruct_2eproto_2epb_2eh
+#define GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fstruct_2eproto_2epb_2eh
#include <limits>
#include <string>
+#include <type_traits>
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
#if PROTOBUF_VERSION < 3021000
-#error This file was generated by a newer version of protoc which is
-#error incompatible with your Protocol Buffer headers. Please update
-#error your headers.
-#endif
-#if 3021007 < PROTOBUF_MIN_PROTOC_VERSION
-#error This file was generated by an older version of protoc which is
-#error incompatible with your Protocol Buffer headers. Please
-#error regenerate this file with a newer version of protoc.
-#endif
+#error "This file was generated by a newer version of protoc which is"
+#error "incompatible with your Protocol Buffer headers. Please update"
+#error "your headers."
+#endif // PROTOBUF_VERSION
-#include <google/protobuf/port_undef.inc>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/arena.h>
-#include <google/protobuf/arenastring.h>
-#include <google/protobuf/generated_message_util.h>
-#include <google/protobuf/metadata_lite.h>
-#include <google/protobuf/generated_message_reflection.h>
-#include <google/protobuf/message.h>
-#include <google/protobuf/repeated_field.h> // IWYU pragma: export
-#include <google/protobuf/extension_set.h> // IWYU pragma: export
-#include <google/protobuf/map.h> // IWYU pragma: export
-#include <google/protobuf/map_entry.h>
-#include <google/protobuf/map_field_inl.h>
-#include <google/protobuf/generated_enum_reflection.h>
-#include <google/protobuf/unknown_field_set.h>
+#if 3021007 < PROTOBUF_MIN_PROTOC_VERSION
+#error "This file was generated by an older version of protoc which is"
+#error "incompatible with your Protocol Buffer headers. Please"
+#error "regenerate this file with a newer version of protoc."
+#endif // PROTOBUF_MIN_PROTOC_VERSION
+#include "google/protobuf/port_undef.inc"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/arena.h"
+#include "google/protobuf/arenastring.h"
+#include "google/protobuf/generated_message_util.h"
+#include "google/protobuf/metadata_lite.h"
+#include "google/protobuf/generated_message_reflection.h"
+#include "google/protobuf/message.h"
+#include "google/protobuf/repeated_field.h" // IWYU pragma: export
+#include "google/protobuf/extension_set.h" // IWYU pragma: export
+#include "google/protobuf/map.h" // IWYU pragma: export
+#include "google/protobuf/map_entry.h"
+#include "google/protobuf/map_field_inl.h"
+#include "google/protobuf/generated_enum_reflection.h"
+#include "google/protobuf/unknown_field_set.h"
// @@protoc_insertion_point(includes)
-#include <google/protobuf/port_def.inc>
+
+// Must be included last.
+#include "google/protobuf/port_def.inc"
+
#define PROTOBUF_INTERNAL_EXPORT_google_2fprotobuf_2fstruct_2eproto PROTOBUF_EXPORT
+
PROTOBUF_NAMESPACE_OPEN
namespace internal {
class AnyMetadata;
@@ -47,7 +52,8 @@
struct PROTOBUF_EXPORT TableStruct_google_2fprotobuf_2fstruct_2eproto {
static const uint32_t offsets[];
};
-PROTOBUF_EXPORT extern const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_google_2fprotobuf_2fstruct_2eproto;
+PROTOBUF_EXPORT extern const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable
+ descriptor_table_google_2fprotobuf_2fstruct_2eproto;
PROTOBUF_NAMESPACE_OPEN
class ListValue;
struct ListValueDefaultTypeInternal;
@@ -61,15 +67,17 @@
class Value;
struct ValueDefaultTypeInternal;
PROTOBUF_EXPORT extern ValueDefaultTypeInternal _Value_default_instance_;
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::ListValue* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::ListValue>(Arena*);
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::Struct* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::Struct>(Arena*);
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::Struct_FieldsEntry_DoNotUse* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::Struct_FieldsEntry_DoNotUse>(Arena*);
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::Value* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::Value>(Arena*);
PROTOBUF_NAMESPACE_CLOSE
-PROTOBUF_NAMESPACE_OPEN
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::ListValue* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::ListValue>(Arena*);
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::Struct* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::Struct>(Arena*);
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::Struct_FieldsEntry_DoNotUse* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::Struct_FieldsEntry_DoNotUse>(Arena*);
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::Value* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::Value>(Arena*);
-PROTOBUF_NAMESPACE_CLOSE
-PROTOBUF_NAMESPACE_OPEN
+PROTOBUF_NAMESPACE_OPEN
enum NullValue : int {
NULL_VALUE = 0,
NullValue_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits<int32_t>::min(),
@@ -86,16 +94,24 @@
static_assert(::std::is_same<T, NullValue>::value ||
::std::is_integral<T>::value,
"Incorrect type passed to function NullValue_Name.");
- return ::PROTOBUF_NAMESPACE_ID::internal::NameOfEnum(
- NullValue_descriptor(), enum_t_value);
+ return NullValue_Name(static_cast<NullValue>(enum_t_value));
+}
+template<>
+inline const std::string& NullValue_Name(NullValue value) {
+ return ::PROTOBUF_NAMESPACE_ID::internal::NameOfDenseEnum
+ <NullValue_descriptor, 0, 0>(static_cast<int>(value));
}
inline bool NullValue_Parse(
- ::PROTOBUF_NAMESPACE_ID::ConstStringParam name, NullValue* value) {
+ ::absl::string_view name, NullValue* value) {
return ::PROTOBUF_NAMESPACE_ID::internal::ParseNamedEnum<NullValue>(
NullValue_descriptor(), name, value);
}
+
// ===================================================================
+
+// -------------------------------------------------------------------
+
class Struct_FieldsEntry_DoNotUse : public ::PROTOBUF_NAMESPACE_ID::internal::MapEntry<Struct_FieldsEntry_DoNotUse,
std::string, ::PROTOBUF_NAMESPACE_ID::Value,
::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_STRING,
@@ -119,7 +135,6 @@
::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final;
friend struct ::TableStruct_google_2fprotobuf_2fstruct_2eproto;
};
-
// -------------------------------------------------------------------
class PROTOBUF_EXPORT Struct final :
@@ -225,7 +240,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.Struct";
}
protected:
@@ -282,8 +297,7 @@
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2fstruct_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOBUF_EXPORT Value final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.Value) */ {
@@ -398,7 +412,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.Value";
}
protected:
@@ -551,8 +565,7 @@
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2fstruct_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOBUF_EXPORT ListValue final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.ListValue) */ {
@@ -657,7 +670,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.ListValue";
}
protected:
@@ -712,14 +725,19 @@
// ===================================================================
+
+
// ===================================================================
+
#ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wstrict-aliasing"
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wstrict-aliasing"
#endif // __GNUC__
// -------------------------------------------------------------------
+// -------------------------------------------------------------------
+
// Struct
// map<string, .google.protobuf.Value> fields = 1;
@@ -1148,19 +1166,13 @@
}
#ifdef __GNUC__
- #pragma GCC diagnostic pop
+#pragma GCC diagnostic pop
#endif // __GNUC__
-// -------------------------------------------------------------------
-
-// -------------------------------------------------------------------
-
-// -------------------------------------------------------------------
-
// @@protoc_insertion_point(namespace_scope)
-
PROTOBUF_NAMESPACE_CLOSE
+
PROTOBUF_NAMESPACE_OPEN
template <> struct is_proto_enum< ::PROTOBUF_NAMESPACE_ID::NullValue> : ::std::true_type {};
@@ -1173,5 +1185,6 @@
// @@protoc_insertion_point(global_scope)
-#include <google/protobuf/port_undef.inc>
-#endif // GOOGLE_PROTOBUF_INCLUDED_GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fstruct_2eproto
+#include "google/protobuf/port_undef.inc"
+
+#endif // GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fstruct_2eproto_2epb_2eh
diff --git a/src/google/protobuf/stubs/BUILD.bazel b/src/google/protobuf/stubs/BUILD.bazel
new file mode 100644
index 0000000..98f497e
--- /dev/null
+++ b/src/google/protobuf/stubs/BUILD.bazel
@@ -0,0 +1,113 @@
+# Protobuf stubs library.
+# These are utilities that mirror the behavior of internal Google code.
+
+load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test")
+load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
+load("//build_defs:cpp_opts.bzl", "COPTS", "LINK_OPTS")
+
+package(
+ default_visibility = ["//:__subpackages__"],
+)
+
+cc_library(
+ name = "lite",
+ srcs = [
+ "bytestream.cc",
+ "common.cc",
+ "structurally_valid.cc",
+ "strutil.cc",
+ ],
+ hdrs = [
+ "bytestream.h",
+ "callback.h",
+ "common.h",
+ "logging.h",
+ "mathutil.h",
+ "platform_macros.h",
+ "port.h",
+ "status_macros.h",
+ "stl_util.h",
+ "strutil.h",
+ ],
+ copts = COPTS,
+ include_prefix = "google/protobuf/stubs",
+ linkopts = LINK_OPTS,
+ deps = [
+ "//src/google/protobuf:port_def",
+ "@com_google_absl//absl/status",
+ "@com_google_absl//absl/strings",
+ ],
+)
+
+cc_library(
+ name = "stubs",
+ srcs = [
+ ],
+ hdrs = [
+ ],
+ copts = COPTS,
+ include_prefix = "google/protobuf/stubs",
+ textual_hdrs = [
+ "bytestream.h",
+ "callback.h",
+ "common.h",
+ "logging.h",
+ "mathutil.h",
+ "platform_macros.h",
+ "port.h",
+ "status_macros.h",
+ "stl_util.h",
+ "strutil.h",
+ ],
+ deps = [
+ ":lite",
+ "//src/google/protobuf:port_def",
+ "@com_google_absl//absl/status",
+ "@com_google_absl//absl/status:statusor",
+ "@com_google_absl//absl/strings",
+ ],
+)
+
+cc_test(
+ name = "stubs_test",
+ srcs = [
+ "bytestream_unittest.cc",
+ "common_unittest.cc",
+ "structurally_valid_unittest.cc",
+ "strutil_unittest.cc",
+ ],
+ copts = COPTS + select({
+ "//build_defs:config_msvc": [],
+ "//conditions:default": [
+ "-Wno-deprecated-declarations",
+ ],
+ }),
+ linkopts = LINK_OPTS,
+ deps = [
+ ":lite",
+ ":stubs",
+ "//src/google/protobuf/testing",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+################################################################################
+# Distribution packaging
+################################################################################
+
+pkg_files(
+ name = "dist_files",
+ srcs = glob(["**/*"]),
+ strip_prefix = strip_prefix.from_root(""),
+ visibility = ["//src:__pkg__"],
+)
+
+filegroup(
+ name = "test_srcs",
+ srcs = glob([
+ "*_test.cc",
+ "*unittest.cc",
+ ]),
+ visibility = ["//pkg:__pkg__"],
+)
diff --git a/src/google/protobuf/stubs/bytestream.cc b/src/google/protobuf/stubs/bytestream.cc
index 980d6f6..9a516d6 100644
--- a/src/google/protobuf/stubs/bytestream.cc
+++ b/src/google/protobuf/stubs/bytestream.cc
@@ -28,12 +28,13 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/stubs/bytestream.h>
+#include "google/protobuf/stubs/bytestream.h"
#include <string.h>
+
#include <algorithm>
-#include <google/protobuf/stubs/logging.h>
+#include "google/protobuf/stubs/logging.h"
namespace google {
namespace protobuf {
@@ -41,7 +42,7 @@
void ByteSource::CopyTo(ByteSink* sink, size_t n) {
while (n > 0) {
- StringPiece fragment = Peek();
+ absl::string_view fragment = Peek();
if (fragment.empty()) {
GOOGLE_LOG(DFATAL) << "ByteSource::CopyTo() overran input.";
break;
@@ -149,9 +150,7 @@
return input_.size();
}
-StringPiece ArrayByteSource::Peek() {
- return input_;
-}
+absl::string_view ArrayByteSource::Peek() { return input_; }
void ArrayByteSource::Skip(size_t n) {
GOOGLE_DCHECK_LE(n, input_.size());
@@ -172,9 +171,9 @@
return available;
}
-StringPiece LimitByteSource::Peek() {
- StringPiece piece = source_->Peek();
- return StringPiece(piece.data(), std::min(piece.size(), limit_));
+absl::string_view LimitByteSource::Peek() {
+ absl::string_view piece = source_->Peek();
+ return absl::string_view(piece.data(), std::min(piece.size(), limit_));
}
void LimitByteSource::Skip(size_t n) {
diff --git a/src/google/protobuf/stubs/bytestream.h b/src/google/protobuf/stubs/bytestream.h
index c7a48de..a11233e 100644
--- a/src/google/protobuf/stubs/bytestream.h
+++ b/src/google/protobuf/stubs/bytestream.h
@@ -44,19 +44,21 @@
// NullByteSink Consumes a never-ending stream of bytes
//
// ByteSource:
-// ArrayByteSource Reads from an array or string/StringPiece
+// ArrayByteSource Reads from an array or string
// LimitedByteSource Limits the number of bytes read from an
#ifndef GOOGLE_PROTOBUF_STUBS_BYTESTREAM_H_
#define GOOGLE_PROTOBUF_STUBS_BYTESTREAM_H_
#include <stddef.h>
+
#include <string>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/stringpiece.h>
+#include "absl/strings/string_view.h"
+#include "google/protobuf/stubs/common.h"
-#include <google/protobuf/port_def.inc>
+// Must be last.
+#include "google/protobuf/port_def.inc" // NOLINT
class CordByteSink;
@@ -78,6 +80,8 @@
class PROTOBUF_EXPORT ByteSink {
public:
ByteSink() {}
+ ByteSink(const ByteSink&) = delete;
+ ByteSink& operator=(const ByteSink&) = delete;
virtual ~ByteSink() {}
// Appends the "n" bytes starting at "bytes".
@@ -87,9 +91,6 @@
// subclasses may use internal buffers that require calling Flush() at the end
// of the stream.
virtual void Flush();
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ByteSink);
};
// An abstract interface for an object that produces a fixed-size sequence of
@@ -99,7 +100,7 @@
//
// ByteSource* source = ...
// while (source->Available() > 0) {
-// StringPiece data = source->Peek();
+// absl::string_view data = source->Peek();
// ... do something with "data" ...
// source->Skip(data.length());
// }
@@ -107,6 +108,8 @@
class PROTOBUF_EXPORT ByteSource {
public:
ByteSource() {}
+ ByteSource(const ByteSource&) = delete;
+ ByteSource& operator=(const ByteSource&) = delete;
virtual ~ByteSource() {}
// Returns the number of bytes left to read from the source. Available()
@@ -118,17 +121,18 @@
// indicative of the fixed-size nature of a ByteSource.
virtual size_t Available() const = 0;
- // Returns a StringPiece of the next contiguous region of the source. Does not
- // reposition the source. The returned region is empty iff Available() == 0.
+ // Returns an absl::string_view of the next contiguous region of the source.
+ // Does not reposition the source. The returned region is empty iff
+ // Available() == 0.
//
// The returned region is valid until the next call to Skip() or until this
// object is destroyed, whichever occurs first.
//
- // The length of the returned StringPiece will be <= Available().
- virtual StringPiece Peek() = 0;
+ // The length of the returned absl::string_view will be <= Available().
+ virtual absl::string_view Peek() = 0;
- // Skips the next n bytes. Invalidates any StringPiece returned by a previous
- // call to Peek().
+ // Skips the next n bytes. Invalidates any absl::string_view returned by a
+ // previous call to Peek().
//
// REQUIRES: Available() >= n
virtual void Skip(size_t n) = 0;
@@ -140,9 +144,6 @@
//
// REQUIRES: Available() >= n
virtual void CopyTo(ByteSink* sink, size_t n);
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ByteSource);
};
//
@@ -162,6 +163,8 @@
//
class PROTOBUF_EXPORT UncheckedArrayByteSink : public ByteSink {
public:
+ UncheckedArrayByteSink(const UncheckedArrayByteSink&) = delete;
+ UncheckedArrayByteSink& operator=(const UncheckedArrayByteSink&) = delete;
explicit UncheckedArrayByteSink(char* dest) : dest_(dest) {}
virtual void Append(const char* data, size_t n) override;
@@ -173,7 +176,6 @@
private:
char* dest_;
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(UncheckedArrayByteSink);
};
// Implementation of ByteSink that writes to a sized byte array. This sink will
@@ -191,6 +193,8 @@
class PROTOBUF_EXPORT CheckedArrayByteSink : public ByteSink {
public:
CheckedArrayByteSink(char* outbuf, size_t capacity);
+ CheckedArrayByteSink(const CheckedArrayByteSink&) = delete;
+ CheckedArrayByteSink& operator=(const CheckedArrayByteSink&) = delete;
virtual void Append(const char* bytes, size_t n) override;
// Returns the number of bytes actually written to the sink.
@@ -205,7 +209,6 @@
const size_t capacity_;
size_t size_;
bool overflowed_;
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CheckedArrayByteSink);
};
// Implementation of ByteSink that allocates an internal buffer (a char array)
@@ -227,6 +230,8 @@
class PROTOBUF_EXPORT GrowingArrayByteSink : public strings::ByteSink {
public:
explicit GrowingArrayByteSink(size_t estimated_size);
+ GrowingArrayByteSink(const GrowingArrayByteSink&) = delete;
+ GrowingArrayByteSink& operator=(const GrowingArrayByteSink&) = delete;
virtual ~GrowingArrayByteSink();
virtual void Append(const char* bytes, size_t n) override;
@@ -241,7 +246,6 @@
size_t capacity_;
char* buf_;
size_t size_;
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(GrowingArrayByteSink);
};
// Implementation of ByteSink that appends to the given string.
@@ -257,11 +261,12 @@
class PROTOBUF_EXPORT StringByteSink : public ByteSink {
public:
explicit StringByteSink(std::string* dest) : dest_(dest) {}
+ StringByteSink(const StringByteSink&) = delete;
+ StringByteSink& operator=(const StringByteSink&) = delete;
virtual void Append(const char* data, size_t n) override;
private:
std::string* dest_;
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(StringByteSink);
};
// Implementation of ByteSink that discards all data.
@@ -274,17 +279,16 @@
class PROTOBUF_EXPORT NullByteSink : public ByteSink {
public:
NullByteSink() {}
+ NullByteSink(const NullByteSink&) = delete;
+ NullByteSink& operator=(const NullByteSink&) = delete;
void Append(const char* /*data*/, size_t /*n*/) override {}
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(NullByteSink);
};
//
// Some commonly used implementations of ByteSource
//
-// Implementation of ByteSource that reads from a StringPiece.
+// Implementation of ByteSource that reads from an absl::string_view.
//
// Example:
//
@@ -295,15 +299,16 @@
//
class PROTOBUF_EXPORT ArrayByteSource : public ByteSource {
public:
- explicit ArrayByteSource(StringPiece s) : input_(s) {}
+ explicit ArrayByteSource(absl::string_view s) : input_(s) {}
+ ArrayByteSource(const ArrayByteSource&) = delete;
+ ArrayByteSource& operator=(const ArrayByteSource&) = delete;
virtual size_t Available() const override;
- virtual StringPiece Peek() override;
+ virtual absl::string_view Peek() override;
virtual void Skip(size_t n) override;
private:
- StringPiece input_;
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ArrayByteSource);
+ absl::string_view input_;
};
// Implementation of ByteSource that wraps another ByteSource, limiting the
@@ -330,7 +335,7 @@
LimitByteSource(ByteSource* source, size_t limit);
virtual size_t Available() const override;
- virtual StringPiece Peek() override;
+ virtual absl::string_view Peek() override;
virtual void Skip(size_t n) override;
// We override CopyTo so that we can forward to the underlying source, in
@@ -346,6 +351,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc" // NOLINT
#endif // GOOGLE_PROTOBUF_STUBS_BYTESTREAM_H_
diff --git a/src/google/protobuf/stubs/bytestream_unittest.cc b/src/google/protobuf/stubs/bytestream_unittest.cc
index cb11825..0e5f5a5 100644
--- a/src/google/protobuf/stubs/bytestream_unittest.cc
+++ b/src/google/protobuf/stubs/bytestream_unittest.cc
@@ -28,14 +28,15 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/stubs/bytestream.h>
+#include "google/protobuf/stubs/bytestream.h"
+#include <gtest/gtest.h>
#include <stdio.h>
#include <string.h>
+
#include <algorithm>
-#include <google/protobuf/testing/googletest.h>
-#include <gtest/gtest.h>
+#include "google/protobuf/testing/googletest.h"
namespace google {
namespace protobuf {
@@ -47,22 +48,20 @@
// one fragment.
class MockByteSource : public ByteSource {
public:
- MockByteSource(StringPiece data, int block_size)
- : data_(data), block_size_(block_size) {}
+ MockByteSource(absl::string_view data, int block_size)
+ : data_(data), block_size_(block_size) {}
size_t Available() const { return data_.size(); }
- StringPiece Peek() {
- return data_.substr(0, block_size_);
- }
+ absl::string_view Peek() { return data_.substr(0, block_size_); }
void Skip(size_t n) { data_.remove_prefix(n); }
private:
- StringPiece data_;
+ absl::string_view data_;
int block_size_;
};
TEST(ByteSourceTest, CopyTo) {
- StringPiece data("Hello world!");
+ absl::string_view data("Hello world!");
MockByteSource source(data, 3);
std::string str;
StringByteSink sink(&str);
@@ -72,7 +71,7 @@
}
TEST(ByteSourceTest, CopySubstringTo) {
- StringPiece data("Hello world!");
+ absl::string_view data("Hello world!");
MockByteSource source(data, 3);
source.Skip(1);
std::string str;
@@ -84,7 +83,7 @@
}
TEST(ByteSourceTest, LimitByteSource) {
- StringPiece data("Hello world!");
+ absl::string_view data("Hello world!");
MockByteSource source(data, 3);
LimitByteSource limit_source(&source, 6);
EXPECT_EQ(6, limit_source.Available());
@@ -110,7 +109,7 @@
}
TEST(ByteSourceTest, CopyToStringByteSink) {
- StringPiece data("Hello world!");
+ absl::string_view data("Hello world!");
MockByteSource source(data, 3);
std::string str;
StringByteSink sink(&str);
@@ -123,8 +122,6 @@
public:
explicit FlushingByteSink(std::string* dest) : StringByteSink(dest) {}
virtual void Flush() { Append("z", 1); }
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FlushingByteSink);
};
// Write and Flush via the ByteSink superclass interface.
diff --git a/src/google/protobuf/stubs/callback.h b/src/google/protobuf/stubs/callback.h
index 43d546d..691eda4 100644
--- a/src/google/protobuf/stubs/callback.h
+++ b/src/google/protobuf/stubs/callback.h
@@ -3,9 +3,7 @@
#include <type_traits>
-#include <google/protobuf/stubs/macros.h>
-
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
// ===================================================================
// emulates google3/base/callback.h
@@ -73,48 +71,44 @@
class PROTOBUF_EXPORT Closure {
public:
Closure() {}
+ Closure(const Closure&) = delete;
+ Closure& operator=(const Closure&) = delete;
virtual ~Closure();
virtual void Run() = 0;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Closure);
};
template<typename R>
class ResultCallback {
public:
ResultCallback() {}
+ ResultCallback(const ResultCallback&) = delete;
+ ResultCallback& operator=(const ResultCallback&) = delete;
virtual ~ResultCallback() {}
virtual R Run() = 0;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ResultCallback);
};
template <typename R, typename A1>
class PROTOBUF_EXPORT ResultCallback1 {
public:
ResultCallback1() {}
+ ResultCallback1(const ResultCallback1&) = delete;
+ ResultCallback1& operator=(const ResultCallback1&) = delete;
virtual ~ResultCallback1() {}
virtual R Run(A1) = 0;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ResultCallback1);
};
template <typename R, typename A1, typename A2>
class PROTOBUF_EXPORT ResultCallback2 {
public:
ResultCallback2() {}
+ ResultCallback2(const ResultCallback2&) = delete;
+ ResultCallback2& operator=(const ResultCallback2&) = delete;
virtual ~ResultCallback2() {}
virtual R Run(A1,A2) = 0;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ResultCallback2);
};
namespace internal {
@@ -578,6 +572,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_STUBS_CALLBACK_H_
diff --git a/src/google/protobuf/stubs/casts.h b/src/google/protobuf/stubs/casts.h
deleted file mode 100644
index ad29dac..0000000
--- a/src/google/protobuf/stubs/casts.h
+++ /dev/null
@@ -1,138 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2014 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#ifndef GOOGLE_PROTOBUF_CASTS_H__
-#define GOOGLE_PROTOBUF_CASTS_H__
-
-#include <google/protobuf/stubs/common.h>
-
-#include <google/protobuf/port_def.inc>
-#include <type_traits>
-
-namespace google {
-namespace protobuf {
-namespace internal {
-
-// Use implicit_cast as a safe version of static_cast or const_cast
-// for upcasting in the type hierarchy (i.e. casting a pointer to Foo
-// to a pointer to SuperclassOfFoo or casting a pointer to Foo to
-// a const pointer to Foo).
-// When you use implicit_cast, the compiler checks that the cast is safe.
-// Such explicit implicit_casts are necessary in surprisingly many
-// situations where C++ demands an exact type match instead of an
-// argument type convertible to a target type.
-//
-// The From type can be inferred, so the preferred syntax for using
-// implicit_cast is the same as for static_cast etc.:
-//
-// implicit_cast<ToType>(expr)
-//
-// implicit_cast would have been part of the C++ standard library,
-// but the proposal was submitted too late. It will probably make
-// its way into the language in the future.
-template<typename To, typename From>
-inline To implicit_cast(From const &f) {
- return f;
-}
-
-// When you upcast (that is, cast a pointer from type Foo to type
-// SuperclassOfFoo), it's fine to use implicit_cast<>, since upcasts
-// always succeed. When you downcast (that is, cast a pointer from
-// type Foo to type SubclassOfFoo), static_cast<> isn't safe, because
-// how do you know the pointer is really of type SubclassOfFoo? It
-// could be a bare Foo, or of type DifferentSubclassOfFoo. Thus,
-// when you downcast, you should use this macro. In debug mode, we
-// use dynamic_cast<> to double-check the downcast is legal (we die
-// if it's not). In normal mode, we do the efficient static_cast<>
-// instead. Thus, it's important to test in debug mode to make sure
-// the cast is legal!
-// This is the only place in the code we should use dynamic_cast<>.
-// In particular, you SHOULDN'T be using dynamic_cast<> in order to
-// do RTTI (eg code like this:
-// if (dynamic_cast<Subclass1>(foo)) HandleASubclass1Object(foo);
-// if (dynamic_cast<Subclass2>(foo)) HandleASubclass2Object(foo);
-// You should design the code some other way not to need this.
-
-template<typename To, typename From> // use like this: down_cast<T*>(foo);
-inline To down_cast(From* f) { // so we only accept pointers
- // Ensures that To is a sub-type of From *. This test is here only
- // for compile-time type checking, and has no overhead in an
- // optimized build at run-time, as it will be optimized away
- // completely.
- if (false) {
- implicit_cast<From*, To>(0);
- }
-
-#if !defined(NDEBUG) && PROTOBUF_RTTI
- assert(f == nullptr || dynamic_cast<To>(f) != nullptr); // RTTI: debug mode only!
-#endif
- return static_cast<To>(f);
-}
-
-template<typename To, typename From> // use like this: down_cast<T&>(foo);
-inline To down_cast(From& f) {
- typedef typename std::remove_reference<To>::type* ToAsPointer;
- // Ensures that To is a sub-type of From *. This test is here only
- // for compile-time type checking, and has no overhead in an
- // optimized build at run-time, as it will be optimized away
- // completely.
- if (false) {
- implicit_cast<From*, ToAsPointer>(0);
- }
-
-#if !defined(NDEBUG) && PROTOBUF_RTTI
- // RTTI: debug mode only!
- assert(dynamic_cast<ToAsPointer>(&f) != nullptr);
-#endif
- return *static_cast<ToAsPointer>(&f);
-}
-
-template<typename To, typename From>
-inline To bit_cast(const From& from) {
- static_assert(sizeof(From) == sizeof(To), "bit_cast_with_different_sizes");
- To dest;
- memcpy(&dest, &from, sizeof(dest));
- return dest;
-}
-
-} // namespace internal
-
-// We made these internal so that they would show up as such in the docs,
-// but we don't want to stick "internal::" in front of them everywhere.
-using internal::implicit_cast;
-using internal::down_cast;
-using internal::bit_cast;
-
-} // namespace protobuf
-} // namespace google
-
-#include <google/protobuf/port_undef.inc>
-
-#endif // GOOGLE_PROTOBUF_CASTS_H__
diff --git a/src/google/protobuf/stubs/common.cc b/src/google/protobuf/stubs/common.cc
index e0a807f..d5c80bc 100644
--- a/src/google/protobuf/stubs/common.cc
+++ b/src/google/protobuf/stubs/common.cc
@@ -30,12 +30,13 @@
// Author: kenton@google.com (Kenton Varda)
-#include <google/protobuf/stubs/common.h>
+#include "google/protobuf/stubs/common.h"
+
+#include <errno.h>
+#include <stdio.h>
#include <atomic>
-#include <errno.h>
#include <sstream>
-#include <stdio.h>
#include <vector>
#ifdef _WIN32
@@ -49,15 +50,14 @@
#include <android/log.h>
#endif
-#include <google/protobuf/stubs/callback.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/once.h>
-#include <google/protobuf/stubs/status.h>
-#include <google/protobuf/stubs/stringpiece.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/int128.h>
+#include "absl/status/status.h"
+#include "absl/strings/string_view.h"
+#include "google/protobuf/stubs/callback.h"
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/strutil.h"
-#include <google/protobuf/port_def.inc>
+// Must be last.
+#include "google/protobuf/port_def.inc" // NOLINT
namespace google {
namespace protobuf {
@@ -108,6 +108,21 @@
return buffer;
}
+std::string ProtocVersionString(int version) {
+ int minor = (version / 1000) % 1000;
+ int micro = version % 1000;
+
+ // 128 bytes should always be enough, but we use snprintf() anyway to be
+ // safe.
+ char buffer[128];
+ snprintf(buffer, sizeof(buffer), "%d.%d", minor, micro);
+
+ // Guard against broken MSVC snprintf().
+ buffer[sizeof(buffer) - 1] = '\0';
+
+ return buffer;
+}
+
} // namespace internal
// ===================================================================
@@ -178,7 +193,7 @@
}
static LogHandler* log_handler_ = &DefaultLogHandler;
-static std::atomic<int> log_silencer_count_ = ATOMIC_VAR_INIT(0);
+static std::atomic<int> log_silencer_count_{0};
LogMessage& LogMessage::operator<<(const std::string& value) {
message_ += value;
@@ -190,36 +205,29 @@
return *this;
}
-LogMessage& LogMessage::operator<<(const StringPiece& value) {
- message_ += value.ToString();
+LogMessage& LogMessage::operator<<(absl::string_view value) {
+ absl::StrAppend(&message_, value);
return *this;
}
-LogMessage& LogMessage::operator<<(const util::Status& status) {
+LogMessage& LogMessage::operator<<(const absl::Status& status) {
message_ += status.ToString();
return *this;
}
-LogMessage& LogMessage::operator<<(const uint128& value) {
- std::ostringstream str;
- str << value;
- message_ += str.str();
- return *this;
-}
-
LogMessage& LogMessage::operator<<(char value) {
- return *this << StringPiece(&value, 1);
+ return *this << absl::string_view(&value, 1);
}
LogMessage& LogMessage::operator<<(void* value) {
- StrAppend(&message_, strings::Hex(reinterpret_cast<uintptr_t>(value)));
+ absl::StrAppend(&message_, strings::Hex(reinterpret_cast<uintptr_t>(value)));
return *this;
}
#undef DECLARE_STREAM_OPERATOR
#define DECLARE_STREAM_OPERATOR(TYPE) \
LogMessage& LogMessage::operator<<(TYPE value) { \
- StrAppend(&message_, value); \
+ absl::StrAppend(&message_, value); \
return *this; \
}
@@ -321,4 +329,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc" // NOLINT
diff --git a/src/google/protobuf/stubs/common.h b/src/google/protobuf/stubs/common.h
index d06a32b..cbcee3c 100644
--- a/src/google/protobuf/stubs/common.h
+++ b/src/google/protobuf/stubs/common.h
@@ -43,10 +43,9 @@
#include <string>
#include <vector>
-#include <google/protobuf/stubs/macros.h>
-#include <google/protobuf/stubs/platform_macros.h>
-#include <google/protobuf/stubs/port.h>
-#include <google/protobuf/stubs/stringpiece.h>
+#include "absl/strings/string_view.h"
+#include "google/protobuf/stubs/platform_macros.h"
+#include "google/protobuf/stubs/port.h"
#ifndef PROTOBUF_USE_EXCEPTIONS
#if defined(_MSC_VER) && defined(_CPPUNWIND)
@@ -69,7 +68,7 @@
#include <pthread.h>
#endif
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace std {}
@@ -106,7 +105,12 @@
const char* filename);
// Converts a numeric version number to a string.
-std::string PROTOBUF_EXPORT VersionString(int version);
+std::string PROTOBUF_EXPORT
+VersionString(int version); // NOLINT(runtime/string)
+
+// Prints the protoc compiler version (no major version)
+std::string PROTOBUF_EXPORT
+ProtocVersionString(int version); // NOLINT(runtime/string)
} // namespace internal
@@ -129,12 +133,12 @@
// structurally_valid.cc.
PROTOBUF_EXPORT bool IsStructurallyValidUTF8(const char* buf, int len);
-inline bool IsStructurallyValidUTF8(StringPiece str) {
+inline bool IsStructurallyValidUTF8(absl::string_view str) {
return IsStructurallyValidUTF8(str.data(), static_cast<int>(str.length()));
}
// Returns initial number of bytes of structurally valid UTF-8.
-PROTOBUF_EXPORT int UTF8SpnStructurallyValid(StringPiece str);
+PROTOBUF_EXPORT int UTF8SpnStructurallyValid(absl::string_view str);
// Coerce UTF-8 byte string in src_str to be
// a structurally-valid equal-length string by selectively
@@ -148,7 +152,8 @@
//
// Optimized for: all structurally valid and no byte copying is done.
//
-PROTOBUF_EXPORT char* UTF8CoerceToStructurallyValid(StringPiece str, char* dst,
+PROTOBUF_EXPORT char* UTF8CoerceToStructurallyValid(absl::string_view str,
+ char* dst,
char replace_char);
} // namespace internal
@@ -192,6 +197,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_COMMON_H__
diff --git a/src/google/protobuf/stubs/common_unittest.cc b/src/google/protobuf/stubs/common_unittest.cc
index c55e452..7c86204 100644
--- a/src/google/protobuf/stubs/common_unittest.cc
+++ b/src/google/protobuf/stubs/common_unittest.cc
@@ -30,17 +30,19 @@
// Author: kenton@google.com (Kenton Varda)
-#include <vector>
-#include <google/protobuf/stubs/callback.h>
-#include <google/protobuf/stubs/casts.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/substitute.h>
+#include "google/protobuf/stubs/common.h"
-#include <google/protobuf/testing/googletest.h>
#include <gtest/gtest.h>
+#include <vector>
+
+#include "absl/strings/ascii.h"
+#include "absl/strings/substitute.h"
+#include "google/protobuf/stubs/callback.h"
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "google/protobuf/testing/googletest.h"
+
namespace google {
namespace protobuf {
namespace {
@@ -56,7 +58,7 @@
std::string version = PACKAGE_VERSION;
int pos = 0;
while (pos < version.size() &&
- (ascii_isdigit(version[pos]) || version[pos] == '.')) {
+ (absl::ascii_isdigit(version[pos]) || version[pos] == '.')) {
++pos;
}
version.erase(pos);
@@ -81,9 +83,8 @@
void CaptureLog(LogLevel level, const char* filename, int line,
const std::string& message) {
- captured_messages_.push_back(
- strings::Substitute("$0 $1:$2: $3",
- implicit_cast<int>(level), filename, line, message));
+ captured_messages_.push_back(absl::Substitute(
+ "$0 $1:$2: $3", static_cast<int>(level), filename, line, message));
}
TEST(LoggingTest, DefaultLogging) {
@@ -94,11 +95,14 @@
GOOGLE_LOG(ERROR ) << "An error.";
std::string text = GetCapturedTestStderr();
- EXPECT_EQ(
- "[libprotobuf INFO " __FILE__ ":" + SimpleItoa(line + 1) + "] A message.\n"
- "[libprotobuf WARNING " __FILE__ ":" + SimpleItoa(line + 2) + "] A warning.\n"
- "[libprotobuf ERROR " __FILE__ ":" + SimpleItoa(line + 3) + "] An error.\n",
- text);
+ EXPECT_EQ(absl::StrCat("[libprotobuf INFO " __FILE__ ":", line + 1,
+ "] A message.\n"
+ "[libprotobuf WARNING " __FILE__ ":",
+ line + 2,
+ "] A warning.\n"
+ "[libprotobuf ERROR " __FILE__ ":",
+ line + 3, "] An error.\n"),
+ text);
}
TEST(LoggingTest, NullLogging) {
@@ -127,12 +131,10 @@
EXPECT_TRUE(SetLogHandler(old_handler) == &CaptureLog);
ASSERT_EQ(2, captured_messages_.size());
- EXPECT_EQ(
- "2 " __FILE__ ":" + SimpleItoa(start_line + 1) + ": An error.",
- captured_messages_[0]);
- EXPECT_EQ(
- "1 " __FILE__ ":" + SimpleItoa(start_line + 2) + ": A warning.",
- captured_messages_[1]);
+ EXPECT_EQ(absl::StrCat("2 " __FILE__ ":", start_line + 1, ": An error."),
+ captured_messages_[0]);
+ EXPECT_EQ(absl::StrCat("1 " __FILE__ ":", start_line + 2, ": A warning."),
+ captured_messages_[1]);
}
TEST(LoggingTest, SilenceLogging) {
@@ -153,12 +155,10 @@
EXPECT_TRUE(SetLogHandler(old_handler) == &CaptureLog);
ASSERT_EQ(2, captured_messages_.size());
- EXPECT_EQ(
- "0 " __FILE__ ":" + SimpleItoa(line1) + ": Visible1",
- captured_messages_[0]);
- EXPECT_EQ(
- "0 " __FILE__ ":" + SimpleItoa(line2) + ": Visible2",
- captured_messages_[1]);
+ EXPECT_EQ(absl::StrCat("0 " __FILE__ ":", line1, ": Visible1"),
+ captured_messages_[0]);
+ EXPECT_EQ(absl::StrCat("0 " __FILE__ ":", line2, ": Visible2"),
+ captured_messages_[1]);
}
class ClosureTest : public testing::Test {
diff --git a/src/google/protobuf/stubs/hash.h b/src/google/protobuf/stubs/hash.h
deleted file mode 100644
index a7ec068..0000000
--- a/src/google/protobuf/stubs/hash.h
+++ /dev/null
@@ -1,114 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// Author: kenton@google.com (Kenton Varda)
-
-#ifndef GOOGLE_PROTOBUF_STUBS_HASH_H__
-#define GOOGLE_PROTOBUF_STUBS_HASH_H__
-
-#include <cstring>
-#include <string>
-#include <unordered_map>
-#include <unordered_set>
-
-# define GOOGLE_PROTOBUF_HASH_NAMESPACE_DECLARATION_START \
- namespace google { \
- namespace protobuf {
-# define GOOGLE_PROTOBUF_HASH_NAMESPACE_DECLARATION_END }}
-
-namespace google {
-namespace protobuf {
-
-template <typename Key>
-struct hash : public std::hash<Key> {};
-
-template <typename Key>
-struct hash<const Key*> {
- inline size_t operator()(const Key* key) const {
- return reinterpret_cast<size_t>(key);
- }
-};
-
-// Unlike the old SGI version, the TR1 "hash" does not special-case char*. So,
-// we go ahead and provide our own implementation.
-template <>
-struct hash<const char*> {
- inline size_t operator()(const char* str) const {
- size_t result = 0;
- for (; *str != '\0'; str++) {
- result = 5 * result + static_cast<size_t>(*str);
- }
- return result;
- }
-};
-
-template<>
-struct hash<bool> {
- size_t operator()(bool x) const {
- return static_cast<size_t>(x);
- }
-};
-
-template <>
-struct hash<std::string> {
- inline size_t operator()(const std::string& key) const {
- return hash<const char*>()(key.c_str());
- }
-
- static const size_t bucket_size = 4;
- static const size_t min_buckets = 8;
- inline bool operator()(const std::string& a, const std::string& b) const {
- return a < b;
- }
-};
-
-template <typename First, typename Second>
-struct hash<std::pair<First, Second> > {
- inline size_t operator()(const std::pair<First, Second>& key) const {
- size_t first_hash = hash<First>()(key.first);
- size_t second_hash = hash<Second>()(key.second);
-
- // FIXME(kenton): What is the best way to compute this hash? I have
- // no idea! This seems a bit better than an XOR.
- return first_hash * ((1 << 16) - 1) + second_hash;
- }
-
- static const size_t bucket_size = 4;
- static const size_t min_buckets = 8;
- inline bool operator()(const std::pair<First, Second>& a,
- const std::pair<First, Second>& b) const {
- return a < b;
- }
-};
-
-} // namespace protobuf
-} // namespace google
-
-#endif // GOOGLE_PROTOBUF_STUBS_HASH_H__
diff --git a/src/google/protobuf/stubs/int128.cc b/src/google/protobuf/stubs/int128.cc
deleted file mode 100644
index a151cfb..0000000
--- a/src/google/protobuf/stubs/int128.cc
+++ /dev/null
@@ -1,193 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#include <google/protobuf/stubs/int128.h>
-
-#include <iomanip>
-#include <ostream> // NOLINT(readability/streams)
-#include <sstream>
-
-#include <google/protobuf/stubs/logging.h>
-
-#include <google/protobuf/port_def.inc>
-
-namespace google {
-namespace protobuf {
-
-const uint128_pod kuint128max = {uint64_t{0xFFFFFFFFFFFFFFFFu},
- uint64_t{0xFFFFFFFFFFFFFFFFu}};
-
-// Returns the 0-based position of the last set bit (i.e., most significant bit)
-// in the given uint64. The argument may not be 0.
-//
-// For example:
-// Given: 5 (decimal) == 101 (binary)
-// Returns: 2
-#define STEP(T, n, pos, sh) \
- do { \
- if ((n) >= (static_cast<T>(1) << (sh))) { \
- (n) = (n) >> (sh); \
- (pos) |= (sh); \
- } \
- } while (0)
-static inline int Fls64(uint64_t n) {
- GOOGLE_DCHECK_NE(0, n);
- int pos = 0;
- STEP(uint64_t, n, pos, 0x20);
- uint32_t n32 = n;
- STEP(uint32_t, n32, pos, 0x10);
- STEP(uint32_t, n32, pos, 0x08);
- STEP(uint32_t, n32, pos, 0x04);
- return pos + ((uint64_t{0x3333333322221100u} >> (n32 << 2)) & 0x3);
-}
-#undef STEP
-
-// Like Fls64() above, but returns the 0-based position of the last set bit
-// (i.e., most significant bit) in the given uint128. The argument may not be 0.
-static inline int Fls128(uint128 n) {
- if (uint64_t hi = Uint128High64(n)) {
- return Fls64(hi) + 64;
- }
- return Fls64(Uint128Low64(n));
-}
-
-void uint128::DivModImpl(uint128 dividend, uint128 divisor,
- uint128* quotient_ret, uint128* remainder_ret) {
- if (divisor == 0) {
- GOOGLE_LOG(FATAL) << "Division or mod by zero: dividend.hi=" << dividend.hi_
- << ", lo=" << dividend.lo_;
- } else if (dividend < divisor) {
- *quotient_ret = 0;
- *remainder_ret = dividend;
- return;
- } else {
- int dividend_bit_length = Fls128(dividend);
- int divisor_bit_length = Fls128(divisor);
- int difference = dividend_bit_length - divisor_bit_length;
- uint128 quotient = 0;
- while (difference >= 0) {
- quotient <<= 1;
- uint128 shifted_divisor = divisor << difference;
- if (shifted_divisor <= dividend) {
- dividend -= shifted_divisor;
- quotient += 1;
- }
- difference -= 1;
- }
- //record the final quotient and remainder
- *quotient_ret = quotient;
- *remainder_ret = dividend;
- }
-}
-
-
-uint128& uint128::operator/=(const uint128& divisor) {
- uint128 quotient = 0;
- uint128 remainder = 0;
- DivModImpl(*this, divisor, "ient, &remainder);
- *this = quotient;
- return *this;
-}
-uint128& uint128::operator%=(const uint128& divisor) {
- uint128 quotient = 0;
- uint128 remainder = 0;
- DivModImpl(*this, divisor, "ient, &remainder);
- *this = remainder;
- return *this;
-}
-
-std::ostream& operator<<(std::ostream& o, const uint128& b) {
- std::ios_base::fmtflags flags = o.flags();
-
- // Select a divisor which is the largest power of the base < 2^64.
- uint128 div;
- std::streamsize div_base_log;
- switch (flags & std::ios::basefield) {
- case std::ios::hex:
- div =
- static_cast<uint64_t>(uint64_t{0x1000000000000000u}); // 16^15
- div_base_log = 15;
- break;
- case std::ios::oct:
- div = static_cast<uint64_t>(
- uint64_t{01000000000000000000000u}); // 8^21
- div_base_log = 21;
- break;
- default: // std::ios::dec
- div = static_cast<uint64_t>(
- uint64_t{10000000000000000000u}); // 10^19
- div_base_log = 19;
- break;
- }
-
- // Now piece together the uint128 representation from three chunks of
- // the original value, each less than "div" and therefore representable
- // as a uint64.
- std::ostringstream os;
- std::ios_base::fmtflags copy_mask =
- std::ios::basefield | std::ios::showbase | std::ios::uppercase;
- os.setf(flags & copy_mask, copy_mask);
- uint128 high = b;
- uint128 low;
- uint128::DivModImpl(high, div, &high, &low);
- uint128 mid;
- uint128::DivModImpl(high, div, &high, &mid);
- if (high.lo_ != 0) {
- os << high.lo_;
- os << std::noshowbase << std::setfill('0') << std::setw(div_base_log);
- os << mid.lo_;
- os << std::setw(div_base_log);
- } else if (mid.lo_ != 0) {
- os << mid.lo_;
- os << std::noshowbase << std::setfill('0') << std::setw(div_base_log);
- }
- os << low.lo_;
- std::string rep = os.str();
-
- // Add the requisite padding.
- std::streamsize width = o.width(0);
- auto repSize = static_cast<std::streamsize>(rep.size());
- if (width > repSize) {
- if ((flags & std::ios::adjustfield) == std::ios::left) {
- rep.append(width - repSize, o.fill());
- } else {
- rep.insert(static_cast<std::string::size_type>(0), width - repSize,
- o.fill());
- }
- }
-
- // Stream the final representation in a single "<<" call.
- return o << rep;
-}
-
-} // namespace protobuf
-} // namespace google
-
-#include <google/protobuf/port_undef.inc> // NOLINT
diff --git a/src/google/protobuf/stubs/int128.h b/src/google/protobuf/stubs/int128.h
deleted file mode 100644
index 92d7bdf..0000000
--- a/src/google/protobuf/stubs/int128.h
+++ /dev/null
@@ -1,387 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#ifndef GOOGLE_PROTOBUF_STUBS_INT128_H_
-#define GOOGLE_PROTOBUF_STUBS_INT128_H_
-
-#include <google/protobuf/stubs/common.h>
-
-#include <iosfwd>
-
-#include <google/protobuf/port_def.inc>
-
-namespace google {
-namespace protobuf {
-
-struct uint128_pod;
-
-// TODO(xiaofeng): Define GOOGLE_PROTOBUF_HAS_CONSTEXPR when constexpr is
-// available.
-#ifdef GOOGLE_PROTOBUF_HAS_CONSTEXPR
-# define UINT128_CONSTEXPR constexpr
-#else
-# define UINT128_CONSTEXPR
-#endif
-
-// An unsigned 128-bit integer type. Thread-compatible.
-class PROTOBUF_EXPORT uint128 {
- public:
- UINT128_CONSTEXPR uint128(); // Sets to 0, but don't trust on this behavior.
- UINT128_CONSTEXPR uint128(uint64_t top, uint64_t bottom);
-#ifndef SWIG
- UINT128_CONSTEXPR uint128(int bottom);
- UINT128_CONSTEXPR uint128(uint32_t bottom); // Top 96 bits = 0
-#endif
- UINT128_CONSTEXPR uint128(uint64_t bottom); // hi_ = 0
- UINT128_CONSTEXPR uint128(const uint128_pod &val);
-
- // Trivial copy constructor, assignment operator and destructor.
-
- void Initialize(uint64_t top, uint64_t bottom);
-
- // Arithmetic operators.
- uint128& operator+=(const uint128& b);
- uint128& operator-=(const uint128& b);
- uint128& operator*=(const uint128& b);
- // Long division/modulo for uint128.
- uint128& operator/=(const uint128& b);
- uint128& operator%=(const uint128& b);
- uint128 operator++(int);
- uint128 operator--(int);
- uint128& operator<<=(int);
- uint128& operator>>=(int);
- uint128& operator&=(const uint128& b);
- uint128& operator|=(const uint128& b);
- uint128& operator^=(const uint128& b);
- uint128& operator++();
- uint128& operator--();
-
- friend uint64_t Uint128Low64(const uint128& v);
- friend uint64_t Uint128High64(const uint128& v);
-
- // We add "std::" to avoid including all of port.h.
- PROTOBUF_EXPORT friend std::ostream& operator<<(std::ostream& o,
- const uint128& b);
-
- private:
- static void DivModImpl(uint128 dividend, uint128 divisor,
- uint128* quotient_ret, uint128* remainder_ret);
-
- // Little-endian memory order optimizations can benefit from
- // having lo_ first, hi_ last.
- // See util/endian/endian.h and Load128/Store128 for storing a uint128.
- uint64_t lo_;
- uint64_t hi_;
-
- // Not implemented, just declared for catching automatic type conversions.
- uint128(uint8_t);
- uint128(uint16_t);
- uint128(float v);
- uint128(double v);
-};
-
-// This is a POD form of uint128 which can be used for static variables which
-// need to be operated on as uint128.
-struct uint128_pod {
- // Note: The ordering of fields is different than 'class uint128' but the
- // same as its 2-arg constructor. This enables more obvious initialization
- // of static instances, which is the primary reason for this struct in the
- // first place. This does not seem to defeat any optimizations wrt
- // operations involving this struct.
- uint64_t hi;
- uint64_t lo;
-};
-
-PROTOBUF_EXPORT extern const uint128_pod kuint128max;
-
-// allow uint128 to be logged
-PROTOBUF_EXPORT extern std::ostream& operator<<(std::ostream& o,
- const uint128& b);
-
-// Methods to access low and high pieces of 128-bit value.
-// Defined externally from uint128 to facilitate conversion
-// to native 128-bit types when compilers support them.
-inline uint64_t Uint128Low64(const uint128& v) { return v.lo_; }
-inline uint64_t Uint128High64(const uint128& v) { return v.hi_; }
-
-// TODO: perhaps it would be nice to have int128, a signed 128-bit type?
-
-// --------------------------------------------------------------------------
-// Implementation details follow
-// --------------------------------------------------------------------------
-inline bool operator==(const uint128& lhs, const uint128& rhs) {
- return (Uint128Low64(lhs) == Uint128Low64(rhs) &&
- Uint128High64(lhs) == Uint128High64(rhs));
-}
-inline bool operator!=(const uint128& lhs, const uint128& rhs) {
- return !(lhs == rhs);
-}
-
-inline UINT128_CONSTEXPR uint128::uint128() : lo_(0), hi_(0) {}
-inline UINT128_CONSTEXPR uint128::uint128(uint64_t top, uint64_t bottom)
- : lo_(bottom), hi_(top) {}
-inline UINT128_CONSTEXPR uint128::uint128(const uint128_pod& v)
- : lo_(v.lo), hi_(v.hi) {}
-inline UINT128_CONSTEXPR uint128::uint128(uint64_t bottom)
- : lo_(bottom), hi_(0) {}
-#ifndef SWIG
-inline UINT128_CONSTEXPR uint128::uint128(uint32_t bottom)
- : lo_(bottom), hi_(0) {}
-inline UINT128_CONSTEXPR uint128::uint128(int bottom)
- : lo_(bottom), hi_(static_cast<int64_t>((bottom < 0) ? -1 : 0)) {}
-#endif
-
-#undef UINT128_CONSTEXPR
-
-inline void uint128::Initialize(uint64_t top, uint64_t bottom) {
- hi_ = top;
- lo_ = bottom;
-}
-
-// Comparison operators.
-
-#define CMP128(op) \
-inline bool operator op(const uint128& lhs, const uint128& rhs) { \
- return (Uint128High64(lhs) == Uint128High64(rhs)) ? \
- (Uint128Low64(lhs) op Uint128Low64(rhs)) : \
- (Uint128High64(lhs) op Uint128High64(rhs)); \
-}
-
-CMP128(<)
-CMP128(>)
-CMP128(>=)
-CMP128(<=)
-
-#undef CMP128
-
-// Unary operators
-
-inline uint128 operator-(const uint128& val) {
- const uint64_t hi_flip = ~Uint128High64(val);
- const uint64_t lo_flip = ~Uint128Low64(val);
- const uint64_t lo_add = lo_flip + 1;
- if (lo_add < lo_flip) {
- return uint128(hi_flip + 1, lo_add);
- }
- return uint128(hi_flip, lo_add);
-}
-
-inline bool operator!(const uint128& val) {
- return !Uint128High64(val) && !Uint128Low64(val);
-}
-
-// Logical operators.
-
-inline uint128 operator~(const uint128& val) {
- return uint128(~Uint128High64(val), ~Uint128Low64(val));
-}
-
-#define LOGIC128(op) \
-inline uint128 operator op(const uint128& lhs, const uint128& rhs) { \
- return uint128(Uint128High64(lhs) op Uint128High64(rhs), \
- Uint128Low64(lhs) op Uint128Low64(rhs)); \
-}
-
-LOGIC128(|)
-LOGIC128(&)
-LOGIC128(^)
-
-#undef LOGIC128
-
-#define LOGICASSIGN128(op) \
-inline uint128& uint128::operator op(const uint128& other) { \
- hi_ op other.hi_; \
- lo_ op other.lo_; \
- return *this; \
-}
-
-LOGICASSIGN128(|=)
-LOGICASSIGN128(&=)
-LOGICASSIGN128(^=)
-
-#undef LOGICASSIGN128
-
-// Shift operators.
-
-inline uint128 operator<<(const uint128& val, int amount) {
- // uint64 shifts of >= 64 are undefined, so we will need some special-casing.
- if (amount < 64) {
- if (amount == 0) {
- return val;
- }
- uint64_t new_hi = (Uint128High64(val) << amount) |
- (Uint128Low64(val) >> (64 - amount));
- uint64_t new_lo = Uint128Low64(val) << amount;
- return uint128(new_hi, new_lo);
- } else if (amount < 128) {
- return uint128(Uint128Low64(val) << (amount - 64), 0);
- } else {
- return uint128(0, 0);
- }
-}
-
-inline uint128 operator>>(const uint128& val, int amount) {
- // uint64 shifts of >= 64 are undefined, so we will need some special-casing.
- if (amount < 64) {
- if (amount == 0) {
- return val;
- }
- uint64_t new_hi = Uint128High64(val) >> amount;
- uint64_t new_lo = (Uint128Low64(val) >> amount) |
- (Uint128High64(val) << (64 - amount));
- return uint128(new_hi, new_lo);
- } else if (amount < 128) {
- return uint128(0, Uint128High64(val) >> (amount - 64));
- } else {
- return uint128(0, 0);
- }
-}
-
-inline uint128& uint128::operator<<=(int amount) {
- // uint64 shifts of >= 64 are undefined, so we will need some special-casing.
- if (amount < 64) {
- if (amount != 0) {
- hi_ = (hi_ << amount) | (lo_ >> (64 - amount));
- lo_ = lo_ << amount;
- }
- } else if (amount < 128) {
- hi_ = lo_ << (amount - 64);
- lo_ = 0;
- } else {
- hi_ = 0;
- lo_ = 0;
- }
- return *this;
-}
-
-inline uint128& uint128::operator>>=(int amount) {
- // uint64 shifts of >= 64 are undefined, so we will need some special-casing.
- if (amount < 64) {
- if (amount != 0) {
- lo_ = (lo_ >> amount) | (hi_ << (64 - amount));
- hi_ = hi_ >> amount;
- }
- } else if (amount < 128) {
- lo_ = hi_ >> (amount - 64);
- hi_ = 0;
- } else {
- lo_ = 0;
- hi_ = 0;
- }
- return *this;
-}
-
-inline uint128 operator+(const uint128& lhs, const uint128& rhs) {
- return uint128(lhs) += rhs;
-}
-
-inline uint128 operator-(const uint128& lhs, const uint128& rhs) {
- return uint128(lhs) -= rhs;
-}
-
-inline uint128 operator*(const uint128& lhs, const uint128& rhs) {
- return uint128(lhs) *= rhs;
-}
-
-inline uint128 operator/(const uint128& lhs, const uint128& rhs) {
- return uint128(lhs) /= rhs;
-}
-
-inline uint128 operator%(const uint128& lhs, const uint128& rhs) {
- return uint128(lhs) %= rhs;
-}
-
-inline uint128& uint128::operator+=(const uint128& b) {
- hi_ += b.hi_;
- uint64_t lolo = lo_ + b.lo_;
- if (lolo < lo_)
- ++hi_;
- lo_ = lolo;
- return *this;
-}
-
-inline uint128& uint128::operator-=(const uint128& b) {
- hi_ -= b.hi_;
- if (b.lo_ > lo_)
- --hi_;
- lo_ -= b.lo_;
- return *this;
-}
-
-inline uint128& uint128::operator*=(const uint128& b) {
- uint64_t a96 = hi_ >> 32;
- uint64_t a64 = hi_ & 0xffffffffu;
- uint64_t a32 = lo_ >> 32;
- uint64_t a00 = lo_ & 0xffffffffu;
- uint64_t b96 = b.hi_ >> 32;
- uint64_t b64 = b.hi_ & 0xffffffffu;
- uint64_t b32 = b.lo_ >> 32;
- uint64_t b00 = b.lo_ & 0xffffffffu;
- // multiply [a96 .. a00] x [b96 .. b00]
- // terms higher than c96 disappear off the high side
- // terms c96 and c64 are safe to ignore carry bit
- uint64_t c96 = a96 * b00 + a64 * b32 + a32 * b64 + a00 * b96;
- uint64_t c64 = a64 * b00 + a32 * b32 + a00 * b64;
- this->hi_ = (c96 << 32) + c64;
- this->lo_ = 0;
- // add terms after this one at a time to capture carry
- *this += uint128(a32 * b00) << 32;
- *this += uint128(a00 * b32) << 32;
- *this += a00 * b00;
- return *this;
-}
-
-inline uint128 uint128::operator++(int) {
- uint128 tmp(*this);
- *this += 1;
- return tmp;
-}
-
-inline uint128 uint128::operator--(int) {
- uint128 tmp(*this);
- *this -= 1;
- return tmp;
-}
-
-inline uint128& uint128::operator++() {
- *this += 1;
- return *this;
-}
-
-inline uint128& uint128::operator--() {
- *this -= 1;
- return *this;
-}
-
-} // namespace protobuf
-} // namespace google
-
-#include <google/protobuf/port_undef.inc>
-
-#endif // GOOGLE_PROTOBUF_STUBS_INT128_H_
diff --git a/src/google/protobuf/stubs/int128_unittest.cc b/src/google/protobuf/stubs/int128_unittest.cc
deleted file mode 100644
index b1634f0..0000000
--- a/src/google/protobuf/stubs/int128_unittest.cc
+++ /dev/null
@@ -1,511 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#include <google/protobuf/stubs/int128.h>
-
-#include <algorithm>
-#include <sstream>
-#include <utility>
-
-#include <google/protobuf/testing/googletest.h>
-#include <gtest/gtest.h>
-
-#include <google/protobuf/port_def.inc>
-
-namespace google {
-namespace protobuf {
-
-TEST(Int128, AllTests) {
- uint128 zero(0);
- uint128 one(1);
- uint128 one_2arg(0, 1);
- uint128 two(0, 2);
- uint128 three(0, 3);
- uint128 big(2000, 2);
- uint128 big_minus_one(2000, 1);
- uint128 bigger(2001, 1);
- uint128 biggest(kuint128max);
- uint128 high_low(1, 0);
- uint128 low_high(0, std::numeric_limits<uint64_t>::max());
- EXPECT_LT(one, two);
- EXPECT_GT(two, one);
- EXPECT_LT(one, big);
- EXPECT_LT(one, big);
- EXPECT_EQ(one, one_2arg);
- EXPECT_NE(one, two);
- EXPECT_GT(big, one);
- EXPECT_GE(big, two);
- EXPECT_GE(big, big_minus_one);
- EXPECT_GT(big, big_minus_one);
- EXPECT_LT(big_minus_one, big);
- EXPECT_LE(big_minus_one, big);
- EXPECT_NE(big_minus_one, big);
- EXPECT_LT(big, biggest);
- EXPECT_LE(big, biggest);
- EXPECT_GT(biggest, big);
- EXPECT_GE(biggest, big);
- EXPECT_EQ(big, ~~big);
- EXPECT_EQ(one, one | one);
- EXPECT_EQ(big, big | big);
- EXPECT_EQ(one, one | zero);
- EXPECT_EQ(one, one & one);
- EXPECT_EQ(big, big & big);
- EXPECT_EQ(zero, one & zero);
- EXPECT_EQ(zero, big & ~big);
- EXPECT_EQ(zero, one ^ one);
- EXPECT_EQ(zero, big ^ big);
- EXPECT_EQ(one, one ^ zero);
-
- // Shift operators.
- EXPECT_EQ(big, big << 0);
- EXPECT_EQ(big, big >> 0);
- EXPECT_GT(big << 1, big);
- EXPECT_LT(big >> 1, big);
- EXPECT_EQ(big, (big << 10) >> 10);
- EXPECT_EQ(big, (big >> 1) << 1);
- EXPECT_EQ(one, (one << 80) >> 80);
- EXPECT_EQ(zero, (one >> 80) << 80);
- EXPECT_EQ(zero, big >> 128);
- EXPECT_EQ(zero, big << 128);
-
- // Shift assignments.
- uint128 big_copy = big;
- EXPECT_EQ(big << 0, big_copy <<= 0);
- big_copy = big;
- EXPECT_EQ(big >> 0, big_copy >>= 0);
- big_copy = big;
- EXPECT_EQ(big << 1, big_copy <<= 1);
- big_copy = big;
- EXPECT_EQ(big >> 1, big_copy >>= 1);
- big_copy = big;
- EXPECT_EQ(big << 10, big_copy <<= 10);
- big_copy = big;
- EXPECT_EQ(big >> 10, big_copy >>= 10);
- big_copy = big;
- EXPECT_EQ(big << 64, big_copy <<= 64);
- big_copy = big;
- EXPECT_EQ(big >> 64, big_copy >>= 64);
- big_copy = big;
- EXPECT_EQ(big << 73, big_copy <<= 73);
- big_copy = big;
- EXPECT_EQ(big >> 73, big_copy >>= 73);
- big_copy = big;
- EXPECT_EQ(big << 128, big_copy <<= 128);
- big_copy = big;
- EXPECT_EQ(big >> 128, big_copy >>= 128);
-
- EXPECT_EQ(Uint128High64(biggest), std::numeric_limits<uint64_t>::max());
- EXPECT_EQ(Uint128Low64(biggest), std::numeric_limits<uint64_t>::max());
- EXPECT_EQ(zero + one, one);
- EXPECT_EQ(one + one, two);
- EXPECT_EQ(big_minus_one + one, big);
- EXPECT_EQ(one - one, zero);
- EXPECT_EQ(one - zero, one);
- EXPECT_EQ(zero - one, biggest);
- EXPECT_EQ(big - big, zero);
- EXPECT_EQ(big - one, big_minus_one);
- EXPECT_EQ(big + std::numeric_limits<uint64_t>::max(), bigger);
- EXPECT_EQ(biggest + 1, zero);
- EXPECT_EQ(zero - 1, biggest);
- EXPECT_EQ(high_low - one, low_high);
- EXPECT_EQ(low_high + one, high_low);
- EXPECT_EQ(Uint128High64((uint128(1) << 64) - 1), 0);
- EXPECT_EQ(Uint128Low64((uint128(1) << 64) - 1), std::numeric_limits<uint64_t>::max());
- EXPECT_TRUE(!!one);
- EXPECT_TRUE(!!high_low);
- EXPECT_FALSE(!!zero);
- EXPECT_FALSE(!one);
- EXPECT_FALSE(!high_low);
- EXPECT_TRUE(!zero);
- EXPECT_TRUE(zero == 0);
- EXPECT_FALSE(zero != 0);
- EXPECT_FALSE(one == 0);
- EXPECT_TRUE(one != 0);
-
- uint128 test = zero;
- EXPECT_EQ(++test, one);
- EXPECT_EQ(test, one);
- EXPECT_EQ(test++, one);
- EXPECT_EQ(test, two);
- EXPECT_EQ(test -= 2, zero);
- EXPECT_EQ(test, zero);
- EXPECT_EQ(test += 2, two);
- EXPECT_EQ(test, two);
- EXPECT_EQ(--test, one);
- EXPECT_EQ(test, one);
- EXPECT_EQ(test--, one);
- EXPECT_EQ(test, zero);
- EXPECT_EQ(test |= three, three);
- EXPECT_EQ(test &= one, one);
- EXPECT_EQ(test ^= three, two);
- EXPECT_EQ(test >>= 1, one);
- EXPECT_EQ(test <<= 1, two);
-
- EXPECT_EQ(big, -(-big));
- EXPECT_EQ(two, -((-one) - 1));
- EXPECT_EQ(kuint128max, -one);
- EXPECT_EQ(zero, -zero);
-
- GOOGLE_LOG(INFO) << one;
- GOOGLE_LOG(INFO) << big_minus_one;
-}
-
-TEST(Int128, PodTests) {
- uint128_pod pod = { 12345, 67890 };
- uint128 from_pod(pod);
- EXPECT_EQ(12345, Uint128High64(from_pod));
- EXPECT_EQ(67890, Uint128Low64(from_pod));
-
- uint128 zero(0);
- uint128_pod zero_pod = {0, 0};
- uint128 one(1);
- uint128_pod one_pod = {0, 1};
- uint128 two(2);
- uint128_pod two_pod = {0, 2};
- uint128 three(3);
- uint128_pod three_pod = {0, 3};
- uint128 big(1, 0);
- uint128_pod big_pod = {1, 0};
-
- EXPECT_EQ(zero, zero_pod);
- EXPECT_EQ(zero_pod, zero);
- EXPECT_EQ(zero_pod, zero_pod);
- EXPECT_EQ(one, one_pod);
- EXPECT_EQ(one_pod, one);
- EXPECT_EQ(one_pod, one_pod);
- EXPECT_EQ(two, two_pod);
- EXPECT_EQ(two_pod, two);
- EXPECT_EQ(two_pod, two_pod);
-
- EXPECT_NE(one, two_pod);
- EXPECT_NE(one_pod, two);
- EXPECT_NE(one_pod, two_pod);
-
- EXPECT_LT(one, two_pod);
- EXPECT_LT(one_pod, two);
- EXPECT_LT(one_pod, two_pod);
- EXPECT_LE(one, one_pod);
- EXPECT_LE(one_pod, one);
- EXPECT_LE(one_pod, one_pod);
- EXPECT_LE(one, two_pod);
- EXPECT_LE(one_pod, two);
- EXPECT_LE(one_pod, two_pod);
-
- EXPECT_GT(two, one_pod);
- EXPECT_GT(two_pod, one);
- EXPECT_GT(two_pod, one_pod);
- EXPECT_GE(two, two_pod);
- EXPECT_GE(two_pod, two);
- EXPECT_GE(two_pod, two_pod);
- EXPECT_GE(two, one_pod);
- EXPECT_GE(two_pod, one);
- EXPECT_GE(two_pod, one_pod);
-
- EXPECT_EQ(three, one | two_pod);
- EXPECT_EQ(three, one_pod | two);
- EXPECT_EQ(three, one_pod | two_pod);
- EXPECT_EQ(one, three & one_pod);
- EXPECT_EQ(one, three_pod & one);
- EXPECT_EQ(one, three_pod & one_pod);
- EXPECT_EQ(two, three ^ one_pod);
- EXPECT_EQ(two, three_pod ^ one);
- EXPECT_EQ(two, three_pod ^ one_pod);
- EXPECT_EQ(two, three & (~one));
- EXPECT_EQ(three, ~~three);
-
- EXPECT_EQ(two, two_pod << 0);
- EXPECT_EQ(two, one_pod << 1);
- EXPECT_EQ(big, one_pod << 64);
- EXPECT_EQ(zero, one_pod << 128);
- EXPECT_EQ(two, two_pod >> 0);
- EXPECT_EQ(one, two_pod >> 1);
- EXPECT_EQ(one, big_pod >> 64);
-
- EXPECT_EQ(one, zero + one_pod);
- EXPECT_EQ(one, zero_pod + one);
- EXPECT_EQ(one, zero_pod + one_pod);
- EXPECT_EQ(one, two - one_pod);
- EXPECT_EQ(one, two_pod - one);
- EXPECT_EQ(one, two_pod - one_pod);
-}
-
-TEST(Int128, OperatorAssignReturnRef) {
- uint128 v(1);
- (v += 4) -= 3;
- EXPECT_EQ(2, v);
-}
-
-TEST(Int128, Multiply) {
- uint128 a, b, c;
-
- // Zero test.
- a = 0;
- b = 0;
- c = a * b;
- EXPECT_EQ(0, c);
-
- // Max carries.
- a = uint128(0) - 1;
- b = uint128(0) - 1;
- c = a * b;
- EXPECT_EQ(1, c);
-
- // Self-operation with max carries.
- c = uint128(0) - 1;
- c *= c;
- EXPECT_EQ(1, c);
-
- // 1-bit x 1-bit.
- for (int i = 0; i < 64; ++i) {
- for (int j = 0; j < 64; ++j) {
- a = uint128(1) << i;
- b = uint128(1) << j;
- c = a * b;
- EXPECT_EQ(uint128(1) << (i+j), c);
- }
- }
-
- // Verified with dc.
- a = uint128(uint64_t{0xffffeeeeddddccccu}, uint64_t{0xbbbbaaaa99998888u});
- b = uint128(uint64_t{0x7777666655554444u}, uint64_t{0x3333222211110000u});
- c = a * b;
- EXPECT_EQ(
- uint128(uint64_t{0x530EDA741C71D4C3u}, uint64_t{0xBF25975319080000u}), c);
- EXPECT_EQ(0, c - b * a);
- EXPECT_EQ(a * a - b * b, (a + b) * (a - b));
-
- // Verified with dc.
- a = uint128(uint64_t{0x0123456789abcdefu}, uint64_t{0xfedcba9876543210u});
- b = uint128(uint64_t{0x02468ace13579bdfu}, uint64_t{0xfdb97531eca86420u});
- c = a * b;
- EXPECT_EQ(
- uint128(uint64_t{0x97a87f4f261ba3f2u}, uint64_t{0x342d0bbf48948200u}), c);
- EXPECT_EQ(0, c - b * a);
- EXPECT_EQ(a*a - b*b, (a+b) * (a-b));
-}
-
-TEST(Int128, AliasTests) {
- uint128 x1(1, 2);
- uint128 x2(2, 4);
- x1 += x1;
- EXPECT_EQ(x2, x1);
-
- uint128 x3(1, static_cast<uint64_t>(1) << 63);
- uint128 x4(3, 0);
- x3 += x3;
- EXPECT_EQ(x4, x3);
-}
-
-#ifdef PROTOBUF_HAS_DEATH_TEST
-TEST(Int128, DivideByZeroCheckFails) {
- uint128 a = 0;
- uint128 b = 0;
- EXPECT_DEATH(a / b, "Division or mod by zero:");
- a = 123;
- EXPECT_DEATH(a / b, "Division or mod by zero:");
-}
-
-TEST(Int128, ModByZeroCheckFails) {
- uint128 a = 0;
- uint128 b = 0;
- EXPECT_DEATH(a % b, "Division or mod by zero:");
- a = 123;
- EXPECT_DEATH(a % b, "Division or mod by zero:");
-}
-#endif // PROTOBUF_HAS_DEATH_TEST
-
-TEST(Int128, DivideAndMod) {
- // a := q * b + r
- uint128 a, b, q, r;
-
- // Zero test.
- a = 0;
- b = 123;
- q = a / b;
- r = a % b;
- EXPECT_EQ(0, q);
- EXPECT_EQ(0, r);
-
- a = uint128(uint64_t{0x530eda741c71d4c3u}, uint64_t{0xbf25975319080000u});
- q = uint128(uint64_t{0x4de2cab081u}, uint64_t{0x14c34ab4676e4babu});
- b = uint128(0x1110001);
- r = uint128(0x3eb455);
- ASSERT_EQ(a, q * b + r); // Sanity-check.
-
- uint128 result_q, result_r;
- result_q = a / b;
- result_r = a % b;
- EXPECT_EQ(q, result_q);
- EXPECT_EQ(r, result_r);
-
- // Try the other way around.
- std::swap(q, b);
- result_q = a / b;
- result_r = a % b;
- EXPECT_EQ(q, result_q);
- EXPECT_EQ(r, result_r);
- // Restore.
- std::swap(b, q);
-
- // Dividend < divisor; result should be q:0 r:<dividend>.
- std::swap(a, b);
- result_q = a / b;
- result_r = a % b;
- EXPECT_EQ(0, result_q);
- EXPECT_EQ(a, result_r);
- // Try the other way around.
- std::swap(a, q);
- result_q = a / b;
- result_r = a % b;
- EXPECT_EQ(0, result_q);
- EXPECT_EQ(a, result_r);
- // Restore.
- std::swap(q, a);
- std::swap(b, a);
-
- // Try a large remainder.
- b = a / 2 + 1;
- uint128 expected_r(uint64_t{0x29876d3a0e38ea61u},
- uint64_t{0xdf92cba98c83ffffu});
- // Sanity checks.
- ASSERT_EQ(a / 2 - 1, expected_r);
- ASSERT_EQ(a, b + expected_r);
- result_q = a / b;
- result_r = a % b;
- EXPECT_EQ(1, result_q);
- EXPECT_EQ(expected_r, result_r);
-}
-
-static uint64_t RandomUint64() {
- uint64_t v1 = rand();
- uint64_t v2 = rand();
- uint64_t v3 = rand();
- return v1 * v2 + v3;
-}
-
-TEST(Int128, DivideAndModRandomInputs) {
- const int kNumIters = 1 << 18;
- for (int i = 0; i < kNumIters; ++i) {
- const uint128 a(RandomUint64(), RandomUint64());
- const uint128 b(RandomUint64(), RandomUint64());
- if (b == 0) {
- continue; // Avoid a div-by-zero.
- }
- const uint128 q = a / b;
- const uint128 r = a % b;
- ASSERT_EQ(a, b * q + r);
- }
-}
-
-#ifdef GOOGLE_PROTOBUF_HAS_CONSTEXPR
-TEST(Int128, ConstexprTest) {
- constexpr uint128 zero;
- constexpr uint128 one = 1;
- constexpr uint128_pod pod = {2, 3};
- constexpr uint128 from_pod = pod;
- constexpr uint128 minus_two = -2;
- EXPECT_EQ(one, uint128(1));
- EXPECT_EQ(from_pod, uint128(2, 3));
- EXPECT_EQ(minus_two, uint128(-1ULL, -2ULL));
-}
-
-TEST(Int128, Traits) {
- EXPECT_TRUE(std::is_trivially_copy_constructible<uint128>::value);
- EXPECT_TRUE(std::is_trivially_copy_assignable<uint128>::value);
- EXPECT_TRUE(std::is_trivially_destructible<uint128>::value);
-}
-#endif // GOOGLE_PROTOBUF_HAS_CONSTEXPR
-
-TEST(Int128, OStream) {
- struct {
- uint128 val;
- std::ios_base::fmtflags flags;
- std::streamsize width;
- char fill;
- const char* rep;
- } cases[] = {
- // zero with different bases
- {uint128(0), std::ios::dec, 0, '_', "0"},
- {uint128(0), std::ios::oct, 0, '_', "0"},
- {uint128(0), std::ios::hex, 0, '_', "0"},
- // crossover between lo_ and hi_
- {uint128(0, -1), std::ios::dec, 0, '_', "18446744073709551615"},
- {uint128(0, -1), std::ios::oct, 0, '_', "1777777777777777777777"},
- {uint128(0, -1), std::ios::hex, 0, '_', "ffffffffffffffff"},
- {uint128(1, 0), std::ios::dec, 0, '_', "18446744073709551616"},
- {uint128(1, 0), std::ios::oct, 0, '_', "2000000000000000000000"},
- {uint128(1, 0), std::ios::hex, 0, '_', "10000000000000000"},
- // just the top bit
- {uint128(uint64_t{0x8000000000000000u}, 0), std::ios::dec, 0, '_',
- "170141183460469231731687303715884105728"},
- {uint128(uint64_t{0x8000000000000000u}, 0), std::ios::oct, 0, '_',
- "2000000000000000000000000000000000000000000"},
- {uint128(uint64_t{0x8000000000000000u}, 0), std::ios::hex, 0, '_',
- "80000000000000000000000000000000"},
- // maximum uint128 value
- {uint128(-1, -1), std::ios::dec, 0, '_',
- "340282366920938463463374607431768211455"},
- {uint128(-1, -1), std::ios::oct, 0, '_',
- "3777777777777777777777777777777777777777777"},
- {uint128(-1, -1), std::ios::hex, 0, '_',
- "ffffffffffffffffffffffffffffffff"},
- // uppercase
- {uint128(-1, -1), std::ios::hex | std::ios::uppercase, 0, '_',
- "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"},
- // showbase
- {uint128(1), std::ios::dec | std::ios::showbase, 0, '_', "1"},
- {uint128(1), std::ios::oct | std::ios::showbase, 0, '_', "01"},
- {uint128(1), std::ios::hex | std::ios::showbase, 0, '_', "0x1"},
- // showbase does nothing on zero
- {uint128(0), std::ios::dec | std::ios::showbase, 0, '_', "0"},
- {uint128(0), std::ios::oct | std::ios::showbase, 0, '_', "0"},
- {uint128(0), std::ios::hex | std::ios::showbase, 0, '_', "0"},
- // showpos does nothing on unsigned types
- {uint128(1), std::ios::dec | std::ios::showpos, 0, '_', "1"},
- // padding
- {uint128(9), std::ios::dec, 6, '_', "_____9"},
- {uint128(12345), std::ios::dec, 6, '_', "_12345"},
- // left adjustment
- {uint128(9), std::ios::dec | std::ios::left, 6, '_', "9_____"},
- {uint128(12345), std::ios::dec | std::ios::left, 6, '_', "12345_"},
- };
- for (size_t i = 0; i < GOOGLE_ARRAYSIZE(cases); ++i) {
- std::ostringstream os;
- os.flags(cases[i].flags);
- os.width(cases[i].width);
- os.fill(cases[i].fill);
- os << cases[i].val;
- EXPECT_EQ(cases[i].rep, os.str());
- }
-}
-} // namespace protobuf
-} // namespace google
-
-#include <google/protobuf/port_undef.inc>
diff --git a/src/google/protobuf/stubs/logging.h b/src/google/protobuf/stubs/logging.h
index 8ecc2fa..004c557 100644
--- a/src/google/protobuf/stubs/logging.h
+++ b/src/google/protobuf/stubs/logging.h
@@ -31,12 +31,12 @@
#ifndef GOOGLE_PROTOBUF_STUBS_LOGGING_H_
#define GOOGLE_PROTOBUF_STUBS_LOGGING_H_
-#include <google/protobuf/stubs/macros.h>
-#include <google/protobuf/stubs/port.h>
-#include <google/protobuf/stubs/status.h>
-#include <google/protobuf/stubs/stringpiece.h>
+#include "absl/status/status.h"
+#include "absl/strings/string_view.h"
+#include "google/protobuf/stubs/port.h"
-#include <google/protobuf/port_def.inc>
+// Must be last.
+#include "google/protobuf/port_def.inc" // NOLINT
// ===================================================================
// emulates google3/base/logging.h
@@ -86,8 +86,8 @@
LogMessage& operator<<(unsigned long long value);
LogMessage& operator<<(double value);
LogMessage& operator<<(void* value);
- LogMessage& operator<<(const StringPiece& value);
- LogMessage& operator<<(const util::Status& status);
+ LogMessage& operator<<(absl::string_view value);
+ LogMessage& operator<<(const absl::Status& status);
LogMessage& operator<<(const uint128& value);
private:
@@ -234,6 +234,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc" // NOLINT
#endif // GOOGLE_PROTOBUF_STUBS_LOGGING_H_
diff --git a/src/google/protobuf/stubs/macros.h b/src/google/protobuf/stubs/macros.h
deleted file mode 100644
index ae9a8b9..0000000
--- a/src/google/protobuf/stubs/macros.h
+++ /dev/null
@@ -1,93 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#ifndef GOOGLE_PROTOBUF_MACROS_H__
-#define GOOGLE_PROTOBUF_MACROS_H__
-
-namespace google {
-namespace protobuf {
-
-#undef GOOGLE_DISALLOW_EVIL_CONSTRUCTORS
-#define GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TypeName) \
- TypeName(const TypeName&) = delete; \
- void operator=(const TypeName&) = delete
-
-#undef GOOGLE_DISALLOW_IMPLICIT_CONSTRUCTORS
-#define GOOGLE_DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName) \
- TypeName() = delete; \
- TypeName(const TypeName&) = delete; \
- void operator=(const TypeName&) = delete
-
-// ===================================================================
-// from google3/base/basictypes.h
-
-// The GOOGLE_ARRAYSIZE(arr) macro returns the # of elements in an array arr.
-// The expression is a compile-time constant, and therefore can be
-// used in defining new arrays, for example.
-//
-// GOOGLE_ARRAYSIZE catches a few type errors. If you see a compiler error
-//
-// "warning: division by zero in ..."
-//
-// when using GOOGLE_ARRAYSIZE, you are (wrongfully) giving it a pointer.
-// You should only use GOOGLE_ARRAYSIZE on statically allocated arrays.
-//
-// The following comments are on the implementation details, and can
-// be ignored by the users.
-//
-// ARRAYSIZE(arr) works by inspecting sizeof(arr) (the # of bytes in
-// the array) and sizeof(*(arr)) (the # of bytes in one array
-// element). If the former is divisible by the latter, perhaps arr is
-// indeed an array, in which case the division result is the # of
-// elements in the array. Otherwise, arr cannot possibly be an array,
-// and we generate a compiler error to prevent the code from
-// compiling.
-//
-// Since the size of bool is implementation-defined, we need to cast
-// !(sizeof(a) & sizeof(*(a))) to size_t in order to ensure the final
-// result has type size_t.
-//
-// This macro is not perfect as it wrongfully accepts certain
-// pointers, namely where the pointer size is divisible by the pointee
-// size. Since all our code has to go through a 32-bit compiler,
-// where a pointer is 4 bytes, this means all pointers to a type whose
-// size is 3 or greater than 4 will be (righteously) rejected.
-//
-// Kudos to Jorg Brown for this simple and elegant implementation.
-
-#undef GOOGLE_ARRAYSIZE
-#define GOOGLE_ARRAYSIZE(a) \
- ((sizeof(a) / sizeof(*(a))) / \
- static_cast<size_t>(!(sizeof(a) % sizeof(*(a)))))
-
-} // namespace protobuf
-} // namespace google
-
-#endif // GOOGLE_PROTOBUF_MACROS_H__
diff --git a/src/google/protobuf/stubs/map_util.h b/src/google/protobuf/stubs/map_util.h
deleted file mode 100644
index 24e098a..0000000
--- a/src/google/protobuf/stubs/map_util.h
+++ /dev/null
@@ -1,769 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2014 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// from google3/util/gtl/map_util.h
-// Author: Anton Carver
-
-#ifndef GOOGLE_PROTOBUF_STUBS_MAP_UTIL_H__
-#define GOOGLE_PROTOBUF_STUBS_MAP_UTIL_H__
-
-#include <stddef.h>
-#include <iterator>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include <google/protobuf/stubs/common.h>
-
-namespace google {
-namespace protobuf {
-namespace internal {
-// Local implementation of RemoveConst to avoid including base/type_traits.h.
-template <class T> struct RemoveConst { typedef T type; };
-template <class T> struct RemoveConst<const T> : RemoveConst<T> {};
-} // namespace internal
-
-//
-// Find*()
-//
-
-// Returns a const reference to the value associated with the given key if it
-// exists. Crashes otherwise.
-//
-// This is intended as a replacement for operator[] as an rvalue (for reading)
-// when the key is guaranteed to exist.
-//
-// operator[] for lookup is discouraged for several reasons:
-// * It has a side-effect of inserting missing keys
-// * It is not thread-safe (even when it is not inserting, it can still
-// choose to resize the underlying storage)
-// * It invalidates iterators (when it chooses to resize)
-// * It default constructs a value object even if it doesn't need to
-//
-// This version assumes the key is printable, and includes it in the fatal log
-// message.
-template <class Collection>
-const typename Collection::value_type::second_type&
-FindOrDie(const Collection& collection,
- const typename Collection::value_type::first_type& key) {
- typename Collection::const_iterator it = collection.find(key);
- GOOGLE_CHECK(it != collection.end()) << "Map key not found: " << key;
- return it->second;
-}
-
-// Same as above, but returns a non-const reference.
-template <class Collection>
-typename Collection::value_type::second_type&
-FindOrDie(Collection& collection, // NOLINT
- const typename Collection::value_type::first_type& key) {
- typename Collection::iterator it = collection.find(key);
- GOOGLE_CHECK(it != collection.end()) << "Map key not found: " << key;
- return it->second;
-}
-
-// Same as FindOrDie above, but doesn't log the key on failure.
-template <class Collection>
-const typename Collection::value_type::second_type&
-FindOrDieNoPrint(const Collection& collection,
- const typename Collection::value_type::first_type& key) {
- typename Collection::const_iterator it = collection.find(key);
- GOOGLE_CHECK(it != collection.end()) << "Map key not found";
- return it->second;
-}
-
-// Same as above, but returns a non-const reference.
-template <class Collection>
-typename Collection::value_type::second_type&
-FindOrDieNoPrint(Collection& collection, // NOLINT
- const typename Collection::value_type::first_type& key) {
- typename Collection::iterator it = collection.find(key);
- GOOGLE_CHECK(it != collection.end()) << "Map key not found";
- return it->second;
-}
-
-// Returns a const reference to the value associated with the given key if it
-// exists, otherwise returns a const reference to the provided default value.
-//
-// WARNING: If a temporary object is passed as the default "value,"
-// this function will return a reference to that temporary object,
-// which will be destroyed at the end of the statement. A common
-// example: if you have a map with string values, and you pass a char*
-// as the default "value," either use the returned value immediately
-// or store it in a string (not string&).
-// Details: http://go/findwithdefault
-template <class Collection>
-const typename Collection::value_type::second_type&
-FindWithDefault(const Collection& collection,
- const typename Collection::value_type::first_type& key,
- const typename Collection::value_type::second_type& value) {
- typename Collection::const_iterator it = collection.find(key);
- if (it == collection.end()) {
- return value;
- }
- return it->second;
-}
-
-// Returns a pointer to the const value associated with the given key if it
-// exists, or nullptr otherwise.
-template <class Collection>
-const typename Collection::value_type::second_type*
-FindOrNull(const Collection& collection,
- const typename Collection::value_type::first_type& key) {
- typename Collection::const_iterator it = collection.find(key);
- if (it == collection.end()) {
- return 0;
- }
- return &it->second;
-}
-
-// Same as above but returns a pointer to the non-const value.
-template <class Collection>
-typename Collection::value_type::second_type*
-FindOrNull(Collection& collection, // NOLINT
- const typename Collection::value_type::first_type& key) {
- typename Collection::iterator it = collection.find(key);
- if (it == collection.end()) {
- return 0;
- }
- return &it->second;
-}
-
-// Returns the pointer value associated with the given key. If none is found,
-// nullptr is returned. The function is designed to be used with a map of keys to
-// pointers.
-//
-// This function does not distinguish between a missing key and a key mapped
-// to nullptr.
-template <class Collection>
-typename Collection::value_type::second_type
-FindPtrOrNull(const Collection& collection,
- const typename Collection::value_type::first_type& key) {
- typename Collection::const_iterator it = collection.find(key);
- if (it == collection.end()) {
- return typename Collection::value_type::second_type();
- }
- return it->second;
-}
-
-// Same as above, except takes non-const reference to collection.
-//
-// This function is needed for containers that propagate constness to the
-// pointee, such as boost::ptr_map.
-template <class Collection>
-typename Collection::value_type::second_type
-FindPtrOrNull(Collection& collection, // NOLINT
- const typename Collection::value_type::first_type& key) {
- typename Collection::iterator it = collection.find(key);
- if (it == collection.end()) {
- return typename Collection::value_type::second_type();
- }
- return it->second;
-}
-
-// Finds the pointer value associated with the given key in a map whose values
-// are linked_ptrs. Returns nullptr if key is not found.
-template <class Collection>
-typename Collection::value_type::second_type::element_type*
-FindLinkedPtrOrNull(const Collection& collection,
- const typename Collection::value_type::first_type& key) {
- typename Collection::const_iterator it = collection.find(key);
- if (it == collection.end()) {
- return 0;
- }
- // Since linked_ptr::get() is a const member returning a non const,
- // we do not need a version of this function taking a non const collection.
- return it->second.get();
-}
-
-// Same as above, but dies if the key is not found.
-template <class Collection>
-typename Collection::value_type::second_type::element_type&
-FindLinkedPtrOrDie(const Collection& collection,
- const typename Collection::value_type::first_type& key) {
- typename Collection::const_iterator it = collection.find(key);
- GOOGLE_CHECK(it != collection.end()) << "key not found: " << key;
- // Since linked_ptr::operator*() is a const member returning a non const,
- // we do not need a version of this function taking a non const collection.
- return *it->second;
-}
-
-// Finds the value associated with the given key and copies it to *value (if not
-// nullptr). Returns false if the key was not found, true otherwise.
-template <class Collection, class Key, class Value>
-bool FindCopy(const Collection& collection,
- const Key& key,
- Value* const value) {
- typename Collection::const_iterator it = collection.find(key);
- if (it == collection.end()) {
- return false;
- }
- if (value) {
- *value = it->second;
- }
- return true;
-}
-
-//
-// Contains*()
-//
-
-// Returns true if and only if the given collection contains the given key.
-template <class Collection, class Key>
-bool ContainsKey(const Collection& collection, const Key& key) {
- return collection.find(key) != collection.end();
-}
-
-// Returns true if and only if the given collection contains the given key-value
-// pair.
-template <class Collection, class Key, class Value>
-bool ContainsKeyValuePair(const Collection& collection,
- const Key& key,
- const Value& value) {
- typedef typename Collection::const_iterator const_iterator;
- std::pair<const_iterator, const_iterator> range = collection.equal_range(key);
- for (const_iterator it = range.first; it != range.second; ++it) {
- if (it->second == value) {
- return true;
- }
- }
- return false;
-}
-
-//
-// Insert*()
-//
-
-// Inserts the given key-value pair into the collection. Returns true if and
-// only if the key from the given pair didn't previously exist. Otherwise, the
-// value in the map is replaced with the value from the given pair.
-template <class Collection>
-bool InsertOrUpdate(Collection* const collection,
- const typename Collection::value_type& vt) {
- std::pair<typename Collection::iterator, bool> ret = collection->insert(vt);
- if (!ret.second) {
- // update
- ret.first->second = vt.second;
- return false;
- }
- return true;
-}
-
-// Same as above, except that the key and value are passed separately.
-template <class Collection>
-bool InsertOrUpdate(Collection* const collection,
- const typename Collection::value_type::first_type& key,
- const typename Collection::value_type::second_type& value) {
- return InsertOrUpdate(
- collection, typename Collection::value_type(key, value));
-}
-
-// Inserts/updates all the key-value pairs from the range defined by the
-// iterators "first" and "last" into the given collection.
-template <class Collection, class InputIterator>
-void InsertOrUpdateMany(Collection* const collection,
- InputIterator first, InputIterator last) {
- for (; first != last; ++first) {
- InsertOrUpdate(collection, *first);
- }
-}
-
-// Change the value associated with a particular key in a map or hash_map
-// of the form map<Key, Value*> which owns the objects pointed to by the
-// value pointers. If there was an existing value for the key, it is deleted.
-// True indicates an insert took place, false indicates an update + delete.
-template <class Collection>
-bool InsertAndDeleteExisting(
- Collection* const collection,
- const typename Collection::value_type::first_type& key,
- const typename Collection::value_type::second_type& value) {
- std::pair<typename Collection::iterator, bool> ret =
- collection->insert(typename Collection::value_type(key, value));
- if (!ret.second) {
- delete ret.first->second;
- ret.first->second = value;
- return false;
- }
- return true;
-}
-
-// Inserts the given key and value into the given collection if and only if the
-// given key did NOT already exist in the collection. If the key previously
-// existed in the collection, the value is not changed. Returns true if the
-// key-value pair was inserted; returns false if the key was already present.
-template <class Collection>
-bool InsertIfNotPresent(Collection* const collection,
- const typename Collection::value_type& vt) {
- return collection->insert(vt).second;
-}
-
-// Same as above except the key and value are passed separately.
-template <class Collection>
-bool InsertIfNotPresent(
- Collection* const collection,
- const typename Collection::value_type::first_type& key,
- const typename Collection::value_type::second_type& value) {
- return InsertIfNotPresent(
- collection, typename Collection::value_type(key, value));
-}
-
-// Same as above except dies if the key already exists in the collection.
-template <class Collection>
-void InsertOrDie(Collection* const collection,
- const typename Collection::value_type& value) {
- GOOGLE_CHECK(InsertIfNotPresent(collection, value))
- << "duplicate value: " << value;
-}
-
-// Same as above except doesn't log the value on error.
-template <class Collection>
-void InsertOrDieNoPrint(Collection* const collection,
- const typename Collection::value_type& value) {
- GOOGLE_CHECK(InsertIfNotPresent(collection, value)) << "duplicate value.";
-}
-
-// Inserts the key-value pair into the collection. Dies if key was already
-// present.
-template <class Collection>
-void InsertOrDie(Collection* const collection,
- const typename Collection::value_type::first_type& key,
- const typename Collection::value_type::second_type& data) {
- GOOGLE_CHECK(InsertIfNotPresent(collection, key, data))
- << "duplicate key: " << key;
-}
-
-// Same as above except doesn't log the key on error.
-template <class Collection>
-void InsertOrDieNoPrint(
- Collection* const collection,
- const typename Collection::value_type::first_type& key,
- const typename Collection::value_type::second_type& data) {
- GOOGLE_CHECK(InsertIfNotPresent(collection, key, data)) << "duplicate key.";
-}
-
-// Inserts a new key and default-initialized value. Dies if the key was already
-// present. Returns a reference to the value. Example usage:
-//
-// map<int, SomeProto> m;
-// SomeProto& proto = InsertKeyOrDie(&m, 3);
-// proto.set_field("foo");
-template <class Collection>
-typename Collection::value_type::second_type& InsertKeyOrDie(
- Collection* const collection,
- const typename Collection::value_type::first_type& key) {
- typedef typename Collection::value_type value_type;
- std::pair<typename Collection::iterator, bool> res =
- collection->insert(value_type(key, typename value_type::second_type()));
- GOOGLE_CHECK(res.second) << "duplicate key: " << key;
- return res.first->second;
-}
-
-//
-// Lookup*()
-//
-
-// Looks up a given key and value pair in a collection and inserts the key-value
-// pair if it's not already present. Returns a reference to the value associated
-// with the key.
-template <class Collection>
-typename Collection::value_type::second_type&
-LookupOrInsert(Collection* const collection,
- const typename Collection::value_type& vt) {
- return collection->insert(vt).first->second;
-}
-
-// Same as above except the key-value are passed separately.
-template <class Collection>
-typename Collection::value_type::second_type&
-LookupOrInsert(Collection* const collection,
- const typename Collection::value_type::first_type& key,
- const typename Collection::value_type::second_type& value) {
- return LookupOrInsert(
- collection, typename Collection::value_type(key, value));
-}
-
-// Counts the number of equivalent elements in the given "sequence", and stores
-// the results in "count_map" with element as the key and count as the value.
-//
-// Example:
-// vector<string> v = {"a", "b", "c", "a", "b"};
-// map<string, int> m;
-// AddTokenCounts(v, 1, &m);
-// assert(m["a"] == 2);
-// assert(m["b"] == 2);
-// assert(m["c"] == 1);
-template <typename Sequence, typename Collection>
-void AddTokenCounts(
- const Sequence& sequence,
- const typename Collection::value_type::second_type& increment,
- Collection* const count_map) {
- for (typename Sequence::const_iterator it = sequence.begin();
- it != sequence.end(); ++it) {
- typename Collection::value_type::second_type& value =
- LookupOrInsert(count_map, *it,
- typename Collection::value_type::second_type());
- value += increment;
- }
-}
-
-// Returns a reference to the value associated with key. If not found, a value
-// is default constructed on the heap and added to the map.
-//
-// This function is useful for containers of the form map<Key, Value*>, where
-// inserting a new key, value pair involves constructing a new heap-allocated
-// Value, and storing a pointer to that in the collection.
-template <class Collection>
-typename Collection::value_type::second_type&
-LookupOrInsertNew(Collection* const collection,
- const typename Collection::value_type::first_type& key) {
- typedef typename std::iterator_traits<
- typename Collection::value_type::second_type>::value_type Element;
- std::pair<typename Collection::iterator, bool> ret =
- collection->insert(typename Collection::value_type(
- key,
- static_cast<typename Collection::value_type::second_type>(nullptr)));
- if (ret.second) {
- ret.first->second = new Element();
- }
- return ret.first->second;
-}
-
-// Same as above but constructs the value using the single-argument constructor
-// and the given "arg".
-template <class Collection, class Arg>
-typename Collection::value_type::second_type&
-LookupOrInsertNew(Collection* const collection,
- const typename Collection::value_type::first_type& key,
- const Arg& arg) {
- typedef typename std::iterator_traits<
- typename Collection::value_type::second_type>::value_type Element;
- std::pair<typename Collection::iterator, bool> ret =
- collection->insert(typename Collection::value_type(
- key,
- static_cast<typename Collection::value_type::second_type>(nullptr)));
- if (ret.second) {
- ret.first->second = new Element(arg);
- }
- return ret.first->second;
-}
-
-// Lookup of linked/shared pointers is used in two scenarios:
-//
-// Use LookupOrInsertNewLinkedPtr if the container owns the elements.
-// In this case it is fine working with the raw pointer as long as it is
-// guaranteed that no other thread can delete/update an accessed element.
-// A mutex will need to lock the container operation as well as the use
-// of the returned elements. Finding an element may be performed using
-// FindLinkedPtr*().
-//
-// Use LookupOrInsertNewSharedPtr if the container does not own the elements
-// for their whole lifetime. This is typically the case when a reader allows
-// parallel updates to the container. In this case a Mutex only needs to lock
-// container operations, but all element operations must be performed on the
-// shared pointer. Finding an element must be performed using FindPtr*() and
-// cannot be done with FindLinkedPtr*() even though it compiles.
-
-// Lookup a key in a map or hash_map whose values are linked_ptrs. If it is
-// missing, set collection[key].reset(new Value::element_type) and return that.
-// Value::element_type must be default constructable.
-template <class Collection>
-typename Collection::value_type::second_type::element_type*
-LookupOrInsertNewLinkedPtr(
- Collection* const collection,
- const typename Collection::value_type::first_type& key) {
- typedef typename Collection::value_type::second_type Value;
- std::pair<typename Collection::iterator, bool> ret =
- collection->insert(typename Collection::value_type(key, Value()));
- if (ret.second) {
- ret.first->second.reset(new typename Value::element_type);
- }
- return ret.first->second.get();
-}
-
-// A variant of LookupOrInsertNewLinkedPtr where the value is constructed using
-// a single-parameter constructor. Note: the constructor argument is computed
-// even if it will not be used, so only values cheap to compute should be passed
-// here. On the other hand it does not matter how expensive the construction of
-// the actual stored value is, as that only occurs if necessary.
-template <class Collection, class Arg>
-typename Collection::value_type::second_type::element_type*
-LookupOrInsertNewLinkedPtr(
- Collection* const collection,
- const typename Collection::value_type::first_type& key,
- const Arg& arg) {
- typedef typename Collection::value_type::second_type Value;
- std::pair<typename Collection::iterator, bool> ret =
- collection->insert(typename Collection::value_type(key, Value()));
- if (ret.second) {
- ret.first->second.reset(new typename Value::element_type(arg));
- }
- return ret.first->second.get();
-}
-
-// Lookup a key in a map or hash_map whose values are shared_ptrs. If it is
-// missing, set collection[key].reset(new Value::element_type). Unlike
-// LookupOrInsertNewLinkedPtr, this function returns the shared_ptr instead of
-// the raw pointer. Value::element_type must be default constructable.
-template <class Collection>
-typename Collection::value_type::second_type&
-LookupOrInsertNewSharedPtr(
- Collection* const collection,
- const typename Collection::value_type::first_type& key) {
- typedef typename Collection::value_type::second_type SharedPtr;
- typedef typename Collection::value_type::second_type::element_type Element;
- std::pair<typename Collection::iterator, bool> ret =
- collection->insert(typename Collection::value_type(key, SharedPtr()));
- if (ret.second) {
- ret.first->second.reset(new Element());
- }
- return ret.first->second;
-}
-
-// A variant of LookupOrInsertNewSharedPtr where the value is constructed using
-// a single-parameter constructor. Note: the constructor argument is computed
-// even if it will not be used, so only values cheap to compute should be passed
-// here. On the other hand it does not matter how expensive the construction of
-// the actual stored value is, as that only occurs if necessary.
-template <class Collection, class Arg>
-typename Collection::value_type::second_type&
-LookupOrInsertNewSharedPtr(
- Collection* const collection,
- const typename Collection::value_type::first_type& key,
- const Arg& arg) {
- typedef typename Collection::value_type::second_type SharedPtr;
- typedef typename Collection::value_type::second_type::element_type Element;
- std::pair<typename Collection::iterator, bool> ret =
- collection->insert(typename Collection::value_type(key, SharedPtr()));
- if (ret.second) {
- ret.first->second.reset(new Element(arg));
- }
- return ret.first->second;
-}
-
-//
-// Misc Utility Functions
-//
-
-// Updates the value associated with the given key. If the key was not already
-// present, then the key-value pair are inserted and "previous" is unchanged. If
-// the key was already present, the value is updated and "*previous" will
-// contain a copy of the old value.
-//
-// InsertOrReturnExisting has complementary behavior that returns the
-// address of an already existing value, rather than updating it.
-template <class Collection>
-bool UpdateReturnCopy(Collection* const collection,
- const typename Collection::value_type::first_type& key,
- const typename Collection::value_type::second_type& value,
- typename Collection::value_type::second_type* previous) {
- std::pair<typename Collection::iterator, bool> ret =
- collection->insert(typename Collection::value_type(key, value));
- if (!ret.second) {
- // update
- if (previous) {
- *previous = ret.first->second;
- }
- ret.first->second = value;
- return true;
- }
- return false;
-}
-
-// Same as above except that the key and value are passed as a pair.
-template <class Collection>
-bool UpdateReturnCopy(Collection* const collection,
- const typename Collection::value_type& vt,
- typename Collection::value_type::second_type* previous) {
- std::pair<typename Collection::iterator, bool> ret = collection->insert(vt);
- if (!ret.second) {
- // update
- if (previous) {
- *previous = ret.first->second;
- }
- ret.first->second = vt.second;
- return true;
- }
- return false;
-}
-
-// Tries to insert the given key-value pair into the collection. Returns nullptr if
-// the insert succeeds. Otherwise, returns a pointer to the existing value.
-//
-// This complements UpdateReturnCopy in that it allows to update only after
-// verifying the old value and still insert quickly without having to look up
-// twice. Unlike UpdateReturnCopy this also does not come with the issue of an
-// undefined previous* in case new data was inserted.
-template <class Collection>
-typename Collection::value_type::second_type* InsertOrReturnExisting(
- Collection* const collection, const typename Collection::value_type& vt) {
- std::pair<typename Collection::iterator, bool> ret = collection->insert(vt);
- if (ret.second) {
- return nullptr; // Inserted, no existing previous value.
- } else {
- return &ret.first->second; // Return address of already existing value.
- }
-}
-
-// Same as above, except for explicit key and data.
-template <class Collection>
-typename Collection::value_type::second_type* InsertOrReturnExisting(
- Collection* const collection,
- const typename Collection::value_type::first_type& key,
- const typename Collection::value_type::second_type& data) {
- return InsertOrReturnExisting(collection,
- typename Collection::value_type(key, data));
-}
-
-// Erases the collection item identified by the given key, and returns the value
-// associated with that key. It is assumed that the value (i.e., the
-// mapped_type) is a pointer. Returns nullptr if the key was not found in the
-// collection.
-//
-// Examples:
-// map<string, MyType*> my_map;
-//
-// One line cleanup:
-// delete EraseKeyReturnValuePtr(&my_map, "abc");
-//
-// Use returned value:
-// std::unique_ptr<MyType> value_ptr(
-// EraseKeyReturnValuePtr(&my_map, "abc"));
-// if (value_ptr.get())
-// value_ptr->DoSomething();
-//
-template <class Collection>
-typename Collection::value_type::second_type EraseKeyReturnValuePtr(
- Collection* const collection,
- const typename Collection::value_type::first_type& key) {
- typename Collection::iterator it = collection->find(key);
- if (it == collection->end()) {
- return nullptr;
- }
- typename Collection::value_type::second_type v = it->second;
- collection->erase(it);
- return v;
-}
-
-// Inserts all the keys from map_container into key_container, which must
-// support insert(MapContainer::key_type).
-//
-// Note: any initial contents of the key_container are not cleared.
-template <class MapContainer, class KeyContainer>
-void InsertKeysFromMap(const MapContainer& map_container,
- KeyContainer* key_container) {
- GOOGLE_CHECK(key_container != nullptr);
- for (typename MapContainer::const_iterator it = map_container.begin();
- it != map_container.end(); ++it) {
- key_container->insert(it->first);
- }
-}
-
-// Appends all the keys from map_container into key_container, which must
-// support push_back(MapContainer::key_type).
-//
-// Note: any initial contents of the key_container are not cleared.
-template <class MapContainer, class KeyContainer>
-void AppendKeysFromMap(const MapContainer& map_container,
- KeyContainer* key_container) {
- GOOGLE_CHECK(key_container != nullptr);
- for (typename MapContainer::const_iterator it = map_container.begin();
- it != map_container.end(); ++it) {
- key_container->push_back(it->first);
- }
-}
-
-// A more specialized overload of AppendKeysFromMap to optimize reallocations
-// for the common case in which we're appending keys to a vector and hence can
-// (and sometimes should) call reserve() first.
-//
-// (It would be possible to play SFINAE games to call reserve() for any
-// container that supports it, but this seems to get us 99% of what we need
-// without the complexity of a SFINAE-based solution.)
-template <class MapContainer, class KeyType>
-void AppendKeysFromMap(const MapContainer& map_container,
- std::vector<KeyType>* key_container) {
- GOOGLE_CHECK(key_container != nullptr);
- // We now have the opportunity to call reserve(). Calling reserve() every
- // time is a bad idea for some use cases: libstdc++'s implementation of
- // vector<>::reserve() resizes the vector's backing store to exactly the
- // given size (unless it's already at least that big). Because of this,
- // the use case that involves appending a lot of small maps (total size
- // N) one by one to a vector would be O(N^2). But never calling reserve()
- // loses the opportunity to improve the use case of adding from a large
- // map to an empty vector (this improves performance by up to 33%). A
- // number of heuristics are possible; see the discussion in
- // cl/34081696. Here we use the simplest one.
- if (key_container->empty()) {
- key_container->reserve(map_container.size());
- }
- for (typename MapContainer::const_iterator it = map_container.begin();
- it != map_container.end(); ++it) {
- key_container->push_back(it->first);
- }
-}
-
-// Inserts all the values from map_container into value_container, which must
-// support push_back(MapContainer::mapped_type).
-//
-// Note: any initial contents of the value_container are not cleared.
-template <class MapContainer, class ValueContainer>
-void AppendValuesFromMap(const MapContainer& map_container,
- ValueContainer* value_container) {
- GOOGLE_CHECK(value_container != nullptr);
- for (typename MapContainer::const_iterator it = map_container.begin();
- it != map_container.end(); ++it) {
- value_container->push_back(it->second);
- }
-}
-
-// A more specialized overload of AppendValuesFromMap to optimize reallocations
-// for the common case in which we're appending values to a vector and hence
-// can (and sometimes should) call reserve() first.
-//
-// (It would be possible to play SFINAE games to call reserve() for any
-// container that supports it, but this seems to get us 99% of what we need
-// without the complexity of a SFINAE-based solution.)
-template <class MapContainer, class ValueType>
-void AppendValuesFromMap(const MapContainer& map_container,
- std::vector<ValueType>* value_container) {
- GOOGLE_CHECK(value_container != nullptr);
- // See AppendKeysFromMap for why this is done.
- if (value_container->empty()) {
- value_container->reserve(map_container.size());
- }
- for (typename MapContainer::const_iterator it = map_container.begin();
- it != map_container.end(); ++it) {
- value_container->push_back(it->second);
- }
-}
-
-} // namespace protobuf
-} // namespace google
-
-#endif // GOOGLE_PROTOBUF_STUBS_MAP_UTIL_H__
diff --git a/src/google/protobuf/stubs/mathutil.h b/src/google/protobuf/stubs/mathutil.h
index 1d16bce..908b245 100644
--- a/src/google/protobuf/stubs/mathutil.h
+++ b/src/google/protobuf/stubs/mathutil.h
@@ -30,12 +30,13 @@
#ifndef GOOGLE_PROTOBUF_STUBS_MATHUTIL_H_
#define GOOGLE_PROTOBUF_STUBS_MATHUTIL_H_
-#include <cmath>
#include <float.h>
+
+#include <cmath>
#include <limits>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/logging.h>
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/stubs/logging.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/stubs/mutex.h b/src/google/protobuf/stubs/mutex.h
deleted file mode 100644
index c459991..0000000
--- a/src/google/protobuf/stubs/mutex.h
+++ /dev/null
@@ -1,218 +0,0 @@
-// Copyright (c) 2006, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#ifndef GOOGLE_PROTOBUF_STUBS_MUTEX_H_
-#define GOOGLE_PROTOBUF_STUBS_MUTEX_H_
-
-#include <mutex>
-
-#ifdef GOOGLE_PROTOBUF_SUPPORT_WINDOWS_XP
-
-#include <windows.h>
-
-// GetMessage conflicts with GeneratedMessageReflection::GetMessage().
-#ifdef GetMessage
-#undef GetMessage
-#endif
-
-#endif
-
-#include <google/protobuf/stubs/macros.h>
-
-// Define thread-safety annotations for use below, if we are building with
-// Clang.
-#if defined(__clang__) && !defined(SWIG)
-#define GOOGLE_PROTOBUF_ACQUIRE(...) \
- __attribute__((acquire_capability(__VA_ARGS__)))
-#define GOOGLE_PROTOBUF_RELEASE(...) \
- __attribute__((release_capability(__VA_ARGS__)))
-#define GOOGLE_PROTOBUF_SCOPED_CAPABILITY __attribute__((scoped_lockable))
-#define GOOGLE_PROTOBUF_CAPABILITY(x) __attribute__((capability(x)))
-#else
-#define GOOGLE_PROTOBUF_ACQUIRE(...)
-#define GOOGLE_PROTOBUF_RELEASE(...)
-#define GOOGLE_PROTOBUF_SCOPED_CAPABILITY
-#define GOOGLE_PROTOBUF_CAPABILITY(x)
-#endif
-
-#include <google/protobuf/port_def.inc>
-
-// ===================================================================
-// emulates google3/base/mutex.h
-namespace google {
-namespace protobuf {
-namespace internal {
-
-#define GOOGLE_PROTOBUF_LINKER_INITIALIZED
-
-#ifdef GOOGLE_PROTOBUF_SUPPORT_WINDOWS_XP
-
-// This class is a lightweight replacement for std::mutex on Windows platforms.
-// std::mutex does not work on Windows XP SP2 with the latest VC++ libraries,
-// because it utilizes the Concurrency Runtime that is only supported on Windows
-// XP SP3 and above.
-class PROTOBUF_EXPORT CriticalSectionLock {
- public:
- CriticalSectionLock() { InitializeCriticalSection(&critical_section_); }
- ~CriticalSectionLock() { DeleteCriticalSection(&critical_section_); }
- void lock() { EnterCriticalSection(&critical_section_); }
- void unlock() { LeaveCriticalSection(&critical_section_); }
-
- private:
- CRITICAL_SECTION critical_section_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CriticalSectionLock);
-};
-
-#endif
-
-// In MSVC std::mutex does not have a constexpr constructor.
-// This wrapper makes the constructor constexpr.
-template <typename T>
-class CallOnceInitializedMutex {
- public:
- constexpr CallOnceInitializedMutex() : flag_{}, buf_{} {}
- ~CallOnceInitializedMutex() { get().~T(); }
-
- void lock() { get().lock(); }
- void unlock() { get().unlock(); }
-
- private:
- T& get() {
- std::call_once(flag_, [&] { ::new (static_cast<void*>(&buf_)) T(); });
- return reinterpret_cast<T&>(buf_);
- }
-
- std::once_flag flag_;
- alignas(T) char buf_[sizeof(T)];
-};
-
-// Mutex is a natural type to wrap. As both google and other organization have
-// specialized mutexes. gRPC also provides an injection mechanism for custom
-// mutexes.
-class GOOGLE_PROTOBUF_CAPABILITY("mutex") PROTOBUF_EXPORT WrappedMutex {
- public:
-#if defined(__QNX__)
- constexpr WrappedMutex() = default;
-#else
- constexpr WrappedMutex() {}
-#endif
- void Lock() GOOGLE_PROTOBUF_ACQUIRE() { mu_.lock(); }
- void Unlock() GOOGLE_PROTOBUF_RELEASE() { mu_.unlock(); }
- // Crash if this Mutex is not held exclusively by this thread.
- // May fail to crash when it should; will never crash when it should not.
- void AssertHeld() const {}
-
- private:
-#if defined(GOOGLE_PROTOBUF_SUPPORT_WINDOWS_XP)
- CallOnceInitializedMutex<CriticalSectionLock> mu_{};
-#elif defined(_WIN32)
- CallOnceInitializedMutex<std::mutex> mu_{};
-#else
- std::mutex mu_{};
-#endif
-};
-
-using Mutex = WrappedMutex;
-
-// MutexLock(mu) acquires mu when constructed and releases it when destroyed.
-class GOOGLE_PROTOBUF_SCOPED_CAPABILITY PROTOBUF_EXPORT MutexLock {
- public:
- explicit MutexLock(Mutex* mu) GOOGLE_PROTOBUF_ACQUIRE(mu) : mu_(mu) {
- this->mu_->Lock();
- }
- ~MutexLock() GOOGLE_PROTOBUF_RELEASE() { this->mu_->Unlock(); }
-
- private:
- Mutex *const mu_;
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MutexLock);
-};
-
-// TODO(kenton): Implement these? Hard to implement portably.
-typedef MutexLock ReaderMutexLock;
-typedef MutexLock WriterMutexLock;
-
-// MutexLockMaybe is like MutexLock, but is a no-op when mu is nullptr.
-class PROTOBUF_EXPORT MutexLockMaybe {
- public:
- explicit MutexLockMaybe(Mutex *mu) :
- mu_(mu) { if (this->mu_ != nullptr) { this->mu_->Lock(); } }
- ~MutexLockMaybe() { if (this->mu_ != nullptr) { this->mu_->Unlock(); } }
- private:
- Mutex *const mu_;
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MutexLockMaybe);
-};
-
-#if defined(GOOGLE_PROTOBUF_NO_THREADLOCAL)
-template<typename T>
-class ThreadLocalStorage {
- public:
- ThreadLocalStorage() {
- pthread_key_create(&key_, &ThreadLocalStorage::Delete);
- }
- ~ThreadLocalStorage() {
- pthread_key_delete(key_);
- }
- T* Get() {
- T* result = static_cast<T*>(pthread_getspecific(key_));
- if (result == nullptr) {
- result = new T();
- pthread_setspecific(key_, result);
- }
- return result;
- }
- private:
- static void Delete(void* value) {
- delete static_cast<T*>(value);
- }
- pthread_key_t key_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ThreadLocalStorage);
-};
-#endif
-
-} // namespace internal
-
-// We made these internal so that they would show up as such in the docs,
-// but we don't want to stick "internal::" in front of them everywhere.
-using internal::Mutex;
-using internal::MutexLock;
-using internal::ReaderMutexLock;
-using internal::WriterMutexLock;
-using internal::MutexLockMaybe;
-
-} // namespace protobuf
-} // namespace google
-
-#undef GOOGLE_PROTOBUF_ACQUIRE
-#undef GOOGLE_PROTOBUF_RELEASE
-
-#include <google/protobuf/port_undef.inc>
-
-#endif // GOOGLE_PROTOBUF_STUBS_MUTEX_H_
diff --git a/src/google/protobuf/stubs/platform_macros.h b/src/google/protobuf/stubs/platform_macros.h
index 2479960..d10faf9 100644
--- a/src/google/protobuf/stubs/platform_macros.h
+++ b/src/google/protobuf/stubs/platform_macros.h
@@ -122,11 +122,11 @@
#undef GOOGLE_PROTOBUF_PLATFORM_ERROR
-#if defined(GOOGLE_PROTOBUF_OS_ANDROID) || defined(GOOGLE_PROTOBUF_OS_IPHONE) || defined(__OpenBSD__)
+#if defined(GOOGLE_PROTOBUF_OS_ANDROID) || defined(GOOGLE_PROTOBUF_OS_IPHONE)
// Android ndk does not support the __thread keyword very well yet. Here
// we use pthread_key_create()/pthread_getspecific()/... methods for
// TLS support on android.
-// iOS and OpenBSD also do not support the __thread keyword.
+// iOS also does not support the __thread keyword.
#define GOOGLE_PROTOBUF_NO_THREADLOCAL
#endif
diff --git a/src/google/protobuf/stubs/port.h b/src/google/protobuf/stubs/port.h
index b074cb1..d459a94 100644
--- a/src/google/protobuf/stubs/port.h
+++ b/src/google/protobuf/stubs/port.h
@@ -32,15 +32,17 @@
#define GOOGLE_PROTOBUF_STUBS_PORT_H_
#include <assert.h>
-#include <cstdint>
#include <stdlib.h>
-#include <cstddef>
-#include <string>
#include <string.h>
-#include <google/protobuf/stubs/platform_macros.h>
+#include <cstddef>
+#include <cstdint>
+#include <string>
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/stubs/platform_macros.h"
+
+// Must be last.
+#include "google/protobuf/port_def.inc" // NOLINT
#undef PROTOBUF_LITTLE_ENDIAN
#ifdef _WIN32
@@ -126,8 +128,6 @@
namespace google {
namespace protobuf {
-using ConstStringParam = const std::string &;
-
typedef unsigned int uint;
typedef int8_t int8;
@@ -147,57 +147,6 @@
static const uint32 kuint32max = 0xFFFFFFFFu;
static const uint64 kuint64max = uint64_t{0xFFFFFFFFFFFFFFFFu};
-#if defined(ADDRESS_SANITIZER) || defined(THREAD_SANITIZER) ||\
- defined(MEMORY_SANITIZER)
-
-#ifdef __cplusplus
-extern "C" {
-#endif // __cplusplus
-uint16_t __sanitizer_unaligned_load16(const void *p);
-uint32_t __sanitizer_unaligned_load32(const void *p);
-uint64_t __sanitizer_unaligned_load64(const void *p);
-void __sanitizer_unaligned_store16(void *p, uint16_t v);
-void __sanitizer_unaligned_store32(void *p, uint32_t v);
-void __sanitizer_unaligned_store64(void *p, uint64_t v);
-#ifdef __cplusplus
-} // extern "C"
-#endif // __cplusplus
-
-inline uint16_t GOOGLE_UNALIGNED_LOAD16(const void *p) {
- return __sanitizer_unaligned_load16(p);
-}
-
-inline uint32_t GOOGLE_UNALIGNED_LOAD32(const void *p) {
- return __sanitizer_unaligned_load32(p);
-}
-
-inline uint64_t GOOGLE_UNALIGNED_LOAD64(const void *p) {
- return __sanitizer_unaligned_load64(p);
-}
-
-inline void GOOGLE_UNALIGNED_STORE16(void *p, uint16_t v) {
- __sanitizer_unaligned_store16(p, v);
-}
-
-inline void GOOGLE_UNALIGNED_STORE32(void *p, uint32_t v) {
- __sanitizer_unaligned_store32(p, v);
-}
-
-inline void GOOGLE_UNALIGNED_STORE64(void *p, uint64_t v) {
- __sanitizer_unaligned_store64(p, v);
-}
-
-#elif defined(GOOGLE_PROTOBUF_USE_UNALIGNED) && GOOGLE_PROTOBUF_USE_UNALIGNED
-
-#define GOOGLE_UNALIGNED_LOAD16(_p) (*reinterpret_cast<const uint16_t *>(_p))
-#define GOOGLE_UNALIGNED_LOAD32(_p) (*reinterpret_cast<const uint32_t *>(_p))
-#define GOOGLE_UNALIGNED_LOAD64(_p) (*reinterpret_cast<const uint64_t *>(_p))
-
-#define GOOGLE_UNALIGNED_STORE16(_p, _val) (*reinterpret_cast<uint16_t *>(_p) = (_val))
-#define GOOGLE_UNALIGNED_STORE32(_p, _val) (*reinterpret_cast<uint32_t *>(_p) = (_val))
-#define GOOGLE_UNALIGNED_STORE64(_p, _val) (*reinterpret_cast<uint64_t *>(_p) = (_val))
-
-#else
inline uint16_t GOOGLE_UNALIGNED_LOAD16(const void *p) {
uint16_t t;
memcpy(&t, p, sizeof t);
@@ -227,7 +176,6 @@
inline void GOOGLE_UNALIGNED_STORE64(void *p, uint64_t v) {
memcpy(p, &v, sizeof v);
}
-#endif
#if defined(GOOGLE_PROTOBUF_OS_NACL) \
|| (defined(__ANDROID__) && defined(__clang__) \
@@ -283,69 +231,6 @@
#endif
// ===================================================================
-// from google3/util/bits/bits.h
-
-class Bits {
- public:
- static uint32_t Log2FloorNonZero(uint32_t n) {
-#if defined(__GNUC__)
- return 31 ^ static_cast<uint32_t>(__builtin_clz(n));
-#elif defined(_MSC_VER)
- unsigned long where;
- _BitScanReverse(&where, n);
- return where;
-#else
- return Log2FloorNonZero_Portable(n);
-#endif
- }
-
- static uint32_t Log2FloorNonZero64(uint64_t n) {
- // Older versions of clang run into an instruction-selection failure when
- // it encounters __builtin_clzll:
- // https://bugs.chromium.org/p/nativeclient/issues/detail?id=4395
- // This includes arm-nacl-clang and clang in older Android NDK versions.
- // To work around this, when we build with those we use the portable
- // implementation instead.
-#if defined(__GNUC__) && !defined(GOOGLE_PROTOBUF_USE_PORTABLE_LOG2)
- return 63 ^ static_cast<uint32_t>(__builtin_clzll(n));
-#elif defined(_MSC_VER) && defined(_M_X64)
- unsigned long where;
- _BitScanReverse64(&where, n);
- return where;
-#else
- return Log2FloorNonZero64_Portable(n);
-#endif
- }
- private:
- static int Log2FloorNonZero_Portable(uint32_t n) {
- if (n == 0)
- return -1;
- int log = 0;
- uint32_t value = n;
- for (int i = 4; i >= 0; --i) {
- int shift = (1 << i);
- uint32_t x = value >> shift;
- if (x != 0) {
- value = x;
- log += shift;
- }
- }
- assert(value == 1);
- return log;
- }
-
- static int Log2FloorNonZero64_Portable(uint64_t n) {
- const uint32_t topbits = static_cast<uint32_t>(n >> 32);
- if (topbits == 0) {
- // Top bits are zero, so scan in bottom bits
- return static_cast<int>(Log2FloorNonZero(static_cast<uint32_t>(n)));
- } else {
- return 32 + static_cast<int>(Log2FloorNonZero(topbits));
- }
- }
-};
-
-// ===================================================================
// from google3/util/endian/endian.h
PROTOBUF_EXPORT uint32_t ghtonl(uint32_t x);
@@ -408,6 +293,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_STUBS_PORT_H_
diff --git a/src/google/protobuf/stubs/status.cc b/src/google/protobuf/stubs/status.cc
deleted file mode 100644
index f5c0fa4..0000000
--- a/src/google/protobuf/stubs/status.cc
+++ /dev/null
@@ -1,262 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/stubs/status.h>
-
-#include <ostream>
-#include <stdio.h>
-#include <string>
-#include <utility>
-
-namespace google {
-namespace protobuf {
-namespace util {
-namespace status_internal {
-namespace {
-
-inline std::string StatusCodeToString(StatusCode code) {
- switch (code) {
- case StatusCode::kOk:
- return "OK";
- case StatusCode::kCancelled:
- return "CANCELLED";
- case StatusCode::kUnknown:
- return "UNKNOWN";
- case StatusCode::kInvalidArgument:
- return "INVALID_ARGUMENT";
- case StatusCode::kDeadlineExceeded:
- return "DEADLINE_EXCEEDED";
- case StatusCode::kNotFound:
- return "NOT_FOUND";
- case StatusCode::kAlreadyExists:
- return "ALREADY_EXISTS";
- case StatusCode::kPermissionDenied:
- return "PERMISSION_DENIED";
- case StatusCode::kUnauthenticated:
- return "UNAUTHENTICATED";
- case StatusCode::kResourceExhausted:
- return "RESOURCE_EXHAUSTED";
- case StatusCode::kFailedPrecondition:
- return "FAILED_PRECONDITION";
- case StatusCode::kAborted:
- return "ABORTED";
- case StatusCode::kOutOfRange:
- return "OUT_OF_RANGE";
- case StatusCode::kUnimplemented:
- return "UNIMPLEMENTED";
- case StatusCode::kInternal:
- return "INTERNAL";
- case StatusCode::kUnavailable:
- return "UNAVAILABLE";
- case StatusCode::kDataLoss:
- return "DATA_LOSS";
- }
-
- // No default clause, clang will abort if a code is missing from
- // above switch.
- return "UNKNOWN";
-}
-
-} // namespace
-
-Status::Status() : error_code_(StatusCode::kOk) {}
-
-Status::Status(StatusCode error_code, StringPiece error_message)
- : error_code_(error_code) {
- if (error_code != StatusCode::kOk) {
- error_message_ = error_message.ToString();
- }
-}
-
-Status::Status(const Status& other)
- : error_code_(other.error_code_), error_message_(other.error_message_) {
-}
-
-Status& Status::operator=(const Status& other) {
- error_code_ = other.error_code_;
- error_message_ = other.error_message_;
- return *this;
-}
-
-bool Status::operator==(const Status& x) const {
- return error_code_ == x.error_code_ &&
- error_message_ == x.error_message_;
-}
-
-std::string Status::ToString() const {
- if (error_code_ == StatusCode::kOk) {
- return "OK";
- } else {
- if (error_message_.empty()) {
- return StatusCodeToString(error_code_);
- } else {
- return StatusCodeToString(error_code_) + ":" + error_message_;
- }
- }
-}
-
-Status OkStatus() { return Status(); }
-
-std::ostream& operator<<(std::ostream& os, const Status& x) {
- os << x.ToString();
- return os;
-}
-
-bool IsAborted(const Status& status) {
- return status.code() == StatusCode::kAborted;
-}
-
-bool IsAlreadyExists(const Status& status) {
- return status.code() == StatusCode::kAlreadyExists;
-}
-
-bool IsCancelled(const Status& status) {
- return status.code() == StatusCode::kCancelled;
-}
-
-bool IsDataLoss(const Status& status) {
- return status.code() == StatusCode::kDataLoss;
-}
-
-bool IsDeadlineExceeded(const Status& status) {
- return status.code() == StatusCode::kDeadlineExceeded;
-}
-
-bool IsFailedPrecondition(const Status& status) {
- return status.code() == StatusCode::kFailedPrecondition;
-}
-
-bool IsInternal(const Status& status) {
- return status.code() == StatusCode::kInternal;
-}
-
-bool IsInvalidArgument(const Status& status) {
- return status.code() == StatusCode::kInvalidArgument;
-}
-
-bool IsNotFound(const Status& status) {
- return status.code() == StatusCode::kNotFound;
-}
-
-bool IsOutOfRange(const Status& status) {
- return status.code() == StatusCode::kOutOfRange;
-}
-
-bool IsPermissionDenied(const Status& status) {
- return status.code() == StatusCode::kPermissionDenied;
-}
-
-bool IsResourceExhausted(const Status& status) {
- return status.code() == StatusCode::kResourceExhausted;
-}
-
-bool IsUnauthenticated(const Status& status) {
- return status.code() == StatusCode::kUnauthenticated;
-}
-
-bool IsUnavailable(const Status& status) {
- return status.code() == StatusCode::kUnavailable;
-}
-
-bool IsUnimplemented(const Status& status) {
- return status.code() == StatusCode::kUnimplemented;
-}
-
-bool IsUnknown(const Status& status) {
- return status.code() == StatusCode::kUnknown;
-}
-
-Status AbortedError(StringPiece message) {
- return Status(StatusCode::kAborted, message);
-}
-
-Status AlreadyExistsError(StringPiece message) {
- return Status(StatusCode::kAlreadyExists, message);
-}
-
-Status CancelledError(StringPiece message) {
- return Status(StatusCode::kCancelled, message);
-}
-
-Status DataLossError(StringPiece message) {
- return Status(StatusCode::kDataLoss, message);
-}
-
-Status DeadlineExceededError(StringPiece message) {
- return Status(StatusCode::kDeadlineExceeded, message);
-}
-
-Status FailedPreconditionError(StringPiece message) {
- return Status(StatusCode::kFailedPrecondition, message);
-}
-
-Status InternalError(StringPiece message) {
- return Status(StatusCode::kInternal, message);
-}
-
-Status InvalidArgumentError(StringPiece message) {
- return Status(StatusCode::kInvalidArgument, message);
-}
-
-Status NotFoundError(StringPiece message) {
- return Status(StatusCode::kNotFound, message);
-}
-
-Status OutOfRangeError(StringPiece message) {
- return Status(StatusCode::kOutOfRange, message);
-}
-
-Status PermissionDeniedError(StringPiece message) {
- return Status(StatusCode::kPermissionDenied, message);
-}
-
-Status ResourceExhaustedError(StringPiece message) {
- return Status(StatusCode::kResourceExhausted, message);
-}
-
-Status UnauthenticatedError(StringPiece message) {
- return Status(StatusCode::kUnauthenticated, message);
-}
-
-Status UnavailableError(StringPiece message) {
- return Status(StatusCode::kUnavailable, message);
-}
-
-Status UnimplementedError(StringPiece message) {
- return Status(StatusCode::kUnimplemented, message);
-}
-
-Status UnknownError(StringPiece message) {
- return Status(StatusCode::kUnknown, message);
-}
-
-} // namespace status_internal
-} // namespace util
-} // namespace protobuf
-} // namespace google
diff --git a/src/google/protobuf/stubs/status.h b/src/google/protobuf/stubs/status.h
deleted file mode 100644
index c858cf6..0000000
--- a/src/google/protobuf/stubs/status.h
+++ /dev/null
@@ -1,196 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#ifndef GOOGLE_PROTOBUF_STUBS_STATUS_H_
-#define GOOGLE_PROTOBUF_STUBS_STATUS_H_
-
-#include <string>
-
-#include <google/protobuf/stubs/stringpiece.h>
-
-#include <google/protobuf/port_def.inc>
-
-namespace google {
-namespace protobuf {
-namespace util {
-namespace status_internal {
-
-// These values must match error codes defined in google/rpc/code.proto.
-enum class StatusCode : int {
- kOk = 0,
- kCancelled = 1,
- kUnknown = 2,
- kInvalidArgument = 3,
- kDeadlineExceeded = 4,
- kNotFound = 5,
- kAlreadyExists = 6,
- kPermissionDenied = 7,
- kUnauthenticated = 16,
- kResourceExhausted = 8,
- kFailedPrecondition = 9,
- kAborted = 10,
- kOutOfRange = 11,
- kUnimplemented = 12,
- kInternal = 13,
- kUnavailable = 14,
- kDataLoss = 15,
-};
-
-class PROTOBUF_EXPORT Status {
- public:
- // Creates a "successful" status.
- Status();
-
- // Create a status in the canonical error space with the specified
- // code, and error message. If "code == 0", error_message is
- // ignored and a Status object identical to Status::kOk is
- // constructed.
- Status(StatusCode error_code, StringPiece error_message);
- Status(const Status&);
- Status& operator=(const Status& x);
- ~Status() {}
-
- // Accessor
- bool ok() const { return error_code_ == StatusCode::kOk; }
- StatusCode code() const { return error_code_; }
- StringPiece message() const {
- return error_message_;
- }
-
- bool operator==(const Status& x) const;
- bool operator!=(const Status& x) const {
- return !operator==(x);
- }
-
- // Return a combination of the error code name and message.
- std::string ToString() const;
-
- private:
- StatusCode error_code_;
- std::string error_message_;
-};
-
-// Returns an OK status, equivalent to a default constructed instance. Prefer
-// usage of `OkStatus()` when constructing such an OK status.
-PROTOBUF_EXPORT Status OkStatus();
-
-// Prints a human-readable representation of 'x' to 'os'.
-PROTOBUF_EXPORT std::ostream& operator<<(std::ostream& os, const Status& x);
-
-// These convenience functions return `true` if a given status matches the
-// `StatusCode` error code of its associated function.
-PROTOBUF_EXPORT bool IsAborted(const Status& status);
-PROTOBUF_EXPORT bool IsAlreadyExists(const Status& status);
-PROTOBUF_EXPORT bool IsCancelled(const Status& status);
-PROTOBUF_EXPORT bool IsDataLoss(const Status& status);
-PROTOBUF_EXPORT bool IsDeadlineExceeded(const Status& status);
-PROTOBUF_EXPORT bool IsFailedPrecondition(const Status& status);
-PROTOBUF_EXPORT bool IsInternal(const Status& status);
-PROTOBUF_EXPORT bool IsInvalidArgument(const Status& status);
-PROTOBUF_EXPORT bool IsNotFound(const Status& status);
-PROTOBUF_EXPORT bool IsOutOfRange(const Status& status);
-PROTOBUF_EXPORT bool IsPermissionDenied(const Status& status);
-PROTOBUF_EXPORT bool IsResourceExhausted(const Status& status);
-PROTOBUF_EXPORT bool IsUnauthenticated(const Status& status);
-PROTOBUF_EXPORT bool IsUnavailable(const Status& status);
-PROTOBUF_EXPORT bool IsUnimplemented(const Status& status);
-PROTOBUF_EXPORT bool IsUnknown(const Status& status);
-
-// These convenience functions create an `Status` object with an error code as
-// indicated by the associated function name, using the error message passed in
-// `message`.
-//
-// These functions are intentionally named `*Error` rather than `*Status` to
-// match the names from Abseil:
-// https://github.com/abseil/abseil-cpp/blob/2e9532cc6c701a8323d0cffb468999ab804095ab/absl/status/status.h#L716
-PROTOBUF_EXPORT Status AbortedError(StringPiece message);
-PROTOBUF_EXPORT Status AlreadyExistsError(StringPiece message);
-PROTOBUF_EXPORT Status CancelledError(StringPiece message);
-PROTOBUF_EXPORT Status DataLossError(StringPiece message);
-PROTOBUF_EXPORT Status DeadlineExceededError(StringPiece message);
-PROTOBUF_EXPORT Status FailedPreconditionError(StringPiece message);
-PROTOBUF_EXPORT Status InternalError(StringPiece message);
-PROTOBUF_EXPORT Status InvalidArgumentError(StringPiece message);
-PROTOBUF_EXPORT Status NotFoundError(StringPiece message);
-PROTOBUF_EXPORT Status OutOfRangeError(StringPiece message);
-PROTOBUF_EXPORT Status PermissionDeniedError(StringPiece message);
-PROTOBUF_EXPORT Status ResourceExhaustedError(StringPiece message);
-PROTOBUF_EXPORT Status UnauthenticatedError(StringPiece message);
-PROTOBUF_EXPORT Status UnavailableError(StringPiece message);
-PROTOBUF_EXPORT Status UnimplementedError(StringPiece message);
-PROTOBUF_EXPORT Status UnknownError(StringPiece message);
-
-} // namespace status_internal
-
-using ::google::protobuf::util::status_internal::Status;
-using ::google::protobuf::util::status_internal::StatusCode;
-
-using ::google::protobuf::util::status_internal::IsAborted;
-using ::google::protobuf::util::status_internal::IsAlreadyExists;
-using ::google::protobuf::util::status_internal::IsCancelled;
-using ::google::protobuf::util::status_internal::IsDataLoss;
-using ::google::protobuf::util::status_internal::IsDeadlineExceeded;
-using ::google::protobuf::util::status_internal::IsFailedPrecondition;
-using ::google::protobuf::util::status_internal::IsInternal;
-using ::google::protobuf::util::status_internal::IsInvalidArgument;
-using ::google::protobuf::util::status_internal::IsNotFound;
-using ::google::protobuf::util::status_internal::IsOutOfRange;
-using ::google::protobuf::util::status_internal::IsPermissionDenied;
-using ::google::protobuf::util::status_internal::IsResourceExhausted;
-using ::google::protobuf::util::status_internal::IsUnauthenticated;
-using ::google::protobuf::util::status_internal::IsUnavailable;
-using ::google::protobuf::util::status_internal::IsUnimplemented;
-using ::google::protobuf::util::status_internal::IsUnknown;
-
-using ::google::protobuf::util::status_internal::AbortedError;
-using ::google::protobuf::util::status_internal::AlreadyExistsError;
-using ::google::protobuf::util::status_internal::CancelledError;
-using ::google::protobuf::util::status_internal::DataLossError;
-using ::google::protobuf::util::status_internal::DeadlineExceededError;
-using ::google::protobuf::util::status_internal::FailedPreconditionError;
-using ::google::protobuf::util::status_internal::InternalError;
-using ::google::protobuf::util::status_internal::InvalidArgumentError;
-using ::google::protobuf::util::status_internal::NotFoundError;
-using ::google::protobuf::util::status_internal::OkStatus;
-using ::google::protobuf::util::status_internal::OutOfRangeError;
-using ::google::protobuf::util::status_internal::PermissionDeniedError;
-using ::google::protobuf::util::status_internal::ResourceExhaustedError;
-using ::google::protobuf::util::status_internal::UnauthenticatedError;
-using ::google::protobuf::util::status_internal::UnavailableError;
-using ::google::protobuf::util::status_internal::UnimplementedError;
-using ::google::protobuf::util::status_internal::UnknownError;
-
-} // namespace util
-} // namespace protobuf
-} // namespace google
-
-#include <google/protobuf/port_undef.inc>
-
-#endif // GOOGLE_PROTOBUF_STUBS_STATUS_H_
diff --git a/src/google/protobuf/stubs/status_macros.h b/src/google/protobuf/stubs/status_macros.h
index 407ff4c..fc2267e 100644
--- a/src/google/protobuf/stubs/status_macros.h
+++ b/src/google/protobuf/stubs/status_macros.h
@@ -33,9 +33,12 @@
#ifndef GOOGLE_PROTOBUF_STUBS_STATUS_MACROS_H_
#define GOOGLE_PROTOBUF_STUBS_STATUS_MACROS_H_
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/status.h>
-#include <google/protobuf/stubs/statusor.h>
+#include "absl/status/status.h"
+#include "absl/status/statusor.h"
+#include "google/protobuf/stubs/common.h"
+
+// Needs to be last.
+#include "google/protobuf/port_def.inc" // NOLINT
namespace google {
namespace protobuf {
@@ -49,7 +52,7 @@
#define RETURN_IF_ERROR(expr) \
do { \
/* Using _status below to avoid capture problems if expr is "status". */ \
- const PROTOBUF_NAMESPACE_ID::util::Status _status = (expr); \
+ const absl::Status _status = (expr); \
if (PROTOBUF_PREDICT_FALSE(!_status.ok())) return _status; \
} while (0)
@@ -57,16 +60,16 @@
#define STATUS_MACROS_CONCAT_NAME_INNER(x, y) x##y
#define STATUS_MACROS_CONCAT_NAME(x, y) STATUS_MACROS_CONCAT_NAME_INNER(x, y)
-template<typename T>
-Status DoAssignOrReturn(T& lhs, StatusOr<T> result) {
+template <typename T>
+absl::Status DoAssignOrReturn(T& lhs, absl::StatusOr<T> result) {
if (result.ok()) {
lhs = result.value();
}
return result.status();
}
-#define ASSIGN_OR_RETURN_IMPL(status, lhs, rexpr) \
- Status status = DoAssignOrReturn(lhs, (rexpr)); \
+#define ASSIGN_OR_RETURN_IMPL(status, lhs, rexpr) \
+ absl::Status status = DoAssignOrReturn(lhs, (rexpr)); \
if (PROTOBUF_PREDICT_FALSE(!status.ok())) return status;
// Executes an expression that returns a util::StatusOr, extracting its value
@@ -79,11 +82,13 @@
// WARNING: ASSIGN_OR_RETURN expands into multiple statements; it cannot be used
// in a single statement (e.g. as the body of an if statement without {})!
#define ASSIGN_OR_RETURN(lhs, rexpr) \
- ASSIGN_OR_RETURN_IMPL( \
+ ASSIGN_OR_RETURN_IMPL( \
STATUS_MACROS_CONCAT_NAME(_status_or_value, __COUNTER__), lhs, rexpr);
} // namespace util
} // namespace protobuf
} // namespace google
+#include "google/protobuf/port_undef.inc" // NOLINT
+
#endif // GOOGLE_PROTOBUF_STUBS_STATUS_H_
diff --git a/src/google/protobuf/stubs/status_test.cc b/src/google/protobuf/stubs/status_test.cc
deleted file mode 100644
index 9e9edf7..0000000
--- a/src/google/protobuf/stubs/status_test.cc
+++ /dev/null
@@ -1,278 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/stubs/status.h>
-
-#include <stdio.h>
-
-#include <google/protobuf/testing/googletest.h>
-#include <gtest/gtest.h>
-
-namespace google {
-namespace protobuf {
-namespace {
-
-TEST(Status, Constructor) {
- EXPECT_EQ(util::StatusCode::kOk,
- util::Status(util::StatusCode::kOk, "").code());
- EXPECT_EQ(util::StatusCode::kCancelled,
- util::Status(util::StatusCode::kCancelled, "").code());
- EXPECT_EQ(util::StatusCode::kUnknown,
- util::Status(util::StatusCode::kUnknown, "").code());
- EXPECT_EQ(util::StatusCode::kInvalidArgument,
- util::Status(util::StatusCode::kInvalidArgument, "").code());
- EXPECT_EQ(util::StatusCode::kDeadlineExceeded,
- util::Status(util::StatusCode::kDeadlineExceeded, "").code());
- EXPECT_EQ(util::StatusCode::kNotFound,
- util::Status(util::StatusCode::kNotFound, "").code());
- EXPECT_EQ(util::StatusCode::kAlreadyExists,
- util::Status(util::StatusCode::kAlreadyExists, "").code());
- EXPECT_EQ(util::StatusCode::kPermissionDenied,
- util::Status(util::StatusCode::kPermissionDenied, "").code());
- EXPECT_EQ(util::StatusCode::kUnauthenticated,
- util::Status(util::StatusCode::kUnauthenticated, "").code());
- EXPECT_EQ(util::StatusCode::kResourceExhausted,
- util::Status(util::StatusCode::kResourceExhausted, "").code());
- EXPECT_EQ(util::StatusCode::kFailedPrecondition,
- util::Status(util::StatusCode::kFailedPrecondition, "").code());
- EXPECT_EQ(util::StatusCode::kAborted,
- util::Status(util::StatusCode::kAborted, "").code());
- EXPECT_EQ(util::StatusCode::kOutOfRange,
- util::Status(util::StatusCode::kOutOfRange, "").code());
- EXPECT_EQ(util::StatusCode::kUnimplemented,
- util::Status(util::StatusCode::kUnimplemented, "").code());
- EXPECT_EQ(util::StatusCode::kInternal,
- util::Status(util::StatusCode::kInternal, "").code());
- EXPECT_EQ(util::StatusCode::kUnavailable,
- util::Status(util::StatusCode::kUnavailable, "").code());
- EXPECT_EQ(util::StatusCode::kDataLoss,
- util::Status(util::StatusCode::kDataLoss, "").code());
-}
-
-TEST(Status, ConstructorZero) {
- util::Status status(util::StatusCode::kOk, "msg");
- EXPECT_TRUE(status.ok());
- EXPECT_EQ("OK", status.ToString());
- EXPECT_EQ(util::OkStatus(), status);
-}
-
-TEST(Status, ConvenienceConstructors) {
- EXPECT_EQ(util::StatusCode::kOk, util::OkStatus().code());
- EXPECT_EQ("", util::OkStatus().message());
-
- EXPECT_EQ(util::StatusCode::kCancelled, util::CancelledError("").code());
- EXPECT_EQ("", util::CancelledError("").message());
- EXPECT_EQ("foo", util::CancelledError("foo").message());
- EXPECT_EQ("bar", util::CancelledError("bar").message());
-
- EXPECT_EQ(util::StatusCode::kUnknown, util::UnknownError("").code());
- EXPECT_EQ("", util::UnknownError("").message());
- EXPECT_EQ("foo", util::UnknownError("foo").message());
- EXPECT_EQ("bar", util::UnknownError("bar").message());
-
- EXPECT_EQ(util::StatusCode::kInvalidArgument,
- util::InvalidArgumentError("").code());
- EXPECT_EQ("", util::InvalidArgumentError("").message());
- EXPECT_EQ("foo", util::InvalidArgumentError("foo").message());
- EXPECT_EQ("bar", util::InvalidArgumentError("bar").message());
-
- EXPECT_EQ(util::StatusCode::kDeadlineExceeded,
- util::DeadlineExceededError("").code());
- EXPECT_EQ("", util::DeadlineExceededError("").message());
- EXPECT_EQ("foo", util::DeadlineExceededError("foo").message());
- EXPECT_EQ("bar", util::DeadlineExceededError("bar").message());
-
- EXPECT_EQ(util::StatusCode::kNotFound, util::NotFoundError("").code());
- EXPECT_EQ("", util::NotFoundError("").message());
- EXPECT_EQ("foo", util::NotFoundError("foo").message());
- EXPECT_EQ("bar", util::NotFoundError("bar").message());
-
- EXPECT_EQ(util::StatusCode::kAlreadyExists,
- util::AlreadyExistsError("").code());
- EXPECT_EQ("", util::AlreadyExistsError("").message());
- EXPECT_EQ("foo", util::AlreadyExistsError("foo").message());
- EXPECT_EQ("bar", util::AlreadyExistsError("bar").message());
-
- EXPECT_EQ(util::StatusCode::kPermissionDenied,
- util::PermissionDeniedError("").code());
- EXPECT_EQ("", util::PermissionDeniedError("").message());
- EXPECT_EQ("foo", util::PermissionDeniedError("foo").message());
- EXPECT_EQ("bar", util::PermissionDeniedError("bar").message());
-
- EXPECT_EQ(util::StatusCode::kUnauthenticated,
- util::UnauthenticatedError("").code());
- EXPECT_EQ("", util::UnauthenticatedError("").message());
- EXPECT_EQ("foo", util::UnauthenticatedError("foo").message());
- EXPECT_EQ("bar", util::UnauthenticatedError("bar").message());
-
- EXPECT_EQ(util::StatusCode::kResourceExhausted,
- util::ResourceExhaustedError("").code());
- EXPECT_EQ("", util::ResourceExhaustedError("").message());
- EXPECT_EQ("foo", util::ResourceExhaustedError("foo").message());
- EXPECT_EQ("bar", util::ResourceExhaustedError("bar").message());
-
- EXPECT_EQ(util::StatusCode::kFailedPrecondition,
- util::FailedPreconditionError("").code());
- EXPECT_EQ("", util::FailedPreconditionError("").message());
- EXPECT_EQ("foo", util::FailedPreconditionError("foo").message());
- EXPECT_EQ("bar", util::FailedPreconditionError("bar").message());
-
- EXPECT_EQ(util::StatusCode::kAborted, util::AbortedError("").code());
- EXPECT_EQ("", util::AbortedError("").message());
- EXPECT_EQ("foo", util::AbortedError("foo").message());
- EXPECT_EQ("bar", util::AbortedError("bar").message());
-
- EXPECT_EQ(util::StatusCode::kOutOfRange, util::OutOfRangeError("").code());
- EXPECT_EQ("", util::OutOfRangeError("").message());
- EXPECT_EQ("foo", util::OutOfRangeError("foo").message());
- EXPECT_EQ("bar", util::OutOfRangeError("bar").message());
-
- EXPECT_EQ(util::StatusCode::kUnimplemented,
- util::UnimplementedError("").code());
- EXPECT_EQ("", util::UnimplementedError("").message());
- EXPECT_EQ("foo", util::UnimplementedError("foo").message());
- EXPECT_EQ("bar", util::UnimplementedError("bar").message());
-
- EXPECT_EQ(util::StatusCode::kInternal, util::InternalError("").code());
- EXPECT_EQ("", util::InternalError("").message());
- EXPECT_EQ("foo", util::InternalError("foo").message());
- EXPECT_EQ("bar", util::InternalError("bar").message());
-
- EXPECT_EQ(util::StatusCode::kUnavailable, util::UnavailableError("").code());
- EXPECT_EQ("", util::UnavailableError("").message());
- EXPECT_EQ("foo", util::UnavailableError("foo").message());
- EXPECT_EQ("bar", util::UnavailableError("bar").message());
-
- EXPECT_EQ(util::StatusCode::kDataLoss, util::DataLossError("").code());
- EXPECT_EQ("", util::DataLossError("").message());
- EXPECT_EQ("foo", util::DataLossError("foo").message());
- EXPECT_EQ("bar", util::DataLossError("bar").message());
-}
-
-TEST(Status, ConvenienceTests) {
- EXPECT_TRUE(util::OkStatus().ok());
- EXPECT_TRUE(util::IsCancelled(util::CancelledError("")));
- EXPECT_TRUE(util::IsUnknown(util::UnknownError("")));
- EXPECT_TRUE(util::IsInvalidArgument(util::InvalidArgumentError("")));
- EXPECT_TRUE(util::IsDeadlineExceeded(util::DeadlineExceededError("")));
- EXPECT_TRUE(util::IsNotFound(util::NotFoundError("")));
- EXPECT_TRUE(util::IsAlreadyExists(util::AlreadyExistsError("")));
- EXPECT_TRUE(util::IsPermissionDenied(util::PermissionDeniedError("")));
- EXPECT_TRUE(util::IsUnauthenticated(util::UnauthenticatedError("")));
- EXPECT_TRUE(util::IsResourceExhausted(util::ResourceExhaustedError("")));
- EXPECT_TRUE(util::IsFailedPrecondition(util::FailedPreconditionError("")));
- EXPECT_TRUE(util::IsAborted(util::AbortedError("")));
- EXPECT_TRUE(util::IsOutOfRange(util::OutOfRangeError("")));
- EXPECT_TRUE(util::IsUnimplemented(util::UnimplementedError("")));
- EXPECT_TRUE(util::IsInternal(util::InternalError("")));
- EXPECT_TRUE(util::IsUnavailable(util::UnavailableError("")));
- EXPECT_TRUE(util::IsDataLoss(util::DataLossError("")));
-}
-
-TEST(Status, Empty) {
- util::Status status;
- EXPECT_TRUE(status.ok());
- EXPECT_EQ(util::OkStatus(), status);
- EXPECT_EQ(util::StatusCode::kOk, status.code());
- EXPECT_EQ("OK", status.ToString());
-}
-
-TEST(Status, CheckOK) {
- util::Status status;
- GOOGLE_CHECK_OK(status);
- GOOGLE_CHECK_OK(status) << "Failed";
- GOOGLE_DCHECK_OK(status) << "Failed";
-}
-
-TEST(Status, ErrorMessage) {
- util::Status status = util::InvalidArgumentError("");
- EXPECT_FALSE(status.ok());
- EXPECT_EQ("", status.message().ToString());
- EXPECT_EQ("INVALID_ARGUMENT", status.ToString());
- status = util::InvalidArgumentError("msg");
- EXPECT_FALSE(status.ok());
- EXPECT_EQ("msg", status.message().ToString());
- EXPECT_EQ("INVALID_ARGUMENT:msg", status.ToString());
- status = util::Status(util::StatusCode::kOk, "msg");
- EXPECT_TRUE(status.ok());
- EXPECT_EQ("", status.message().ToString());
- EXPECT_EQ("OK", status.ToString());
-}
-
-TEST(Status, Copy) {
- util::Status a = util::UnknownError("message");
- util::Status b(a);
- ASSERT_EQ(a.ToString(), b.ToString());
-}
-
-TEST(Status, Assign) {
- util::Status a = util::UnknownError("message");
- util::Status b;
- b = a;
- ASSERT_EQ(a.ToString(), b.ToString());
-}
-
-TEST(Status, AssignEmpty) {
- util::Status a = util::UnknownError("message");
- util::Status b;
- a = b;
- ASSERT_EQ(std::string("OK"), a.ToString());
- ASSERT_TRUE(b.ok());
- ASSERT_TRUE(a.ok());
-}
-
-TEST(Status, EqualsOK) { ASSERT_EQ(util::OkStatus(), util::Status()); }
-
-TEST(Status, EqualsSame) {
- const util::Status a = util::CancelledError("message");
- const util::Status b = util::CancelledError("message");
- ASSERT_EQ(a, b);
-}
-
-TEST(Status, EqualsCopy) {
- const util::Status a = util::CancelledError("message");
- const util::Status b = a;
- ASSERT_EQ(a, b);
-}
-
-TEST(Status, EqualsDifferentCode) {
- const util::Status a = util::CancelledError("message");
- const util::Status b = util::UnknownError("message");
- ASSERT_NE(a, b);
-}
-
-TEST(Status, EqualsDifferentMessage) {
- const util::Status a = util::CancelledError("message");
- const util::Status b = util::CancelledError("another");
- ASSERT_NE(a, b);
-}
-
-} // namespace
-} // namespace protobuf
-} // namespace google
diff --git a/src/google/protobuf/stubs/statusor.h b/src/google/protobuf/stubs/statusor.h
deleted file mode 100644
index 20e603e..0000000
--- a/src/google/protobuf/stubs/statusor.h
+++ /dev/null
@@ -1,253 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// StatusOr<T> is the union of a Status object and a T
-// object. StatusOr models the concept of an object that is either a
-// usable value, or an error Status explaining why such a value is
-// not present. To this end, StatusOr<T> does not allow its Status
-// value to be OkStatus(). Further, StatusOr<T*> does not allow the
-// contained pointer to be nullptr.
-//
-// The primary use-case for StatusOr<T> is as the return value of a
-// function which may fail.
-//
-// Example client usage for a StatusOr<T>, where T is not a pointer:
-//
-// StatusOr<float> result = DoBigCalculationThatCouldFail();
-// if (result.ok()) {
-// float answer = result.value();
-// printf("Big calculation yielded: %f", answer);
-// } else {
-// LOG(ERROR) << result.status();
-// }
-//
-// Example client usage for a StatusOr<T*>:
-//
-// StatusOr<Foo*> result = FooFactory::MakeNewFoo(arg);
-// if (result.ok()) {
-// std::unique_ptr<Foo> foo(result.value());
-// foo->DoSomethingCool();
-// } else {
-// LOG(ERROR) << result.status();
-// }
-//
-// Example factory implementation returning StatusOr<T*>:
-//
-// StatusOr<Foo*> FooFactory::MakeNewFoo(int arg) {
-// if (arg <= 0) {
-// return InvalidArgumentError("Arg must be positive");
-// } else {
-// return new Foo(arg);
-// }
-// }
-//
-
-#ifndef GOOGLE_PROTOBUF_STUBS_STATUSOR_H_
-#define GOOGLE_PROTOBUF_STUBS_STATUSOR_H_
-
-#include <new>
-#include <string>
-#include <utility>
-
-#include <google/protobuf/stubs/status.h>
-
-#include <google/protobuf/port_def.inc>
-
-namespace google {
-namespace protobuf {
-namespace util {
-namespace statusor_internal {
-
-template<typename T>
-class StatusOr {
- template<typename U> friend class StatusOr;
-
- public:
- using value_type = T;
-
- // Construct a new StatusOr with Status::UNKNOWN status.
- // Construct a new StatusOr with UnknownError() status.
- explicit StatusOr();
-
- // Construct a new StatusOr with the given non-ok status. After calling
- // this constructor, calls to value() will CHECK-fail.
- //
- // NOTE: Not explicit - we want to use StatusOr<T> as a return
- // value, so it is convenient and sensible to be able to do 'return
- // Status()' when the return type is StatusOr<T>.
- //
- // REQUIRES: status != OkStatus(). This requirement is DCHECKed.
- // In optimized builds, passing OkStatus() here will have the effect
- // of passing PosixErrorSpace::EINVAL as a fallback.
- StatusOr(const Status& status); // NOLINT
-
- // Construct a new StatusOr with the given value. If T is a plain pointer,
- // value must not be nullptr. After calling this constructor, calls to
- // value() will succeed, and calls to status() will return OK.
- //
- // NOTE: Not explicit - we want to use StatusOr<T> as a return type
- // so it is convenient and sensible to be able to do 'return T()'
- // when when the return type is StatusOr<T>.
- //
- // REQUIRES: if T is a plain pointer, value != nullptr. This requirement is
- // DCHECKed. In optimized builds, passing a null pointer here will have
- // the effect of passing PosixErrorSpace::EINVAL as a fallback.
- StatusOr(const T& value); // NOLINT
-
- // Copy constructor.
- StatusOr(const StatusOr& other);
-
- // Conversion copy constructor, T must be copy constructible from U
- template<typename U>
- StatusOr(const StatusOr<U>& other);
-
- // Assignment operator.
- StatusOr& operator=(const StatusOr& other);
-
- // Conversion assignment operator, T must be assignable from U
- template<typename U>
- StatusOr& operator=(const StatusOr<U>& other);
-
- // Returns a reference to our status. If this contains a T, then
- // returns OkStatus().
- const Status& status() const;
-
- // Returns this->status().ok()
- bool ok() const;
-
- // Returns a reference to our current value, or CHECK-fails if !this->ok().
- const T& value () const;
-
- private:
- Status status_;
- T value_;
-};
-
-////////////////////////////////////////////////////////////////////////////////
-// Implementation details for StatusOr<T>
-
-class PROTOBUF_EXPORT StatusOrHelper {
- public:
- // Move type-agnostic error handling to the .cc.
- static void Crash(const util::Status& status);
-
- // Customized behavior for StatusOr<T> vs. StatusOr<T*>
- template<typename T>
- struct Specialize;
-};
-
-template<typename T>
-struct StatusOrHelper::Specialize {
- // For non-pointer T, a reference can never be nullptr.
- static inline bool IsValueNull(const T& /*t*/) { return false; }
-};
-
-template<typename T>
-struct StatusOrHelper::Specialize<T*> {
- static inline bool IsValueNull(const T* t) { return t == nullptr; }
-};
-
-template <typename T>
-inline StatusOr<T>::StatusOr() : status_(util::UnknownError("")) {}
-
-template<typename T>
-inline StatusOr<T>::StatusOr(const Status& status) {
- if (status.ok()) {
- status_ = util::InternalError("OkStatus() is not a valid argument.");
- } else {
- status_ = status;
- }
-}
-
-template<typename T>
-inline StatusOr<T>::StatusOr(const T& value) {
- if (StatusOrHelper::Specialize<T>::IsValueNull(value)) {
- status_ = util::InternalError("nullptr is not a valid argument.");
- } else {
- status_ = util::OkStatus();
- value_ = value;
- }
-}
-
-template<typename T>
-inline StatusOr<T>::StatusOr(const StatusOr<T>& other)
- : status_(other.status_), value_(other.value_) {
-}
-
-template<typename T>
-inline StatusOr<T>& StatusOr<T>::operator=(const StatusOr<T>& other) {
- status_ = other.status_;
- value_ = other.value_;
- return *this;
-}
-
-template<typename T>
-template<typename U>
-inline StatusOr<T>::StatusOr(const StatusOr<U>& other)
- : status_(other.status_), value_(other.status_.ok() ? other.value_ : T()) {
-}
-
-template<typename T>
-template<typename U>
-inline StatusOr<T>& StatusOr<T>::operator=(const StatusOr<U>& other) {
- status_ = other.status_;
- if (status_.ok()) value_ = other.value_;
- return *this;
-}
-
-template<typename T>
-inline const Status& StatusOr<T>::status() const {
- return status_;
-}
-
-template<typename T>
-inline bool StatusOr<T>::ok() const {
- return status().ok();
-}
-
-template<typename T>
-inline const T& StatusOr<T>::value() const {
- if (!status_.ok()) {
- StatusOrHelper::Crash(status_);
- }
- return value_;
-}
-
-} // namespace statusor_internal
-
-using ::google::protobuf::util::statusor_internal::StatusOr;
-
-} // namespace util
-} // namespace protobuf
-} // namespace google
-
-#include <google/protobuf/port_undef.inc>
-
-#endif // GOOGLE_PROTOBUF_STUBS_STATUSOR_H_
diff --git a/src/google/protobuf/stubs/statusor_test.cc b/src/google/protobuf/stubs/statusor_test.cc
deleted file mode 100644
index 403adcc..0000000
--- a/src/google/protobuf/stubs/statusor_test.cc
+++ /dev/null
@@ -1,272 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#include <google/protobuf/stubs/statusor.h>
-
-#include <errno.h>
-#include <memory>
-
-#include <google/protobuf/testing/googletest.h>
-#include <gtest/gtest.h>
-
-namespace google {
-namespace protobuf {
-namespace util {
-namespace {
-
-class Base1 {
- public:
- virtual ~Base1() {}
- int pad;
-};
-
-class Base2 {
- public:
- virtual ~Base2() {}
- int yetotherpad;
-};
-
-class Derived : public Base1, public Base2 {
- public:
- virtual ~Derived() {}
- int evenmorepad;
-};
-
-class CopyNoAssign {
- public:
- explicit CopyNoAssign(int value) : foo(value) {}
- CopyNoAssign(const CopyNoAssign& other) : foo(other.foo) {}
- int foo;
- private:
- const CopyNoAssign& operator=(const CopyNoAssign&);
-};
-
-TEST(StatusOr, TestDefaultCtor) {
- StatusOr<int> thing;
- EXPECT_FALSE(thing.ok());
- EXPECT_EQ(util::UnknownError(""), thing.status());
-}
-
-TEST(StatusOr, TestStatusCtor) {
- StatusOr<int> thing(util::CancelledError(""));
- EXPECT_FALSE(thing.ok());
- EXPECT_EQ(util::CancelledError(""), thing.status());
-}
-
-TEST(StatusOr, TestValueCtor) {
- const int kI = 4;
- StatusOr<int> thing(kI);
- EXPECT_TRUE(thing.ok());
- EXPECT_EQ(kI, thing.value());
-}
-
-TEST(StatusOr, TestCopyCtorStatusOk) {
- const int kI = 4;
- StatusOr<int> original(kI);
- StatusOr<int> copy(original);
- EXPECT_EQ(original.status(), copy.status());
- EXPECT_EQ(original.value(), copy.value());
-}
-
-TEST(StatusOr, TestCopyCtorStatusNotOk) {
- StatusOr<int> original(util::CancelledError(""));
- StatusOr<int> copy(original);
- EXPECT_EQ(original.status(), copy.status());
-}
-
-TEST(StatusOr, TestCopyCtorStatusOKConverting) {
- const int kI = 4;
- StatusOr<int> original(kI);
- StatusOr<double> copy(original);
- EXPECT_EQ(original.status(), copy.status());
- EXPECT_EQ(original.value(), copy.value());
-}
-
-TEST(StatusOr, TestCopyCtorStatusNotOkConverting) {
- StatusOr<int> original(util::CancelledError(""));
- StatusOr<double> copy(original);
- EXPECT_EQ(original.status(), copy.status());
-}
-
-TEST(StatusOr, TestAssignmentStatusOk) {
- const int kI = 4;
- StatusOr<int> source(kI);
- StatusOr<int> target;
- target = source;
- EXPECT_EQ(source.status(), target.status());
- EXPECT_EQ(source.value(), target.value());
-}
-
-TEST(StatusOr, TestAssignmentStatusNotOk) {
- StatusOr<int> source(util::CancelledError(""));
- StatusOr<int> target;
- target = source;
- EXPECT_EQ(source.status(), target.status());
-}
-
-TEST(StatusOr, TestAssignmentStatusOKConverting) {
- const int kI = 4;
- StatusOr<int> source(kI);
- StatusOr<double> target;
- target = source;
- EXPECT_EQ(source.status(), target.status());
- EXPECT_DOUBLE_EQ(source.value(), target.value());
-}
-
-TEST(StatusOr, TestAssignmentStatusNotOkConverting) {
- StatusOr<int> source(util::CancelledError(""));
- StatusOr<double> target;
- target = source;
- EXPECT_EQ(source.status(), target.status());
-}
-
-TEST(StatusOr, TestStatus) {
- StatusOr<int> good(4);
- EXPECT_TRUE(good.ok());
- StatusOr<int> bad(util::CancelledError(""));
- EXPECT_FALSE(bad.ok());
- EXPECT_EQ(util::CancelledError(""), bad.status());
-}
-
-TEST(StatusOr, TestValue) {
- const int kI = 4;
- StatusOr<int> thing(kI);
- EXPECT_EQ(kI, thing.value());
-}
-
-TEST(StatusOr, TestValueConst) {
- const int kI = 4;
- const StatusOr<int> thing(kI);
- EXPECT_EQ(kI, thing.value());
-}
-
-TEST(StatusOr, TestPointerDefaultCtor) {
- StatusOr<int*> thing;
- EXPECT_FALSE(thing.ok());
- EXPECT_EQ(util::UnknownError(""), thing.status());
-}
-
-TEST(StatusOr, TestPointerStatusCtor) {
- StatusOr<int*> thing(util::CancelledError(""));
- EXPECT_FALSE(thing.ok());
- EXPECT_EQ(util::CancelledError(""), thing.status());
-}
-
-TEST(StatusOr, TestPointerValueCtor) {
- const int kI = 4;
- StatusOr<const int*> thing(&kI);
- EXPECT_TRUE(thing.ok());
- EXPECT_EQ(&kI, thing.value());
-}
-
-TEST(StatusOr, TestPointerCopyCtorStatusOk) {
- const int kI = 0;
- StatusOr<const int*> original(&kI);
- StatusOr<const int*> copy(original);
- EXPECT_EQ(original.status(), copy.status());
- EXPECT_EQ(original.value(), copy.value());
-}
-
-TEST(StatusOr, TestPointerCopyCtorStatusNotOk) {
- StatusOr<int*> original(util::CancelledError(""));
- StatusOr<int*> copy(original);
- EXPECT_EQ(original.status(), copy.status());
-}
-
-TEST(StatusOr, TestPointerCopyCtorStatusOKConverting) {
- Derived derived;
- StatusOr<Derived*> original(&derived);
- StatusOr<Base2*> copy(original);
- EXPECT_EQ(original.status(), copy.status());
- EXPECT_EQ(static_cast<const Base2*>(original.value()), copy.value());
-}
-
-TEST(StatusOr, TestPointerCopyCtorStatusNotOkConverting) {
- StatusOr<Derived*> original(util::CancelledError(""));
- StatusOr<Base2*> copy(original);
- EXPECT_EQ(original.status(), copy.status());
-}
-
-TEST(StatusOr, TestPointerAssignmentStatusOk) {
- const int kI = 0;
- StatusOr<const int*> source(&kI);
- StatusOr<const int*> target;
- target = source;
- EXPECT_EQ(source.status(), target.status());
- EXPECT_EQ(source.value(), target.value());
-}
-
-TEST(StatusOr, TestPointerAssignmentStatusNotOk) {
- StatusOr<int*> source(util::CancelledError(""));
- StatusOr<int*> target;
- target = source;
- EXPECT_EQ(source.status(), target.status());
-}
-
-TEST(StatusOr, TestPointerAssignmentStatusOKConverting) {
- Derived derived;
- StatusOr<Derived*> source(&derived);
- StatusOr<Base2*> target;
- target = source;
- EXPECT_EQ(source.status(), target.status());
- EXPECT_EQ(static_cast<const Base2*>(source.value()), target.value());
-}
-
-TEST(StatusOr, TestPointerAssignmentStatusNotOkConverting) {
- StatusOr<Derived*> source(util::CancelledError(""));
- StatusOr<Base2*> target;
- target = source;
- EXPECT_EQ(source.status(), target.status());
-}
-
-TEST(StatusOr, TestPointerStatus) {
- const int kI = 0;
- StatusOr<const int*> good(&kI);
- EXPECT_TRUE(good.ok());
- StatusOr<const int*> bad(util::CancelledError(""));
- EXPECT_EQ(util::CancelledError(""), bad.status());
-}
-
-TEST(StatusOr, TestPointerValue) {
- const int kI = 0;
- StatusOr<const int*> thing(&kI);
- EXPECT_EQ(&kI, thing.value());
-}
-
-TEST(StatusOr, TestPointerValueConst) {
- const int kI = 0;
- const StatusOr<const int*> thing(&kI);
- EXPECT_EQ(&kI, thing.value());
-}
-
-} // namespace
-} // namespace util
-} // namespace protobuf
-} // namespace google
diff --git a/src/google/protobuf/stubs/stl_util.h b/src/google/protobuf/stubs/stl_util.h
index e6260d0..cd10c4b 100644
--- a/src/google/protobuf/stubs/stl_util.h
+++ b/src/google/protobuf/stubs/stl_util.h
@@ -33,38 +33,16 @@
#ifndef GOOGLE_PROTOBUF_STUBS_STL_UTIL_H__
#define GOOGLE_PROTOBUF_STUBS_STL_UTIL_H__
-#include <google/protobuf/stubs/common.h>
-
#include <algorithm>
+#include "google/protobuf/stubs/common.h"
+
// Must be last.
-#include <google/protobuf/port_def.inc> // NOLINT
+#include "google/protobuf/port_def.inc" // NOLINT
namespace google {
namespace protobuf {
-// Inside Google, this function implements a horrible, disgusting hack in which
-// we reach into the string's private implementation and resize it without
-// initializing the new bytes. In some cases doing this can significantly
-// improve performance. However, since it's totally non-portable it has no
-// place in open source code. Feel free to fill this function in with your
-// own disgusting hack if you want the perf boost.
-inline void STLStringResizeUninitialized(std::string* s, size_t new_size) {
- s->resize(new_size);
-}
-
-// As above, but we make sure to follow amortized growth in which we always
-// increase the capacity by at least a constant factor >1.
-inline void STLStringResizeUninitializedAmortized(std::string* s,
- size_t new_size) {
- const size_t cap = s->capacity();
- if (new_size > cap) {
- // Make sure to always grow by at least a factor of 2x.
- s->reserve(std::max<size_t>(new_size, 2 * cap));
- }
- STLStringResizeUninitialized(s, new_size);
-}
-
// Return a mutable char* pointing to a string's internal buffer,
// which may not be null-terminated. Writing through this pointer will
// modify the string.
@@ -85,6 +63,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc> // NOLINT
+#include "google/protobuf/port_undef.inc" // NOLINT
#endif // GOOGLE_PROTOBUF_STUBS_STL_UTIL_H__
diff --git a/src/google/protobuf/stubs/stringpiece.cc b/src/google/protobuf/stubs/stringpiece.cc
deleted file mode 100644
index 7188046..0000000
--- a/src/google/protobuf/stubs/stringpiece.cc
+++ /dev/null
@@ -1,256 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/stubs/stringpiece.h>
-
-#include <string.h>
-#include <algorithm>
-#include <climits>
-#include <string>
-#include <ostream>
-
-#include <google/protobuf/stubs/logging.h>
-
-namespace google {
-namespace protobuf {
-namespace stringpiece_internal {
-
-std::ostream& operator<<(std::ostream& o, StringPiece piece) {
- o.write(piece.data(), piece.size());
- return o;
-}
-
-void StringPiece::LogFatalSizeTooBig(size_t size, const char* details) {
- GOOGLE_LOG(FATAL) << "size too big: " << size << " details: " << details;
-}
-
-void StringPiece::CopyToString(std::string* target) const {
- target->assign(ptr_, length_);
-}
-
-void StringPiece::AppendToString(std::string* target) const {
- target->append(ptr_, length_);
-}
-
-bool StringPiece::Consume(StringPiece x) {
- if (starts_with(x)) {
- ptr_ += x.length_;
- length_ -= x.length_;
- return true;
- }
- return false;
-}
-
-bool StringPiece::ConsumeFromEnd(StringPiece x) {
- if (ends_with(x)) {
- length_ -= x.length_;
- return true;
- }
- return false;
-}
-
-StringPiece::size_type StringPiece::copy(char* buf, size_type n,
- size_type pos) const {
- size_type ret = std::min(length_ - pos, n);
- memcpy(buf, ptr_ + pos, ret);
- return ret;
-}
-
-bool StringPiece::contains(StringPiece s) const {
- return find(s, 0) != npos;
-}
-
-StringPiece::size_type StringPiece::find(StringPiece s, size_type pos) const {
- if (length_ <= 0 || pos > static_cast<size_type>(length_)) {
- if (length_ == 0 && pos == 0 && s.length_ == 0) return 0;
- return npos;
- }
- const char *result = std::search(ptr_ + pos, ptr_ + length_,
- s.ptr_, s.ptr_ + s.length_);
- return result == ptr_ + length_ ? npos : result - ptr_;
-}
-
-StringPiece::size_type StringPiece::find(char c, size_type pos) const {
- if (length_ <= 0 || pos >= static_cast<size_type>(length_)) {
- return npos;
- }
- const char* result = static_cast<const char*>(
- memchr(ptr_ + pos, c, length_ - pos));
- return result != nullptr ? result - ptr_ : npos;
-}
-
-StringPiece::size_type StringPiece::rfind(StringPiece s, size_type pos) const {
- if (length_ < s.length_) return npos;
- const size_t ulen = length_;
- if (s.length_ == 0) return std::min(ulen, pos);
-
- const char* last = ptr_ + std::min(ulen - s.length_, pos) + s.length_;
- const char* result = std::find_end(ptr_, last, s.ptr_, s.ptr_ + s.length_);
- return result != last ? result - ptr_ : npos;
-}
-
-// Search range is [0..pos] inclusive. If pos == npos, search everything.
-StringPiece::size_type StringPiece::rfind(char c, size_type pos) const {
- // Note: memrchr() is not available on Windows.
- if (empty()) return npos;
- for (size_type i = std::min(pos, length_ - 1);; --i) {
- if (ptr_[i] == c) {
- return i;
- }
- if (i == 0) break;
- }
- return npos;
-}
-
-// For each character in characters_wanted, sets the index corresponding
-// to the ASCII code of that character to 1 in table. This is used by
-// the find_.*_of methods below to tell whether or not a character is in
-// the lookup table in constant time.
-// The argument `table' must be an array that is large enough to hold all
-// the possible values of an unsigned char. Thus it should be be declared
-// as follows:
-// bool table[UCHAR_MAX + 1]
-static inline void BuildLookupTable(StringPiece characters_wanted,
- bool* table) {
- const StringPiece::size_type length = characters_wanted.length();
- const char* const data = characters_wanted.data();
- for (StringPiece::size_type i = 0; i < length; ++i) {
- table[static_cast<unsigned char>(data[i])] = true;
- }
-}
-
-StringPiece::size_type StringPiece::find_first_of(StringPiece s,
- size_type pos) const {
- if (empty() || s.empty()) {
- return npos;
- }
- // Avoid the cost of BuildLookupTable() for a single-character search.
- if (s.length_ == 1) return find_first_of(s.ptr_[0], pos);
-
- bool lookup[UCHAR_MAX + 1] = { false };
- BuildLookupTable(s, lookup);
- for (size_type i = pos; i < length_; ++i) {
- if (lookup[static_cast<unsigned char>(ptr_[i])]) {
- return i;
- }
- }
- return npos;
-}
-
-StringPiece::size_type StringPiece::find_first_not_of(StringPiece s,
- size_type pos) const {
- if (empty()) return npos;
- if (s.empty()) return 0;
- // Avoid the cost of BuildLookupTable() for a single-character search.
- if (s.length_ == 1) return find_first_not_of(s.ptr_[0], pos);
-
- bool lookup[UCHAR_MAX + 1] = { false };
- BuildLookupTable(s, lookup);
- for (size_type i = pos; i < length_; ++i) {
- if (!lookup[static_cast<unsigned char>(ptr_[i])]) {
- return i;
- }
- }
- return npos;
-}
-
-StringPiece::size_type StringPiece::find_first_not_of(char c,
- size_type pos) const {
- if (empty()) return npos;
-
- for (; pos < static_cast<size_type>(length_); ++pos) {
- if (ptr_[pos] != c) {
- return pos;
- }
- }
- return npos;
-}
-
-StringPiece::size_type StringPiece::find_last_of(StringPiece s,
- size_type pos) const {
- if (empty() || s.empty()) return npos;
- // Avoid the cost of BuildLookupTable() for a single-character search.
- if (s.length_ == 1) return find_last_of(s.ptr_[0], pos);
-
- bool lookup[UCHAR_MAX + 1] = { false };
- BuildLookupTable(s, lookup);
- for (size_type i = std::min(pos, length_ - 1);; --i) {
- if (lookup[static_cast<unsigned char>(ptr_[i])]) {
- return i;
- }
- if (i == 0) break;
- }
- return npos;
-}
-
-StringPiece::size_type StringPiece::find_last_not_of(StringPiece s,
- size_type pos) const {
- if (empty()) return npos;
-
- size_type i = std::min(pos, length() - 1);
- if (s.empty()) return i;
-
- // Avoid the cost of BuildLookupTable() for a single-character search.
- if (s.length_ == 1) return find_last_not_of(s.ptr_[0], pos);
-
- bool lookup[UCHAR_MAX + 1] = { false };
- BuildLookupTable(s, lookup);
- for (;; --i) {
- if (!lookup[static_cast<unsigned char>(ptr_[i])]) {
- return i;
- }
- if (i == 0) break;
- }
- return npos;
-}
-
-StringPiece::size_type StringPiece::find_last_not_of(char c,
- size_type pos) const {
- if (empty()) return npos;
- size_type i = std::min(pos, length_ - 1);
- for (;; --i) {
- if (ptr_[i] != c) {
- return i;
- }
- if (i == 0) break;
- }
- return npos;
-}
-
-StringPiece StringPiece::substr(size_type pos, size_type n) const {
- if (pos > length()) pos = length();
- if (n > length_ - pos) n = length() - pos;
- return StringPiece(ptr_ + pos, n);
-}
-
-const StringPiece::size_type StringPiece::npos = size_type(-1);
-
-} // namespace stringpiece_internal
-} // namespace protobuf
-} // namespace google
diff --git a/src/google/protobuf/stubs/stringpiece.h b/src/google/protobuf/stubs/stringpiece.h
deleted file mode 100644
index c63e25b..0000000
--- a/src/google/protobuf/stubs/stringpiece.h
+++ /dev/null
@@ -1,402 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// A StringPiece points to part or all of a string, Cord, double-quoted string
-// literal, or other string-like object. A StringPiece does *not* own the
-// string to which it points. A StringPiece is not null-terminated.
-//
-// You can use StringPiece as a function or method parameter. A StringPiece
-// parameter can receive a double-quoted string literal argument, a "const
-// char*" argument, a string argument, or a StringPiece argument with no data
-// copying. Systematic use of StringPiece for arguments reduces data
-// copies and strlen() calls.
-//
-// Prefer passing StringPieces by value:
-// void MyFunction(StringPiece arg);
-// If circumstances require, you may also pass by const reference:
-// void MyFunction(const StringPiece& arg); // not preferred
-// Both of these have the same lifetime semantics. Passing by value
-// generates slightly smaller code. For more discussion, see the thread
-// go/stringpiecebyvalue on c-users.
-//
-// StringPiece is also suitable for local variables if you know that
-// the lifetime of the underlying object is longer than the lifetime
-// of your StringPiece variable.
-//
-// Beware of binding a StringPiece to a temporary:
-// StringPiece sp = obj.MethodReturningString(); // BAD: lifetime problem
-//
-// This code is okay:
-// string str = obj.MethodReturningString(); // str owns its contents
-// StringPiece sp(str); // GOOD, because str outlives sp
-//
-// StringPiece is sometimes a poor choice for a return value and usually a poor
-// choice for a data member. If you do use a StringPiece this way, it is your
-// responsibility to ensure that the object pointed to by the StringPiece
-// outlives the StringPiece.
-//
-// A StringPiece may represent just part of a string; thus the name "Piece".
-// For example, when splitting a string, vector<StringPiece> is a natural data
-// type for the output. For another example, a Cord is a non-contiguous,
-// potentially very long string-like object. The Cord class has an interface
-// that iteratively provides StringPiece objects that point to the
-// successive pieces of a Cord object.
-//
-// A StringPiece is not null-terminated. If you write code that scans a
-// StringPiece, you must check its length before reading any characters.
-// Common idioms that work on null-terminated strings do not work on
-// StringPiece objects.
-//
-// There are several ways to create a null StringPiece:
-// StringPiece()
-// StringPiece(nullptr)
-// StringPiece(nullptr, 0)
-// For all of the above, sp.data() == nullptr, sp.length() == 0,
-// and sp.empty() == true. Also, if you create a StringPiece with
-// a non-null pointer then sp.data() != nullptr. Once created,
-// sp.data() will stay either nullptr or not-nullptr, except if you call
-// sp.clear() or sp.set().
-//
-// Thus, you can use StringPiece(nullptr) to signal an out-of-band value
-// that is different from other StringPiece values. This is similar
-// to the way that const char* p1 = nullptr; is different from
-// const char* p2 = "";.
-//
-// There are many ways to create an empty StringPiece:
-// StringPiece()
-// StringPiece(nullptr)
-// StringPiece(nullptr, 0)
-// StringPiece("")
-// StringPiece("", 0)
-// StringPiece("abcdef", 0)
-// StringPiece("abcdef"+6, 0)
-// For all of the above, sp.length() will be 0 and sp.empty() will be true.
-// For some empty StringPiece values, sp.data() will be nullptr.
-// For some empty StringPiece values, sp.data() will not be nullptr.
-//
-// Be careful not to confuse: null StringPiece and empty StringPiece.
-// The set of empty StringPieces properly includes the set of null StringPieces.
-// That is, every null StringPiece is an empty StringPiece,
-// but some non-null StringPieces are empty Stringpieces too.
-//
-// All empty StringPiece values compare equal to each other.
-// Even a null StringPieces compares equal to a non-null empty StringPiece:
-// StringPiece() == StringPiece("", 0)
-// StringPiece(nullptr) == StringPiece("abc", 0)
-// StringPiece(nullptr, 0) == StringPiece("abcdef"+6, 0)
-//
-// Look carefully at this example:
-// StringPiece("") == nullptr
-// True or false? TRUE, because StringPiece::operator== converts
-// the right-hand side from nullptr to StringPiece(nullptr),
-// and then compares two zero-length spans of characters.
-// However, we are working to make this example produce a compile error.
-//
-// Suppose you want to write:
-// bool TestWhat?(StringPiece sp) { return sp == nullptr; } // BAD
-// Do not do that. Write one of these instead:
-// bool TestNull(StringPiece sp) { return sp.data() == nullptr; }
-// bool TestEmpty(StringPiece sp) { return sp.empty(); }
-// The intent of TestWhat? is unclear. Did you mean TestNull or TestEmpty?
-// Right now, TestWhat? behaves likes TestEmpty.
-// We are working to make TestWhat? produce a compile error.
-// TestNull is good to test for an out-of-band signal.
-// TestEmpty is good to test for an empty StringPiece.
-//
-// Caveats (again):
-// (1) The lifetime of the pointed-to string (or piece of a string)
-// must be longer than the lifetime of the StringPiece.
-// (2) There may or may not be a '\0' character after the end of
-// StringPiece data.
-// (3) A null StringPiece is empty.
-// An empty StringPiece may or may not be a null StringPiece.
-
-#ifndef GOOGLE_PROTOBUF_STUBS_STRINGPIECE_H_
-#define GOOGLE_PROTOBUF_STUBS_STRINGPIECE_H_
-
-#include <assert.h>
-#include <stddef.h>
-#include <string.h>
-#include <iosfwd>
-#include <limits>
-#include <string>
-
-#if defined(__cpp_lib_string_view)
-#include <string_view>
-#endif
-
-#include <google/protobuf/stubs/hash.h>
-
-#include <google/protobuf/port_def.inc>
-
-namespace google {
-namespace protobuf {
-namespace stringpiece_internal {
-
-class PROTOBUF_EXPORT StringPiece {
- public:
- using traits_type = std::char_traits<char>;
- using value_type = char;
- using pointer = char*;
- using const_pointer = const char*;
- using reference = char&;
- using const_reference = const char&;
- using const_iterator = const char*;
- using iterator = const_iterator;
- using const_reverse_iterator = std::reverse_iterator<const_iterator>;
- using reverse_iterator = const_reverse_iterator;
- using size_type = size_t;
- using difference_type = std::ptrdiff_t;
-
- private:
- const char* ptr_;
- size_type length_;
-
- static constexpr size_type kMaxSize =
- (std::numeric_limits<difference_type>::max)();
-
- static size_type CheckSize(size_type size) {
-#if !defined(NDEBUG) || defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE > 0
- if (PROTOBUF_PREDICT_FALSE(size > kMaxSize)) {
- // Some people grep for this message in logs
- // so take care if you ever change it.
- LogFatalSizeTooBig(size, "string length exceeds max size");
- }
-#endif
- return size;
- }
-
- // Out-of-line error path.
- static void LogFatalSizeTooBig(size_type size, const char* details);
-
- public:
- // We provide non-explicit singleton constructors so users can pass
- // in a "const char*" or a "string" wherever a "StringPiece" is
- // expected.
- //
- // Style guide exception granted:
- // http://goto/style-guide-exception-20978288
- StringPiece() : ptr_(nullptr), length_(0) {}
-
- StringPiece(const char* str) // NOLINT(runtime/explicit)
- : ptr_(str), length_(0) {
- if (str != nullptr) {
- length_ = CheckSize(strlen(str));
- }
- }
-
- template <class Allocator>
- StringPiece( // NOLINT(runtime/explicit)
- const std::basic_string<char, std::char_traits<char>, Allocator>& str)
- : ptr_(str.data()), length_(0) {
- length_ = CheckSize(str.size());
- }
-
-#if defined(__cpp_lib_string_view)
- StringPiece( // NOLINT(runtime/explicit)
- std::string_view str)
- : ptr_(str.data()), length_(0) {
- length_ = CheckSize(str.size());
- }
-#endif
-
- StringPiece(const char* offset, size_type len)
- : ptr_(offset), length_(CheckSize(len)) {}
-
- // data() may return a pointer to a buffer with embedded NULs, and the
- // returned buffer may or may not be null terminated. Therefore it is
- // typically a mistake to pass data() to a routine that expects a NUL
- // terminated string.
- const_pointer data() const { return ptr_; }
- size_type size() const { return length_; }
- size_type length() const { return length_; }
- bool empty() const { return length_ == 0; }
-
- char operator[](size_type i) const {
- assert(i < length_);
- return ptr_[i];
- }
-
- void remove_prefix(size_type n) {
- assert(length_ >= n);
- ptr_ += n;
- length_ -= n;
- }
-
- void remove_suffix(size_type n) {
- assert(length_ >= n);
- length_ -= n;
- }
-
- // returns {-1, 0, 1}
- int compare(StringPiece x) const {
- size_type min_size = length_ < x.length_ ? length_ : x.length_;
- int r = memcmp(ptr_, x.ptr_, static_cast<size_t>(min_size));
- if (r < 0) return -1;
- if (r > 0) return 1;
- if (length_ < x.length_) return -1;
- if (length_ > x.length_) return 1;
- return 0;
- }
-
- std::string as_string() const { return ToString(); }
- // We also define ToString() here, since many other string-like
- // interfaces name the routine that converts to a C++ string
- // "ToString", and it's confusing to have the method that does that
- // for a StringPiece be called "as_string()". We also leave the
- // "as_string()" method defined here for existing code.
- std::string ToString() const {
- if (ptr_ == nullptr) return "";
- return std::string(data(), static_cast<size_type>(size()));
- }
-
- explicit operator std::string() const { return ToString(); }
-
- void CopyToString(std::string* target) const;
- void AppendToString(std::string* target) const;
-
- bool starts_with(StringPiece x) const {
- return (length_ >= x.length_) &&
- (memcmp(ptr_, x.ptr_, static_cast<size_t>(x.length_)) == 0);
- }
-
- bool ends_with(StringPiece x) const {
- return ((length_ >= x.length_) &&
- (memcmp(ptr_ + (length_-x.length_), x.ptr_,
- static_cast<size_t>(x.length_)) == 0));
- }
-
- // Checks whether StringPiece starts with x and if so advances the beginning
- // of it to past the match. It's basically a shortcut for starts_with
- // followed by remove_prefix.
- bool Consume(StringPiece x);
- // Like above but for the end of the string.
- bool ConsumeFromEnd(StringPiece x);
-
- // standard STL container boilerplate
- static const size_type npos;
- const_iterator begin() const { return ptr_; }
- const_iterator end() const { return ptr_ + length_; }
- const_reverse_iterator rbegin() const {
- return const_reverse_iterator(ptr_ + length_);
- }
- const_reverse_iterator rend() const {
- return const_reverse_iterator(ptr_);
- }
- size_type max_size() const { return length_; }
- size_type capacity() const { return length_; }
-
- // cpplint.py emits a false positive [build/include_what_you_use]
- size_type copy(char* buf, size_type n, size_type pos = 0) const; // NOLINT
-
- bool contains(StringPiece s) const;
-
- size_type find(StringPiece s, size_type pos = 0) const;
- size_type find(char c, size_type pos = 0) const;
- size_type rfind(StringPiece s, size_type pos = npos) const;
- size_type rfind(char c, size_type pos = npos) const;
-
- size_type find_first_of(StringPiece s, size_type pos = 0) const;
- size_type find_first_of(char c, size_type pos = 0) const {
- return find(c, pos);
- }
- size_type find_first_not_of(StringPiece s, size_type pos = 0) const;
- size_type find_first_not_of(char c, size_type pos = 0) const;
- size_type find_last_of(StringPiece s, size_type pos = npos) const;
- size_type find_last_of(char c, size_type pos = npos) const {
- return rfind(c, pos);
- }
- size_type find_last_not_of(StringPiece s, size_type pos = npos) const;
- size_type find_last_not_of(char c, size_type pos = npos) const;
-
- StringPiece substr(size_type pos, size_type n = npos) const;
-};
-
-// This large function is defined inline so that in a fairly common case where
-// one of the arguments is a literal, the compiler can elide a lot of the
-// following comparisons.
-inline bool operator==(StringPiece x, StringPiece y) {
- StringPiece::size_type len = x.size();
- if (len != y.size()) {
- return false;
- }
-
- return x.data() == y.data() || len <= 0 ||
- memcmp(x.data(), y.data(), static_cast<size_t>(len)) == 0;
-}
-
-inline bool operator!=(StringPiece x, StringPiece y) {
- return !(x == y);
-}
-
-inline bool operator<(StringPiece x, StringPiece y) {
- const StringPiece::size_type min_size =
- x.size() < y.size() ? x.size() : y.size();
- const int r = memcmp(x.data(), y.data(), static_cast<size_t>(min_size));
- return (r < 0) || (r == 0 && x.size() < y.size());
-}
-
-inline bool operator>(StringPiece x, StringPiece y) {
- return y < x;
-}
-
-inline bool operator<=(StringPiece x, StringPiece y) {
- return !(x > y);
-}
-
-inline bool operator>=(StringPiece x, StringPiece y) {
- return !(x < y);
-}
-
-// allow StringPiece to be logged
-extern std::ostream& operator<<(std::ostream& o, StringPiece piece);
-
-} // namespace stringpiece_internal
-
-using ::google::protobuf::stringpiece_internal::StringPiece;
-
-} // namespace protobuf
-} // namespace google
-
-GOOGLE_PROTOBUF_HASH_NAMESPACE_DECLARATION_START
-template<> struct hash<StringPiece> {
- size_t operator()(const StringPiece& s) const {
- size_t result = 0;
- for (const char *str = s.data(), *end = str + s.size(); str < end; str++) {
- result = 5 * result + static_cast<size_t>(*str);
- }
- return result;
- }
-};
-GOOGLE_PROTOBUF_HASH_NAMESPACE_DECLARATION_END
-
-#include <google/protobuf/port_undef.inc>
-
-#endif // STRINGS_STRINGPIECE_H_
diff --git a/src/google/protobuf/stubs/stringpiece_unittest.cc b/src/google/protobuf/stubs/stringpiece_unittest.cc
deleted file mode 100644
index ba904cb..0000000
--- a/src/google/protobuf/stubs/stringpiece_unittest.cc
+++ /dev/null
@@ -1,695 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/stubs/stringpiece.h>
-
-#include <iterator>
-#include <map>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include <google/protobuf/testing/googletest.h>
-#include <google/protobuf/stubs/hash.h>
-#include <gtest/gtest.h>
-
-namespace google {
-namespace protobuf {
-namespace {
-TEST(StringPiece, Ctor) {
- {
- // Null.
- StringPiece s10;
- EXPECT_TRUE(s10.data() == nullptr);
- EXPECT_EQ(0, s10.length());
- }
-
- {
- // const char* without length.
- const char* hello = "hello";
- StringPiece s20(hello);
- EXPECT_TRUE(s20.data() == hello);
- EXPECT_EQ(5, s20.length());
-
- // const char* with length.
- StringPiece s21(hello, 4);
- EXPECT_TRUE(s21.data() == hello);
- EXPECT_EQ(4, s21.length());
-
- // Not recommended, but valid C++
- StringPiece s22(hello, 6);
- EXPECT_TRUE(s22.data() == hello);
- EXPECT_EQ(6, s22.length());
- }
-
- {
- // std::string.
- std::string hola = "hola";
- StringPiece s30(hola);
- EXPECT_TRUE(s30.data() == hola.data());
- EXPECT_EQ(4, s30.length());
-
- // std::string with embedded '\0'.
- hola.push_back('\0');
- hola.append("h2");
- hola.push_back('\0');
- StringPiece s31(hola);
- EXPECT_TRUE(s31.data() == hola.data());
- EXPECT_EQ(8, s31.length());
- }
-
-#if defined(HAS_GLOBAL_STRING)
- {
- // ::string
- std::string bonjour = "bonjour";
- StringPiece s40(bonjour);
- EXPECT_TRUE(s40.data() == bonjour.data());
- EXPECT_EQ(7, s40.length());
- }
-#endif
-
- // TODO(mec): StringPiece(StringPiece x, int pos);
- // TODO(mec): StringPiece(StringPiece x, int pos, int len);
- // TODO(mec): StringPiece(const StringPiece&);
-}
-
-TEST(StringPiece, STLComparator) {
- std::string s1("foo");
- std::string s2("bar");
- std::string s3("baz");
-
- StringPiece p1(s1);
- StringPiece p2(s2);
- StringPiece p3(s3);
-
- typedef std::map<StringPiece, int> TestMap;
- TestMap map;
-
- map.insert(std::make_pair(p1, 0));
- map.insert(std::make_pair(p2, 1));
- map.insert(std::make_pair(p3, 2));
- EXPECT_EQ(map.size(), 3);
-
- TestMap::const_iterator iter = map.begin();
- EXPECT_EQ(iter->second, 1);
- ++iter;
- EXPECT_EQ(iter->second, 2);
- ++iter;
- EXPECT_EQ(iter->second, 0);
- ++iter;
- EXPECT_TRUE(iter == map.end());
-
- TestMap::iterator new_iter = map.find("zot");
- EXPECT_TRUE(new_iter == map.end());
-
- new_iter = map.find("bar");
- EXPECT_TRUE(new_iter != map.end());
-
- map.erase(new_iter);
- EXPECT_EQ(map.size(), 2);
-
- iter = map.begin();
- EXPECT_EQ(iter->second, 2);
- ++iter;
- EXPECT_EQ(iter->second, 0);
- ++iter;
- EXPECT_TRUE(iter == map.end());
-}
-
-TEST(StringPiece, ComparisonOperators) {
-#define COMPARE(result, op, x, y) \
- EXPECT_EQ(result, StringPiece((x)) op StringPiece((y))); \
- EXPECT_EQ(result, StringPiece((x)).compare(StringPiece((y))) op 0)
-
- COMPARE(true, ==, "", "");
- COMPARE(true, ==, "", nullptr);
- COMPARE(true, ==, nullptr, "");
- COMPARE(true, ==, "a", "a");
- COMPARE(true, ==, "aa", "aa");
- COMPARE(false, ==, "a", "");
- COMPARE(false, ==, "", "a");
- COMPARE(false, ==, "a", "b");
- COMPARE(false, ==, "a", "aa");
- COMPARE(false, ==, "aa", "a");
-
- COMPARE(false, !=, "", "");
- COMPARE(false, !=, "a", "a");
- COMPARE(false, !=, "aa", "aa");
- COMPARE(true, !=, "a", "");
- COMPARE(true, !=, "", "a");
- COMPARE(true, !=, "a", "b");
- COMPARE(true, !=, "a", "aa");
- COMPARE(true, !=, "aa", "a");
-
- COMPARE(true, <, "a", "b");
- COMPARE(true, <, "a", "aa");
- COMPARE(true, <, "aa", "b");
- COMPARE(true, <, "aa", "bb");
- COMPARE(false, <, "a", "a");
- COMPARE(false, <, "b", "a");
- COMPARE(false, <, "aa", "a");
- COMPARE(false, <, "b", "aa");
- COMPARE(false, <, "bb", "aa");
-
- COMPARE(true, <=, "a", "a");
- COMPARE(true, <=, "a", "b");
- COMPARE(true, <=, "a", "aa");
- COMPARE(true, <=, "aa", "b");
- COMPARE(true, <=, "aa", "bb");
- COMPARE(false, <=, "b", "a");
- COMPARE(false, <=, "aa", "a");
- COMPARE(false, <=, "b", "aa");
- COMPARE(false, <=, "bb", "aa");
-
- COMPARE(false, >=, "a", "b");
- COMPARE(false, >=, "a", "aa");
- COMPARE(false, >=, "aa", "b");
- COMPARE(false, >=, "aa", "bb");
- COMPARE(true, >=, "a", "a");
- COMPARE(true, >=, "b", "a");
- COMPARE(true, >=, "aa", "a");
- COMPARE(true, >=, "b", "aa");
- COMPARE(true, >=, "bb", "aa");
-
- COMPARE(false, >, "a", "a");
- COMPARE(false, >, "a", "b");
- COMPARE(false, >, "a", "aa");
- COMPARE(false, >, "aa", "b");
- COMPARE(false, >, "aa", "bb");
- COMPARE(true, >, "b", "a");
- COMPARE(true, >, "aa", "a");
- COMPARE(true, >, "b", "aa");
- COMPARE(true, >, "bb", "aa");
-
- std::string x;
- for (int i = 0; i < 256; i++) {
- x += 'a';
- std::string y = x;
- COMPARE(true, ==, x, y);
- for (int j = 0; j < i; j++) {
- std::string z = x;
- z[j] = 'b'; // Differs in position 'j'
- COMPARE(false, ==, x, z);
- COMPARE(true, <, x, z);
- COMPARE(true, >, z, x);
- if (j + 1 < i) {
- z[j + 1] = 'A'; // Differs in position 'j+1' as well
- COMPARE(false, ==, x, z);
- COMPARE(true, <, x, z);
- COMPARE(true, >, z, x);
- z[j + 1] = 'z'; // Differs in position 'j+1' as well
- COMPARE(false, ==, x, z);
- COMPARE(true, <, x, z);
- COMPARE(true, >, z, x);
- }
- }
- }
-
-#undef COMPARE
-}
-
-TEST(StringPiece, STL1) {
- const StringPiece a("abcdefghijklmnopqrstuvwxyz");
- const StringPiece b("abc");
- const StringPiece c("xyz");
- const StringPiece d("foobar");
- const StringPiece e;
- std::string temp("123");
- temp += '\0';
- temp += "456";
- const StringPiece f(temp);
-
- EXPECT_EQ(a[6], 'g');
- EXPECT_EQ(b[0], 'a');
- EXPECT_EQ(c[2], 'z');
- EXPECT_EQ(f[3], '\0');
- EXPECT_EQ(f[5], '5');
-
- EXPECT_EQ(*d.data(), 'f');
- EXPECT_EQ(d.data()[5], 'r');
- EXPECT_TRUE(e.data() == nullptr);
-
- EXPECT_EQ(*a.begin(), 'a');
- EXPECT_EQ(*(b.begin() + 2), 'c');
- EXPECT_EQ(*(c.end() - 1), 'z');
-
- EXPECT_EQ(*a.rbegin(), 'z');
- EXPECT_EQ(*(b.rbegin() + 2), 'a');
- EXPECT_EQ(*(c.rend() - 1), 'x');
- EXPECT_TRUE(a.rbegin() + 26 == a.rend());
-
- EXPECT_EQ(a.size(), 26);
- EXPECT_EQ(b.size(), 3);
- EXPECT_EQ(c.size(), 3);
- EXPECT_EQ(d.size(), 6);
- EXPECT_EQ(e.size(), 0);
- EXPECT_EQ(f.size(), 7);
-
- EXPECT_TRUE(!d.empty());
- EXPECT_TRUE(d.begin() != d.end());
- EXPECT_TRUE(d.begin() + 6 == d.end());
-
- EXPECT_TRUE(e.empty());
- EXPECT_TRUE(e.begin() == e.end());
-
- EXPECT_GE(a.max_size(), a.capacity());
- EXPECT_GE(a.capacity(), a.size());
-
- char buf[4] = { '%', '%', '%', '%' };
- EXPECT_EQ(a.copy(buf, 4), 4);
- EXPECT_EQ(buf[0], a[0]);
- EXPECT_EQ(buf[1], a[1]);
- EXPECT_EQ(buf[2], a[2]);
- EXPECT_EQ(buf[3], a[3]);
- EXPECT_EQ(a.copy(buf, 3, 7), 3);
- EXPECT_EQ(buf[0], a[7]);
- EXPECT_EQ(buf[1], a[8]);
- EXPECT_EQ(buf[2], a[9]);
- EXPECT_EQ(buf[3], a[3]);
- EXPECT_EQ(c.copy(buf, 99), 3);
- EXPECT_EQ(buf[0], c[0]);
- EXPECT_EQ(buf[1], c[1]);
- EXPECT_EQ(buf[2], c[2]);
- EXPECT_EQ(buf[3], a[3]);
-}
-
-// Separated from STL1() because some compilers produce an overly
-// large stack frame for the combined function.
-TEST(StringPiece, STL2) {
- const StringPiece a("abcdefghijklmnopqrstuvwxyz");
- const StringPiece b("abc");
- const StringPiece c("xyz");
- const StringPiece e;
- const StringPiece f("123" "\0" "456", 7);
-
- EXPECT_EQ(StringPiece::npos, std::string::npos);
-
- EXPECT_EQ(a.find(b), 0);
- EXPECT_EQ(a.find(b, 1), StringPiece::npos);
- EXPECT_EQ(a.find(c), 23);
- EXPECT_EQ(a.find(c, 9), 23);
- EXPECT_EQ(a.find(c, StringPiece::npos), StringPiece::npos);
- EXPECT_EQ(b.find(c), StringPiece::npos);
- EXPECT_EQ(b.find(c, StringPiece::npos), StringPiece::npos);
- EXPECT_EQ(a.find(e), 0);
- EXPECT_EQ(a.find(e, 17), 17);
- StringPiece g("xx not found bb");
- EXPECT_EQ(a.find(g), StringPiece::npos);
- // empty string nonsense
- EXPECT_EQ(e.find(b), StringPiece::npos);
- EXPECT_EQ(e.find(b, 7), StringPiece::npos);
-
- size_t empty_search_pos = std::string().find(std::string());
- EXPECT_EQ(e.find(e), empty_search_pos);
- EXPECT_EQ(e.find(e, 4), std::string().find(std::string(), 4));
-
- EXPECT_EQ(a.find('a'), 0);
- EXPECT_EQ(a.find('c'), 2);
- EXPECT_EQ(a.find('z'), 25);
- EXPECT_EQ(a.find('$'), StringPiece::npos);
- EXPECT_EQ(a.find('\0'), StringPiece::npos);
- EXPECT_EQ(f.find('\0'), 3);
- EXPECT_EQ(f.find('3'), 2);
- EXPECT_EQ(f.find('5'), 5);
- EXPECT_EQ(g.find('o'), 4);
- EXPECT_EQ(g.find('o', 4), 4);
- EXPECT_EQ(g.find('o', 5), 8);
- EXPECT_EQ(a.find('b', 5), StringPiece::npos);
- // empty string nonsense
- EXPECT_EQ(e.find('\0'), StringPiece::npos);
- EXPECT_EQ(e.find('\0', 7), StringPiece::npos);
- EXPECT_EQ(e.find('x'), StringPiece::npos);
- EXPECT_EQ(e.find('x', 7), StringPiece::npos);
-
- EXPECT_EQ(a.rfind(b), 0);
- EXPECT_EQ(a.rfind(b, 1), 0);
- EXPECT_EQ(a.rfind(c), 23);
- EXPECT_EQ(a.rfind(c, 22), StringPiece::npos);
- EXPECT_EQ(a.rfind(c, 1), StringPiece::npos);
- EXPECT_EQ(a.rfind(c, 0), StringPiece::npos);
- EXPECT_EQ(b.rfind(c), StringPiece::npos);
- EXPECT_EQ(b.rfind(c, 0), StringPiece::npos);
- EXPECT_EQ(a.rfind(e), a.as_string().rfind(std::string()));
- EXPECT_EQ(a.rfind(e, 17), 17);
- EXPECT_EQ(a.rfind(g), StringPiece::npos);
- EXPECT_EQ(e.rfind(b), StringPiece::npos);
- EXPECT_EQ(e.rfind(b, 7), StringPiece::npos);
- // empty string nonsense
- EXPECT_EQ(e.rfind(e, 7), std::string().rfind(std::string()));
- EXPECT_EQ(e.rfind(e), std::string().rfind(std::string()));
-
- EXPECT_EQ(g.rfind('o'), 8);
- EXPECT_EQ(g.rfind('q'), StringPiece::npos);
- EXPECT_EQ(g.rfind('o', 8), 8);
- EXPECT_EQ(g.rfind('o', 7), 4);
- EXPECT_EQ(g.rfind('o', 3), StringPiece::npos);
- EXPECT_EQ(f.rfind('\0'), 3);
- EXPECT_EQ(f.rfind('\0', 12), 3);
- EXPECT_EQ(f.rfind('3'), 2);
- EXPECT_EQ(f.rfind('5'), 5);
- // empty string nonsense
- EXPECT_EQ(e.rfind('o'), StringPiece::npos);
- EXPECT_EQ(e.rfind('o', 7), StringPiece::npos);
-
- EXPECT_EQ(a.find_first_of(b), 0);
- EXPECT_EQ(a.find_first_of(b, 0), 0);
- EXPECT_EQ(a.find_first_of(b, 1), 1);
- EXPECT_EQ(a.find_first_of(b, 2), 2);
- EXPECT_EQ(a.find_first_of(b, 3), StringPiece::npos);
- EXPECT_EQ(a.find_first_of(c), 23);
- EXPECT_EQ(a.find_first_of(c, 23), 23);
- EXPECT_EQ(a.find_first_of(c, 24), 24);
- EXPECT_EQ(a.find_first_of(c, 25), 25);
- EXPECT_EQ(a.find_first_of(c, 26), StringPiece::npos);
- EXPECT_EQ(g.find_first_of(b), 13);
- EXPECT_EQ(g.find_first_of(c), 0);
- EXPECT_EQ(a.find_first_of(f), StringPiece::npos);
- EXPECT_EQ(f.find_first_of(a), StringPiece::npos);
- // empty string nonsense
- EXPECT_EQ(a.find_first_of(e), StringPiece::npos);
- EXPECT_EQ(e.find_first_of(b), StringPiece::npos);
- EXPECT_EQ(e.find_first_of(e), StringPiece::npos);
-
- EXPECT_EQ(a.find_first_not_of(b), 3);
- EXPECT_EQ(a.find_first_not_of(c), 0);
- EXPECT_EQ(b.find_first_not_of(a), StringPiece::npos);
- EXPECT_EQ(c.find_first_not_of(a), StringPiece::npos);
- EXPECT_EQ(f.find_first_not_of(a), 0);
- EXPECT_EQ(a.find_first_not_of(f), 0);
- EXPECT_EQ(a.find_first_not_of(e), 0);
- // empty string nonsense
- EXPECT_EQ(e.find_first_not_of(a), StringPiece::npos);
- EXPECT_EQ(e.find_first_not_of(e), StringPiece::npos);
-
- StringPiece h("====");
- EXPECT_EQ(h.find_first_not_of('='), StringPiece::npos);
- EXPECT_EQ(h.find_first_not_of('=', 3), StringPiece::npos);
- EXPECT_EQ(h.find_first_not_of('\0'), 0);
- EXPECT_EQ(g.find_first_not_of('x'), 2);
- EXPECT_EQ(f.find_first_not_of('\0'), 0);
- EXPECT_EQ(f.find_first_not_of('\0', 3), 4);
- EXPECT_EQ(f.find_first_not_of('\0', 2), 2);
- // empty string nonsense
- EXPECT_EQ(e.find_first_not_of('x'), StringPiece::npos);
- EXPECT_EQ(e.find_first_not_of('\0'), StringPiece::npos);
-
- // StringPiece g("xx not found bb");
- StringPiece i("56");
- EXPECT_EQ(h.find_last_of(a), StringPiece::npos);
- EXPECT_EQ(g.find_last_of(a), g.size()-1);
- EXPECT_EQ(a.find_last_of(b), 2);
- EXPECT_EQ(a.find_last_of(c), a.size()-1);
- EXPECT_EQ(f.find_last_of(i), 6);
- EXPECT_EQ(a.find_last_of('a'), 0);
- EXPECT_EQ(a.find_last_of('b'), 1);
- EXPECT_EQ(a.find_last_of('z'), 25);
- EXPECT_EQ(a.find_last_of('a', 5), 0);
- EXPECT_EQ(a.find_last_of('b', 5), 1);
- EXPECT_EQ(a.find_last_of('b', 0), StringPiece::npos);
- EXPECT_EQ(a.find_last_of('z', 25), 25);
- EXPECT_EQ(a.find_last_of('z', 24), StringPiece::npos);
- EXPECT_EQ(f.find_last_of(i, 5), 5);
- EXPECT_EQ(f.find_last_of(i, 6), 6);
- EXPECT_EQ(f.find_last_of(a, 4), StringPiece::npos);
- // empty string nonsense
- EXPECT_EQ(f.find_last_of(e), StringPiece::npos);
- EXPECT_EQ(f.find_last_of(e, 4), StringPiece::npos);
- EXPECT_EQ(e.find_last_of(e), StringPiece::npos);
- EXPECT_EQ(e.find_last_of(f), StringPiece::npos);
- EXPECT_EQ(e.find_last_of(e, 4), StringPiece::npos);
- EXPECT_EQ(e.find_last_of(f, 4), StringPiece::npos);
-
- EXPECT_EQ(a.find_last_not_of(b), a.size()-1);
- EXPECT_EQ(a.find_last_not_of(c), 22);
- EXPECT_EQ(b.find_last_not_of(a), StringPiece::npos);
- EXPECT_EQ(b.find_last_not_of(b), StringPiece::npos);
- EXPECT_EQ(f.find_last_not_of(i), 4);
- EXPECT_EQ(a.find_last_not_of(c, 24), 22);
- EXPECT_EQ(a.find_last_not_of(b, 3), 3);
- EXPECT_EQ(a.find_last_not_of(b, 2), StringPiece::npos);
- // empty string nonsense
- EXPECT_EQ(f.find_last_not_of(e), f.size()-1);
- EXPECT_EQ(f.find_last_not_of(e, 4), 4);
- EXPECT_EQ(e.find_last_not_of(e), StringPiece::npos);
- EXPECT_EQ(e.find_last_not_of(f), StringPiece::npos);
- EXPECT_EQ(e.find_last_not_of(e, 4), StringPiece::npos);
- EXPECT_EQ(e.find_last_not_of(f, 4), StringPiece::npos);
-
- EXPECT_EQ(h.find_last_not_of('x'), h.size() - 1);
- EXPECT_EQ(h.find_last_not_of('='), StringPiece::npos);
- EXPECT_EQ(b.find_last_not_of('c'), 1);
- EXPECT_EQ(h.find_last_not_of('x', 2), 2);
- EXPECT_EQ(h.find_last_not_of('=', 2), StringPiece::npos);
- EXPECT_EQ(b.find_last_not_of('b', 1), 0);
- // empty string nonsense
- EXPECT_EQ(e.find_last_not_of('x'), StringPiece::npos);
- EXPECT_EQ(e.find_last_not_of('\0'), StringPiece::npos);
-
- EXPECT_EQ(a.substr(0, 3), b);
- EXPECT_EQ(a.substr(23), c);
- EXPECT_EQ(a.substr(23, 3), c);
- EXPECT_EQ(a.substr(23, 99), c);
- EXPECT_EQ(a.substr(0), a);
- EXPECT_EQ(a.substr(3, 2), "de");
- // empty string nonsense
- EXPECT_EQ(a.substr(99, 2), e);
- EXPECT_EQ(e.substr(99), e);
- EXPECT_EQ(e.substr(0, 99), e);
- EXPECT_EQ(e.substr(99, 99), e);
- // use of npos
- EXPECT_EQ(a.substr(0, StringPiece::npos), a);
- EXPECT_EQ(a.substr(23, StringPiece::npos), c);
- EXPECT_EQ(a.substr(StringPiece::npos, 0), e);
- EXPECT_EQ(a.substr(StringPiece::npos, 1), e);
- EXPECT_EQ(a.substr(StringPiece::npos, StringPiece::npos), e);
-}
-
-TEST(StringPiece, Custom) {
- StringPiece a("foobar");
- std::string s1("123");
- s1 += '\0';
- s1 += "456";
- StringPiece b(s1);
- StringPiece e;
- std::string s2;
-
- // CopyToString
- a.CopyToString(&s2);
- EXPECT_EQ(s2.size(), 6);
- EXPECT_EQ(s2, "foobar");
- b.CopyToString(&s2);
- EXPECT_EQ(s2.size(), 7);
- EXPECT_EQ(s1, s2);
- e.CopyToString(&s2);
- EXPECT_TRUE(s2.empty());
-
- // AppendToString
- s2.erase();
- a.AppendToString(&s2);
- EXPECT_EQ(s2.size(), 6);
- EXPECT_EQ(s2, "foobar");
- a.AppendToString(&s2);
- EXPECT_EQ(s2.size(), 12);
- EXPECT_EQ(s2, "foobarfoobar");
-
- // starts_with
- EXPECT_TRUE(a.starts_with(a));
- EXPECT_TRUE(a.starts_with("foo"));
- EXPECT_TRUE(a.starts_with(e));
- EXPECT_TRUE(b.starts_with(s1));
- EXPECT_TRUE(b.starts_with(b));
- EXPECT_TRUE(b.starts_with(e));
- EXPECT_TRUE(e.starts_with(""));
- EXPECT_TRUE(!a.starts_with(b));
- EXPECT_TRUE(!b.starts_with(a));
- EXPECT_TRUE(!e.starts_with(a));
-
- // ends with
- EXPECT_TRUE(a.ends_with(a));
- EXPECT_TRUE(a.ends_with("bar"));
- EXPECT_TRUE(a.ends_with(e));
- EXPECT_TRUE(b.ends_with(s1));
- EXPECT_TRUE(b.ends_with(b));
- EXPECT_TRUE(b.ends_with(e));
- EXPECT_TRUE(e.ends_with(""));
- EXPECT_TRUE(!a.ends_with(b));
- EXPECT_TRUE(!b.ends_with(a));
- EXPECT_TRUE(!e.ends_with(a));
-
- // remove_prefix
- StringPiece c(a);
- c.remove_prefix(3);
- EXPECT_EQ(c, "bar");
- c = a;
- c.remove_prefix(0);
- EXPECT_EQ(c, a);
- c.remove_prefix(c.size());
- EXPECT_EQ(c, e);
-
- // remove_suffix
- c = a;
- c.remove_suffix(3);
- EXPECT_EQ(c, "foo");
- c = a;
- c.remove_suffix(0);
- EXPECT_EQ(c, a);
- c.remove_suffix(c.size());
- EXPECT_EQ(c, e);
-
- c = StringPiece("foobar", 7);
-
- // as_string
- std::string s3(a.as_string().c_str(), 7);
- EXPECT_EQ(c, s3);
- std::string s4(e.as_string());
- EXPECT_TRUE(s4.empty());
-
- // ToString
- {
- std::string s5(a.ToString().c_str(), 7);
- EXPECT_EQ(c, s5);
- std::string s6(e.ToString());
- EXPECT_TRUE(s6.empty());
- }
-
- // Consume
- {
- StringPiece str("foobar");
- EXPECT_TRUE(str.Consume("foo"));
- EXPECT_EQ(str, "bar");
- EXPECT_FALSE(str.Consume("foo"));
- EXPECT_FALSE(str.Consume("barbar"));
- EXPECT_FALSE(str.Consume("ar"));
- EXPECT_EQ(str, "bar");
- }
-
- {
- StringPiece str("foobar");
- EXPECT_TRUE(str.ConsumeFromEnd("bar"));
- EXPECT_EQ(str, "foo");
- EXPECT_FALSE(str.ConsumeFromEnd("bar"));
- EXPECT_FALSE(str.ConsumeFromEnd("foofoo"));
- EXPECT_FALSE(str.ConsumeFromEnd("fo"));
- EXPECT_EQ(str, "foo");
- }
-}
-
-TEST(StringPiece, Contains) {
- StringPiece a("abcdefg");
- StringPiece b("abcd");
- StringPiece c("efg");
- StringPiece d("gh");
- EXPECT_TRUE(a.contains(b));
- EXPECT_TRUE(a.contains(c));
- EXPECT_TRUE(!a.contains(d));
-}
-
-TEST(StringPiece, NullInput) {
- // we used to crash here, but now we don't.
- StringPiece s(nullptr);
- EXPECT_EQ(s.data(), (const char*)nullptr);
- EXPECT_EQ(s.size(), 0);
-
- // .ToString() on a StringPiece with nullptr should produce the empty string.
- EXPECT_EQ("", s.ToString());
- EXPECT_EQ("", s.as_string());
-}
-
-TEST(StringPiece, Comparisons2) {
- StringPiece abc("abcdefghijklmnopqrstuvwxyz");
-
- // check comparison operations on strings longer than 4 bytes.
- EXPECT_EQ(abc, StringPiece("abcdefghijklmnopqrstuvwxyz"));
- EXPECT_EQ(abc.compare(StringPiece("abcdefghijklmnopqrstuvwxyz")), 0);
-
- EXPECT_LT(abc, StringPiece("abcdefghijklmnopqrstuvwxzz"));
- EXPECT_LT(abc.compare(StringPiece("abcdefghijklmnopqrstuvwxzz")), 0);
-
- EXPECT_GT(abc, StringPiece("abcdefghijklmnopqrstuvwxyy"));
- EXPECT_GT(abc.compare(StringPiece("abcdefghijklmnopqrstuvwxyy")), 0);
-
- // starts_with
- EXPECT_TRUE(abc.starts_with(abc));
- EXPECT_TRUE(abc.starts_with("abcdefghijklm"));
- EXPECT_TRUE(!abc.starts_with("abcdefguvwxyz"));
-
- // ends_with
- EXPECT_TRUE(abc.ends_with(abc));
- EXPECT_TRUE(!abc.ends_with("abcdefguvwxyz"));
- EXPECT_TRUE(abc.ends_with("nopqrstuvwxyz"));
-}
-
-TEST(ComparisonOpsTest, StringCompareNotAmbiguous) {
- EXPECT_EQ("hello", std::string("hello"));
- EXPECT_LT("hello", std::string("world"));
-}
-
-TEST(ComparisonOpsTest, HeterogenousStringPieceEquals) {
- EXPECT_EQ(StringPiece("hello"), std::string("hello"));
- EXPECT_EQ("hello", StringPiece("hello"));
-}
-
-TEST(FindOneCharTest, EdgeCases) {
- StringPiece a("xxyyyxx");
-
- // Set a = "xyyyx".
- a.remove_prefix(1);
- a.remove_suffix(1);
-
- EXPECT_EQ(0, a.find('x'));
- EXPECT_EQ(0, a.find('x', 0));
- EXPECT_EQ(4, a.find('x', 1));
- EXPECT_EQ(4, a.find('x', 4));
- EXPECT_EQ(StringPiece::npos, a.find('x', 5));
-
- EXPECT_EQ(4, a.rfind('x'));
- EXPECT_EQ(4, a.rfind('x', 5));
- EXPECT_EQ(4, a.rfind('x', 4));
- EXPECT_EQ(0, a.rfind('x', 3));
- EXPECT_EQ(0, a.rfind('x', 0));
-
- // Set a = "yyy".
- a.remove_prefix(1);
- a.remove_suffix(1);
-
- EXPECT_EQ(StringPiece::npos, a.find('x'));
- EXPECT_EQ(StringPiece::npos, a.rfind('x'));
-}
-
-#ifdef PROTOBUF_HAS_DEATH_TEST
-#ifndef NDEBUG
-TEST(NonNegativeLenTest, NonNegativeLen) {
- EXPECT_DEATH(StringPiece("xyz", -1), "string length exceeds max size");
-}
-#endif // ndef DEBUG
-#endif // PROTOBUF_HAS_DEATH_TEST
-
-} // namespace
-} // namespace protobuf
-} // namespace google
diff --git a/src/google/protobuf/stubs/stringprintf.cc b/src/google/protobuf/stubs/stringprintf.cc
deleted file mode 100644
index a6ad4c0..0000000
--- a/src/google/protobuf/stubs/stringprintf.cc
+++ /dev/null
@@ -1,175 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2012 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// from google3/base/stringprintf.cc
-
-#include <google/protobuf/stubs/stringprintf.h>
-
-#include <errno.h>
-#include <stdarg.h> // For va_list and related operations
-#include <stdio.h> // MSVC requires this for _vsnprintf
-#include <vector>
-
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/logging.h>
-
-namespace google {
-namespace protobuf {
-
-#ifdef _MSC_VER
-#ifndef va_copy
-// Define va_copy for MSVC. This is a hack, assuming va_list is simply a
-// pointer into the stack and is safe to copy.
-#define va_copy(dest, src) ((dest) = (src))
-#endif
-#endif
-
-void StringAppendV(std::string* dst, const char* format, va_list ap) {
- // First try with a small fixed size buffer
- static const int kSpaceLength = 1024;
- char space[kSpaceLength];
-
- // It's possible for methods that use a va_list to invalidate
- // the data in it upon use. The fix is to make a copy
- // of the structure before using it and use that copy instead.
- va_list backup_ap;
- va_copy(backup_ap, ap);
- int result = vsnprintf(space, kSpaceLength, format, backup_ap);
- va_end(backup_ap);
-
- if (result < kSpaceLength) {
- if (result >= 0) {
- // Normal case -- everything fit.
- dst->append(space, result);
- return;
- }
-
-#ifdef _MSC_VER
- {
- // Error or MSVC running out of space. MSVC 8.0 and higher
- // can be asked about space needed with the special idiom below:
- va_copy(backup_ap, ap);
- result = vsnprintf(nullptr, 0, format, backup_ap);
- va_end(backup_ap);
- }
-#endif
-
- if (result < 0) {
- // Just an error.
- return;
- }
- }
-
- // Increase the buffer size to the size requested by vsnprintf,
- // plus one for the closing \0.
- int length = result+1;
- char* buf = new char[length];
-
- // Restore the va_list before we use it again
- va_copy(backup_ap, ap);
- result = vsnprintf(buf, length, format, backup_ap);
- va_end(backup_ap);
-
- if (result >= 0 && result < length) {
- // It fit
- dst->append(buf, result);
- }
- delete[] buf;
-}
-
-std::string StringPrintf(const char* format, ...) {
- va_list ap;
- va_start(ap, format);
- std::string result;
- StringAppendV(&result, format, ap);
- va_end(ap);
- return result;
-}
-
-const std::string& SStringPrintf(std::string* dst, const char* format, ...) {
- va_list ap;
- va_start(ap, format);
- dst->clear();
- StringAppendV(dst, format, ap);
- va_end(ap);
- return *dst;
-}
-
-void StringAppendF(std::string* dst, const char* format, ...) {
- va_list ap;
- va_start(ap, format);
- StringAppendV(dst, format, ap);
- va_end(ap);
-}
-
-// Max arguments supported by StringPrintVector
-const int kStringPrintfVectorMaxArgs = 32;
-
-// An empty block of zero for filler arguments. This is const so that if
-// printf tries to write to it (via %n) then the program gets a SIGSEGV
-// and we can fix the problem or protect against an attack.
-static const char string_printf_empty_block[256] = { '\0' };
-
-std::string StringPrintfVector(const char* format,
- const std::vector<std::string>& v) {
- GOOGLE_CHECK_LE(v.size(), kStringPrintfVectorMaxArgs)
- << "StringPrintfVector currently only supports up to "
- << kStringPrintfVectorMaxArgs << " arguments. "
- << "Feel free to add support for more if you need it.";
-
- // Add filler arguments so that bogus format+args have a harder time
- // crashing the program, corrupting the program (%n),
- // or displaying random chunks of memory to users.
-
- const char* cstr[kStringPrintfVectorMaxArgs];
- for (int i = 0; i < v.size(); ++i) {
- cstr[i] = v[i].c_str();
- }
- for (int i = v.size(); i < GOOGLE_ARRAYSIZE(cstr); ++i) {
- cstr[i] = &string_printf_empty_block[0];
- }
-
- // I do not know any way to pass kStringPrintfVectorMaxArgs arguments,
- // or any way to build a va_list by hand, or any API for printf
- // that accepts an array of arguments. The best I can do is stick
- // this COMPILE_ASSERT right next to the actual statement.
-
- static_assert(kStringPrintfVectorMaxArgs == 32, "arg_count_mismatch");
- return StringPrintf(format,
- cstr[0], cstr[1], cstr[2], cstr[3], cstr[4],
- cstr[5], cstr[6], cstr[7], cstr[8], cstr[9],
- cstr[10], cstr[11], cstr[12], cstr[13], cstr[14],
- cstr[15], cstr[16], cstr[17], cstr[18], cstr[19],
- cstr[20], cstr[21], cstr[22], cstr[23], cstr[24],
- cstr[25], cstr[26], cstr[27], cstr[28], cstr[29],
- cstr[30], cstr[31]);
-}
-} // namespace protobuf
-} // namespace google
diff --git a/src/google/protobuf/stubs/stringprintf.h b/src/google/protobuf/stubs/stringprintf.h
deleted file mode 100644
index e3858be..0000000
--- a/src/google/protobuf/stubs/stringprintf.h
+++ /dev/null
@@ -1,85 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2012 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// from google3/base/stringprintf.h
-//
-// Printf variants that place their output in a C++ string.
-//
-// Usage:
-// string result = StringPrintf("%d %s\n", 10, "hello");
-// SStringPrintf(&result, "%d %s\n", 10, "hello");
-// StringAppendF(&result, "%d %s\n", 20, "there");
-
-#ifndef GOOGLE_PROTOBUF_STUBS_STRINGPRINTF_H
-#define GOOGLE_PROTOBUF_STUBS_STRINGPRINTF_H
-
-#include <stdarg.h>
-#include <string>
-#include <vector>
-
-#include <google/protobuf/stubs/common.h>
-
-#include <google/protobuf/port_def.inc>
-
-namespace google {
-namespace protobuf {
-
-// Return a C++ string
-PROTOBUF_EXPORT extern std::string StringPrintf(const char* format, ...);
-
-// Store result into a supplied string and return it
-PROTOBUF_EXPORT extern const std::string& SStringPrintf(std::string* dst,
- const char* format,
- ...);
-
-// Append result to a supplied string
-PROTOBUF_EXPORT extern void StringAppendF(std::string* dst, const char* format,
- ...);
-
-// Lower-level routine that takes a va_list and appends to a specified
-// string. All other routines are just convenience wrappers around it.
-PROTOBUF_EXPORT extern void StringAppendV(std::string* dst, const char* format,
- va_list ap);
-
-// The max arguments supported by StringPrintfVector
-PROTOBUF_EXPORT extern const int kStringPrintfVectorMaxArgs;
-
-// You can use this version when all your arguments are strings, but
-// you don't know how many arguments you'll have at compile time.
-// StringPrintfVector will LOG(FATAL) if v.size() > kStringPrintfVectorMaxArgs
-PROTOBUF_EXPORT extern std::string StringPrintfVector(
- const char* format, const std::vector<std::string>& v);
-
-} // namespace protobuf
-} // namespace google
-
-#include <google/protobuf/port_undef.inc>
-
-#endif // GOOGLE_PROTOBUF_STUBS_STRINGPRINTF_H
diff --git a/src/google/protobuf/stubs/stringprintf_unittest.cc b/src/google/protobuf/stubs/stringprintf_unittest.cc
deleted file mode 100644
index dbecd2b..0000000
--- a/src/google/protobuf/stubs/stringprintf_unittest.cc
+++ /dev/null
@@ -1,155 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2012 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// from google3/base/stringprintf_unittest.cc
-
-#include <google/protobuf/stubs/stringprintf.h>
-#include <google/protobuf/testing/googletest.h>
-#include <gtest/gtest.h>
-
-#include <array>
-#include <cerrno>
-#include <string>
-
-namespace google {
-namespace protobuf {
-namespace {
-
-TEST(StringPrintfTest, Empty) {
-#if 0
- // gcc 2.95.3, gcc 4.1.0, and gcc 4.2.2 all warn about this:
- // warning: zero-length printf format string.
- // so we do not allow them in google3.
- EXPECT_EQ("", StringPrintf(""));
-#endif
- EXPECT_EQ("", StringPrintf("%s", std::string().c_str()));
- EXPECT_EQ("", StringPrintf("%s", ""));
-}
-
-TEST(StringPrintfTest, Misc) {
-// MSVC and mingw does not support $ format specifier.
-#if !defined(_MSC_VER) && !defined(__MINGW32__)
- EXPECT_EQ("123hello w", StringPrintf("%3$d%2$s %1$c", 'w', "hello", 123));
-#endif // !_MSC_VER
-}
-
-TEST(StringAppendFTest, Empty) {
- std::string value("Hello");
- const char* empty = "";
- StringAppendF(&value, "%s", empty);
- EXPECT_EQ("Hello", value);
-}
-
-TEST(StringAppendFTest, EmptyString) {
- std::string value("Hello");
- StringAppendF(&value, "%s", "");
- EXPECT_EQ("Hello", value);
-}
-
-TEST(StringAppendFTest, String) {
- std::string value("Hello");
- StringAppendF(&value, " %s", "World");
- EXPECT_EQ("Hello World", value);
-}
-
-TEST(StringAppendFTest, Int) {
- std::string value("Hello");
- StringAppendF(&value, " %d", 123);
- EXPECT_EQ("Hello 123", value);
-}
-
-TEST(StringPrintfTest, Multibyte) {
- // If we are in multibyte mode and feed invalid multibyte sequence,
- // StringPrintf should return an empty string instead of running
- // out of memory while trying to determine destination buffer size.
- // see b/4194543.
-
- char* old_locale_c = setlocale(LC_CTYPE, nullptr);
- ASSERT_TRUE(old_locale_c != nullptr);
- std::string old_locale = old_locale_c;
- // Push locale with multibyte mode
- setlocale(LC_CTYPE, "en_US.utf8");
-
- const char kInvalidCodePoint[] = "\375\067s";
- std::string value = StringPrintf("%.*s", 3, kInvalidCodePoint);
-
- // In some versions of glibc (e.g. eglibc-2.11.1, aka GRTEv2), snprintf
- // returns error given an invalid codepoint. Other versions
- // (e.g. eglibc-2.15, aka pre-GRTEv3) emit the codepoint verbatim.
- // We test that the output is one of the above.
- EXPECT_TRUE(value.empty() || value == kInvalidCodePoint);
-
- // Repeat with longer string, to make sure that the dynamically
- // allocated path in StringAppendV is handled correctly.
- const size_t n = 2048;
- std::array<char, n + 1> buf;
- memset(&buf[0], ' ', n - 3);
- memcpy(&buf[0] + n - 3, kInvalidCodePoint, 4);
- value = StringPrintf("%.*s", n, &buf[0]);
- // See GRTEv2 vs. GRTEv3 comment above.
- EXPECT_TRUE(value.empty() || value == &buf[0]);
-
- setlocale(LC_CTYPE, old_locale.c_str());
-}
-
-TEST(StringPrintfTest, NoMultibyte) {
- // No multibyte handling, but the string contains funny chars.
- char* old_locale_c = setlocale(LC_CTYPE, nullptr);
- ASSERT_TRUE(old_locale_c != nullptr);
- std::string old_locale = old_locale_c;
- setlocale(LC_CTYPE, "POSIX");
- std::string value = StringPrintf("%.*s", 3, "\375\067s");
- setlocale(LC_CTYPE, old_locale.c_str());
- EXPECT_EQ("\375\067s", value);
-}
-
-TEST(StringPrintfTest, DontOverwriteErrno) {
- // Check that errno isn't overwritten unless we're printing
- // something significantly larger than what people are normally
- // printing in their badly written PLOG() statements.
- errno = ECHILD;
- std::string value = StringPrintf("Hello, %s!", "World");
- EXPECT_EQ(ECHILD, errno);
-}
-
-TEST(StringPrintfTest, LargeBuf) {
- // Check that the large buffer is handled correctly.
- int n = 2048;
- char* buf = new char[n+1];
- memset(buf, ' ', n);
- buf[n] = 0;
- std::string value = StringPrintf("%s", buf);
- EXPECT_EQ(buf, value);
- delete[] buf;
-}
-
-} // anonymous namespace
-} // namespace protobuf
-} // namespace google
diff --git a/src/google/protobuf/stubs/structurally_valid.cc b/src/google/protobuf/stubs/structurally_valid.cc
index a535736..418b40b 100644
--- a/src/google/protobuf/stubs/structurally_valid.cc
+++ b/src/google/protobuf/stubs/structurally_valid.cc
@@ -30,9 +30,8 @@
// Author: jrm@google.com (Jim Meehan)
-#include <google/protobuf/stubs/common.h>
-
-#include <google/protobuf/stubs/stringpiece.h>
+#include "absl/strings/string_view.h"
+#include "google/protobuf/stubs/common.h"
namespace google {
namespace protobuf {
@@ -563,7 +562,7 @@
return (bytes_consumed == len);
}
-int UTF8SpnStructurallyValid(StringPiece str) {
+int UTF8SpnStructurallyValid(absl::string_view str) {
if (!module_initialized_) return str.size();
int bytes_consumed = 0;
@@ -584,7 +583,7 @@
//
// Fast case: all is structurally valid and no byte copying is done.
//
-char* UTF8CoerceToStructurallyValid(StringPiece src_str, char* idst,
+char* UTF8CoerceToStructurallyValid(absl::string_view src_str, char* idst,
const char replace_char) {
const char* isrc = src_str.data();
const int len = src_str.length();
@@ -602,7 +601,7 @@
dst[0] = replace_char; // replace one bad byte
src++;
dst++;
- StringPiece str2(src, srclimit - src);
+ absl::string_view str2(src, srclimit - src);
n = UTF8SpnStructurallyValid(str2); // scan the remainder
memmove(dst, src, n); // copy next good chunk
src += n;
diff --git a/src/google/protobuf/stubs/structurally_valid_unittest.cc b/src/google/protobuf/stubs/structurally_valid_unittest.cc
index ebd9c42..bb56a68 100644
--- a/src/google/protobuf/stubs/structurally_valid_unittest.cc
+++ b/src/google/protobuf/stubs/structurally_valid_unittest.cc
@@ -31,9 +31,10 @@
// Copyright 2008 Google Inc. All Rights Reserved.
// Author: xpeng@google.com (Peter Peng)
-#include <google/protobuf/stubs/common.h>
#include <gtest/gtest.h>
+#include "google/protobuf/stubs/common.h"
+
namespace google {
namespace protobuf {
namespace internal {
diff --git a/src/google/protobuf/stubs/strutil.cc b/src/google/protobuf/stubs/strutil.cc
index 594c8ea..720c6fc 100644
--- a/src/google/protobuf/stubs/strutil.cc
+++ b/src/google/protobuf/stubs/strutil.cc
@@ -30,18 +30,21 @@
// from google3/strings/strutil.cc
-#include <google/protobuf/stubs/strutil.h>
+#include "google/protobuf/stubs/strutil.h"
#include <errno.h>
-#include <float.h> // FLT_DIG and DBL_DIG
+#include <float.h> // FLT_DIG and DBL_DIG
#include <limits.h>
#include <stdio.h>
+
#include <cmath>
#include <iterator>
#include <limits>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/stl_util.h>
+#include "absl/strings/ascii.h"
+#include "absl/strings/string_view.h"
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/stl_util.h"
#ifdef _WIN32
// MSVC has only _snprintf, not snprintf.
@@ -60,75 +63,7 @@
namespace google {
namespace protobuf {
-// These are defined as macros on some platforms. #undef them so that we can
-// redefine them.
-#undef isxdigit
-#undef isprint
-
-// The definitions of these in ctype.h change based on locale. Since our
-// string manipulation is all in relation to the protocol buffer and C++
-// languages, we always want to use the C locale. So, we re-define these
-// exactly as we want them.
-inline bool isxdigit(char c) {
- return ('0' <= c && c <= '9') ||
- ('a' <= c && c <= 'f') ||
- ('A' <= c && c <= 'F');
-}
-
-inline bool isprint(char c) {
- return c >= 0x20 && c <= 0x7E;
-}
-
-// ----------------------------------------------------------------------
-// ReplaceCharacters
-// Replaces any occurrence of the character 'remove' (or the characters
-// in 'remove') with the character 'replacewith'.
-// ----------------------------------------------------------------------
-void ReplaceCharacters(std::string *s, const char *remove, char replacewith) {
- const char *str_start = s->c_str();
- const char *str = str_start;
- for (str = strpbrk(str, remove);
- str != nullptr;
- str = strpbrk(str + 1, remove)) {
- (*s)[str - str_start] = replacewith;
- }
-}
-
-void StripWhitespace(std::string *str) {
- int str_length = str->length();
-
- // Strip off leading whitespace.
- int first = 0;
- while (first < str_length && ascii_isspace(str->at(first))) {
- ++first;
- }
- // If entire string is white space.
- if (first == str_length) {
- str->clear();
- return;
- }
- if (first > 0) {
- str->erase(0, first);
- str_length -= first;
- }
-
- // Strip off trailing whitespace.
- int last = str_length - 1;
- while (last >= 0 && ascii_isspace(str->at(last))) {
- --last;
- }
- if (last != (str_length - 1) && last >= 0) {
- str->erase(last + 1, std::string::npos);
- }
-}
-
-// ----------------------------------------------------------------------
-// StringReplace()
-// Replace the "old" pattern with the "new" pattern in a string,
-// and append the result to "res". If replace_all is false,
-// it only replaces the first instance of "old."
-// ----------------------------------------------------------------------
-
+namespace {
void StringReplace(const std::string &s, const std::string &oldsub,
const std::string &newsub, bool replace_all,
std::string *res) {
@@ -150,6 +85,7 @@
} while (replace_all);
res->append(s, start_pos, s.length() - start_pos);
}
+} // namespace
// ----------------------------------------------------------------------
// StringReplace()
@@ -168,459 +104,6 @@
}
// ----------------------------------------------------------------------
-// SplitStringUsing()
-// Split a string using a character delimiter. Append the components
-// to 'result'.
-//
-// Note: For multi-character delimiters, this routine will split on *ANY* of
-// the characters in the string, not the entire string as a single delimiter.
-// ----------------------------------------------------------------------
-template <typename ITR>
-static inline void SplitStringToIteratorUsing(StringPiece full,
- const char *delim, ITR &result) {
- // Optimize the common case where delim is a single character.
- if (delim[0] != '\0' && delim[1] == '\0') {
- char c = delim[0];
- const char* p = full.data();
- const char* end = p + full.size();
- while (p != end) {
- if (*p == c) {
- ++p;
- } else {
- const char* start = p;
- while (++p != end && *p != c);
- *result++ = std::string(start, p - start);
- }
- }
- return;
- }
-
- std::string::size_type begin_index, end_index;
- begin_index = full.find_first_not_of(delim);
- while (begin_index != std::string::npos) {
- end_index = full.find_first_of(delim, begin_index);
- if (end_index == std::string::npos) {
- *result++ = std::string(full.substr(begin_index));
- return;
- }
- *result++ =
- std::string(full.substr(begin_index, (end_index - begin_index)));
- begin_index = full.find_first_not_of(delim, end_index);
- }
-}
-
-void SplitStringUsing(StringPiece full, const char *delim,
- std::vector<std::string> *result) {
- std::back_insert_iterator<std::vector<std::string> > it(*result);
- SplitStringToIteratorUsing(full, delim, it);
-}
-
-// Split a string using a character delimiter. Append the components
-// to 'result'. If there are consecutive delimiters, this function
-// will return corresponding empty strings. The string is split into
-// at most the specified number of pieces greedily. This means that the
-// last piece may possibly be split further. To split into as many pieces
-// as possible, specify 0 as the number of pieces.
-//
-// If "full" is the empty string, yields an empty string as the only value.
-//
-// If "pieces" is negative for some reason, it returns the whole string
-// ----------------------------------------------------------------------
-template <typename ITR>
-static inline void SplitStringToIteratorAllowEmpty(StringPiece full,
- const char *delim,
- int pieces, ITR &result) {
- std::string::size_type begin_index, end_index;
- begin_index = 0;
-
- for (int i = 0; (i < pieces-1) || (pieces == 0); i++) {
- end_index = full.find_first_of(delim, begin_index);
- if (end_index == std::string::npos) {
- *result++ = std::string(full.substr(begin_index));
- return;
- }
- *result++ =
- std::string(full.substr(begin_index, (end_index - begin_index)));
- begin_index = end_index + 1;
- }
- *result++ = std::string(full.substr(begin_index));
-}
-
-void SplitStringAllowEmpty(StringPiece full, const char *delim,
- std::vector<std::string> *result) {
- std::back_insert_iterator<std::vector<std::string> > it(*result);
- SplitStringToIteratorAllowEmpty(full, delim, 0, it);
-}
-
-// ----------------------------------------------------------------------
-// JoinStrings()
-// This merges a vector of string components with delim inserted
-// as separaters between components.
-//
-// ----------------------------------------------------------------------
-template <class ITERATOR>
-static void JoinStringsIterator(const ITERATOR &start, const ITERATOR &end,
- const char *delim, std::string *result) {
- GOOGLE_CHECK(result != nullptr);
- result->clear();
- int delim_length = strlen(delim);
-
- // Precompute resulting length so we can reserve() memory in one shot.
- int length = 0;
- for (ITERATOR iter = start; iter != end; ++iter) {
- if (iter != start) {
- length += delim_length;
- }
- length += iter->size();
- }
- result->reserve(length);
-
- // Now combine everything.
- for (ITERATOR iter = start; iter != end; ++iter) {
- if (iter != start) {
- result->append(delim, delim_length);
- }
- result->append(iter->data(), iter->size());
- }
-}
-
-void JoinStrings(const std::vector<std::string> &components, const char *delim,
- std::string *result) {
- JoinStringsIterator(components.begin(), components.end(), delim, result);
-}
-
-// ----------------------------------------------------------------------
-// UnescapeCEscapeSequences()
-// This does all the unescaping that C does: \ooo, \r, \n, etc
-// Returns length of resulting string.
-// The implementation of \x parses any positive number of hex digits,
-// but it is an error if the value requires more than 8 bits, and the
-// result is truncated to 8 bits.
-//
-// The second call stores its errors in a supplied string vector.
-// If the string vector pointer is nullptr, it reports the errors with LOG().
-// ----------------------------------------------------------------------
-
-#define IS_OCTAL_DIGIT(c) (((c) >= '0') && ((c) <= '7'))
-
-// Protocol buffers doesn't ever care about errors, but I don't want to remove
-// the code.
-#define LOG_STRING(LEVEL, VECTOR) GOOGLE_LOG_IF(LEVEL, false)
-
-int UnescapeCEscapeSequences(const char* source, char* dest) {
- return UnescapeCEscapeSequences(source, dest, nullptr);
-}
-
-int UnescapeCEscapeSequences(const char *source, char *dest,
- std::vector<std::string> *errors) {
- GOOGLE_DCHECK(errors == nullptr) << "Error reporting not implemented.";
-
- char* d = dest;
- const char* p = source;
-
- // Small optimization for case where source = dest and there's no escaping
- while ( p == d && *p != '\0' && *p != '\\' )
- p++, d++;
-
- while (*p != '\0') {
- if (*p != '\\') {
- *d++ = *p++;
- } else {
- switch ( *++p ) { // skip past the '\\'
- case '\0':
- LOG_STRING(ERROR, errors) << "String cannot end with \\";
- *d = '\0';
- return d - dest; // we're done with p
- case 'a': *d++ = '\a'; break;
- case 'b': *d++ = '\b'; break;
- case 'f': *d++ = '\f'; break;
- case 'n': *d++ = '\n'; break;
- case 'r': *d++ = '\r'; break;
- case 't': *d++ = '\t'; break;
- case 'v': *d++ = '\v'; break;
- case '\\': *d++ = '\\'; break;
- case '?': *d++ = '\?'; break; // \? Who knew?
- case '\'': *d++ = '\''; break;
- case '"': *d++ = '\"'; break;
- case '0': case '1': case '2': case '3': // octal digit: 1 to 3 digits
- case '4': case '5': case '6': case '7': {
- char ch = *p - '0';
- if ( IS_OCTAL_DIGIT(p[1]) )
- ch = ch * 8 + *++p - '0';
- if ( IS_OCTAL_DIGIT(p[1]) ) // safe (and easy) to do this twice
- ch = ch * 8 + *++p - '0'; // now points at last digit
- *d++ = ch;
- break;
- }
- case 'x': case 'X': {
- if (!isxdigit(p[1])) {
- if (p[1] == '\0') {
- LOG_STRING(ERROR, errors) << "String cannot end with \\x";
- } else {
- LOG_STRING(ERROR, errors) <<
- "\\x cannot be followed by non-hex digit: \\" << *p << p[1];
- }
- break;
- }
- unsigned int ch = 0;
- const char *hex_start = p;
- while (isxdigit(p[1])) // arbitrarily many hex digits
- ch = (ch << 4) + hex_digit_to_int(*++p);
- if (ch > 0xFF)
- LOG_STRING(ERROR, errors)
- << "Value of "
- << "\\" << std::string(hex_start, p + 1 - hex_start)
- << " exceeds 8 bits";
- *d++ = ch;
- break;
- }
-#if 0 // TODO(kenton): Support \u and \U? Requires runetochar().
- case 'u': {
- // \uhhhh => convert 4 hex digits to UTF-8
- char32 rune = 0;
- const char *hex_start = p;
- for (int i = 0; i < 4; ++i) {
- if (isxdigit(p[1])) { // Look one char ahead.
- rune = (rune << 4) + hex_digit_to_int(*++p); // Advance p.
- } else {
- LOG_STRING(ERROR, errors)
- << "\\u must be followed by 4 hex digits: \\"
- << std::string(hex_start, p+1-hex_start);
- break;
- }
- }
- d += runetochar(d, &rune);
- break;
- }
- case 'U': {
- // \Uhhhhhhhh => convert 8 hex digits to UTF-8
- char32 rune = 0;
- const char *hex_start = p;
- for (int i = 0; i < 8; ++i) {
- if (isxdigit(p[1])) { // Look one char ahead.
- // Don't change rune until we're sure this
- // is within the Unicode limit, but do advance p.
- char32 newrune = (rune << 4) + hex_digit_to_int(*++p);
- if (newrune > 0x10FFFF) {
- LOG_STRING(ERROR, errors)
- << "Value of \\"
- << std::string(hex_start, p + 1 - hex_start)
- << " exceeds Unicode limit (0x10FFFF)";
- break;
- } else {
- rune = newrune;
- }
- } else {
- LOG_STRING(ERROR, errors)
- << "\\U must be followed by 8 hex digits: \\"
- << std::string(hex_start, p+1-hex_start);
- break;
- }
- }
- d += runetochar(d, &rune);
- break;
- }
-#endif
- default:
- LOG_STRING(ERROR, errors) << "Unknown escape sequence: \\" << *p;
- }
- p++; // read past letter we escaped
- }
- }
- *d = '\0';
- return d - dest;
-}
-
-// ----------------------------------------------------------------------
-// UnescapeCEscapeString()
-// This does the same thing as UnescapeCEscapeSequences, but creates
-// a new string. The caller does not need to worry about allocating
-// a dest buffer. This should be used for non performance critical
-// tasks such as printing debug messages. It is safe for src and dest
-// to be the same.
-//
-// The second call stores its errors in a supplied string vector.
-// If the string vector pointer is nullptr, it reports the errors with LOG().
-//
-// In the first and second calls, the length of dest is returned. In the
-// the third call, the new string is returned.
-// ----------------------------------------------------------------------
-int UnescapeCEscapeString(const std::string &src, std::string *dest) {
- return UnescapeCEscapeString(src, dest, nullptr);
-}
-
-int UnescapeCEscapeString(const std::string &src, std::string *dest,
- std::vector<std::string> *errors) {
- std::unique_ptr<char[]> unescaped(new char[src.size() + 1]);
- int len = UnescapeCEscapeSequences(src.c_str(), unescaped.get(), errors);
- GOOGLE_CHECK(dest);
- dest->assign(unescaped.get(), len);
- return len;
-}
-
-std::string UnescapeCEscapeString(const std::string &src) {
- std::unique_ptr<char[]> unescaped(new char[src.size() + 1]);
- int len = UnescapeCEscapeSequences(src.c_str(), unescaped.get(), nullptr);
- return std::string(unescaped.get(), len);
-}
-
-// ----------------------------------------------------------------------
-// CEscapeString()
-// CHexEscapeString()
-// Copies 'src' to 'dest', escaping dangerous characters using
-// C-style escape sequences. This is very useful for preparing query
-// flags. 'src' and 'dest' should not overlap. The 'Hex' version uses
-// hexadecimal rather than octal sequences.
-// Returns the number of bytes written to 'dest' (not including the \0)
-// or -1 if there was insufficient space.
-//
-// Currently only \n, \r, \t, ", ', \ and !isprint() chars are escaped.
-// ----------------------------------------------------------------------
-int CEscapeInternal(const char* src, int src_len, char* dest,
- int dest_len, bool use_hex, bool utf8_safe) {
- const char* src_end = src + src_len;
- int used = 0;
- bool last_hex_escape = false; // true if last output char was \xNN
-
- for (; src < src_end; src++) {
- if (dest_len - used < 2) // Need space for two letter escape
- return -1;
-
- bool is_hex_escape = false;
- switch (*src) {
- case '\n': dest[used++] = '\\'; dest[used++] = 'n'; break;
- case '\r': dest[used++] = '\\'; dest[used++] = 'r'; break;
- case '\t': dest[used++] = '\\'; dest[used++] = 't'; break;
- case '\"': dest[used++] = '\\'; dest[used++] = '\"'; break;
- case '\'': dest[used++] = '\\'; dest[used++] = '\''; break;
- case '\\': dest[used++] = '\\'; dest[used++] = '\\'; break;
- default:
- // Note that if we emit \xNN and the src character after that is a hex
- // digit then that digit must be escaped too to prevent it being
- // interpreted as part of the character code by C.
- if ((!utf8_safe || static_cast<uint8_t>(*src) < 0x80) &&
- (!isprint(*src) ||
- (last_hex_escape && isxdigit(*src)))) {
- if (dest_len - used < 4) // need space for 4 letter escape
- return -1;
- sprintf(dest + used, (use_hex ? "\\x%02x" : "\\%03o"),
- static_cast<uint8_t>(*src));
- is_hex_escape = use_hex;
- used += 4;
- } else {
- dest[used++] = *src; break;
- }
- }
- last_hex_escape = is_hex_escape;
- }
-
- if (dest_len - used < 1) // make sure that there is room for \0
- return -1;
-
- dest[used] = '\0'; // doesn't count towards return value though
- return used;
-}
-
-// Calculates the length of the C-style escaped version of 'src'.
-// Assumes that non-printable characters are escaped using octal sequences, and
-// that UTF-8 bytes are not handled specially.
-static inline size_t CEscapedLength(StringPiece src) {
- static char c_escaped_len[256] = {
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 4, 4, 2, 4, 4, // \t, \n, \r
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
- 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, // ", '
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // '0'..'9'
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 'A'..'O'
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, // 'P'..'Z', '\'
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 'a'..'o'
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, // 'p'..'z', DEL
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
- };
-
- size_t escaped_len = 0;
- for (StringPiece::size_type i = 0; i < src.size(); ++i) {
- unsigned char c = static_cast<unsigned char>(src[i]);
- escaped_len += c_escaped_len[c];
- }
- return escaped_len;
-}
-
-// ----------------------------------------------------------------------
-// Escapes 'src' using C-style escape sequences, and appends the escaped string
-// to 'dest'. This version is faster than calling CEscapeInternal as it computes
-// the required space using a lookup table, and also does not do any special
-// handling for Hex or UTF-8 characters.
-// ----------------------------------------------------------------------
-void CEscapeAndAppend(StringPiece src, std::string *dest) {
- size_t escaped_len = CEscapedLength(src);
- if (escaped_len == src.size()) {
- dest->append(src.data(), src.size());
- return;
- }
-
- size_t cur_dest_len = dest->size();
- dest->resize(cur_dest_len + escaped_len);
- char* append_ptr = &(*dest)[cur_dest_len];
-
- for (StringPiece::size_type i = 0; i < src.size(); ++i) {
- unsigned char c = static_cast<unsigned char>(src[i]);
- switch (c) {
- case '\n': *append_ptr++ = '\\'; *append_ptr++ = 'n'; break;
- case '\r': *append_ptr++ = '\\'; *append_ptr++ = 'r'; break;
- case '\t': *append_ptr++ = '\\'; *append_ptr++ = 't'; break;
- case '\"': *append_ptr++ = '\\'; *append_ptr++ = '\"'; break;
- case '\'': *append_ptr++ = '\\'; *append_ptr++ = '\''; break;
- case '\\': *append_ptr++ = '\\'; *append_ptr++ = '\\'; break;
- default:
- if (!isprint(c)) {
- *append_ptr++ = '\\';
- *append_ptr++ = '0' + c / 64;
- *append_ptr++ = '0' + (c % 64) / 8;
- *append_ptr++ = '0' + c % 8;
- } else {
- *append_ptr++ = c;
- }
- break;
- }
- }
-}
-
-std::string CEscape(const std::string &src) {
- std::string dest;
- CEscapeAndAppend(src, &dest);
- return dest;
-}
-
-namespace strings {
-
-std::string Utf8SafeCEscape(const std::string &src) {
- const int dest_length = src.size() * 4 + 1; // Maximum possible expansion
- std::unique_ptr<char[]> dest(new char[dest_length]);
- const int len = CEscapeInternal(src.data(), src.size(),
- dest.get(), dest_length, false, true);
- GOOGLE_DCHECK_GE(len, 0);
- return std::string(dest.get(), len);
-}
-
-std::string CHexEscape(const std::string &src) {
- const int dest_length = src.size() * 4 + 1; // Maximum possible expansion
- std::unique_ptr<char[]> dest(new char[dest_length]);
- const int len = CEscapeInternal(src.data(), src.size(),
- dest.get(), dest_length, true, false);
- GOOGLE_DCHECK_GE(len, 0);
- return std::string(dest.get(), len);
-}
-
-} // namespace strings
-
-// ----------------------------------------------------------------------
// strto32_adaptor()
// strtou32_adaptor()
// Implementation of strto[u]l replacements that have identical
@@ -789,377 +272,8 @@
}
// ----------------------------------------------------------------------
-// FastIntToBuffer()
-// FastInt64ToBuffer()
-// FastHexToBuffer()
-// FastHex64ToBuffer()
-// FastHex32ToBuffer()
-// ----------------------------------------------------------------------
-
-// Offset into buffer where FastInt64ToBuffer places the end of string
-// null character. Also used by FastInt64ToBufferLeft.
-static const int kFastInt64ToBufferOffset = 21;
-
-char *FastInt64ToBuffer(int64_t i, char* buffer) {
- // We could collapse the positive and negative sections, but that
- // would be slightly slower for positive numbers...
- // 22 bytes is enough to store -2**64, -18446744073709551616.
- char* p = buffer + kFastInt64ToBufferOffset;
- *p-- = '\0';
- if (i >= 0) {
- do {
- *p-- = '0' + i % 10;
- i /= 10;
- } while (i > 0);
- return p + 1;
- } else {
- // On different platforms, % and / have different behaviors for
- // negative numbers, so we need to jump through hoops to make sure
- // we don't divide negative numbers.
- if (i > -10) {
- i = -i;
- *p-- = '0' + i;
- *p = '-';
- return p;
- } else {
- // Make sure we aren't at MIN_INT, in which case we can't say i = -i
- i = i + 10;
- i = -i;
- *p-- = '0' + i % 10;
- // Undo what we did a moment ago
- i = i / 10 + 1;
- do {
- *p-- = '0' + i % 10;
- i /= 10;
- } while (i > 0);
- *p = '-';
- return p;
- }
- }
-}
-
-// Offset into buffer where FastInt32ToBuffer places the end of string
-// null character. Also used by FastInt32ToBufferLeft
-static const int kFastInt32ToBufferOffset = 11;
-
-// Yes, this is a duplicate of FastInt64ToBuffer. But, we need this for the
-// compiler to generate 32 bit arithmetic instructions. It's much faster, at
-// least with 32 bit binaries.
-char *FastInt32ToBuffer(int32_t i, char* buffer) {
- // We could collapse the positive and negative sections, but that
- // would be slightly slower for positive numbers...
- // 12 bytes is enough to store -2**32, -4294967296.
- char* p = buffer + kFastInt32ToBufferOffset;
- *p-- = '\0';
- if (i >= 0) {
- do {
- *p-- = '0' + i % 10;
- i /= 10;
- } while (i > 0);
- return p + 1;
- } else {
- // On different platforms, % and / have different behaviors for
- // negative numbers, so we need to jump through hoops to make sure
- // we don't divide negative numbers.
- if (i > -10) {
- i = -i;
- *p-- = '0' + i;
- *p = '-';
- return p;
- } else {
- // Make sure we aren't at MIN_INT, in which case we can't say i = -i
- i = i + 10;
- i = -i;
- *p-- = '0' + i % 10;
- // Undo what we did a moment ago
- i = i / 10 + 1;
- do {
- *p-- = '0' + i % 10;
- i /= 10;
- } while (i > 0);
- *p = '-';
- return p;
- }
- }
-}
-
-char *FastHexToBuffer(int i, char* buffer) {
- GOOGLE_CHECK(i >= 0) << "FastHexToBuffer() wants non-negative integers, not " << i;
-
- static const char *hexdigits = "0123456789abcdef";
- char *p = buffer + 21;
- *p-- = '\0';
- do {
- *p-- = hexdigits[i & 15]; // mod by 16
- i >>= 4; // divide by 16
- } while (i > 0);
- return p + 1;
-}
-
-char *InternalFastHexToBuffer(uint64_t value, char* buffer, int num_byte) {
- static const char *hexdigits = "0123456789abcdef";
- buffer[num_byte] = '\0';
- for (int i = num_byte - 1; i >= 0; i--) {
-#ifdef _M_X64
- // MSVC x64 platform has a bug optimizing the uint32(value) in the #else
- // block. Given that the uint32 cast was to improve performance on 32-bit
- // platforms, we use 64-bit '&' directly.
- buffer[i] = hexdigits[value & 0xf];
-#else
- buffer[i] = hexdigits[uint32_t(value) & 0xf];
-#endif
- value >>= 4;
- }
- return buffer;
-}
-
-char *FastHex64ToBuffer(uint64_t value, char* buffer) {
- return InternalFastHexToBuffer(value, buffer, 16);
-}
-
-char *FastHex32ToBuffer(uint32_t value, char* buffer) {
- return InternalFastHexToBuffer(value, buffer, 8);
-}
-
-// ----------------------------------------------------------------------
-// FastInt32ToBufferLeft()
-// FastUInt32ToBufferLeft()
-// FastInt64ToBufferLeft()
-// FastUInt64ToBufferLeft()
-//
-// Like the Fast*ToBuffer() functions above, these are intended for speed.
-// Unlike the Fast*ToBuffer() functions, however, these functions write
-// their output to the beginning of the buffer (hence the name, as the
-// output is left-aligned). The caller is responsible for ensuring that
-// the buffer has enough space to hold the output.
-//
-// Returns a pointer to the end of the string (i.e. the null character
-// terminating the string).
-// ----------------------------------------------------------------------
-
-static const char two_ASCII_digits[100][2] = {
- {'0','0'}, {'0','1'}, {'0','2'}, {'0','3'}, {'0','4'},
- {'0','5'}, {'0','6'}, {'0','7'}, {'0','8'}, {'0','9'},
- {'1','0'}, {'1','1'}, {'1','2'}, {'1','3'}, {'1','4'},
- {'1','5'}, {'1','6'}, {'1','7'}, {'1','8'}, {'1','9'},
- {'2','0'}, {'2','1'}, {'2','2'}, {'2','3'}, {'2','4'},
- {'2','5'}, {'2','6'}, {'2','7'}, {'2','8'}, {'2','9'},
- {'3','0'}, {'3','1'}, {'3','2'}, {'3','3'}, {'3','4'},
- {'3','5'}, {'3','6'}, {'3','7'}, {'3','8'}, {'3','9'},
- {'4','0'}, {'4','1'}, {'4','2'}, {'4','3'}, {'4','4'},
- {'4','5'}, {'4','6'}, {'4','7'}, {'4','8'}, {'4','9'},
- {'5','0'}, {'5','1'}, {'5','2'}, {'5','3'}, {'5','4'},
- {'5','5'}, {'5','6'}, {'5','7'}, {'5','8'}, {'5','9'},
- {'6','0'}, {'6','1'}, {'6','2'}, {'6','3'}, {'6','4'},
- {'6','5'}, {'6','6'}, {'6','7'}, {'6','8'}, {'6','9'},
- {'7','0'}, {'7','1'}, {'7','2'}, {'7','3'}, {'7','4'},
- {'7','5'}, {'7','6'}, {'7','7'}, {'7','8'}, {'7','9'},
- {'8','0'}, {'8','1'}, {'8','2'}, {'8','3'}, {'8','4'},
- {'8','5'}, {'8','6'}, {'8','7'}, {'8','8'}, {'8','9'},
- {'9','0'}, {'9','1'}, {'9','2'}, {'9','3'}, {'9','4'},
- {'9','5'}, {'9','6'}, {'9','7'}, {'9','8'}, {'9','9'}
-};
-
-char* FastUInt32ToBufferLeft(uint32_t u, char* buffer) {
- uint32_t digits;
- const char *ASCII_digits = nullptr;
- // The idea of this implementation is to trim the number of divides to as few
- // as possible by using multiplication and subtraction rather than mod (%),
- // and by outputting two digits at a time rather than one.
- // The huge-number case is first, in the hopes that the compiler will output
- // that case in one branch-free block of code, and only output conditional
- // branches into it from below.
- if (u >= 1000000000) { // >= 1,000,000,000
- digits = u / 100000000; // 100,000,000
- ASCII_digits = two_ASCII_digits[digits];
- buffer[0] = ASCII_digits[0];
- buffer[1] = ASCII_digits[1];
- buffer += 2;
-sublt100_000_000:
- u -= digits * 100000000; // 100,000,000
-lt100_000_000:
- digits = u / 1000000; // 1,000,000
- ASCII_digits = two_ASCII_digits[digits];
- buffer[0] = ASCII_digits[0];
- buffer[1] = ASCII_digits[1];
- buffer += 2;
-sublt1_000_000:
- u -= digits * 1000000; // 1,000,000
-lt1_000_000:
- digits = u / 10000; // 10,000
- ASCII_digits = two_ASCII_digits[digits];
- buffer[0] = ASCII_digits[0];
- buffer[1] = ASCII_digits[1];
- buffer += 2;
-sublt10_000:
- u -= digits * 10000; // 10,000
-lt10_000:
- digits = u / 100;
- ASCII_digits = two_ASCII_digits[digits];
- buffer[0] = ASCII_digits[0];
- buffer[1] = ASCII_digits[1];
- buffer += 2;
-sublt100:
- u -= digits * 100;
-lt100:
- digits = u;
- ASCII_digits = two_ASCII_digits[digits];
- buffer[0] = ASCII_digits[0];
- buffer[1] = ASCII_digits[1];
- buffer += 2;
-done:
- *buffer = 0;
- return buffer;
- }
-
- if (u < 100) {
- digits = u;
- if (u >= 10) goto lt100;
- *buffer++ = '0' + digits;
- goto done;
- }
- if (u < 10000) { // 10,000
- if (u >= 1000) goto lt10_000;
- digits = u / 100;
- *buffer++ = '0' + digits;
- goto sublt100;
- }
- if (u < 1000000) { // 1,000,000
- if (u >= 100000) goto lt1_000_000;
- digits = u / 10000; // 10,000
- *buffer++ = '0' + digits;
- goto sublt10_000;
- }
- if (u < 100000000) { // 100,000,000
- if (u >= 10000000) goto lt100_000_000;
- digits = u / 1000000; // 1,000,000
- *buffer++ = '0' + digits;
- goto sublt1_000_000;
- }
- // we already know that u < 1,000,000,000
- digits = u / 100000000; // 100,000,000
- *buffer++ = '0' + digits;
- goto sublt100_000_000;
-}
-
-char* FastInt32ToBufferLeft(int32_t i, char* buffer) {
- uint32_t u = 0;
- if (i < 0) {
- *buffer++ = '-';
- u -= i;
- } else {
- u = i;
- }
- return FastUInt32ToBufferLeft(u, buffer);
-}
-
-char* FastUInt64ToBufferLeft(uint64_t u64, char* buffer) {
- int digits;
- const char *ASCII_digits = nullptr;
-
- uint32_t u = static_cast<uint32_t>(u64);
- if (u == u64) return FastUInt32ToBufferLeft(u, buffer);
-
- uint64_t top_11_digits = u64 / 1000000000;
- buffer = FastUInt64ToBufferLeft(top_11_digits, buffer);
- u = u64 - (top_11_digits * 1000000000);
-
- digits = u / 10000000; // 10,000,000
- GOOGLE_DCHECK_LT(digits, 100);
- ASCII_digits = two_ASCII_digits[digits];
- buffer[0] = ASCII_digits[0];
- buffer[1] = ASCII_digits[1];
- buffer += 2;
- u -= digits * 10000000; // 10,000,000
- digits = u / 100000; // 100,000
- ASCII_digits = two_ASCII_digits[digits];
- buffer[0] = ASCII_digits[0];
- buffer[1] = ASCII_digits[1];
- buffer += 2;
- u -= digits * 100000; // 100,000
- digits = u / 1000; // 1,000
- ASCII_digits = two_ASCII_digits[digits];
- buffer[0] = ASCII_digits[0];
- buffer[1] = ASCII_digits[1];
- buffer += 2;
- u -= digits * 1000; // 1,000
- digits = u / 10;
- ASCII_digits = two_ASCII_digits[digits];
- buffer[0] = ASCII_digits[0];
- buffer[1] = ASCII_digits[1];
- buffer += 2;
- u -= digits * 10;
- digits = u;
- *buffer++ = '0' + digits;
- *buffer = 0;
- return buffer;
-}
-
-char* FastInt64ToBufferLeft(int64_t i, char* buffer) {
- uint64_t u = 0;
- if (i < 0) {
- *buffer++ = '-';
- u -= i;
- } else {
- u = i;
- }
- return FastUInt64ToBufferLeft(u, buffer);
-}
-
-// ----------------------------------------------------------------------
-// SimpleItoa()
-// Description: converts an integer to a string.
-//
-// Return value: string
-// ----------------------------------------------------------------------
-
-std::string SimpleItoa(int i) {
- char buffer[kFastToBufferSize];
- return (sizeof(i) == 4) ?
- FastInt32ToBuffer(i, buffer) :
- FastInt64ToBuffer(i, buffer);
-}
-
-std::string SimpleItoa(unsigned int i) {
- char buffer[kFastToBufferSize];
- return std::string(buffer, (sizeof(i) == 4)
- ? FastUInt32ToBufferLeft(i, buffer)
- : FastUInt64ToBufferLeft(i, buffer));
-}
-
-std::string SimpleItoa(long i) {
- char buffer[kFastToBufferSize];
- return (sizeof(i) == 4) ?
- FastInt32ToBuffer(i, buffer) :
- FastInt64ToBuffer(i, buffer);
-}
-
-std::string SimpleItoa(unsigned long i) {
- char buffer[kFastToBufferSize];
- return std::string(buffer, (sizeof(i) == 4)
- ? FastUInt32ToBufferLeft(i, buffer)
- : FastUInt64ToBufferLeft(i, buffer));
-}
-
-std::string SimpleItoa(long long i) {
- char buffer[kFastToBufferSize];
- return (sizeof(i) == 4) ?
- FastInt32ToBuffer(i, buffer) :
- FastInt64ToBuffer(i, buffer);
-}
-
-std::string SimpleItoa(unsigned long long i) {
- char buffer[kFastToBufferSize];
- return std::string(buffer, (sizeof(i) == 4)
- ? FastUInt32ToBufferLeft(i, buffer)
- : FastUInt64ToBufferLeft(i, buffer));
-}
-
-// ----------------------------------------------------------------------
// SimpleDtoa()
// SimpleFtoa()
-// DoubleToBuffer()
-// FloatToBuffer()
// We want to print the value without losing precision, but we also do
// not want to print more digits than necessary. This turns out to be
// trickier than it sounds. Numbers like 0.2 cannot be represented
@@ -1196,23 +310,18 @@
// implementation.
// ----------------------------------------------------------------------
-std::string SimpleDtoa(double value) {
- char buffer[kDoubleToBufferSize];
- return DoubleToBuffer(value, buffer);
-}
-
-std::string SimpleFtoa(float value) {
- char buffer[kFloatToBufferSize];
- return FloatToBuffer(value, buffer);
-}
+namespace {
+// In practice, doubles should never need more than 24 bytes and floats
+// should never need more than 14 (including null terminators), but we
+// overestimate to be safe.
+constexpr int kDoubleToBufferSize = 32;
+constexpr int kFloatToBufferSize = 24;
static inline bool IsValidFloatChar(char c) {
- return ('0' <= c && c <= '9') ||
- c == 'e' || c == 'E' ||
- c == '+' || c == '-';
+ return ('0' <= c && c <= '9') || c == 'e' || c == 'E' || c == '+' || c == '-';
}
-void DelocalizeRadix(char* buffer) {
+void DelocalizeRadix(char *buffer) {
// Fast check: if the buffer has a normal decimal point, assume no
// translation is needed.
if (strchr(buffer, '.') != nullptr) return;
@@ -1233,12 +342,52 @@
if (!IsValidFloatChar(*buffer) && *buffer != '\0') {
// It appears the radix was a multi-byte character. We need to remove the
// extra bytes.
- char* target = buffer;
- do { ++buffer; } while (!IsValidFloatChar(*buffer) && *buffer != '\0');
+ char *target = buffer;
+ do {
+ ++buffer;
+ } while (!IsValidFloatChar(*buffer) && *buffer != '\0');
memmove(target, buffer, strlen(buffer) + 1);
}
}
+char *FloatToBuffer(float value, char *buffer) {
+ // FLT_DIG is 6 for IEEE-754 floats, which are used on almost all
+ // platforms these days. Just in case some system exists where FLT_DIG
+ // is significantly larger -- and risks overflowing our buffer -- we have
+ // this assert.
+ static_assert(FLT_DIG < 10, "FLT_DIG_is_too_big");
+
+ if (value == std::numeric_limits<double>::infinity()) {
+ strcpy(buffer, "inf");
+ return buffer;
+ } else if (value == -std::numeric_limits<double>::infinity()) {
+ strcpy(buffer, "-inf");
+ return buffer;
+ } else if (std::isnan(value)) {
+ strcpy(buffer, "nan");
+ return buffer;
+ }
+
+ int snprintf_result =
+ snprintf(buffer, kFloatToBufferSize, "%.*g", FLT_DIG, value);
+
+ // The snprintf should never overflow because the buffer is significantly
+ // larger than the precision we asked for.
+ GOOGLE_DCHECK(snprintf_result > 0 && snprintf_result < kFloatToBufferSize);
+
+ float parsed_value;
+ if (!safe_strtof(buffer, &parsed_value) || parsed_value != value) {
+ snprintf_result =
+ snprintf(buffer, kFloatToBufferSize, "%.*g", FLT_DIG + 3, value);
+
+ // Should never overflow; see above.
+ GOOGLE_DCHECK(snprintf_result > 0 && snprintf_result < kFloatToBufferSize);
+ }
+
+ DelocalizeRadix(buffer);
+ return buffer;
+}
+
char* DoubleToBuffer(double value, char* buffer) {
// DBL_DIG is 15 for IEEE-754 doubles, which are used on almost all
// platforms these days. Just in case some system exists where DBL_DIG
@@ -1282,6 +431,17 @@
DelocalizeRadix(buffer);
return buffer;
}
+} // namespace
+
+std::string SimpleDtoa(double value) {
+ char buffer[kDoubleToBufferSize];
+ return DoubleToBuffer(value, buffer);
+}
+
+std::string SimpleFtoa(float value) {
+ char buffer[kFloatToBufferSize];
+ return FloatToBuffer(value, buffer);
+}
static int memcasecmp(const char *s1, const char *s2, size_t len) {
const unsigned char *us1 = reinterpret_cast<const unsigned char *>(s1);
@@ -1289,19 +449,21 @@
for (size_t i = 0; i < len; i++) {
const int diff =
- static_cast<int>(static_cast<unsigned char>(ascii_tolower(us1[i]))) -
- static_cast<int>(static_cast<unsigned char>(ascii_tolower(us2[i])));
+ static_cast<int>(
+ static_cast<unsigned char>(absl::ascii_tolower(us1[i]))) -
+ static_cast<int>(
+ static_cast<unsigned char>(absl::ascii_tolower(us2[i])));
if (diff != 0) return diff;
}
return 0;
}
-inline bool CaseEqual(StringPiece s1, StringPiece s2) {
+inline bool CaseEqual(absl::string_view s1, absl::string_view s2) {
if (s1.size() != s2.size()) return false;
return memcasecmp(s1.data(), s2.data(), s1.size()) == 0;
}
-bool safe_strtob(StringPiece str, bool* value) {
+bool safe_strtob(absl::string_view str, bool *value) {
GOOGLE_CHECK(value != nullptr) << "nullptr output boolean given.";
if (CaseEqual(str, "true") || CaseEqual(str, "t") ||
CaseEqual(str, "yes") || CaseEqual(str, "y") ||
@@ -1333,7 +495,7 @@
char* endptr;
*value = internal::NoLocaleStrtod(str, &endptr);
if (endptr != str) {
- while (ascii_isspace(*endptr)) ++endptr;
+ while (absl::ascii_isspace(*endptr)) ++endptr;
}
// Ignore range errors from strtod. The values it
// returns on underflow and overflow are the right
@@ -1357,288 +519,7 @@
return safe_uint_internal(str, value);
}
-char* FloatToBuffer(float value, char* buffer) {
- // FLT_DIG is 6 for IEEE-754 floats, which are used on almost all
- // platforms these days. Just in case some system exists where FLT_DIG
- // is significantly larger -- and risks overflowing our buffer -- we have
- // this assert.
- static_assert(FLT_DIG < 10, "FLT_DIG_is_too_big");
-
- if (value == std::numeric_limits<double>::infinity()) {
- strcpy(buffer, "inf");
- return buffer;
- } else if (value == -std::numeric_limits<double>::infinity()) {
- strcpy(buffer, "-inf");
- return buffer;
- } else if (std::isnan(value)) {
- strcpy(buffer, "nan");
- return buffer;
- }
-
- int snprintf_result =
- snprintf(buffer, kFloatToBufferSize, "%.*g", FLT_DIG, value);
-
- // The snprintf should never overflow because the buffer is significantly
- // larger than the precision we asked for.
- GOOGLE_DCHECK(snprintf_result > 0 && snprintf_result < kFloatToBufferSize);
-
- float parsed_value;
- if (!safe_strtof(buffer, &parsed_value) || parsed_value != value) {
- snprintf_result =
- snprintf(buffer, kFloatToBufferSize, "%.*g", FLT_DIG + 3, value);
-
- // Should never overflow; see above.
- GOOGLE_DCHECK(snprintf_result > 0 && snprintf_result < kFloatToBufferSize);
- }
-
- DelocalizeRadix(buffer);
- return buffer;
-}
-
-namespace strings {
-
-AlphaNum::AlphaNum(strings::Hex hex) {
- char *const end = &digits[kFastToBufferSize];
- char *writer = end;
- uint64_t value = hex.value;
- uint64_t width = hex.spec;
- // We accomplish minimum width by OR'ing in 0x10000 to the user's value,
- // where 0x10000 is the smallest hex number that is as wide as the user
- // asked for.
- uint64_t mask = (static_cast<uint64_t>(1) << ((width - 1) * 4)) | value;
- static const char hexdigits[] = "0123456789abcdef";
- do {
- *--writer = hexdigits[value & 0xF];
- value >>= 4;
- mask >>= 4;
- } while (mask != 0);
- piece_data_ = writer;
- piece_size_ = end - writer;
-}
-
-} // namespace strings
-
-// ----------------------------------------------------------------------
-// StrCat()
-// This merges the given strings or integers, with no delimiter. This
-// is designed to be the fastest possible way to construct a string out
-// of a mix of raw C strings, C++ strings, and integer values.
-// ----------------------------------------------------------------------
-
-// Append is merely a version of memcpy that returns the address of the byte
-// after the area just overwritten. It comes in multiple flavors to minimize
-// call overhead.
-static char *Append1(char *out, const AlphaNum &x) {
- if (x.size() > 0) {
- memcpy(out, x.data(), x.size());
- out += x.size();
- }
- return out;
-}
-
-static char *Append2(char *out, const AlphaNum &x1, const AlphaNum &x2) {
- if (x1.size() > 0) {
- memcpy(out, x1.data(), x1.size());
- out += x1.size();
- }
- if (x2.size() > 0) {
- memcpy(out, x2.data(), x2.size());
- out += x2.size();
- }
- return out;
-}
-
-static char *Append4(char *out, const AlphaNum &x1, const AlphaNum &x2,
- const AlphaNum &x3, const AlphaNum &x4) {
- if (x1.size() > 0) {
- memcpy(out, x1.data(), x1.size());
- out += x1.size();
- }
- if (x2.size() > 0) {
- memcpy(out, x2.data(), x2.size());
- out += x2.size();
- }
- if (x3.size() > 0) {
- memcpy(out, x3.data(), x3.size());
- out += x3.size();
- }
- if (x4.size() > 0) {
- memcpy(out, x4.data(), x4.size());
- out += x4.size();
- }
- return out;
-}
-
-std::string StrCat(const AlphaNum &a, const AlphaNum &b) {
- std::string result;
- result.resize(a.size() + b.size());
- char *const begin = &*result.begin();
- char *out = Append2(begin, a, b);
- GOOGLE_DCHECK_EQ(out, begin + result.size());
- return result;
-}
-
-std::string StrCat(const AlphaNum &a, const AlphaNum &b, const AlphaNum &c) {
- std::string result;
- result.resize(a.size() + b.size() + c.size());
- char *const begin = &*result.begin();
- char *out = Append2(begin, a, b);
- out = Append1(out, c);
- GOOGLE_DCHECK_EQ(out, begin + result.size());
- return result;
-}
-
-std::string StrCat(const AlphaNum &a, const AlphaNum &b, const AlphaNum &c,
- const AlphaNum &d) {
- std::string result;
- result.resize(a.size() + b.size() + c.size() + d.size());
- char *const begin = &*result.begin();
- char *out = Append4(begin, a, b, c, d);
- GOOGLE_DCHECK_EQ(out, begin + result.size());
- return result;
-}
-
-std::string StrCat(const AlphaNum &a, const AlphaNum &b, const AlphaNum &c,
- const AlphaNum &d, const AlphaNum &e) {
- std::string result;
- result.resize(a.size() + b.size() + c.size() + d.size() + e.size());
- char *const begin = &*result.begin();
- char *out = Append4(begin, a, b, c, d);
- out = Append1(out, e);
- GOOGLE_DCHECK_EQ(out, begin + result.size());
- return result;
-}
-
-std::string StrCat(const AlphaNum &a, const AlphaNum &b, const AlphaNum &c,
- const AlphaNum &d, const AlphaNum &e, const AlphaNum &f) {
- std::string result;
- result.resize(a.size() + b.size() + c.size() + d.size() + e.size() +
- f.size());
- char *const begin = &*result.begin();
- char *out = Append4(begin, a, b, c, d);
- out = Append2(out, e, f);
- GOOGLE_DCHECK_EQ(out, begin + result.size());
- return result;
-}
-
-std::string StrCat(const AlphaNum &a, const AlphaNum &b, const AlphaNum &c,
- const AlphaNum &d, const AlphaNum &e, const AlphaNum &f,
- const AlphaNum &g) {
- std::string result;
- result.resize(a.size() + b.size() + c.size() + d.size() + e.size() +
- f.size() + g.size());
- char *const begin = &*result.begin();
- char *out = Append4(begin, a, b, c, d);
- out = Append2(out, e, f);
- out = Append1(out, g);
- GOOGLE_DCHECK_EQ(out, begin + result.size());
- return result;
-}
-
-std::string StrCat(const AlphaNum &a, const AlphaNum &b, const AlphaNum &c,
- const AlphaNum &d, const AlphaNum &e, const AlphaNum &f,
- const AlphaNum &g, const AlphaNum &h) {
- std::string result;
- result.resize(a.size() + b.size() + c.size() + d.size() + e.size() +
- f.size() + g.size() + h.size());
- char *const begin = &*result.begin();
- char *out = Append4(begin, a, b, c, d);
- out = Append4(out, e, f, g, h);
- GOOGLE_DCHECK_EQ(out, begin + result.size());
- return result;
-}
-
-std::string StrCat(const AlphaNum &a, const AlphaNum &b, const AlphaNum &c,
- const AlphaNum &d, const AlphaNum &e, const AlphaNum &f,
- const AlphaNum &g, const AlphaNum &h, const AlphaNum &i) {
- std::string result;
- result.resize(a.size() + b.size() + c.size() + d.size() + e.size() +
- f.size() + g.size() + h.size() + i.size());
- char *const begin = &*result.begin();
- char *out = Append4(begin, a, b, c, d);
- out = Append4(out, e, f, g, h);
- out = Append1(out, i);
- GOOGLE_DCHECK_EQ(out, begin + result.size());
- return result;
-}
-
-// It's possible to call StrAppend with a char * pointer that is partway into
-// the string we're appending to. However the results of this are random.
-// Therefore, check for this in debug mode. Use unsigned math so we only have
-// to do one comparison.
-#define GOOGLE_DCHECK_NO_OVERLAP(dest, src) \
- GOOGLE_DCHECK_GT(uintptr_t((src).data() - (dest).data()), \
- uintptr_t((dest).size()))
-
-void StrAppend(std::string *result, const AlphaNum &a) {
- GOOGLE_DCHECK_NO_OVERLAP(*result, a);
- result->append(a.data(), a.size());
-}
-
-void StrAppend(std::string *result, const AlphaNum &a, const AlphaNum &b) {
- GOOGLE_DCHECK_NO_OVERLAP(*result, a);
- GOOGLE_DCHECK_NO_OVERLAP(*result, b);
- std::string::size_type old_size = result->size();
- result->resize(old_size + a.size() + b.size());
- char *const begin = &*result->begin();
- char *out = Append2(begin + old_size, a, b);
- GOOGLE_DCHECK_EQ(out, begin + result->size());
-}
-
-void StrAppend(std::string *result, const AlphaNum &a, const AlphaNum &b,
- const AlphaNum &c) {
- GOOGLE_DCHECK_NO_OVERLAP(*result, a);
- GOOGLE_DCHECK_NO_OVERLAP(*result, b);
- GOOGLE_DCHECK_NO_OVERLAP(*result, c);
- std::string::size_type old_size = result->size();
- result->resize(old_size + a.size() + b.size() + c.size());
- char *const begin = &*result->begin();
- char *out = Append2(begin + old_size, a, b);
- out = Append1(out, c);
- GOOGLE_DCHECK_EQ(out, begin + result->size());
-}
-
-void StrAppend(std::string *result, const AlphaNum &a, const AlphaNum &b,
- const AlphaNum &c, const AlphaNum &d) {
- GOOGLE_DCHECK_NO_OVERLAP(*result, a);
- GOOGLE_DCHECK_NO_OVERLAP(*result, b);
- GOOGLE_DCHECK_NO_OVERLAP(*result, c);
- GOOGLE_DCHECK_NO_OVERLAP(*result, d);
- std::string::size_type old_size = result->size();
- result->resize(old_size + a.size() + b.size() + c.size() + d.size());
- char *const begin = &*result->begin();
- char *out = Append4(begin + old_size, a, b, c, d);
- GOOGLE_DCHECK_EQ(out, begin + result->size());
-}
-
-int GlobalReplaceSubstring(const std::string &substring,
- const std::string &replacement, std::string *s) {
- GOOGLE_CHECK(s != nullptr);
- if (s->empty() || substring.empty())
- return 0;
- std::string tmp;
- int num_replacements = 0;
- int pos = 0;
- for (StringPiece::size_type match_pos =
- s->find(substring.data(), pos, substring.length());
- match_pos != std::string::npos; pos = match_pos + substring.length(),
- match_pos = s->find(substring.data(), pos,
- substring.length())) {
- ++num_replacements;
- // Append the original content before the match.
- tmp.append(*s, pos, match_pos - pos);
- // Append the replacement for the match.
- tmp.append(replacement.begin(), replacement.end());
- }
- // Append the content after the last match. If no replacements were made, the
- // original string is left untouched.
- if (num_replacements > 0) {
- tmp.append(*s, pos, s->length() - pos);
- s->swap(tmp);
- }
- return num_replacements;
-}
-
+namespace {
int CalculateBase64EscapedLen(int input_len, bool do_padding) {
// Base64 encodes three bytes of input at a time. If the input is not
// divisible by three, we pad as appropriate.
@@ -1653,7 +534,6 @@
// 64 input is an integral number of octets, only the following cases
// can arise:
-
// Base64 encodes each three bytes of input into four bytes of output.
int len = (input_len / 3) * 4;
@@ -1686,408 +566,8 @@
return len;
}
-// Base64Escape does padding, so this calculation includes padding.
-int CalculateBase64EscapedLen(int input_len) {
- return CalculateBase64EscapedLen(input_len, true);
-}
-
-// ----------------------------------------------------------------------
-// int Base64Unescape() - base64 decoder
-// int Base64Escape() - base64 encoder
-// int WebSafeBase64Unescape() - Google's variation of base64 decoder
-// int WebSafeBase64Escape() - Google's variation of base64 encoder
-//
-// Check out
-// http://tools.ietf.org/html/rfc2045 for formal description, but what we
-// care about is that...
-// Take the encoded stuff in groups of 4 characters and turn each
-// character into a code 0 to 63 thus:
-// A-Z map to 0 to 25
-// a-z map to 26 to 51
-// 0-9 map to 52 to 61
-// +(- for WebSafe) maps to 62
-// /(_ for WebSafe) maps to 63
-// There will be four numbers, all less than 64 which can be represented
-// by a 6 digit binary number (aaaaaa, bbbbbb, cccccc, dddddd respectively).
-// Arrange the 6 digit binary numbers into three bytes as such:
-// aaaaaabb bbbbcccc ccdddddd
-// Equals signs (one or two) are used at the end of the encoded block to
-// indicate that the text was not an integer multiple of three bytes long.
-// ----------------------------------------------------------------------
-
-int Base64UnescapeInternal(const char *src_param, int szsrc,
- char *dest, int szdest,
- const signed char* unbase64) {
- static const char kPad64Equals = '=';
- static const char kPad64Dot = '.';
-
- int decode = 0;
- int destidx = 0;
- int state = 0;
- unsigned int ch = 0;
- unsigned int temp = 0;
-
- // If "char" is signed by default, using *src as an array index results in
- // accessing negative array elements. Treat the input as a pointer to
- // unsigned char to avoid this.
- const unsigned char *src = reinterpret_cast<const unsigned char*>(src_param);
-
- // The GET_INPUT macro gets the next input character, skipping
- // over any whitespace, and stopping when we reach the end of the
- // string or when we read any non-data character. The arguments are
- // an arbitrary identifier (used as a label for goto) and the number
- // of data bytes that must remain in the input to avoid aborting the
- // loop.
-#define GET_INPUT(label, remain) \
- label: \
- --szsrc; \
- ch = *src++; \
- decode = unbase64[ch]; \
- if (decode < 0) { \
- if (ascii_isspace(ch) && szsrc >= remain) \
- goto label; \
- state = 4 - remain; \
- break; \
- }
-
- // if dest is null, we're just checking to see if it's legal input
- // rather than producing output. (I suspect this could just be done
- // with a regexp...). We duplicate the loop so this test can be
- // outside it instead of in every iteration.
-
- if (dest) {
- // This loop consumes 4 input bytes and produces 3 output bytes
- // per iteration. We can't know at the start that there is enough
- // data left in the string for a full iteration, so the loop may
- // break out in the middle; if so 'state' will be set to the
- // number of input bytes read.
-
- while (szsrc >= 4) {
- // We'll start by optimistically assuming that the next four
- // bytes of the string (src[0..3]) are four good data bytes
- // (that is, no nulls, whitespace, padding chars, or illegal
- // chars). We need to test src[0..2] for nulls individually
- // before constructing temp to preserve the property that we
- // never read past a null in the string (no matter how long
- // szsrc claims the string is).
-
- if (!src[0] || !src[1] || !src[2] ||
- (temp = ((unsigned(unbase64[src[0]]) << 18) |
- (unsigned(unbase64[src[1]]) << 12) |
- (unsigned(unbase64[src[2]]) << 6) |
- (unsigned(unbase64[src[3]])))) & 0x80000000) {
- // Iff any of those four characters was bad (null, illegal,
- // whitespace, padding), then temp's high bit will be set
- // (because unbase64[] is -1 for all bad characters).
- //
- // We'll back up and resort to the slower decoder, which knows
- // how to handle those cases.
-
- GET_INPUT(first, 4);
- temp = decode;
- GET_INPUT(second, 3);
- temp = (temp << 6) | decode;
- GET_INPUT(third, 2);
- temp = (temp << 6) | decode;
- GET_INPUT(fourth, 1);
- temp = (temp << 6) | decode;
- } else {
- // We really did have four good data bytes, so advance four
- // characters in the string.
-
- szsrc -= 4;
- src += 4;
- decode = -1;
- ch = '\0';
- }
-
- // temp has 24 bits of input, so write that out as three bytes.
-
- if (destidx+3 > szdest) return -1;
- dest[destidx+2] = temp;
- temp >>= 8;
- dest[destidx+1] = temp;
- temp >>= 8;
- dest[destidx] = temp;
- destidx += 3;
- }
- } else {
- while (szsrc >= 4) {
- if (!src[0] || !src[1] || !src[2] ||
- (temp = ((unsigned(unbase64[src[0]]) << 18) |
- (unsigned(unbase64[src[1]]) << 12) |
- (unsigned(unbase64[src[2]]) << 6) |
- (unsigned(unbase64[src[3]])))) & 0x80000000) {
- GET_INPUT(first_no_dest, 4);
- GET_INPUT(second_no_dest, 3);
- GET_INPUT(third_no_dest, 2);
- GET_INPUT(fourth_no_dest, 1);
- } else {
- szsrc -= 4;
- src += 4;
- decode = -1;
- ch = '\0';
- }
- destidx += 3;
- }
- }
-
-#undef GET_INPUT
-
- // if the loop terminated because we read a bad character, return
- // now.
- if (decode < 0 && ch != '\0' &&
- ch != kPad64Equals && ch != kPad64Dot && !ascii_isspace(ch))
- return -1;
-
- if (ch == kPad64Equals || ch == kPad64Dot) {
- // if we stopped by hitting an '=' or '.', un-read that character -- we'll
- // look at it again when we count to check for the proper number of
- // equals signs at the end.
- ++szsrc;
- --src;
- } else {
- // This loop consumes 1 input byte per iteration. It's used to
- // clean up the 0-3 input bytes remaining when the first, faster
- // loop finishes. 'temp' contains the data from 'state' input
- // characters read by the first loop.
- while (szsrc > 0) {
- --szsrc;
- ch = *src++;
- decode = unbase64[ch];
- if (decode < 0) {
- if (ascii_isspace(ch)) {
- continue;
- } else if (ch == '\0') {
- break;
- } else if (ch == kPad64Equals || ch == kPad64Dot) {
- // back up one character; we'll read it again when we check
- // for the correct number of pad characters at the end.
- ++szsrc;
- --src;
- break;
- } else {
- return -1;
- }
- }
-
- // Each input character gives us six bits of output.
- temp = (temp << 6) | decode;
- ++state;
- if (state == 4) {
- // If we've accumulated 24 bits of output, write that out as
- // three bytes.
- if (dest) {
- if (destidx+3 > szdest) return -1;
- dest[destidx+2] = temp;
- temp >>= 8;
- dest[destidx+1] = temp;
- temp >>= 8;
- dest[destidx] = temp;
- }
- destidx += 3;
- state = 0;
- temp = 0;
- }
- }
- }
-
- // Process the leftover data contained in 'temp' at the end of the input.
- int expected_equals = 0;
- switch (state) {
- case 0:
- // Nothing left over; output is a multiple of 3 bytes.
- break;
-
- case 1:
- // Bad input; we have 6 bits left over.
- return -1;
-
- case 2:
- // Produce one more output byte from the 12 input bits we have left.
- if (dest) {
- if (destidx+1 > szdest) return -1;
- temp >>= 4;
- dest[destidx] = temp;
- }
- ++destidx;
- expected_equals = 2;
- break;
-
- case 3:
- // Produce two more output bytes from the 18 input bits we have left.
- if (dest) {
- if (destidx+2 > szdest) return -1;
- temp >>= 2;
- dest[destidx+1] = temp;
- temp >>= 8;
- dest[destidx] = temp;
- }
- destidx += 2;
- expected_equals = 1;
- break;
-
- default:
- // state should have no other values at this point.
- GOOGLE_LOG(FATAL) << "This can't happen; base64 decoder state = " << state;
- }
-
- // The remainder of the string should be all whitespace, mixed with
- // exactly 0 equals signs, or exactly 'expected_equals' equals
- // signs. (Always accepting 0 equals signs is a google extension
- // not covered in the RFC, as is accepting dot as the pad character.)
-
- int equals = 0;
- while (szsrc > 0 && *src) {
- if (*src == kPad64Equals || *src == kPad64Dot)
- ++equals;
- else if (!ascii_isspace(*src))
- return -1;
- --szsrc;
- ++src;
- }
-
- return (equals == 0 || equals == expected_equals) ? destidx : -1;
-}
-
-// The arrays below were generated by the following code
-// #include <sys/time.h>
-// #include <stdlib.h>
-// #include <string.h>
-// #include <stdio.h>
-// main()
-// {
-// static const char Base64[] =
-// "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-// const char *pos;
-// int idx, i, j;
-// printf(" ");
-// for (i = 0; i < 255; i += 8) {
-// for (j = i; j < i + 8; j++) {
-// pos = strchr(Base64, j);
-// if ((pos == nullptr) || (j == 0))
-// idx = -1;
-// else
-// idx = pos - Base64;
-// if (idx == -1)
-// printf(" %2d, ", idx);
-// else
-// printf(" %2d/""*%c*""/,", idx, j);
-// }
-// printf("\n ");
-// }
-// }
-//
-// where the value of "Base64[]" was replaced by one of the base-64 conversion
-// tables from the functions below.
-static const signed char kUnBase64[] = {
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, 62/*+*/, -1, -1, -1, 63/*/ */,
- 52/*0*/, 53/*1*/, 54/*2*/, 55/*3*/, 56/*4*/, 57/*5*/, 58/*6*/, 59/*7*/,
- 60/*8*/, 61/*9*/, -1, -1, -1, -1, -1, -1,
- -1, 0/*A*/, 1/*B*/, 2/*C*/, 3/*D*/, 4/*E*/, 5/*F*/, 6/*G*/,
- 7/*H*/, 8/*I*/, 9/*J*/, 10/*K*/, 11/*L*/, 12/*M*/, 13/*N*/, 14/*O*/,
- 15/*P*/, 16/*Q*/, 17/*R*/, 18/*S*/, 19/*T*/, 20/*U*/, 21/*V*/, 22/*W*/,
- 23/*X*/, 24/*Y*/, 25/*Z*/, -1, -1, -1, -1, -1,
- -1, 26/*a*/, 27/*b*/, 28/*c*/, 29/*d*/, 30/*e*/, 31/*f*/, 32/*g*/,
- 33/*h*/, 34/*i*/, 35/*j*/, 36/*k*/, 37/*l*/, 38/*m*/, 39/*n*/, 40/*o*/,
- 41/*p*/, 42/*q*/, 43/*r*/, 44/*s*/, 45/*t*/, 46/*u*/, 47/*v*/, 48/*w*/,
- 49/*x*/, 50/*y*/, 51/*z*/, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1
-};
-static const signed char kUnWebSafeBase64[] = {
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, 62/*-*/, -1, -1,
- 52/*0*/, 53/*1*/, 54/*2*/, 55/*3*/, 56/*4*/, 57/*5*/, 58/*6*/, 59/*7*/,
- 60/*8*/, 61/*9*/, -1, -1, -1, -1, -1, -1,
- -1, 0/*A*/, 1/*B*/, 2/*C*/, 3/*D*/, 4/*E*/, 5/*F*/, 6/*G*/,
- 7/*H*/, 8/*I*/, 9/*J*/, 10/*K*/, 11/*L*/, 12/*M*/, 13/*N*/, 14/*O*/,
- 15/*P*/, 16/*Q*/, 17/*R*/, 18/*S*/, 19/*T*/, 20/*U*/, 21/*V*/, 22/*W*/,
- 23/*X*/, 24/*Y*/, 25/*Z*/, -1, -1, -1, -1, 63/*_*/,
- -1, 26/*a*/, 27/*b*/, 28/*c*/, 29/*d*/, 30/*e*/, 31/*f*/, 32/*g*/,
- 33/*h*/, 34/*i*/, 35/*j*/, 36/*k*/, 37/*l*/, 38/*m*/, 39/*n*/, 40/*o*/,
- 41/*p*/, 42/*q*/, 43/*r*/, 44/*s*/, 45/*t*/, 46/*u*/, 47/*v*/, 48/*w*/,
- 49/*x*/, 50/*y*/, 51/*z*/, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1
-};
-
-int WebSafeBase64Unescape(const char *src, int szsrc, char *dest, int szdest) {
- return Base64UnescapeInternal(src, szsrc, dest, szdest, kUnWebSafeBase64);
-}
-
-static bool Base64UnescapeInternal(const char *src, int slen, std::string *dest,
- const signed char *unbase64) {
- // Determine the size of the output string. Base64 encodes every 3 bytes into
- // 4 characters. any leftover chars are added directly for good measure.
- // This is documented in the base64 RFC: http://tools.ietf.org/html/rfc3548
- const int dest_len = 3 * (slen / 4) + (slen % 4);
-
- dest->resize(dest_len);
-
- // We are getting the destination buffer by getting the beginning of the
- // string and converting it into a char *.
- const int len = Base64UnescapeInternal(src, slen, string_as_array(dest),
- dest_len, unbase64);
- if (len < 0) {
- dest->clear();
- return false;
- }
-
- // could be shorter if there was padding
- GOOGLE_DCHECK_LE(len, dest_len);
- dest->erase(len);
-
- return true;
-}
-
-bool Base64Unescape(StringPiece src, std::string *dest) {
- return Base64UnescapeInternal(src.data(), src.size(), dest, kUnBase64);
-}
-
-bool WebSafeBase64Unescape(StringPiece src, std::string *dest) {
- return Base64UnescapeInternal(src.data(), src.size(), dest, kUnWebSafeBase64);
-}
-
-int Base64EscapeInternal(const unsigned char *src, int szsrc,
- char *dest, int szdest, const char *base64,
+int Base64EscapeInternal(const unsigned char *src, int szsrc, char *dest,
+ int szdest, const absl::string_view base64,
bool do_padding) {
static const char kPad64 = '=';
@@ -2186,60 +666,41 @@
return (cur_dest - dest);
}
-static const char kBase64Chars[] =
-"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-
-static const char kWebSafeBase64Chars[] =
-"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
-
-int Base64Escape(const unsigned char *src, int szsrc, char *dest, int szdest) {
- return Base64EscapeInternal(src, szsrc, dest, szdest, kBase64Chars, true);
-}
-int WebSafeBase64Escape(const unsigned char *src, int szsrc, char *dest,
- int szdest, bool do_padding) {
- return Base64EscapeInternal(src, szsrc, dest, szdest,
- kWebSafeBase64Chars, do_padding);
-}
-
void Base64EscapeInternal(const unsigned char *src, int szsrc,
std::string *dest, bool do_padding,
- const char *base64_chars) {
- const int calc_escaped_size =
- CalculateBase64EscapedLen(szsrc, do_padding);
+ const absl::string_view base64_chars) {
+ const int calc_escaped_size = CalculateBase64EscapedLen(szsrc, do_padding);
dest->resize(calc_escaped_size);
- const int escaped_len = Base64EscapeInternal(src, szsrc,
- string_as_array(dest),
- dest->size(),
- base64_chars,
- do_padding);
+ const int escaped_len =
+ Base64EscapeInternal(src, szsrc, string_as_array(dest), dest->size(),
+ base64_chars, do_padding);
GOOGLE_DCHECK_EQ(calc_escaped_size, escaped_len);
dest->erase(escaped_len);
}
-void Base64Escape(const unsigned char *src, int szsrc, std::string *dest,
- bool do_padding) {
- Base64EscapeInternal(src, szsrc, dest, do_padding, kBase64Chars);
+static constexpr absl::string_view kBase64Chars =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+
+static constexpr absl::string_view kWebSafeBase64Chars =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
+
+} // namespace
+
+namespace strings {
+
+void LegacyBase64EscapeWithoutPadding(absl::string_view src,
+ std::string *dest) {
+ Base64EscapeInternal(reinterpret_cast<const unsigned char *>(src.data()),
+ src.size(), dest, /*do_padding=*/false, kBase64Chars);
}
-void WebSafeBase64Escape(const unsigned char *src, int szsrc, std::string *dest,
- bool do_padding) {
- Base64EscapeInternal(src, szsrc, dest, do_padding, kWebSafeBase64Chars);
+void WebSafeBase64EscapeWithPadding(absl::string_view src, std::string *dest) {
+ Base64EscapeInternal(reinterpret_cast<const unsigned char *>(src.data()),
+ src.size(), dest,
+ /*do_padding=*/true, kWebSafeBase64Chars);
}
-void Base64Escape(StringPiece src, std::string *dest) {
- Base64Escape(reinterpret_cast<const unsigned char*>(src.data()),
- src.size(), dest, true);
-}
-
-void WebSafeBase64Escape(StringPiece src, std::string *dest) {
- WebSafeBase64Escape(reinterpret_cast<const unsigned char*>(src.data()),
- src.size(), dest, false);
-}
-
-void WebSafeBase64EscapeWithPadding(StringPiece src, std::string *dest) {
- WebSafeBase64Escape(reinterpret_cast<const unsigned char*>(src.data()),
- src.size(), dest, true);
-}
+} // namespace strings
// Helper to append a Unicode code point to a string as UTF8, without bringing
// in any external dependencies.
@@ -2299,111 +760,6 @@
return kUTF8LenTbl[*reinterpret_cast<const uint8_t*>(src)];
}
-// ----------------------------------------------------------------------
-// CleanStringLineEndings()
-// Clean up a multi-line string to conform to Unix line endings.
-// Reads from src and appends to dst, so usually dst should be empty.
-//
-// If there is no line ending at the end of a non-empty string, it can
-// be added automatically.
-//
-// Four different types of input are correctly handled:
-//
-// - Unix/Linux files: line ending is LF: pass through unchanged
-//
-// - DOS/Windows files: line ending is CRLF: convert to LF
-//
-// - Legacy Mac files: line ending is CR: convert to LF
-//
-// - Garbled files: random line endings: convert gracefully
-// lonely CR, lonely LF, CRLF: convert to LF
-//
-// @param src The multi-line string to convert
-// @param dst The converted string is appended to this string
-// @param auto_end_last_line Automatically terminate the last line
-//
-// Limitations:
-//
-// This does not do the right thing for CRCRLF files created by
-// broken programs that do another Unix->DOS conversion on files
-// that are already in CRLF format. For this, a two-pass approach
-// brute-force would be needed that
-//
-// (1) determines the presence of LF (first one is ok)
-// (2) if yes, removes any CR, else convert every CR to LF
-
-void CleanStringLineEndings(const std::string &src, std::string *dst,
- bool auto_end_last_line) {
- if (dst->empty()) {
- dst->append(src);
- CleanStringLineEndings(dst, auto_end_last_line);
- } else {
- std::string tmp = src;
- CleanStringLineEndings(&tmp, auto_end_last_line);
- dst->append(tmp);
- }
-}
-
-void CleanStringLineEndings(std::string *str, bool auto_end_last_line) {
- ptrdiff_t output_pos = 0;
- bool r_seen = false;
- ptrdiff_t len = str->size();
-
- char *p = &(*str)[0];
-
- for (ptrdiff_t input_pos = 0; input_pos < len;) {
- if (!r_seen && input_pos + 8 < len) {
- uint64_t v = GOOGLE_UNALIGNED_LOAD64(p + input_pos);
- // Loop over groups of 8 bytes at a time until we come across
- // a word that has a byte whose value is less than or equal to
- // '\r' (i.e. could contain a \n (0x0a) or a \r (0x0d) ).
- //
- // We use a has_less macro that quickly tests a whole 64-bit
- // word to see if any of the bytes has a value < N.
- //
- // For more details, see:
- // http://graphics.stanford.edu/~seander/bithacks.html#HasLessInWord
-#define has_less(x, n) (((x) - ~0ULL / 255 * (n)) & ~(x) & ~0ULL / 255 * 128)
- if (!has_less(v, '\r' + 1)) {
-#undef has_less
- // No byte in this word has a value that could be a \r or a \n
- if (output_pos != input_pos) {
- GOOGLE_UNALIGNED_STORE64(p + output_pos, v);
- }
- input_pos += 8;
- output_pos += 8;
- continue;
- }
- }
- std::string::const_reference in = p[input_pos];
- if (in == '\r') {
- if (r_seen) p[output_pos++] = '\n';
- r_seen = true;
- } else if (in == '\n') {
- if (input_pos != output_pos)
- p[output_pos++] = '\n';
- else
- output_pos++;
- r_seen = false;
- } else {
- if (r_seen) p[output_pos++] = '\n';
- r_seen = false;
- if (input_pos != output_pos)
- p[output_pos++] = in;
- else
- output_pos++;
- }
- input_pos++;
- }
- if (r_seen ||
- (auto_end_last_line && output_pos > 0 && p[output_pos - 1] != '\n')) {
- str->resize(output_pos + 1);
- str->operator[](output_pos) = '\n';
- } else if (output_pos < len) {
- str->resize(output_pos);
- }
-}
-
namespace internal {
// ----------------------------------------------------------------------
diff --git a/src/google/protobuf/stubs/strutil.h b/src/google/protobuf/stubs/strutil.h
index 9658abf..1e64d7b 100644
--- a/src/google/protobuf/stubs/strutil.h
+++ b/src/google/protobuf/stubs/strutil.h
@@ -33,14 +33,19 @@
#ifndef GOOGLE_PROTOBUF_STUBS_STRUTIL_H__
#define GOOGLE_PROTOBUF_STUBS_STRUTIL_H__
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/stringpiece.h>
#include <stdlib.h>
#include <cstring>
-#include <google/protobuf/port_def.inc>
#include <vector>
+#include "absl/strings/str_cat.h"
+#include "absl/strings/str_join.h"
+#include "absl/strings/string_view.h"
+#include "google/protobuf/stubs/common.h"
+
+// Must be last.
+#include "google/protobuf/port_def.inc" // NOLINT
+
namespace google {
namespace protobuf {
@@ -53,49 +58,6 @@
#define strtoull strtoul
#endif
-// ----------------------------------------------------------------------
-// ascii_isalnum()
-// Check if an ASCII character is alphanumeric. We can't use ctype's
-// isalnum() because it is affected by locale. This function is applied
-// to identifiers in the protocol buffer language, not to natural-language
-// strings, so locale should not be taken into account.
-// ascii_isdigit()
-// Like above, but only accepts digits.
-// ascii_isspace()
-// Check if the character is a space character.
-// ----------------------------------------------------------------------
-
-inline bool ascii_isalnum(char c) {
- return ('a' <= c && c <= 'z') ||
- ('A' <= c && c <= 'Z') ||
- ('0' <= c && c <= '9');
-}
-
-inline bool ascii_isdigit(char c) {
- return ('0' <= c && c <= '9');
-}
-
-inline bool ascii_isspace(char c) {
- return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' ||
- c == '\r';
-}
-
-inline bool ascii_isupper(char c) {
- return c >= 'A' && c <= 'Z';
-}
-
-inline bool ascii_islower(char c) {
- return c >= 'a' && c <= 'z';
-}
-
-inline char ascii_toupper(char c) {
- return ascii_islower(c) ? c - ('a' - 'A') : c;
-}
-
-inline char ascii_tolower(char c) {
- return ascii_isupper(c) ? c + ('a' - 'A') : c;
-}
-
inline int hex_digit_to_int(char c) {
/* Assume ASCII. */
int x = static_cast<unsigned char>(c);
@@ -106,99 +68,6 @@
}
// ----------------------------------------------------------------------
-// HasPrefixString()
-// Check if a string begins with a given prefix.
-// StripPrefixString()
-// Given a string and a putative prefix, returns the string minus the
-// prefix string if the prefix matches, otherwise the original
-// string.
-// ----------------------------------------------------------------------
-inline bool HasPrefixString(StringPiece str, StringPiece prefix) {
- return str.size() >= prefix.size() &&
- memcmp(str.data(), prefix.data(), prefix.size()) == 0;
-}
-
-inline std::string StripPrefixString(const std::string& str,
- const std::string& prefix) {
- if (HasPrefixString(str, prefix)) {
- return str.substr(prefix.size());
- } else {
- return str;
- }
-}
-
-// ----------------------------------------------------------------------
-// HasSuffixString()
-// Return true if str ends in suffix.
-// StripSuffixString()
-// Given a string and a putative suffix, returns the string minus the
-// suffix string if the suffix matches, otherwise the original
-// string.
-// ----------------------------------------------------------------------
-inline bool HasSuffixString(StringPiece str, StringPiece suffix) {
- return str.size() >= suffix.size() &&
- memcmp(str.data() + str.size() - suffix.size(), suffix.data(),
- suffix.size()) == 0;
-}
-
-inline std::string StripSuffixString(const std::string& str,
- const std::string& suffix) {
- if (HasSuffixString(str, suffix)) {
- return str.substr(0, str.size() - suffix.size());
- } else {
- return str;
- }
-}
-
-// ----------------------------------------------------------------------
-// ReplaceCharacters
-// Replaces any occurrence of the character 'remove' (or the characters
-// in 'remove') with the character 'replacewith'.
-// Good for keeping html characters or protocol characters (\t) out
-// of places where they might cause a problem.
-// StripWhitespace
-// Removes whitespaces from both ends of the given string.
-// ----------------------------------------------------------------------
-PROTOBUF_EXPORT void ReplaceCharacters(std::string* s, const char* remove,
- char replacewith);
-
-PROTOBUF_EXPORT void StripWhitespace(std::string* s);
-
-// ----------------------------------------------------------------------
-// LowerString()
-// UpperString()
-// ToUpper()
-// Convert the characters in "s" to lowercase or uppercase. ASCII-only:
-// these functions intentionally ignore locale because they are applied to
-// identifiers used in the Protocol Buffer language, not to natural-language
-// strings.
-// ----------------------------------------------------------------------
-
-inline void LowerString(std::string* s) {
- std::string::iterator end = s->end();
- for (std::string::iterator i = s->begin(); i != end; ++i) {
- // tolower() changes based on locale. We don't want this!
- if ('A' <= *i && *i <= 'Z') *i += 'a' - 'A';
- }
-}
-
-inline void UpperString(std::string* s) {
- std::string::iterator end = s->end();
- for (std::string::iterator i = s->begin(); i != end; ++i) {
- // toupper() changes based on locale. We don't want this!
- if ('a' <= *i && *i <= 'z') *i += 'A' - 'a';
- }
-}
-
-inline void ToUpper(std::string* s) { UpperString(s); }
-
-inline std::string ToUpper(const std::string& s) {
- std::string out = s;
- UpperString(&out);
- return out;
-}
-
-// ----------------------------------------------------------------------
// StringReplace()
// Give me a string and two patterns "old" and "new", and I replace
// the first instance of "old" in the string with "new", if it
@@ -212,140 +81,6 @@
bool replace_all);
// ----------------------------------------------------------------------
-// SplitStringUsing()
-// Split a string using a character delimiter. Append the components
-// to 'result'. If there are consecutive delimiters, this function skips
-// over all of them.
-// ----------------------------------------------------------------------
-PROTOBUF_EXPORT void SplitStringUsing(StringPiece full, const char* delim,
- std::vector<std::string>* res);
-
-// Split a string using one or more byte delimiters, presented
-// as a nul-terminated c string. Append the components to 'result'.
-// If there are consecutive delimiters, this function will return
-// corresponding empty strings. If you want to drop the empty
-// strings, try SplitStringUsing().
-//
-// If "full" is the empty string, yields an empty string as the only value.
-// ----------------------------------------------------------------------
-PROTOBUF_EXPORT void SplitStringAllowEmpty(StringPiece full, const char* delim,
- std::vector<std::string>* result);
-
-// ----------------------------------------------------------------------
-// Split()
-// Split a string using a character delimiter.
-// ----------------------------------------------------------------------
-inline std::vector<std::string> Split(StringPiece full, const char* delim,
- bool skip_empty = true) {
- std::vector<std::string> result;
- if (skip_empty) {
- SplitStringUsing(full, delim, &result);
- } else {
- SplitStringAllowEmpty(full, delim, &result);
- }
- return result;
-}
-
-// ----------------------------------------------------------------------
-// JoinStrings()
-// These methods concatenate a vector of strings into a C++ string, using
-// the C-string "delim" as a separator between components. There are two
-// flavors of the function, one flavor returns the concatenated string,
-// another takes a pointer to the target string. In the latter case the
-// target string is cleared and overwritten.
-// ----------------------------------------------------------------------
-PROTOBUF_EXPORT void JoinStrings(const std::vector<std::string>& components,
- const char* delim, std::string* result);
-
-inline std::string JoinStrings(const std::vector<std::string>& components,
- const char* delim) {
- std::string result;
- JoinStrings(components, delim, &result);
- return result;
-}
-
-// ----------------------------------------------------------------------
-// UnescapeCEscapeSequences()
-// Copies "source" to "dest", rewriting C-style escape sequences
-// -- '\n', '\r', '\\', '\ooo', etc -- to their ASCII
-// equivalents. "dest" must be sufficiently large to hold all
-// the characters in the rewritten string (i.e. at least as large
-// as strlen(source) + 1 should be safe, since the replacements
-// are always shorter than the original escaped sequences). It's
-// safe for source and dest to be the same. RETURNS the length
-// of dest.
-//
-// It allows hex sequences \xhh, or generally \xhhhhh with an
-// arbitrary number of hex digits, but all of them together must
-// specify a value of a single byte (e.g. \x0045 is equivalent
-// to \x45, and \x1234 is erroneous).
-//
-// It also allows escape sequences of the form \uhhhh (exactly four
-// hex digits, upper or lower case) or \Uhhhhhhhh (exactly eight
-// hex digits, upper or lower case) to specify a Unicode code
-// point. The dest array will contain the UTF8-encoded version of
-// that code-point (e.g., if source contains \u2019, then dest will
-// contain the three bytes 0xE2, 0x80, and 0x99).
-//
-// Errors: In the first form of the call, errors are reported with
-// LOG(ERROR). The same is true for the second form of the call if
-// the pointer to the string std::vector is nullptr; otherwise, error
-// messages are stored in the std::vector. In either case, the effect on
-// the dest array is not defined, but rest of the source will be
-// processed.
-// ----------------------------------------------------------------------
-
-PROTOBUF_EXPORT int UnescapeCEscapeSequences(const char* source, char* dest);
-PROTOBUF_EXPORT int UnescapeCEscapeSequences(const char* source, char* dest,
- std::vector<std::string>* errors);
-
-// ----------------------------------------------------------------------
-// UnescapeCEscapeString()
-// This does the same thing as UnescapeCEscapeSequences, but creates
-// a new string. The caller does not need to worry about allocating
-// a dest buffer. This should be used for non performance critical
-// tasks such as printing debug messages. It is safe for src and dest
-// to be the same.
-//
-// The second call stores its errors in a supplied string vector.
-// If the string vector pointer is nullptr, it reports the errors with LOG().
-//
-// In the first and second calls, the length of dest is returned. In the
-// the third call, the new string is returned.
-// ----------------------------------------------------------------------
-
-PROTOBUF_EXPORT int UnescapeCEscapeString(const std::string& src,
- std::string* dest);
-PROTOBUF_EXPORT int UnescapeCEscapeString(const std::string& src,
- std::string* dest,
- std::vector<std::string>* errors);
-PROTOBUF_EXPORT std::string UnescapeCEscapeString(const std::string& src);
-
-// ----------------------------------------------------------------------
-// CEscape()
-// Escapes 'src' using C-style escape sequences and returns the resulting
-// string.
-//
-// Escaped chars: \n, \r, \t, ", ', \, and !isprint().
-// ----------------------------------------------------------------------
-PROTOBUF_EXPORT std::string CEscape(const std::string& src);
-
-// ----------------------------------------------------------------------
-// CEscapeAndAppend()
-// Escapes 'src' using C-style escape sequences, and appends the escaped
-// string to 'dest'.
-// ----------------------------------------------------------------------
-PROTOBUF_EXPORT void CEscapeAndAppend(StringPiece src, std::string* dest);
-
-namespace strings {
-// Like CEscape() but does not escape bytes with the upper bit set.
-PROTOBUF_EXPORT std::string Utf8SafeCEscape(const std::string& src);
-
-// Like CEscape() but uses hex (\x) escapes instead of octals.
-PROTOBUF_EXPORT std::string CHexEscape(const std::string& src);
-} // namespace strings
-
-// ----------------------------------------------------------------------
// strto32()
// strtou32()
// strto64()
@@ -397,21 +132,21 @@
// safe_strtof()
// safe_strtod()
// ----------------------------------------------------------------------
-PROTOBUF_EXPORT bool safe_strtob(StringPiece str, bool* value);
+PROTOBUF_EXPORT bool safe_strtob(absl::string_view str, bool* value);
PROTOBUF_EXPORT bool safe_strto32(const std::string& str, int32_t* value);
PROTOBUF_EXPORT bool safe_strtou32(const std::string& str, uint32_t* value);
inline bool safe_strto32(const char* str, int32_t* value) {
return safe_strto32(std::string(str), value);
}
-inline bool safe_strto32(StringPiece str, int32_t* value) {
- return safe_strto32(str.ToString(), value);
+inline bool safe_strto32(absl::string_view str, int32_t* value) {
+ return safe_strto32(std::string(str), value);
}
inline bool safe_strtou32(const char* str, uint32_t* value) {
return safe_strtou32(std::string(str), value);
}
-inline bool safe_strtou32(StringPiece str, uint32_t* value) {
- return safe_strtou32(str.ToString(), value);
+inline bool safe_strtou32(absl::string_view str, uint32_t* value) {
+ return safe_strtou32(std::string(str), value);
}
PROTOBUF_EXPORT bool safe_strto64(const std::string& str, int64_t* value);
@@ -419,14 +154,14 @@
inline bool safe_strto64(const char* str, int64_t* value) {
return safe_strto64(std::string(str), value);
}
-inline bool safe_strto64(StringPiece str, int64_t* value) {
- return safe_strto64(str.ToString(), value);
+inline bool safe_strto64(absl::string_view str, int64_t* value) {
+ return safe_strto64(std::string(str), value);
}
inline bool safe_strtou64(const char* str, uint64_t* value) {
return safe_strtou64(std::string(str), value);
}
-inline bool safe_strtou64(StringPiece str, uint64_t* value) {
- return safe_strtou64(str.ToString(), value);
+inline bool safe_strtou64(absl::string_view str, uint64_t* value) {
+ return safe_strtou64(std::string(str), value);
}
PROTOBUF_EXPORT bool safe_strtof(const char* str, float* value);
@@ -437,431 +172,46 @@
inline bool safe_strtod(const std::string& str, double* value) {
return safe_strtod(str.c_str(), value);
}
-inline bool safe_strtof(StringPiece str, float* value) {
- return safe_strtof(str.ToString(), value);
+inline bool safe_strtof(absl::string_view str, float* value) {
+ return safe_strtof(std::string(str), value);
}
-inline bool safe_strtod(StringPiece str, double* value) {
- return safe_strtod(str.ToString(), value);
+inline bool safe_strtod(absl::string_view str, double* value) {
+ return safe_strtod(std::string(str), value);
}
// ----------------------------------------------------------------------
-// FastIntToBuffer()
-// FastHexToBuffer()
-// FastHex64ToBuffer()
-// FastHex32ToBuffer()
-// FastTimeToBuffer()
-// These are intended for speed. FastIntToBuffer() assumes the
-// integer is non-negative. FastHexToBuffer() puts output in
-// hex rather than decimal. FastTimeToBuffer() puts the output
-// into RFC822 format.
-//
-// FastHex64ToBuffer() puts a 64-bit unsigned value in hex-format,
-// padded to exactly 16 bytes (plus one byte for '\0')
-//
-// FastHex32ToBuffer() puts a 32-bit unsigned value in hex-format,
-// padded to exactly 8 bytes (plus one byte for '\0')
-//
-// All functions take the output buffer as an arg.
-// They all return a pointer to the beginning of the output,
-// which may not be the beginning of the input buffer.
-// ----------------------------------------------------------------------
-
-// Suggested buffer size for FastToBuffer functions. Also works with
-// DoubleToBuffer() and FloatToBuffer().
-static const int kFastToBufferSize = 32;
-
-PROTOBUF_EXPORT char* FastInt32ToBuffer(int32_t i, char* buffer);
-PROTOBUF_EXPORT char* FastInt64ToBuffer(int64_t i, char* buffer);
-char* FastUInt32ToBuffer(uint32_t i, char* buffer); // inline below
-char* FastUInt64ToBuffer(uint64_t i, char* buffer); // inline below
-PROTOBUF_EXPORT char* FastHexToBuffer(int i, char* buffer);
-PROTOBUF_EXPORT char* FastHex64ToBuffer(uint64_t i, char* buffer);
-PROTOBUF_EXPORT char* FastHex32ToBuffer(uint32_t i, char* buffer);
-
-// at least 22 bytes long
-inline char* FastIntToBuffer(int i, char* buffer) {
- return (sizeof(i) == 4 ?
- FastInt32ToBuffer(i, buffer) : FastInt64ToBuffer(i, buffer));
-}
-inline char* FastUIntToBuffer(unsigned int i, char* buffer) {
- return (sizeof(i) == 4 ?
- FastUInt32ToBuffer(i, buffer) : FastUInt64ToBuffer(i, buffer));
-}
-inline char* FastLongToBuffer(long i, char* buffer) {
- return (sizeof(i) == 4 ?
- FastInt32ToBuffer(i, buffer) : FastInt64ToBuffer(i, buffer));
-}
-inline char* FastULongToBuffer(unsigned long i, char* buffer) {
- return (sizeof(i) == 4 ?
- FastUInt32ToBuffer(i, buffer) : FastUInt64ToBuffer(i, buffer));
-}
-
-// ----------------------------------------------------------------------
-// FastInt32ToBufferLeft()
-// FastUInt32ToBufferLeft()
-// FastInt64ToBufferLeft()
-// FastUInt64ToBufferLeft()
-//
-// Like the Fast*ToBuffer() functions above, these are intended for speed.
-// Unlike the Fast*ToBuffer() functions, however, these functions write
-// their output to the beginning of the buffer (hence the name, as the
-// output is left-aligned). The caller is responsible for ensuring that
-// the buffer has enough space to hold the output.
-//
-// Returns a pointer to the end of the string (i.e. the null character
-// terminating the string).
-// ----------------------------------------------------------------------
-
-PROTOBUF_EXPORT char* FastInt32ToBufferLeft(int32_t i, char* buffer);
-PROTOBUF_EXPORT char* FastUInt32ToBufferLeft(uint32_t i, char* buffer);
-PROTOBUF_EXPORT char* FastInt64ToBufferLeft(int64_t i, char* buffer);
-PROTOBUF_EXPORT char* FastUInt64ToBufferLeft(uint64_t i, char* buffer);
-
-// Just define these in terms of the above.
-inline char* FastUInt32ToBuffer(uint32_t i, char* buffer) {
- FastUInt32ToBufferLeft(i, buffer);
- return buffer;
-}
-inline char* FastUInt64ToBuffer(uint64_t i, char* buffer) {
- FastUInt64ToBufferLeft(i, buffer);
- return buffer;
-}
-
-inline std::string SimpleBtoa(bool value) { return value ? "true" : "false"; }
-
-// ----------------------------------------------------------------------
-// SimpleItoa()
-// Description: converts an integer to a string.
-//
-// Return value: string
-// ----------------------------------------------------------------------
-PROTOBUF_EXPORT std::string SimpleItoa(int i);
-PROTOBUF_EXPORT std::string SimpleItoa(unsigned int i);
-PROTOBUF_EXPORT std::string SimpleItoa(long i);
-PROTOBUF_EXPORT std::string SimpleItoa(unsigned long i);
-PROTOBUF_EXPORT std::string SimpleItoa(long long i);
-PROTOBUF_EXPORT std::string SimpleItoa(unsigned long long i);
-
-// ----------------------------------------------------------------------
// SimpleDtoa()
// SimpleFtoa()
-// DoubleToBuffer()
-// FloatToBuffer()
// Description: converts a double or float to a string which, if
// passed to NoLocaleStrtod(), will produce the exact same original double
// (except in case of NaN; all NaNs are considered the same value).
// We try to keep the string short but it's not guaranteed to be as
// short as possible.
//
-// DoubleToBuffer() and FloatToBuffer() write the text to the given
-// buffer and return it. The buffer must be at least
-// kDoubleToBufferSize bytes for doubles and kFloatToBufferSize
-// bytes for floats. kFastToBufferSize is also guaranteed to be large
-// enough to hold either.
-//
// Return value: string
// ----------------------------------------------------------------------
PROTOBUF_EXPORT std::string SimpleDtoa(double value);
PROTOBUF_EXPORT std::string SimpleFtoa(float value);
-PROTOBUF_EXPORT char* DoubleToBuffer(double i, char* buffer);
-PROTOBUF_EXPORT char* FloatToBuffer(float i, char* buffer);
-
-// In practice, doubles should never need more than 24 bytes and floats
-// should never need more than 14 (including null terminators), but we
-// overestimate to be safe.
-static const int kDoubleToBufferSize = 32;
-static const int kFloatToBufferSize = 24;
-
namespace strings {
-enum PadSpec {
- NO_PAD = 1,
- ZERO_PAD_2,
- ZERO_PAD_3,
- ZERO_PAD_4,
- ZERO_PAD_5,
- ZERO_PAD_6,
- ZERO_PAD_7,
- ZERO_PAD_8,
- ZERO_PAD_9,
- ZERO_PAD_10,
- ZERO_PAD_11,
- ZERO_PAD_12,
- ZERO_PAD_13,
- ZERO_PAD_14,
- ZERO_PAD_15,
- ZERO_PAD_16,
-};
-
-struct Hex {
- uint64_t value;
- enum PadSpec spec;
- template <class Int>
- explicit Hex(Int v, PadSpec s = NO_PAD)
- : spec(s) {
- // Prevent sign-extension by casting integers to
- // their unsigned counterparts.
-#ifdef LANG_CXX11
- static_assert(
- sizeof(v) == 1 || sizeof(v) == 2 || sizeof(v) == 4 || sizeof(v) == 8,
- "Unknown integer type");
-#endif
- value = sizeof(v) == 1 ? static_cast<uint8_t>(v)
- : sizeof(v) == 2 ? static_cast<uint16_t>(v)
- : sizeof(v) == 4 ? static_cast<uint32_t>(v)
- : static_cast<uint64_t>(v);
- }
-};
-
-struct PROTOBUF_EXPORT AlphaNum {
- const char *piece_data_; // move these to string_ref eventually
- size_t piece_size_; // move these to string_ref eventually
-
- char digits[kFastToBufferSize];
-
- // No bool ctor -- bools convert to an integral type.
- // A bool ctor would also convert incoming pointers (bletch).
-
- AlphaNum(int i32)
- : piece_data_(digits),
- piece_size_(FastInt32ToBufferLeft(i32, digits) - &digits[0]) {}
- AlphaNum(unsigned int u32)
- : piece_data_(digits),
- piece_size_(FastUInt32ToBufferLeft(u32, digits) - &digits[0]) {}
- AlphaNum(long long i64)
- : piece_data_(digits),
- piece_size_(FastInt64ToBufferLeft(i64, digits) - &digits[0]) {}
- AlphaNum(unsigned long long u64)
- : piece_data_(digits),
- piece_size_(FastUInt64ToBufferLeft(u64, digits) - &digits[0]) {}
-
- // Note: on some architectures, "long" is only 32 bits, not 64, but the
- // performance hit of using FastInt64ToBufferLeft to handle 32-bit values
- // is quite minor.
- AlphaNum(long i64)
- : piece_data_(digits),
- piece_size_(FastInt64ToBufferLeft(i64, digits) - &digits[0]) {}
- AlphaNum(unsigned long u64)
- : piece_data_(digits),
- piece_size_(FastUInt64ToBufferLeft(u64, digits) - &digits[0]) {}
-
- AlphaNum(float f)
- : piece_data_(digits), piece_size_(strlen(FloatToBuffer(f, digits))) {}
- AlphaNum(double f)
- : piece_data_(digits), piece_size_(strlen(DoubleToBuffer(f, digits))) {}
-
- AlphaNum(Hex hex);
-
- AlphaNum(const char* c_str)
- : piece_data_(c_str), piece_size_(strlen(c_str)) {}
- // TODO: Add a string_ref constructor, eventually
- // AlphaNum(const StringPiece &pc) : piece(pc) {}
-
- AlphaNum(const std::string& str)
- : piece_data_(str.data()), piece_size_(str.size()) {}
-
- AlphaNum(StringPiece str)
- : piece_data_(str.data()), piece_size_(str.size()) {}
-
- size_t size() const { return piece_size_; }
- const char *data() const { return piece_data_; }
-
- private:
- // Use ":" not ':'
- AlphaNum(char c); // NOLINT(runtime/explicit)
-
- // Disallow copy and assign.
- AlphaNum(const AlphaNum&);
- void operator=(const AlphaNum&);
-};
+using Hex = absl::Hex;
} // namespace strings
-using strings::AlphaNum;
-
-// ----------------------------------------------------------------------
-// StrCat()
-// This merges the given strings or numbers, with no delimiter. This
-// is designed to be the fastest possible way to construct a string out
-// of a mix of raw C strings, strings, bool values,
-// and numeric values.
-//
-// Don't use this for user-visible strings. The localization process
-// works poorly on strings built up out of fragments.
-//
-// For clarity and performance, don't use StrCat when appending to a
-// string. In particular, avoid using any of these (anti-)patterns:
-// str.append(StrCat(...)
-// str += StrCat(...)
-// str = StrCat(str, ...)
-// where the last is the worse, with the potential to change a loop
-// from a linear time operation with O(1) dynamic allocations into a
-// quadratic time operation with O(n) dynamic allocations. StrAppend
-// is a better choice than any of the above, subject to the restriction
-// of StrAppend(&str, a, b, c, ...) that none of the a, b, c, ... may
-// be a reference into str.
-// ----------------------------------------------------------------------
-
-PROTOBUF_EXPORT std::string StrCat(const AlphaNum& a, const AlphaNum& b);
-PROTOBUF_EXPORT std::string StrCat(const AlphaNum& a, const AlphaNum& b,
- const AlphaNum& c);
-PROTOBUF_EXPORT std::string StrCat(const AlphaNum& a, const AlphaNum& b,
- const AlphaNum& c, const AlphaNum& d);
-PROTOBUF_EXPORT std::string StrCat(const AlphaNum& a, const AlphaNum& b,
- const AlphaNum& c, const AlphaNum& d,
- const AlphaNum& e);
-PROTOBUF_EXPORT std::string StrCat(const AlphaNum& a, const AlphaNum& b,
- const AlphaNum& c, const AlphaNum& d,
- const AlphaNum& e, const AlphaNum& f);
-PROTOBUF_EXPORT std::string StrCat(const AlphaNum& a, const AlphaNum& b,
- const AlphaNum& c, const AlphaNum& d,
- const AlphaNum& e, const AlphaNum& f,
- const AlphaNum& g);
-PROTOBUF_EXPORT std::string StrCat(const AlphaNum& a, const AlphaNum& b,
- const AlphaNum& c, const AlphaNum& d,
- const AlphaNum& e, const AlphaNum& f,
- const AlphaNum& g, const AlphaNum& h);
-PROTOBUF_EXPORT std::string StrCat(const AlphaNum& a, const AlphaNum& b,
- const AlphaNum& c, const AlphaNum& d,
- const AlphaNum& e, const AlphaNum& f,
- const AlphaNum& g, const AlphaNum& h,
- const AlphaNum& i);
-
-inline std::string StrCat(const AlphaNum& a) {
- return std::string(a.data(), a.size());
-}
-
-// ----------------------------------------------------------------------
-// StrAppend()
-// Same as above, but adds the output to the given string.
-// WARNING: For speed, StrAppend does not try to check each of its input
-// arguments to be sure that they are not a subset of the string being
-// appended to. That is, while this will work:
-//
-// string s = "foo";
-// s += s;
-//
-// This will not (necessarily) work:
-//
-// string s = "foo";
-// StrAppend(&s, s);
-//
-// Note: while StrCat supports appending up to 9 arguments, StrAppend
-// is currently limited to 4. That's rarely an issue except when
-// automatically transforming StrCat to StrAppend, and can easily be
-// worked around as consecutive calls to StrAppend are quite efficient.
-// ----------------------------------------------------------------------
-
-PROTOBUF_EXPORT void StrAppend(std::string* dest, const AlphaNum& a);
-PROTOBUF_EXPORT void StrAppend(std::string* dest, const AlphaNum& a,
- const AlphaNum& b);
-PROTOBUF_EXPORT void StrAppend(std::string* dest, const AlphaNum& a,
- const AlphaNum& b, const AlphaNum& c);
-PROTOBUF_EXPORT void StrAppend(std::string* dest, const AlphaNum& a,
- const AlphaNum& b, const AlphaNum& c,
- const AlphaNum& d);
-
-// ----------------------------------------------------------------------
-// Join()
-// These methods concatenate a range of components into a C++ string, using
-// the C-string "delim" as a separator between components.
-// ----------------------------------------------------------------------
-template <typename Iterator>
-void Join(Iterator start, Iterator end, const char* delim,
- std::string* result) {
- for (Iterator it = start; it != end; ++it) {
- if (it != start) {
- result->append(delim);
- }
- StrAppend(result, *it);
- }
-}
-
-template <typename Range>
-std::string Join(const Range& components, const char* delim) {
- std::string result;
- Join(components.begin(), components.end(), delim, &result);
- return result;
-}
-
// ----------------------------------------------------------------------
// ToHex()
// Return a lower-case hex string representation of the given integer.
// ----------------------------------------------------------------------
PROTOBUF_EXPORT std::string ToHex(uint64_t num);
-// ----------------------------------------------------------------------
-// GlobalReplaceSubstring()
-// Replaces all instances of a substring in a string. Does nothing
-// if 'substring' is empty. Returns the number of replacements.
-//
-// NOTE: The string pieces must not overlap s.
-// ----------------------------------------------------------------------
-PROTOBUF_EXPORT int GlobalReplaceSubstring(const std::string& substring,
- const std::string& replacement,
- std::string* s);
-
-// ----------------------------------------------------------------------
-// Base64Unescape()
-// Converts "src" which is encoded in Base64 to its binary equivalent and
-// writes it to "dest". If src contains invalid characters, dest is cleared
-// and the function returns false. Returns true on success.
-// ----------------------------------------------------------------------
-PROTOBUF_EXPORT bool Base64Unescape(StringPiece src, std::string* dest);
-
-// ----------------------------------------------------------------------
-// WebSafeBase64Unescape()
-// This is a variation of Base64Unescape which uses '-' instead of '+', and
-// '_' instead of '/'. src is not null terminated, instead specify len. I
-// recommend that slen<szdest, but we honor szdest anyway.
-// RETURNS the length of dest, or -1 if src contains invalid chars.
-
-// The variation that stores into a string clears the string first, and
-// returns false (with dest empty) if src contains invalid chars; for
-// this version src and dest must be different strings.
-// ----------------------------------------------------------------------
-PROTOBUF_EXPORT int WebSafeBase64Unescape(const char* src, int slen, char* dest,
- int szdest);
-PROTOBUF_EXPORT bool WebSafeBase64Unescape(StringPiece src, std::string* dest);
-
-// Return the length to use for the output buffer given to the base64 escape
-// routines. Make sure to use the same value for do_padding in both.
-// This function may return incorrect results if given input_len values that
-// are extremely high, which should happen rarely.
-PROTOBUF_EXPORT int CalculateBase64EscapedLen(int input_len, bool do_padding);
-// Use this version when calling Base64Escape without a do_padding arg.
-PROTOBUF_EXPORT int CalculateBase64EscapedLen(int input_len);
-
-// ----------------------------------------------------------------------
-// Base64Escape()
-// WebSafeBase64Escape()
-// Encode "src" to "dest" using base64 encoding.
-// src is not null terminated, instead specify len.
-// 'dest' should have at least CalculateBase64EscapedLen() length.
-// RETURNS the length of dest.
-// The WebSafe variation use '-' instead of '+' and '_' instead of '/'
-// so that we can place the out in the URL or cookies without having
-// to escape them. It also has an extra parameter "do_padding",
-// which when set to false will prevent padding with "=".
-// ----------------------------------------------------------------------
-PROTOBUF_EXPORT int Base64Escape(const unsigned char* src, int slen, char* dest,
- int szdest);
-PROTOBUF_EXPORT int WebSafeBase64Escape(const unsigned char* src, int slen,
- char* dest, int szdest,
- bool do_padding);
-// Encode src into dest with padding.
-PROTOBUF_EXPORT void Base64Escape(StringPiece src, std::string* dest);
-// Encode src into dest web-safely without padding.
-PROTOBUF_EXPORT void WebSafeBase64Escape(StringPiece src, std::string* dest);
+namespace strings {
// Encode src into dest web-safely with padding.
-PROTOBUF_EXPORT void WebSafeBase64EscapeWithPadding(StringPiece src,
+PROTOBUF_EXPORT void WebSafeBase64EscapeWithPadding(absl::string_view src,
std::string* dest);
-
-PROTOBUF_EXPORT void Base64Escape(const unsigned char* src, int szsrc,
- std::string* dest, bool do_padding);
-PROTOBUF_EXPORT void WebSafeBase64Escape(const unsigned char* src, int szsrc,
- std::string* dest, bool do_padding);
+PROTOBUF_EXPORT void LegacyBase64EscapeWithoutPadding(absl::string_view src,
+ std::string* dest);
+} // namespace strings
inline bool IsValidCodePoint(uint32_t code_point) {
return code_point < 0xD800 ||
@@ -883,57 +233,6 @@
// ----------------------------------------------------------------------
PROTOBUF_EXPORT int UTF8FirstLetterNumBytes(const char* src, int len);
-// From google3/third_party/absl/strings/escaping.h
-
-// ----------------------------------------------------------------------
-// CleanStringLineEndings()
-// Clean up a multi-line string to conform to Unix line endings.
-// Reads from src and appends to dst, so usually dst should be empty.
-//
-// If there is no line ending at the end of a non-empty string, it can
-// be added automatically.
-//
-// Four different types of input are correctly handled:
-//
-// - Unix/Linux files: line ending is LF: pass through unchanged
-//
-// - DOS/Windows files: line ending is CRLF: convert to LF
-//
-// - Legacy Mac files: line ending is CR: convert to LF
-//
-// - Garbled files: random line endings: convert gracefully
-// lonely CR, lonely LF, CRLF: convert to LF
-//
-// @param src The multi-line string to convert
-// @param dst The converted string is appended to this string
-// @param auto_end_last_line Automatically terminate the last line
-//
-// Limitations:
-//
-// This does not do the right thing for CRCRLF files created by
-// broken programs that do another Unix->DOS conversion on files
-// that are already in CRLF format. For this, a two-pass approach
-// brute-force would be needed that
-//
-// (1) determines the presence of LF (first one is ok)
-// (2) if yes, removes any CR, else convert every CR to LF
-PROTOBUF_EXPORT void CleanStringLineEndings(const std::string& src,
- std::string* dst,
- bool auto_end_last_line);
-
-// Same as above, but transforms the argument in place.
-PROTOBUF_EXPORT void CleanStringLineEndings(std::string* str,
- bool auto_end_last_line);
-
-namespace strings {
-inline bool EndsWith(StringPiece text, StringPiece suffix) {
- return suffix.empty() ||
- (text.size() >= suffix.size() &&
- memcmp(text.data() + (text.size() - suffix.size()), suffix.data(),
- suffix.size()) == 0);
-}
-} // namespace strings
-
namespace internal {
// A locale-independent version of the standard strtod(), which always
@@ -945,6 +244,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_STUBS_STRUTIL_H__
diff --git a/src/google/protobuf/stubs/strutil_unittest.cc b/src/google/protobuf/stubs/strutil_unittest.cc
index 0bb9558..71e60e6 100644
--- a/src/google/protobuf/stubs/strutil_unittest.cc
+++ b/src/google/protobuf/stubs/strutil_unittest.cc
@@ -30,13 +30,13 @@
// Author: kenton@google.com (Kenton Varda)
-#include <google/protobuf/stubs/strutil.h>
+#include "google/protobuf/stubs/strutil.h"
+#include <gtest/gtest.h>
#include <locale.h>
-#include <google/protobuf/stubs/stl_util.h>
-#include <google/protobuf/testing/googletest.h>
-#include <gtest/gtest.h>
+#include "google/protobuf/stubs/stl_util.h"
+#include "google/protobuf/testing/googletest.h"
#ifdef _WIN32
#define snprintf _snprintf
@@ -74,811 +74,6 @@
setlocale(LC_NUMERIC, old_locale.c_str());
}
-#define EXPECT_EQ_ARRAY(len, x, y, msg) \
- for (int j = 0; j < len; ++j) { \
- EXPECT_EQ(x[j], y[j]) << "" # x << " != " # y \
- << " byte " << j << ": " << msg; \
- }
-
-static struct {
- int plain_length;
- const char* plaintext;
- const char* ciphertext;
-} base64_tests[] = {
- // Empty string.
- { 0, "", ""},
-
- // Basic bit patterns;
- // values obtained with "echo -n '...' | uuencode -m test"
-
- { 1, "\000", "AA==" },
- { 1, "\001", "AQ==" },
- { 1, "\002", "Ag==" },
- { 1, "\004", "BA==" },
- { 1, "\010", "CA==" },
- { 1, "\020", "EA==" },
- { 1, "\040", "IA==" },
- { 1, "\100", "QA==" },
- { 1, "\200", "gA==" },
-
- { 1, "\377", "/w==" },
- { 1, "\376", "/g==" },
- { 1, "\375", "/Q==" },
- { 1, "\373", "+w==" },
- { 1, "\367", "9w==" },
- { 1, "\357", "7w==" },
- { 1, "\337", "3w==" },
- { 1, "\277", "vw==" },
- { 1, "\177", "fw==" },
- { 2, "\000\000", "AAA=" },
- { 2, "\000\001", "AAE=" },
- { 2, "\000\002", "AAI=" },
- { 2, "\000\004", "AAQ=" },
- { 2, "\000\010", "AAg=" },
- { 2, "\000\020", "ABA=" },
- { 2, "\000\040", "ACA=" },
- { 2, "\000\100", "AEA=" },
- { 2, "\000\200", "AIA=" },
- { 2, "\001\000", "AQA=" },
- { 2, "\002\000", "AgA=" },
- { 2, "\004\000", "BAA=" },
- { 2, "\010\000", "CAA=" },
- { 2, "\020\000", "EAA=" },
- { 2, "\040\000", "IAA=" },
- { 2, "\100\000", "QAA=" },
- { 2, "\200\000", "gAA=" },
-
- { 2, "\377\377", "//8=" },
- { 2, "\377\376", "//4=" },
- { 2, "\377\375", "//0=" },
- { 2, "\377\373", "//s=" },
- { 2, "\377\367", "//c=" },
- { 2, "\377\357", "/+8=" },
- { 2, "\377\337", "/98=" },
- { 2, "\377\277", "/78=" },
- { 2, "\377\177", "/38=" },
- { 2, "\376\377", "/v8=" },
- { 2, "\375\377", "/f8=" },
- { 2, "\373\377", "+/8=" },
- { 2, "\367\377", "9/8=" },
- { 2, "\357\377", "7/8=" },
- { 2, "\337\377", "3/8=" },
- { 2, "\277\377", "v/8=" },
- { 2, "\177\377", "f/8=" },
-
- { 3, "\000\000\000", "AAAA" },
- { 3, "\000\000\001", "AAAB" },
- { 3, "\000\000\002", "AAAC" },
- { 3, "\000\000\004", "AAAE" },
- { 3, "\000\000\010", "AAAI" },
- { 3, "\000\000\020", "AAAQ" },
- { 3, "\000\000\040", "AAAg" },
- { 3, "\000\000\100", "AABA" },
- { 3, "\000\000\200", "AACA" },
- { 3, "\000\001\000", "AAEA" },
- { 3, "\000\002\000", "AAIA" },
- { 3, "\000\004\000", "AAQA" },
- { 3, "\000\010\000", "AAgA" },
- { 3, "\000\020\000", "ABAA" },
- { 3, "\000\040\000", "ACAA" },
- { 3, "\000\100\000", "AEAA" },
- { 3, "\000\200\000", "AIAA" },
- { 3, "\001\000\000", "AQAA" },
- { 3, "\002\000\000", "AgAA" },
- { 3, "\004\000\000", "BAAA" },
- { 3, "\010\000\000", "CAAA" },
- { 3, "\020\000\000", "EAAA" },
- { 3, "\040\000\000", "IAAA" },
- { 3, "\100\000\000", "QAAA" },
- { 3, "\200\000\000", "gAAA" },
-
- { 3, "\377\377\377", "////" },
- { 3, "\377\377\376", "///+" },
- { 3, "\377\377\375", "///9" },
- { 3, "\377\377\373", "///7" },
- { 3, "\377\377\367", "///3" },
- { 3, "\377\377\357", "///v" },
- { 3, "\377\377\337", "///f" },
- { 3, "\377\377\277", "//+/" },
- { 3, "\377\377\177", "//9/" },
- { 3, "\377\376\377", "//7/" },
- { 3, "\377\375\377", "//3/" },
- { 3, "\377\373\377", "//v/" },
- { 3, "\377\367\377", "//f/" },
- { 3, "\377\357\377", "/+//" },
- { 3, "\377\337\377", "/9//" },
- { 3, "\377\277\377", "/7//" },
- { 3, "\377\177\377", "/3//" },
- { 3, "\376\377\377", "/v//" },
- { 3, "\375\377\377", "/f//" },
- { 3, "\373\377\377", "+///" },
- { 3, "\367\377\377", "9///" },
- { 3, "\357\377\377", "7///" },
- { 3, "\337\377\377", "3///" },
- { 3, "\277\377\377", "v///" },
- { 3, "\177\377\377", "f///" },
-
- // Random numbers: values obtained with
- //
- // #! /bin/bash
- // dd bs=$1 count=1 if=/dev/random of=/tmp/bar.random
- // od -N $1 -t o1 /tmp/bar.random
- // uuencode -m test < /tmp/bar.random
- //
- // where $1 is the number of bytes (2, 3)
-
- { 2, "\243\361", "o/E=" },
- { 2, "\024\167", "FHc=" },
- { 2, "\313\252", "y6o=" },
- { 2, "\046\041", "JiE=" },
- { 2, "\145\236", "ZZ4=" },
- { 2, "\254\325", "rNU=" },
- { 2, "\061\330", "Mdg=" },
- { 2, "\245\032", "pRo=" },
- { 2, "\006\000", "BgA=" },
- { 2, "\375\131", "/Vk=" },
- { 2, "\303\210", "w4g=" },
- { 2, "\040\037", "IB8=" },
- { 2, "\261\372", "sfo=" },
- { 2, "\335\014", "3Qw=" },
- { 2, "\233\217", "m48=" },
- { 2, "\373\056", "+y4=" },
- { 2, "\247\232", "p5o=" },
- { 2, "\107\053", "Rys=" },
- { 2, "\204\077", "hD8=" },
- { 2, "\276\211", "vok=" },
- { 2, "\313\110", "y0g=" },
- { 2, "\363\376", "8/4=" },
- { 2, "\251\234", "qZw=" },
- { 2, "\103\262", "Q7I=" },
- { 2, "\142\312", "Yso=" },
- { 2, "\067\211", "N4k=" },
- { 2, "\220\001", "kAE=" },
- { 2, "\152\240", "aqA=" },
- { 2, "\367\061", "9zE=" },
- { 2, "\133\255", "W60=" },
- { 2, "\176\035", "fh0=" },
- { 2, "\032\231", "Gpk=" },
-
- { 3, "\013\007\144", "Cwdk" },
- { 3, "\030\112\106", "GEpG" },
- { 3, "\047\325\046", "J9Um" },
- { 3, "\310\160\022", "yHAS" },
- { 3, "\131\100\237", "WUCf" },
- { 3, "\064\342\134", "NOJc" },
- { 3, "\010\177\004", "CH8E" },
- { 3, "\345\147\205", "5WeF" },
- { 3, "\300\343\360", "wOPw" },
- { 3, "\061\240\201", "MaCB" },
- { 3, "\225\333\044", "ldsk" },
- { 3, "\215\137\352", "jV/q" },
- { 3, "\371\147\160", "+Wdw" },
- { 3, "\030\320\051", "GNAp" },
- { 3, "\044\174\241", "JHyh" },
- { 3, "\260\127\037", "sFcf" },
- { 3, "\111\045\033", "SSUb" },
- { 3, "\202\114\107", "gkxH" },
- { 3, "\057\371\042", "L/ki" },
- { 3, "\223\247\244", "k6ek" },
- { 3, "\047\216\144", "J45k" },
- { 3, "\203\070\327", "gzjX" },
- { 3, "\247\140\072", "p2A6" },
- { 3, "\124\115\116", "VE1O" },
- { 3, "\157\162\050", "b3Io" },
- { 3, "\357\223\004", "75ME" },
- { 3, "\052\117\156", "Kk9u" },
- { 3, "\347\154\000", "52wA" },
- { 3, "\303\012\142", "wwpi" },
- { 3, "\060\035\362", "MB3y" },
- { 3, "\130\226\361", "WJbx" },
- { 3, "\173\013\071", "ews5" },
- { 3, "\336\004\027", "3gQX" },
- { 3, "\357\366\234", "7/ac" },
- { 3, "\353\304\111", "68RJ" },
- { 3, "\024\264\131", "FLRZ" },
- { 3, "\075\114\251", "PUyp" },
- { 3, "\315\031\225", "zRmV" },
- { 3, "\154\201\276", "bIG+" },
- { 3, "\200\066\072", "gDY6" },
- { 3, "\142\350\267", "Yui3" },
- { 3, "\033\000\166", "GwB2" },
- { 3, "\210\055\077", "iC0/" },
- { 3, "\341\037\124", "4R9U" },
- { 3, "\161\103\152", "cUNq" },
- { 3, "\270\142\131", "uGJZ" },
- { 3, "\337\076\074", "3z48" },
- { 3, "\375\106\362", "/Uby" },
- { 3, "\227\301\127", "l8FX" },
- { 3, "\340\002\234", "4AKc" },
- { 3, "\121\064\033", "UTQb" },
- { 3, "\157\134\143", "b1xj" },
- { 3, "\247\055\327", "py3X" },
- { 3, "\340\142\005", "4GIF" },
- { 3, "\060\260\143", "MLBj" },
- { 3, "\075\203\170", "PYN4" },
- { 3, "\143\160\016", "Y3AO" },
- { 3, "\313\013\063", "ywsz" },
- { 3, "\174\236\135", "fJ5d" },
- { 3, "\103\047\026", "QycW" },
- { 3, "\365\005\343", "9QXj" },
- { 3, "\271\160\223", "uXCT" },
- { 3, "\362\255\172", "8q16" },
- { 3, "\113\012\015", "SwoN" },
-
- // various lengths, generated by this python script:
- //
- // from string import lowercase as lc
- // for i in range(27):
- // print '{ %2d, "%s",%s "%s" },' % (i, lc[:i], ' ' * (26-i),
- // lc[:i].encode('base64').strip())
-
- { 0, "", "" },
- { 1, "a", "YQ==" },
- { 2, "ab", "YWI=" },
- { 3, "abc", "YWJj" },
- { 4, "abcd", "YWJjZA==" },
- { 5, "abcde", "YWJjZGU=" },
- { 6, "abcdef", "YWJjZGVm" },
- { 7, "abcdefg", "YWJjZGVmZw==" },
- { 8, "abcdefgh", "YWJjZGVmZ2g=" },
- { 9, "abcdefghi", "YWJjZGVmZ2hp" },
- { 10, "abcdefghij", "YWJjZGVmZ2hpag==" },
- { 11, "abcdefghijk", "YWJjZGVmZ2hpams=" },
- { 12, "abcdefghijkl", "YWJjZGVmZ2hpamts" },
- { 13, "abcdefghijklm", "YWJjZGVmZ2hpamtsbQ==" },
- { 14, "abcdefghijklmn", "YWJjZGVmZ2hpamtsbW4=" },
- { 15, "abcdefghijklmno", "YWJjZGVmZ2hpamtsbW5v" },
- { 16, "abcdefghijklmnop", "YWJjZGVmZ2hpamtsbW5vcA==" },
- { 17, "abcdefghijklmnopq", "YWJjZGVmZ2hpamtsbW5vcHE=" },
- { 18, "abcdefghijklmnopqr", "YWJjZGVmZ2hpamtsbW5vcHFy" },
- { 19, "abcdefghijklmnopqrs", "YWJjZGVmZ2hpamtsbW5vcHFycw==" },
- { 20, "abcdefghijklmnopqrst", "YWJjZGVmZ2hpamtsbW5vcHFyc3Q=" },
- { 21, "abcdefghijklmnopqrstu", "YWJjZGVmZ2hpamtsbW5vcHFyc3R1" },
- { 22, "abcdefghijklmnopqrstuv", "YWJjZGVmZ2hpamtsbW5vcHFyc3R1dg==" },
- { 23, "abcdefghijklmnopqrstuvw", "YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnc=" },
- { 24, "abcdefghijklmnopqrstuvwx", "YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4" },
- { 25, "abcdefghijklmnopqrstuvwxy", "YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eQ==" },
- { 26, "abcdefghijklmnopqrstuvwxyz", "YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXo=" },
-};
-
-static struct {
- const char* plaintext;
- const char* ciphertext;
-} base64_strings[] = {
- // Some google quotes
- // Ciphertext created with "uuencode (GNU sharutils) 4.6.3"
- // (Note that we're testing the websafe encoding, though, so if
- // you add messages, be sure to run "tr -- '+/' '-_'" on the output)
- {"I was always good at math and science, and I never realized "
- "that was unusual or somehow undesirable. So one of the things "
- "I care a lot about is helping to remove that stigma, "
- "to show girls that you can be feminine, you can like the things "
- "that girls like, but you can also be really good at technology. "
- "You can be really good at building things."
- " - Marissa Meyer, Newsweek, 2010-12-22"
- "\n",
-
- "SSB3YXMgYWx3YXlzIGdvb2QgYXQgbWF0aCBhbmQgc2NpZW5jZSwgYW5kIEkg"
- "bmV2ZXIgcmVhbGl6ZWQgdGhhdCB3YXMgdW51c3VhbCBvciBzb21laG93IHVu"
- "ZGVzaXJhYmxlLiBTbyBvbmUgb2YgdGhlIHRoaW5ncyBJIGNhcmUgYSBsb3Qg"
- "YWJvdXQgaXMgaGVscGluZyB0byByZW1vdmUgdGhhdCBzdGlnbWEsIHRvIHNo"
- "b3cgZ2lybHMgdGhhdCB5b3UgY2FuIGJlIGZlbWluaW5lLCB5b3UgY2FuIGxp"
- "a2UgdGhlIHRoaW5ncyB0aGF0IGdpcmxzIGxpa2UsIGJ1dCB5b3UgY2FuIGFs"
- "c28gYmUgcmVhbGx5IGdvb2QgYXQgdGVjaG5vbG9neS4gWW91IGNhbiBiZSBy"
- "ZWFsbHkgZ29vZCBhdCBidWlsZGluZyB0aGluZ3MuIC0gTWFyaXNzYSBNZXll"
- "ciwgTmV3c3dlZWssIDIwMTAtMTItMjIK"},
-
- {"Typical first year for a new cluster: "
- "~0.5 overheating "
- "~1 PDU failure "
- "~1 rack-move "
- "~1 network rewiring "
- "~20 rack failures "
- "~5 racks go wonky "
- "~8 network maintenances "
- "~12 router reloads "
- "~3 router failures "
- "~dozens of minor 30-second blips for dns "
- "~1000 individual machine failures "
- "~thousands of hard drive failures "
- "slow disks, bad memory, misconfigured machines, flaky machines, etc."
- " - Jeff Dean, The Joys of Real Hardware"
- "\n",
-
- "VHlwaWNhbCBmaXJzdCB5ZWFyIGZvciBhIG5ldyBjbHVzdGVyOiB-MC41IG92"
- "ZXJoZWF0aW5nIH4xIFBEVSBmYWlsdXJlIH4xIHJhY2stbW92ZSB-MSBuZXR3"
- "b3JrIHJld2lyaW5nIH4yMCByYWNrIGZhaWx1cmVzIH41IHJhY2tzIGdvIHdv"
- "bmt5IH44IG5ldHdvcmsgbWFpbnRlbmFuY2VzIH4xMiByb3V0ZXIgcmVsb2Fk"
- "cyB-MyByb3V0ZXIgZmFpbHVyZXMgfmRvemVucyBvZiBtaW5vciAzMC1zZWNv"
- "bmQgYmxpcHMgZm9yIGRucyB-MTAwMCBpbmRpdmlkdWFsIG1hY2hpbmUgZmFp"
- "bHVyZXMgfnRob3VzYW5kcyBvZiBoYXJkIGRyaXZlIGZhaWx1cmVzIHNsb3cg"
- "ZGlza3MsIGJhZCBtZW1vcnksIG1pc2NvbmZpZ3VyZWQgbWFjaGluZXMsIGZs"
- "YWt5IG1hY2hpbmVzLCBldGMuIC0gSmVmZiBEZWFuLCBUaGUgSm95cyBvZiBS"
- "ZWFsIEhhcmR3YXJlCg"},
-
- {"I'm the head of the webspam team at Google. "
- "That means that if you type your name into Google and get porn back, "
- "it's my fault. Unless you're a porn star, in which case porn is a "
- "completely reasonable response."
- " - Matt Cutts, Google Plus"
- "\n",
-
- "SSdtIHRoZSBoZWFkIG9mIHRoZSB3ZWJzcGFtIHRlYW0gYXQgR29vZ2xlLiAg"
- "VGhhdCBtZWFucyB0aGF0IGlmIHlvdSB0eXBlIHlvdXIgbmFtZSBpbnRvIEdv"
- "b2dsZSBhbmQgZ2V0IHBvcm4gYmFjaywgaXQncyBteSBmYXVsdC4gVW5sZXNz"
- "IHlvdSdyZSBhIHBvcm4gc3RhciwgaW4gd2hpY2ggY2FzZSBwb3JuIGlzIGEg"
- "Y29tcGxldGVseSByZWFzb25hYmxlIHJlc3BvbnNlLiAtIE1hdHQgQ3V0dHMs"
- "IEdvb2dsZSBQbHVzCg"},
-
- {"It will still be a long time before machines approach human "
- "intelligence. "
- "But luckily, machines don't actually have to be intelligent; "
- "they just have to fake it. Access to a wealth of information, "
- "combined with a rudimentary decision-making capacity, "
- "can often be almost as useful. Of course, the results are better yet "
- "when coupled with intelligence. A reference librarian with access to "
- "a good search engine is a formidable tool."
- " - Craig Silverstein, Siemens Pictures of the Future, Spring 2004"
- "\n",
-
- "SXQgd2lsbCBzdGlsbCBiZSBhIGxvbmcgdGltZSBiZWZvcmUgbWFjaGluZXMg"
- "YXBwcm9hY2ggaHVtYW4gaW50ZWxsaWdlbmNlLiBCdXQgbHVja2lseSwgbWFj"
- "aGluZXMgZG9uJ3QgYWN0dWFsbHkgaGF2ZSB0byBiZSBpbnRlbGxpZ2VudDsg"
- "dGhleSBqdXN0IGhhdmUgdG8gZmFrZSBpdC4gQWNjZXNzIHRvIGEgd2VhbHRo"
- "IG9mIGluZm9ybWF0aW9uLCBjb21iaW5lZCB3aXRoIGEgcnVkaW1lbnRhcnkg"
- "ZGVjaXNpb24tbWFraW5nIGNhcGFjaXR5LCBjYW4gb2Z0ZW4gYmUgYWxtb3N0"
- "IGFzIHVzZWZ1bC4gT2YgY291cnNlLCB0aGUgcmVzdWx0cyBhcmUgYmV0dGVy"
- "IHlldCB3aGVuIGNvdXBsZWQgd2l0aCBpbnRlbGxpZ2VuY2UuIEEgcmVmZXJl"
- "bmNlIGxpYnJhcmlhbiB3aXRoIGFjY2VzcyB0byBhIGdvb2Qgc2VhcmNoIGVu"
- "Z2luZSBpcyBhIGZvcm1pZGFibGUgdG9vbC4gLSBDcmFpZyBTaWx2ZXJzdGVp"
- "biwgU2llbWVucyBQaWN0dXJlcyBvZiB0aGUgRnV0dXJlLCBTcHJpbmcgMjAw"
- "NAo"},
-
- // Degenerate edge case
- {"", ""},
-};
-
-TEST(Base64, EscapeAndUnescape) {
- // Check the short strings; this tests the math (and boundaries)
- for (int i = 0; i < sizeof(base64_tests) / sizeof(base64_tests[0]); ++i) {
- char encode_buffer[100];
- int encode_length;
- char decode_buffer[100];
- int decode_length;
- int cipher_length;
- std::string decode_str;
-
- const unsigned char* unsigned_plaintext =
- reinterpret_cast<const unsigned char*>(base64_tests[i].plaintext);
-
- StringPiece plaintext(base64_tests[i].plaintext,
- base64_tests[i].plain_length);
-
- cipher_length = strlen(base64_tests[i].ciphertext);
-
- // The basic escape function:
- memset(encode_buffer, 0, sizeof(encode_buffer));
- encode_length = Base64Escape(unsigned_plaintext,
- base64_tests[i].plain_length,
- encode_buffer,
- sizeof(encode_buffer));
- // Is it of the expected length?
- EXPECT_EQ(encode_length, cipher_length);
- // Would it have been okay to allocate only CalculateBase64EscapeLen()?
- EXPECT_EQ(CalculateBase64EscapedLen(base64_tests[i].plain_length),
- encode_length);
-
- // Is it the expected encoded value?
- ASSERT_STREQ(encode_buffer, base64_tests[i].ciphertext);
-
- // If we encode it into a buffer of exactly the right length...
- memset(encode_buffer, 0, sizeof(encode_buffer));
- encode_length =
- Base64Escape(unsigned_plaintext, base64_tests[i].plain_length,
- encode_buffer, cipher_length);
- // Is it still of the expected length?
- EXPECT_EQ(encode_length, cipher_length);
-
- // And is the value still correct? (i.e., not losing the last byte)
- EXPECT_STREQ(encode_buffer, base64_tests[i].ciphertext);
-
- // If we decode it back:
- decode_str.clear();
- EXPECT_TRUE(
- Base64Unescape(StringPiece(encode_buffer, cipher_length), &decode_str));
-
- // Is it of the expected length?
- EXPECT_EQ(base64_tests[i].plain_length, decode_str.length());
-
- // Is it the expected decoded value?
- EXPECT_EQ(plaintext, decode_str);
-
- // Let's try with a pre-populated string.
- std::string encoded("this junk should be ignored");
- Base64Escape(
- std::string(base64_tests[i].plaintext, base64_tests[i].plain_length),
- &encoded);
- EXPECT_EQ(encoded, std::string(encode_buffer, cipher_length));
-
- std::string decoded("this junk should be ignored");
- EXPECT_TRUE(
- Base64Unescape(StringPiece(encode_buffer, cipher_length), &decoded));
- EXPECT_EQ(decoded.size(), base64_tests[i].plain_length);
- EXPECT_EQ_ARRAY(decoded.size(), decoded, base64_tests[i].plaintext, i);
-
- // Our decoder treats the padding '=' characters at the end as
- // optional (but if there are any, there must be the correct
- // number of them.) If encode_buffer has any, run some additional
- // tests that fiddle with them.
- char* first_equals = strchr(encode_buffer, '=');
- if (first_equals) {
- // How many equals signs does the string start with?
- int equals = (*(first_equals+1) == '=') ? 2 : 1;
-
- // Try chopping off the equals sign(s) entirely. The decoder
- // should still be okay with this.
- std::string decoded2("this junk should also be ignored");
- *first_equals = '\0';
- EXPECT_TRUE(Base64Unescape(
- StringPiece(encode_buffer, first_equals - encode_buffer), &decoded2));
- EXPECT_EQ(decoded.size(), base64_tests[i].plain_length);
- EXPECT_EQ_ARRAY(decoded.size(), decoded, base64_tests[i].plaintext, i);
-
- // Now test chopping off the equals sign(s) and adding
- // whitespace. Our decoder should still accept this.
- decoded2.assign("this junk should be ignored");
- *first_equals = ' ';
- *(first_equals+1) = '\0';
- EXPECT_TRUE(Base64Unescape(
- StringPiece(encode_buffer, first_equals - encode_buffer + 1),
- &decoded2));
- EXPECT_EQ(decoded.size(), base64_tests[i].plain_length);
- EXPECT_EQ_ARRAY(decoded.size(), decoded, base64_tests[i].plaintext, i);
-
- // Now stick a bad character at the end of the string. The decoder
- // should refuse this string.
- decoded2.assign("this junk should be ignored");
- *first_equals = '?';
- *(first_equals+1) = '\0';
- EXPECT_TRUE(
- !Base64Unescape(
- StringPiece(encode_buffer, first_equals - encode_buffer + 1),
- &decoded2));
-
- int len;
-
- // Test whitespace mixed with the padding. (eg "AA = = ") The
- // decoder should accept this.
- if (equals == 2) {
- snprintf(first_equals, 6, " = = ");
- len = first_equals - encode_buffer + 5;
- } else {
- snprintf(first_equals, 6, " = ");
- len = first_equals - encode_buffer + 3;
- }
- decoded2.assign("this junk should be ignored");
- EXPECT_TRUE(
- Base64Unescape(StringPiece(encode_buffer, len), &decoded2));
- EXPECT_EQ(decoded.size(), base64_tests[i].plain_length);
- EXPECT_EQ_ARRAY(decoded.size(), decoded, base64_tests[i].plaintext, i);
-
- // Test whitespace mixed with the padding, but with the wrong
- // number of equals signs (eg "AA = "). The decoder should
- // refuse these strings.
- if (equals == 1) {
- snprintf(first_equals, 6, " = = ");
- len = first_equals - encode_buffer + 5;
- } else {
- snprintf(first_equals, 6, " = ");
- len = first_equals - encode_buffer + 3;
- }
- EXPECT_TRUE(
- !Base64Unescape(StringPiece(encode_buffer, len), &decoded2));
- }
-
- // Cool! the basic Base64 encoder/decoder works.
- // Let's try the alternate alphabet: tr -- '+/' '-_'
-
- char websafe[100];
- memset(websafe, 0, sizeof(websafe));
- strncpy(websafe, base64_tests[i].ciphertext, cipher_length);
- for (int c = 0; c < sizeof(websafe); ++c) {
- if ('+' == websafe[c]) { websafe[c] = '-'; }
- if ('/' == websafe[c]) { websafe[c] = '_'; }
- }
-
- // The websafe escape function:
- memset(encode_buffer, 0, sizeof(encode_buffer));
- encode_length = WebSafeBase64Escape(unsigned_plaintext,
- base64_tests[i].plain_length,
- encode_buffer,
- sizeof(encode_buffer),
- true);
- // Is it of the expected length?
- EXPECT_EQ(encode_length, cipher_length);
- EXPECT_EQ(
- CalculateBase64EscapedLen(base64_tests[i].plain_length, true),
- encode_length);
-
- // Is it the expected encoded value?
- EXPECT_STREQ(encode_buffer, websafe);
-
- // If we encode it into a buffer of exactly the right length...
- memset(encode_buffer, 0, sizeof(encode_buffer));
- encode_length =
- WebSafeBase64Escape(unsigned_plaintext, base64_tests[i].plain_length,
- encode_buffer, cipher_length, true);
- // Is it still of the expected length?
- EXPECT_EQ(encode_length, cipher_length);
-
- // And is the value still correct? (i.e., not losing the last byte)
- EXPECT_STREQ(encode_buffer, websafe);
-
- // Let's try the string version of the encoder
- encoded = "this junk should be ignored";
- WebSafeBase64Escape(
- unsigned_plaintext, base64_tests[i].plain_length,
- &encoded, true);
- EXPECT_EQ(encoded.size(), cipher_length);
- EXPECT_STREQ(encoded.c_str(), websafe);
-
- // If we decode it back:
- memset(decode_buffer, 0, sizeof(decode_buffer));
- decode_length = WebSafeBase64Unescape(encode_buffer, cipher_length,
- decode_buffer, sizeof(decode_buffer));
-
- // Is it of the expected length?
- EXPECT_EQ(decode_length, base64_tests[i].plain_length);
-
- // Is it the expected decoded value?
- EXPECT_EQ(0,
- memcmp(decode_buffer, base64_tests[i].plaintext, decode_length));
-
- // If we decode it into a buffer of exactly the right length...
- memset(decode_buffer, 0, sizeof(decode_buffer));
- decode_length = WebSafeBase64Unescape(encode_buffer, cipher_length,
- decode_buffer, decode_length);
-
- // Is it still of the expected length?
- EXPECT_EQ(decode_length, base64_tests[i].plain_length);
-
- // And is it the expected decoded value?
- EXPECT_EQ(0,
- memcmp(decode_buffer, base64_tests[i].plaintext, decode_length));
-
- // Try using '.' for the pad character.
- for (int c = cipher_length - 1; c >= 0 && '=' == encode_buffer[c]; --c) {
- encode_buffer[c] = '.';
- }
-
- // If we decode it back:
- memset(decode_buffer, 0, sizeof(decode_buffer));
- decode_length = WebSafeBase64Unescape(encode_buffer, cipher_length,
- decode_buffer, sizeof(decode_buffer));
-
- // Is it of the expected length?
- EXPECT_EQ(decode_length, base64_tests[i].plain_length);
-
- // Is it the expected decoded value?
- EXPECT_EQ(0,
- memcmp(decode_buffer, base64_tests[i].plaintext, decode_length));
-
- // If we decode it into a buffer of exactly the right length...
- memset(decode_buffer, 0, sizeof(decode_buffer));
- decode_length = WebSafeBase64Unescape(encode_buffer, cipher_length,
- decode_buffer, decode_length);
-
- // Is it still of the expected length?
- EXPECT_EQ(decode_length, base64_tests[i].plain_length);
-
- // And is it the expected decoded value?
- EXPECT_EQ(0,
- memcmp(decode_buffer, base64_tests[i].plaintext, decode_length));
-
- // Let's try the string version of the decoder
- decoded = "this junk should be ignored";
- EXPECT_TRUE(WebSafeBase64Unescape(StringPiece(encode_buffer, cipher_length),
- &decoded));
- EXPECT_EQ(decoded.size(), base64_tests[i].plain_length);
- EXPECT_EQ_ARRAY(decoded.size(), decoded, base64_tests[i].plaintext, i);
-
- // Okay! the websafe Base64 encoder/decoder works.
- // Let's try the unpadded version
-
- for (int c = 0; c < sizeof(websafe); ++c) {
- if ('=' == websafe[c]) {
- websafe[c] = '\0';
- cipher_length = c;
- break;
- }
- }
-
- // The websafe escape function:
- memset(encode_buffer, 0, sizeof(encode_buffer));
- encode_length = WebSafeBase64Escape(unsigned_plaintext,
- base64_tests[i].plain_length,
- encode_buffer,
- sizeof(encode_buffer),
- false);
- // Is it of the expected length?
- EXPECT_EQ(encode_length, cipher_length);
- EXPECT_EQ(
- CalculateBase64EscapedLen(base64_tests[i].plain_length, false),
- encode_length);
-
- // Is it the expected encoded value?
- EXPECT_STREQ(encode_buffer, websafe);
-
- // If we encode it into a buffer of exactly the right length...
- memset(encode_buffer, 0, sizeof(encode_buffer));
- encode_length =
- WebSafeBase64Escape(unsigned_plaintext, base64_tests[i].plain_length,
- encode_buffer, cipher_length, false);
- // Is it still of the expected length?
- EXPECT_EQ(encode_length, cipher_length);
-
- // And is the value still correct? (i.e., not losing the last byte)
- EXPECT_STREQ(encode_buffer, websafe);
-
- // Let's try the (other) string version of the encoder
- std::string plain(base64_tests[i].plaintext, base64_tests[i].plain_length);
- encoded = "this junk should be ignored";
- WebSafeBase64Escape(plain, &encoded);
- EXPECT_EQ(encoded.size(), cipher_length);
- EXPECT_STREQ(encoded.c_str(), websafe);
-
- // If we decode it back:
- memset(decode_buffer, 0, sizeof(decode_buffer));
- decode_length = WebSafeBase64Unescape(encode_buffer, cipher_length,
- decode_buffer, sizeof(decode_buffer));
-
- // Is it of the expected length?
- EXPECT_EQ(decode_length, base64_tests[i].plain_length);
-
- // Is it the expected decoded value?
- EXPECT_EQ(0,
- memcmp(decode_buffer, base64_tests[i].plaintext, decode_length));
-
- // If we decode it into a buffer of exactly the right length...
- memset(decode_buffer, 0, sizeof(decode_buffer));
- decode_length = WebSafeBase64Unescape(encode_buffer, cipher_length,
- decode_buffer, decode_length);
-
- // Is it still of the expected length?
- EXPECT_EQ(decode_length, base64_tests[i].plain_length);
-
- // And is it the expected decoded value?
- EXPECT_EQ(0,
- memcmp(decode_buffer, base64_tests[i].plaintext, decode_length));
-
-
- // Let's try the string version of the decoder
- decoded = "this junk should be ignored";
- EXPECT_TRUE(WebSafeBase64Unescape(StringPiece(encode_buffer, cipher_length),
- &decoded));
- EXPECT_EQ(decoded.size(), base64_tests[i].plain_length);
- EXPECT_EQ_ARRAY(decoded.size(), decoded, base64_tests[i].plaintext, i);
-
- // This value works. Try the next.
- }
-
- // Now try the long strings, this tests the streaming
- for (int i = 0; i < sizeof(base64_strings) / sizeof(base64_strings[0]);
- ++i) {
- const unsigned char* unsigned_plaintext =
- reinterpret_cast<const unsigned char*>(base64_strings[i].plaintext);
- int plain_length = strlen(base64_strings[i].plaintext);
- int cipher_length = strlen(base64_strings[i].ciphertext);
- std::vector<char> buffer(cipher_length + 1);
- int encode_length = WebSafeBase64Escape(unsigned_plaintext,
- plain_length,
- &buffer[0],
- buffer.size(),
- false);
- EXPECT_EQ(cipher_length, encode_length);
- EXPECT_EQ(
- CalculateBase64EscapedLen(plain_length, false), encode_length);
- buffer[ encode_length ] = '\0';
- EXPECT_STREQ(base64_strings[i].ciphertext, &buffer[0]);
- }
-
- // Verify the behavior when decoding bad data
- {
- const char* bad_data = "ab-/";
- std::string buf;
- EXPECT_FALSE(Base64Unescape(StringPiece(bad_data), &buf));
- EXPECT_TRUE(!WebSafeBase64Unescape(bad_data, &buf));
- EXPECT_TRUE(buf.empty());
- }
-}
-
-// Test StrCat of ints and longs of various sizes and signdedness.
-TEST(StrCat, Ints) {
- const short s = -1; // NOLINT(runtime/int)
- const uint16_t us = 2;
- const int i = -3;
- const unsigned int ui = 4;
- const long l = -5; // NOLINT(runtime/int)
- const unsigned long ul = 6; // NOLINT(runtime/int)
- const long long ll = -7; // NOLINT(runtime/int)
- const unsigned long long ull = 8; // NOLINT(runtime/int)
- const ptrdiff_t ptrdiff = -9;
- const size_t size = 10;
- const intptr_t intptr = -12;
- const uintptr_t uintptr = 13;
- std::string answer;
- answer = StrCat(s, us);
- EXPECT_EQ(answer, "-12");
- answer = StrCat(i, ui);
- EXPECT_EQ(answer, "-34");
- answer = StrCat(l, ul);
- EXPECT_EQ(answer, "-56");
- answer = StrCat(ll, ull);
- EXPECT_EQ(answer, "-78");
- answer = StrCat(ptrdiff, size);
- EXPECT_EQ(answer, "-910");
- answer = StrCat(ptrdiff, intptr);
- EXPECT_EQ(answer, "-9-12");
- answer = StrCat(uintptr, 0);
- EXPECT_EQ(answer, "130");
-}
-
-class ReplaceChars
- : public ::testing::TestWithParam<
- std::tuple<std::string, std::string, const char*, char>> {};
-
-TEST_P(ReplaceChars, ReplacesAllOccurencesOfAnyCharInReplaceWithAReplaceChar) {
- std::string expected = std::get<0>(GetParam());
- std::string string_to_replace_in = std::get<1>(GetParam());
- const char* what_to_replace = std::get<2>(GetParam());
- char replacement = std::get<3>(GetParam());
- ReplaceCharacters(&string_to_replace_in, what_to_replace, replacement);
- ASSERT_EQ(expected, string_to_replace_in);
-}
-
-INSTANTIATE_TEST_CASE_P(
- Replace, ReplaceChars,
- ::testing::Values(
- std::make_tuple("", "", "", '_'), // empty string should remain empty
- std::make_tuple(" ", " ", "", '_'), // no replacement string
- std::make_tuple(" ", " ", "_-abcedf",
- '*'), // replacement character not in string
- std::make_tuple("replace", "Replace", "R",
- 'r'), // replace one character
- std::make_tuple("not_spaces__", "not\nspaces\t ", " \t\r\n",
- '_'), // replace some special characters
- std::make_tuple("c++", "cxx", "x",
- '+'), // same character multiple times
- std::make_tuple("qvvvvvng v T", "queueing a T", "aeiou",
- 'v'))); // replace all voewls
-
-class StripWs
- : public ::testing::TestWithParam<std::tuple<std::string, std::string>> {};
-
-TEST_P(StripWs, AlwaysStripsLeadingAndTrailingWhitespace) {
- std::string expected = std::get<0>(GetParam());
- std::string string_to_strip = std::get<1>(GetParam());
- StripWhitespace(&string_to_strip);
- ASSERT_EQ(expected, string_to_strip);
-}
-
-INSTANTIATE_TEST_CASE_P(
- Strip, StripWs,
- ::testing::Values(
- std::make_tuple("", ""), // empty string should remain empty
- std::make_tuple("", " "), // only ws should become empty
- std::make_tuple("no whitespace",
- " no whitespace"), // leading ws removed
- std::make_tuple("no whitespace",
- "no whitespace "), // trailing ws removed
- std::make_tuple("no whitespace",
- " no whitespace "), // same nb. of leading and trailing
- std::make_tuple(
- "no whitespace",
- " no whitespace "), // different nb. of leading/trailing
- std::make_tuple("no whitespace",
- " no whitespace "))); // more trailing than leading
-
} // anonymous namespace
} // namespace protobuf
} // namespace google
diff --git a/src/google/protobuf/stubs/substitute.cc b/src/google/protobuf/stubs/substitute.cc
deleted file mode 100644
index d301682..0000000
--- a/src/google/protobuf/stubs/substitute.cc
+++ /dev/null
@@ -1,136 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// Author: kenton@google.com (Kenton Varda)
-
-#include <google/protobuf/stubs/substitute.h>
-
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/stl_util.h>
-
-namespace google {
-namespace protobuf {
-namespace strings {
-
-using internal::SubstituteArg;
-
-// Returns the number of args in arg_array which were passed explicitly
-// to Substitute().
-static int CountSubstituteArgs(const SubstituteArg* const* args_array) {
- int count = 0;
- while (args_array[count] != nullptr && args_array[count]->size() != -1) {
- ++count;
- }
- return count;
-}
-
-std::string Substitute(const std::string& format, const SubstituteArg& arg0,
- const SubstituteArg& arg1, const SubstituteArg& arg2,
- const SubstituteArg& arg3, const SubstituteArg& arg4,
- const SubstituteArg& arg5, const SubstituteArg& arg6,
- const SubstituteArg& arg7, const SubstituteArg& arg8,
- const SubstituteArg& arg9) {
- std::string result;
- SubstituteAndAppend(&result, format.c_str(), arg0, arg1, arg2, arg3, arg4,
- arg5, arg6, arg7, arg8, arg9);
- return result;
-}
-
-void SubstituteAndAppend(std::string* output, const char* format,
- const SubstituteArg& arg0, const SubstituteArg& arg1,
- const SubstituteArg& arg2, const SubstituteArg& arg3,
- const SubstituteArg& arg4, const SubstituteArg& arg5,
- const SubstituteArg& arg6, const SubstituteArg& arg7,
- const SubstituteArg& arg8, const SubstituteArg& arg9) {
- const SubstituteArg* const args_array[] = {
- &arg0, &arg1, &arg2, &arg3, &arg4, &arg5, &arg6, &arg7, &arg8, &arg9, nullptr
- };
-
- // Determine total size needed.
- int size = 0;
- for (int i = 0; format[i] != '\0'; i++) {
- if (format[i] == '$') {
- if (ascii_isdigit(format[i+1])) {
- int index = format[i+1] - '0';
- if (args_array[index]->size() == -1) {
- GOOGLE_LOG(DFATAL)
- << "strings::Substitute format string invalid: asked for \"$"
- << index << "\", but only " << CountSubstituteArgs(args_array)
- << " args were given. Full format string was: \""
- << CEscape(format) << "\".";
- return;
- }
- size += args_array[index]->size();
- ++i; // Skip next char.
- } else if (format[i+1] == '$') {
- ++size;
- ++i; // Skip next char.
- } else {
- GOOGLE_LOG(DFATAL)
- << "Invalid strings::Substitute() format string: \""
- << CEscape(format) << "\".";
- return;
- }
- } else {
- ++size;
- }
- }
-
- if (size == 0) return;
-
- // Build the string.
- int original_size = output->size();
- STLStringResizeUninitialized(output, original_size + size);
- char* target = string_as_array(output) + original_size;
- for (int i = 0; format[i] != '\0'; i++) {
- if (format[i] == '$') {
- if (ascii_isdigit(format[i+1])) {
- unsigned int index = format[i+1] - '0';
- assert(index < 10);
- const SubstituteArg* src = args_array[index];
- memcpy(target, src->data(), src->size());
- target += src->size();
- ++i; // Skip next char.
- } else if (format[i+1] == '$') {
- *target++ = '$';
- ++i; // Skip next char.
- }
- } else {
- *target++ = format[i];
- }
- }
-
- GOOGLE_DCHECK_EQ(target - output->data(), output->size());
-}
-
-} // namespace strings
-} // namespace protobuf
-} // namespace google
diff --git a/src/google/protobuf/stubs/substitute.h b/src/google/protobuf/stubs/substitute.h
deleted file mode 100644
index 0f851de..0000000
--- a/src/google/protobuf/stubs/substitute.h
+++ /dev/null
@@ -1,178 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// Author: kenton@google.com (Kenton Varda)
-// from google3/strings/substitute.h
-
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/stringpiece.h>
-#include <google/protobuf/stubs/strutil.h>
-
-#include <string>
-
-#ifndef GOOGLE_PROTOBUF_STUBS_SUBSTITUTE_H_
-#define GOOGLE_PROTOBUF_STUBS_SUBSTITUTE_H_
-
-#include <google/protobuf/port_def.inc>
-
-namespace google {
-namespace protobuf {
-namespace strings {
-
-// ----------------------------------------------------------------------
-// strings::Substitute()
-// strings::SubstituteAndAppend()
-// Kind of like StringPrintf, but different.
-//
-// Example:
-// string GetMessage(string first_name, string last_name, int age) {
-// return strings::Substitute("My name is $0 $1 and I am $2 years old.",
-// first_name, last_name, age);
-// }
-//
-// Differences from StringPrintf:
-// * The format string does not identify the types of arguments.
-// Instead, the magic of C++ deals with this for us. See below
-// for a list of accepted types.
-// * Substitutions in the format string are identified by a '$'
-// followed by a digit. So, you can use arguments out-of-order and
-// use the same argument multiple times.
-// * It's much faster than StringPrintf.
-//
-// Supported types:
-// * Strings (const char*, const string&)
-// * Note that this means you do not have to add .c_str() to all of
-// your strings. In fact, you shouldn't; it will be slower.
-// * int32, int64, uint32, uint64: Formatted using SimpleItoa().
-// * float, double: Formatted using SimpleFtoa() and SimpleDtoa().
-// * bool: Printed as "true" or "false".
-//
-// SubstituteAndAppend() is like Substitute() but appends the result to
-// *output. Example:
-//
-// string str;
-// strings::SubstituteAndAppend(&str,
-// "My name is $0 $1 and I am $2 years old.",
-// first_name, last_name, age);
-//
-// Substitute() is significantly faster than StringPrintf(). For very
-// large strings, it may be orders of magnitude faster.
-// ----------------------------------------------------------------------
-
-namespace internal { // Implementation details.
-
-class SubstituteArg {
- public:
- inline SubstituteArg(const char* value)
- : text_(value), size_(strlen(text_)) {}
- inline SubstituteArg(const std::string& value)
- : text_(value.data()), size_(value.size()) {}
- inline SubstituteArg(const StringPiece value)
- : text_(value.data()), size_(value.size()) {}
-
- // Indicates that no argument was given.
- inline explicit SubstituteArg()
- : text_(nullptr), size_(-1) {}
-
- // Primitives
- // We don't overload for signed and unsigned char because if people are
- // explicitly declaring their chars as signed or unsigned then they are
- // probably actually using them as 8-bit integers and would probably
- // prefer an integer representation. But, we don't really know. So, we
- // make the caller decide what to do.
- inline SubstituteArg(char value)
- : text_(scratch_), size_(1) { scratch_[0] = value; }
- inline SubstituteArg(short value)
- : text_(FastInt32ToBuffer(value, scratch_)), size_(strlen(text_)) {}
- inline SubstituteArg(unsigned short value)
- : text_(FastUInt32ToBuffer(value, scratch_)), size_(strlen(text_)) {}
- inline SubstituteArg(int value)
- : text_(FastInt32ToBuffer(value, scratch_)), size_(strlen(text_)) {}
- inline SubstituteArg(unsigned int value)
- : text_(FastUInt32ToBuffer(value, scratch_)), size_(strlen(text_)) {}
- inline SubstituteArg(long value)
- : text_(FastLongToBuffer(value, scratch_)), size_(strlen(text_)) {}
- inline SubstituteArg(unsigned long value)
- : text_(FastULongToBuffer(value, scratch_)), size_(strlen(text_)) {}
- inline SubstituteArg(long long value)
- : text_(FastInt64ToBuffer(value, scratch_)), size_(strlen(text_)) {}
- inline SubstituteArg(unsigned long long value)
- : text_(FastUInt64ToBuffer(value, scratch_)), size_(strlen(text_)) {}
- inline SubstituteArg(float value)
- : text_(FloatToBuffer(value, scratch_)), size_(strlen(text_)) {}
- inline SubstituteArg(double value)
- : text_(DoubleToBuffer(value, scratch_)), size_(strlen(text_)) {}
- inline SubstituteArg(bool value)
- : text_(value ? "true" : "false"), size_(strlen(text_)) {}
-
- inline const char* data() const { return text_; }
- inline int size() const { return size_; }
-
- private:
- const char* text_;
- int size_;
- char scratch_[kFastToBufferSize];
-};
-
-} // namespace internal
-
-PROTOBUF_EXPORT std::string Substitute(
- const std::string& format,
- const internal::SubstituteArg& arg0 = internal::SubstituteArg(),
- const internal::SubstituteArg& arg1 = internal::SubstituteArg(),
- const internal::SubstituteArg& arg2 = internal::SubstituteArg(),
- const internal::SubstituteArg& arg3 = internal::SubstituteArg(),
- const internal::SubstituteArg& arg4 = internal::SubstituteArg(),
- const internal::SubstituteArg& arg5 = internal::SubstituteArg(),
- const internal::SubstituteArg& arg6 = internal::SubstituteArg(),
- const internal::SubstituteArg& arg7 = internal::SubstituteArg(),
- const internal::SubstituteArg& arg8 = internal::SubstituteArg(),
- const internal::SubstituteArg& arg9 = internal::SubstituteArg());
-
-PROTOBUF_EXPORT void SubstituteAndAppend(
- std::string* output, const char* format,
- const internal::SubstituteArg& arg0 = internal::SubstituteArg(),
- const internal::SubstituteArg& arg1 = internal::SubstituteArg(),
- const internal::SubstituteArg& arg2 = internal::SubstituteArg(),
- const internal::SubstituteArg& arg3 = internal::SubstituteArg(),
- const internal::SubstituteArg& arg4 = internal::SubstituteArg(),
- const internal::SubstituteArg& arg5 = internal::SubstituteArg(),
- const internal::SubstituteArg& arg6 = internal::SubstituteArg(),
- const internal::SubstituteArg& arg7 = internal::SubstituteArg(),
- const internal::SubstituteArg& arg8 = internal::SubstituteArg(),
- const internal::SubstituteArg& arg9 = internal::SubstituteArg());
-
-} // namespace strings
-} // namespace protobuf
-} // namespace google
-
-#include <google/protobuf/port_undef.inc>
-
-#endif // GOOGLE_PROTOBUF_STUBS_SUBSTITUTE_H_
diff --git a/src/google/protobuf/stubs/template_util.h b/src/google/protobuf/stubs/template_util.h
deleted file mode 100644
index feef904..0000000
--- a/src/google/protobuf/stubs/template_util.h
+++ /dev/null
@@ -1,138 +0,0 @@
-// Copyright 2005 Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// ----
-// Author: lar@google.com (Laramie Leavitt)
-//
-// Template metaprogramming utility functions.
-//
-// This code is compiled directly on many platforms, including client
-// platforms like Windows, Mac, and embedded systems. Before making
-// any changes here, make sure that you're not breaking any platforms.
-//
-//
-// The names chosen here reflect those used in tr1 and the boost::mpl
-// library, there are similar operations used in the Loki library as
-// well. I prefer the boost names for 2 reasons:
-// 1. I think that portions of the Boost libraries are more likely to
-// be included in the c++ standard.
-// 2. It is not impossible that some of the boost libraries will be
-// included in our own build in the future.
-// Both of these outcomes means that we may be able to directly replace
-// some of these with boost equivalents.
-//
-#ifndef GOOGLE_PROTOBUF_TEMPLATE_UTIL_H_
-#define GOOGLE_PROTOBUF_TEMPLATE_UTIL_H_
-
-namespace google {
-namespace protobuf {
-namespace internal {
-
-// Types small_ and big_ are guaranteed such that sizeof(small_) <
-// sizeof(big_)
-typedef char small_;
-
-struct big_ {
- char dummy[2];
-};
-
-// Identity metafunction.
-template <class T>
-struct identity_ {
- typedef T type;
-};
-
-// integral_constant, defined in tr1, is a wrapper for an integer
-// value. We don't really need this generality; we could get away
-// with hardcoding the integer type to bool. We use the fully
-// general integer_constant for compatibility with tr1.
-
-template<class T, T v>
-struct integral_constant {
- static const T value = v;
- typedef T value_type;
- typedef integral_constant<T, v> type;
-};
-
-template <class T, T v> const T integral_constant<T, v>::value;
-
-
-// Abbreviations: true_type and false_type are structs that represent boolean
-// true and false values. Also define the boost::mpl versions of those names,
-// true_ and false_.
-typedef integral_constant<bool, true> true_type;
-typedef integral_constant<bool, false> false_type;
-typedef true_type true_;
-typedef false_type false_;
-
-// if_ is a templatized conditional statement.
-// if_<cond, A, B> is a compile time evaluation of cond.
-// if_<>::type contains A if cond is true, B otherwise.
-template<bool cond, typename A, typename B>
-struct if_{
- typedef A type;
-};
-
-template<typename A, typename B>
-struct if_<false, A, B> {
- typedef B type;
-};
-
-
-// type_equals_ is a template type comparator, similar to Loki IsSameType.
-// type_equals_<A, B>::value is true iff "A" is the same type as "B".
-//
-// New code should prefer base::is_same, defined in base/type_traits.h.
-// It is functionally identical, but is_same is the standard spelling.
-template<typename A, typename B>
-struct type_equals_ : public false_ {
-};
-
-template<typename A>
-struct type_equals_<A, A> : public true_ {
-};
-
-// and_ is a template && operator.
-// and_<A, B>::value evaluates "A::value && B::value".
-template<typename A, typename B>
-struct and_ : public integral_constant<bool, (A::value && B::value)> {
-};
-
-// or_ is a template || operator.
-// or_<A, B>::value evaluates "A::value || B::value".
-template<typename A, typename B>
-struct or_ : public integral_constant<bool, (A::value || B::value)> {
-};
-
-
-} // namespace internal
-} // namespace protobuf
-} // namespace google
-
-#endif // GOOGLE_PROTOBUF_TEMPLATE_UTIL_H_
diff --git a/src/google/protobuf/stubs/template_util_unittest.cc b/src/google/protobuf/stubs/template_util_unittest.cc
deleted file mode 100644
index b1745e2..0000000
--- a/src/google/protobuf/stubs/template_util_unittest.cc
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright 2005 Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// ----
-// Author: lar@google.com (Laramie Leavitt)
-//
-// These tests are really compile time tests.
-// If you try to step through this in a debugger
-// you will not see any evaluations, merely that
-// value is assigned true or false sequentially.
-
-#include <google/protobuf/stubs/template_util.h>
-
-#include <google/protobuf/testing/googletest.h>
-#include <gtest/gtest.h>
-
-namespace GOOGLE_NAMESPACE = google::protobuf::internal;
-
-namespace google {
-namespace protobuf {
-namespace internal {
-namespace {
-
-TEST(TemplateUtilTest, TestSize) {
- EXPECT_GT(sizeof(GOOGLE_NAMESPACE::big_), sizeof(GOOGLE_NAMESPACE::small_));
-}
-
-TEST(TemplateUtilTest, TestIntegralConstants) {
- // test the built-in types.
- EXPECT_TRUE(true_type::value);
- EXPECT_FALSE(false_type::value);
-
- typedef integral_constant<int, 1> one_type;
- EXPECT_EQ(1, one_type::value);
-}
-
-TEST(TemplateUtilTest, TestTemplateIf) {
- typedef if_<true, true_type, false_type>::type if_true;
- EXPECT_TRUE(if_true::value);
-
- typedef if_<false, true_type, false_type>::type if_false;
- EXPECT_FALSE(if_false::value);
-}
-
-TEST(TemplateUtilTest, TestTemplateTypeEquals) {
- // Check that the TemplateTypeEquals works correctly.
- bool value = false;
-
- // Test the same type is true.
- value = type_equals_<int, int>::value;
- EXPECT_TRUE(value);
-
- // Test different types are false.
- value = type_equals_<float, int>::value;
- EXPECT_FALSE(value);
-
- // Test type aliasing.
- typedef const int foo;
- value = type_equals_<const foo, const int>::value;
- EXPECT_TRUE(value);
-}
-
-TEST(TemplateUtilTest, TestTemplateAndOr) {
- // Check that the TemplateTypeEquals works correctly.
- bool value = false;
-
- // Yes && Yes == true.
- value = and_<true_, true_>::value;
- EXPECT_TRUE(value);
- // Yes && No == false.
- value = and_<true_, false_>::value;
- EXPECT_FALSE(value);
- // No && Yes == false.
- value = and_<false_, true_>::value;
- EXPECT_FALSE(value);
- // No && No == false.
- value = and_<false_, false_>::value;
- EXPECT_FALSE(value);
-
- // Yes || Yes == true.
- value = or_<true_, true_>::value;
- EXPECT_TRUE(value);
- // Yes || No == true.
- value = or_<true_, false_>::value;
- EXPECT_TRUE(value);
- // No || Yes == true.
- value = or_<false_, true_>::value;
- EXPECT_TRUE(value);
- // No || No == false.
- value = or_<false_, false_>::value;
- EXPECT_FALSE(value);
-}
-
-TEST(TemplateUtilTest, TestIdentity) {
- EXPECT_TRUE(
- (type_equals_<GOOGLE_NAMESPACE::identity_<int>::type, int>::value));
- EXPECT_TRUE(
- (type_equals_<GOOGLE_NAMESPACE::identity_<void>::type, void>::value));
-}
-
-} // anonymous namespace
-} // namespace internal
-} // namespace protobuf
-} // namespace google
diff --git a/src/google/protobuf/stubs/time.cc b/src/google/protobuf/stubs/time.cc
deleted file mode 100644
index 692cb82..0000000
--- a/src/google/protobuf/stubs/time.cc
+++ /dev/null
@@ -1,365 +0,0 @@
-#include <google/protobuf/stubs/time.h>
-
-#include <ctime>
-
-#include <google/protobuf/stubs/stringprintf.h>
-#include <google/protobuf/stubs/strutil.h>
-
-namespace google {
-namespace protobuf {
-namespace internal {
-
-namespace {
-static const int64_t kSecondsPerMinute = 60;
-static const int64_t kSecondsPerHour = 3600;
-static const int64_t kSecondsPerDay = kSecondsPerHour * 24;
-static const int64_t kSecondsPer400Years =
- kSecondsPerDay * (400 * 365 + 400 / 4 - 3);
-// Seconds from 0001-01-01T00:00:00 to 1970-01-01T:00:00:00
-static const int64_t kSecondsFromEraToEpoch = 62135596800LL;
-// The range of timestamp values we support.
-static const int64_t kMinTime = -62135596800LL; // 0001-01-01T00:00:00
-static const int64_t kMaxTime = 253402300799LL; // 9999-12-31T23:59:59
-
-static const int kNanosPerMillisecond = 1000000;
-static const int kNanosPerMicrosecond = 1000;
-
-// Count the seconds from the given year (start at Jan 1, 00:00) to 100 years
-// after.
-int64_t SecondsPer100Years(int year) {
- if (year % 400 == 0 || year % 400 > 300) {
- return kSecondsPerDay * (100 * 365 + 100 / 4);
- } else {
- return kSecondsPerDay * (100 * 365 + 100 / 4 - 1);
- }
-}
-
-// Count the seconds from the given year (start at Jan 1, 00:00) to 4 years
-// after.
-int64_t SecondsPer4Years(int year) {
- if ((year % 100 == 0 || year % 100 > 96) &&
- !(year % 400 == 0 || year % 400 > 396)) {
- // No leap years.
- return kSecondsPerDay * (4 * 365);
- } else {
- // One leap years.
- return kSecondsPerDay * (4 * 365 + 1);
- }
-}
-
-bool IsLeapYear(int year) {
- return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
-}
-
-int64_t SecondsPerYear(int year) {
- return kSecondsPerDay * (IsLeapYear(year) ? 366 : 365);
-}
-
-static const int kDaysInMonth[13] = {
- 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
-};
-
-int64_t SecondsPerMonth(int month, bool leap) {
- if (month == 2 && leap) {
- return kSecondsPerDay * (kDaysInMonth[month] + 1);
- }
- return kSecondsPerDay * kDaysInMonth[month];
-}
-
-static const int kDaysSinceJan[13] = {
- 0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334,
-};
-
-bool ValidateDateTime(const DateTime& time) {
- if (time.year < 1 || time.year > 9999 ||
- time.month < 1 || time.month > 12 ||
- time.day < 1 || time.day > 31 ||
- time.hour < 0 || time.hour > 23 ||
- time.minute < 0 || time.minute > 59 ||
- time.second < 0 || time.second > 59) {
- return false;
- }
- if (time.month == 2 && IsLeapYear(time.year)) {
- return time.day <= kDaysInMonth[time.month] + 1;
- } else {
- return time.day <= kDaysInMonth[time.month];
- }
-}
-
-// Count the number of seconds elapsed from 0001-01-01T00:00:00 to the given
-// time.
-int64_t SecondsSinceCommonEra(const DateTime& time) {
- int64_t result = 0;
- // Years should be between 1 and 9999.
- assert(time.year >= 1 && time.year <= 9999);
- int year = 1;
- if ((time.year - year) >= 400) {
- int count_400years = (time.year - year) / 400;
- result += kSecondsPer400Years * count_400years;
- year += count_400years * 400;
- }
- while ((time.year - year) >= 100) {
- result += SecondsPer100Years(year);
- year += 100;
- }
- while ((time.year - year) >= 4) {
- result += SecondsPer4Years(year);
- year += 4;
- }
- while (time.year > year) {
- result += SecondsPerYear(year);
- ++year;
- }
- // Months should be between 1 and 12.
- assert(time.month >= 1 && time.month <= 12);
- int month = time.month;
- result += kSecondsPerDay * kDaysSinceJan[month];
- if (month > 2 && IsLeapYear(year)) {
- result += kSecondsPerDay;
- }
- assert(time.day >= 1 &&
- time.day <= (month == 2 && IsLeapYear(year)
- ? kDaysInMonth[month] + 1
- : kDaysInMonth[month]));
- result += kSecondsPerDay * (time.day - 1);
- result += kSecondsPerHour * time.hour +
- kSecondsPerMinute * time.minute +
- time.second;
- return result;
-}
-
-// Format nanoseconds with either 3, 6, or 9 digits depending on the required
-// precision to represent the exact value.
-std::string FormatNanos(int32_t nanos) {
- if (nanos % kNanosPerMillisecond == 0) {
- return StringPrintf("%03d", nanos / kNanosPerMillisecond);
- } else if (nanos % kNanosPerMicrosecond == 0) {
- return StringPrintf("%06d", nanos / kNanosPerMicrosecond);
- } else {
- return StringPrintf("%09d", nanos);
- }
-}
-
-// Parses an integer from a null-terminated char sequence. The method
-// consumes at most "width" chars. Returns a pointer after the consumed
-// integer, or nullptr if the data does not start with an integer or the
-// integer value does not fall in the range of [min_value, max_value].
-const char* ParseInt(const char* data, int width, int min_value,
- int max_value, int* result) {
- if (!ascii_isdigit(*data)) {
- return nullptr;
- }
- int value = 0;
- for (int i = 0; i < width; ++i, ++data) {
- if (ascii_isdigit(*data)) {
- value = value * 10 + (*data - '0');
- } else {
- break;
- }
- }
- if (value >= min_value && value <= max_value) {
- *result = value;
- return data;
- } else {
- return nullptr;
- }
-}
-
-// Consumes the fractional parts of a second into nanos. For example,
-// "010" will be parsed to 10000000 nanos.
-const char* ParseNanos(const char* data, int32_t* nanos) {
- if (!ascii_isdigit(*data)) {
- return nullptr;
- }
- int value = 0;
- int len = 0;
- // Consume as many digits as there are but only take the first 9 into
- // account.
- while (ascii_isdigit(*data)) {
- if (len < 9) {
- value = value * 10 + *data - '0';
- }
- ++len;
- ++data;
- }
- while (len < 9) {
- value = value * 10;
- ++len;
- }
- *nanos = value;
- return data;
-}
-
-const char* ParseTimezoneOffset(const char* data, int64_t* offset) {
- // Accept format "HH:MM". E.g., "08:00"
- int hour;
- if ((data = ParseInt(data, 2, 0, 23, &hour)) == nullptr) {
- return nullptr;
- }
- if (*data++ != ':') {
- return nullptr;
- }
- int minute;
- if ((data = ParseInt(data, 2, 0, 59, &minute)) == nullptr) {
- return nullptr;
- }
- *offset = (hour * 60 + minute) * 60;
- return data;
-}
-} // namespace
-
-bool SecondsToDateTime(int64_t seconds, DateTime* time) {
- if (seconds < kMinTime || seconds > kMaxTime) {
- return false;
- }
- // It's easier to calculate the DateTime starting from 0001-01-01T00:00:00
- seconds = seconds + kSecondsFromEraToEpoch;
- int year = 1;
- if (seconds >= kSecondsPer400Years) {
- int count_400years = seconds / kSecondsPer400Years;
- year += 400 * count_400years;
- seconds %= kSecondsPer400Years;
- }
- while (seconds >= SecondsPer100Years(year)) {
- seconds -= SecondsPer100Years(year);
- year += 100;
- }
- while (seconds >= SecondsPer4Years(year)) {
- seconds -= SecondsPer4Years(year);
- year += 4;
- }
- while (seconds >= SecondsPerYear(year)) {
- seconds -= SecondsPerYear(year);
- year += 1;
- }
- bool leap = IsLeapYear(year);
- int month = 1;
- while (seconds >= SecondsPerMonth(month, leap)) {
- seconds -= SecondsPerMonth(month, leap);
- ++month;
- }
- int day = 1 + seconds / kSecondsPerDay;
- seconds %= kSecondsPerDay;
- int hour = seconds / kSecondsPerHour;
- seconds %= kSecondsPerHour;
- int minute = seconds / kSecondsPerMinute;
- seconds %= kSecondsPerMinute;
- time->year = year;
- time->month = month;
- time->day = day;
- time->hour = hour;
- time->minute = minute;
- time->second = static_cast<int>(seconds);
- return true;
-}
-
-bool DateTimeToSeconds(const DateTime& time, int64_t* seconds) {
- if (!ValidateDateTime(time)) {
- return false;
- }
- *seconds = SecondsSinceCommonEra(time) - kSecondsFromEraToEpoch;
- return true;
-}
-
-void GetCurrentTime(int64_t* seconds, int32_t* nanos) {
- // TODO(xiaofeng): Improve the accuracy of this implementation (or just
- // remove this method from protobuf).
- *seconds = time(nullptr);
- *nanos = 0;
-}
-
-std::string FormatTime(int64_t seconds, int32_t nanos) {
- DateTime time;
- if (nanos < 0 || nanos > 999999999 || !SecondsToDateTime(seconds, &time)) {
- return "InvalidTime";
- }
- std::string result =
- StringPrintf("%04d-%02d-%02dT%02d:%02d:%02d", time.year, time.month,
- time.day, time.hour, time.minute, time.second);
- if (nanos != 0) {
- result += "." + FormatNanos(nanos);
- }
- return result + "Z";
-}
-
-bool ParseTime(const std::string& value, int64_t* seconds, int32_t* nanos) {
- DateTime time;
- const char* data = value.c_str();
- // We only accept:
- // Z-normalized: 2015-05-20T13:29:35.120Z
- // With UTC offset: 2015-05-20T13:29:35.120-08:00
-
- // Parse year
- if ((data = ParseInt(data, 4, 1, 9999, &time.year)) == nullptr) {
- return false;
- }
- // Expect '-'
- if (*data++ != '-') return false;
- // Parse month
- if ((data = ParseInt(data, 2, 1, 12, &time.month)) == nullptr) {
- return false;
- }
- // Expect '-'
- if (*data++ != '-') return false;
- // Parse day
- if ((data = ParseInt(data, 2, 1, 31, &time.day)) == nullptr) {
- return false;
- }
- // Expect 'T'
- if (*data++ != 'T') return false;
- // Parse hour
- if ((data = ParseInt(data, 2, 0, 23, &time.hour)) == nullptr) {
- return false;
- }
- // Expect ':'
- if (*data++ != ':') return false;
- // Parse minute
- if ((data = ParseInt(data, 2, 0, 59, &time.minute)) == nullptr) {
- return false;
- }
- // Expect ':'
- if (*data++ != ':') return false;
- // Parse second
- if ((data = ParseInt(data, 2, 0, 59, &time.second)) == nullptr) {
- return false;
- }
- if (!DateTimeToSeconds(time, seconds)) {
- return false;
- }
- // Parse nanoseconds.
- if (*data == '.') {
- ++data;
- // Parse nanoseconds.
- if ((data = ParseNanos(data, nanos)) == nullptr) {
- return false;
- }
- } else {
- *nanos = 0;
- }
- // Parse UTC offsets.
- if (*data == 'Z') {
- ++data;
- } else if (*data == '+') {
- ++data;
- int64_t offset;
- if ((data = ParseTimezoneOffset(data, &offset)) == nullptr) {
- return false;
- }
- *seconds -= offset;
- } else if (*data == '-') {
- ++data;
- int64_t offset;
- if ((data = ParseTimezoneOffset(data, &offset)) == nullptr) {
- return false;
- }
- *seconds += offset;
- } else {
- return false;
- }
- // Done with parsing.
- return *data == 0;
-}
-
-} // namespace internal
-} // namespace protobuf
-} // namespace google
diff --git a/src/google/protobuf/stubs/time.h b/src/google/protobuf/stubs/time.h
deleted file mode 100644
index 8b6e562..0000000
--- a/src/google/protobuf/stubs/time.h
+++ /dev/null
@@ -1,82 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#ifndef GOOGLE_PROTOBUF_STUBS_TIME_H_
-#define GOOGLE_PROTOBUF_STUBS_TIME_H_
-
-#include <cstdint>
-
-#include <google/protobuf/stubs/common.h>
-
-#include <google/protobuf/port_def.inc>
-
-namespace google {
-namespace protobuf {
-namespace internal {
-
-struct DateTime {
- int year;
- int month;
- int day;
- int hour;
- int minute;
- int second;
-};
-
-// Converts a timestamp (seconds elapsed since 1970-01-01T00:00:00, could be
-// negative to represent time before 1970-01-01) to DateTime. Returns false
-// if the timestamp is not in the range between 0001-01-01T00:00:00 and
-// 9999-12-31T23:59:59.
-bool PROTOBUF_EXPORT SecondsToDateTime(int64_t seconds, DateTime* time);
-// Converts DateTime to a timestamp (seconds since 1970-01-01T00:00:00).
-// Returns false if the DateTime is not valid or is not in the valid range.
-bool PROTOBUF_EXPORT DateTimeToSeconds(const DateTime& time, int64_t* seconds);
-
-void PROTOBUF_EXPORT GetCurrentTime(int64_t* seconds, int32_t* nanos);
-
-// Formats a time string in RFC3339 format.
-//
-// For example, "2015-05-20T13:29:35.120Z". For nanos, 0, 3, 6 or 9 fractional
-// digits will be used depending on how many are required to represent the exact
-// value.
-//
-// Note that "nanos" must in the range of [0, 999999999].
-std::string PROTOBUF_EXPORT FormatTime(int64_t seconds, int32_t nanos);
-// Parses a time string. This method accepts RFC3339 date/time string with UTC
-// offset. For example, "2015-05-20T13:29:35.120-08:00".
-bool PROTOBUF_EXPORT ParseTime(const std::string& value, int64_t* seconds,
- int32_t* nanos);
-
-} // namespace internal
-} // namespace protobuf
-} // namespace google
-
-#include <google/protobuf/port_undef.inc>
-
-#endif // GOOGLE_PROTOBUF_STUBS_TIME_H_
diff --git a/src/google/protobuf/stubs/time_test.cc b/src/google/protobuf/stubs/time_test.cc
deleted file mode 100644
index 1ce0a1c1..0000000
--- a/src/google/protobuf/stubs/time_test.cc
+++ /dev/null
@@ -1,261 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/stubs/time.h>
-
-#include <google/protobuf/testing/googletest.h>
-#include <gtest/gtest.h>
-
-namespace google {
-namespace protobuf {
-namespace internal {
-namespace {
-static const int64 kSecondsPerDay = 3600 * 24;
-
-// For DateTime, tests will mostly focus on the date part because that's
-// the tricky one.
-int64 CreateTimestamp(int year, int month, int day) {
- DateTime time;
- time.year = year;
- time.month = month;
- time.day = day;
- time.hour = time.minute = time.second = 0;
- int64 result;
- GOOGLE_CHECK(DateTimeToSeconds(time, &result));
- // Check that a roundtrip produces the same result.
- GOOGLE_CHECK(SecondsToDateTime(result, &time));
- GOOGLE_CHECK(time.year == year);
- GOOGLE_CHECK(time.month == month);
- GOOGLE_CHECK(time.day == day);
- return result;
-}
-
-TEST(DateTimeTest, SimpleTime) {
- DateTime time;
- ASSERT_TRUE(SecondsToDateTime(1, &time));
- EXPECT_EQ(1970, time.year);
- EXPECT_EQ(1, time.month);
- EXPECT_EQ(1, time.day);
- EXPECT_EQ(0, time.hour);
- EXPECT_EQ(0, time.minute);
- EXPECT_EQ(1, time.second);
- int64 seconds;
- ASSERT_TRUE(DateTimeToSeconds(time, &seconds));
- EXPECT_EQ(1, seconds);
-
- ASSERT_TRUE(SecondsToDateTime(-1, &time));
- EXPECT_EQ(1969, time.year);
- EXPECT_EQ(12, time.month);
- EXPECT_EQ(31, time.day);
- EXPECT_EQ(23, time.hour);
- EXPECT_EQ(59, time.minute);
- EXPECT_EQ(59, time.second);
- ASSERT_TRUE(DateTimeToSeconds(time, &seconds));
- EXPECT_EQ(-1, seconds);
-
- DateTime start, end;
- start.year = 1;
- start.month = 1;
- start.day = 1;
- start.hour = 0;
- start.minute = 0;
- start.second = 0;
- end.year = 9999;
- end.month = 12;
- end.day = 31;
- end.hour = 23;
- end.minute = 59;
- end.second = 59;
- int64 start_time, end_time;
- ASSERT_TRUE(DateTimeToSeconds(start, &start_time));
- ASSERT_TRUE(DateTimeToSeconds(end, &end_time));
- EXPECT_EQ(315537897599LL, end_time - start_time);
- ASSERT_TRUE(SecondsToDateTime(start_time, &time));
- ASSERT_TRUE(DateTimeToSeconds(time, &seconds));
- EXPECT_EQ(start_time, seconds);
- ASSERT_TRUE(SecondsToDateTime(end_time, &time));
- ASSERT_TRUE(DateTimeToSeconds(time, &seconds));
- EXPECT_EQ(end_time, seconds);
-}
-
-TEST(DateTimeTest, DayInMonths) {
- // Check that month boundaries are handled correctly.
- EXPECT_EQ(kSecondsPerDay,
- CreateTimestamp(2015, 1, 1) - CreateTimestamp(2014, 12, 31));
- EXPECT_EQ(kSecondsPerDay,
- CreateTimestamp(2015, 2, 1) - CreateTimestamp(2015, 1, 31));
- EXPECT_EQ(kSecondsPerDay,
- CreateTimestamp(2015, 3, 1) - CreateTimestamp(2015, 2, 28));
- EXPECT_EQ(kSecondsPerDay,
- CreateTimestamp(2015, 4, 1) - CreateTimestamp(2015, 3, 31));
- EXPECT_EQ(kSecondsPerDay,
- CreateTimestamp(2015, 5, 1) - CreateTimestamp(2015, 4, 30));
- EXPECT_EQ(kSecondsPerDay,
- CreateTimestamp(2015, 6, 1) - CreateTimestamp(2015, 5, 31));
- EXPECT_EQ(kSecondsPerDay,
- CreateTimestamp(2015, 7, 1) - CreateTimestamp(2015, 6, 30));
- EXPECT_EQ(kSecondsPerDay,
- CreateTimestamp(2015, 8, 1) - CreateTimestamp(2015, 7, 31));
- EXPECT_EQ(kSecondsPerDay,
- CreateTimestamp(2015, 9, 1) - CreateTimestamp(2015, 8, 31));
- EXPECT_EQ(kSecondsPerDay,
- CreateTimestamp(2015, 10, 1) - CreateTimestamp(2015, 9, 30));
- EXPECT_EQ(kSecondsPerDay,
- CreateTimestamp(2015, 11, 1) - CreateTimestamp(2015, 10, 31));
- EXPECT_EQ(kSecondsPerDay,
- CreateTimestamp(2015, 12, 1) - CreateTimestamp(2015, 11, 30));
- EXPECT_EQ(kSecondsPerDay,
- CreateTimestamp(2016, 1, 1) - CreateTimestamp(2015, 12, 31));
-}
-
-TEST(DateTimeTest, LeapYear) {
- // Non-leap year.
- EXPECT_EQ(kSecondsPerDay,
- CreateTimestamp(2015, 3, 1) - CreateTimestamp(2015, 2, 28));
- // Leap year.
- EXPECT_EQ(kSecondsPerDay,
- CreateTimestamp(2016, 3, 1) - CreateTimestamp(2016, 2, 29));
- // Non-leap year.
- EXPECT_EQ(kSecondsPerDay,
- CreateTimestamp(2100, 3, 1) - CreateTimestamp(2100, 2, 28));
- // Leap year.
- EXPECT_EQ(kSecondsPerDay,
- CreateTimestamp(2400, 3, 1) - CreateTimestamp(2400, 2, 29));
-}
-
-TEST(DateTimeTest, WrongDays) {
- int64 seconds;
- DateTime time;
- time.hour = 0;
- time.minute = 0;
- time.second = 0;
- time.month = 2;
-
- // Non-leap year.
- time.year = 2015;
- time.day = 29;
- ASSERT_FALSE(DateTimeToSeconds(time, &seconds));
-
- // Leap year.
- time.year = 2016;
- time.day = 29;
- ASSERT_TRUE(DateTimeToSeconds(time, &seconds));
- time.day = 30;
- ASSERT_FALSE(DateTimeToSeconds(time, &seconds));
-
- // Non-leap year.
- time.year = 2100;
- time.day = 29;
- ASSERT_FALSE(DateTimeToSeconds(time, &seconds));
-
- // Leap year.
- time.year = 2400;
- time.day = 29;
- ASSERT_TRUE(DateTimeToSeconds(time, &seconds));
- time.day = 30;
- ASSERT_FALSE(DateTimeToSeconds(time, &seconds));
-
- // Non-february
- time.year = 2015;
- time.month = 1;
- time.day = 0;
- ASSERT_FALSE(DateTimeToSeconds(time, &seconds));
- time.day = 1;
- ASSERT_TRUE(DateTimeToSeconds(time, &seconds));
- time.day = 31;
- ASSERT_TRUE(DateTimeToSeconds(time, &seconds));
- time.day = 32;
- ASSERT_FALSE(DateTimeToSeconds(time, &seconds));
-
- // Bad month
- time.year = 2015;
- time.month = 0;
- time.day = 1;
- ASSERT_FALSE(DateTimeToSeconds(time, &seconds));
- time.month = 13;
- ASSERT_FALSE(DateTimeToSeconds(time, &seconds));
-}
-
-TEST(DateTimeTest, StringFormat) {
- DateTime start, end;
- start.year = 1;
- start.month = 1;
- start.day = 1;
- start.hour = 0;
- start.minute = 0;
- start.second = 0;
- end.year = 9999;
- end.month = 12;
- end.day = 31;
- end.hour = 23;
- end.minute = 59;
- end.second = 59;
- int64 start_time, end_time;
- ASSERT_TRUE(DateTimeToSeconds(start, &start_time));
- ASSERT_TRUE(DateTimeToSeconds(end, &end_time));
-
- EXPECT_EQ("0001-01-01T00:00:00Z", FormatTime(start_time, 0));
- EXPECT_EQ("9999-12-31T23:59:59Z", FormatTime(end_time, 0));
-
- // Make sure the nanoseconds part is formatted correctly.
- EXPECT_EQ("1970-01-01T00:00:00.010Z", FormatTime(0, 10000000));
- EXPECT_EQ("1970-01-01T00:00:00.000010Z", FormatTime(0, 10000));
- EXPECT_EQ("1970-01-01T00:00:00.000000010Z", FormatTime(0, 10));
-}
-
-TEST(DateTimeTest, ParseString) {
- int64 seconds;
- int32 nanos;
- ASSERT_TRUE(ParseTime("0001-01-01T00:00:00Z", &seconds, &nanos));
- EXPECT_EQ("0001-01-01T00:00:00Z", FormatTime(seconds, nanos));
- ASSERT_TRUE(ParseTime("9999-12-31T23:59:59.999999999Z", &seconds, &nanos));
- EXPECT_EQ("9999-12-31T23:59:59.999999999Z", FormatTime(seconds, nanos));
-
- // Test time zone offsets.
- ASSERT_TRUE(ParseTime("1970-01-01T00:00:00-08:00", &seconds, &nanos));
- EXPECT_EQ("1970-01-01T08:00:00Z", FormatTime(seconds, nanos));
- ASSERT_TRUE(ParseTime("1970-01-01T00:00:00+08:00", &seconds, &nanos));
- EXPECT_EQ("1969-12-31T16:00:00Z", FormatTime(seconds, nanos));
-
- // Test nanoseconds.
- ASSERT_TRUE(ParseTime("1970-01-01T00:00:00.01Z", &seconds, &nanos));
- EXPECT_EQ("1970-01-01T00:00:00.010Z", FormatTime(seconds, nanos));
- ASSERT_TRUE(ParseTime("1970-01-01T00:00:00.00001-08:00", &seconds, &nanos));
- EXPECT_EQ("1970-01-01T08:00:00.000010Z", FormatTime(seconds, nanos));
- ASSERT_TRUE(ParseTime("1970-01-01T00:00:00.00000001+08:00", &seconds, &nanos));
- EXPECT_EQ("1969-12-31T16:00:00.000000010Z", FormatTime(seconds, nanos));
- // Fractional parts less than 1 nanosecond will be ignored.
- ASSERT_TRUE(ParseTime("1970-01-01T00:00:00.0123456789Z", &seconds, &nanos));
- EXPECT_EQ("1970-01-01T00:00:00.012345678Z", FormatTime(seconds, nanos));
-}
-
-} // namespace
-} // namespace internal
-} // namespace protobuf
-} // namespace google
diff --git a/src/google/protobuf/test_messages_proto2.proto b/src/google/protobuf/test_messages_proto2.proto
index c7b9c48..73bd626 100644
--- a/src/google/protobuf/test_messages_proto2.proto
+++ b/src/google/protobuf/test_messages_proto2.proto
@@ -40,6 +40,7 @@
package protobuf_test_messages.proto2;
option java_package = "com.google.protobuf_test_messages.proto2";
+option objc_class_prefix = "Proto2";
// This is the default, but we specify it here explicitly.
option optimize_for = SPEED;
@@ -295,3 +296,9 @@
message OneStringProto2 {
optional string data = 1;
}
+
+message ProtoWithKeywords {
+ optional int32 inline = 1;
+ optional string concept = 2;
+ repeated string requires = 3;
+}
diff --git a/src/google/protobuf/test_util.cc b/src/google/protobuf/test_util.cc
index 795cb6a..5fee8ff 100644
--- a/src/google/protobuf/test_util.cc
+++ b/src/google/protobuf/test_util.cc
@@ -38,7 +38,7 @@
#include <windows.h>
#endif
-#include <google/protobuf/test_util.h>
+#include "google/protobuf/test_util.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/test_util.h b/src/google/protobuf/test_util.h
index b18d7b6..5449ed6 100644
--- a/src/google/protobuf/test_util.h
+++ b/src/google/protobuf/test_util.h
@@ -35,17 +35,17 @@
#ifndef GOOGLE_PROTOBUF_TEST_UTIL_H__
#define GOOGLE_PROTOBUF_TEST_UTIL_H__
-#include <google/protobuf/unittest.pb.h>
+#include "google/protobuf/unittest.pb.h"
#define UNITTEST ::protobuf_unittest
#define UNITTEST_IMPORT ::protobuf_unittest_import
// Must be included when the preprocessor symbols above are defined.
-#include <google/protobuf/test_util.inc>
+#include "google/protobuf/test_util.inc"
#undef UNITTEST
#undef UNITTEST_IMPORT
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -63,6 +63,8 @@
// the latter case, ReflectionTester searches for extension fields in
// its file.
explicit ReflectionTester(const Descriptor* base_descriptor);
+ ReflectionTester(const ReflectionTester&) = delete;
+ ReflectionTester& operator=(const ReflectionTester&) = delete;
void SetAllFieldsViaReflection(Message* message);
void ModifyRepeatedFieldsViaReflection(Message* message);
@@ -120,8 +122,6 @@
void ExpectAllFieldsSetViaReflection1(const Message& message);
void ExpectAllFieldsSetViaReflection2(const Message& message);
void ExpectAllFieldsSetViaReflection3(const Message& message);
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ReflectionTester);
};
inline TestUtil::ReflectionTester::ReflectionTester(
@@ -1223,7 +1223,7 @@
"optional_foreign_message",
"optional_import_message",
};
- for (int i = 0; i < GOOGLE_ARRAYSIZE(fields); i++) {
+ for (int i = 0; i < ABSL_ARRAYSIZE(fields); i++) {
Message* released = reflection->ReleaseMessage(message, F(fields[i]));
switch (expected_release_state) {
case IS_NULL:
@@ -1272,6 +1272,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_TEST_UTIL_H__
diff --git a/src/google/protobuf/test_util.inc b/src/google/protobuf/test_util.inc
index 8d44afa..4512db2 100644
--- a/src/google/protobuf/test_util.inc
+++ b/src/google/protobuf/test_util.inc
@@ -37,11 +37,11 @@
// within an enclosing namespace and requires header files to be included
// out of this file.
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
#include <gtest/gtest.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/message.h>
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/message.h"
namespace google {
namespace protobuf {
@@ -1935,7 +1935,7 @@
message.GetExtension(UNITTEST::unpacked_sfixed64_extension, 1));
EXPECT_EQ(711, message.GetExtension(UNITTEST::unpacked_float_extension, 1));
EXPECT_EQ(712, message.GetExtension(UNITTEST::unpacked_double_extension, 1));
- EXPECT_EQ(false, message.GetExtension(UNITTEST::unpacked_bool_extension, 1));
+ EXPECT_FALSE(message.GetExtension(UNITTEST::unpacked_bool_extension, 1));
EXPECT_EQ(UNITTEST::FOREIGN_BAZ,
message.GetExtension(UNITTEST::unpacked_enum_extension, 1));
}
diff --git a/src/google/protobuf/test_util2.h b/src/google/protobuf/test_util2.h
index 540af63..1f51ec8 100644
--- a/src/google/protobuf/test_util2.h
+++ b/src/google/protobuf/test_util2.h
@@ -31,22 +31,29 @@
#ifndef GOOGLE_PROTOBUF_TEST_UTIL2_H__
#define GOOGLE_PROTOBUF_TEST_UTIL2_H__
-#include <google/protobuf/stubs/strutil.h>
+#include "google/protobuf/stubs/strutil.h"
-#include <google/protobuf/testing/googletest.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
-#include <google/protobuf/util/message_differencer.h>
+#include "google/protobuf/testing/googletest.h"
+#include "absl/strings/str_replace.h"
+#include "google/protobuf/io/zero_copy_stream.h"
+#include "google/protobuf/io/zero_copy_stream_impl_lite.h"
+#include "google/protobuf/util/message_differencer.h"
namespace google {
namespace protobuf {
namespace TestUtil {
-// Translate net/proto2/* -> google/protobuf/*
+// Translate net/proto2/* or third_party/protobuf/* to google/protobuf/*.
inline std::string TranslatePathToOpensource(const std::string& google3_path) {
- const std::string prefix = "net/proto2/";
- GOOGLE_CHECK(google3_path.find(prefix) == 0) << google3_path;
- std::string path = google3_path.substr(prefix.size());
+ std::string net_proto2 = "net/proto2/";
+ std::string third_party_protobuf = "third_party/protobuf/";
+ std::string path;
+ if (google3_path.find(net_proto2) == 0) {
+ path = google3_path.substr(net_proto2.size());
+ } else {
+ GOOGLE_CHECK(google3_path.find(third_party_protobuf) == 0) << google3_path;
+ path = google3_path.substr(third_party_protobuf.size());
+ }
path = StringReplace(path, "internal/", "", false);
path = StringReplace(path, "proto/", "", false);
diff --git a/src/google/protobuf/test_util_lite.cc b/src/google/protobuf/test_util_lite.cc
index 628f1a0..f09a218 100644
--- a/src/google/protobuf/test_util_lite.cc
+++ b/src/google/protobuf/test_util_lite.cc
@@ -32,12 +32,12 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/test_util_lite.h>
+#include "google/protobuf/test_util_lite.h"
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
#include <gtest/gtest.h>
-#include <google/protobuf/stubs/strutil.h>
+#include "absl/strings/string_view.h"
namespace google {
namespace protobuf {
@@ -326,7 +326,9 @@
EXPECT_EQ(310, message.repeated_sfixed64(1));
EXPECT_EQ(311, message.repeated_float(1));
EXPECT_EQ(312, message.repeated_double(1));
- EXPECT_EQ(false, message.repeated_bool(1));
+ // EXPECT_EQ(false, ...) triggers a compiler warning in some platforms.
+ // warning: converting ‘false’ to pointer type
+ EXPECT_FALSE(message.repeated_bool(1));
EXPECT_EQ("315", message.repeated_string(1));
EXPECT_EQ("316", message.repeated_bytes(1));
@@ -376,7 +378,7 @@
EXPECT_EQ(410, message.default_sfixed64());
EXPECT_EQ(411, message.default_float());
EXPECT_EQ(412, message.default_double());
- EXPECT_EQ(false, message.default_bool());
+ EXPECT_FALSE(message.default_bool());
EXPECT_EQ("415", message.default_string());
EXPECT_EQ("416", message.default_bytes());
@@ -439,7 +441,7 @@
EXPECT_EQ(0, message.optional_sfixed64());
EXPECT_EQ(0, message.optional_float());
EXPECT_EQ(0, message.optional_double());
- EXPECT_EQ(false, message.optional_bool());
+ EXPECT_FALSE(message.optional_bool());
EXPECT_EQ("", message.optional_string());
EXPECT_EQ("", message.optional_bytes());
@@ -728,7 +730,7 @@
EXPECT_EQ(710, message.packed_sfixed64(1));
EXPECT_EQ(711, message.packed_float(1));
EXPECT_EQ(712, message.packed_double(1));
- EXPECT_EQ(false, message.packed_bool(1));
+ EXPECT_FALSE(message.packed_bool(1));
EXPECT_EQ(unittest::FOREIGN_LITE_BAZ, message.packed_enum(1));
}
@@ -1256,8 +1258,7 @@
message.GetExtension(unittest::repeated_float_extension_lite, 1));
EXPECT_EQ(312,
message.GetExtension(unittest::repeated_double_extension_lite, 1));
- EXPECT_EQ(false,
- message.GetExtension(unittest::repeated_bool_extension_lite, 1));
+ EXPECT_FALSE(message.GetExtension(unittest::repeated_bool_extension_lite, 1));
EXPECT_EQ("315",
message.GetExtension(unittest::repeated_string_extension_lite, 1));
EXPECT_EQ("316",
@@ -1335,7 +1336,7 @@
message.GetExtension(unittest::default_sfixed64_extension_lite));
EXPECT_EQ(411, message.GetExtension(unittest::default_float_extension_lite));
EXPECT_EQ(412, message.GetExtension(unittest::default_double_extension_lite));
- EXPECT_EQ(false, message.GetExtension(unittest::default_bool_extension_lite));
+ EXPECT_FALSE(message.GetExtension(unittest::default_bool_extension_lite));
EXPECT_EQ("415",
message.GetExtension(unittest::default_string_extension_lite));
EXPECT_EQ("416",
@@ -1428,8 +1429,7 @@
message.GetExtension(unittest::optional_sfixed64_extension_lite));
EXPECT_EQ(0, message.GetExtension(unittest::optional_float_extension_lite));
EXPECT_EQ(0, message.GetExtension(unittest::optional_double_extension_lite));
- EXPECT_EQ(false,
- message.GetExtension(unittest::optional_bool_extension_lite));
+ EXPECT_FALSE(message.GetExtension(unittest::optional_bool_extension_lite));
EXPECT_EQ("", message.GetExtension(unittest::optional_string_extension_lite));
EXPECT_EQ("", message.GetExtension(unittest::optional_bytes_extension_lite));
@@ -1883,8 +1883,7 @@
message.GetExtension(unittest::packed_float_extension_lite, 1));
EXPECT_EQ(712,
message.GetExtension(unittest::packed_double_extension_lite, 1));
- EXPECT_EQ(false,
- message.GetExtension(unittest::packed_bool_extension_lite, 1));
+ EXPECT_FALSE(message.GetExtension(unittest::packed_bool_extension_lite, 1));
EXPECT_EQ(unittest::FOREIGN_LITE_BAZ,
message.GetExtension(unittest::packed_enum_extension_lite, 1));
}
diff --git a/src/google/protobuf/test_util_lite.h b/src/google/protobuf/test_util_lite.h
index 34edf94..7ed6029 100644
--- a/src/google/protobuf/test_util_lite.h
+++ b/src/google/protobuf/test_util_lite.h
@@ -35,7 +35,7 @@
#ifndef GOOGLE_PROTOBUF_TEST_UTIL_LITE_H__
#define GOOGLE_PROTOBUF_TEST_UTIL_LITE_H__
-#include <google/protobuf/unittest_lite.pb.h>
+#include "google/protobuf/unittest_lite.pb.h"
namespace google {
namespace protobuf {
@@ -45,6 +45,8 @@
class TestUtilLite {
public:
+ TestUtilLite() = delete;
+
// Set every field in the message to a unique value.
static void SetAllFields(unittest::TestAllTypesLite* message);
static void SetAllExtensions(unittest::TestAllExtensionsLite* message);
@@ -90,9 +92,6 @@
static void ExpectPackedClear(const unittest::TestPackedTypesLite& message);
static void ExpectPackedExtensionsClear(
const unittest::TestPackedExtensionsLite& message);
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TestUtilLite);
};
} // namespace protobuf
diff --git a/src/google/protobuf/testing/BUILD.bazel b/src/google/protobuf/testing/BUILD.bazel
new file mode 100644
index 0000000..20e37b6
--- /dev/null
+++ b/src/google/protobuf/testing/BUILD.bazel
@@ -0,0 +1,42 @@
+# Protobuf testing support.
+# This package contains testonly utilities used in C++ unit tests.
+
+load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test")
+load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
+load("//build_defs:cpp_opts.bzl", "COPTS", "LINK_OPTS")
+
+package(default_visibility = ["//:__subpackages__"])
+
+cc_library(
+ name = "testing",
+ testonly = 1,
+ srcs = [
+ "file.cc",
+ "googletest.cc",
+ ],
+ hdrs = [
+ "file.h",
+ "googletest.h",
+ ],
+ copts = COPTS,
+ include_prefix = "google/protobuf/testing",
+ linkopts = LINK_OPTS,
+ deps = [
+ "//:protobuf_lite", # for ShutdownProtobufLibrary
+ "//src/google/protobuf/io",
+ "//src/google/protobuf/stubs:lite",
+ "@com_google_absl//absl/strings",
+ "@com_google_googletest//:gtest",
+ ],
+)
+
+################################################################################
+# Distribution packaging
+################################################################################
+
+pkg_files(
+ name = "dist_files",
+ srcs = glob(["**/*"]),
+ strip_prefix = strip_prefix.from_root(""),
+ visibility = ["//src:__pkg__"],
+)
diff --git a/src/google/protobuf/testing/file.cc b/src/google/protobuf/testing/file.cc
index 7b62887..c4acd4b 100644
--- a/src/google/protobuf/testing/file.cc
+++ b/src/google/protobuf/testing/file.cc
@@ -31,7 +31,8 @@
// Author: kenton@google.com (Kenton Varda)
// emulates google3/file/base/file.cc
-#include <google/protobuf/testing/file.h>
+#include "google/protobuf/testing/file.h"
+
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
@@ -45,8 +46,8 @@
#endif
#include <errno.h>
-#include <google/protobuf/io/io_win32.h>
-#include <google/protobuf/stubs/logging.h>
+#include "google/protobuf/io/io_win32.h"
+#include "google/protobuf/stubs/logging.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/testing/file.h b/src/google/protobuf/testing/file.h
index f18f685..18348a6 100644
--- a/src/google/protobuf/testing/file.h
+++ b/src/google/protobuf/testing/file.h
@@ -34,7 +34,7 @@
#ifndef GOOGLE_PROTOBUF_TESTING_FILE_H__
#define GOOGLE_PROTOBUF_TESTING_FILE_H__
-#include <google/protobuf/stubs/common.h>
+#include "google/protobuf/stubs/common.h"
namespace google {
namespace protobuf {
@@ -45,6 +45,9 @@
// in tests.
class File {
public:
+ File(const File&) = delete;
+ File& operator=(const File&) = delete;
+
// Check if the file exists.
static bool Exists(const std::string& name);
@@ -96,9 +99,6 @@
bool /*is_default*/) {
return WriteStringToFile(contents, name);
}
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(File);
};
} // namespace protobuf
diff --git a/src/google/protobuf/testing/googletest.cc b/src/google/protobuf/testing/googletest.cc
index 88343f9..5f6a4fb 100644
--- a/src/google/protobuf/testing/googletest.cc
+++ b/src/google/protobuf/testing/googletest.cc
@@ -31,14 +31,18 @@
// Author: kenton@google.com (Kenton Varda)
// emulates google3/testing/base/public/googletest.cc
-#include <google/protobuf/testing/googletest.h>
-#include <google/protobuf/testing/file.h>
-#include <google/protobuf/io/io_win32.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <sys/stat.h>
-#include <sys/types.h>
+#include "google/protobuf/testing/googletest.h"
+
#include <errno.h>
#include <stdlib.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
+#include "absl/strings/match.h"
+#include "absl/strings/str_replace.h"
+#include "google/protobuf/io/io_win32.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "google/protobuf/testing/file.h"
#ifdef _MSC_VER
// #include <direct.h>
#else
@@ -144,13 +148,13 @@
}
// On Win32, tmpnam() returns a file prefixed with '\', but which is supposed
// to be used in the current working directory. WTF?
- if (HasPrefixString(result, "\\")) {
+ if (absl::StartsWith(result, "\\")) {
result.erase(0, 1);
}
// The Win32 API accepts forward slashes as a path delimiter as long as the
// path doesn't use the "\\?\" prefix.
// Let's avoid confusion and use only forward slashes.
- result = StringReplace(result, "\\", "/", true);
+ result = absl::StrReplaceAll(result, {{"\\", "/"}});
#endif // _WIN32
return result;
}
diff --git a/src/google/protobuf/testing/googletest.h b/src/google/protobuf/testing/googletest.h
index 6a0c694..87c8a41 100644
--- a/src/google/protobuf/testing/googletest.h
+++ b/src/google/protobuf/testing/googletest.h
@@ -34,11 +34,14 @@
#ifndef GOOGLE_PROTOBUF_GOOGLETEST_H__
#define GOOGLE_PROTOBUF_GOOGLETEST_H__
+#include <gmock/gmock.h>
+
#include <map>
#include <vector>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/logging.h>
-#include <gmock/gmock.h>
+
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/stubs/logging.h"
+
// Disable death tests if we use exceptions in CHECK().
#if !PROTOBUF_USE_EXCEPTIONS && defined(GTEST_HAS_DEATH_TEST) && \
!GTEST_OS_WINDOWS
@@ -81,6 +84,8 @@
class ScopedMemoryLog {
public:
ScopedMemoryLog();
+ ScopedMemoryLog(const ScopedMemoryLog&) = delete;
+ ScopedMemoryLog& operator=(const ScopedMemoryLog&) = delete;
virtual ~ScopedMemoryLog();
// Fetches all messages with the given severity level.
@@ -94,8 +99,6 @@
const std::string& message);
static ScopedMemoryLog* active_log_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ScopedMemoryLog);
};
} // namespace protobuf
diff --git a/src/google/protobuf/testing/zcgunzip.cc b/src/google/protobuf/testing/zcgunzip.cc
index 68f8172..facb1ca 100644
--- a/src/google/protobuf/testing/zcgunzip.cc
+++ b/src/google/protobuf/testing/zcgunzip.cc
@@ -53,8 +53,8 @@
#endif
#endif
-#include <google/protobuf/io/gzip_stream.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
+#include "google/protobuf/io/gzip_stream.h"
+#include "google/protobuf/io/zero_copy_stream_impl.h"
using google::protobuf::io::FileInputStream;
using google::protobuf::io::GzipInputStream;
diff --git a/src/google/protobuf/testing/zcgzip.cc b/src/google/protobuf/testing/zcgzip.cc
index 808d058..3ac2cf2 100644
--- a/src/google/protobuf/testing/zcgzip.cc
+++ b/src/google/protobuf/testing/zcgzip.cc
@@ -52,8 +52,8 @@
#endif
#endif
-#include <google/protobuf/io/gzip_stream.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
+#include "google/protobuf/io/gzip_stream.h"
+#include "google/protobuf/io/zero_copy_stream_impl.h"
using google::protobuf::io::FileOutputStream;
using google::protobuf::io::GzipOutputStream;
diff --git a/src/google/protobuf/text_format.cc b/src/google/protobuf/text_format.cc
index 1911049..cf2afa2 100644
--- a/src/google/protobuf/text_format.cc
+++ b/src/google/protobuf/text_format.cc
@@ -32,7 +32,7 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/text_format.h>
+#include "google/protobuf/text_format.h"
#include <float.h>
#include <stdio.h>
@@ -42,29 +42,35 @@
#include <climits>
#include <cmath>
#include <limits>
+#include <string>
#include <utility>
#include <vector>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/tokenizer.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/any.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/dynamic_message.h>
-#include <google/protobuf/io/strtod.h>
-#include <google/protobuf/map_field.h>
-#include <google/protobuf/message.h>
-#include <google/protobuf/repeated_field.h>
-#include <google/protobuf/unknown_field_set.h>
-#include <google/protobuf/wire_format_lite.h>
-#include <google/protobuf/stubs/map_util.h>
-#include <google/protobuf/stubs/stl_util.h>
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/io/tokenizer.h"
+#include "google/protobuf/io/zero_copy_stream.h"
+#include "google/protobuf/io/zero_copy_stream_impl.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "absl/strings/ascii.h"
+#include "absl/strings/escaping.h"
+#include "absl/strings/numbers.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/str_join.h"
+#include "absl/strings/string_view.h"
+#include "google/protobuf/any.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/dynamic_message.h"
+#include "google/protobuf/io/strtod.h"
+#include "google/protobuf/map_field.h"
+#include "google/protobuf/message.h"
+#include "google/protobuf/repeated_field.h"
+#include "google/protobuf/unknown_field_set.h"
+#include "google/protobuf/wire_format_lite.h"
+#include "google/protobuf/stubs/stl_util.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -175,14 +181,13 @@
index = 0;
}
- const std::vector<TextFormat::ParseLocationRange>* locations =
- FindOrNull(locations_, field);
- if (locations == nullptr ||
- index >= static_cast<int64_t>(locations->size())) {
+ auto it = locations_.find(field);
+ if (it == locations_.end() ||
+ index >= static_cast<int64_t>(it->second.size())) {
return TextFormat::ParseLocationRange();
}
- return (*locations)[index];
+ return it->second[static_cast<size_t>(index)];
}
TextFormat::ParseInfoTree* TextFormat::ParseInfoTree::GetTreeForNested(
@@ -197,7 +202,7 @@
return nullptr;
}
- return it->second[index].get();
+ return it->second[static_cast<size_t>(index)].get();
}
namespace {
@@ -294,6 +299,8 @@
// Consume the starting token.
tokenizer_.Next();
}
+ ParserImpl(const ParserImpl&) = delete;
+ ParserImpl& operator=(const ParserImpl&) = delete;
~ParserImpl() {}
// Parses the ASCII representation specified in input and saves the
@@ -368,8 +375,6 @@
static constexpr int64_t kint64max = std::numeric_limits<int64_t>::max();
static constexpr uint64_t kuint64max = std::numeric_limits<uint64_t>::max();
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ParserImpl);
-
// Reports an error with the given message with information indicating
// the position (as derived from the current token).
void ReportError(const std::string& message) {
@@ -429,7 +434,7 @@
std::string full_type_name, prefix;
DO(ConsumeAnyTypeUrl(&full_type_name, &prefix));
std::string prefix_and_full_type_name =
- StrCat(prefix, full_type_name);
+ absl::StrCat(prefix, full_type_name);
DO(ConsumeBeforeWhitespace("]"));
TryConsumeWhitespace();
// ':' is optional between message labels and values.
@@ -507,7 +512,7 @@
// field names.
if (field == nullptr) {
std::string lower_field_name = field_name;
- LowerString(&lower_field_name);
+ absl::AsciiStrToLower(&lower_field_name);
field = descriptor->FindFieldByName(lower_field_name);
// If the case-insensitive match worked but the field is NOT a group,
if (field != nullptr &&
@@ -523,7 +528,7 @@
if (field == nullptr && allow_case_insensitive_field_) {
std::string lower_field_name = field_name;
- LowerString(&lower_field_name);
+ absl::AsciiStrToLower(&lower_field_name);
field = descriptor->FindFieldByLowercaseName(lower_field_name);
}
@@ -695,7 +700,7 @@
const FieldDescriptor* field) {
if (--recursion_limit_ < 0) {
ReportError(
- StrCat("Message is too deep, the parser exceeded the "
+ absl::StrCat("Message is too deep, the parser exceeded the "
"configured recursion limit of ",
initial_recursion_limit_, "."));
return false;
@@ -731,7 +736,7 @@
bool SkipFieldMessage() {
if (--recursion_limit_ < 0) {
ReportError(
- StrCat("Message is too deep, the parser exceeded the "
+ absl::StrCat("Message is too deep, the parser exceeded the "
"configured recursion limit of ",
initial_recursion_limit_, "."));
return false;
@@ -845,7 +850,7 @@
} else if (LookingAt("-") ||
LookingAtType(io::Tokenizer::TYPE_INTEGER)) {
DO(ConsumeSignedInteger(&int_value, kint32max));
- value = StrCat(int_value); // for error reporting
+ value = absl::StrCat(int_value); // for error reporting
enum_value = enum_type->FindValueByNumber(int_value);
} else {
ReportError("Expected integer or identifier, got: " +
@@ -891,7 +896,7 @@
bool SkipFieldValue() {
if (--recursion_limit_ < 0) {
ReportError(
- StrCat("Message is too deep, the parser exceeded the "
+ absl::StrCat("Message is too deep, the parser exceeded the "
"configured recursion limit of ",
initial_recursion_limit_, "."));
return false;
@@ -905,16 +910,18 @@
return true;
}
if (TryConsume("[")) {
- while (true) {
- if (!LookingAt("{") && !LookingAt("<")) {
- DO(SkipFieldValue());
- } else {
- DO(SkipFieldMessage());
+ if (!TryConsume("]")) {
+ while (true) {
+ if (!LookingAt("{") && !LookingAt("<")) {
+ DO(SkipFieldValue());
+ } else {
+ DO(SkipFieldMessage());
+ }
+ if (TryConsume("]")) {
+ break;
+ }
+ DO(Consume(","));
}
- if (TryConsume("]")) {
- break;
- }
- DO(Consume(","));
}
++recursion_limit_;
return true;
@@ -957,7 +964,7 @@
// inf, inff, infinity, nan
if (has_minus && LookingAtType(io::Tokenizer::TYPE_IDENTIFIER)) {
std::string text = tokenizer_.current().text;
- LowerString(&text);
+ absl::AsciiStrToLower(&text);
if (text != "inf" &&
text != "infinity" && text != "nan") {
ReportError("Invalid float number: " + text);
@@ -981,7 +988,7 @@
}
// Consumes an identifier and saves its value in the identifier parameter.
- // Returns false if the token is not of type IDENTFIER.
+ // Returns false if the token is not of type IDENTIFIER.
bool ConsumeIdentifier(std::string* identifier) {
if (LookingAtType(io::Tokenizer::TYPE_IDENTIFIER)) {
*identifier = tokenizer_.current().text;
@@ -1162,7 +1169,7 @@
tokenizer_.Next();
} else if (LookingAtType(io::Tokenizer::TYPE_IDENTIFIER)) {
std::string text = tokenizer_.current().text;
- LowerString(&text);
+ absl::AsciiStrToLower(&text);
if (text == "inf" ||
text == "infinity") {
*value = std::numeric_limits<double>::infinity();
@@ -1284,7 +1291,7 @@
had_silent_marker_ = false;
if (LookingAtType(io::Tokenizer::TYPE_WHITESPACE)) {
if (tokenizer_.current().text ==
- StrCat(" ", internal::kDebugStringSilentMarkerForDetection)) {
+ absl::StrCat(" ", internal::kDebugStringSilentMarkerForDetection)) {
had_silent_marker_ = true;
}
tokenizer_.Next();
@@ -1300,6 +1307,8 @@
explicit ParserErrorCollector(TextFormat::Parser::ParserImpl* parser)
: parser_(parser) {}
+ ParserErrorCollector(const ParserErrorCollector&) = delete;
+ ParserErrorCollector& operator=(const ParserErrorCollector&) = delete;
~ParserErrorCollector() override {}
void AddError(int line, int column, const std::string& message) override {
@@ -1311,7 +1320,6 @@
}
private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ParserErrorCollector);
TextFormat::Parser::ParserImpl* parser_;
};
@@ -1362,6 +1370,8 @@
indent_level_(initial_indent_level),
initial_indent_level_(initial_indent_level) {}
+ TextGenerator(const TextGenerator&) = delete;
+ TextGenerator& operator=(const TextGenerator&) = delete;
~TextGenerator() override {
// Only BackUp() if we're sure we've successfully called Next() at least
// once.
@@ -1421,15 +1431,15 @@
// error.)
bool failed() const { return failed_; }
- void PrintMaybeWithMarker(StringPiece text) {
+ void PrintMaybeWithMarker(absl::string_view text) {
Print(text.data(), text.size());
if (ConsumeInsertSilentMarker()) {
PrintLiteral(internal::kDebugStringSilentMarker);
}
}
- void PrintMaybeWithMarker(StringPiece text_head,
- StringPiece text_tail) {
+ void PrintMaybeWithMarker(absl::string_view text_head,
+ absl::string_view text_tail) {
Print(text_head.data(), text_head.size());
if (ConsumeInsertSilentMarker()) {
PrintLiteral(internal::kDebugStringSilentMarker);
@@ -1438,8 +1448,6 @@
}
private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TextGenerator);
-
void Write(const char* data, size_t size) {
if (failed_) return;
if (size == 0) return;
@@ -1549,7 +1557,7 @@
void PrintString(const std::string& val,
TextFormat::BaseTextGenerator* generator) const override {
generator->PrintLiteral("\"");
- generator->PrintString(strings::Utf8SafeCEscape(val));
+ generator->PrintString(absl::Utf8SafeCEscape(val));
generator->PrintLiteral("\"");
}
void PrintBytes(const std::string& val,
@@ -1603,12 +1611,12 @@
namespace {
-bool CheckParseInputSize(StringPiece input,
+bool CheckParseInputSize(absl::string_view input,
io::ErrorCollector* error_collector) {
if (input.size() > INT_MAX) {
error_collector->AddError(
-1, 0,
- StrCat(
+ absl::StrCat(
"Input size too large: ", static_cast<int64_t>(input.size()),
" bytes", " > ", INT_MAX, " bytes."));
return false;
@@ -1635,7 +1643,7 @@
return MergeUsingImpl(input, output, &parser);
}
-bool TextFormat::Parser::ParseFromString(ConstStringParam input,
+bool TextFormat::Parser::ParseFromString(absl::string_view input,
Message* output) {
DO(CheckParseInputSize(input, error_collector_));
io::ArrayInputStream input_stream(input.data(), input.size());
@@ -1653,7 +1661,7 @@
return MergeUsingImpl(input, output, &parser);
}
-bool TextFormat::Parser::MergeFromString(ConstStringParam input,
+bool TextFormat::Parser::MergeFromString(absl::string_view input,
Message* output) {
DO(CheckParseInputSize(input, error_collector_));
io::ArrayInputStream input_stream(input.data(), input.size());
@@ -1669,7 +1677,7 @@
output->FindInitializationErrors(&missing_fields);
parser_impl->ReportError(-1, 0,
"Message missing required fields: " +
- Join(missing_fields, ", "));
+ absl::StrJoin(missing_fields, ", "));
return false;
}
return true;
@@ -1698,12 +1706,12 @@
return Parser().Merge(input, output);
}
-/* static */ bool TextFormat::ParseFromString(ConstStringParam input,
+/* static */ bool TextFormat::ParseFromString(absl::string_view input,
Message* output) {
return Parser().ParseFromString(input, output);
}
-/* static */ bool TextFormat::MergeFromString(ConstStringParam input,
+/* static */ bool TextFormat::MergeFromString(absl::string_view input,
Message* output) {
return Parser().MergeFromString(input, output);
}
@@ -1819,19 +1827,19 @@
}
void TextFormat::FastFieldValuePrinter::PrintInt32(
int32_t val, BaseTextGenerator* generator) const {
- generator->PrintString(StrCat(val));
+ generator->PrintString(absl::StrCat(val));
}
void TextFormat::FastFieldValuePrinter::PrintUInt32(
uint32_t val, BaseTextGenerator* generator) const {
- generator->PrintString(StrCat(val));
+ generator->PrintString(absl::StrCat(val));
}
void TextFormat::FastFieldValuePrinter::PrintInt64(
int64_t val, BaseTextGenerator* generator) const {
- generator->PrintString(StrCat(val));
+ generator->PrintString(absl::StrCat(val));
}
void TextFormat::FastFieldValuePrinter::PrintUInt64(
uint64_t val, BaseTextGenerator* generator) const {
- generator->PrintString(StrCat(val));
+ generator->PrintString(absl::StrCat(val));
}
void TextFormat::FastFieldValuePrinter::PrintFloat(
float val, BaseTextGenerator* generator) const {
@@ -1850,7 +1858,7 @@
void TextFormat::FastFieldValuePrinter::PrintString(
const std::string& val, BaseTextGenerator* generator) const {
generator->PrintLiteral("\"");
- generator->PrintString(CEscape(val));
+ generator->PrintString(absl::CEscape(val));
generator->PrintLiteral("\"");
}
void TextFormat::FastFieldValuePrinter::PrintBytes(
@@ -2290,7 +2298,7 @@
namespace internal {
class MapFieldPrinterHelper {
public:
- // DynamicMapSorter::Sort cannot be used because it enfores syncing with
+ // DynamicMapSorter::Sort cannot be used because it enforces syncing with
// repeated field.
static bool SortMap(const Message& message, const Reflection* reflection,
const FieldDescriptor* field,
@@ -2510,7 +2518,7 @@
// if use_field_number_ is true, prints field number instead
// of field name.
if (use_field_number_) {
- generator->PrintString(StrCat(field->number()));
+ generator->PrintString(absl::StrCat(field->number()));
return;
}
@@ -2589,7 +2597,7 @@
// it is possible for the user to force an unknown integer value. So we
// simply use the integer value itself as the enum value name in this
// case.
- printer->PrintEnum(enum_value, StrCat(enum_value), generator);
+ printer->PrintEnum(enum_value, absl::StrCat(enum_value), generator);
}
break;
}
@@ -2639,13 +2647,13 @@
int recursion_budget) const {
for (int i = 0; i < unknown_fields.field_count(); i++) {
const UnknownField& field = unknown_fields.field(i);
- std::string field_number = StrCat(field.number());
+ std::string field_number = absl::StrCat(field.number());
switch (field.type()) {
case UnknownField::TYPE_VARINT:
generator->PrintString(field_number);
generator->PrintMaybeWithMarker(": ");
- generator->PrintString(StrCat(field.varint()));
+ generator->PrintString(absl::StrCat(field.varint()));
if (single_line_mode_) {
generator->PrintLiteral(" ");
} else {
@@ -2656,7 +2664,7 @@
generator->PrintString(field_number);
generator->PrintMaybeWithMarker(": ", "0x");
generator->PrintString(
- StrCat(strings::Hex(field.fixed32(), strings::ZERO_PAD_8)));
+ absl::StrCat(absl::Hex(field.fixed32(), absl::kZeroPad8)));
if (single_line_mode_) {
generator->PrintLiteral(" ");
} else {
@@ -2668,7 +2676,7 @@
generator->PrintString(field_number);
generator->PrintMaybeWithMarker(": ", "0x");
generator->PrintString(
- StrCat(strings::Hex(field.fixed64(), strings::ZERO_PAD_16)));
+ absl::StrCat(absl::Hex(field.fixed64(), absl::kZeroPad16)));
if (single_line_mode_) {
generator->PrintLiteral(" ");
} else {
@@ -2708,7 +2716,7 @@
// This field is not parseable as a Message (or we ran out of
// recursion budget). So it is probably just a plain string.
generator->PrintMaybeWithMarker(": ", "\"");
- generator->PrintString(CEscape(value));
+ generator->PrintString(absl::CEscape(value));
if (single_line_mode_) {
generator->PrintLiteral("\" ");
} else {
@@ -2743,4 +2751,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/text_format.h b/src/google/protobuf/text_format.h
index e10bef7..bfae7e6 100644
--- a/src/google/protobuf/text_format.h
+++ b/src/google/protobuf/text_format.h
@@ -44,14 +44,16 @@
#include <string>
#include <vector>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/port.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/message.h>
-#include <google/protobuf/message_lite.h>
+#include "google/protobuf/port.h"
+#include "absl/strings/string_view.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/message.h"
+#include "google/protobuf/message_lite.h"
+#include "google/protobuf/port.h"
+
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
#ifdef SWIG
#error "You cannot SWIG proto headers"
@@ -76,6 +78,9 @@
// This class is really a namespace that contains only static methods.
class PROTOBUF_EXPORT TextFormat {
public:
+ TextFormat(const TextFormat&) = delete;
+ TextFormat& operator=(const TextFormat&) = delete;
+
// Outputs a textual representation of the given message to the given
// output stream. Returns false if printing fails.
static bool Print(const Message& message, io::ZeroCopyOutputStream* output);
@@ -131,6 +136,8 @@
class PROTOBUF_EXPORT FastFieldValuePrinter {
public:
FastFieldValuePrinter();
+ FastFieldValuePrinter(const FastFieldValuePrinter&) = delete;
+ FastFieldValuePrinter& operator=(const FastFieldValuePrinter&) = delete;
virtual ~FastFieldValuePrinter();
virtual void PrintBool(bool val, BaseTextGenerator* generator) const;
virtual void PrintInt32(int32_t val, BaseTextGenerator* generator) const;
@@ -167,15 +174,14 @@
virtual void PrintMessageEnd(const Message& message, int field_index,
int field_count, bool single_line_mode,
BaseTextGenerator* generator) const;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FastFieldValuePrinter);
};
// Deprecated: please use FastFieldValuePrinter instead.
class PROTOBUF_EXPORT FieldValuePrinter {
public:
FieldValuePrinter();
+ FieldValuePrinter(const FieldValuePrinter&) = delete;
+ FieldValuePrinter& operator=(const FieldValuePrinter&) = delete;
virtual ~FieldValuePrinter();
virtual std::string PrintBool(bool val) const;
virtual std::string PrintInt32(int32_t val) const;
@@ -199,18 +205,16 @@
private:
FastFieldValuePrinter delegate_;
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FieldValuePrinter);
};
class PROTOBUF_EXPORT MessagePrinter {
public:
MessagePrinter() {}
+ MessagePrinter(const MessagePrinter&) = delete;
+ MessagePrinter& operator=(const MessagePrinter&) = delete;
virtual ~MessagePrinter() {}
virtual void Print(const Message& message, bool single_line_mode,
BaseTextGenerator* generator) const = 0;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessagePrinter);
};
// Interface that Printers or Parsers can use to find extensions, or types
@@ -476,13 +480,13 @@
// google::protobuf::MessageLite::ParseFromString().
static bool Parse(io::ZeroCopyInputStream* input, Message* output);
// Like Parse(), but reads directly from a string.
- static bool ParseFromString(ConstStringParam input, Message* output);
+ static bool ParseFromString(absl::string_view input, Message* output);
// Like Parse(), but the data is merged into the given message, as if
// using Message::MergeFrom().
static bool Merge(io::ZeroCopyInputStream* input, Message* output);
// Like Merge(), but reads directly from a string.
- static bool MergeFromString(ConstStringParam input, Message* output);
+ static bool MergeFromString(absl::string_view input, Message* output);
// Parse the given text as a single field value and store it into the
// given field of the given message. If the field is a repeated field,
@@ -571,11 +575,11 @@
// Like TextFormat::Parse().
bool Parse(io::ZeroCopyInputStream* input, Message* output);
// Like TextFormat::ParseFromString().
- bool ParseFromString(ConstStringParam input, Message* output);
+ bool ParseFromString(absl::string_view input, Message* output);
// Like TextFormat::Merge().
bool Merge(io::ZeroCopyInputStream* input, Message* output);
// Like TextFormat::MergeFromString().
- bool MergeFromString(ConstStringParam input, Message* output);
+ bool MergeFromString(absl::string_view input, Message* output);
// Set where to report parse errors. If nullptr (the default), errors will
// be printed to stderr.
@@ -670,8 +674,6 @@
ParseLocationRange location);
static inline ParseInfoTree* CreateNested(ParseInfoTree* info_tree,
const FieldDescriptor* field);
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TextFormat);
};
inline void TextFormat::RecordLocation(ParseInfoTree* info_tree,
@@ -688,6 +690,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_TEXT_FORMAT_H__
diff --git a/src/google/protobuf/text_format_unittest.cc b/src/google/protobuf/text_format_unittest.cc
index 126f2f3..e11533d 100644
--- a/src/google/protobuf/text_format_unittest.cc
+++ b/src/google/protobuf/text_format_unittest.cc
@@ -32,7 +32,7 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/text_format.h>
+#include "google/protobuf/text_format.h"
#include <math.h>
#include <stdlib.h>
@@ -40,31 +40,35 @@
#include <atomic>
#include <limits>
#include <memory>
+#include <string>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/testing/file.h>
-#include <google/protobuf/testing/file.h>
-#include <google/protobuf/any.pb.h>
-#include <google/protobuf/map_unittest.pb.h>
-#include <google/protobuf/unittest.pb.h>
-#include <google/protobuf/unittest_mset.pb.h>
-#include <google/protobuf/unittest_mset_wire_format.pb.h>
-#include <google/protobuf/unittest_proto3.pb.h>
-#include <google/protobuf/io/tokenizer.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/stubs/strutil.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/testing/file.h"
+#include "google/protobuf/testing/file.h"
+#include "google/protobuf/any.pb.h"
+#include "google/protobuf/map_unittest.pb.h"
+#include "google/protobuf/unittest.pb.h"
+#include "google/protobuf/unittest_mset.pb.h"
+#include "google/protobuf/unittest_mset_wire_format.pb.h"
+#include "google/protobuf/unittest_proto3.pb.h"
+#include "google/protobuf/io/tokenizer.h"
+#include "google/protobuf/io/zero_copy_stream_impl.h"
+#include "google/protobuf/stubs/strutil.h"
#include <gmock/gmock.h>
-#include <google/protobuf/testing/googletest.h>
+#include "google/protobuf/testing/googletest.h"
#include <gtest/gtest.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/substitute.h>
-#include <google/protobuf/test_util.h>
-#include <google/protobuf/test_util2.h>
+#include "google/protobuf/stubs/logging.h"
+#include "absl/strings/escaping.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/str_replace.h"
+#include "absl/strings/substitute.h"
+#include "google/protobuf/test_util.h"
+#include "google/protobuf/test_util2.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -94,10 +98,9 @@
static void SetUpTestSuite() {
GOOGLE_CHECK_OK(File::GetContents(
TestUtil::GetTestDataPath(
- "net/proto2/internal/"
+ "third_party/protobuf/"
"testdata/text_format_unittest_data_oneof_implemented.txt"),
&static_proto_text_format_, true));
- CleanStringLineEndings(&static_proto_text_format_, false);
}
TextFormatTest() : proto_text_format_(static_proto_text_format_) {}
@@ -116,10 +119,9 @@
public:
static void SetUpTestSuite() {
GOOGLE_CHECK_OK(File::GetContents(
- TestUtil::GetTestDataPath("net/proto2/internal/testdata/"
+ TestUtil::GetTestDataPath("third_party/protobuf/testdata/"
"text_format_unittest_extensions_data.txt"),
&static_proto_text_format_, true));
- CleanStringLineEndings(&static_proto_text_format_, false);
}
TextFormatExtensionsTest() : proto_text_format_(static_proto_text_format_) {}
@@ -155,7 +157,7 @@
proto_.mutable_optional_foreign_message();
EXPECT_EQ(proto_.ShortDebugString(),
- StrCat("optional_int32: ", kDebugStringSilentMarker,
+ absl::StrCat("optional_int32: ", kDebugStringSilentMarker,
"1 "
"optional_string: \"hello\" "
"optional_nested_message { bb: 2 } "
@@ -229,7 +231,7 @@
// Hardcode a correct value to test against.
std::string correct_string =
- StrCat("optional_string: ", kDebugStringSilentMarker,
+ absl::StrCat("optional_string: ", kDebugStringSilentMarker,
kEscapeTestStringEscaped, "\n");
// Compare.
@@ -238,7 +240,7 @@
// the protocol buffer contains no UTF-8 text.
EXPECT_EQ(correct_string, utf8_debug_string);
- std::string expected_short_debug_string = StrCat(
+ std::string expected_short_debug_string = absl::StrCat(
"optional_string: ", kDebugStringSilentMarker, kEscapeTestStringEscaped);
EXPECT_EQ(expected_short_debug_string, proto_.ShortDebugString());
}
@@ -254,11 +256,11 @@
// Hardcode a correct value to test against.
std::string correct_utf8_string =
- StrCat("optional_string: ", kDebugStringSilentMarker,
+ absl::StrCat("optional_string: ", kDebugStringSilentMarker,
"\"\350\260\267\346\255\214\"\n"
"optional_bytes: \"\\350\\260\\267\\346\\255\\214\"\n");
std::string correct_string =
- StrCat("optional_string: ", kDebugStringSilentMarker,
+ absl::StrCat("optional_string: ", kDebugStringSilentMarker,
"\"\\350\\260\\267\\346\\255\\214\"\n"
"optional_bytes: \"\\350\\260\\267\\346\\255\\214\"\n");
@@ -283,7 +285,7 @@
unknown_fields->AddVarint(8, 2);
unknown_fields->AddVarint(8, 3);
- EXPECT_EQ(StrCat("5: ", kDebugStringSilentMarker,
+ EXPECT_EQ(absl::StrCat("5: ", kDebugStringSilentMarker,
"1\n"
"5: 0x00000002\n"
"5: 0x0000000000000003\n"
@@ -459,7 +461,7 @@
class CustomUInt32FieldValuePrinter : public TextFormat::FieldValuePrinter {
public:
std::string PrintUInt32(uint32_t val) const override {
- return StrCat(FieldValuePrinter::PrintUInt32(val), "u");
+ return absl::StrCat(FieldValuePrinter::PrintUInt32(val), "u");
}
};
@@ -483,7 +485,7 @@
class CustomInt32FieldValuePrinter : public TextFormat::FieldValuePrinter {
public:
std::string PrintInt32(int32_t val) const override {
- return StrCat("value-is(", FieldValuePrinter::PrintInt32(val), ")");
+ return absl::StrCat("value-is(", FieldValuePrinter::PrintInt32(val), ")");
}
};
@@ -534,8 +536,8 @@
class CustomMessageFieldValuePrinter : public TextFormat::FieldValuePrinter {
public:
std::string PrintInt32(int32_t v) const override {
- return StrCat(FieldValuePrinter::PrintInt32(v), " # x",
- strings::Hex(v));
+ return absl::StrCat(FieldValuePrinter::PrintInt32(v), " # x",
+ absl::Hex(v));
}
std::string PrintMessageStart(const Message& message, int field_index,
@@ -544,7 +546,7 @@
if (single_line_mode) {
return " { ";
}
- return StrCat(" { # ", message.GetDescriptor()->name(), ": ",
+ return absl::StrCat(" { # ", message.GetDescriptor()->name(), ": ",
field_index, "\n");
}
};
@@ -590,7 +592,7 @@
TextFormat::BaseTextGenerator* generator) const override {
if (message.ByteSizeLong() > 0) {
generator->PrintString(
- strings::Substitute("# REDACTED, $0 bytes\n", message.ByteSizeLong()));
+ absl::Substitute("# REDACTED, $0 bytes\n", message.ByteSizeLong()));
}
return true;
}
@@ -634,7 +636,7 @@
std::string PrintMessageStart(const Message& message, int field_index,
int field_count,
bool single_line_comment) const override {
- return StrCat(" { # 1\n", " # 2\n");
+ return absl::StrCat(" { # 1\n", " # 2\n");
}
};
@@ -817,7 +819,7 @@
TEST_F(TextFormatTest, ParseEnumFieldFromNumber) {
// Create a parse string with a numerical value for an enum field.
std::string parse_string =
- strings::Substitute("optional_nested_enum: $0", unittest::TestAllTypes::BAZ);
+ absl::Substitute("optional_nested_enum: $0", unittest::TestAllTypes::BAZ);
EXPECT_TRUE(TextFormat::ParseFromString(parse_string, &proto_));
EXPECT_TRUE(proto_.has_optional_nested_enum());
EXPECT_EQ(unittest::TestAllTypes::BAZ, proto_.optional_nested_enum());
@@ -826,7 +828,7 @@
TEST_F(TextFormatTest, ParseEnumFieldFromNegativeNumber) {
ASSERT_LT(unittest::SPARSE_E, 0);
std::string parse_string =
- strings::Substitute("sparse_enum: $0", unittest::SPARSE_E);
+ absl::Substitute("sparse_enum: $0", unittest::SPARSE_E);
unittest::SparseEnumMessage proto;
EXPECT_TRUE(TextFormat::ParseFromString(parse_string, &proto));
EXPECT_TRUE(proto.has_sparse_enum());
@@ -845,7 +847,7 @@
proto.add_repeated_nested_enum(
static_cast<proto3_unittest::TestAllTypes::NestedEnum>(-2147483648));
- EXPECT_EQ(StrCat("repeated_nested_enum: ", kDebugStringSilentMarker,
+ EXPECT_EQ(absl::StrCat("repeated_nested_enum: ", kDebugStringSilentMarker,
"10\n"
"repeated_nested_enum: -10\n"
"repeated_nested_enum: 2147483647\n"
@@ -1035,6 +1037,19 @@
EXPECT_EQ(4, proto_.repeatedgroup(1).a());
}
+TEST_F(TextFormatTest, ParseShortRepeatedUnknownEmpty) {
+ std::string parse_string =
+ "repeated_string: \"before\"\n"
+ "unknown_field: []\n"
+ "repeated_string: \"after\"\n";
+ TextFormat::Parser parser;
+ parser.AllowUnknownField(true);
+
+ ASSERT_TRUE(parser.ParseFromString(parse_string, &proto_));
+
+ EXPECT_EQ(2, proto_.repeated_string_size());
+}
+
TEST_F(TextFormatTest, Comments) {
// Test that comments are ignored.
@@ -1069,10 +1084,8 @@
// Some platforms (e.g. Windows) insist on padding the exponent to three
// digits when one or two would be just fine.
-static std::string RemoveRedundantZeros(std::string text) {
- text = StringReplace(text, "e+0", "e+", true);
- text = StringReplace(text, "e-0", "e-", true);
- return text;
+static std::string RemoveRedundantZeros(absl::string_view text) {
+ return absl::StrReplaceAll(text, {{"e+0", "e+"}, {"e-0", "e-"}});
}
TEST_F(TextFormatTest, PrintExotic) {
@@ -1103,7 +1116,7 @@
// have this problem, so we switched to that instead.
EXPECT_EQ(
- StrCat("repeated_int64: ", kDebugStringSilentMarker,
+ absl::StrCat("repeated_int64: ", kDebugStringSilentMarker,
"-9223372036854775808\n"
"repeated_uint64: 18446744073709551615\n"
"repeated_double: 123.456\n"
@@ -1163,7 +1176,7 @@
message.add_repeated_double(1.2345678987654e100);
message.add_repeated_double(1.23456789876543e100);
- EXPECT_EQ(StrCat("repeated_float: ", kDebugStringSilentMarker,
+ EXPECT_EQ(absl::StrCat("repeated_float: ", kDebugStringSilentMarker,
"1\n"
"repeated_float: 1.2\n"
"repeated_float: 1.23\n"
@@ -1401,7 +1414,7 @@
parser_.RecordErrorsTo(&error_collector);
EXPECT_EQ(expected_result, parser_.ParseFromString(input, proto))
<< input << " -> " << proto->DebugString();
- EXPECT_EQ(StrCat(line, ":", col, ": ", message, "\n"),
+ EXPECT_EQ(absl::StrCat(line, ":", col, ": ", message, "\n"),
error_collector.text_);
parser_.RecordErrorsTo(nullptr);
}
@@ -1442,7 +1455,7 @@
// implements ErrorCollector -------------------------------------
void AddError(int line, int column, const std::string& message) override {
- strings::SubstituteAndAppend(&text_, "$0:$1: $2\n", line + 1, column + 1,
+ absl::SubstituteAndAppend(&text_, "$0:$1: $2\n", line + 1, column + 1,
message);
}
@@ -1636,7 +1649,7 @@
// enum
EXPECT_FIELD(nested_enum, unittest::TestAllTypes::BAR, "BAR");
EXPECT_FIELD(nested_enum, unittest::TestAllTypes::BAZ,
- StrCat(unittest::TestAllTypes::BAZ));
+ absl::StrCat(unittest::TestAllTypes::BAZ));
EXPECT_INVALID(nested_enum, "FOOBAR");
// message
@@ -1904,12 +1917,12 @@
TEST_F(TextFormatParserTest, SetRecursionLimit) {
const char* format = "child: { $0 }";
std::string input;
- for (int i = 0; i < 100; ++i) input = strings::Substitute(format, input);
+ for (int i = 0; i < 100; ++i) input = absl::Substitute(format, input);
unittest::NestedTestAllTypes message;
ExpectSuccessAndTree(input, &message, nullptr);
- input = strings::Substitute(format, input);
+ input = absl::Substitute(format, input);
parser_.SetRecursionLimit(100);
ExpectMessage(input,
"Message is too deep, the parser exceeded the configured "
@@ -1923,8 +1936,8 @@
TEST_F(TextFormatParserTest, SetRecursionLimitUnknownFieldValue) {
const char* format = "[$0]";
std::string input = "\"test_value\"";
- for (int i = 0; i < 99; ++i) input = strings::Substitute(format, input);
- std::string not_deep_input = StrCat("unknown_nested_array: ", input);
+ for (int i = 0; i < 99; ++i) input = absl::Substitute(format, input);
+ std::string not_deep_input = absl::StrCat("unknown_nested_array: ", input);
parser_.AllowUnknownField(true);
parser_.SetRecursionLimit(100);
@@ -1932,8 +1945,8 @@
unittest::NestedTestAllTypes message;
ExpectSuccessAndTree(not_deep_input, &message, nullptr);
- input = strings::Substitute(format, input);
- std::string deep_input = StrCat("unknown_nested_array: ", input);
+ input = absl::Substitute(format, input);
+ std::string deep_input = absl::StrCat("unknown_nested_array: ", input);
ExpectMessage(
deep_input,
"WARNING:Message type \"protobuf_unittest.NestedTestAllTypes\" has no "
@@ -1948,7 +1961,7 @@
TEST_F(TextFormatParserTest, SetRecursionLimitUnknownFieldMessage) {
const char* format = "unknown_child: { $0 }";
std::string input;
- for (int i = 0; i < 100; ++i) input = strings::Substitute(format, input);
+ for (int i = 0; i < 100; ++i) input = absl::Substitute(format, input);
parser_.AllowUnknownField(true);
parser_.SetRecursionLimit(100);
@@ -1956,7 +1969,7 @@
unittest::NestedTestAllTypes message;
ExpectSuccessAndTree(input, &message, nullptr);
- input = strings::Substitute(format, input);
+ input = absl::Substitute(format, input);
ExpectMessage(
input,
"WARNING:Message type \"protobuf_unittest.NestedTestAllTypes\" has no "
@@ -2277,4 +2290,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/timestamp.pb.cc b/src/google/protobuf/timestamp.pb.cc
index 728a004..a62cdcf 100644
--- a/src/google/protobuf/timestamp.pb.cc
+++ b/src/google/protobuf/timestamp.pb.cc
@@ -1,25 +1,23 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: google/protobuf/timestamp.proto
-#include <google/protobuf/timestamp.pb.h>
+#include "google/protobuf/timestamp.pb.h"
#include <algorithm>
-
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/extension_set.h>
-#include <google/protobuf/wire_format_lite.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/generated_message_reflection.h>
-#include <google/protobuf/reflection_ops.h>
-#include <google/protobuf/wire_format.h>
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/extension_set.h"
+#include "google/protobuf/wire_format_lite.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/generated_message_reflection.h"
+#include "google/protobuf/reflection_ops.h"
+#include "google/protobuf/wire_format.h"
// @@protoc_insertion_point(includes)
-#include <google/protobuf/port_def.inc>
+// Must be included last.
+#include "google/protobuf/port_def.inc"
PROTOBUF_PRAGMA_INIT_SEG
-
namespace _pb = ::PROTOBUF_NAMESPACE_ID;
-namespace _pbi = _pb::internal;
-
+namespace _pbi = ::PROTOBUF_NAMESPACE_ID::internal;
PROTOBUF_NAMESPACE_OPEN
PROTOBUF_CONSTEXPR Timestamp::Timestamp(
::_pbi::ConstantInitialized): _impl_{
@@ -27,62 +25,88 @@
, /*decltype(_impl_.nanos_)*/0
, /*decltype(_impl_._cached_size_)*/{}} {}
struct TimestampDefaultTypeInternal {
- PROTOBUF_CONSTEXPR TimestampDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR TimestampDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~TimestampDefaultTypeInternal() {}
union {
Timestamp _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 TimestampDefaultTypeInternal _Timestamp_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 TimestampDefaultTypeInternal _Timestamp_default_instance_;
PROTOBUF_NAMESPACE_CLOSE
static ::_pb::Metadata file_level_metadata_google_2fprotobuf_2ftimestamp_2eproto[1];
-static constexpr ::_pb::EnumDescriptor const** file_level_enum_descriptors_google_2fprotobuf_2ftimestamp_2eproto = nullptr;
-static constexpr ::_pb::ServiceDescriptor const** file_level_service_descriptors_google_2fprotobuf_2ftimestamp_2eproto = nullptr;
-
-const uint32_t TableStruct_google_2fprotobuf_2ftimestamp_2eproto::offsets[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
- ~0u, // no _has_bits_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Timestamp, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Timestamp, _impl_.seconds_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Timestamp, _impl_.nanos_),
+static constexpr const ::_pb::EnumDescriptor**
+ file_level_enum_descriptors_google_2fprotobuf_2ftimestamp_2eproto = nullptr;
+static constexpr const ::_pb::ServiceDescriptor**
+ file_level_service_descriptors_google_2fprotobuf_2ftimestamp_2eproto = nullptr;
+const uint32_t TableStruct_google_2fprotobuf_2ftimestamp_2eproto::offsets[] PROTOBUF_SECTION_VARIABLE(
+ protodesc_cold) = {
+ ~0u, // no _has_bits_
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Timestamp, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Timestamp, _impl_.seconds_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Timestamp, _impl_.nanos_),
};
-static const ::_pbi::MigrationSchema schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
- { 0, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::Timestamp)},
+
+static const ::_pbi::MigrationSchema
+ schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
+ { 0, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::Timestamp)},
};
static const ::_pb::Message* const file_default_instances[] = {
- &::PROTOBUF_NAMESPACE_ID::_Timestamp_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_Timestamp_default_instance_._instance,
};
-
-const char descriptor_table_protodef_google_2fprotobuf_2ftimestamp_2eproto[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) =
- "\n\037google/protobuf/timestamp.proto\022\017googl"
- "e.protobuf\"+\n\tTimestamp\022\017\n\007seconds\030\001 \001(\003"
- "\022\r\n\005nanos\030\002 \001(\005B\205\001\n\023com.google.protobufB"
- "\016TimestampProtoP\001Z2google.golang.org/pro"
- "tobuf/types/known/timestamppb\370\001\001\242\002\003GPB\252\002"
- "\036Google.Protobuf.WellKnownTypesb\006proto3"
- ;
-static ::_pbi::once_flag descriptor_table_google_2fprotobuf_2ftimestamp_2eproto_once;
+const char descriptor_table_protodef_google_2fprotobuf_2ftimestamp_2eproto[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
+ "\n\037google/protobuf/timestamp.proto\022\017googl"
+ "e.protobuf\"+\n\tTimestamp\022\017\n\007seconds\030\001 \001(\003"
+ "\022\r\n\005nanos\030\002 \001(\005B\205\001\n\023com.google.protobufB"
+ "\016TimestampProtoP\001Z2google.golang.org/pro"
+ "tobuf/types/known/timestamppb\370\001\001\242\002\003GPB\252\002"
+ "\036Google.Protobuf.WellKnownTypesb\006proto3"
+};
+static ::absl::once_flag descriptor_table_google_2fprotobuf_2ftimestamp_2eproto_once;
const ::_pbi::DescriptorTable descriptor_table_google_2fprotobuf_2ftimestamp_2eproto = {
- false, false, 239, descriptor_table_protodef_google_2fprotobuf_2ftimestamp_2eproto,
+ false,
+ false,
+ 239,
+ descriptor_table_protodef_google_2fprotobuf_2ftimestamp_2eproto,
"google/protobuf/timestamp.proto",
- &descriptor_table_google_2fprotobuf_2ftimestamp_2eproto_once, nullptr, 0, 1,
- schemas, file_default_instances, TableStruct_google_2fprotobuf_2ftimestamp_2eproto::offsets,
- file_level_metadata_google_2fprotobuf_2ftimestamp_2eproto, file_level_enum_descriptors_google_2fprotobuf_2ftimestamp_2eproto,
+ &descriptor_table_google_2fprotobuf_2ftimestamp_2eproto_once,
+ nullptr,
+ 0,
+ 1,
+ schemas,
+ file_default_instances,
+ TableStruct_google_2fprotobuf_2ftimestamp_2eproto::offsets,
+ file_level_metadata_google_2fprotobuf_2ftimestamp_2eproto,
+ file_level_enum_descriptors_google_2fprotobuf_2ftimestamp_2eproto,
file_level_service_descriptors_google_2fprotobuf_2ftimestamp_2eproto,
};
+
+// This function exists to be marked as weak.
+// It can significantly speed up compilation by breaking up LLVM's SCC
+// in the .pb.cc translation units. Large translation units see a
+// reduction of more than 35% of walltime for optimized builds. Without
+// the weak attribute all the messages in the file, including all the
+// vtables and everything they use become part of the same SCC through
+// a cycle like:
+// GetMetadata -> descriptor table -> default instances ->
+// vtables -> GetMetadata
+// By adding a weak function here we break the connection from the
+// individual vtables back into the descriptor table.
PROTOBUF_ATTRIBUTE_WEAK const ::_pbi::DescriptorTable* descriptor_table_google_2fprotobuf_2ftimestamp_2eproto_getter() {
return &descriptor_table_google_2fprotobuf_2ftimestamp_2eproto;
}
-
// Force running AddDescriptors() at dynamic initialization time.
-PROTOBUF_ATTRIBUTE_INIT_PRIORITY2 static ::_pbi::AddDescriptorsRunner dynamic_init_dummy_google_2fprotobuf_2ftimestamp_2eproto(&descriptor_table_google_2fprotobuf_2ftimestamp_2eproto);
+PROTOBUF_ATTRIBUTE_INIT_PRIORITY2
+static ::_pbi::AddDescriptorsRunner dynamic_init_dummy_google_2fprotobuf_2ftimestamp_2eproto(&descriptor_table_google_2fprotobuf_2ftimestamp_2eproto);
PROTOBUF_NAMESPACE_OPEN
-
// ===================================================================
class Timestamp::_Internal {
@@ -293,7 +317,6 @@
&descriptor_table_google_2fprotobuf_2ftimestamp_2eproto_getter, &descriptor_table_google_2fprotobuf_2ftimestamp_2eproto_once,
file_level_metadata_google_2fprotobuf_2ftimestamp_2eproto[0]);
}
-
// @@protoc_insertion_point(namespace_scope)
PROTOBUF_NAMESPACE_CLOSE
PROTOBUF_NAMESPACE_OPEN
@@ -302,6 +325,5 @@
return Arena::CreateMessageInternal< ::PROTOBUF_NAMESPACE_ID::Timestamp >(arena);
}
PROTOBUF_NAMESPACE_CLOSE
-
// @@protoc_insertion_point(global_scope)
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/timestamp.pb.h b/src/google/protobuf/timestamp.pb.h
index 5c196f8..64f0d59 100644
--- a/src/google/protobuf/timestamp.pb.h
+++ b/src/google/protobuf/timestamp.pb.h
@@ -1,38 +1,43 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: google/protobuf/timestamp.proto
-#ifndef GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2ftimestamp_2eproto
-#define GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2ftimestamp_2eproto
+#ifndef GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2ftimestamp_2eproto_2epb_2eh
+#define GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2ftimestamp_2eproto_2epb_2eh
#include <limits>
#include <string>
+#include <type_traits>
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
#if PROTOBUF_VERSION < 3021000
-#error This file was generated by a newer version of protoc which is
-#error incompatible with your Protocol Buffer headers. Please update
-#error your headers.
-#endif
-#if 3021007 < PROTOBUF_MIN_PROTOC_VERSION
-#error This file was generated by an older version of protoc which is
-#error incompatible with your Protocol Buffer headers. Please
-#error regenerate this file with a newer version of protoc.
-#endif
+#error "This file was generated by a newer version of protoc which is"
+#error "incompatible with your Protocol Buffer headers. Please update"
+#error "your headers."
+#endif // PROTOBUF_VERSION
-#include <google/protobuf/port_undef.inc>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/arena.h>
-#include <google/protobuf/arenastring.h>
-#include <google/protobuf/generated_message_util.h>
-#include <google/protobuf/metadata_lite.h>
-#include <google/protobuf/generated_message_reflection.h>
-#include <google/protobuf/message.h>
-#include <google/protobuf/repeated_field.h> // IWYU pragma: export
-#include <google/protobuf/extension_set.h> // IWYU pragma: export
-#include <google/protobuf/unknown_field_set.h>
+#if 3021007 < PROTOBUF_MIN_PROTOC_VERSION
+#error "This file was generated by an older version of protoc which is"
+#error "incompatible with your Protocol Buffer headers. Please"
+#error "regenerate this file with a newer version of protoc."
+#endif // PROTOBUF_MIN_PROTOC_VERSION
+#include "google/protobuf/port_undef.inc"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/arena.h"
+#include "google/protobuf/arenastring.h"
+#include "google/protobuf/generated_message_util.h"
+#include "google/protobuf/metadata_lite.h"
+#include "google/protobuf/generated_message_reflection.h"
+#include "google/protobuf/message.h"
+#include "google/protobuf/repeated_field.h" // IWYU pragma: export
+#include "google/protobuf/extension_set.h" // IWYU pragma: export
+#include "google/protobuf/unknown_field_set.h"
// @@protoc_insertion_point(includes)
-#include <google/protobuf/port_def.inc>
+
+// Must be included last.
+#include "google/protobuf/port_def.inc"
+
#define PROTOBUF_INTERNAL_EXPORT_google_2fprotobuf_2ftimestamp_2eproto PROTOBUF_EXPORT
+
PROTOBUF_NAMESPACE_OPEN
namespace internal {
class AnyMetadata;
@@ -43,19 +48,23 @@
struct PROTOBUF_EXPORT TableStruct_google_2fprotobuf_2ftimestamp_2eproto {
static const uint32_t offsets[];
};
-PROTOBUF_EXPORT extern const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_google_2fprotobuf_2ftimestamp_2eproto;
+PROTOBUF_EXPORT extern const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable
+ descriptor_table_google_2fprotobuf_2ftimestamp_2eproto;
PROTOBUF_NAMESPACE_OPEN
class Timestamp;
struct TimestampDefaultTypeInternal;
PROTOBUF_EXPORT extern TimestampDefaultTypeInternal _Timestamp_default_instance_;
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::Timestamp* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::Timestamp>(Arena*);
PROTOBUF_NAMESPACE_CLOSE
-PROTOBUF_NAMESPACE_OPEN
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::Timestamp* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::Timestamp>(Arena*);
-PROTOBUF_NAMESPACE_CLOSE
+
PROTOBUF_NAMESPACE_OPEN
// ===================================================================
+
+// -------------------------------------------------------------------
+
class PROTOBUF_EXPORT Timestamp final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.Timestamp) */ {
public:
@@ -159,7 +168,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.Timestamp";
}
protected:
@@ -216,12 +225,17 @@
// ===================================================================
+
+
// ===================================================================
+
#ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wstrict-aliasing"
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wstrict-aliasing"
#endif // __GNUC__
+// -------------------------------------------------------------------
+
// Timestamp
// int64 seconds = 1;
@@ -236,7 +250,7 @@
return _internal_seconds();
}
inline void Timestamp::_internal_set_seconds(int64_t value) {
-
+
_impl_.seconds_ = value;
}
inline void Timestamp::set_seconds(int64_t value) {
@@ -256,7 +270,7 @@
return _internal_nanos();
}
inline void Timestamp::_internal_set_nanos(int32_t value) {
-
+
_impl_.nanos_ = value;
}
inline void Timestamp::set_nanos(int32_t value) {
@@ -265,14 +279,15 @@
}
#ifdef __GNUC__
- #pragma GCC diagnostic pop
+#pragma GCC diagnostic pop
#endif // __GNUC__
// @@protoc_insertion_point(namespace_scope)
-
PROTOBUF_NAMESPACE_CLOSE
+
// @@protoc_insertion_point(global_scope)
-#include <google/protobuf/port_undef.inc>
-#endif // GOOGLE_PROTOBUF_INCLUDED_GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2ftimestamp_2eproto
+#include "google/protobuf/port_undef.inc"
+
+#endif // GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2ftimestamp_2eproto_2epb_2eh
diff --git a/src/google/protobuf/type.pb.cc b/src/google/protobuf/type.pb.cc
index e29bbb8..cdebb41 100644
--- a/src/google/protobuf/type.pb.cc
+++ b/src/google/protobuf/type.pb.cc
@@ -1,25 +1,23 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: google/protobuf/type.proto
-#include <google/protobuf/type.pb.h>
+#include "google/protobuf/type.pb.h"
#include <algorithm>
-
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/extension_set.h>
-#include <google/protobuf/wire_format_lite.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/generated_message_reflection.h>
-#include <google/protobuf/reflection_ops.h>
-#include <google/protobuf/wire_format.h>
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/extension_set.h"
+#include "google/protobuf/wire_format_lite.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/generated_message_reflection.h"
+#include "google/protobuf/reflection_ops.h"
+#include "google/protobuf/wire_format.h"
// @@protoc_insertion_point(includes)
-#include <google/protobuf/port_def.inc>
+// Must be included last.
+#include "google/protobuf/port_def.inc"
PROTOBUF_PRAGMA_INIT_SEG
-
namespace _pb = ::PROTOBUF_NAMESPACE_ID;
-namespace _pbi = _pb::internal;
-
+namespace _pbi = ::PROTOBUF_NAMESPACE_ID::internal;
PROTOBUF_NAMESPACE_OPEN
PROTOBUF_CONSTEXPR Type::Type(
::_pbi::ConstantInitialized): _impl_{
@@ -31,14 +29,15 @@
, /*decltype(_impl_.syntax_)*/0
, /*decltype(_impl_._cached_size_)*/{}} {}
struct TypeDefaultTypeInternal {
- PROTOBUF_CONSTEXPR TypeDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR TypeDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~TypeDefaultTypeInternal() {}
union {
Type _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 TypeDefaultTypeInternal _Type_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 TypeDefaultTypeInternal _Type_default_instance_;
PROTOBUF_CONSTEXPR Field::Field(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_.options_)*/{}
@@ -53,14 +52,15 @@
, /*decltype(_impl_.packed_)*/false
, /*decltype(_impl_._cached_size_)*/{}} {}
struct FieldDefaultTypeInternal {
- PROTOBUF_CONSTEXPR FieldDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR FieldDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~FieldDefaultTypeInternal() {}
union {
Field _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 FieldDefaultTypeInternal _Field_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 FieldDefaultTypeInternal _Field_default_instance_;
PROTOBUF_CONSTEXPR Enum::Enum(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_.enumvalue_)*/{}
@@ -70,14 +70,15 @@
, /*decltype(_impl_.syntax_)*/0
, /*decltype(_impl_._cached_size_)*/{}} {}
struct EnumDefaultTypeInternal {
- PROTOBUF_CONSTEXPR EnumDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR EnumDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~EnumDefaultTypeInternal() {}
union {
Enum _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 EnumDefaultTypeInternal _Enum_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 EnumDefaultTypeInternal _Enum_default_instance_;
PROTOBUF_CONSTEXPR EnumValue::EnumValue(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_.options_)*/{}
@@ -85,168 +86,204 @@
, /*decltype(_impl_.number_)*/0
, /*decltype(_impl_._cached_size_)*/{}} {}
struct EnumValueDefaultTypeInternal {
- PROTOBUF_CONSTEXPR EnumValueDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR EnumValueDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~EnumValueDefaultTypeInternal() {}
union {
EnumValue _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 EnumValueDefaultTypeInternal _EnumValue_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 EnumValueDefaultTypeInternal _EnumValue_default_instance_;
PROTOBUF_CONSTEXPR Option::Option(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_.name_)*/{&::_pbi::fixed_address_empty_string, ::_pbi::ConstantInitialized{}}
, /*decltype(_impl_.value_)*/nullptr
, /*decltype(_impl_._cached_size_)*/{}} {}
struct OptionDefaultTypeInternal {
- PROTOBUF_CONSTEXPR OptionDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR OptionDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~OptionDefaultTypeInternal() {}
union {
Option _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 OptionDefaultTypeInternal _Option_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 OptionDefaultTypeInternal _Option_default_instance_;
PROTOBUF_NAMESPACE_CLOSE
static ::_pb::Metadata file_level_metadata_google_2fprotobuf_2ftype_2eproto[5];
static const ::_pb::EnumDescriptor* file_level_enum_descriptors_google_2fprotobuf_2ftype_2eproto[3];
-static constexpr ::_pb::ServiceDescriptor const** file_level_service_descriptors_google_2fprotobuf_2ftype_2eproto = nullptr;
-
-const uint32_t TableStruct_google_2fprotobuf_2ftype_2eproto::offsets[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
- ~0u, // no _has_bits_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Type, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Type, _impl_.name_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Type, _impl_.fields_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Type, _impl_.oneofs_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Type, _impl_.options_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Type, _impl_.source_context_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Type, _impl_.syntax_),
- ~0u, // no _has_bits_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Field, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Field, _impl_.kind_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Field, _impl_.cardinality_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Field, _impl_.number_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Field, _impl_.name_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Field, _impl_.type_url_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Field, _impl_.oneof_index_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Field, _impl_.packed_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Field, _impl_.options_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Field, _impl_.json_name_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Field, _impl_.default_value_),
- ~0u, // no _has_bits_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Enum, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Enum, _impl_.name_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Enum, _impl_.enumvalue_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Enum, _impl_.options_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Enum, _impl_.source_context_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Enum, _impl_.syntax_),
- ~0u, // no _has_bits_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumValue, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumValue, _impl_.name_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumValue, _impl_.number_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumValue, _impl_.options_),
- ~0u, // no _has_bits_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Option, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Option, _impl_.name_),
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Option, _impl_.value_),
+static constexpr const ::_pb::ServiceDescriptor**
+ file_level_service_descriptors_google_2fprotobuf_2ftype_2eproto = nullptr;
+const uint32_t TableStruct_google_2fprotobuf_2ftype_2eproto::offsets[] PROTOBUF_SECTION_VARIABLE(
+ protodesc_cold) = {
+ ~0u, // no _has_bits_
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Type, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Type, _impl_.name_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Type, _impl_.fields_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Type, _impl_.oneofs_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Type, _impl_.options_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Type, _impl_.source_context_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Type, _impl_.syntax_),
+ ~0u, // no _has_bits_
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Field, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Field, _impl_.kind_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Field, _impl_.cardinality_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Field, _impl_.number_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Field, _impl_.name_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Field, _impl_.type_url_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Field, _impl_.oneof_index_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Field, _impl_.packed_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Field, _impl_.options_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Field, _impl_.json_name_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Field, _impl_.default_value_),
+ ~0u, // no _has_bits_
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Enum, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Enum, _impl_.name_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Enum, _impl_.enumvalue_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Enum, _impl_.options_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Enum, _impl_.source_context_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Enum, _impl_.syntax_),
+ ~0u, // no _has_bits_
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumValue, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumValue, _impl_.name_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumValue, _impl_.number_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::EnumValue, _impl_.options_),
+ ~0u, // no _has_bits_
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Option, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Option, _impl_.name_),
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Option, _impl_.value_),
};
-static const ::_pbi::MigrationSchema schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
- { 0, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::Type)},
- { 12, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::Field)},
- { 28, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::Enum)},
- { 39, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::EnumValue)},
- { 48, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::Option)},
+
+static const ::_pbi::MigrationSchema
+ schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
+ { 0, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::Type)},
+ { 14, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::Field)},
+ { 32, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::Enum)},
+ { 45, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::EnumValue)},
+ { 56, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::Option)},
};
static const ::_pb::Message* const file_default_instances[] = {
- &::PROTOBUF_NAMESPACE_ID::_Type_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::_Field_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::_Enum_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::_EnumValue_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::_Option_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_Type_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_Field_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_Enum_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_EnumValue_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_Option_default_instance_._instance,
};
-
-const char descriptor_table_protodef_google_2fprotobuf_2ftype_2eproto[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) =
- "\n\032google/protobuf/type.proto\022\017google.pro"
- "tobuf\032\031google/protobuf/any.proto\032$google"
- "/protobuf/source_context.proto\"\327\001\n\004Type\022"
- "\014\n\004name\030\001 \001(\t\022&\n\006fields\030\002 \003(\0132\026.google.p"
- "rotobuf.Field\022\016\n\006oneofs\030\003 \003(\t\022(\n\007options"
- "\030\004 \003(\0132\027.google.protobuf.Option\0226\n\016sourc"
- "e_context\030\005 \001(\0132\036.google.protobuf.Source"
- "Context\022\'\n\006syntax\030\006 \001(\0162\027.google.protobu"
- "f.Syntax\"\325\005\n\005Field\022)\n\004kind\030\001 \001(\0162\033.googl"
- "e.protobuf.Field.Kind\0227\n\013cardinality\030\002 \001"
- "(\0162\".google.protobuf.Field.Cardinality\022\016"
- "\n\006number\030\003 \001(\005\022\014\n\004name\030\004 \001(\t\022\020\n\010type_url"
- "\030\006 \001(\t\022\023\n\013oneof_index\030\007 \001(\005\022\016\n\006packed\030\010 "
- "\001(\010\022(\n\007options\030\t \003(\0132\027.google.protobuf.O"
- "ption\022\021\n\tjson_name\030\n \001(\t\022\025\n\rdefault_valu"
- "e\030\013 \001(\t\"\310\002\n\004Kind\022\020\n\014TYPE_UNKNOWN\020\000\022\017\n\013TY"
- "PE_DOUBLE\020\001\022\016\n\nTYPE_FLOAT\020\002\022\016\n\nTYPE_INT6"
- "4\020\003\022\017\n\013TYPE_UINT64\020\004\022\016\n\nTYPE_INT32\020\005\022\020\n\014"
- "TYPE_FIXED64\020\006\022\020\n\014TYPE_FIXED32\020\007\022\r\n\tTYPE"
- "_BOOL\020\010\022\017\n\013TYPE_STRING\020\t\022\016\n\nTYPE_GROUP\020\n"
- "\022\020\n\014TYPE_MESSAGE\020\013\022\016\n\nTYPE_BYTES\020\014\022\017\n\013TY"
- "PE_UINT32\020\r\022\r\n\tTYPE_ENUM\020\016\022\021\n\rTYPE_SFIXE"
- "D32\020\017\022\021\n\rTYPE_SFIXED64\020\020\022\017\n\013TYPE_SINT32\020"
- "\021\022\017\n\013TYPE_SINT64\020\022\"t\n\013Cardinality\022\027\n\023CAR"
- "DINALITY_UNKNOWN\020\000\022\030\n\024CARDINALITY_OPTION"
- "AL\020\001\022\030\n\024CARDINALITY_REQUIRED\020\002\022\030\n\024CARDIN"
- "ALITY_REPEATED\020\003\"\316\001\n\004Enum\022\014\n\004name\030\001 \001(\t\022"
- "-\n\tenumvalue\030\002 \003(\0132\032.google.protobuf.Enu"
- "mValue\022(\n\007options\030\003 \003(\0132\027.google.protobu"
- "f.Option\0226\n\016source_context\030\004 \001(\0132\036.googl"
- "e.protobuf.SourceContext\022\'\n\006syntax\030\005 \001(\016"
- "2\027.google.protobuf.Syntax\"S\n\tEnumValue\022\014"
- "\n\004name\030\001 \001(\t\022\016\n\006number\030\002 \001(\005\022(\n\007options\030"
- "\003 \003(\0132\027.google.protobuf.Option\";\n\006Option"
- "\022\014\n\004name\030\001 \001(\t\022#\n\005value\030\002 \001(\0132\024.google.p"
- "rotobuf.Any*.\n\006Syntax\022\021\n\rSYNTAX_PROTO2\020\000"
- "\022\021\n\rSYNTAX_PROTO3\020\001B{\n\023com.google.protob"
- "ufB\tTypeProtoP\001Z-google.golang.org/proto"
- "buf/types/known/typepb\370\001\001\242\002\003GPB\252\002\036Google"
- ".Protobuf.WellKnownTypesb\006proto3"
- ;
-static const ::_pbi::DescriptorTable* const descriptor_table_google_2fprotobuf_2ftype_2eproto_deps[2] = {
- &::descriptor_table_google_2fprotobuf_2fany_2eproto,
- &::descriptor_table_google_2fprotobuf_2fsource_5fcontext_2eproto,
+const char descriptor_table_protodef_google_2fprotobuf_2ftype_2eproto[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
+ "\n\032google/protobuf/type.proto\022\017google.pro"
+ "tobuf\032\031google/protobuf/any.proto\032$google"
+ "/protobuf/source_context.proto\"\327\001\n\004Type\022"
+ "\014\n\004name\030\001 \001(\t\022&\n\006fields\030\002 \003(\0132\026.google.p"
+ "rotobuf.Field\022\016\n\006oneofs\030\003 \003(\t\022(\n\007options"
+ "\030\004 \003(\0132\027.google.protobuf.Option\0226\n\016sourc"
+ "e_context\030\005 \001(\0132\036.google.protobuf.Source"
+ "Context\022\'\n\006syntax\030\006 \001(\0162\027.google.protobu"
+ "f.Syntax\"\325\005\n\005Field\022)\n\004kind\030\001 \001(\0162\033.googl"
+ "e.protobuf.Field.Kind\0227\n\013cardinality\030\002 \001"
+ "(\0162\".google.protobuf.Field.Cardinality\022\016"
+ "\n\006number\030\003 \001(\005\022\014\n\004name\030\004 \001(\t\022\020\n\010type_url"
+ "\030\006 \001(\t\022\023\n\013oneof_index\030\007 \001(\005\022\016\n\006packed\030\010 "
+ "\001(\010\022(\n\007options\030\t \003(\0132\027.google.protobuf.O"
+ "ption\022\021\n\tjson_name\030\n \001(\t\022\025\n\rdefault_valu"
+ "e\030\013 \001(\t\"\310\002\n\004Kind\022\020\n\014TYPE_UNKNOWN\020\000\022\017\n\013TY"
+ "PE_DOUBLE\020\001\022\016\n\nTYPE_FLOAT\020\002\022\016\n\nTYPE_INT6"
+ "4\020\003\022\017\n\013TYPE_UINT64\020\004\022\016\n\nTYPE_INT32\020\005\022\020\n\014"
+ "TYPE_FIXED64\020\006\022\020\n\014TYPE_FIXED32\020\007\022\r\n\tTYPE"
+ "_BOOL\020\010\022\017\n\013TYPE_STRING\020\t\022\016\n\nTYPE_GROUP\020\n"
+ "\022\020\n\014TYPE_MESSAGE\020\013\022\016\n\nTYPE_BYTES\020\014\022\017\n\013TY"
+ "PE_UINT32\020\r\022\r\n\tTYPE_ENUM\020\016\022\021\n\rTYPE_SFIXE"
+ "D32\020\017\022\021\n\rTYPE_SFIXED64\020\020\022\017\n\013TYPE_SINT32\020"
+ "\021\022\017\n\013TYPE_SINT64\020\022\"t\n\013Cardinality\022\027\n\023CAR"
+ "DINALITY_UNKNOWN\020\000\022\030\n\024CARDINALITY_OPTION"
+ "AL\020\001\022\030\n\024CARDINALITY_REQUIRED\020\002\022\030\n\024CARDIN"
+ "ALITY_REPEATED\020\003\"\316\001\n\004Enum\022\014\n\004name\030\001 \001(\t\022"
+ "-\n\tenumvalue\030\002 \003(\0132\032.google.protobuf.Enu"
+ "mValue\022(\n\007options\030\003 \003(\0132\027.google.protobu"
+ "f.Option\0226\n\016source_context\030\004 \001(\0132\036.googl"
+ "e.protobuf.SourceContext\022\'\n\006syntax\030\005 \001(\016"
+ "2\027.google.protobuf.Syntax\"S\n\tEnumValue\022\014"
+ "\n\004name\030\001 \001(\t\022\016\n\006number\030\002 \001(\005\022(\n\007options\030"
+ "\003 \003(\0132\027.google.protobuf.Option\";\n\006Option"
+ "\022\014\n\004name\030\001 \001(\t\022#\n\005value\030\002 \001(\0132\024.google.p"
+ "rotobuf.Any*.\n\006Syntax\022\021\n\rSYNTAX_PROTO2\020\000"
+ "\022\021\n\rSYNTAX_PROTO3\020\001B{\n\023com.google.protob"
+ "ufB\tTypeProtoP\001Z-google.golang.org/proto"
+ "buf/types/known/typepb\370\001\001\242\002\003GPB\252\002\036Google"
+ ".Protobuf.WellKnownTypesb\006proto3"
};
-static ::_pbi::once_flag descriptor_table_google_2fprotobuf_2ftype_2eproto_once;
+static const ::_pbi::DescriptorTable* const descriptor_table_google_2fprotobuf_2ftype_2eproto_deps[2] =
+ {
+ &::descriptor_table_google_2fprotobuf_2fany_2eproto,
+ &::descriptor_table_google_2fprotobuf_2fsource_5fcontext_2eproto,
+};
+static ::absl::once_flag descriptor_table_google_2fprotobuf_2ftype_2eproto_once;
const ::_pbi::DescriptorTable descriptor_table_google_2fprotobuf_2ftype_2eproto = {
- false, false, 1592, descriptor_table_protodef_google_2fprotobuf_2ftype_2eproto,
+ false,
+ false,
+ 1592,
+ descriptor_table_protodef_google_2fprotobuf_2ftype_2eproto,
"google/protobuf/type.proto",
- &descriptor_table_google_2fprotobuf_2ftype_2eproto_once, descriptor_table_google_2fprotobuf_2ftype_2eproto_deps, 2, 5,
- schemas, file_default_instances, TableStruct_google_2fprotobuf_2ftype_2eproto::offsets,
- file_level_metadata_google_2fprotobuf_2ftype_2eproto, file_level_enum_descriptors_google_2fprotobuf_2ftype_2eproto,
+ &descriptor_table_google_2fprotobuf_2ftype_2eproto_once,
+ descriptor_table_google_2fprotobuf_2ftype_2eproto_deps,
+ 2,
+ 5,
+ schemas,
+ file_default_instances,
+ TableStruct_google_2fprotobuf_2ftype_2eproto::offsets,
+ file_level_metadata_google_2fprotobuf_2ftype_2eproto,
+ file_level_enum_descriptors_google_2fprotobuf_2ftype_2eproto,
file_level_service_descriptors_google_2fprotobuf_2ftype_2eproto,
};
+
+// This function exists to be marked as weak.
+// It can significantly speed up compilation by breaking up LLVM's SCC
+// in the .pb.cc translation units. Large translation units see a
+// reduction of more than 35% of walltime for optimized builds. Without
+// the weak attribute all the messages in the file, including all the
+// vtables and everything they use become part of the same SCC through
+// a cycle like:
+// GetMetadata -> descriptor table -> default instances ->
+// vtables -> GetMetadata
+// By adding a weak function here we break the connection from the
+// individual vtables back into the descriptor table.
PROTOBUF_ATTRIBUTE_WEAK const ::_pbi::DescriptorTable* descriptor_table_google_2fprotobuf_2ftype_2eproto_getter() {
return &descriptor_table_google_2fprotobuf_2ftype_2eproto;
}
-
// Force running AddDescriptors() at dynamic initialization time.
-PROTOBUF_ATTRIBUTE_INIT_PRIORITY2 static ::_pbi::AddDescriptorsRunner dynamic_init_dummy_google_2fprotobuf_2ftype_2eproto(&descriptor_table_google_2fprotobuf_2ftype_2eproto);
+PROTOBUF_ATTRIBUTE_INIT_PRIORITY2
+static ::_pbi::AddDescriptorsRunner dynamic_init_dummy_google_2fprotobuf_2ftype_2eproto(&descriptor_table_google_2fprotobuf_2ftype_2eproto);
PROTOBUF_NAMESPACE_OPEN
const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* Field_Kind_descriptor() {
::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&descriptor_table_google_2fprotobuf_2ftype_2eproto);
@@ -342,7 +379,6 @@
}
}
-
// ===================================================================
class Type::_Internal {
@@ -521,7 +557,7 @@
// .google.protobuf.Syntax syntax = 6;
case 6:
if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 48)) {
- uint64_t val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr);
+ uint32_t val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr);
CHK_(ptr);
_internal_set_syntax(static_cast<::PROTOBUF_NAMESPACE_ID::Syntax>(val));
} else
@@ -734,7 +770,6 @@
&descriptor_table_google_2fprotobuf_2ftype_2eproto_getter, &descriptor_table_google_2fprotobuf_2ftype_2eproto_once,
file_level_metadata_google_2fprotobuf_2ftype_2eproto[0]);
}
-
// ===================================================================
class Field::_Internal {
@@ -885,7 +920,7 @@
// .google.protobuf.Field.Kind kind = 1;
case 1:
if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 8)) {
- uint64_t val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr);
+ uint32_t val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr);
CHK_(ptr);
_internal_set_kind(static_cast<::PROTOBUF_NAMESPACE_ID::Field_Kind>(val));
} else
@@ -894,7 +929,7 @@
// .google.protobuf.Field.Cardinality cardinality = 2;
case 2:
if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 16)) {
- uint64_t val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr);
+ uint32_t val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr);
CHK_(ptr);
_internal_set_cardinality(static_cast<::PROTOBUF_NAMESPACE_ID::Field_Cardinality>(val));
} else
@@ -1259,7 +1294,6 @@
&descriptor_table_google_2fprotobuf_2ftype_2eproto_getter, &descriptor_table_google_2fprotobuf_2ftype_2eproto_once,
file_level_metadata_google_2fprotobuf_2ftype_2eproto[1]);
}
-
// ===================================================================
class Enum::_Internal {
@@ -1419,7 +1453,7 @@
// .google.protobuf.Syntax syntax = 5;
case 5:
if (PROTOBUF_PREDICT_TRUE(static_cast<uint8_t>(tag) == 40)) {
- uint64_t val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr);
+ uint32_t val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr);
CHK_(ptr);
_internal_set_syntax(static_cast<::PROTOBUF_NAMESPACE_ID::Syntax>(val));
} else
@@ -1612,7 +1646,6 @@
&descriptor_table_google_2fprotobuf_2ftype_2eproto_getter, &descriptor_table_google_2fprotobuf_2ftype_2eproto_once,
file_level_metadata_google_2fprotobuf_2ftype_2eproto[2]);
}
-
// ===================================================================
class EnumValue::_Internal {
@@ -1876,7 +1909,6 @@
&descriptor_table_google_2fprotobuf_2ftype_2eproto_getter, &descriptor_table_google_2fprotobuf_2ftype_2eproto_once,
file_level_metadata_google_2fprotobuf_2ftype_2eproto[3]);
}
-
// ===================================================================
class Option::_Internal {
@@ -2127,7 +2159,6 @@
&descriptor_table_google_2fprotobuf_2ftype_2eproto_getter, &descriptor_table_google_2fprotobuf_2ftype_2eproto_once,
file_level_metadata_google_2fprotobuf_2ftype_2eproto[4]);
}
-
// @@protoc_insertion_point(namespace_scope)
PROTOBUF_NAMESPACE_CLOSE
PROTOBUF_NAMESPACE_OPEN
@@ -2152,6 +2183,5 @@
return Arena::CreateMessageInternal< ::PROTOBUF_NAMESPACE_ID::Option >(arena);
}
PROTOBUF_NAMESPACE_CLOSE
-
// @@protoc_insertion_point(global_scope)
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/type.pb.h b/src/google/protobuf/type.pb.h
index 0c82fa2..18bf4cb 100644
--- a/src/google/protobuf/type.pb.h
+++ b/src/google/protobuf/type.pb.h
@@ -1,41 +1,46 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: google/protobuf/type.proto
-#ifndef GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2ftype_2eproto
-#define GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2ftype_2eproto
+#ifndef GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2ftype_2eproto_2epb_2eh
+#define GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2ftype_2eproto_2epb_2eh
#include <limits>
#include <string>
+#include <type_traits>
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
#if PROTOBUF_VERSION < 3021000
-#error This file was generated by a newer version of protoc which is
-#error incompatible with your Protocol Buffer headers. Please update
-#error your headers.
-#endif
-#if 3021007 < PROTOBUF_MIN_PROTOC_VERSION
-#error This file was generated by an older version of protoc which is
-#error incompatible with your Protocol Buffer headers. Please
-#error regenerate this file with a newer version of protoc.
-#endif
+#error "This file was generated by a newer version of protoc which is"
+#error "incompatible with your Protocol Buffer headers. Please update"
+#error "your headers."
+#endif // PROTOBUF_VERSION
-#include <google/protobuf/port_undef.inc>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/arena.h>
-#include <google/protobuf/arenastring.h>
-#include <google/protobuf/generated_message_util.h>
-#include <google/protobuf/metadata_lite.h>
-#include <google/protobuf/generated_message_reflection.h>
-#include <google/protobuf/message.h>
-#include <google/protobuf/repeated_field.h> // IWYU pragma: export
-#include <google/protobuf/extension_set.h> // IWYU pragma: export
-#include <google/protobuf/generated_enum_reflection.h>
-#include <google/protobuf/unknown_field_set.h>
-#include <google/protobuf/any.pb.h>
-#include <google/protobuf/source_context.pb.h>
+#if 3021007 < PROTOBUF_MIN_PROTOC_VERSION
+#error "This file was generated by an older version of protoc which is"
+#error "incompatible with your Protocol Buffer headers. Please"
+#error "regenerate this file with a newer version of protoc."
+#endif // PROTOBUF_MIN_PROTOC_VERSION
+#include "google/protobuf/port_undef.inc"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/arena.h"
+#include "google/protobuf/arenastring.h"
+#include "google/protobuf/generated_message_util.h"
+#include "google/protobuf/metadata_lite.h"
+#include "google/protobuf/generated_message_reflection.h"
+#include "google/protobuf/message.h"
+#include "google/protobuf/repeated_field.h" // IWYU pragma: export
+#include "google/protobuf/extension_set.h" // IWYU pragma: export
+#include "google/protobuf/generated_enum_reflection.h"
+#include "google/protobuf/unknown_field_set.h"
+#include "google/protobuf/any.pb.h"
+#include "google/protobuf/source_context.pb.h"
// @@protoc_insertion_point(includes)
-#include <google/protobuf/port_def.inc>
+
+// Must be included last.
+#include "google/protobuf/port_def.inc"
+
#define PROTOBUF_INTERNAL_EXPORT_google_2fprotobuf_2ftype_2eproto PROTOBUF_EXPORT
+
PROTOBUF_NAMESPACE_OPEN
namespace internal {
class AnyMetadata;
@@ -46,7 +51,8 @@
struct PROTOBUF_EXPORT TableStruct_google_2fprotobuf_2ftype_2eproto {
static const uint32_t offsets[];
};
-PROTOBUF_EXPORT extern const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_google_2fprotobuf_2ftype_2eproto;
+PROTOBUF_EXPORT extern const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable
+ descriptor_table_google_2fprotobuf_2ftype_2eproto;
PROTOBUF_NAMESPACE_OPEN
class Enum;
struct EnumDefaultTypeInternal;
@@ -63,16 +69,19 @@
class Type;
struct TypeDefaultTypeInternal;
PROTOBUF_EXPORT extern TypeDefaultTypeInternal _Type_default_instance_;
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::Enum* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::Enum>(Arena*);
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::EnumValue* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::EnumValue>(Arena*);
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::Field* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::Field>(Arena*);
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::Option* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::Option>(Arena*);
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::Type* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::Type>(Arena*);
PROTOBUF_NAMESPACE_CLOSE
-PROTOBUF_NAMESPACE_OPEN
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::Enum* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::Enum>(Arena*);
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::EnumValue* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::EnumValue>(Arena*);
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::Field* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::Field>(Arena*);
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::Option* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::Option>(Arena*);
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::Type* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::Type>(Arena*);
-PROTOBUF_NAMESPACE_CLOSE
-PROTOBUF_NAMESPACE_OPEN
+PROTOBUF_NAMESPACE_OPEN
enum Field_Kind : int {
Field_Kind_TYPE_UNKNOWN = 0,
Field_Kind_TYPE_DOUBLE = 1,
@@ -107,11 +116,15 @@
static_assert(::std::is_same<T, Field_Kind>::value ||
::std::is_integral<T>::value,
"Incorrect type passed to function Field_Kind_Name.");
- return ::PROTOBUF_NAMESPACE_ID::internal::NameOfEnum(
- Field_Kind_descriptor(), enum_t_value);
+ return Field_Kind_Name(static_cast<Field_Kind>(enum_t_value));
+}
+template<>
+inline const std::string& Field_Kind_Name(Field_Kind value) {
+ return ::PROTOBUF_NAMESPACE_ID::internal::NameOfDenseEnum
+ <Field_Kind_descriptor, 0, 18>(static_cast<int>(value));
}
inline bool Field_Kind_Parse(
- ::PROTOBUF_NAMESPACE_ID::ConstStringParam name, Field_Kind* value) {
+ ::absl::string_view name, Field_Kind* value) {
return ::PROTOBUF_NAMESPACE_ID::internal::ParseNamedEnum<Field_Kind>(
Field_Kind_descriptor(), name, value);
}
@@ -134,11 +147,15 @@
static_assert(::std::is_same<T, Field_Cardinality>::value ||
::std::is_integral<T>::value,
"Incorrect type passed to function Field_Cardinality_Name.");
- return ::PROTOBUF_NAMESPACE_ID::internal::NameOfEnum(
- Field_Cardinality_descriptor(), enum_t_value);
+ return Field_Cardinality_Name(static_cast<Field_Cardinality>(enum_t_value));
+}
+template<>
+inline const std::string& Field_Cardinality_Name(Field_Cardinality value) {
+ return ::PROTOBUF_NAMESPACE_ID::internal::NameOfDenseEnum
+ <Field_Cardinality_descriptor, 0, 3>(static_cast<int>(value));
}
inline bool Field_Cardinality_Parse(
- ::PROTOBUF_NAMESPACE_ID::ConstStringParam name, Field_Cardinality* value) {
+ ::absl::string_view name, Field_Cardinality* value) {
return ::PROTOBUF_NAMESPACE_ID::internal::ParseNamedEnum<Field_Cardinality>(
Field_Cardinality_descriptor(), name, value);
}
@@ -159,16 +176,24 @@
static_assert(::std::is_same<T, Syntax>::value ||
::std::is_integral<T>::value,
"Incorrect type passed to function Syntax_Name.");
- return ::PROTOBUF_NAMESPACE_ID::internal::NameOfEnum(
- Syntax_descriptor(), enum_t_value);
+ return Syntax_Name(static_cast<Syntax>(enum_t_value));
+}
+template<>
+inline const std::string& Syntax_Name(Syntax value) {
+ return ::PROTOBUF_NAMESPACE_ID::internal::NameOfDenseEnum
+ <Syntax_descriptor, 0, 1>(static_cast<int>(value));
}
inline bool Syntax_Parse(
- ::PROTOBUF_NAMESPACE_ID::ConstStringParam name, Syntax* value) {
+ ::absl::string_view name, Syntax* value) {
return ::PROTOBUF_NAMESPACE_ID::internal::ParseNamedEnum<Syntax>(
Syntax_descriptor(), name, value);
}
+
// ===================================================================
+
+// -------------------------------------------------------------------
+
class PROTOBUF_EXPORT Type final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.Type) */ {
public:
@@ -272,7 +297,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.Type";
}
protected:
@@ -416,8 +441,7 @@
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2ftype_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOBUF_EXPORT Field final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.Field) */ {
@@ -522,7 +546,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.Field";
}
protected:
@@ -596,7 +620,7 @@
"Incorrect type passed to function Kind_Name.");
return Field_Kind_Name(enum_t_value);
}
- static inline bool Kind_Parse(::PROTOBUF_NAMESPACE_ID::ConstStringParam name,
+ static inline bool Kind_Parse(::absl::string_view name,
Kind* value) {
return Field_Kind_Parse(name, value);
}
@@ -630,7 +654,7 @@
"Incorrect type passed to function Cardinality_Name.");
return Field_Cardinality_Name(enum_t_value);
}
- static inline bool Cardinality_Parse(::PROTOBUF_NAMESPACE_ID::ConstStringParam name,
+ static inline bool Cardinality_Parse(::absl::string_view name,
Cardinality* value) {
return Field_Cardinality_Parse(name, value);
}
@@ -790,8 +814,7 @@
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2ftype_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOBUF_EXPORT Enum final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.Enum) */ {
@@ -896,7 +919,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.Enum";
}
protected:
@@ -1014,8 +1037,7 @@
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2ftype_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOBUF_EXPORT EnumValue final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.EnumValue) */ {
@@ -1120,7 +1142,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.EnumValue";
}
protected:
@@ -1198,8 +1220,7 @@
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2ftype_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOBUF_EXPORT Option final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.Option) */ {
@@ -1304,7 +1325,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.Option";
}
protected:
@@ -1375,12 +1396,17 @@
// ===================================================================
+
+
// ===================================================================
+
#ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wstrict-aliasing"
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wstrict-aliasing"
#endif // __GNUC__
+// -------------------------------------------------------------------
+
// Type
// string name = 1;
@@ -1407,11 +1433,11 @@
return _impl_.name_.Get();
}
inline void Type::_internal_set_name(const std::string& value) {
-
+
_impl_.name_.Set(value, GetArenaForAllocation());
}
inline std::string* Type::_internal_mutable_name() {
-
+
return _impl_.name_.Mutable(GetArenaForAllocation());
}
inline std::string* Type::release_name() {
@@ -1420,9 +1446,9 @@
}
inline void Type::set_allocated_name(std::string* name) {
if (name != nullptr) {
-
+
} else {
-
+
}
_impl_.name_.SetAllocated(name, GetArenaForAllocation());
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
@@ -1508,8 +1534,7 @@
// @@protoc_insertion_point(field_set:google.protobuf.Type.oneofs)
}
inline void Type::set_oneofs(int index, const char* value) {
- GOOGLE_DCHECK(value != nullptr);
- _impl_.oneofs_.Mutable(index)->assign(value);
+ GOOGLE_DCHECK(value != nullptr); _impl_.oneofs_.Mutable(index)->assign(value);
// @@protoc_insertion_point(field_set_char:google.protobuf.Type.oneofs)
}
inline void Type::set_oneofs(int index, const char* value, size_t size) {
@@ -1529,8 +1554,7 @@
// @@protoc_insertion_point(field_add:google.protobuf.Type.oneofs)
}
inline void Type::add_oneofs(const char* value) {
- GOOGLE_DCHECK(value != nullptr);
- _impl_.oneofs_.Add()->assign(value);
+ GOOGLE_DCHECK(value != nullptr); _impl_.oneofs_.Add()->assign(value);
// @@protoc_insertion_point(field_add_char:google.protobuf.Type.oneofs)
}
inline void Type::add_oneofs(const char* value, size_t size) {
@@ -1611,9 +1635,9 @@
}
_impl_.source_context_ = source_context;
if (source_context) {
-
+
} else {
-
+
}
// @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.Type.source_context)
}
@@ -1665,9 +1689,9 @@
source_context = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage(
message_arena, source_context, submessage_arena);
}
-
+
} else {
-
+
}
_impl_.source_context_ = source_context;
// @@protoc_insertion_point(field_set_allocated:google.protobuf.Type.source_context)
@@ -1749,7 +1773,7 @@
return _internal_number();
}
inline void Field::_internal_set_number(int32_t value) {
-
+
_impl_.number_ = value;
}
inline void Field::set_number(int32_t value) {
@@ -1781,11 +1805,11 @@
return _impl_.name_.Get();
}
inline void Field::_internal_set_name(const std::string& value) {
-
+
_impl_.name_.Set(value, GetArenaForAllocation());
}
inline std::string* Field::_internal_mutable_name() {
-
+
return _impl_.name_.Mutable(GetArenaForAllocation());
}
inline std::string* Field::release_name() {
@@ -1794,9 +1818,9 @@
}
inline void Field::set_allocated_name(std::string* name) {
if (name != nullptr) {
-
+
} else {
-
+
}
_impl_.name_.SetAllocated(name, GetArenaForAllocation());
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
@@ -1831,11 +1855,11 @@
return _impl_.type_url_.Get();
}
inline void Field::_internal_set_type_url(const std::string& value) {
-
+
_impl_.type_url_.Set(value, GetArenaForAllocation());
}
inline std::string* Field::_internal_mutable_type_url() {
-
+
return _impl_.type_url_.Mutable(GetArenaForAllocation());
}
inline std::string* Field::release_type_url() {
@@ -1844,9 +1868,9 @@
}
inline void Field::set_allocated_type_url(std::string* type_url) {
if (type_url != nullptr) {
-
+
} else {
-
+
}
_impl_.type_url_.SetAllocated(type_url, GetArenaForAllocation());
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
@@ -1869,7 +1893,7 @@
return _internal_oneof_index();
}
inline void Field::_internal_set_oneof_index(int32_t value) {
-
+
_impl_.oneof_index_ = value;
}
inline void Field::set_oneof_index(int32_t value) {
@@ -1889,7 +1913,7 @@
return _internal_packed();
}
inline void Field::_internal_set_packed(bool value) {
-
+
_impl_.packed_ = value;
}
inline void Field::set_packed(bool value) {
@@ -1961,11 +1985,11 @@
return _impl_.json_name_.Get();
}
inline void Field::_internal_set_json_name(const std::string& value) {
-
+
_impl_.json_name_.Set(value, GetArenaForAllocation());
}
inline std::string* Field::_internal_mutable_json_name() {
-
+
return _impl_.json_name_.Mutable(GetArenaForAllocation());
}
inline std::string* Field::release_json_name() {
@@ -1974,9 +1998,9 @@
}
inline void Field::set_allocated_json_name(std::string* json_name) {
if (json_name != nullptr) {
-
+
} else {
-
+
}
_impl_.json_name_.SetAllocated(json_name, GetArenaForAllocation());
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
@@ -2011,11 +2035,11 @@
return _impl_.default_value_.Get();
}
inline void Field::_internal_set_default_value(const std::string& value) {
-
+
_impl_.default_value_.Set(value, GetArenaForAllocation());
}
inline std::string* Field::_internal_mutable_default_value() {
-
+
return _impl_.default_value_.Mutable(GetArenaForAllocation());
}
inline std::string* Field::release_default_value() {
@@ -2024,9 +2048,9 @@
}
inline void Field::set_allocated_default_value(std::string* default_value) {
if (default_value != nullptr) {
-
+
} else {
-
+
}
_impl_.default_value_.SetAllocated(default_value, GetArenaForAllocation());
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
@@ -2065,11 +2089,11 @@
return _impl_.name_.Get();
}
inline void Enum::_internal_set_name(const std::string& value) {
-
+
_impl_.name_.Set(value, GetArenaForAllocation());
}
inline std::string* Enum::_internal_mutable_name() {
-
+
return _impl_.name_.Mutable(GetArenaForAllocation());
}
inline std::string* Enum::release_name() {
@@ -2078,9 +2102,9 @@
}
inline void Enum::set_allocated_name(std::string* name) {
if (name != nullptr) {
-
+
} else {
-
+
}
_impl_.name_.SetAllocated(name, GetArenaForAllocation());
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
@@ -2194,9 +2218,9 @@
}
_impl_.source_context_ = source_context;
if (source_context) {
-
+
} else {
-
+
}
// @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.Enum.source_context)
}
@@ -2248,9 +2272,9 @@
source_context = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage(
message_arena, source_context, submessage_arena);
}
-
+
} else {
-
+
}
_impl_.source_context_ = source_context;
// @@protoc_insertion_point(field_set_allocated:google.protobuf.Enum.source_context)
@@ -2304,11 +2328,11 @@
return _impl_.name_.Get();
}
inline void EnumValue::_internal_set_name(const std::string& value) {
-
+
_impl_.name_.Set(value, GetArenaForAllocation());
}
inline std::string* EnumValue::_internal_mutable_name() {
-
+
return _impl_.name_.Mutable(GetArenaForAllocation());
}
inline std::string* EnumValue::release_name() {
@@ -2317,9 +2341,9 @@
}
inline void EnumValue::set_allocated_name(std::string* name) {
if (name != nullptr) {
-
+
} else {
-
+
}
_impl_.name_.SetAllocated(name, GetArenaForAllocation());
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
@@ -2342,7 +2366,7 @@
return _internal_number();
}
inline void EnumValue::_internal_set_number(int32_t value) {
-
+
_impl_.number_ = value;
}
inline void EnumValue::set_number(int32_t value) {
@@ -2418,11 +2442,11 @@
return _impl_.name_.Get();
}
inline void Option::_internal_set_name(const std::string& value) {
-
+
_impl_.name_.Set(value, GetArenaForAllocation());
}
inline std::string* Option::_internal_mutable_name() {
-
+
return _impl_.name_.Mutable(GetArenaForAllocation());
}
inline std::string* Option::release_name() {
@@ -2431,9 +2455,9 @@
}
inline void Option::set_allocated_name(std::string* name) {
if (name != nullptr) {
-
+
} else {
-
+
}
_impl_.name_.SetAllocated(name, GetArenaForAllocation());
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
@@ -2467,9 +2491,9 @@
}
_impl_.value_ = value;
if (value) {
-
+
} else {
-
+
}
// @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.Option.value)
}
@@ -2521,30 +2545,22 @@
value = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage(
message_arena, value, submessage_arena);
}
-
+
} else {
-
+
}
_impl_.value_ = value;
// @@protoc_insertion_point(field_set_allocated:google.protobuf.Option.value)
}
#ifdef __GNUC__
- #pragma GCC diagnostic pop
+#pragma GCC diagnostic pop
#endif // __GNUC__
-// -------------------------------------------------------------------
-
-// -------------------------------------------------------------------
-
-// -------------------------------------------------------------------
-
-// -------------------------------------------------------------------
-
// @@protoc_insertion_point(namespace_scope)
-
PROTOBUF_NAMESPACE_CLOSE
+
PROTOBUF_NAMESPACE_OPEN
template <> struct is_proto_enum< ::PROTOBUF_NAMESPACE_ID::Field_Kind> : ::std::true_type {};
@@ -2567,5 +2583,6 @@
// @@protoc_insertion_point(global_scope)
-#include <google/protobuf/port_undef.inc>
-#endif // GOOGLE_PROTOBUF_INCLUDED_GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2ftype_2eproto
+#include "google/protobuf/port_undef.inc"
+
+#endif // GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2ftype_2eproto_2epb_2eh
diff --git a/src/google/protobuf/unittest.proto b/src/google/protobuf/unittest.proto
index f1b0bd0..a807815 100644
--- a/src/google/protobuf/unittest.proto
+++ b/src/google/protobuf/unittest.proto
@@ -221,6 +221,12 @@
reserved "bar", "baz";
}
+enum TestReservedEnumFields {
+ UNKNOWN = 0;
+ reserved 2, 15, 9 to 11;
+ reserved "bar", "baz";
+}
+
message TestAllExtensions {
extensions 1 to max;
}
@@ -340,9 +346,22 @@
optional bytes oneof_bytes_extension = 114;
}
+message TestMixedFieldsAndExtensions {
+ optional int32 a = 1;
+ repeated fixed32 b = 3;
+ extensions 2, 4;
+ extend TestMixedFieldsAndExtensions {
+ optional int32 c = 2;
+ repeated fixed32 d = 4;
+ }
+}
+
message TestGroup {
optional group OptionalGroup = 16 {
optional int32 a = 17;
+ optional int32 zz = 89; // fast table size must be at least 16, for this
+ // field to be parsed by the fast parser, since
+ // 89 - 17 = 72 is a multiple of 8.
}
optional ForeignEnum optional_foreign_enum = 22;
}
@@ -459,6 +478,9 @@
optional TestRequired optional_message = 1;
repeated TestRequired repeated_message = 2;
optional int32 dummy = 3;
+
+ // Missing required fields must not affect verification of child messages.
+ optional NestedTestAllTypes optional_lazy_message = 4 [lazy = true];
}
message TestRequiredMessage {
@@ -1416,3 +1438,131 @@
}
+// This message contains different kind of enums to exercise the different
+// parsers in table-driven.
+message EnumParseTester {
+ enum SeqSmall0 {
+ SEQ_SMALL_0_DEFAULT = 0;
+ SEQ_SMALL_0_1 = 1;
+ SEQ_SMALL_0_2 = 2;
+ };
+ optional SeqSmall0 optional_seq_small_0_lowfield = 1;
+ optional SeqSmall0 optional_seq_small_0_midfield = 1001;
+ optional SeqSmall0 optional_seq_small_0_hifield = 1000001;
+ repeated SeqSmall0 repeated_seq_small_0_lowfield = 2;
+ repeated SeqSmall0 repeated_seq_small_0_midfield = 1002;
+ repeated SeqSmall0 repeated_seq_small_0_hifield = 1000002;
+ repeated SeqSmall0 packed_seq_small_0_lowfield = 3 [packed = true];
+ repeated SeqSmall0 packed_seq_small_0_midfield = 1003 [packed = true];
+ repeated SeqSmall0 packed_seq_small_0_hifield = 1000003 [packed = true];
+
+ enum SeqSmall1 {
+ SEQ_SMALL_1_DEFAULT = 1;
+ SEQ_SMALL_1_2 = 2;
+ SEQ_SMALL_1_3 = 3;
+ };
+ optional SeqSmall1 optional_seq_small_1_lowfield = 4;
+ optional SeqSmall1 optional_seq_small_1_midfield = 1004;
+ optional SeqSmall1 optional_seq_small_1_hifield = 1000004;
+ repeated SeqSmall1 repeated_seq_small_1_lowfield = 5;
+ repeated SeqSmall1 repeated_seq_small_1_midfield = 1005;
+ repeated SeqSmall1 repeated_seq_small_1_hifield = 1000005;
+ repeated SeqSmall1 packed_seq_small_1_lowfield = 6 [packed = true];
+ repeated SeqSmall1 packed_seq_small_1_midfield = 1006 [packed = true];
+ repeated SeqSmall1 packed_seq_small_1_hifield = 1000006 [packed = true];
+
+ enum SeqLarge {
+ SEQ_LARGE_DEFAULT = -1;
+ SEQ_LARGE_0 = 0;
+ SEQ_LARGE_1 = 1;
+ SEQ_LARGE_2 = 2;
+ SEQ_LARGE_3 = 3;
+ SEQ_LARGE_4 = 4;
+ SEQ_LARGE_5 = 5;
+ SEQ_LARGE_6 = 6;
+ SEQ_LARGE_7 = 7;
+ SEQ_LARGE_8 = 8;
+ SEQ_LARGE_9 = 9;
+ SEQ_LARGE_10 = 10;
+ SEQ_LARGE_11 = 11;
+ SEQ_LARGE_12 = 12;
+ SEQ_LARGE_13 = 13;
+ SEQ_LARGE_14 = 14;
+ SEQ_LARGE_15 = 15;
+ SEQ_LARGE_16 = 16;
+ SEQ_LARGE_17 = 17;
+ SEQ_LARGE_18 = 18;
+ SEQ_LARGE_19 = 19;
+ SEQ_LARGE_20 = 20;
+ SEQ_LARGE_21 = 21;
+ SEQ_LARGE_22 = 22;
+ SEQ_LARGE_23 = 23;
+ SEQ_LARGE_24 = 24;
+ SEQ_LARGE_25 = 25;
+ SEQ_LARGE_26 = 26;
+ SEQ_LARGE_27 = 27;
+ SEQ_LARGE_28 = 28;
+ SEQ_LARGE_29 = 29;
+ SEQ_LARGE_30 = 30;
+ SEQ_LARGE_31 = 31;
+ SEQ_LARGE_32 = 32;
+ SEQ_LARGE_33 = 33;
+ };
+ optional SeqLarge optional_seq_large_lowfield = 7;
+ optional SeqLarge optional_seq_large_midfield = 1007;
+ optional SeqLarge optional_seq_large_hifield = 1000007;
+ repeated SeqLarge repeated_seq_large_lowfield = 8;
+ repeated SeqLarge repeated_seq_large_midfield = 1008;
+ repeated SeqLarge repeated_seq_large_hifield = 1000008;
+ repeated SeqLarge packed_seq_large_lowfield = 9 [packed = true];
+ repeated SeqLarge packed_seq_large_midfield = 1009 [packed = true];
+ repeated SeqLarge packed_seq_large_hifield = 1000009 [packed = true];
+
+ enum Arbitrary {
+ ARBITRARY_DEFAULT = -123123;
+ ARBITRARY_1 = -123;
+ ARBITRARY_2 = 213;
+ ARBITRARY_3 = 213213;
+ ARBITRARY_MIN = -2147483648;
+ ARBITRARY_MAX = 2147483647;
+ };
+ optional Arbitrary optional_arbitrary_lowfield = 10;
+ optional Arbitrary optional_arbitrary_midfield = 1010;
+ optional Arbitrary optional_arbitrary_hifield = 1000010;
+ repeated Arbitrary repeated_arbitrary_lowfield = 11;
+ repeated Arbitrary repeated_arbitrary_midfield = 1011;
+ repeated Arbitrary repeated_arbitrary_hifield = 1000011;
+ repeated Arbitrary packed_arbitrary_lowfield = 12 [packed = true];
+ repeated Arbitrary packed_arbitrary_midfield = 1012 [packed = true];
+ repeated Arbitrary packed_arbitrary_hifield = 1000012 [packed = true];
+
+ // An arbitrary field we can append to to break the runs of repeated fields.
+ optional int32 other_field = 99;
+};
+
+// This message contains different kind of bool fields to exercise the different
+// parsers in table-drived.
+message BoolParseTester {
+ optional bool optional_bool_lowfield = 1;
+ optional bool optional_bool_midfield = 1001;
+ optional bool optional_bool_hifield = 1000001;
+ repeated bool repeated_bool_lowfield = 2;
+ repeated bool repeated_bool_midfield = 1002;
+ repeated bool repeated_bool_hifield = 1000002;
+ repeated bool packed_bool_lowfield = 3 [packed = true];
+ repeated bool packed_bool_midfield = 1003 [packed = true];
+ repeated bool packed_bool_hifield = 1000003 [packed = true];
+
+ // An arbitrary field we can append to to break the runs of repeated fields.
+ optional int32 other_field = 99;
+};
+
+message StringParseTester {
+ optional string optional_string_lowfield = 1;
+ optional string optional_string_midfield = 1001;
+ optional string optional_string_hifield = 1000001;
+ repeated string repeated_string_lowfield = 2;
+ repeated string repeated_string_midfield = 1002;
+ repeated string repeated_string_hifield = 1000002;
+};
+
diff --git a/src/google/protobuf/unittest_mset.proto b/src/google/protobuf/unittest_mset.proto
index 3294994..fd6aaa5 100644
--- a/src/google/protobuf/unittest_mset.proto
+++ b/src/google/protobuf/unittest_mset.proto
@@ -53,6 +53,12 @@
optional NestedTestMessageSetContainer child = 2;
}
+message NestedTestInt {
+ optional fixed32 a = 1;
+ optional int32 b = 3;
+ optional NestedTestInt child = 2;
+}
+
message TestMessageSetExtension1 {
extend proto2_wireformat_unittest.TestMessageSet {
optional TestMessageSetExtension1 message_set_extension = 1545008;
@@ -69,11 +75,6 @@
optional string str = 25;
}
-message NestedTestInt {
- optional fixed32 a = 1;
- optional NestedTestInt child = 2;
-}
-
message TestMessageSetExtension3 {
extend proto2_wireformat_unittest.TestMessageSet {
optional TestMessageSetExtension3 message_set_extension = 195273129;
diff --git a/src/google/protobuf/unknown_field_set.cc b/src/google/protobuf/unknown_field_set.cc
index 74c358e..3a6d8d7 100644
--- a/src/google/protobuf/unknown_field_set.cc
+++ b/src/google/protobuf/unknown_field_set.cc
@@ -32,24 +32,25 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/unknown_field_set.h>
+#include "google/protobuf/unknown_field_set.h"
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
-#include <google/protobuf/extension_set.h>
-#include <google/protobuf/generated_message_tctable_decl.h>
-#include <google/protobuf/generated_message_tctable_impl.h>
-#include <google/protobuf/parse_context.h>
-#include <google/protobuf/wire_format.h>
-#include <google/protobuf/wire_format_lite.h>
-#include <google/protobuf/stubs/stl_util.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/io/zero_copy_stream.h"
+#include "google/protobuf/io/zero_copy_stream_impl.h"
+#include "google/protobuf/io/zero_copy_stream_impl_lite.h"
+#include "absl/strings/internal/resize_uninitialized.h"
+#include "google/protobuf/extension_set.h"
+#include "google/protobuf/generated_message_tctable_decl.h"
+#include "google/protobuf/generated_message_tctable_impl.h"
+#include "google/protobuf/parse_context.h"
+#include "google/protobuf/wire_format.h"
+#include "google/protobuf/wire_format_lite.h"
+
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -243,7 +244,7 @@
bool UnknownFieldSet::SerializeToString(std::string* output) const {
const size_t size =
google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(*this);
- STLStringResizeUninitializedAmortized(output, size);
+ absl::strings_internal::STLStringResizeUninitializedAmortized(output, size);
google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
*this, reinterpret_cast<uint8_t*>(const_cast<char*>(output->data())));
return true;
@@ -347,4 +348,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/unknown_field_set.h b/src/google/protobuf/unknown_field_set.h
index 9aa2cbb..04b630e 100644
--- a/src/google/protobuf/unknown_field_set.h
+++ b/src/google/protobuf/unknown_field_set.h
@@ -44,16 +44,17 @@
#include <string>
#include <vector>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
-#include <google/protobuf/port.h>
-#include <google/protobuf/message_lite.h>
-#include <google/protobuf/parse_context.h>
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/io/zero_copy_stream_impl_lite.h"
+#include "google/protobuf/port.h"
+#include "google/protobuf/message_lite.h"
+#include "google/protobuf/parse_context.h"
+#include "google/protobuf/port.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
#ifdef SWIG
#error "You cannot SWIG proto headers"
@@ -86,6 +87,8 @@
class PROTOBUF_EXPORT UnknownFieldSet {
public:
UnknownFieldSet();
+ UnknownFieldSet(const UnknownFieldSet&) = delete;
+ UnknownFieldSet& operator=(const UnknownFieldSet&) = delete;
~UnknownFieldSet();
// Remove all fields.
@@ -209,7 +212,6 @@
}
std::vector<UnknownField> fields_;
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(UnknownFieldSet);
};
namespace internal {
@@ -217,7 +219,7 @@
inline void WriteVarint(uint32_t num, uint64_t val, UnknownFieldSet* unknown) {
unknown->AddVarint(num, val);
}
-inline void WriteLengthDelimited(uint32_t num, StringPiece val,
+inline void WriteLengthDelimited(uint32_t num, absl::string_view val,
UnknownFieldSet* unknown) {
unknown->AddLengthDelimited(num)->assign(val.data(), val.size());
}
@@ -403,5 +405,5 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_UNKNOWN_FIELD_SET_H__
diff --git a/src/google/protobuf/unknown_field_set_unittest.cc b/src/google/protobuf/unknown_field_set_unittest.cc
index 7f9a598..92fff73 100644
--- a/src/google/protobuf/unknown_field_set_unittest.cc
+++ b/src/google/protobuf/unknown_field_set_unittest.cc
@@ -35,29 +35,31 @@
// This test is testing a lot more than just the UnknownFieldSet class. It
// tests handling of unknown fields throughout the system.
-#include <google/protobuf/unknown_field_set.h>
+#include "google/protobuf/unknown_field_set.h"
#include <string>
#include <unordered_set>
#include <vector>
-#include <google/protobuf/stubs/callback.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/unittest.pb.h>
-#include <google/protobuf/unittest_lite.pb.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/stubs/mutex.h>
-#include <google/protobuf/text_format.h>
-#include <google/protobuf/wire_format.h>
+#include "google/protobuf/stubs/callback.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/unittest.pb.h"
+#include "google/protobuf/unittest_lite.pb.h"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/io/zero_copy_stream_impl.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/text_format.h"
+#include "google/protobuf/wire_format.h"
#include <gmock/gmock.h>
-#include <google/protobuf/testing/googletest.h>
+#include "google/protobuf/testing/googletest.h"
#include <gtest/gtest.h>
-#include <google/protobuf/stubs/time.h>
-#include <google/protobuf/test_util.h>
-#include <google/protobuf/stubs/stl_util.h>
+#include "absl/synchronization/mutex.h"
+#include "absl/time/clock.h"
+#include "absl/time/time.h"
+#include "google/protobuf/test_util.h"
+#include "google/protobuf/stubs/stl_util.h"
+
namespace google {
namespace protobuf {
@@ -648,7 +650,7 @@
}
}
-#define MAKE_VECTOR(x) std::vector<int>(x, x + GOOGLE_ARRAYSIZE(x))
+#define MAKE_VECTOR(x) std::vector<int>(x, x + ABSL_ARRAYSIZE(x))
TEST_F(UnknownFieldSetTest, DeleteByNumber) {
CheckDeleteByNumber(std::vector<int>(), 1, std::vector<int>());
static const int kTestFieldNumbers1[] = {1, 2, 3};
diff --git a/src/google/protobuf/util/BUILD.bazel b/src/google/protobuf/util/BUILD.bazel
new file mode 100644
index 0000000..6b1d3b2
--- /dev/null
+++ b/src/google/protobuf/util/BUILD.bazel
@@ -0,0 +1,307 @@
+################################################################################
+# Protocol Buffers C++ Utilities
+################################################################################
+
+load("@rules_cc//cc:defs.bzl", "cc_library", "cc_proto_library", "cc_test")
+load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
+load("@rules_proto//proto:defs.bzl", "proto_library")
+load("//build_defs:cpp_opts.bzl", "COPTS")
+
+cc_library(
+ name = "delimited_message_util",
+ srcs = ["delimited_message_util.cc"],
+ hdrs = ["delimited_message_util.h"],
+ copts = COPTS,
+ strip_include_prefix = "/src",
+ visibility = ["//:__subpackages__"],
+ deps = [
+ "//:protobuf_lite",
+ "//src/google/protobuf/io",
+ ],
+)
+
+cc_test(
+ name = "delimited_message_util_test",
+ srcs = ["delimited_message_util_test.cc"],
+ copts = COPTS,
+ deps = [
+ ":delimited_message_util",
+ "//src/google/protobuf:cc_test_protos",
+ "//src/google/protobuf:test_util",
+ "//src/google/protobuf/testing",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_library(
+ name = "differencer",
+ srcs = [
+ "field_comparator.cc",
+ "message_differencer.cc",
+ ],
+ hdrs = [
+ "field_comparator.h",
+ "message_differencer.h",
+ ],
+ strip_include_prefix = "/src",
+ visibility = ["//:__subpackages__"],
+ deps = [
+ "//src/google/protobuf",
+ "//src/google/protobuf/io",
+ "//src/google/protobuf/stubs",
+ ],
+)
+
+cc_test(
+ name = "field_comparator_test",
+ srcs = ["field_comparator_test.cc"],
+ deps = [
+ ":differencer",
+ ":message_differencer_unittest_cc_proto",
+ "//src/google/protobuf:cc_test_protos",
+ "//src/google/protobuf/testing",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_test(
+ name = "message_differencer_unittest",
+ srcs = ["message_differencer_unittest.cc"],
+ copts = COPTS + select({
+ "//build_defs:config_msvc": [],
+ "//conditions:default": [
+ "-Wno-deprecated-declarations",
+ ],
+ }),
+ deps = [
+ ":differencer",
+ ":message_differencer_unittest_cc_proto",
+ "//src/google/protobuf:cc_test_protos",
+ "//src/google/protobuf:test_util",
+ "//src/google/protobuf/testing",
+ "@com_google_absl//absl/functional:bind_front",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_library(
+ name = "field_mask_util",
+ srcs = ["field_mask_util.cc"],
+ hdrs = ["field_mask_util.h"],
+ copts = COPTS,
+ strip_include_prefix = "/src",
+ visibility = ["//:__subpackages__"],
+ deps = [
+ "//src/google/protobuf",
+ "//src/google/protobuf/stubs",
+ ],
+)
+
+cc_test(
+ name = "field_mask_util_test",
+ srcs = ["field_mask_util_test.cc"],
+ copts = COPTS,
+ deps = [
+ ":field_mask_util",
+ "//src/google/protobuf",
+ "//src/google/protobuf:cc_test_protos",
+ "//src/google/protobuf:test_util",
+ "//src/google/protobuf/stubs",
+ "//src/google/protobuf/testing",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_library(
+ name = "json_util",
+ srcs = ["json_util.cc"],
+ hdrs = ["json_util.h"],
+ copts = COPTS,
+ strip_include_prefix = "/src",
+ visibility = ["//:__subpackages__"],
+ deps = [
+ ":type_resolver_util",
+ "//src/google/protobuf",
+ "//src/google/protobuf/io",
+ "//src/google/protobuf/io:zero_copy_sink",
+ "//src/google/protobuf/stubs",
+ "//src/google/protobuf/util/internal:default_value",
+ "//src/google/protobuf/util/internal:json",
+ "//src/google/protobuf/util/internal:protostream",
+ "//src/google/protobuf/util/internal:utility",
+ "@com_google_absl//absl/status",
+ ],
+)
+
+cc_test(
+ name = "json_util_test",
+ srcs = ["json_util_test.cc"],
+ copts = COPTS,
+ data = [
+ "//src/google/protobuf:testdata",
+ ],
+ deps = [
+ ":json_format_cc_proto",
+ ":json_format_proto3_cc_proto",
+ ":json_util",
+ "//src/google/protobuf",
+ "//src/google/protobuf:cc_test_protos",
+ "//src/google/protobuf:test_util",
+ "//src/google/protobuf/testing",
+ "//src/google/protobuf/util/internal:maps_cc_proto",
+ "@com_google_absl//absl/status",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_library(
+ name = "time_util",
+ srcs = ["time_util.cc"],
+ hdrs = ["time_util.h"],
+ strip_include_prefix = "/src",
+ visibility = ["//:__subpackages__"],
+ deps = [
+ "//src/google/protobuf",
+ "//src/google/protobuf/stubs",
+ ],
+)
+
+cc_test(
+ name = "time_util_test",
+ srcs = ["time_util_test.cc"],
+ deps = [
+ ":time_util",
+ "//src/google/protobuf",
+ "//src/google/protobuf/testing",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_library(
+ name = "type_resolver_util",
+ srcs = ["type_resolver_util.cc"],
+ hdrs = [
+ "type_resolver.h",
+ "type_resolver_util.h",
+ ],
+ copts = COPTS,
+ strip_include_prefix = "/src",
+ visibility = ["//:__subpackages__"],
+ deps = [
+ "//src/google/protobuf",
+ "//src/google/protobuf/io",
+ "//src/google/protobuf/stubs",
+ "//src/google/protobuf/util/internal:utility",
+ "@com_google_absl//absl/status",
+ ],
+)
+
+cc_test(
+ name = "type_resolver_util_test",
+ srcs = ["type_resolver_util_test.cc"],
+ copts = COPTS,
+ deps = [
+ ":json_format_cc_proto",
+ ":json_format_proto3_cc_proto",
+ ":json_util",
+ "//src/google/protobuf",
+ "//src/google/protobuf:test_util",
+ "//src/google/protobuf/testing",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+# Testonly protos
+
+filegroup(
+ name = "test_proto_srcs",
+ testonly = 1,
+ srcs = [
+ "json_format.proto",
+ "json_format_proto3.proto",
+ "message_differencer_unittest.proto",
+ "//src/google/protobuf/util/internal:test_proto_srcs",
+ ],
+ visibility = [
+ "//pkg:__pkg__",
+ "//python:__pkg__",
+ ],
+)
+
+proto_library(
+ name = "json_format_proto",
+ testonly = 1,
+ srcs = ["json_format.proto"],
+ strip_import_prefix = "/src",
+)
+
+cc_proto_library(
+ name = "json_format_cc_proto",
+ testonly = 1,
+ deps = [":json_format_proto"],
+)
+
+proto_library(
+ name = "json_format_proto3_proto",
+ testonly = 1,
+ srcs = ["json_format_proto3.proto"],
+ strip_import_prefix = "/src",
+ deps = [
+ "//:any_proto",
+ "//:duration_proto",
+ "//:field_mask_proto",
+ "//:struct_proto",
+ "//:test_protos",
+ "//:timestamp_proto",
+ "//:wrappers_proto",
+ ],
+)
+
+cc_proto_library(
+ name = "json_format_proto3_cc_proto",
+ testonly = 1,
+ deps = [":json_format_proto3_proto"],
+)
+
+proto_library(
+ name = "message_differencer_unittest_proto",
+ testonly = 1,
+ srcs = ["message_differencer_unittest.proto"],
+ strip_import_prefix = "/src",
+ deps = ["//:any_proto"],
+)
+
+cc_proto_library(
+ name = "message_differencer_unittest_cc_proto",
+ testonly = 1,
+ deps = [":message_differencer_unittest_proto"],
+)
+
+################################################################################
+# Distribution packaging
+################################################################################
+
+pkg_files(
+ name = "dist_files",
+ srcs = glob(["**"]),
+ strip_prefix = strip_prefix.from_root(""),
+ visibility = ["//src:__pkg__"],
+)
+
+filegroup(
+ name = "test_srcs",
+ srcs = glob([
+ "*_test.cc",
+ "*unittest.cc",
+ ]) + [
+ "//src/google/protobuf/util/internal:test_srcs",
+ ],
+ visibility = ["//pkg:__pkg__"],
+)
diff --git a/src/google/protobuf/util/delimited_message_util.cc b/src/google/protobuf/util/delimited_message_util.cc
index fdc633f..36b51e9 100644
--- a/src/google/protobuf/util/delimited_message_util.cc
+++ b/src/google/protobuf/util/delimited_message_util.cc
@@ -31,8 +31,8 @@
// Adapted from the patch of kenton@google.com (Kenton Varda)
// See https://github.com/protocolbuffers/protobuf/pull/710 for details.
-#include <google/protobuf/util/delimited_message_util.h>
-#include <google/protobuf/io/coded_stream.h>
+#include "google/protobuf/util/delimited_message_util.h"
+#include "google/protobuf/io/coded_stream.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/util/delimited_message_util.h b/src/google/protobuf/util/delimited_message_util.h
index 78625cf..9a4e066 100644
--- a/src/google/protobuf/util/delimited_message_util.h
+++ b/src/google/protobuf/util/delimited_message_util.h
@@ -37,12 +37,12 @@
#include <ostream>
-#include <google/protobuf/message_lite.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
+#include "google/protobuf/message_lite.h"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/io/zero_copy_stream_impl.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -104,6 +104,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_UTIL_DELIMITED_MESSAGE_UTIL_H__
diff --git a/src/google/protobuf/util/delimited_message_util_test.cc b/src/google/protobuf/util/delimited_message_util_test.cc
index 9483a64..954afb2 100644
--- a/src/google/protobuf/util/delimited_message_util_test.cc
+++ b/src/google/protobuf/util/delimited_message_util_test.cc
@@ -31,13 +31,13 @@
// Adapted from the patch of kenton@google.com (Kenton Varda)
// See https://github.com/protocolbuffers/protobuf/pull/710 for details.
-#include <google/protobuf/util/delimited_message_util.h>
+#include "google/protobuf/util/delimited_message_util.h"
#include <sstream>
-#include <google/protobuf/test_util.h>
-#include <google/protobuf/unittest.pb.h>
-#include <google/protobuf/testing/googletest.h>
+#include "google/protobuf/test_util.h"
+#include "google/protobuf/unittest.pb.h"
+#include "google/protobuf/testing/googletest.h"
#include <gtest/gtest.h>
namespace google {
diff --git a/src/google/protobuf/util/field_comparator.cc b/src/google/protobuf/util/field_comparator.cc
index 5d8e865..9161d53 100644
--- a/src/google/protobuf/util/field_comparator.cc
+++ b/src/google/protobuf/util/field_comparator.cc
@@ -30,16 +30,15 @@
// Author: ksroka@google.com (Krzysztof Sroka)
-#include <google/protobuf/util/field_comparator.h>
+#include "google/protobuf/util/field_comparator.h"
#include <limits>
#include <string>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/message.h>
-#include <google/protobuf/util/message_differencer.h>
-#include <google/protobuf/stubs/map_util.h>
-#include <google/protobuf/stubs/mathutil.h>
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/message.h"
+#include "google/protobuf/util/message_differencer.h"
+#include "google/protobuf/stubs/mathutil.h"
namespace google {
namespace protobuf {
@@ -183,19 +182,23 @@
return true;
}
// float_comparison_ == APPROXIMATE covers two use cases.
- Tolerance* tolerance = FindOrNull(map_tolerance_, &field);
- if (tolerance == NULL && has_default_tolerance_) {
- tolerance = &default_tolerance_;
+ Tolerance* tolerance = nullptr;
+ if (has_default_tolerance_) tolerance = &default_tolerance_;
+
+ auto it = map_tolerance_.find(&field);
+ if (it != map_tolerance_.end()) {
+ tolerance = &it->second;
}
- if (tolerance == NULL) {
- return MathUtil::AlmostEquals(value_1, value_2);
- } else {
+
+ if (tolerance != nullptr) {
// Use user-provided fraction and margin. Since they are stored as
// doubles, we explicitly cast them to types of values provided. This
// is very likely to fail if provided values are not numeric.
return MathUtil::WithinFractionOrMargin(
value_1, value_2, static_cast<T>(tolerance->fraction),
static_cast<T>(tolerance->margin));
+ } else {
+ return MathUtil::AlmostEquals(value_1, value_2);
}
}
}
diff --git a/src/google/protobuf/util/field_comparator.h b/src/google/protobuf/util/field_comparator.h
index 5706da3..1988b9e 100644
--- a/src/google/protobuf/util/field_comparator.h
+++ b/src/google/protobuf/util/field_comparator.h
@@ -39,10 +39,11 @@
#include <string>
#include <vector>
-#include <google/protobuf/stubs/common.h>
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/port.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -63,6 +64,8 @@
class PROTOBUF_EXPORT FieldComparator {
public:
FieldComparator();
+ FieldComparator(const FieldComparator&) = delete;
+ FieldComparator& operator=(const FieldComparator&) = delete;
virtual ~FieldComparator();
enum ComparisonResult {
@@ -92,9 +95,6 @@
const FieldDescriptor* field, int index_1,
int index_2,
const util::FieldContext* field_context) = 0;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FieldComparator);
};
// Basic implementation of FieldComparator. Supports three modes of floating
@@ -113,6 +113,8 @@
// Creates new comparator with float comparison set to EXACT.
SimpleFieldComparator();
+ SimpleFieldComparator(const SimpleFieldComparator&) = delete;
+ SimpleFieldComparator& operator=(const SimpleFieldComparator&) = delete;
~SimpleFieldComparator() override;
@@ -257,18 +259,11 @@
// Field-specific float/double tolerances, which override any default for
// those particular fields.
ToleranceMap map_tolerance_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(SimpleFieldComparator);
};
// Default field comparison: use the basic implementation of FieldComparator.
-#ifdef PROTOBUF_FUTURE_BREAKING_CHANGES
-class PROTOBUF_EXPORT DefaultFieldComparator final
- : public SimpleFieldComparator
-#else // PROTOBUF_FUTURE_BREAKING_CHANGES
-class PROTOBUF_EXPORT DefaultFieldComparator : public SimpleFieldComparator
-#endif // PROTOBUF_FUTURE_BREAKING_CHANGES
-{
+class PROTOBUF_EXPORT DefaultFieldComparator PROTOBUF_FUTURE_FINAL
+ : public SimpleFieldComparator {
public:
ComparisonResult Compare(const Message& message_1, const Message& message_2,
const FieldDescriptor* field, int index_1,
@@ -283,6 +278,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_UTIL_FIELD_COMPARATOR_H__
diff --git a/src/google/protobuf/util/field_comparator_test.cc b/src/google/protobuf/util/field_comparator_test.cc
index b680277..a6de21c 100644
--- a/src/google/protobuf/util/field_comparator_test.cc
+++ b/src/google/protobuf/util/field_comparator_test.cc
@@ -30,14 +30,14 @@
// Author: ksroka@google.com (Krzysztof Sroka)
-#include <google/protobuf/util/field_comparator.h>
+#include "google/protobuf/util/field_comparator.h"
#include <limits>
-#include <google/protobuf/unittest.pb.h>
-#include <google/protobuf/descriptor.h>
+#include "google/protobuf/unittest.pb.h"
+#include "google/protobuf/descriptor.h"
#include <gtest/gtest.h>
-#include <google/protobuf/stubs/mathutil.h>
+#include "google/protobuf/stubs/mathutil.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/util/field_mask_util.cc b/src/google/protobuf/util/field_mask_util.cc
index 700e590..ef47730 100644
--- a/src/google/protobuf/util/field_mask_util.cc
+++ b/src/google/protobuf/util/field_mask_util.cc
@@ -28,16 +28,19 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/util/field_mask_util.h>
+#include "google/protobuf/util/field_mask_util.h"
#include <cstdint>
+#include <map>
+#include <string>
+#include <vector>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/message.h>
-#include <google/protobuf/stubs/map_util.h>
+#include "absl/strings/str_join.h"
+#include "absl/strings/str_split.h"
+#include "google/protobuf/message.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -46,19 +49,19 @@
using google::protobuf::FieldMask;
std::string FieldMaskUtil::ToString(const FieldMask& mask) {
- return Join(mask.paths(), ",");
+ return absl::StrJoin(mask.paths(), ",");
}
-void FieldMaskUtil::FromString(StringPiece str, FieldMask* out) {
+void FieldMaskUtil::FromString(absl::string_view str, FieldMask* out) {
out->Clear();
- std::vector<std::string> paths = Split(str, ",");
+ std::vector<std::string> paths = absl::StrSplit(str, ',');
for (const std::string& path : paths) {
if (path.empty()) continue;
out->add_paths(path);
}
}
-bool FieldMaskUtil::SnakeCaseToCamelCase(StringPiece input,
+bool FieldMaskUtil::SnakeCaseToCamelCase(absl::string_view input,
std::string* output) {
output->clear();
bool after_underscore = false;
@@ -88,7 +91,7 @@
return true;
}
-bool FieldMaskUtil::CamelCaseToSnakeCase(StringPiece input,
+bool FieldMaskUtil::CamelCaseToSnakeCase(absl::string_view input,
std::string* output) {
output->clear();
for (const char c : input) {
@@ -122,9 +125,9 @@
return true;
}
-bool FieldMaskUtil::FromJsonString(StringPiece str, FieldMask* out) {
+bool FieldMaskUtil::FromJsonString(absl::string_view str, FieldMask* out) {
out->Clear();
- std::vector<std::string> paths = Split(str, ",");
+ std::vector<std::string> paths = absl::StrSplit(str, ',');
for (const std::string& path : paths) {
if (path.empty()) continue;
std::string snakecase_path;
@@ -137,12 +140,12 @@
}
bool FieldMaskUtil::GetFieldDescriptors(
- const Descriptor* descriptor, StringPiece path,
+ const Descriptor* descriptor, absl::string_view path,
std::vector<const FieldDescriptor*>* field_descriptors) {
if (field_descriptors != nullptr) {
field_descriptors->clear();
}
- std::vector<std::string> parts = Split(path, ".");
+ std::vector<std::string> parts = absl::StrSplit(path, '.');
for (const std::string& field_name : parts) {
if (descriptor == nullptr) {
return false;
@@ -185,6 +188,8 @@
class FieldMaskTree {
public:
FieldMaskTree();
+ FieldMaskTree(const FieldMaskTree&) = delete;
+ FieldMaskTree& operator=(const FieldMaskTree&) = delete;
~FieldMaskTree();
void MergeFromFieldMask(const FieldMask& mask);
@@ -246,21 +251,19 @@
private:
struct Node {
Node() {}
+ Node(const Node&) = delete;
+ Node& operator=(const Node&) = delete;
~Node() { ClearChildren(); }
void ClearChildren() {
- for (std::map<std::string, Node*>::iterator it = children.begin();
- it != children.end(); ++it) {
- delete it->second;
+ for (auto& p : children) {
+ delete p.second;
}
children.clear();
}
std::map<std::string, Node*> children;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Node);
};
// Merge a sub-tree to mask. This method adds the field paths represented
@@ -288,8 +291,6 @@
bool TrimMessage(const Node* node, Message* message);
Node root_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FieldMaskTree);
};
FieldMaskTree::FieldMaskTree() {}
@@ -325,7 +326,7 @@
}
void FieldMaskTree::AddPath(const std::string& path) {
- std::vector<std::string> parts = Split(path, ".");
+ std::vector<std::string> parts = absl::StrSplit(path, '.');
if (parts.empty()) {
return;
}
@@ -358,7 +359,7 @@
// code below.
return;
}
- std::vector<std::string> parts = Split(path, ".");
+ std::vector<std::string> parts = absl::StrSplit(path, '.');
if (parts.empty()) {
return;
}
@@ -389,14 +390,11 @@
node->children[current_descriptor->field(j)->name()] = new Node();
}
}
- if (ContainsKey(node->children, parts[i])) {
- node = node->children[parts[i]];
- if (field_descriptor->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
- current_descriptor = field_descriptor->message_type();
- }
- } else {
- // Path does not exist.
- return;
+ auto it = node->children.find(parts[i]);
+ if (it == node->children.end()) return;
+ node = it->second;
+ if (field_descriptor->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
+ current_descriptor = field_descriptor->message_type();
}
}
// Remove path.
@@ -410,7 +408,7 @@
}
void FieldMaskTree::IntersectPath(const std::string& path, FieldMaskTree* out) {
- std::vector<std::string> parts = Split(path, ".");
+ std::vector<std::string> parts = absl::StrSplit(path, '.');
if (parts.empty()) {
return;
}
@@ -422,12 +420,12 @@
}
return;
}
- const Node* result = FindPtrOrNull(node->children, node_name);
- if (result == nullptr) {
+ auto it = node->children.find(node_name);
+ if (it == node->children.end()) {
// No intersection found.
return;
}
- node = result;
+ node = it->second;
}
// Now we found a matching node with the given path. Add all leaf nodes
// to out.
@@ -665,7 +663,7 @@
tree.MergeToFieldMask(out);
}
-bool FieldMaskUtil::IsPathInFieldMask(StringPiece path,
+bool FieldMaskUtil::IsPathInFieldMask(absl::string_view path,
const FieldMask& mask) {
for (int i = 0; i < mask.paths_size(); ++i) {
const std::string& mask_path = mask.paths(i);
diff --git a/src/google/protobuf/util/field_mask_util.h b/src/google/protobuf/util/field_mask_util.h
index d51a332..03fb6a1 100644
--- a/src/google/protobuf/util/field_mask_util.h
+++ b/src/google/protobuf/util/field_mask_util.h
@@ -35,13 +35,14 @@
#include <cstdint>
#include <string>
+#include <vector>
-#include <google/protobuf/field_mask.pb.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/descriptor.h>
+#include "google/protobuf/field_mask.pb.h"
+#include "absl/strings/string_view.h"
+#include "google/protobuf/descriptor.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -54,7 +55,7 @@
// Converts FieldMask to/from string, formatted by separating each path
// with a comma (e.g., "foo_bar,baz.quz").
static std::string ToString(const FieldMask& mask);
- static void FromString(StringPiece str, FieldMask* out);
+ static void FromString(absl::string_view str, FieldMask* out);
// Populates the FieldMask with the paths corresponding to the fields with the
// given numbers, after checking that all field numbers are valid.
@@ -76,19 +77,19 @@
// style conforming (i.e., not snake_case when converted to string, or not
// camelCase when converted from string), the conversion will fail.
static bool ToJsonString(const FieldMask& mask, std::string* out);
- static bool FromJsonString(StringPiece str, FieldMask* out);
+ static bool FromJsonString(absl::string_view str, FieldMask* out);
// Get the descriptors of the fields which the given path from the message
// descriptor traverses, if field_descriptors is not null.
// Return false if the path is not valid, and the content of field_descriptors
// is unspecified.
static bool GetFieldDescriptors(
- const Descriptor* descriptor, StringPiece path,
+ const Descriptor* descriptor, absl::string_view path,
std::vector<const FieldDescriptor*>* field_descriptors);
// Checks whether the given path is valid for type T.
template <typename T>
- static bool IsValidPath(StringPiece path) {
+ static bool IsValidPath(absl::string_view path) {
return GetFieldDescriptors(T::descriptor(), path, nullptr);
}
@@ -106,7 +107,7 @@
// Adds a path to FieldMask after checking whether the given path is valid.
// This method check-fails if the path is not a valid path for type T.
template <typename T>
- static void AddPathToFieldMask(StringPiece path, FieldMask* mask) {
+ static void AddPathToFieldMask(absl::string_view path, FieldMask* mask) {
GOOGLE_CHECK(IsValidPath<T>(path)) << path;
mask->add_paths(std::string(path));
}
@@ -159,7 +160,7 @@
// "foo.bar" covers all paths like "foo.bar.baz", "foo.bar.quz.x", etc.
// Also note that parent paths are not covered by explicit child path, i.e.
// "foo.bar" does NOT cover "foo", even if "bar" is the only child.
- static bool IsPathInFieldMask(StringPiece path, const FieldMask& mask);
+ static bool IsPathInFieldMask(absl::string_view path, const FieldMask& mask);
class MergeOptions;
// Merges fields specified in a FieldMask into another message.
@@ -194,7 +195,7 @@
// Note that the input can contain characters not allowed in C identifiers.
// For example, "foo_bar,baz_quz" will be converted to "fooBar,bazQuz"
// successfully.
- static bool SnakeCaseToCamelCase(StringPiece input,
+ static bool SnakeCaseToCamelCase(absl::string_view input,
std::string* output);
// Converts a field name from camelCase to snake_case:
// 1. Every uppercase letter is converted to lowercase with an additional
@@ -208,7 +209,7 @@
// Note that the input can contain characters not allowed in C identifiers.
// For example, "fooBar,bazQuz" will be converted to "foo_bar,baz_quz"
// successfully.
- static bool CamelCaseToSnakeCase(StringPiece input,
+ static bool CamelCaseToSnakeCase(absl::string_view input,
std::string* output);
};
@@ -258,6 +259,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_UTIL_FIELD_MASK_UTIL_H__
diff --git a/src/google/protobuf/util/field_mask_util_test.cc b/src/google/protobuf/util/field_mask_util_test.cc
index bcad739..a67a025 100644
--- a/src/google/protobuf/util/field_mask_util_test.cc
+++ b/src/google/protobuf/util/field_mask_util_test.cc
@@ -28,18 +28,18 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/util/field_mask_util.h>
+#include "google/protobuf/util/field_mask_util.h"
#include <algorithm>
#include <cstdint>
#include <vector>
-#include <google/protobuf/field_mask.pb.h>
-#include <google/protobuf/test_util.h>
-#include <google/protobuf/unittest.pb.h>
+#include "google/protobuf/field_mask.pb.h"
+#include "google/protobuf/test_util.h"
+#include "google/protobuf/unittest.pb.h"
#include <gtest/gtest.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/util/internal/BUILD.bazel b/src/google/protobuf/util/internal/BUILD.bazel
new file mode 100644
index 0000000..a982f16
--- /dev/null
+++ b/src/google/protobuf/util/internal/BUILD.bazel
@@ -0,0 +1,473 @@
+################################################################################
+# Protocol Buffers C++ util internals.
+################################################################################
+
+load("@rules_cc//cc:defs.bzl", "cc_library", "cc_proto_library", "cc_test")
+load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
+load("@rules_proto//proto:defs.bzl", "proto_library")
+load("//build_defs:cpp_opts.bzl", "COPTS")
+
+package(
+ default_visibility = [
+ "//pkg:__pkg__",
+ "//src/google/protobuf/util:__pkg__",
+ ],
+)
+
+cc_library(
+ name = "constants",
+ hdrs = ["constants.h"],
+ strip_include_prefix = "/src",
+ deps = [
+ "//src/google/protobuf/stubs",
+ ],
+)
+
+cc_library(
+ name = "datapiece",
+ srcs = ["datapiece.cc"],
+ hdrs = ["datapiece.h"],
+ copts = COPTS,
+ strip_include_prefix = "/src",
+ deps = [
+ ":constants",
+ ":utility",
+ "//src/google/protobuf",
+ "//src/google/protobuf/stubs",
+ "@com_google_absl//absl/strings",
+ ],
+)
+
+cc_library(
+ name = "default_value",
+ srcs = ["default_value_objectwriter.cc"],
+ hdrs = ["default_value_objectwriter.h"],
+ copts = COPTS,
+ strip_include_prefix = "/src",
+ deps = [
+ ":datapiece",
+ ":object_writer",
+ ":type_info",
+ ":utility",
+ "//src/google/protobuf/stubs",
+ ],
+)
+
+cc_test(
+ name = "default_value_objectwriter_test",
+ srcs = ["default_value_objectwriter_test.cc"],
+ copts = COPTS,
+ deps = [
+ ":default_value",
+ ":default_value_test_cc_proto",
+ ":expecting_objectwriter",
+ ":type_info_test_helper",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_library(
+ name = "expecting_objectwriter",
+ testonly = 1,
+ hdrs = ["expecting_objectwriter.h"],
+ strip_include_prefix = "/src",
+ deps = [":object_writer"],
+)
+
+cc_library(
+ name = "field_mask_utility",
+ srcs = ["field_mask_utility.cc"],
+ hdrs = ["field_mask_utility.h"],
+ strip_include_prefix = "/src",
+ deps = [
+ ":utility",
+ "//src/google/protobuf/stubs",
+ ],
+)
+
+cc_library(
+ name = "json",
+ srcs = [
+ "json_escaping.cc",
+ "json_objectwriter.cc",
+ "json_stream_parser.cc",
+ ],
+ hdrs = [
+ "json_escaping.h",
+ "json_objectwriter.h",
+ "json_stream_parser.h",
+ ],
+ copts = COPTS,
+ strip_include_prefix = "/src",
+ deps = [
+ ":object_writer",
+ ":utility",
+ "//src/google/protobuf",
+ "//src/google/protobuf/io",
+ "//src/google/protobuf/stubs",
+ "@com_google_absl//absl/status",
+ "@com_google_absl//absl/strings",
+ ],
+)
+
+cc_test(
+ name = "json_objectwriter_test",
+ srcs = ["json_objectwriter_test.cc"],
+ copts = COPTS,
+ deps = [
+ ":json",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_test(
+ name = "json_stream_parser_test",
+ srcs = ["json_stream_parser_test.cc"],
+ copts = COPTS,
+ deps = [
+ ":expecting_objectwriter",
+ ":json",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_library(
+ name = "mock_error_listener",
+ testonly = 1,
+ hdrs = ["mock_error_listener.h"],
+ strip_include_prefix = "/src",
+ deps = [":protostream"],
+)
+
+cc_library(
+ name = "object_writer",
+ srcs = ["object_writer.cc"],
+ hdrs = [
+ "object_source.h",
+ "object_writer.h",
+ "structured_objectwriter.h",
+ ],
+ strip_include_prefix = "/src",
+ deps = [
+ ":datapiece",
+ "//src/google/protobuf/stubs",
+ ],
+)
+
+cc_library(
+ name = "type_info",
+ srcs = ["type_info.cc"],
+ hdrs = ["type_info.h"],
+ strip_include_prefix = "/src",
+ deps = [
+ ":utility",
+ "//src/google/protobuf/stubs",
+ "//src/google/protobuf/util:type_resolver_util",
+ ],
+)
+
+cc_library(
+ name = "type_info_test_helper",
+ testonly = 1,
+ srcs = ["type_info_test_helper.cc"],
+ hdrs = ["type_info_test_helper.h"],
+ copts = COPTS,
+ strip_include_prefix = "/src",
+ deps = [
+ ":default_value",
+ ":protostream",
+ ":type_info",
+ ],
+)
+
+cc_library(
+ name = "protostream",
+ srcs = [
+ "error_listener.cc",
+ "proto_writer.cc",
+ "protostream_objectsource.cc",
+ "protostream_objectwriter.cc",
+ ],
+ hdrs = [
+ "error_listener.h",
+ "location_tracker.h",
+ "object_location_tracker.h",
+ "proto_writer.h",
+ "protostream_objectsource.h",
+ "protostream_objectwriter.h",
+ ],
+ copts = COPTS,
+ strip_include_prefix = "/src",
+ deps = [
+ ":constants",
+ ":datapiece",
+ ":field_mask_utility",
+ ":object_writer",
+ ":type_info",
+ ":utility",
+ "//src/google/protobuf",
+ "//src/google/protobuf/io",
+ "//src/google/protobuf/stubs",
+ "//src/google/protobuf/util:type_resolver_util",
+ "@com_google_absl//absl/strings",
+ ],
+)
+
+cc_test(
+ name = "protostream_objectsource_test",
+ srcs = ["protostream_objectsource_test.cc"],
+ copts = COPTS,
+ deps = [
+ ":anys_cc_proto",
+ ":books_cc_proto",
+ ":expecting_objectwriter",
+ ":field_mask_cc_proto",
+ ":maps_cc_proto",
+ ":oneofs_cc_proto",
+ ":proto3_cc_proto",
+ ":protostream",
+ ":struct_cc_proto",
+ ":timestamp_duration_cc_proto",
+ ":type_info_test_helper",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_test(
+ name = "protostream_objectwriter_test",
+ srcs = ["protostream_objectwriter_test.cc"],
+ copts = COPTS,
+ deps = [
+ ":anys_cc_proto",
+ ":books_cc_proto",
+ ":field_mask_cc_proto",
+ ":maps_cc_proto",
+ ":mock_error_listener",
+ ":oneofs_cc_proto",
+ ":proto3_cc_proto",
+ ":protostream",
+ ":struct_cc_proto",
+ ":timestamp_duration_cc_proto",
+ ":type_info_test_helper",
+ ":wrappers_cc_proto",
+ "@com_google_googletest//:gtest",
+ "@com_google_googletest//:gtest_main",
+ ],
+)
+
+cc_library(
+ name = "utility",
+ srcs = ["utility.cc"],
+ hdrs = ["utility.h"],
+ copts = COPTS,
+ strip_include_prefix = "/src",
+ deps = [
+ ":constants",
+ "//src/google/protobuf",
+ "//src/google/protobuf/stubs",
+ "@com_google_absl//absl/strings",
+ ],
+)
+
+# Testing protos:
+
+proto_library(
+ name = "anys_proto",
+ testonly = 1,
+ srcs = ["testdata/anys.proto"],
+ strip_import_prefix = "/src",
+ deps = [
+ "//:any_proto",
+ "//:duration_proto",
+ "//:empty_proto",
+ "//:struct_proto",
+ "//:timestamp_proto",
+ "//:wrappers_proto",
+ ],
+)
+
+cc_proto_library(
+ name = "anys_cc_proto",
+ testonly = 1,
+ visibility = ["//src/google/protobuf/util:__pkg__"],
+ deps = [":anys_proto"],
+)
+
+proto_library(
+ name = "books_proto",
+ testonly = 1,
+ srcs = ["testdata/books.proto"],
+ strip_import_prefix = "/src",
+ deps = [":anys_proto"],
+)
+
+cc_proto_library(
+ name = "books_cc_proto",
+ testonly = 1,
+ deps = [":books_proto"],
+)
+
+proto_library(
+ name = "default_value_proto",
+ testonly = 1,
+ srcs = ["testdata/default_value.proto"],
+ strip_import_prefix = "/src",
+ deps = [
+ "//:any_proto",
+ "//:struct_proto",
+ "//:wrappers_proto",
+ ],
+)
+
+cc_proto_library(
+ name = "default_value_cc_proto",
+ testonly = 1,
+ deps = [":default_value_proto"],
+)
+
+proto_library(
+ name = "default_value_test_proto",
+ testonly = 1,
+ srcs = ["testdata/default_value_test.proto"],
+ strip_import_prefix = "/src",
+)
+
+cc_proto_library(
+ name = "default_value_test_cc_proto",
+ testonly = 1,
+ deps = [":default_value_test_proto"],
+)
+
+proto_library(
+ name = "field_mask_proto",
+ testonly = 1,
+ srcs = ["testdata/field_mask.proto"],
+ strip_import_prefix = "/src",
+ deps = ["//:field_mask_proto"],
+)
+
+cc_proto_library(
+ name = "field_mask_cc_proto",
+ testonly = 1,
+ deps = [":field_mask_proto"],
+)
+
+proto_library(
+ name = "maps_proto",
+ testonly = 1,
+ srcs = ["testdata/maps.proto"],
+ strip_import_prefix = "/src",
+ deps = ["//:any_proto"],
+)
+
+cc_proto_library(
+ name = "maps_cc_proto",
+ testonly = 1,
+ deps = [":maps_proto"],
+)
+
+proto_library(
+ name = "oneofs_proto",
+ testonly = 1,
+ srcs = ["testdata/oneofs.proto"],
+ strip_import_prefix = "/src",
+ deps = [
+ "//:any_proto",
+ "//:struct_proto",
+ "//:timestamp_proto",
+ ],
+)
+
+cc_proto_library(
+ name = "oneofs_cc_proto",
+ testonly = 1,
+ deps = [":oneofs_proto"],
+)
+
+proto_library(
+ name = "proto3_proto",
+ testonly = 1,
+ srcs = ["testdata/proto3.proto"],
+ strip_import_prefix = "/src",
+)
+
+cc_proto_library(
+ name = "proto3_cc_proto",
+ testonly = 1,
+ deps = [":proto3_proto"],
+)
+
+proto_library(
+ name = "struct_proto",
+ testonly = 1,
+ srcs = ["testdata/struct.proto"],
+ strip_import_prefix = "/src",
+ deps = ["//:struct_proto"],
+)
+
+cc_proto_library(
+ name = "struct_cc_proto",
+ testonly = 1,
+ deps = [":struct_proto"],
+)
+
+proto_library(
+ name = "timestamp_duration_proto",
+ testonly = 1,
+ srcs = ["testdata/timestamp_duration.proto"],
+ strip_import_prefix = "/src",
+ deps = [
+ "//:duration_proto",
+ "//:timestamp_proto",
+ ],
+)
+
+cc_proto_library(
+ name = "timestamp_duration_cc_proto",
+ testonly = 1,
+ deps = [":timestamp_duration_proto"],
+)
+
+proto_library(
+ name = "wrappers_proto",
+ testonly = 1,
+ srcs = ["testdata/wrappers.proto"],
+ strip_import_prefix = "/src",
+ deps = ["//:wrappers_proto"],
+)
+
+cc_proto_library(
+ name = "wrappers_cc_proto",
+ testonly = 1,
+ deps = [":wrappers_proto"],
+)
+
+################################################################################
+# Distribution packaging
+################################################################################
+
+pkg_files(
+ name = "dist_files",
+ srcs = glob(["**/*"]),
+ strip_prefix = strip_prefix.from_root(""),
+ visibility = ["//src:__pkg__"],
+)
+
+filegroup(
+ name = "test_srcs",
+ srcs = glob([
+ "*_test.cc",
+ "*unittest.cc",
+ ]) + [
+ "type_info_test_helper.cc",
+ ],
+)
+
+filegroup(
+ name = "test_proto_srcs",
+ srcs = glob(["testdata/*.proto"]),
+)
diff --git a/src/google/protobuf/util/internal/constants.h b/src/google/protobuf/util/internal/constants.h
index 8bded86..7c81c47 100644
--- a/src/google/protobuf/util/internal/constants.h
+++ b/src/google/protobuf/util/internal/constants.h
@@ -33,7 +33,7 @@
#include <cstdint>
-#include <google/protobuf/stubs/common.h>
+#include "google/protobuf/stubs/common.h"
// This file contains constants used by //net/proto2/util/converter.
diff --git a/src/google/protobuf/util/internal/datapiece.cc b/src/google/protobuf/util/internal/datapiece.cc
index 3e7aa84..7daed3f 100644
--- a/src/google/protobuf/util/internal/datapiece.cc
+++ b/src/google/protobuf/util/internal/datapiece.cc
@@ -28,36 +28,40 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/util/internal/datapiece.h>
+#include "google/protobuf/util/internal/datapiece.h"
#include <cmath>
#include <cstdint>
#include <limits>
-#include <google/protobuf/struct.pb.h>
-#include <google/protobuf/type.pb.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/stubs/status.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/util/internal/utility.h>
-#include <google/protobuf/stubs/mathutil.h>
+#include "google/protobuf/struct.pb.h"
+#include "google/protobuf/type.pb.h"
+#include "google/protobuf/descriptor.h"
+#include "absl/status/status.h"
+#include "absl/strings/ascii.h"
+#include "absl/strings/escaping.h"
+#include "absl/strings/str_cat.h"
+#include "google/protobuf/util/internal/utility.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "absl/strings/match.h"
+#include "google/protobuf/stubs/mathutil.h"
namespace google {
namespace protobuf {
namespace util {
namespace converter {
-using util::Status;
+using ::absl::Status;
namespace {
template <typename To, typename From>
-util::StatusOr<To> ValidateNumberConversion(To after, From before) {
+absl::StatusOr<To> ValidateNumberConversion(To after, From before) {
if (after == before &&
MathUtil::Sign<From>(before) == MathUtil::Sign<To>(after)) {
return after;
} else {
- return util::InvalidArgumentError(
+ return absl::InvalidArgumentError(
std::is_integral<From>::value ? ValueAsString(before)
: std::is_same<From, double>::value ? DoubleAsString(before)
: FloatAsString(before));
@@ -68,7 +72,7 @@
// int32, int64, uint32, uint64, double and float
// except conversion between double and float.
template <typename To, typename From>
-util::StatusOr<To> NumberConvertAndCheck(From before) {
+absl::StatusOr<To> NumberConvertAndCheck(From before) {
if (std::is_same<From, To>::value) return before;
To after = static_cast<To>(before);
@@ -78,7 +82,7 @@
// For conversion to integer types (int32, int64, uint32, uint64) from floating
// point types (double, float) only.
template <typename To, typename From>
-util::StatusOr<To> FloatingPointToIntConvertAndCheck(From before) {
+absl::StatusOr<To> FloatingPointToIntConvertAndCheck(From before) {
if (std::is_same<From, To>::value) return before;
To after = static_cast<To>(before);
@@ -86,13 +90,13 @@
}
// For conversion between double and float only.
-util::StatusOr<double> FloatToDouble(float before) {
+absl::StatusOr<double> FloatToDouble(float before) {
// Casting float to double should just work as double has more precision
// than float.
return static_cast<double>(before);
}
-util::StatusOr<float> DoubleToFloat(double before) {
+absl::StatusOr<float> DoubleToFloat(double before) {
if (std::isnan(before)) {
return std::numeric_limits<float>::quiet_NaN();
} else if (!std::isfinite(before)) {
@@ -119,7 +123,7 @@
}
}
// Double value outside of the range of float.
- return util::InvalidArgumentError(DoubleAsString(before));
+ return absl::InvalidArgumentError(DoubleAsString(before));
} else {
return static_cast<float>(before);
}
@@ -127,7 +131,7 @@
} // namespace
-util::StatusOr<int32_t> DataPiece::ToInt32() const {
+absl::StatusOr<int32_t> DataPiece::ToInt32() const {
if (type_ == TYPE_STRING)
return StringToNumber<int32_t>(safe_strto32);
@@ -140,7 +144,7 @@
return GenericConvert<int32_t>();
}
-util::StatusOr<uint32_t> DataPiece::ToUint32() const {
+absl::StatusOr<uint32_t> DataPiece::ToUint32() const {
if (type_ == TYPE_STRING)
return StringToNumber<uint32_t>(safe_strtou32);
@@ -153,7 +157,7 @@
return GenericConvert<uint32_t>();
}
-util::StatusOr<int64_t> DataPiece::ToInt64() const {
+absl::StatusOr<int64_t> DataPiece::ToInt64() const {
if (type_ == TYPE_STRING)
return StringToNumber<int64_t>(safe_strto64);
@@ -166,7 +170,7 @@
return GenericConvert<int64_t>();
}
-util::StatusOr<uint64_t> DataPiece::ToUint64() const {
+absl::StatusOr<uint64_t> DataPiece::ToUint64() const {
if (type_ == TYPE_STRING)
return StringToNumber<uint64_t>(safe_strtou64);
@@ -179,7 +183,7 @@
return GenericConvert<uint64_t>();
}
-util::StatusOr<double> DataPiece::ToDouble() const {
+absl::StatusOr<double> DataPiece::ToDouble() const {
if (type_ == TYPE_FLOAT) {
return FloatToDouble(float_);
}
@@ -187,11 +191,11 @@
if (str_ == "Infinity") return std::numeric_limits<double>::infinity();
if (str_ == "-Infinity") return -std::numeric_limits<double>::infinity();
if (str_ == "NaN") return std::numeric_limits<double>::quiet_NaN();
- util::StatusOr<double> value = StringToNumber<double>(safe_strtod);
+ absl::StatusOr<double> value = StringToNumber<double>(safe_strtod);
if (value.ok() && !std::isfinite(value.value())) {
// safe_strtod converts out-of-range values to +inf/-inf, but we want
// to report them as errors.
- return util::InvalidArgumentError(StrCat("\"", str_, "\""));
+ return absl::InvalidArgumentError(absl::StrCat("\"", str_, "\""));
} else {
return value;
}
@@ -199,7 +203,7 @@
return GenericConvert<double>();
}
-util::StatusOr<float> DataPiece::ToFloat() const {
+absl::StatusOr<float> DataPiece::ToFloat() const {
if (type_ == TYPE_DOUBLE) {
return DoubleToFloat(double_);
}
@@ -214,56 +218,59 @@
return GenericConvert<float>();
}
-util::StatusOr<bool> DataPiece::ToBool() const {
+absl::StatusOr<bool> DataPiece::ToBool() const {
switch (type_) {
case TYPE_BOOL:
return bool_;
case TYPE_STRING:
+ // Calls out to absl::SimpleAtob, which supports "true"/"false",
+ // "yes"/"no", "y"/"n", "t"/"f", and "1"/"0".
return StringToNumber<bool>(safe_strtob);
default:
- return util::InvalidArgumentError(
- ValueAsStringOrDefault("Wrong type. Cannot convert to Bool."));
+ break;
}
+ return absl::InvalidArgumentError(
+ ValueAsStringOrDefault("Wrong type. Cannot convert to Bool."));
}
-util::StatusOr<std::string> DataPiece::ToString() const {
+absl::StatusOr<std::string> DataPiece::ToString() const {
switch (type_) {
case TYPE_STRING:
return std::string(str_);
case TYPE_BYTES: {
std::string base64;
- Base64Escape(str_, &base64);
+ absl::Base64Escape(str_, &base64);
return base64;
}
default:
- return util::InvalidArgumentError(
+ return absl::InvalidArgumentError(
ValueAsStringOrDefault("Cannot convert to string."));
}
}
std::string DataPiece::ValueAsStringOrDefault(
- StringPiece default_string) const {
+ absl::string_view default_string) const {
switch (type_) {
case TYPE_INT32:
- return StrCat(i32_);
+ return absl::StrCat(i32_);
case TYPE_INT64:
- return StrCat(i64_);
+ return absl::StrCat(i64_);
case TYPE_UINT32:
- return StrCat(u32_);
+ return absl::StrCat(u32_);
case TYPE_UINT64:
- return StrCat(u64_);
+ return absl::StrCat(u64_);
case TYPE_DOUBLE:
return DoubleAsString(double_);
case TYPE_FLOAT:
return FloatAsString(float_);
case TYPE_BOOL:
- return SimpleBtoa(bool_);
+ return bool_ ? "true" : "false";
case TYPE_STRING:
- return StrCat("\"", str_.ToString(), "\"");
+ return absl::StrCat("\"", str_, "\"");
case TYPE_BYTES: {
std::string base64;
- WebSafeBase64Escape(str_, &base64);
- return StrCat("\"", base64, "\"");
+ absl::WebSafeBase64Escape(str_, &base64);
+ return absl::StrCat("\"", base64, "\"");
}
case TYPE_NULL:
return "null";
@@ -272,22 +279,22 @@
}
}
-util::StatusOr<std::string> DataPiece::ToBytes() const {
- if (type_ == TYPE_BYTES) return str_.ToString();
+absl::StatusOr<std::string> DataPiece::ToBytes() const {
+ if (type_ == TYPE_BYTES) return std::string(str_);
if (type_ == TYPE_STRING) {
std::string decoded;
if (!DecodeBase64(str_, &decoded)) {
- return util::InvalidArgumentError(
+ return absl::InvalidArgumentError(
ValueAsStringOrDefault("Invalid data in input."));
}
return decoded;
} else {
- return util::InvalidArgumentError(ValueAsStringOrDefault(
+ return absl::InvalidArgumentError(ValueAsStringOrDefault(
"Wrong type. Only String or Bytes can be converted to Bytes."));
}
}
-util::StatusOr<int> DataPiece::ToEnum(const google::protobuf::Enum* enum_type,
+absl::StatusOr<int> DataPiece::ToEnum(const google::protobuf::Enum* enum_type,
bool use_lower_camel_for_enums,
bool case_insensitive_enum_parsing,
bool ignore_unknown_enum_values,
@@ -302,7 +309,7 @@
if (value != nullptr) return value->number();
// Check if int version of enum is sent as string.
- util::StatusOr<int32_t> int_value = ToInt32();
+ absl::StatusOr<int32_t> int_value = ToInt32();
if (int_value.ok()) {
if (const google::protobuf::EnumValue* enum_value =
FindEnumValueByNumberOrNull(enum_type, int_value.value())) {
@@ -316,7 +323,7 @@
if (should_normalize_enum) {
for (std::string::iterator it = enum_name.begin(); it != enum_name.end();
++it) {
- *it = *it == '-' ? '_' : ascii_toupper(*it);
+ *it = *it == '-' ? '_' : absl::ascii_toupper(*it);
}
value = FindEnumValueByNameOrNull(enum_type, enum_name);
if (value != nullptr) return value->number();
@@ -342,12 +349,12 @@
// enum because we preserve unknown enum values as well.
return ToInt32();
}
- return util::InvalidArgumentError(
+ return absl::InvalidArgumentError(
ValueAsStringOrDefault("Cannot find enum with given value."));
}
template <typename To>
-util::StatusOr<To> DataPiece::GenericConvert() const {
+absl::StatusOr<To> DataPiece::GenericConvert() const {
switch (type_) {
case TYPE_INT32:
return NumberConvertAndCheck<To, int32_t>(i32_);
@@ -362,49 +369,48 @@
case TYPE_FLOAT:
return NumberConvertAndCheck<To, float>(float_);
default: // TYPE_ENUM, TYPE_STRING, TYPE_CORD, TYPE_BOOL
- return util::InvalidArgumentError(ValueAsStringOrDefault(
+ return absl::InvalidArgumentError(ValueAsStringOrDefault(
"Wrong type. Bool, Enum, String and Cord not supported in "
"GenericConvert."));
}
}
template <typename To>
-util::StatusOr<To> DataPiece::StringToNumber(bool (*func)(StringPiece,
+absl::StatusOr<To> DataPiece::StringToNumber(bool (*func)(absl::string_view,
To*)) const {
if (str_.size() > 0 && (str_[0] == ' ' || str_[str_.size() - 1] == ' ')) {
- return util::InvalidArgumentError(StrCat("\"", str_, "\""));
+ return absl::InvalidArgumentError(absl::StrCat("\"", str_, "\""));
}
To result;
if (func(str_, &result)) return result;
- return util::InvalidArgumentError(
- StrCat("\"", std::string(str_), "\""));
+ return absl::InvalidArgumentError(
+ absl::StrCat("\"", std::string(str_), "\""));
}
-bool DataPiece::DecodeBase64(StringPiece src, std::string* dest) const {
+bool DataPiece::DecodeBase64(absl::string_view src, std::string* dest) const {
// Try web-safe decode first, if it fails, try the non-web-safe decode.
- if (WebSafeBase64Unescape(src, dest)) {
+ if (absl::WebSafeBase64Unescape(src, dest)) {
if (use_strict_base64_decoding_) {
// In strict mode, check if the escaped version gives us the same value as
// unescaped.
std::string encoded;
// WebSafeBase64Escape does no padding by default.
- WebSafeBase64Escape(*dest, &encoded);
+ absl::WebSafeBase64Escape(*dest, &encoded);
// Remove trailing padding '=' characters before comparison.
- StringPiece src_no_padding = StringPiece(src).substr(
- 0, HasSuffixString(src, "=") ? src.find_last_not_of('=') + 1
+ absl::string_view src_no_padding = absl::string_view(src).substr(
+ 0, absl::EndsWith(src, "=") ? src.find_last_not_of('=') + 1
: src.length());
return encoded == src_no_padding;
}
return true;
}
- if (Base64Unescape(src, dest)) {
+ if (absl::Base64Unescape(src, dest)) {
if (use_strict_base64_decoding_) {
std::string encoded;
- Base64Escape(reinterpret_cast<const unsigned char*>(dest->data()),
- dest->length(), &encoded, false);
- StringPiece src_no_padding = StringPiece(src).substr(
- 0, HasSuffixString(src, "=") ? src.find_last_not_of('=') + 1
+ strings::LegacyBase64EscapeWithoutPadding(*dest, &encoded);
+ absl::string_view src_no_padding = absl::string_view(src).substr(
+ 0, absl::EndsWith(src, "=") ? src.find_last_not_of('=') + 1
: src.length());
return encoded == src_no_padding;
}
diff --git a/src/google/protobuf/util/internal/datapiece.h b/src/google/protobuf/util/internal/datapiece.h
index 6d08349..a69e8f0 100644
--- a/src/google/protobuf/util/internal/datapiece.h
+++ b/src/google/protobuf/util/internal/datapiece.h
@@ -34,14 +34,15 @@
#include <cstdint>
#include <string>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/type.pb.h>
-#include <google/protobuf/stubs/statusor.h>
-#include <google/protobuf/stubs/strutil.h>
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/type.pb.h"
+#include "google/protobuf/port.h"
+#include "absl/status/statusor.h"
+#include "absl/strings/string_view.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -54,10 +55,11 @@
// For primitive types (int32, int64, uint32, uint64, double, float, bool),
// the data is stored by value.
//
-// For string, a StringPiece is stored. For Cord, a pointer to Cord is stored.
-// Just like StringPiece, the DataPiece class does not own the storage for
-// the actual string or Cord, so it is the user's responsibility to guarantee
-// that the underlying storage is still valid when the DataPiece is accessed.
+// For string, an absl::string_view is stored. For Cord, a pointer to Cord is
+// stored. Just like absl::string_view, the DataPiece class does not own the
+// storage for the actual string or Cord, so it is the user's responsibility to
+// guarantee that the underlying storage is still valid when the DataPiece is
+// accessed.
class PROTOBUF_EXPORT DataPiece {
public:
// Identifies data type of the value.
@@ -93,12 +95,13 @@
: type_(TYPE_FLOAT), float_(value), use_strict_base64_decoding_(false) {}
explicit DataPiece(const bool value)
: type_(TYPE_BOOL), bool_(value), use_strict_base64_decoding_(false) {}
- DataPiece(StringPiece value, bool use_strict_base64_decoding)
+ DataPiece(absl::string_view value, bool use_strict_base64_decoding)
: type_(TYPE_STRING),
str_(value),
use_strict_base64_decoding_(use_strict_base64_decoding) {}
// Constructor for bytes. The second parameter is not used.
- DataPiece(StringPiece value, bool /*dummy*/, bool use_strict_base64_decoding)
+ DataPiece(absl::string_view value, bool /*dummy*/,
+ bool use_strict_base64_decoding)
: type_(TYPE_BYTES),
str_(value),
use_strict_base64_decoding_(use_strict_base64_decoding) {}
@@ -120,41 +123,41 @@
bool use_strict_base64_decoding() { return use_strict_base64_decoding_; }
- StringPiece str() const {
+ absl::string_view str() const {
GOOGLE_LOG_IF(DFATAL, type_ != TYPE_STRING) << "Not a string type.";
return str_;
}
// Parses, casts or converts the value stored in the DataPiece into an int32.
- util::StatusOr<int32_t> ToInt32() const;
+ absl::StatusOr<int32_t> ToInt32() const;
// Parses, casts or converts the value stored in the DataPiece into a uint32.
- util::StatusOr<uint32_t> ToUint32() const;
+ absl::StatusOr<uint32_t> ToUint32() const;
// Parses, casts or converts the value stored in the DataPiece into an int64.
- util::StatusOr<int64_t> ToInt64() const;
+ absl::StatusOr<int64_t> ToInt64() const;
// Parses, casts or converts the value stored in the DataPiece into a uint64.
- util::StatusOr<uint64_t> ToUint64() const;
+ absl::StatusOr<uint64_t> ToUint64() const;
// Parses, casts or converts the value stored in the DataPiece into a double.
- util::StatusOr<double> ToDouble() const;
+ absl::StatusOr<double> ToDouble() const;
// Parses, casts or converts the value stored in the DataPiece into a float.
- util::StatusOr<float> ToFloat() const;
+ absl::StatusOr<float> ToFloat() const;
// Parses, casts or converts the value stored in the DataPiece into a bool.
- util::StatusOr<bool> ToBool() const;
+ absl::StatusOr<bool> ToBool() const;
// Parses, casts or converts the value stored in the DataPiece into a string.
- util::StatusOr<std::string> ToString() const;
+ absl::StatusOr<std::string> ToString() const;
// Tries to convert the value contained in this datapiece to string. If the
// conversion fails, it returns the default_string.
- std::string ValueAsStringOrDefault(StringPiece default_string) const;
+ std::string ValueAsStringOrDefault(absl::string_view default_string) const;
- util::StatusOr<std::string> ToBytes() const;
+ absl::StatusOr<std::string> ToBytes() const;
private:
friend class ProtoWriter;
@@ -168,7 +171,7 @@
// Same as the ToEnum() method above but with additional flag to ignore
// unknown enum values.
- util::StatusOr<int> ToEnum(const google::protobuf::Enum* enum_type,
+ absl::StatusOr<int> ToEnum(const google::protobuf::Enum* enum_type,
bool use_lower_camel_for_enums,
bool case_insensitive_enum_parsing,
bool ignore_unknown_enum_values,
@@ -177,15 +180,15 @@
// For numeric conversion between
// int32, int64, uint32, uint64, double, float and bool
template <typename To>
- util::StatusOr<To> GenericConvert() const;
+ absl::StatusOr<To> GenericConvert() const;
// For conversion from string to
// int32, int64, uint32, uint64, double, float and bool
template <typename To>
- util::StatusOr<To> StringToNumber(bool (*func)(StringPiece, To*)) const;
+ absl::StatusOr<To> StringToNumber(bool (*func)(absl::string_view, To*)) const;
// Decodes a base64 string. Returns true on success.
- bool DecodeBase64(StringPiece src, std::string* dest) const;
+ bool DecodeBase64(absl::string_view src, std::string* dest) const;
// Helper function to initialize this DataPiece with 'other'.
void InternalCopy(const DataPiece& other);
@@ -202,7 +205,7 @@
double double_;
float float_;
bool bool_;
- StringPiece str_;
+ absl::string_view str_;
};
// Uses a stricter version of base64 decoding for byte fields.
@@ -214,6 +217,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_UTIL_INTERNAL_DATAPIECE_H__
diff --git a/src/google/protobuf/util/internal/default_value_objectwriter.cc b/src/google/protobuf/util/internal/default_value_objectwriter.cc
index 7f61cda..05eccdf 100644
--- a/src/google/protobuf/util/internal/default_value_objectwriter.cc
+++ b/src/google/protobuf/util/internal/default_value_objectwriter.cc
@@ -28,14 +28,13 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/util/internal/default_value_objectwriter.h>
+#include "google/protobuf/util/internal/default_value_objectwriter.h"
#include <cstdint>
-#include <unordered_map>
-#include <google/protobuf/util/internal/constants.h>
-#include <google/protobuf/util/internal/utility.h>
-#include <google/protobuf/stubs/map_util.h>
+#include "absl/container/flat_hash_map.h"
+#include "google/protobuf/util/internal/constants.h"
+#include "google/protobuf/util/internal/utility.h"
namespace google {
namespace protobuf {
@@ -47,11 +46,11 @@
// passed converter function on the DataPiece created from "value" argument.
// If value is empty or if conversion fails, the default_value is returned.
template <typename T>
-T ConvertTo(StringPiece value,
- util::StatusOr<T> (DataPiece::*converter_fn)() const,
+T ConvertTo(absl::string_view value,
+ absl::StatusOr<T> (DataPiece::*converter_fn)() const,
T default_value) {
if (value.empty()) return default_value;
- util::StatusOr<T> result = (DataPiece(value, true).*converter_fn)();
+ absl::StatusOr<T> result = (DataPiece(value, true).*converter_fn)();
return result.ok() ? result.value() : default_value;
}
} // namespace
@@ -76,7 +75,7 @@
}
DefaultValueObjectWriter* DefaultValueObjectWriter::RenderBool(
- StringPiece name, bool value) {
+ absl::string_view name, bool value) {
if (current_ == nullptr) {
ow_->RenderBool(name, value);
} else {
@@ -86,7 +85,7 @@
}
DefaultValueObjectWriter* DefaultValueObjectWriter::RenderInt32(
- StringPiece name, int32_t value) {
+ absl::string_view name, int32_t value) {
if (current_ == nullptr) {
ow_->RenderInt32(name, value);
} else {
@@ -96,7 +95,7 @@
}
DefaultValueObjectWriter* DefaultValueObjectWriter::RenderUint32(
- StringPiece name, uint32_t value) {
+ absl::string_view name, uint32_t value) {
if (current_ == nullptr) {
ow_->RenderUint32(name, value);
} else {
@@ -106,7 +105,7 @@
}
DefaultValueObjectWriter* DefaultValueObjectWriter::RenderInt64(
- StringPiece name, int64_t value) {
+ absl::string_view name, int64_t value) {
if (current_ == nullptr) {
ow_->RenderInt64(name, value);
} else {
@@ -116,7 +115,7 @@
}
DefaultValueObjectWriter* DefaultValueObjectWriter::RenderUint64(
- StringPiece name, uint64_t value) {
+ absl::string_view name, uint64_t value) {
if (current_ == nullptr) {
ow_->RenderUint64(name, value);
} else {
@@ -126,7 +125,7 @@
}
DefaultValueObjectWriter* DefaultValueObjectWriter::RenderDouble(
- StringPiece name, double value) {
+ absl::string_view name, double value) {
if (current_ == nullptr) {
ow_->RenderDouble(name, value);
} else {
@@ -136,7 +135,7 @@
}
DefaultValueObjectWriter* DefaultValueObjectWriter::RenderFloat(
- StringPiece name, float value) {
+ absl::string_view name, float value) {
if (current_ == nullptr) {
ow_->RenderBool(name, value);
} else {
@@ -146,12 +145,12 @@
}
DefaultValueObjectWriter* DefaultValueObjectWriter::RenderString(
- StringPiece name, StringPiece value) {
+ absl::string_view name, absl::string_view value) {
if (current_ == nullptr) {
ow_->RenderString(name, value);
} else {
- // Since StringPiece is essentially a pointer, takes a copy of "value" to
- // avoid ownership issues.
+ // Since absl::string_view is essentially a pointer, takes a copy of
+ // "value" to avoid ownership issues.
string_values_.emplace_back(new std::string(value));
RenderDataPiece(name, DataPiece(*string_values_.back(), true));
}
@@ -159,12 +158,12 @@
}
DefaultValueObjectWriter* DefaultValueObjectWriter::RenderBytes(
- StringPiece name, StringPiece value) {
+ absl::string_view name, absl::string_view value) {
if (current_ == nullptr) {
ow_->RenderBytes(name, value);
} else {
- // Since StringPiece is essentially a pointer, takes a copy of "value" to
- // avoid ownership issues.
+ // Since absl::string_view is essentially a pointer, takes a copy of
+ // "value" to avoid ownership issues.
string_values_.emplace_back(new std::string(value));
RenderDataPiece(name, DataPiece(*string_values_.back(), false, true));
}
@@ -172,7 +171,7 @@
}
DefaultValueObjectWriter* DefaultValueObjectWriter::RenderNull(
- StringPiece name) {
+ absl::string_view name) {
if (current_ == nullptr) {
ow_->RenderNull(name);
} else {
@@ -216,7 +215,7 @@
field_scrub_callback_(std::move(field_scrub_callback)) {}
DefaultValueObjectWriter::Node* DefaultValueObjectWriter::Node::FindChild(
- StringPiece name) {
+ absl::string_view name) {
if (name.empty() || kind_ != OBJECT) {
return nullptr;
}
@@ -283,7 +282,7 @@
// get the field_type in this case.
break;
}
- util::StatusOr<const google::protobuf::Type*> sub_type =
+ absl::StatusOr<const google::protobuf::Type*> sub_type =
typeinfo->ResolveTypeUrl(sub_field.type_url());
if (!sub_type.ok()) {
GOOGLE_LOG(WARNING) << "Cannot resolve type '" << sub_field.type_url() << "'.";
@@ -309,11 +308,11 @@
return;
}
std::vector<Node*> new_children;
- std::unordered_map<std::string, int> orig_children_map;
+ absl::flat_hash_map<absl::string_view, int> orig_children_map;
// Creates a map of child nodes to speed up lookup.
for (int i = 0; i < children_.size(); ++i) {
- InsertIfNotPresent(&orig_children_map, children_[i]->name_, i);
+ orig_children_map.try_emplace(children_[i]->name_, i);
}
for (int i = 0; i < type_->fields_size(); ++i) {
@@ -330,8 +329,7 @@
continue;
}
- std::unordered_map<std::string, int>::iterator found =
- orig_children_map.find(field.name());
+ auto found = orig_children_map.find(field.name());
// If the child field has already been set, we just add it to the new list
// of children.
if (found != orig_children_map.end()) {
@@ -346,7 +344,7 @@
if (field.kind() == google::protobuf::Field::TYPE_MESSAGE) {
kind = OBJECT;
- util::StatusOr<const google::protobuf::Type*> found_result =
+ absl::StatusOr<const google::protobuf::Type*> found_result =
typeinfo->ResolveTypeUrl(field.type_url());
if (!found_result.ok()) {
// "field" is of an unknown type.
@@ -498,7 +496,7 @@
}
DefaultValueObjectWriter* DefaultValueObjectWriter::StartObject(
- StringPiece name) {
+ absl::string_view name) {
if (current_ == nullptr) {
std::vector<std::string> path;
root_.reset(CreateNewNode(std::string(name), &type_, OBJECT,
@@ -549,7 +547,7 @@
}
DefaultValueObjectWriter* DefaultValueObjectWriter::StartList(
- StringPiece name) {
+ absl::string_view name) {
if (current_ == nullptr) {
std::vector<std::string> path;
root_.reset(CreateNewNode(std::string(name), &type_, LIST,
@@ -593,18 +591,18 @@
return this;
}
-void DefaultValueObjectWriter::RenderDataPiece(StringPiece name,
+void DefaultValueObjectWriter::RenderDataPiece(absl::string_view name,
const DataPiece& data) {
MaybePopulateChildrenOfAny(current_);
if (current_->type() != nullptr && current_->type()->name() == kAnyType &&
name == "@type") {
- util::StatusOr<std::string> data_string = data.ToString();
+ absl::StatusOr<std::string> data_string = data.ToString();
if (data_string.ok()) {
const std::string& string_value = data_string.value();
// If the type of current_ is "Any" and its "@type" field is being set
// here, sets the type of current_ to be the type specified by the
// "@type".
- util::StatusOr<const google::protobuf::Type*> found_type =
+ absl::StatusOr<const google::protobuf::Type*> found_type =
typeinfo_->ResolveTypeUrl(string_value);
if (!found_type.ok()) {
GOOGLE_LOG(WARNING) << "Failed to resolve type '" << string_value << "'.";
diff --git a/src/google/protobuf/util/internal/default_value_objectwriter.h b/src/google/protobuf/util/internal/default_value_objectwriter.h
index a9e1673..2745159 100644
--- a/src/google/protobuf/util/internal/default_value_objectwriter.h
+++ b/src/google/protobuf/util/internal/default_value_objectwriter.h
@@ -37,16 +37,16 @@
#include <stack>
#include <vector>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/util/internal/datapiece.h>
-#include <google/protobuf/util/internal/object_writer.h>
-#include <google/protobuf/util/internal/type_info.h>
-#include <google/protobuf/util/internal/utility.h>
-#include <google/protobuf/util/type_resolver.h>
+#include "absl/strings/string_view.h"
+#include "google/protobuf/port.h"
+#include "google/protobuf/util/internal/datapiece.h"
+#include "google/protobuf/util/internal/object_writer.h"
+#include "google/protobuf/util/internal/type_info.h"
+#include "google/protobuf/util/internal/utility.h"
+#include "google/protobuf/util/type_resolver.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -81,44 +81,46 @@
const google::protobuf::Type& type,
ObjectWriter* ow);
+ DefaultValueObjectWriter(const DefaultValueObjectWriter&) = delete;
+ DefaultValueObjectWriter& operator=(const DefaultValueObjectWriter&) = delete;
~DefaultValueObjectWriter() override;
// ObjectWriter methods.
- DefaultValueObjectWriter* StartObject(StringPiece name) override;
+ DefaultValueObjectWriter* StartObject(absl::string_view name) override;
DefaultValueObjectWriter* EndObject() override;
- DefaultValueObjectWriter* StartList(StringPiece name) override;
+ DefaultValueObjectWriter* StartList(absl::string_view name) override;
DefaultValueObjectWriter* EndList() override;
- DefaultValueObjectWriter* RenderBool(StringPiece name,
+ DefaultValueObjectWriter* RenderBool(absl::string_view name,
bool value) override;
- DefaultValueObjectWriter* RenderInt32(StringPiece name,
+ DefaultValueObjectWriter* RenderInt32(absl::string_view name,
int32_t value) override;
- DefaultValueObjectWriter* RenderUint32(StringPiece name,
+ DefaultValueObjectWriter* RenderUint32(absl::string_view name,
uint32_t value) override;
- DefaultValueObjectWriter* RenderInt64(StringPiece name,
+ DefaultValueObjectWriter* RenderInt64(absl::string_view name,
int64_t value) override;
- DefaultValueObjectWriter* RenderUint64(StringPiece name,
+ DefaultValueObjectWriter* RenderUint64(absl::string_view name,
uint64_t value) override;
- DefaultValueObjectWriter* RenderDouble(StringPiece name,
+ DefaultValueObjectWriter* RenderDouble(absl::string_view name,
double value) override;
- DefaultValueObjectWriter* RenderFloat(StringPiece name,
+ DefaultValueObjectWriter* RenderFloat(absl::string_view name,
float value) override;
- DefaultValueObjectWriter* RenderString(StringPiece name,
- StringPiece value) override;
- DefaultValueObjectWriter* RenderBytes(StringPiece name,
- StringPiece value) override;
+ DefaultValueObjectWriter* RenderString(absl::string_view name,
+ absl::string_view value) override;
+ DefaultValueObjectWriter* RenderBytes(absl::string_view name,
+ absl::string_view value) override;
- DefaultValueObjectWriter* RenderNull(StringPiece name) override;
+ DefaultValueObjectWriter* RenderNull(absl::string_view name) override;
// Register the callback for scrubbing of fields.
void RegisterFieldScrubCallBack(FieldScrubCallBack field_scrub_callback);
@@ -153,6 +155,8 @@
const std::vector<std::string>& path, bool suppress_empty_list,
bool preserve_proto_field_names, bool use_ints_for_enums,
FieldScrubCallBack field_scrub_callback);
+ Node(const Node&) = delete;
+ Node& operator=(const Node&) = delete;
virtual ~Node() {
for (int i = 0; i < children_.size(); ++i) {
delete children_[i];
@@ -163,7 +167,7 @@
void AddChild(Node* child) { children_.push_back(child); }
// Finds the child given its name.
- Node* FindChild(StringPiece name);
+ Node* FindChild(absl::string_view name);
// Populates children of this Node based on its type. If there are already
// children created, they will be merged to the result. Caller should pass
@@ -239,9 +243,6 @@
// Function for determining whether a field needs to be scrubbed or not.
FieldScrubCallBack field_scrub_callback_;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Node);
};
// Creates a new Node and returns it. Caller owns memory of returned object.
@@ -279,7 +280,7 @@
void WriteRoot();
// Adds or replaces the data_ of a primitive child node.
- void RenderDataPiece(StringPiece name, const DataPiece& data);
+ void RenderDataPiece(absl::string_view name, const DataPiece& data);
// Returns the default enum value as a DataPiece, or the first enum value if
// there is no default. For proto3, where we cannot specify an explicit
@@ -318,8 +319,6 @@
FieldScrubCallBack field_scrub_callback_;
ObjectWriter* ow_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DefaultValueObjectWriter);
};
} // namespace converter
@@ -327,6 +326,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_UTIL_INTERNAL_DEFAULT_VALUE_OBJECTWRITER_H__
diff --git a/src/google/protobuf/util/internal/default_value_objectwriter_test.cc b/src/google/protobuf/util/internal/default_value_objectwriter_test.cc
index 96b14db..a8851b5 100644
--- a/src/google/protobuf/util/internal/default_value_objectwriter_test.cc
+++ b/src/google/protobuf/util/internal/default_value_objectwriter_test.cc
@@ -28,12 +28,12 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/util/internal/default_value_objectwriter.h>
+#include "google/protobuf/util/internal/default_value_objectwriter.h"
-#include <google/protobuf/util/internal/expecting_objectwriter.h>
-#include <google/protobuf/util/internal/testdata/default_value_test.pb.h>
-#include <google/protobuf/util/internal/constants.h>
-#include <google/protobuf/util/internal/type_info_test_helper.h>
+#include "google/protobuf/util/internal/expecting_objectwriter.h"
+#include "google/protobuf/util/internal/constants.h"
+#include "google/protobuf/util/internal/testdata/default_value_test.pb.h"
+#include "google/protobuf/util/internal/type_info_test_helper.h"
#include <gtest/gtest.h>
namespace google {
diff --git a/src/google/protobuf/util/internal/error_listener.cc b/src/google/protobuf/util/internal/error_listener.cc
index 538307b..a6641fd 100644
--- a/src/google/protobuf/util/internal/error_listener.cc
+++ b/src/google/protobuf/util/internal/error_listener.cc
@@ -28,7 +28,7 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/util/internal/error_listener.h>
+#include "google/protobuf/util/internal/error_listener.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/util/internal/error_listener.h b/src/google/protobuf/util/internal/error_listener.h
index 8c9c501..27fb65c 100644
--- a/src/google/protobuf/util/internal/error_listener.h
+++ b/src/google/protobuf/util/internal/error_listener.h
@@ -36,14 +36,15 @@
#include <string>
#include <vector>
-#include <google/protobuf/stubs/callback.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/util/internal/location_tracker.h>
+#include "google/protobuf/stubs/callback.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/stubs/logging.h"
+#include "absl/strings/string_view.h"
+#include "google/protobuf/port.h"
+#include "google/protobuf/util/internal/location_tracker.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -53,49 +54,46 @@
// Interface for error listener.
class PROTOBUF_EXPORT ErrorListener {
public:
+ ErrorListener(const ErrorListener&) = delete;
+ ErrorListener& operator=(const ErrorListener&) = delete;
virtual ~ErrorListener() {}
// Reports an invalid name at the given location.
virtual void InvalidName(const LocationTrackerInterface& loc,
- StringPiece invalid_name,
- StringPiece message) = 0;
+ absl::string_view invalid_name,
+ absl::string_view message) = 0;
// Reports an invalid value for a field.
virtual void InvalidValue(const LocationTrackerInterface& loc,
- StringPiece type_name,
- StringPiece value) = 0;
+ absl::string_view type_name,
+ absl::string_view value) = 0;
// Reports a missing required field.
virtual void MissingField(const LocationTrackerInterface& loc,
- StringPiece missing_name) = 0;
+ absl::string_view missing_name) = 0;
protected:
ErrorListener() {}
-
- private:
- // Do not add any data members to this class.
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ErrorListener);
};
// An error listener that ignores all errors.
class PROTOBUF_EXPORT NoopErrorListener : public ErrorListener {
public:
NoopErrorListener() {}
+ NoopErrorListener(const NoopErrorListener&) = delete;
+ NoopErrorListener& operator=(const NoopErrorListener&) = delete;
~NoopErrorListener() override {}
void InvalidName(const LocationTrackerInterface& /*loc*/,
- StringPiece /* invalid_name */,
- StringPiece /* message */) override {}
+ absl::string_view /* invalid_name */,
+ absl::string_view /* message */) override {}
void InvalidValue(const LocationTrackerInterface& /*loc*/,
- StringPiece /* type_name */,
- StringPiece /* value */) override {}
+ absl::string_view /* type_name */,
+ absl::string_view /* value */) override {}
void MissingField(const LocationTrackerInterface& /* loc */,
- StringPiece /* missing_name */) override {}
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(NoopErrorListener);
+ absl::string_view /* missing_name */) override {}
};
@@ -104,6 +102,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_UTIL_INTERNAL_ERROR_LISTENER_H__
diff --git a/src/google/protobuf/util/internal/expecting_objectwriter.h b/src/google/protobuf/util/internal/expecting_objectwriter.h
index 76fe2b6..8f200d5 100644
--- a/src/google/protobuf/util/internal/expecting_objectwriter.h
+++ b/src/google/protobuf/util/internal/expecting_objectwriter.h
@@ -46,16 +46,16 @@
// ->EndObject();
//
// // Actual testing
-// mock.StartObject(StringPiece())
+// mock.StartObject(absl::string_view())
// ->RenderString("key", "value")
// ->EndObject();
#include <cstdint>
-#include <google/protobuf/stubs/common.h>
#include <gmock/gmock.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/util/internal/object_writer.h>
+#include "absl/strings/string_view.h"
+#include "google/protobuf/port.h"
+#include "google/protobuf/util/internal/object_writer.h"
namespace google {
namespace protobuf {
@@ -74,35 +74,37 @@
public:
MockObjectWriter() {}
- MOCK_METHOD(ObjectWriter*, StartObject, (StringPiece), (override));
+ MOCK_METHOD(ObjectWriter*, StartObject, (absl::string_view), (override));
MOCK_METHOD(ObjectWriter*, EndObject, (), (override));
- MOCK_METHOD(ObjectWriter*, StartList, (StringPiece), (override));
+ MOCK_METHOD(ObjectWriter*, StartList, (absl::string_view), (override));
MOCK_METHOD(ObjectWriter*, EndList, (), (override));
- MOCK_METHOD(ObjectWriter*, RenderBool, (StringPiece, bool), (override));
- MOCK_METHOD(ObjectWriter*, RenderInt32, (StringPiece, int32_t),
+ MOCK_METHOD(ObjectWriter*, RenderBool, (absl::string_view, bool), (override));
+ MOCK_METHOD(ObjectWriter*, RenderInt32, (absl::string_view, int32_t),
(override));
- MOCK_METHOD(ObjectWriter*, RenderUint32, (StringPiece, uint32_t),
+ MOCK_METHOD(ObjectWriter*, RenderUint32, (absl::string_view, uint32_t),
(override));
- MOCK_METHOD(ObjectWriter*, RenderInt64, (StringPiece, int64_t),
+ MOCK_METHOD(ObjectWriter*, RenderInt64, (absl::string_view, int64_t),
(override));
- MOCK_METHOD(ObjectWriter*, RenderUint64, (StringPiece, uint64_t),
+ MOCK_METHOD(ObjectWriter*, RenderUint64, (absl::string_view, uint64_t),
(override));
- MOCK_METHOD(ObjectWriter*, RenderDouble, (StringPiece, double),
+ MOCK_METHOD(ObjectWriter*, RenderDouble, (absl::string_view, double),
(override));
- MOCK_METHOD(ObjectWriter*, RenderFloat, (StringPiece, float),
+ MOCK_METHOD(ObjectWriter*, RenderFloat, (absl::string_view, float),
(override));
MOCK_METHOD(ObjectWriter*, RenderString,
- (StringPiece, StringPiece), (override));
- MOCK_METHOD(ObjectWriter*, RenderBytes, (StringPiece, StringPiece),
- (override));
- MOCK_METHOD(ObjectWriter*, RenderNull, (StringPiece), (override));
+ (absl::string_view, absl::string_view), (override));
+ MOCK_METHOD(ObjectWriter*, RenderBytes,
+ (absl::string_view, absl::string_view), (override));
+ MOCK_METHOD(ObjectWriter*, RenderNull, (absl::string_view), (override));
};
class ExpectingObjectWriter : public ObjectWriter {
public:
explicit ExpectingObjectWriter(MockObjectWriter* mock) : mock_(mock) {}
+ ExpectingObjectWriter(const ExpectingObjectWriter&) = delete;
+ ExpectingObjectWriter& operator=(const ExpectingObjectWriter&) = delete;
- ObjectWriter* StartObject(StringPiece name) override {
+ ObjectWriter* StartObject(absl::string_view name) override {
(name.empty() ? EXPECT_CALL(*mock_, StartObject(IsEmpty()))
: EXPECT_CALL(*mock_, StartObject(Eq(std::string(name)))))
.WillOnce(Return(mock_))
@@ -117,7 +119,7 @@
return this;
}
- ObjectWriter* StartList(StringPiece name) override {
+ ObjectWriter* StartList(absl::string_view name) override {
(name.empty() ? EXPECT_CALL(*mock_, StartList(IsEmpty()))
: EXPECT_CALL(*mock_, StartList(Eq(std::string(name)))))
.WillOnce(Return(mock_))
@@ -132,7 +134,7 @@
return this;
}
- ObjectWriter* RenderBool(StringPiece name, bool value) override {
+ ObjectWriter* RenderBool(absl::string_view name, bool value) override {
(name.empty()
? EXPECT_CALL(*mock_, RenderBool(IsEmpty(), TypedEq<bool>(value)))
: EXPECT_CALL(*mock_,
@@ -142,7 +144,7 @@
return this;
}
- ObjectWriter* RenderInt32(StringPiece name, int32_t value) override {
+ ObjectWriter* RenderInt32(absl::string_view name, int32_t value) override {
(name.empty()
? EXPECT_CALL(*mock_, RenderInt32(IsEmpty(), TypedEq<int32_t>(value)))
: EXPECT_CALL(*mock_, RenderInt32(Eq(std::string(name)),
@@ -152,7 +154,7 @@
return this;
}
- ObjectWriter* RenderUint32(StringPiece name, uint32_t value) override {
+ ObjectWriter* RenderUint32(absl::string_view name, uint32_t value) override {
(name.empty() ? EXPECT_CALL(*mock_, RenderUint32(IsEmpty(),
TypedEq<uint32_t>(value)))
: EXPECT_CALL(*mock_, RenderUint32(Eq(std::string(name)),
@@ -162,7 +164,7 @@
return this;
}
- ObjectWriter* RenderInt64(StringPiece name, int64_t value) override {
+ ObjectWriter* RenderInt64(absl::string_view name, int64_t value) override {
(name.empty()
? EXPECT_CALL(*mock_, RenderInt64(IsEmpty(), TypedEq<int64_t>(value)))
: EXPECT_CALL(*mock_, RenderInt64(Eq(std::string(name)),
@@ -172,7 +174,7 @@
return this;
}
- ObjectWriter* RenderUint64(StringPiece name, uint64_t value) override {
+ ObjectWriter* RenderUint64(absl::string_view name, uint64_t value) override {
(name.empty() ? EXPECT_CALL(*mock_, RenderUint64(IsEmpty(),
TypedEq<uint64_t>(value)))
: EXPECT_CALL(*mock_, RenderUint64(Eq(std::string(name)),
@@ -182,7 +184,7 @@
return this;
}
- ObjectWriter* RenderDouble(StringPiece name, double value) override {
+ ObjectWriter* RenderDouble(absl::string_view name, double value) override {
(name.empty()
? EXPECT_CALL(*mock_,
RenderDouble(IsEmpty(), NanSensitiveDoubleEq(value)))
@@ -193,7 +195,7 @@
return this;
}
- ObjectWriter* RenderFloat(StringPiece name, float value) override {
+ ObjectWriter* RenderFloat(absl::string_view name, float value) override {
(name.empty()
? EXPECT_CALL(*mock_,
RenderFloat(IsEmpty(), NanSensitiveFloatEq(value)))
@@ -204,31 +206,32 @@
return this;
}
- ObjectWriter* RenderString(StringPiece name,
- StringPiece value) override {
+ ObjectWriter* RenderString(absl::string_view name,
+ absl::string_view value) override {
(name.empty() ? EXPECT_CALL(*mock_, RenderString(IsEmpty(),
- TypedEq<StringPiece>(
+ TypedEq<absl::string_view>(
std::string(value))))
: EXPECT_CALL(*mock_, RenderString(Eq(std::string(name)),
- TypedEq<StringPiece>(
+ TypedEq<absl::string_view>(
std::string(value)))))
.WillOnce(Return(mock_))
.RetiresOnSaturation();
return this;
}
- virtual ObjectWriter* RenderBytes(StringPiece name, StringPiece value) {
- (name.empty()
- ? EXPECT_CALL(*mock_, RenderBytes(IsEmpty(), TypedEq<StringPiece>(
- value.ToString())))
- : EXPECT_CALL(*mock_,
- RenderBytes(Eq(std::string(name)),
- TypedEq<StringPiece>(value.ToString()))))
+ ObjectWriter* RenderBytes(absl::string_view name,
+ absl::string_view value) override {
+ (name.empty() ? EXPECT_CALL(*mock_, RenderBytes(IsEmpty(),
+ TypedEq<absl::string_view>(
+ std::string(value))))
+ : EXPECT_CALL(*mock_, RenderBytes(Eq(std::string(name)),
+ TypedEq<absl::string_view>(
+ std::string(value)))))
.WillOnce(Return(mock_))
.RetiresOnSaturation();
return this;
}
- ObjectWriter* RenderNull(StringPiece name) override {
+ ObjectWriter* RenderNull(absl::string_view name) override {
(name.empty() ? EXPECT_CALL(*mock_, RenderNull(IsEmpty()))
: EXPECT_CALL(*mock_, RenderNull(Eq(std::string(name))))
.WillOnce(Return(mock_))
@@ -238,8 +241,6 @@
private:
MockObjectWriter* mock_;
-
- GOOGLE_DISALLOW_IMPLICIT_CONSTRUCTORS(ExpectingObjectWriter);
};
} // namespace converter
diff --git a/src/google/protobuf/util/internal/field_mask_utility.cc b/src/google/protobuf/util/internal/field_mask_utility.cc
index 521bf48..5cdc29d 100644
--- a/src/google/protobuf/util/internal/field_mask_utility.cc
+++ b/src/google/protobuf/util/internal/field_mask_utility.cc
@@ -28,15 +28,16 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/util/internal/field_mask_utility.h>
+#include "google/protobuf/util/internal/field_mask_utility.h"
-#include <google/protobuf/stubs/status.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/util/internal/utility.h>
-#include <google/protobuf/stubs/status_macros.h>
+#include "absl/status/status.h"
+#include "absl/strings/match.h"
+#include "absl/strings/str_cat.h"
+#include "google/protobuf/util/internal/utility.h"
+#include "google/protobuf/stubs/status_macros.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -46,8 +47,8 @@
namespace {
// Appends a FieldMask path segment to a prefix.
-std::string AppendPathSegmentToPrefix(StringPiece prefix,
- StringPiece segment) {
+std::string AppendPathSegmentToPrefix(absl::string_view prefix,
+ absl::string_view segment) {
if (prefix.empty()) {
return std::string(segment);
}
@@ -55,15 +56,15 @@
return std::string(prefix);
}
// If the segment is a map key, appends it to the prefix without the ".".
- if (HasPrefixString(segment, "[\"")) {
- return StrCat(prefix, segment);
+ if (absl::StartsWith(segment, "[\"")) {
+ return absl::StrCat(prefix, segment);
}
- return StrCat(prefix, ".", segment);
+ return absl::StrCat(prefix, ".", segment);
}
} // namespace
-std::string ConvertFieldMaskPath(const StringPiece path,
+std::string ConvertFieldMaskPath(const absl::string_view path,
ConverterCallback converter) {
std::string result;
result.reserve(path.size() << 1);
@@ -107,7 +108,7 @@
return result;
}
-util::Status DecodeCompactFieldMaskPaths(StringPiece paths,
+absl::Status DecodeCompactFieldMaskPaths(absl::string_view paths,
PathSinkCallback path_sink) {
std::stack<std::string> prefix;
int length = paths.length();
@@ -134,7 +135,7 @@
}
// Un-escaped '"' must be followed with a ']'.
if (i >= length - 1 || paths[i + 1] != ']') {
- return util::InvalidArgumentError(StrCat(
+ return absl::InvalidArgumentError(absl::StrCat(
"Invalid FieldMask '", paths,
"'. Map keys should be represented as [\"some_key\"]."));
}
@@ -145,7 +146,7 @@
// Checks whether the key ends at the end of a path segment.
if (i < length - 1 && paths[i + 1] != '.' && paths[i + 1] != ',' &&
paths[i + 1] != ')' && paths[i + 1] != '(') {
- return util::InvalidArgumentError(StrCat(
+ return absl::InvalidArgumentError(absl::StrCat(
"Invalid FieldMask '", paths,
"'. Map keys should be at the end of a path segment."));
}
@@ -156,7 +157,7 @@
// We are not in a map key, look for the start of one.
if (paths[i] == '[') {
if (i >= length - 1 || paths[i + 1] != '\"') {
- return util::InvalidArgumentError(StrCat(
+ return absl::InvalidArgumentError(absl::StrCat(
"Invalid FieldMask '", paths,
"'. Map keys should be represented as [\"some_key\"]."));
}
@@ -173,7 +174,7 @@
}
// Gets the current segment - sub-string between previous position (after
// '(', ')', ',', or the beginning of the input) and the current position.
- StringPiece segment =
+ absl::string_view segment =
paths.substr(previous_position, i - previous_position);
std::string current_prefix = prefix.empty() ? "" : prefix.top();
@@ -191,8 +192,8 @@
// Removes the last prefix after seeing a ')'.
if (i < length && paths[i] == ')') {
if (prefix.empty()) {
- return util::InvalidArgumentError(
- StrCat("Invalid FieldMask '", paths,
+ return absl::InvalidArgumentError(
+ absl::StrCat("Invalid FieldMask '", paths,
"'. Cannot find matching '(' for all ')'."));
}
prefix.pop();
@@ -200,16 +201,16 @@
previous_position = i + 1;
}
if (in_map_key) {
- return util::InvalidArgumentError(
- StrCat("Invalid FieldMask '", paths,
+ return absl::InvalidArgumentError(
+ absl::StrCat("Invalid FieldMask '", paths,
"'. Cannot find matching ']' for all '['."));
}
if (!prefix.empty()) {
- return util::InvalidArgumentError(
- StrCat("Invalid FieldMask '", paths,
+ return absl::InvalidArgumentError(
+ absl::StrCat("Invalid FieldMask '", paths,
"'. Cannot find matching ')' for all '('."));
}
- return util::Status();
+ return absl::Status();
}
} // namespace converter
diff --git a/src/google/protobuf/util/internal/field_mask_utility.h b/src/google/protobuf/util/internal/field_mask_utility.h
index 1882333..0db911a 100644
--- a/src/google/protobuf/util/internal/field_mask_utility.h
+++ b/src/google/protobuf/util/internal/field_mask_utility.h
@@ -36,25 +36,25 @@
#include <functional>
#include <stack>
-#include <google/protobuf/stubs/callback.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/status.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/status.h>
+#include "google/protobuf/stubs/callback.h"
+#include "absl/status/status.h"
+#include "absl/strings/string_view.h"
+#include "google/protobuf/port.h"
+
namespace google {
namespace protobuf {
namespace util {
namespace converter {
-typedef std::function<std::string(StringPiece)> ConverterCallback;
-typedef std::function<util::Status(StringPiece)> PathSinkCallback;
+typedef std::function<std::string(absl::string_view)> ConverterCallback;
+typedef std::function<absl::Status(absl::string_view)> PathSinkCallback;
// Applies a 'converter' to each segment of a FieldMask path and returns the
// result. Quoted strings in the 'path' are copied to the output as-is without
// converting their content. Escaping is supported within quoted strings.
// For example, "ab\"_c" will be returned as "ab\"_c" without any changes.
-std::string ConvertFieldMaskPath(const StringPiece path,
+std::string ConvertFieldMaskPath(const absl::string_view path,
ConverterCallback converter);
// Decodes a compact list of FieldMasks. For example, "a.b,a.c.d,a.c.e" will be
@@ -63,7 +63,7 @@
// resulting path.
// Note that we also support Apiary style FieldMask form. The above example in
// the Apiary style will look like "a.b,a.c(d,e)".
-util::Status DecodeCompactFieldMaskPaths(StringPiece paths,
+absl::Status DecodeCompactFieldMaskPaths(absl::string_view paths,
PathSinkCallback path_sink);
} // namespace converter
diff --git a/src/google/protobuf/util/internal/json_escaping.cc b/src/google/protobuf/util/internal/json_escaping.cc
index e4fa8cf..3cda954 100644
--- a/src/google/protobuf/util/internal/json_escaping.cc
+++ b/src/google/protobuf/util/internal/json_escaping.cc
@@ -28,12 +28,12 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/util/internal/json_escaping.h>
+#include "google/protobuf/util/internal/json_escaping.h"
#include <cstdint>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
namespace google {
namespace protobuf {
@@ -127,7 +127,7 @@
// Returns false if we encounter an invalid UTF-8 string. Returns true
// otherwise, including the case when we reach the end of the input (str)
// before a complete unicode code point is read.
-bool ReadCodePoint(StringPiece str, int index, uint32_t* cp,
+bool ReadCodePoint(absl::string_view str, int index, uint32_t* cp,
int* num_left, int* num_read) {
if (*num_left == 0) {
// Last read was complete. Start reading a new unicode code point.
@@ -190,9 +190,9 @@
}
// Stores the 16-bit unicode code point as its hexadecimal digits in buffer
-// and returns a StringPiece that points to this buffer. The input buffer needs
-// to be at least 6 bytes long.
-StringPiece ToHex(uint16_t cp, char* buffer) {
+// and returns an absl::string_view that points to this buffer. The input
+// buffer needs to be at least 6 bytes long.
+absl::string_view ToHex(uint16_t cp, char* buffer) {
buffer[5] = kHex[cp & 0x0f];
cp >>= 4;
buffer[4] = kHex[cp & 0x0f];
@@ -200,13 +200,13 @@
buffer[3] = kHex[cp & 0x0f];
cp >>= 4;
buffer[2] = kHex[cp & 0x0f];
- return StringPiece(buffer, 6);
+ return absl::string_view(buffer, 6);
}
// Stores the 32-bit unicode code point as its hexadecimal digits in buffer
-// and returns a StringPiece that points to this buffer. The input buffer needs
-// to be at least 12 bytes long.
-StringPiece ToSurrogateHex(uint32_t cp, char* buffer) {
+// and returns an absl::string_view that points to this buffer. The input
+// buffer needs to be at least 12 bytes long.
+absl::string_view ToSurrogateHex(uint32_t cp, char* buffer) {
uint16_t low = ToLowSurrogate(cp);
uint16_t high = ToHighSurrogate(cp);
@@ -226,17 +226,17 @@
high >>= 4;
buffer[2] = kHex[high & 0x0f];
- return StringPiece(buffer, 12);
+ return absl::string_view(buffer, 12);
}
-// If the given unicode code point needs escaping, then returns the
-// escaped form. The returned StringPiece either points to statically
-// pre-allocated char[] or to the given buffer. The input buffer needs
-// to be at least 12 bytes long.
+// If the given unicode code point needs escaping, then returns the escaped
+// form. The returned absl::string_view either points to statically
+// pre-allocated char[] or to the given buffer. The input buffer needs to be at
+// least 12 bytes long.
//
-// If the given unicode code point does not need escaping, an empty
-// StringPiece is returned.
-StringPiece EscapeCodePoint(uint32_t cp, char* buffer) {
+// If the given unicode code point does not need escaping, an empty string is
+// returned.
+absl::string_view EscapeCodePoint(uint32_t cp, char* buffer) {
if (cp < 0xa0) return kCommonEscapes[cp];
switch (cp) {
// These are not required by json spec
@@ -268,33 +268,33 @@
return ToSurrogateHex(cp, buffer);
}
}
- return StringPiece();
+ return absl::string_view();
}
// Tries to escape the given code point first. If the given code point
// does not need to be escaped, but force_output is true, then render
// the given multi-byte code point in UTF8 in the buffer and returns it.
-StringPiece EscapeCodePoint(uint32_t cp, char* buffer,
+absl::string_view EscapeCodePoint(uint32_t cp, char* buffer,
bool force_output) {
- StringPiece sp = EscapeCodePoint(cp, buffer);
+ absl::string_view sp = EscapeCodePoint(cp, buffer);
if (force_output && sp.empty()) {
buffer[5] = (cp & 0x3f) | 0x80;
cp >>= 6;
if (cp <= 0x1f) {
buffer[4] = cp | 0xc0;
- sp = StringPiece(buffer + 4, 2);
+ sp = absl::string_view(buffer + 4, 2);
return sp;
}
buffer[4] = (cp & 0x3f) | 0x80;
cp >>= 6;
if (cp <= 0x0f) {
buffer[3] = cp | 0xe0;
- sp = StringPiece(buffer + 3, 3);
+ sp = absl::string_view(buffer + 3, 3);
return sp;
}
buffer[3] = (cp & 0x3f) | 0x80;
buffer[2] = ((cp >> 6) & 0x07) | 0xf0;
- sp = StringPiece(buffer + 2, 4);
+ sp = absl::string_view(buffer + 2, 4);
}
return sp;
}
@@ -307,8 +307,8 @@
uint32_t cp = 0; // Current unicode code point.
int num_left = 0; // Num of chars to read to complete the code point.
while (input->Available() > 0) {
- StringPiece str = input->Peek();
- StringPiece escaped;
+ absl::string_view str = input->Peek();
+ absl::string_view escaped;
int i = 0;
int num_read;
bool ok;
@@ -317,7 +317,7 @@
// i) a code point that needs to be escaped; or
// ii) a split code point is completely read; or
// iii) a character that is not a valid utf8; or
- // iv) end of the StringPiece str is reached.
+ // iv) end of the string is reached.
do {
ok = ReadCodePoint(str, i, &cp, &num_left, &num_read);
if (num_left > 0 || !ok) break; // case iii or iv
@@ -344,7 +344,7 @@
}
}
-void JsonEscaping::Escape(StringPiece input, strings::ByteSink* output) {
+void JsonEscaping::Escape(absl::string_view input, strings::ByteSink* output) {
const size_t len = input.length();
const char* p = input.data();
diff --git a/src/google/protobuf/util/internal/json_escaping.h b/src/google/protobuf/util/internal/json_escaping.h
index 7d54f22..98b0e5b 100644
--- a/src/google/protobuf/util/internal/json_escaping.h
+++ b/src/google/protobuf/util/internal/json_escaping.h
@@ -33,8 +33,9 @@
#include <cstdint>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/bytestream.h>
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/stubs/bytestream.h"
+#include "google/protobuf/port.h"
namespace google {
namespace protobuf {
@@ -76,6 +77,8 @@
static constexpr uint32_t kMaxCodePoint = 0x10ffff;
JsonEscaping() {}
+ JsonEscaping(const JsonEscaping&) = delete;
+ JsonEscaping& operator=(const JsonEscaping&) = delete;
virtual ~JsonEscaping() {}
// Escape the given ByteSource to the given ByteSink.
@@ -84,10 +87,7 @@
// Escape the given ByteSource to the given ByteSink.
// This is optimized for the case where the string is all printable 7-bit
// ASCII and does not contain a few other characters (such as quotes).
- static void Escape(StringPiece input, strings::ByteSink* output);
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(JsonEscaping);
+ static void Escape(absl::string_view input, strings::ByteSink* output);
};
} // namespace converter
diff --git a/src/google/protobuf/util/internal/json_objectwriter.cc b/src/google/protobuf/util/internal/json_objectwriter.cc
index 1a86f00..ad9f5a1 100644
--- a/src/google/protobuf/util/internal/json_objectwriter.cc
+++ b/src/google/protobuf/util/internal/json_objectwriter.cc
@@ -28,32 +28,34 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/util/internal/json_objectwriter.h>
+#include "google/protobuf/util/internal/json_objectwriter.h"
#include <cmath>
#include <cstdint>
#include <limits>
-#include <google/protobuf/stubs/casts.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/util/internal/utility.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/util/internal/json_escaping.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "absl/base/casts.h"
+#include "absl/strings/escaping.h"
+#include "absl/strings/str_cat.h"
+#include "google/protobuf/util/internal/json_escaping.h"
+#include "google/protobuf/util/internal/utility.h"
+
namespace google {
namespace protobuf {
namespace util {
namespace converter {
-
JsonObjectWriter::~JsonObjectWriter() {
if (element_ && !element_->is_root()) {
GOOGLE_LOG(WARNING) << "JsonObjectWriter was not fully closed.";
}
}
-JsonObjectWriter* JsonObjectWriter::StartObject(StringPiece name) {
+JsonObjectWriter* JsonObjectWriter::StartObject(absl::string_view name) {
WritePrefix(name);
WriteChar('{');
PushObject();
@@ -67,7 +69,7 @@
return this;
}
-JsonObjectWriter* JsonObjectWriter::StartList(StringPiece name) {
+JsonObjectWriter* JsonObjectWriter::StartList(absl::string_view name) {
WritePrefix(name);
WriteChar('[');
PushArray();
@@ -81,40 +83,40 @@
return this;
}
-JsonObjectWriter* JsonObjectWriter::RenderBool(StringPiece name,
+JsonObjectWriter* JsonObjectWriter::RenderBool(absl::string_view name,
bool value) {
return RenderSimple(name, value ? "true" : "false");
}
-JsonObjectWriter* JsonObjectWriter::RenderInt32(StringPiece name,
+JsonObjectWriter* JsonObjectWriter::RenderInt32(absl::string_view name,
int32_t value) {
- return RenderSimple(name, StrCat(value));
+ return RenderSimple(name, absl::StrCat(value));
}
-JsonObjectWriter* JsonObjectWriter::RenderUint32(StringPiece name,
+JsonObjectWriter* JsonObjectWriter::RenderUint32(absl::string_view name,
uint32_t value) {
- return RenderSimple(name, StrCat(value));
+ return RenderSimple(name, absl::StrCat(value));
}
-JsonObjectWriter* JsonObjectWriter::RenderInt64(StringPiece name,
+JsonObjectWriter* JsonObjectWriter::RenderInt64(absl::string_view name,
int64_t value) {
WritePrefix(name);
WriteChar('"');
- WriteRawString(StrCat(value));
+ WriteRawString(absl::StrCat(value));
WriteChar('"');
return this;
}
-JsonObjectWriter* JsonObjectWriter::RenderUint64(StringPiece name,
+JsonObjectWriter* JsonObjectWriter::RenderUint64(absl::string_view name,
uint64_t value) {
WritePrefix(name);
WriteChar('"');
- WriteRawString(StrCat(value));
+ WriteRawString(absl::StrCat(value));
WriteChar('"');
return this;
}
-JsonObjectWriter* JsonObjectWriter::RenderDouble(StringPiece name,
+JsonObjectWriter* JsonObjectWriter::RenderDouble(absl::string_view name,
double value) {
if (std::isfinite(value)) {
return RenderSimple(name, SimpleDtoa(value));
@@ -124,7 +126,7 @@
return RenderString(name, DoubleAsString(value));
}
-JsonObjectWriter* JsonObjectWriter::RenderFloat(StringPiece name,
+JsonObjectWriter* JsonObjectWriter::RenderFloat(absl::string_view name,
float value) {
if (std::isfinite(value)) {
return RenderSimple(name, SimpleFtoa(value));
@@ -134,8 +136,8 @@
return RenderString(name, FloatAsString(value));
}
-JsonObjectWriter* JsonObjectWriter::RenderString(StringPiece name,
- StringPiece value) {
+JsonObjectWriter* JsonObjectWriter::RenderString(absl::string_view name,
+ absl::string_view value) {
WritePrefix(name);
WriteChar('"');
JsonEscaping::Escape(value, &sink_);
@@ -143,15 +145,15 @@
return this;
}
-JsonObjectWriter* JsonObjectWriter::RenderBytes(StringPiece name,
- StringPiece value) {
+JsonObjectWriter* JsonObjectWriter::RenderBytes(absl::string_view name,
+ absl::string_view value) {
WritePrefix(name);
std::string base64;
if (use_websafe_base64_for_bytes_)
- WebSafeBase64EscapeWithPadding(std::string(value), &base64);
+ strings::WebSafeBase64EscapeWithPadding(value, &base64);
else
- Base64Escape(value, &base64);
+ absl::Base64Escape(value, &base64);
WriteChar('"');
// TODO(wpoon): Consider a ByteSink solution that writes the base64 bytes
@@ -162,15 +164,15 @@
return this;
}
-JsonObjectWriter* JsonObjectWriter::RenderNull(StringPiece name) {
+JsonObjectWriter* JsonObjectWriter::RenderNull(absl::string_view name) {
return RenderSimple(name, "null");
}
-JsonObjectWriter* JsonObjectWriter::RenderNullAsEmpty(StringPiece name) {
+JsonObjectWriter* JsonObjectWriter::RenderNullAsEmpty(absl::string_view name) {
return RenderSimple(name, "");
}
-void JsonObjectWriter::WritePrefix(StringPiece name) {
+void JsonObjectWriter::WritePrefix(absl::string_view name) {
bool not_first = !element()->is_first();
if (not_first) WriteChar(',');
if (not_first || !element()->is_root()) NewLine();
diff --git a/src/google/protobuf/util/internal/json_objectwriter.h b/src/google/protobuf/util/internal/json_objectwriter.h
index cb7dff6..443cdb4 100644
--- a/src/google/protobuf/util/internal/json_objectwriter.h
+++ b/src/google/protobuf/util/internal/json_objectwriter.h
@@ -35,12 +35,12 @@
#include <memory>
#include <string>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/stubs/bytestream.h>
-#include <google/protobuf/util/internal/structured_objectwriter.h>
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/stubs/bytestream.h"
+#include "google/protobuf/util/internal/structured_objectwriter.h"
// clang-format off
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
// clang-format on
namespace google {
@@ -90,7 +90,7 @@
// JsonObjectWriter is thread-unsafe.
class PROTOBUF_EXPORT JsonObjectWriter : public StructuredObjectWriter {
public:
- JsonObjectWriter(StringPiece indent_string, io::CodedOutputStream* out)
+ JsonObjectWriter(absl::string_view indent_string, io::CodedOutputStream* out)
: element_(new Element(/*parent=*/nullptr, /*is_json_object=*/false)),
stream_(out),
sink_(out),
@@ -111,27 +111,30 @@
}
}
}
+ JsonObjectWriter(const JsonObjectWriter&) = delete;
+ JsonObjectWriter& operator=(const JsonObjectWriter&) = delete;
~JsonObjectWriter() override;
// ObjectWriter methods.
- JsonObjectWriter* StartObject(StringPiece name) override;
+ JsonObjectWriter* StartObject(absl::string_view name) override;
JsonObjectWriter* EndObject() override;
- JsonObjectWriter* StartList(StringPiece name) override;
+ JsonObjectWriter* StartList(absl::string_view name) override;
JsonObjectWriter* EndList() override;
- JsonObjectWriter* RenderBool(StringPiece name, bool value) override;
- JsonObjectWriter* RenderInt32(StringPiece name, int32_t value) override;
- JsonObjectWriter* RenderUint32(StringPiece name,
+ JsonObjectWriter* RenderBool(absl::string_view name, bool value) override;
+ JsonObjectWriter* RenderInt32(absl::string_view name, int32_t value) override;
+ JsonObjectWriter* RenderUint32(absl::string_view name,
uint32_t value) override;
- JsonObjectWriter* RenderInt64(StringPiece name, int64_t value) override;
- JsonObjectWriter* RenderUint64(StringPiece name,
+ JsonObjectWriter* RenderInt64(absl::string_view name, int64_t value) override;
+ JsonObjectWriter* RenderUint64(absl::string_view name,
uint64_t value) override;
- JsonObjectWriter* RenderDouble(StringPiece name, double value) override;
- JsonObjectWriter* RenderFloat(StringPiece name, float value) override;
- JsonObjectWriter* RenderString(StringPiece name,
- StringPiece value) override;
- JsonObjectWriter* RenderBytes(StringPiece name, StringPiece value) override;
- JsonObjectWriter* RenderNull(StringPiece name) override;
- virtual JsonObjectWriter* RenderNullAsEmpty(StringPiece name);
+ JsonObjectWriter* RenderDouble(absl::string_view name, double value) override;
+ JsonObjectWriter* RenderFloat(absl::string_view name, float value) override;
+ JsonObjectWriter* RenderString(absl::string_view name,
+ absl::string_view value) override;
+ JsonObjectWriter* RenderBytes(absl::string_view name,
+ absl::string_view value) override;
+ JsonObjectWriter* RenderNull(absl::string_view name) override;
+ virtual JsonObjectWriter* RenderNullAsEmpty(absl::string_view name);
void set_use_websafe_base64_for_bytes(bool value) {
use_websafe_base64_for_bytes_ = value;
@@ -144,6 +147,8 @@
: BaseElement(parent),
is_first_(true),
is_json_object_(is_json_object) {}
+ Element(const Element&) = delete;
+ Element& operator=(const Element&) = delete;
// Called before each field of the Element is to be processed.
// Returns true if this is the first call (processing the first field).
@@ -162,8 +167,6 @@
private:
bool is_first_;
bool is_json_object_;
-
- GOOGLE_DISALLOW_IMPLICIT_CONSTRUCTORS(Element);
};
Element* element() override { return element_.get(); }
@@ -172,6 +175,8 @@
class PROTOBUF_EXPORT ByteSinkWrapper : public strings::ByteSink {
public:
explicit ByteSinkWrapper(io::CodedOutputStream* stream) : stream_(stream) {}
+ ByteSinkWrapper(const ByteSinkWrapper&) = delete;
+ ByteSinkWrapper& operator=(const ByteSinkWrapper&) = delete;
~ByteSinkWrapper() override {}
// ByteSink methods.
@@ -181,15 +186,13 @@
private:
io::CodedOutputStream* stream_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ByteSinkWrapper);
};
// Renders a simple value as a string. By default all non-string Render
// methods convert their argument to a string and call this method. This
// method can then be used to render the simple value without escaping it.
- JsonObjectWriter* RenderSimple(StringPiece name,
- StringPiece value) {
+ JsonObjectWriter* RenderSimple(absl::string_view name,
+ absl::string_view value) {
WritePrefix(name);
WriteRawString(value);
return this;
@@ -242,13 +245,13 @@
// Writes a prefix. This will write out any pretty printing and
// commas that are required, followed by the name and a ':' if
// the name is not null.
- void WritePrefix(StringPiece name);
+ void WritePrefix(absl::string_view name);
// Writes an individual character to the output.
void WriteChar(const char c) { stream_->WriteRaw(&c, sizeof(c)); }
// Writes a string to the output.
- void WriteRawString(StringPiece s) {
+ void WriteRawString(absl::string_view s) {
stream_->WriteRaw(s.data(), s.length());
}
@@ -264,8 +267,6 @@
// Whether to use regular or websafe base64 encoding for byte fields. Defaults
// to regular base64 encoding.
bool use_websafe_base64_for_bytes_;
-
- GOOGLE_DISALLOW_IMPLICIT_CONSTRUCTORS(JsonObjectWriter);
};
} // namespace converter
@@ -273,6 +274,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_UTIL_INTERNAL_JSON_OBJECTWRITER_H__
diff --git a/src/google/protobuf/util/internal/json_objectwriter_test.cc b/src/google/protobuf/util/internal/json_objectwriter_test.cc
index 8acf2c5..33b24de 100644
--- a/src/google/protobuf/util/internal/json_objectwriter_test.cc
+++ b/src/google/protobuf/util/internal/json_objectwriter_test.cc
@@ -28,13 +28,13 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/util/internal/json_objectwriter.h>
+#include "google/protobuf/util/internal/json_objectwriter.h"
#include <cstdint>
-#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
+#include "google/protobuf/io/zero_copy_stream_impl_lite.h"
#include <gtest/gtest.h>
-#include <google/protobuf/util/internal/utility.h>
+#include "google/protobuf/util/internal/utility.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/util/internal/json_stream_parser.cc b/src/google/protobuf/util/internal/json_stream_parser.cc
index 5c34dbc..c294009 100644
--- a/src/google/protobuf/util/internal/json_stream_parser.cc
+++ b/src/google/protobuf/util/internal/json_stream_parser.cc
@@ -28,7 +28,7 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/util/internal/json_stream_parser.h>
+#include "google/protobuf/util/internal/json_stream_parser.h"
#include <algorithm>
#include <cctype>
@@ -37,12 +37,17 @@
#include <stack>
#include <string>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/status.h>
-#include <google/protobuf/util/internal/object_writer.h>
-#include <google/protobuf/util/internal/json_escaping.h>
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "absl/status/status.h"
+#include "absl/strings/ascii.h"
+#include "absl/strings/escaping.h"
+#include "absl/strings/match.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/string_view.h"
+#include "google/protobuf/util/internal/object_writer.h"
+#include "google/protobuf/util/internal/json_escaping.h"
namespace google {
@@ -57,9 +62,9 @@
static const int kDefaultMaxRecursionDepth = 100;
// These cannot be constexpr for portability with VS2015.
-static const StringPiece kKeywordTrue = "true";
-static const StringPiece kKeywordFalse = "false";
-static const StringPiece kKeywordNull = "null";
+static const absl::string_view kKeywordTrue = "true";
+static const absl::string_view kKeywordFalse = "false";
+static const absl::string_view kKeywordNull = "null";
inline bool IsLetter(char c) {
return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || (c == '_') ||
@@ -72,31 +77,31 @@
// Indicates a character may not be part of an unquoted key.
inline bool IsKeySeparator(char c) {
- return (ascii_isspace(c) || c == '"' || c == '\'' || c == '{' ||
+ return (absl::ascii_isspace(c) || c == '"' || c == '\'' || c == '{' ||
c == '}' || c == '[' || c == ']' || c == ':' || c == ',');
}
-inline void ReplaceInvalidCodePoints(StringPiece str,
+inline void ReplaceInvalidCodePoints(absl::string_view str,
const std::string& replacement,
std::string* dst) {
while (!str.empty()) {
int n_valid_bytes = internal::UTF8SpnStructurallyValid(str);
- StringPiece valid_part = str.substr(0, n_valid_bytes);
- StrAppend(dst, valid_part);
+ absl::string_view valid_part = str.substr(0, n_valid_bytes);
+ absl::StrAppend(dst, valid_part);
if (n_valid_bytes == str.size()) {
break;
}
// Append replacement value.
- StrAppend(dst, replacement);
+ absl::StrAppend(dst, replacement);
// Move past valid bytes + one invalid byte.
str.remove_prefix(n_valid_bytes + 1);
}
}
-static bool ConsumeKey(StringPiece* input, StringPiece* key) {
+static bool ConsumeKey(absl::string_view* input, absl::string_view* key) {
if (input->empty() || !IsLetter((*input)[0])) return false;
int len = 1;
for (; len < input->size(); ++len) {
@@ -104,14 +109,14 @@
break;
}
}
- *key = StringPiece(input->data(), len);
- *input = StringPiece(input->data() + len, input->size() - len);
+ *key = absl::string_view(input->data(), len);
+ *input = absl::string_view(input->data() + len, input->size() - len);
return true;
}
// Same as 'ConsumeKey', but allows a widened set of key characters.
-static bool ConsumeKeyPermissive(StringPiece* input,
- StringPiece* key) {
+static bool ConsumeKeyPermissive(absl::string_view* input,
+ absl::string_view* key) {
if (input->empty() || !IsLetter((*input)[0])) return false;
int len = 1;
for (; len < input->size(); ++len) {
@@ -119,12 +124,12 @@
break;
}
}
- *key = StringPiece(input->data(), len);
- *input = StringPiece(input->data() + len, input->size() - len);
+ *key = absl::string_view(input->data(), len);
+ *input = absl::string_view(input->data() + len, input->size() - len);
return true;
}
-static bool MatchKey(StringPiece input) {
+static bool MatchKey(absl::string_view input) {
return !input.empty() && IsLetter(input[0]);
}
@@ -157,40 +162,40 @@
JsonStreamParser::~JsonStreamParser() {}
-util::Status JsonStreamParser::Parse(StringPiece json) {
- StringPiece chunk = json;
+absl::Status JsonStreamParser::Parse(absl::string_view json) {
+ absl::string_view chunk = json;
// If we have leftovers from a previous chunk, append the new chunk to it
- // and create a new StringPiece pointing at the string's data. This could
- // be large but we rely on the chunks to be small, assuming they are
+ // and create a new absl::string_view pointing at the string's data. This
+ // could be large but we rely on the chunks to be small, assuming they are
// fragments of a Cord.
if (!leftover_.empty()) {
// Don't point chunk to leftover_ because leftover_ will be updated in
// ParseChunk(chunk).
chunk_storage_.swap(leftover_);
- StrAppend(&chunk_storage_, json);
- chunk = StringPiece(chunk_storage_);
+ absl::StrAppend(&chunk_storage_, json);
+ chunk = absl::string_view(chunk_storage_);
}
// Find the structurally valid UTF8 prefix and parse only that.
int n = internal::UTF8SpnStructurallyValid(chunk);
if (n > 0) {
- util::Status status = ParseChunk(chunk.substr(0, n));
+ absl::Status status = ParseChunk(chunk.substr(0, n));
// Any leftover characters are stashed in leftover_ for later parsing when
// there is more data available.
- StrAppend(&leftover_, chunk.substr(n));
+ absl::StrAppend(&leftover_, chunk.substr(n));
return status;
} else {
leftover_.assign(chunk.data(), chunk.size());
- return util::Status();
+ return absl::Status();
}
}
-util::Status JsonStreamParser::FinishParse() {
+absl::Status JsonStreamParser::FinishParse() {
// If we do not expect anything and there is nothing left to parse we're all
// done.
if (stack_.empty() && leftover_.empty()) {
- return util::Status();
+ return absl::Status();
}
// Lifetime needs to last until RunParser returns, so keep this variable
@@ -215,7 +220,7 @@
// Parse the remainder in finishing mode, which reports errors for things like
// unterminated strings or unknown tokens that would normally be retried.
finishing_ = true;
- util::Status result = RunParser();
+ absl::Status result = RunParser();
if (result.ok()) {
SkipWhitespace();
if (!p_.empty()) {
@@ -227,14 +232,14 @@
return result;
}
-util::Status JsonStreamParser::ParseChunk(StringPiece chunk) {
+absl::Status JsonStreamParser::ParseChunk(absl::string_view chunk) {
// Do not do any work if the chunk is empty.
- if (chunk.empty()) return util::Status();
+ if (chunk.empty()) return absl::Status();
p_ = json_ = chunk;
finishing_ = false;
- util::Status result = RunParser();
+ absl::Status result = RunParser();
if (!result.ok()) return result;
SkipWhitespace();
@@ -253,7 +258,7 @@
// unparsed data left, we save it for later parse.
leftover_ = std::string(p_);
}
- return util::Status();
+ return absl::Status();
}
bool JsonStreamParser::IsInputAllWhiteSpaces(TokenType type) {
@@ -267,16 +272,16 @@
return false;
}
-util::Status JsonStreamParser::RunParser() {
+absl::Status JsonStreamParser::RunParser() {
while (!stack_.empty()) {
ParseType type = stack_.top();
TokenType t = (string_open_ == 0) ? GetNextTokenType() : BEGIN_STRING;
stack_.pop();
- util::Status result;
+ absl::Status result;
switch (type) {
case VALUE:
if (allow_no_root_element_ && IsInputAllWhiteSpaces(t)) {
- return util::Status();
+ return absl::Status();
}
result = ParseValue(t);
break;
@@ -303,28 +308,28 @@
default:
result =
- util::InternalError(StrCat("Unknown parse type: ", type));
+ absl::InternalError(absl::StrCat("Unknown parse type: ", type));
break;
}
if (!result.ok()) {
// If we were cancelled, save our state and try again later.
- if (!finishing_ && util::IsCancelled(result)) {
+ if (!finishing_ && absl::IsCancelled(result)) {
stack_.push(type);
// If we have a key we still need to render, make sure to save off the
// contents in our own storage.
if (!key_.empty() && key_storage_.empty()) {
- StrAppend(&key_storage_, key_);
- key_ = StringPiece(key_storage_);
+ absl::StrAppend(&key_storage_, key_);
+ key_ = absl::string_view(key_storage_);
}
- result = util::Status();
+ result = absl::Status();
}
return result;
}
}
- return util::Status();
+ return absl::Status();
}
-util::Status JsonStreamParser::ParseValue(TokenType type) {
+absl::Status JsonStreamParser::ParseValue(TokenType type) {
switch (type) {
case BEGIN_OBJECT:
return HandleBeginObject();
@@ -348,7 +353,7 @@
// don't know if the next char would be e, completing it, or something
// else, making it invalid.
if (!finishing_ && p_.length() < kKeywordFalse.length()) {
- return util::CancelledError("");
+ return absl::CancelledError("");
}
if (allow_empty_null_ && IsEmptyNullAllowed(type)) {
@@ -360,18 +365,18 @@
}
}
-util::Status JsonStreamParser::ParseString() {
- util::Status result = ParseStringHelper();
+absl::Status JsonStreamParser::ParseString() {
+ absl::Status result = ParseStringHelper();
if (result.ok()) {
ow_->RenderString(key_, parsed_);
- key_ = StringPiece();
- parsed_ = StringPiece();
+ key_ = absl::string_view();
+ parsed_ = absl::string_view();
parsed_storage_.clear();
}
return result;
}
-util::Status JsonStreamParser::ParseStringHelper() {
+absl::Status JsonStreamParser::ParseStringHelper() {
// If we haven't seen the start quote, grab it and remember it for later.
if (string_open_ == 0) {
string_open_ = *p_.data();
@@ -391,14 +396,14 @@
// depending on if we expect more data later.
if (p_.length() == 1) {
if (!finishing_) {
- return util::CancelledError("");
+ return absl::CancelledError("");
}
return ReportFailure("Closing quote expected in string.",
ParseErrorType::EXPECTED_CLOSING_QUOTE);
}
// Parse a unicode escape if we found \u in the string.
if (data[1] == 'u') {
- util::Status result = ParseUnicodeEscape();
+ absl::Status result = ParseUnicodeEscape();
if (!result.ok()) {
return result;
}
@@ -438,18 +443,18 @@
if (*data == string_open_) {
// If we didn't copy anything, reuse the input buffer.
if (parsed_storage_.empty()) {
- parsed_ = StringPiece(last, data - last);
+ parsed_ = absl::string_view(last, data - last);
} else {
if (last < data) {
parsed_storage_.append(last, data - last);
}
- parsed_ = StringPiece(parsed_storage_);
+ parsed_ = absl::string_view(parsed_storage_);
}
// Clear the quote char so next time we try to parse a string we'll
// start fresh.
string_open_ = 0;
Advance();
- return util::Status();
+ return absl::Status();
}
// Normal character, just advance past it.
Advance();
@@ -460,7 +465,7 @@
}
// If we didn't find the closing quote but we expect more data, cancel for now
if (!finishing_) {
- return util::CancelledError("");
+ return absl::CancelledError("");
}
// End of string reached without a closing quote, report an error.
string_open_ = 0;
@@ -475,10 +480,10 @@
// There are some security exploits with UTF-8 that we should be careful of:
// - http://www.unicode.org/reports/tr36/#UTF-8_Exploit
// - http://sites/intl-eng/design-guide/core-application
-util::Status JsonStreamParser::ParseUnicodeEscape() {
+absl::Status JsonStreamParser::ParseUnicodeEscape() {
if (p_.length() < kUnicodeEscapedLength) {
if (!finishing_) {
- return util::CancelledError("");
+ return absl::CancelledError("");
}
return ReportFailure("Illegal hex string.",
ParseErrorType::ILLEGAL_HEX_STRING);
@@ -497,7 +502,7 @@
code <= JsonEscaping::kMaxHighSurrogate) {
if (p_.length() < 2 * kUnicodeEscapedLength) {
if (!finishing_) {
- return util::CancelledError("");
+ return absl::CancelledError("");
}
if (!coerce_to_utf8_) {
return ReportFailure("Missing low surrogate.",
@@ -539,27 +544,27 @@
// Advance past the [final] code unit escape.
p_.remove_prefix(kUnicodeEscapedLength);
parsed_storage_.append(buf, len);
- return util::Status();
+ return absl::Status();
}
-util::Status JsonStreamParser::ParseNumber() {
+absl::Status JsonStreamParser::ParseNumber() {
NumberResult number;
- util::Status result = ParseNumberHelper(&number);
+ absl::Status result = ParseNumberHelper(&number);
if (result.ok()) {
switch (number.type) {
case NumberResult::DOUBLE:
ow_->RenderDouble(key_, number.double_val);
- key_ = StringPiece();
+ key_ = absl::string_view();
break;
case NumberResult::INT:
ow_->RenderInt64(key_, number.int_val);
- key_ = StringPiece();
+ key_ = absl::string_view();
break;
case NumberResult::UINT:
ow_->RenderUint64(key_, number.uint_val);
- key_ = StringPiece();
+ key_ = absl::string_view();
break;
default:
@@ -570,7 +575,7 @@
return result;
}
-util::Status JsonStreamParser::ParseDoubleHelper(const std::string& number,
+absl::Status JsonStreamParser::ParseDoubleHelper(const std::string& number,
NumberResult* result) {
if (!safe_strtod(number, &result->double_val)) {
return ReportFailure("Unable to parse number.",
@@ -581,10 +586,10 @@
ParseErrorType::NUMBER_EXCEEDS_RANGE_DOUBLE);
}
result->type = NumberResult::DOUBLE;
- return util::Status();
+ return absl::Status();
}
-util::Status JsonStreamParser::ParseNumberHelper(NumberResult* result) {
+absl::Status JsonStreamParser::ParseNumberHelper(NumberResult* result) {
const char* data = p_.data();
int length = p_.length();
@@ -611,7 +616,7 @@
// If the entire input is a valid number, and we may have more content in the
// future, we abort for now and resume when we know more.
if (index == length && !finishing_) {
- return util::CancelledError("");
+ return absl::CancelledError("");
}
// Create a string containing just the number, so we can use safe_strtoX
@@ -619,7 +624,7 @@
// Floating point number, parse as a double.
if (floating) {
- util::Status status = ParseDoubleHelper(number, result);
+ absl::Status status = ParseDoubleHelper(number, result);
if (status.ok()) {
p_.remove_prefix(index);
}
@@ -637,10 +642,10 @@
if (safe_strtou64(number, &result->uint_val)) {
result->type = NumberResult::UINT;
p_.remove_prefix(index);
- return util::Status();
+ return absl::Status();
} else {
// If the value is too large, parse it as double.
- util::Status status = ParseDoubleHelper(number, result);
+ absl::Status status = ParseDoubleHelper(number, result);
if (status.ok()) {
p_.remove_prefix(index);
}
@@ -658,10 +663,10 @@
if (safe_strto64(number, &result->int_val)) {
result->type = NumberResult::INT;
p_.remove_prefix(index);
- return util::Status();
+ return absl::Status();
} else {
// If the value is too large, parse it as double.
- util::Status status = ParseDoubleHelper(number, result);
+ absl::Status status = ParseDoubleHelper(number, result);
if (status.ok()) {
p_.remove_prefix(index);
}
@@ -669,7 +674,7 @@
}
}
-util::Status JsonStreamParser::HandleBeginObject() {
+absl::Status JsonStreamParser::HandleBeginObject() {
GOOGLE_DCHECK_EQ('{', *p_.data());
Advance();
ow_->StartObject(key_);
@@ -677,12 +682,12 @@
if (!status.ok()) {
return status;
}
- key_ = StringPiece();
+ key_ = absl::string_view();
stack_.push(ENTRY);
- return util::Status();
+ return absl::Status();
}
-util::Status JsonStreamParser::ParseObjectMid(TokenType type) {
+absl::Status JsonStreamParser::ParseObjectMid(TokenType type) {
if (type == UNKNOWN) {
return ReportUnknown("Expected , or } after key:value pair.",
ParseErrorType::EXPECTED_COMMA_OR_BRACES);
@@ -693,20 +698,20 @@
Advance();
ow_->EndObject();
--recursion_depth_;
- return util::Status();
+ return absl::Status();
}
// Found a comma, advance past it and get ready for an entry.
if (type == VALUE_SEPARATOR) {
Advance();
stack_.push(ENTRY);
- return util::Status();
+ return absl::Status();
}
// Illegal token after key:value pair.
return ReportFailure("Expected , or } after key:value pair.",
ParseErrorType::EXPECTED_COMMA_OR_BRACES);
}
-util::Status JsonStreamParser::ParseEntry(TokenType type) {
+absl::Status JsonStreamParser::ParseEntry(TokenType type) {
if (type == UNKNOWN) {
return ReportUnknown("Expected an object key or }.",
ParseErrorType::EXPECTED_OBJECT_KEY_OR_BRACES);
@@ -717,10 +722,10 @@
ow_->EndObject();
Advance();
--recursion_depth_;
- return util::Status();
+ return absl::Status();
}
- util::Status result;
+ absl::Status result;
if (type == BEGIN_STRING) {
// Key is a string (standard JSON), parse it and store the string.
result = ParseStringHelper();
@@ -728,14 +733,15 @@
key_storage_.clear();
if (!parsed_storage_.empty()) {
parsed_storage_.swap(key_storage_);
- key_ = StringPiece(key_storage_);
+ key_ = absl::string_view(key_storage_);
} else {
key_ = parsed_;
}
- parsed_ = StringPiece();
+ parsed_ = absl::string_view();
}
} else if (type == BEGIN_KEY) {
- // Key is a bare key (back compat), create a StringPiece pointing to it.
+ // Key is a bare key (back compat), create a absl::string_view pointing to
+ // it.
result = ParseKey();
} else if (type == BEGIN_NULL || type == BEGIN_TRUE || type == BEGIN_FALSE) {
// Key may be a bare key that begins with a reserved word.
@@ -758,7 +764,7 @@
return result;
}
-util::Status JsonStreamParser::ParseEntryMid(TokenType type) {
+absl::Status JsonStreamParser::ParseEntryMid(TokenType type) {
if (type == UNKNOWN) {
return ReportUnknown("Expected : between key:value pair.",
ParseErrorType::EXPECTED_COLON);
@@ -766,22 +772,22 @@
if (type == ENTRY_SEPARATOR) {
Advance();
stack_.push(VALUE);
- return util::Status();
+ return absl::Status();
}
return ReportFailure("Expected : between key:value pair.",
ParseErrorType::EXPECTED_COLON);
}
-util::Status JsonStreamParser::HandleBeginArray() {
+absl::Status JsonStreamParser::HandleBeginArray() {
GOOGLE_DCHECK_EQ('[', *p_.data());
Advance();
ow_->StartList(key_);
- key_ = StringPiece();
+ key_ = absl::string_view();
stack_.push(ARRAY_VALUE);
- return util::Status();
+ return absl::Status();
}
-util::Status JsonStreamParser::ParseArrayValue(TokenType type) {
+absl::Status JsonStreamParser::ParseArrayValue(TokenType type) {
if (type == UNKNOWN) {
return ReportUnknown("Expected a value or ] within an array.",
ParseErrorType::EXPECTED_VALUE_OR_BRACKET);
@@ -790,15 +796,15 @@
if (type == END_ARRAY) {
ow_->EndList();
Advance();
- return util::Status();
+ return absl::Status();
}
// The ParseValue call may push something onto the stack so we need to make
// sure an ARRAY_MID is after it, so we push it on now. Also, the parsing of
// empty-null array value is relying on this ARRAY_MID token.
stack_.push(ARRAY_MID);
- util::Status result = ParseValue(type);
- if (util::IsCancelled(result)) {
+ absl::Status result = ParseValue(type);
+ if (absl::IsCancelled(result)) {
// If we were cancelled, pop back off the ARRAY_MID so we don't try to
// push it on again when we try over.
stack_.pop();
@@ -806,7 +812,7 @@
return result;
}
-util::Status JsonStreamParser::ParseArrayMid(TokenType type) {
+absl::Status JsonStreamParser::ParseArrayMid(TokenType type) {
if (type == UNKNOWN) {
return ReportUnknown("Expected , or ] after array value.",
ParseErrorType::EXPECTED_COMMA_OR_BRACKET);
@@ -815,45 +821,45 @@
if (type == END_ARRAY) {
ow_->EndList();
Advance();
- return util::Status();
+ return absl::Status();
}
// Found a comma, advance past it and expect an array value next.
if (type == VALUE_SEPARATOR) {
Advance();
stack_.push(ARRAY_VALUE);
- return util::Status();
+ return absl::Status();
}
// Illegal token after array value.
return ReportFailure("Expected , or ] after array value.",
ParseErrorType::EXPECTED_COMMA_OR_BRACKET);
}
-util::Status JsonStreamParser::ParseTrue() {
+absl::Status JsonStreamParser::ParseTrue() {
ow_->RenderBool(key_, true);
- key_ = StringPiece();
+ key_ = absl::string_view();
p_.remove_prefix(kKeywordTrue.length());
- return util::Status();
+ return absl::Status();
}
-util::Status JsonStreamParser::ParseFalse() {
+absl::Status JsonStreamParser::ParseFalse() {
ow_->RenderBool(key_, false);
- key_ = StringPiece();
+ key_ = absl::string_view();
p_.remove_prefix(kKeywordFalse.length());
- return util::Status();
+ return absl::Status();
}
-util::Status JsonStreamParser::ParseNull() {
+absl::Status JsonStreamParser::ParseNull() {
ow_->RenderNull(key_);
- key_ = StringPiece();
+ key_ = absl::string_view();
p_.remove_prefix(kKeywordNull.length());
- return util::Status();
+ return absl::Status();
}
-util::Status JsonStreamParser::ParseEmptyNull() {
+absl::Status JsonStreamParser::ParseEmptyNull() {
ow_->RenderNull(key_);
- key_ = StringPiece();
- return util::Status();
+ key_ = absl::string_view();
+ return absl::Status();
}
bool JsonStreamParser::IsEmptyNullAllowed(TokenType type) {
@@ -862,7 +868,7 @@
stack_.top() == OBJ_MID;
}
-util::Status JsonStreamParser::ReportFailure(StringPiece message,
+absl::Status JsonStreamParser::ReportFailure(absl::string_view message,
ParseErrorType parse_code) {
(void)parse_code; // Parameter is used in Google-internal code.
static const int kContextLength = 20;
@@ -871,54 +877,54 @@
const char* begin = std::max(p_start - kContextLength, json_start);
const char* end =
std::min(p_start + kContextLength, json_start + json_.size());
- StringPiece segment(begin, end - begin);
+ absl::string_view segment(begin, end - begin);
std::string location(p_start - begin, ' ');
location.push_back('^');
- auto status = util::InvalidArgumentError(
- StrCat(message, "\n", segment, "\n", location));
+ auto status = absl::InvalidArgumentError(
+ absl::StrCat(message, "\n", segment, "\n", location));
return status;
}
-util::Status JsonStreamParser::ReportUnknown(StringPiece message,
+absl::Status JsonStreamParser::ReportUnknown(absl::string_view message,
ParseErrorType parse_code) {
// If we aren't finishing the parse, cancel parsing and try later.
if (!finishing_) {
- return util::CancelledError("");
+ return absl::CancelledError("");
}
if (p_.empty()) {
- return ReportFailure(StrCat("Unexpected end of string. ", message),
+ return ReportFailure(absl::StrCat("Unexpected end of string. ", message),
parse_code);
}
return ReportFailure(message, parse_code);
}
-util::Status JsonStreamParser::IncrementRecursionDepth(
- StringPiece key) const {
+absl::Status JsonStreamParser::IncrementRecursionDepth(
+ absl::string_view key) const {
if (++recursion_depth_ > max_recursion_depth_) {
- return util::InvalidArgumentError(StrCat(
+ return absl::InvalidArgumentError(absl::StrCat(
"Message too deep. Max recursion depth reached for key '", key, "'"));
}
- return util::Status();
+ return absl::Status();
}
void JsonStreamParser::SkipWhitespace() {
- while (!p_.empty() && ascii_isspace(*p_.data())) {
+ while (!p_.empty() && absl::ascii_isspace(*p_.data())) {
Advance();
}
- if (!p_.empty() && !ascii_isspace(*p_.data())) {
+ if (!p_.empty() && !absl::ascii_isspace(*p_.data())) {
seen_non_whitespace_ = true;
}
}
void JsonStreamParser::Advance() {
// Advance by moving one UTF8 character while making sure we don't go beyond
- // the length of StringPiece.
+ // the length of the string.
p_.remove_prefix(std::min<int>(
p_.length(), UTF8FirstLetterNumBytes(p_.data(), p_.length())));
}
-util::Status JsonStreamParser::ParseKey() {
- StringPiece original = p_;
+absl::Status JsonStreamParser::ParseKey() {
+ absl::string_view original = p_;
if (allow_permissive_key_naming_) {
if (!ConsumeKeyPermissive(&p_, &key_)) {
@@ -936,11 +942,11 @@
// we can't know if the key was complete or not.
if (!finishing_ && p_.empty()) {
p_ = original;
- return util::CancelledError("");
+ return absl::CancelledError("");
}
// Since we aren't using the key storage, clear it out.
key_storage_.clear();
- return util::Status();
+ return absl::Status();
}
JsonStreamParser::TokenType JsonStreamParser::GetNextTokenType() {
@@ -955,21 +961,21 @@
// TODO(sven): Split this method based on context since different contexts
// support different tokens. Would slightly speed up processing?
const char* data = p_.data();
- StringPiece data_view = StringPiece(data, size);
+ absl::string_view data_view = absl::string_view(data, size);
if (*data == '\"' || *data == '\'') return BEGIN_STRING;
if (*data == '-' || ('0' <= *data && *data <= '9')) {
return BEGIN_NUMBER;
}
if (size >= kKeywordTrue.length() &&
- HasPrefixString(data_view, kKeywordTrue)) {
+ absl::StartsWith(data_view, kKeywordTrue)) {
return BEGIN_TRUE;
}
if (size >= kKeywordFalse.length() &&
- HasPrefixString(data_view, kKeywordFalse)) {
+ absl::StartsWith(data_view, kKeywordFalse)) {
return BEGIN_FALSE;
}
if (size >= kKeywordNull.length() &&
- HasPrefixString(data_view, kKeywordNull)) {
+ absl::StartsWith(data_view, kKeywordNull)) {
return BEGIN_NULL;
}
if (*data == '{') return BEGIN_OBJECT;
diff --git a/src/google/protobuf/util/internal/json_stream_parser.h b/src/google/protobuf/util/internal/json_stream_parser.h
index 09f17ad..9f30a05 100644
--- a/src/google/protobuf/util/internal/json_stream_parser.h
+++ b/src/google/protobuf/util/internal/json_stream_parser.h
@@ -35,13 +35,14 @@
#include <stack>
#include <string>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/status.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/status.h>
+#include "google/protobuf/stubs/common.h"
+#include "absl/status/status.h"
+#include "google/protobuf/port.h"
+#include "absl/strings/string_view.h"
+
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -75,20 +76,23 @@
public:
// Creates a JsonStreamParser that will write to the given ObjectWriter.
explicit JsonStreamParser(ObjectWriter* ow);
+ JsonStreamParser() = delete;
+ JsonStreamParser(const JsonStreamParser&) = delete;
+ JsonStreamParser& operator=(const JsonStreamParser&) = delete;
virtual ~JsonStreamParser();
- // Parses a UTF-8 encoded JSON string from a StringPiece. If the returned
- // status is non-ok, the status might contain a payload ParseErrorType with
- // type_url kParseErrorTypeUrl and a payload containing string snippet of the
- // error with type_url kParseErrorSnippetUrl.
- util::Status Parse(StringPiece json);
+ // Parses a UTF-8 encoded JSON string from an absl::string_view. If the
+ // returned status is non-ok, the status might contain a payload
+ // ParseErrorType with type_url kParseErrorTypeUrl and a payload containing
+ // string snippet of the error with type_url kParseErrorSnippetUrl.
+ absl::Status Parse(absl::string_view json);
// Finish parsing the JSON string. If the returned status is non-ok, the
// status might contain a payload ParseErrorType with type_url
// kParseErrorTypeUrl and a payload containing string snippet of the error
// with type_url kParseErrorSnippetUrl.
- util::Status FinishParse();
+ absl::Status FinishParse();
// Sets the max recursion depth of JSON message to be deserialized. JSON
@@ -164,69 +168,69 @@
};
// Parses a single chunk of JSON, returning an error if the JSON was invalid.
- util::Status ParseChunk(StringPiece chunk);
+ absl::Status ParseChunk(absl::string_view chunk);
// Runs the parser based on stack_ and p_, until the stack is empty or p_ runs
// out of data. If we unexpectedly run out of p_ we push the latest back onto
// the stack and return.
- util::Status RunParser();
+ absl::Status RunParser();
// Parses a value from p_ and writes it to ow_.
// A value may be an object, array, true, false, null, string or number.
- util::Status ParseValue(TokenType type);
+ absl::Status ParseValue(TokenType type);
// Parses a string and writes it out to the ow_.
- util::Status ParseString();
+ absl::Status ParseString();
// Parses a string, storing the result in parsed_.
- util::Status ParseStringHelper();
+ absl::Status ParseStringHelper();
// This function parses unicode escape sequences in strings. It returns an
// error when there's a parsing error, either the size is not the expected
// size or a character is not a hex digit. When it returns str will contain
// what has been successfully parsed so far.
- util::Status ParseUnicodeEscape();
+ absl::Status ParseUnicodeEscape();
// Expects p_ to point to a JSON number, writes the number to the writer using
// the appropriate Render method based on the type of number.
- util::Status ParseNumber();
+ absl::Status ParseNumber();
// Parse a number into a NumberResult, reporting an error if no number could
// be parsed. This method will try to parse into a uint64, int64, or double
// based on whether the number was positive or negative or had a decimal
// component.
- util::Status ParseNumberHelper(NumberResult* result);
+ absl::Status ParseNumberHelper(NumberResult* result);
// Parse a number as double into a NumberResult.
- util::Status ParseDoubleHelper(const std::string& number,
+ absl::Status ParseDoubleHelper(const std::string& number,
NumberResult* result);
// Handles a { during parsing of a value.
- util::Status HandleBeginObject();
+ absl::Status HandleBeginObject();
// Parses from the ENTRY state.
- util::Status ParseEntry(TokenType type);
+ absl::Status ParseEntry(TokenType type);
// Parses from the ENTRY_MID state.
- util::Status ParseEntryMid(TokenType type);
+ absl::Status ParseEntryMid(TokenType type);
// Parses from the OBJ_MID state.
- util::Status ParseObjectMid(TokenType type);
+ absl::Status ParseObjectMid(TokenType type);
// Handles a [ during parsing of a value.
- util::Status HandleBeginArray();
+ absl::Status HandleBeginArray();
// Parses from the ARRAY_VALUE state.
- util::Status ParseArrayValue(TokenType type);
+ absl::Status ParseArrayValue(TokenType type);
// Parses from the ARRAY_MID state.
- util::Status ParseArrayMid(TokenType type);
+ absl::Status ParseArrayMid(TokenType type);
// Expects p_ to point to an unquoted literal
- util::Status ParseTrue();
- util::Status ParseFalse();
- util::Status ParseNull();
- util::Status ParseEmptyNull();
+ absl::Status ParseTrue();
+ absl::Status ParseFalse();
+ absl::Status ParseNull();
+ absl::Status ParseEmptyNull();
// Whether an empty-null is allowed in the current state.
bool IsEmptyNullAllowed(TokenType type);
@@ -235,19 +239,19 @@
bool IsInputAllWhiteSpaces(TokenType type);
// Report a failure as a util::Status.
- util::Status ReportFailure(StringPiece message,
+ absl::Status ReportFailure(absl::string_view message,
ParseErrorType parse_code);
// Report a failure due to an UNKNOWN token type. We check if we hit the
// end of the stream and if we're finishing or not to detect what type of
// status to return in this case.
- util::Status ReportUnknown(StringPiece message,
+ absl::Status ReportUnknown(absl::string_view message,
ParseErrorType parse_code);
// Helper function to check recursion depth and increment it. It will return
// OkStatus() if the current depth is allowed. Otherwise an error is returned.
// key is used for error reporting.
- util::Status IncrementRecursionDepth(StringPiece key) const;
+ absl::Status IncrementRecursionDepth(absl::string_view key) const;
// Advance p_ past all whitespace or until the end of the string.
void SkipWhitespace();
@@ -256,7 +260,7 @@
void Advance();
// Expects p_ to point to the beginning of a key.
- util::Status ParseKey();
+ absl::Status ParseKey();
// Return the type of the next token at p_.
TokenType GetNextTokenType();
@@ -274,13 +278,13 @@
// The current chunk of JSON being parsed. Primarily used for providing
// context during error reporting.
- StringPiece json_;
+ absl::string_view json_;
// A pointer within the current JSON being parsed, used to track location.
- StringPiece p_;
+ absl::string_view p_;
// Stores the last key read, as we separate parsing of keys and values.
- StringPiece key_;
+ absl::string_view key_;
// Storage for key_ if we need to keep ownership, for example between chunks
// or if the key was unescaped from a JSON string.
@@ -301,7 +305,7 @@
bool allow_no_root_element_;
// String we parsed during a call to ParseStringHelper().
- StringPiece parsed_;
+ absl::string_view parsed_;
// Storage for the string we parsed. This may be empty if the string was able
// to be parsed directly from the input.
@@ -336,8 +340,6 @@
// Maximum allowed recursion depth.
int max_recursion_depth_;
-
- GOOGLE_DISALLOW_IMPLICIT_CONSTRUCTORS(JsonStreamParser);
};
} // namespace converter
@@ -345,6 +347,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_UTIL_INTERNAL_JSON_STREAM_PARSER_H__
diff --git a/src/google/protobuf/util/internal/json_stream_parser_test.cc b/src/google/protobuf/util/internal/json_stream_parser_test.cc
index 40157a2..9d3fd4c 100644
--- a/src/google/protobuf/util/internal/json_stream_parser_test.cc
+++ b/src/google/protobuf/util/internal/json_stream_parser_test.cc
@@ -28,17 +28,18 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/util/internal/json_stream_parser.h>
+#include "google/protobuf/util/internal/json_stream_parser.h"
#include <cstdint>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/util/internal/expecting_objectwriter.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/util/internal/expecting_objectwriter.h"
#include <gtest/gtest.h>
-#include <google/protobuf/stubs/time.h>
-#include <google/protobuf/util/internal/object_writer.h>
-#include <google/protobuf/stubs/status.h>
+#include "absl/status/status.h"
+#include "absl/strings/str_cat.h"
+#include "absl/time/time.h"
+#include "google/protobuf/util/internal/object_writer.h"
namespace google {
@@ -87,7 +88,7 @@
JsonStreamParserTest() : mock_(), ow_(&mock_) {}
~JsonStreamParserTest() override {}
- util::Status RunTest(StringPiece json, int split,
+ absl::Status RunTest(absl::string_view json, int split,
std::function<void(JsonStreamParser*)> setup) {
JsonStreamParser parser(&mock_);
setup(&parser);
@@ -96,8 +97,8 @@
if (split == json.length()) {
GOOGLE_LOG(INFO) << "Testing split every char: " << json;
for (int i = 0; i < json.length(); ++i) {
- StringPiece single = json.substr(i, 1);
- util::Status result = parser.Parse(single);
+ absl::string_view single = json.substr(i, 1);
+ absl::Status result = parser.Parse(single);
if (!result.ok()) {
return result;
}
@@ -106,10 +107,10 @@
}
// Normal case, split at the split point and parse two substrings.
- StringPiece first = json.substr(0, split);
- StringPiece rest = json.substr(split);
+ absl::string_view first = json.substr(0, split);
+ absl::string_view rest = json.substr(split);
GOOGLE_LOG(INFO) << "Testing split: " << first << "><" << rest;
- util::Status result = parser.Parse(first);
+ absl::Status result = parser.Parse(first);
if (result.ok()) {
result = parser.Parse(rest);
if (result.ok()) {
@@ -123,10 +124,10 @@
}
void DoTest(
- StringPiece json, int split,
+ absl::string_view json, int split,
std::function<void(JsonStreamParser*)> setup = [](JsonStreamParser* p) {
}) {
- util::Status result = RunTest(json, split, setup);
+ absl::Status result = RunTest(json, split, setup);
if (!result.ok()) {
GOOGLE_LOG(WARNING) << result;
}
@@ -134,23 +135,23 @@
}
void DoErrorTest(
- StringPiece json, int split, StringPiece error_prefix,
+ absl::string_view json, int split, absl::string_view error_prefix,
std::function<void(JsonStreamParser*)> setup = [](JsonStreamParser* p) {
}) {
- util::Status result = RunTest(json, split, setup);
- EXPECT_TRUE(util::IsInvalidArgument(result));
- StringPiece error_message(result.message());
+ absl::Status result = RunTest(json, split, setup);
+ EXPECT_TRUE(absl::IsInvalidArgument(result));
+ absl::string_view error_message(result.message());
EXPECT_EQ(error_prefix, error_message.substr(0, error_prefix.size()));
}
void DoErrorTest(
- StringPiece json, int split, StringPiece error_prefix,
+ absl::string_view json, int split, absl::string_view error_prefix,
ParseErrorType expected_parse_error_type,
std::function<void(JsonStreamParser*)> setup = [](JsonStreamParser* p) {
}) {
- util::Status result = RunTest(json, split, setup);
- EXPECT_TRUE(util::IsInvalidArgument(result));
- StringPiece error_message(result.message());
+ absl::Status result = RunTest(json, split, setup);
+ EXPECT_TRUE(absl::IsInvalidArgument(result));
+ absl::string_view error_message(result.message());
EXPECT_EQ(error_prefix, error_message.substr(0, error_prefix.size()));
}
@@ -170,7 +171,7 @@
// - true, false, null
TEST_F(JsonStreamParserTest, SimpleTrue) {
- StringPiece str = "true";
+ absl::string_view str = "true";
for (int i = 0; i <= str.length(); ++i) {
ow_.RenderBool("", true);
DoTest(str, i);
@@ -178,7 +179,7 @@
}
TEST_F(JsonStreamParserTest, SimpleFalse) {
- StringPiece str = "false";
+ absl::string_view str = "false";
for (int i = 0; i <= str.length(); ++i) {
ow_.RenderBool("", false);
DoTest(str, i);
@@ -186,7 +187,7 @@
}
TEST_F(JsonStreamParserTest, SimpleNull) {
- StringPiece str = "null";
+ absl::string_view str = "null";
for (int i = 0; i <= str.length(); ++i) {
ow_.RenderNull("");
DoTest(str, i);
@@ -195,7 +196,7 @@
// - empty object and array.
TEST_F(JsonStreamParserTest, EmptyObject) {
- StringPiece str = "{}";
+ absl::string_view str = "{}";
for (int i = 0; i <= str.length(); ++i) {
ow_.StartObject("")->EndObject();
DoTest(str, i);
@@ -203,7 +204,7 @@
}
TEST_F(JsonStreamParserTest, EmptyList) {
- StringPiece str = "[]";
+ absl::string_view str = "[]";
for (int i = 0; i <= str.length(); ++i) {
ow_.StartList("")->EndList();
DoTest(str, i);
@@ -212,7 +213,7 @@
// - negative and positive double and int, unsigned int
TEST_F(JsonStreamParserTest, SimpleDouble) {
- StringPiece str = "42.5";
+ absl::string_view str = "42.5";
for (int i = 0; i <= str.length(); ++i) {
ow_.RenderDouble("", 42.5);
DoTest(str, i);
@@ -220,7 +221,7 @@
}
TEST_F(JsonStreamParserTest, ScientificDouble) {
- StringPiece str = "1.2345e-10";
+ absl::string_view str = "1.2345e-10";
for (int i = 0; i < str.length(); ++i) {
ow_.RenderDouble("", 1.2345e-10);
DoTest(str, i);
@@ -228,7 +229,7 @@
}
TEST_F(JsonStreamParserTest, SimpleNegativeDouble) {
- StringPiece str = "-1045.235";
+ absl::string_view str = "-1045.235";
for (int i = 0; i <= str.length(); ++i) {
ow_.RenderDouble("", -1045.235);
DoTest(str, i);
@@ -236,7 +237,7 @@
}
TEST_F(JsonStreamParserTest, SimpleInt) {
- StringPiece str = "123456";
+ absl::string_view str = "123456";
for (int i = 0; i <= str.length(); ++i) {
ow_.RenderUint64("", 123456);
DoTest(str, i);
@@ -244,7 +245,7 @@
}
TEST_F(JsonStreamParserTest, SimpleNegativeInt) {
- StringPiece str = "-79497823553162765";
+ absl::string_view str = "-79497823553162765";
for (int i = 0; i <= str.length(); ++i) {
ow_.RenderInt64("", int64_t{-79497823553162765});
DoTest(str, i);
@@ -252,7 +253,7 @@
}
TEST_F(JsonStreamParserTest, SimpleUnsignedInt) {
- StringPiece str = "11779497823553162765";
+ absl::string_view str = "11779497823553162765";
for (int i = 0; i <= str.length(); ++i) {
ow_.RenderUint64("", uint64_t{11779497823553162765u});
DoTest(str, i);
@@ -260,7 +261,7 @@
}
TEST_F(JsonStreamParserTest, OctalNumberIsInvalid) {
- StringPiece str = "01234";
+ absl::string_view str = "01234";
for (int i = 0; i <= str.length(); ++i) {
DoErrorTest(str, i, "Octal/hex numbers are not valid JSON values.",
ParseErrorType::OCTAL_OR_HEX_ARE_NOT_VALID_JSON_VALUES);
@@ -273,7 +274,7 @@
}
TEST_F(JsonStreamParserTest, HexNumberIsInvalid) {
- StringPiece str = "0x1234";
+ absl::string_view str = "0x1234";
for (int i = 0; i <= str.length(); ++i) {
DoErrorTest(str, i, "Octal/hex numbers are not valid JSON values.",
ParseErrorType::OCTAL_OR_HEX_ARE_NOT_VALID_JSON_VALUES);
@@ -292,7 +293,7 @@
// - single and double quoted strings
TEST_F(JsonStreamParserTest, EmptyDoubleQuotedString) {
- StringPiece str = "\"\"";
+ absl::string_view str = "\"\"";
for (int i = 0; i <= str.length(); ++i) {
ow_.RenderString("", "");
DoTest(str, i);
@@ -300,7 +301,7 @@
}
TEST_F(JsonStreamParserTest, EmptySingleQuotedString) {
- StringPiece str = "''";
+ absl::string_view str = "''";
for (int i = 0; i <= str.length(); ++i) {
ow_.RenderString("", "");
DoTest(str, i);
@@ -308,7 +309,7 @@
}
TEST_F(JsonStreamParserTest, SimpleDoubleQuotedString) {
- StringPiece str = "\"Some String\"";
+ absl::string_view str = "\"Some String\"";
for (int i = 0; i <= str.length(); ++i) {
ow_.RenderString("", "Some String");
DoTest(str, i);
@@ -316,7 +317,7 @@
}
TEST_F(JsonStreamParserTest, SimpleSingleQuotedString) {
- StringPiece str = "'Another String'";
+ absl::string_view str = "'Another String'";
for (int i = 0; i <= str.length(); ++i) {
ow_.RenderString("", "Another String");
DoTest(str, i);
@@ -325,7 +326,7 @@
// - string key, unquoted key, numeric key
TEST_F(JsonStreamParserTest, ObjectKeyTypes) {
- StringPiece str =
+ absl::string_view str =
"{'s': true, \"d\": false, key: null, snake_key: [], camelKey: {}}";
for (int i = 0; i <= str.length(); ++i) {
ow_.StartObject("")
@@ -342,7 +343,7 @@
}
TEST_F(JsonStreamParserTest, UnquotedObjectKeyWithReservedPrefxes) {
- StringPiece str = "{ nullkey: \"a\", truekey: \"b\", falsekey: \"c\"}";
+ absl::string_view str = "{ nullkey: \"a\", truekey: \"b\", falsekey: \"c\"}";
for (int i = 0; i <= str.length(); ++i) {
ow_.StartObject("")
->RenderString("nullkey", "a")
@@ -354,7 +355,7 @@
}
TEST_F(JsonStreamParserTest, UnquotedObjectKeyWithReservedKeyword) {
- StringPiece str = "{ null: \"a\", true: \"b\", false: \"c\"}";
+ absl::string_view str = "{ null: \"a\", true: \"b\", false: \"c\"}";
for (int i = 0; i <= str.length(); ++i) {
DoErrorTest(str, i, "Expected an object key or }.",
ParseErrorType::EXPECTED_OBJECT_KEY_OR_BRACES);
@@ -362,7 +363,7 @@
}
TEST_F(JsonStreamParserTest, UnquotedObjectKeyWithEmbeddedNonAlphanumeric) {
- StringPiece str = "{ foo-bar-baz: \"a\"}";
+ absl::string_view str = "{ foo-bar-baz: \"a\"}";
for (int i = 0; i <= str.length(); ++i) {
DoErrorTest(str, i, "Expected : between key:value pair.",
ParseErrorType::EXPECTED_COLON);
@@ -372,7 +373,7 @@
// - array containing primitive values (true, false, null, num, string)
TEST_F(JsonStreamParserTest, ArrayPrimitiveValues) {
- StringPiece str = "[true, false, null, 'one', \"two\"]";
+ absl::string_view str = "[true, false, null, 'one', \"two\"]";
for (int i = 0; i <= str.length(); ++i) {
ow_.StartList("")
->RenderBool("", true)
@@ -387,7 +388,7 @@
// - array containing array, object
TEST_F(JsonStreamParserTest, ArrayComplexValues) {
- StringPiece str =
+ absl::string_view str =
"[[22, -127, 45.3, -1056.4, 11779497823553162765], {'key': true}]";
for (int i = 0; i <= str.length(); ++i) {
ow_.StartList("")
@@ -409,7 +410,7 @@
// - object containing array, object, value (true, false, null, num, string)
TEST_F(JsonStreamParserTest, ObjectValues) {
- StringPiece str =
+ absl::string_view str =
"{t: true, f: false, n: null, s: 'a string', d: \"another string\", pi: "
"22, ni: -127, pd: 45.3, nd: -1056.4, pl: 11779497823553162765, l: [[]], "
"o: {'key': true}}";
@@ -439,7 +440,7 @@
TEST_F(JsonStreamParserTest, RejectNonUtf8WhenNotCoerced) {
- StringPiece json = "{\"address\":\xFF\"חרושת 23, רעננה, ישראל\"}";
+ absl::string_view json = "{\"address\":\xFF\"חרושת 23, רעננה, ישראל\"}";
for (int i = 0; i <= json.length(); ++i) {
DoErrorTest(json, i, "Encountered non UTF-8 code points.",
ParseErrorType::NON_UTF_8);
@@ -455,7 +456,7 @@
// - unicode handling in strings
TEST_F(JsonStreamParserTest, UnicodeEscaping) {
- StringPiece str = "[\"\\u0639\\u0631\\u0628\\u0649\"]";
+ absl::string_view str = "[\"\\u0639\\u0631\\u0628\\u0649\"]";
for (int i = 0; i <= str.length(); ++i) {
ow_.StartList("")
->RenderString("", "\xD8\xB9\xD8\xB1\xD8\xA8\xD9\x89")
@@ -466,7 +467,7 @@
// - unicode UTF-16 surrogate pair handling in strings
TEST_F(JsonStreamParserTest, UnicodeSurrogatePairEscaping) {
- StringPiece str =
+ absl::string_view str =
"[\"\\u0bee\\ud800\\uddf1\\uD80C\\uDDA4\\uD83d\\udC1D\\uD83C\\uDF6F\"]";
for (int i = 0; i <= str.length(); ++i) {
ow_.StartList("")
@@ -481,7 +482,7 @@
TEST_F(JsonStreamParserTest, UnicodeEscapingInvalidCodePointWhenNotCoerced) {
// A low surrogate alone.
- StringPiece str = "[\"\\ude36\"]";
+ absl::string_view str = "[\"\\ude36\"]";
for (int i = 0; i <= str.length(); ++i) {
DoErrorTest(str, i, "Invalid unicode code point.",
ParseErrorType::INVALID_UNICODE);
@@ -490,7 +491,7 @@
TEST_F(JsonStreamParserTest, UnicodeEscapingMissingLowSurrogateWhenNotCoerced) {
// A high surrogate alone.
- StringPiece str = "[\"\\ud83d\"]";
+ absl::string_view str = "[\"\\ud83d\"]";
for (int i = 0; i <= str.length(); ++i) {
DoErrorTest(str, i, "Missing low surrogate.",
ParseErrorType::MISSING_LOW_SURROGATE);
@@ -517,7 +518,7 @@
// - ascii escaping (\b, \f, \n, \r, \t, \v)
TEST_F(JsonStreamParserTest, AsciiEscaping) {
- StringPiece str =
+ absl::string_view str =
"[\"\\b\", \"\\ning\", \"test\\f\", \"\\r\\t\", \"test\\\\\\ving\"]";
for (int i = 0; i <= str.length(); ++i) {
ow_.StartList("")
@@ -533,7 +534,7 @@
// - trailing commas, we support a single trailing comma but no internal commas.
TEST_F(JsonStreamParserTest, TrailingCommas) {
- StringPiece str = "[['a',true,], {b: null,},]";
+ absl::string_view str = "[['a',true,], {b: null,},]";
for (int i = 0; i <= str.length(); ++i) {
ow_.StartList("")
->StartList("")
@@ -552,7 +553,7 @@
// illegal literals
TEST_F(JsonStreamParserTest, ExtraTextAfterTrue) {
- StringPiece str = "truee";
+ absl::string_view str = "truee";
for (int i = 0; i <= str.length(); ++i) {
ow_.RenderBool("", true);
DoErrorTest(str, i, "Parsing terminated before end of input.",
@@ -561,7 +562,7 @@
}
TEST_F(JsonStreamParserTest, InvalidNumberDashOnly) {
- StringPiece str = "-";
+ absl::string_view str = "-";
for (int i = 0; i <= str.length(); ++i) {
DoErrorTest(str, i, "Unable to parse number.",
ParseErrorType::UNABLE_TO_PARSE_NUMBER);
@@ -569,7 +570,7 @@
}
TEST_F(JsonStreamParserTest, InvalidNumberDashName) {
- StringPiece str = "-foo";
+ absl::string_view str = "-foo";
for (int i = 0; i <= str.length(); ++i) {
DoErrorTest(str, i, "Unable to parse number.",
ParseErrorType::UNABLE_TO_PARSE_NUMBER);
@@ -577,7 +578,7 @@
}
TEST_F(JsonStreamParserTest, InvalidLiteralInArray) {
- StringPiece str = "[nule]";
+ absl::string_view str = "[nule]";
for (int i = 0; i <= str.length(); ++i) {
ow_.StartList("");
DoErrorTest(str, i, "Unexpected token.", ParseErrorType::UNEXPECTED_TOKEN);
@@ -585,7 +586,7 @@
}
TEST_F(JsonStreamParserTest, InvalidLiteralInObject) {
- StringPiece str = "{123false}";
+ absl::string_view str = "{123false}";
for (int i = 0; i <= str.length(); ++i) {
ow_.StartObject("");
DoErrorTest(str, i, "Expected an object key or }.",
@@ -595,7 +596,7 @@
// mismatched quotes failure on strings
TEST_F(JsonStreamParserTest, MismatchedSingleQuotedLiteral) {
- StringPiece str = "'Some str\"";
+ absl::string_view str = "'Some str\"";
for (int i = 0; i <= str.length(); ++i) {
DoErrorTest(str, i, "Closing quote expected in string.",
ParseErrorType::EXPECTED_CLOSING_QUOTE);
@@ -603,7 +604,7 @@
}
TEST_F(JsonStreamParserTest, MismatchedDoubleQuotedLiteral) {
- StringPiece str = "\"Another string that ends poorly!'";
+ absl::string_view str = "\"Another string that ends poorly!'";
for (int i = 0; i <= str.length(); ++i) {
DoErrorTest(str, i, "Closing quote expected in string.",
ParseErrorType::EXPECTED_CLOSING_QUOTE);
@@ -612,7 +613,7 @@
// unterminated strings
TEST_F(JsonStreamParserTest, UnterminatedLiteralString) {
- StringPiece str = "\"Forgot the rest of i";
+ absl::string_view str = "\"Forgot the rest of i";
for (int i = 0; i <= str.length(); ++i) {
DoErrorTest(str, i, "Closing quote expected in string.",
ParseErrorType::EXPECTED_CLOSING_QUOTE);
@@ -620,7 +621,7 @@
}
TEST_F(JsonStreamParserTest, UnterminatedStringEscape) {
- StringPiece str = "\"Forgot the rest of \\";
+ absl::string_view str = "\"Forgot the rest of \\";
for (int i = 0; i <= str.length(); ++i) {
DoErrorTest(str, i, "Closing quote expected in string.",
ParseErrorType::EXPECTED_CLOSING_QUOTE);
@@ -628,7 +629,7 @@
}
TEST_F(JsonStreamParserTest, UnterminatedStringInArray) {
- StringPiece str = "[\"Forgot to close the string]";
+ absl::string_view str = "[\"Forgot to close the string]";
for (int i = 0; i <= str.length(); ++i) {
ow_.StartList("");
DoErrorTest(str, i, "Closing quote expected in string.",
@@ -637,7 +638,7 @@
}
TEST_F(JsonStreamParserTest, UnterminatedStringInObject) {
- StringPiece str = "{f: \"Forgot to close the string}";
+ absl::string_view str = "{f: \"Forgot to close the string}";
for (int i = 0; i <= str.length(); ++i) {
ow_.StartObject("");
DoErrorTest(str, i, "Closing quote expected in string.",
@@ -646,7 +647,7 @@
}
TEST_F(JsonStreamParserTest, UnterminatedObject) {
- StringPiece str = "{";
+ absl::string_view str = "{";
for (int i = 0; i <= str.length(); ++i) {
ow_.StartObject("");
DoErrorTest(str, i, "Unexpected end of string.",
@@ -657,7 +658,7 @@
// mismatched object and array closing
TEST_F(JsonStreamParserTest, MismatchedCloseObject) {
- StringPiece str = "{'key': true]";
+ absl::string_view str = "{'key': true]";
for (int i = 0; i <= str.length(); ++i) {
ow_.StartObject("")->RenderBool("key", true);
DoErrorTest(str, i, "Expected , or } after key:value pair.",
@@ -666,7 +667,7 @@
}
TEST_F(JsonStreamParserTest, MismatchedCloseArray) {
- StringPiece str = "[true, null}";
+ absl::string_view str = "[true, null}";
for (int i = 0; i <= str.length(); ++i) {
ow_.StartList("")->RenderBool("", true)->RenderNull("");
DoErrorTest(str, i, "Expected , or ] after array value.",
@@ -676,7 +677,7 @@
// Invalid object keys.
TEST_F(JsonStreamParserTest, InvalidNumericObjectKey) {
- StringPiece str = "{42: true}";
+ absl::string_view str = "{42: true}";
for (int i = 0; i <= str.length(); ++i) {
ow_.StartObject("");
DoErrorTest(str, i, "Expected an object key or }.",
@@ -685,7 +686,7 @@
}
TEST_F(JsonStreamParserTest, InvalidLiteralObjectInObject) {
- StringPiece str = "{{bob: true}}";
+ absl::string_view str = "{{bob: true}}";
for (int i = 0; i <= str.length(); ++i) {
ow_.StartObject("");
DoErrorTest(str, i, "Expected an object key or }.",
@@ -694,7 +695,7 @@
}
TEST_F(JsonStreamParserTest, InvalidLiteralArrayInObject) {
- StringPiece str = "{[null]}";
+ absl::string_view str = "{[null]}";
for (int i = 0; i <= str.length(); ++i) {
ow_.StartObject("");
DoErrorTest(str, i, "Expected an object key or }.",
@@ -703,7 +704,7 @@
}
TEST_F(JsonStreamParserTest, InvalidLiteralValueInObject) {
- StringPiece str = "{false}";
+ absl::string_view str = "{false}";
for (int i = 0; i <= str.length(); ++i) {
ow_.StartObject("");
DoErrorTest(str, i, "Expected an object key or }.",
@@ -712,7 +713,7 @@
}
TEST_F(JsonStreamParserTest, MissingColonAfterStringInObject) {
- StringPiece str = "{\"key\"}";
+ absl::string_view str = "{\"key\"}";
for (int i = 0; i <= str.length(); ++i) {
ow_.StartObject("");
DoErrorTest(str, i, "Expected : between key:value pair.",
@@ -721,7 +722,7 @@
}
TEST_F(JsonStreamParserTest, MissingColonAfterKeyInObject) {
- StringPiece str = "{key}";
+ absl::string_view str = "{key}";
for (int i = 0; i <= str.length(); ++i) {
ow_.StartObject("");
DoErrorTest(str, i, "Expected : between key:value pair.",
@@ -730,7 +731,7 @@
}
TEST_F(JsonStreamParserTest, EndOfTextAfterKeyInObject) {
- StringPiece str = "{key";
+ absl::string_view str = "{key";
for (int i = 0; i <= str.length(); ++i) {
ow_.StartObject("");
DoErrorTest(str, i, "Unexpected end of string.",
@@ -739,7 +740,7 @@
}
TEST_F(JsonStreamParserTest, MissingValueAfterColonInObject) {
- StringPiece str = "{key:}";
+ absl::string_view str = "{key:}";
for (int i = 0; i <= str.length(); ++i) {
ow_.StartObject("");
DoErrorTest(str, i, "Unexpected token.", ParseErrorType::UNEXPECTED_TOKEN);
@@ -747,7 +748,7 @@
}
TEST_F(JsonStreamParserTest, MissingCommaBetweenObjectEntries) {
- StringPiece str = "{key:20 'hello': true}";
+ absl::string_view str = "{key:20 'hello': true}";
for (int i = 0; i <= str.length(); ++i) {
ow_.StartObject("")->RenderUint64("key", 20);
DoErrorTest(str, i, "Expected , or } after key:value pair.",
@@ -756,7 +757,7 @@
}
TEST_F(JsonStreamParserTest, InvalidLiteralAsObjectKey) {
- StringPiece str = "{false: 20}";
+ absl::string_view str = "{false: 20}";
for (int i = 0; i <= str.length(); ++i) {
ow_.StartObject("");
DoErrorTest(str, i, "Expected an object key or }.",
@@ -765,7 +766,7 @@
}
TEST_F(JsonStreamParserTest, ExtraCharactersAfterObject) {
- StringPiece str = "{}}";
+ absl::string_view str = "{}}";
for (int i = 0; i <= str.length(); ++i) {
ow_.StartObject("")->EndObject();
DoErrorTest(str, i, "Parsing terminated before end of input.",
@@ -774,7 +775,7 @@
}
TEST_F(JsonStreamParserTest, PositiveNumberTooBigIsDouble) {
- StringPiece str = "18446744073709551616"; // 2^64
+ absl::string_view str = "18446744073709551616"; // 2^64
for (int i = 0; i <= str.length(); ++i) {
ow_.RenderDouble("", 18446744073709552000.0);
DoTest(str, i);
@@ -782,7 +783,7 @@
}
TEST_F(JsonStreamParserTest, NegativeNumberTooBigIsDouble) {
- StringPiece str = "-18446744073709551616";
+ absl::string_view str = "-18446744073709551616";
for (int i = 0; i <= str.length(); ++i) {
ow_.RenderDouble("", -18446744073709551616.0);
DoTest(str, i);
@@ -790,7 +791,7 @@
}
TEST_F(JsonStreamParserTest, DoubleTooBig) {
- StringPiece str = "[1.89769e+308]";
+ absl::string_view str = "[1.89769e+308]";
for (int i = 0; i <= str.length(); ++i) {
ow_.StartList("");
DoErrorTest(str, i, "Number exceeds the range of double.",
@@ -807,7 +808,7 @@
// invalid bare backslash.
TEST_F(JsonStreamParserTest, UnfinishedEscape) {
- StringPiece str = "\"\\";
+ absl::string_view str = "\"\\";
for (int i = 0; i <= str.length(); ++i) {
DoErrorTest(str, i, "Closing quote expected in string.",
ParseErrorType::EXPECTED_CLOSING_QUOTE);
@@ -816,7 +817,7 @@
// invalid bare backslash u.
TEST_F(JsonStreamParserTest, UnfinishedUnicodeEscape) {
- StringPiece str = "\"\\u";
+ absl::string_view str = "\"\\u";
for (int i = 0; i <= str.length(); ++i) {
DoErrorTest(str, i, "Illegal hex string.",
ParseErrorType::ILLEGAL_HEX_STRING);
@@ -825,7 +826,7 @@
// invalid unicode sequence.
TEST_F(JsonStreamParserTest, UnicodeEscapeCutOff) {
- StringPiece str = "\"\\u12";
+ absl::string_view str = "\"\\u12";
for (int i = 0; i <= str.length(); ++i) {
DoErrorTest(str, i, "Illegal hex string.",
ParseErrorType::ILLEGAL_HEX_STRING);
@@ -834,7 +835,7 @@
// invalid unicode sequence (valid in modern EcmaScript but not in JSON).
TEST_F(JsonStreamParserTest, BracketedUnicodeEscape) {
- StringPiece str = "\"\\u{1f36f}\"";
+ absl::string_view str = "\"\\u{1f36f}\"";
for (int i = 0; i <= str.length(); ++i) {
DoErrorTest(str, i, "Invalid escape sequence.",
ParseErrorType::INVALID_ESCAPE_SEQUENCE);
@@ -843,7 +844,7 @@
TEST_F(JsonStreamParserTest, UnicodeEscapeInvalidCharacters) {
- StringPiece str = "\"\\u12$4hello";
+ absl::string_view str = "\"\\u12$4hello";
for (int i = 0; i <= str.length(); ++i) {
DoErrorTest(str, i, "Invalid escape sequence.",
ParseErrorType::INVALID_ESCAPE_SEQUENCE);
@@ -852,7 +853,7 @@
// invalid unicode sequence in low half surrogate: g is not a hex digit.
TEST_F(JsonStreamParserTest, UnicodeEscapeLowHalfSurrogateInvalidCharacters) {
- StringPiece str = "\"\\ud800\\udcfg\"";
+ absl::string_view str = "\"\\ud800\\udcfg\"";
for (int i = 0; i <= str.length(); ++i) {
DoErrorTest(str, i, "Invalid escape sequence.",
ParseErrorType::INVALID_ESCAPE_SEQUENCE);
@@ -861,7 +862,7 @@
// Extra commas with an object or array.
TEST_F(JsonStreamParserTest, ExtraCommaInObject) {
- StringPiece str = "{'k1': true,,'k2': false}";
+ absl::string_view str = "{'k1': true,,'k2': false}";
for (int i = 0; i <= str.length(); ++i) {
ow_.StartObject("")->RenderBool("k1", true);
DoErrorTest(str, i, "Expected an object key or }.",
@@ -870,7 +871,7 @@
}
TEST_F(JsonStreamParserTest, ExtraCommaInArray) {
- StringPiece str = "[true,,false}";
+ absl::string_view str = "[true,,false}";
for (int i = 0; i <= str.length(); ++i) {
ow_.StartList("")->RenderBool("", true);
DoErrorTest(str, i, "Unexpected token.", ParseErrorType::UNEXPECTED_TOKEN);
@@ -879,7 +880,7 @@
// Extra text beyond end of value.
TEST_F(JsonStreamParserTest, ExtraTextAfterLiteral) {
- StringPiece str = "'hello', 'world'";
+ absl::string_view str = "'hello', 'world'";
for (int i = 0; i <= str.length(); ++i) {
ow_.RenderString("", "hello");
DoErrorTest(str, i, "Parsing terminated before end of input.",
@@ -888,7 +889,7 @@
}
TEST_F(JsonStreamParserTest, ExtraTextAfterObject) {
- StringPiece str = "{'key': true} 'oops'";
+ absl::string_view str = "{'key': true} 'oops'";
for (int i = 0; i <= str.length(); ++i) {
ow_.StartObject("")->RenderBool("key", true)->EndObject();
DoErrorTest(str, i, "Parsing terminated before end of input.",
@@ -897,7 +898,7 @@
}
TEST_F(JsonStreamParserTest, ExtraTextAfterArray) {
- StringPiece str = "[null] 'oops'";
+ absl::string_view str = "[null] 'oops'";
for (int i = 0; i <= str.length(); ++i) {
ow_.StartList("")->RenderNull("")->EndList();
DoErrorTest(str, i, "Parsing terminated before end of input.",
@@ -907,14 +908,14 @@
// Random unknown text in the value.
TEST_F(JsonStreamParserTest, UnknownCharactersAsValue) {
- StringPiece str = "*";
+ absl::string_view str = "*";
for (int i = 0; i <= str.length(); ++i) {
DoErrorTest(str, i, "Expected a value.", ParseErrorType::EXPECTED_VALUE);
}
}
TEST_F(JsonStreamParserTest, UnknownCharactersInArray) {
- StringPiece str = "[*]";
+ absl::string_view str = "[*]";
for (int i = 0; i <= str.length(); ++i) {
ow_.StartList("");
DoErrorTest(str, i, "Expected a value or ] within an array.",
@@ -923,7 +924,7 @@
}
TEST_F(JsonStreamParserTest, UnknownCharactersInObject) {
- StringPiece str = "{'key': *}";
+ absl::string_view str = "{'key': *}";
for (int i = 0; i <= str.length(); ++i) {
ow_.StartObject("");
DoErrorTest(str, i, "Expected a value.", ParseErrorType::EXPECTED_VALUE);
@@ -934,11 +935,11 @@
int count = 99;
std::string str;
for (int i = 0; i < count; ++i) {
- StrAppend(&str, "{'a':");
+ absl::StrAppend(&str, "{'a':");
}
- StrAppend(&str, "{'nest64':'v1', 'nest64': false, 'nest64': ['v2']}");
+ absl::StrAppend(&str, "{'nest64':'v1', 'nest64': false, 'nest64': ['v2']}");
for (int i = 0; i < count; ++i) {
- StrAppend(&str, "}");
+ absl::StrAppend(&str, "}");
}
ow_.StartObject("");
for (int i = 0; i < count; ++i) {
@@ -960,14 +961,14 @@
int count = 98;
std::string str;
for (int i = 0; i < count; ++i) {
- StrAppend(&str, "{'a':");
+ absl::StrAppend(&str, "{'a':");
}
// Supports trailing commas.
- StrAppend(&str,
+ absl::StrAppend(&str,
"{'nest11' : [{'nest12' : null,},],"
"'nest21' : {'nest22' : {'nest23' : false}}}");
for (int i = 0; i < count; ++i) {
- StrAppend(&str, "}");
+ absl::StrAppend(&str, "}");
}
DoErrorTest(str, 0,
"Message too deep. Max recursion depth reached for key 'nest22'");
diff --git a/src/google/protobuf/util/internal/location_tracker.h b/src/google/protobuf/util/internal/location_tracker.h
index 68fefcc..4cec03e 100644
--- a/src/google/protobuf/util/internal/location_tracker.h
+++ b/src/google/protobuf/util/internal/location_tracker.h
@@ -33,10 +33,10 @@
#include <string>
-#include <google/protobuf/stubs/common.h>
+#include "google/protobuf/port.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -47,6 +47,8 @@
// the location information for the purpose of error reporting.
class PROTOBUF_EXPORT LocationTrackerInterface {
public:
+ LocationTrackerInterface(const LocationTrackerInterface&) = delete;
+ LocationTrackerInterface& operator=(const LocationTrackerInterface&) = delete;
virtual ~LocationTrackerInterface() {}
// Returns the object location as human readable string.
@@ -57,7 +59,6 @@
private:
// Please do not add any data members to this class.
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(LocationTrackerInterface);
};
} // namespace converter
@@ -65,6 +66,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_UTIL_INTERNAL_LOCATION_TRACKER_H__
diff --git a/src/google/protobuf/util/internal/mock_error_listener.h b/src/google/protobuf/util/internal/mock_error_listener.h
index 3fbdd88..b04de6f 100644
--- a/src/google/protobuf/util/internal/mock_error_listener.h
+++ b/src/google/protobuf/util/internal/mock_error_listener.h
@@ -32,9 +32,9 @@
#define GOOGLE_PROTOBUF_UTIL_INTERNAL_MOCK_ERROR_LISTENER_H__
#include <gmock/gmock.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/util/internal/error_listener.h>
-#include <google/protobuf/util/internal/location_tracker.h>
+#include "absl/strings/string_view.h"
+#include "google/protobuf/util/internal/error_listener.h"
+#include "google/protobuf/util/internal/location_tracker.h"
namespace google {
namespace protobuf {
@@ -48,15 +48,15 @@
MOCK_METHOD(void, InvalidName,
(const LocationTrackerInterface& loc,
- StringPiece unknown_name, StringPiece message),
+ absl::string_view unknown_name, absl::string_view message),
(override));
MOCK_METHOD(void, InvalidValue,
- (const LocationTrackerInterface& loc, StringPiece type_name,
- StringPiece value),
+ (const LocationTrackerInterface& loc, absl::string_view type_name,
+ absl::string_view value),
(override));
MOCK_METHOD(void, MissingField,
(const LocationTrackerInterface& loc,
- StringPiece missing_name),
+ absl::string_view missing_name),
(override));
};
diff --git a/src/google/protobuf/util/internal/object_location_tracker.h b/src/google/protobuf/util/internal/object_location_tracker.h
index 47821e6..c5a8f27 100644
--- a/src/google/protobuf/util/internal/object_location_tracker.h
+++ b/src/google/protobuf/util/internal/object_location_tracker.h
@@ -33,8 +33,8 @@
#include <string>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/util/internal/location_tracker.h>
+#include "google/protobuf/port.h"
+#include "google/protobuf/util/internal/location_tracker.h"
namespace google {
namespace protobuf {
@@ -46,14 +46,13 @@
public:
// Creates an empty location tracker.
ObjectLocationTracker() {}
+ ObjectLocationTracker(const ObjectLocationTracker&) = delete;
+ ObjectLocationTracker& operator=(const ObjectLocationTracker&) = delete;
~ObjectLocationTracker() override {}
// Returns empty because nothing is tracked.
std::string ToString() const override { return ""; }
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ObjectLocationTracker);
};
} // namespace converter
diff --git a/src/google/protobuf/util/internal/object_source.h b/src/google/protobuf/util/internal/object_source.h
index fc7672e..2538314 100644
--- a/src/google/protobuf/util/internal/object_source.h
+++ b/src/google/protobuf/util/internal/object_source.h
@@ -31,13 +31,13 @@
#ifndef GOOGLE_PROTOBUF_UTIL_INTERNAL_OBJECT_SOURCE_H__
#define GOOGLE_PROTOBUF_UTIL_INTERNAL_OBJECT_SOURCE_H__
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/status.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/status.h>
+#include "absl/status/status.h"
+#include "absl/strings/string_view.h"
+#include "google/protobuf/port.h"
+
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -54,25 +54,23 @@
// Derived classes could be thread-unsafe.
class PROTOBUF_EXPORT ObjectSource {
public:
+ ObjectSource(const ObjectSource&) = delete;
+ ObjectSource& operator=(const ObjectSource&) = delete;
virtual ~ObjectSource() {}
// Writes to the ObjectWriter
- virtual util::Status WriteTo(ObjectWriter* ow) const {
+ virtual absl::Status WriteTo(ObjectWriter* ow) const {
return NamedWriteTo("", ow);
}
// Writes to the ObjectWriter with a custom name for the message.
// This is useful when you chain ObjectSource together by embedding one
// within another.
- virtual util::Status NamedWriteTo(StringPiece name,
+ virtual absl::Status NamedWriteTo(absl::string_view name,
ObjectWriter* ow) const = 0;
protected:
ObjectSource() {}
-
- private:
- // Do not add any data members to this class.
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ObjectSource);
};
} // namespace converter
@@ -80,6 +78,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_UTIL_INTERNAL_OBJECT_SOURCE_H__
diff --git a/src/google/protobuf/util/internal/object_writer.cc b/src/google/protobuf/util/internal/object_writer.cc
index 4dabd37..c03c195 100644
--- a/src/google/protobuf/util/internal/object_writer.cc
+++ b/src/google/protobuf/util/internal/object_writer.cc
@@ -28,9 +28,9 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/util/internal/object_writer.h>
+#include "google/protobuf/util/internal/object_writer.h"
-#include <google/protobuf/util/internal/datapiece.h>
+#include "google/protobuf/util/internal/datapiece.h"
namespace google {
namespace protobuf {
@@ -39,7 +39,7 @@
// static
void ObjectWriter::RenderDataPieceTo(const DataPiece& data,
- StringPiece name, ObjectWriter* ow) {
+ absl::string_view name, ObjectWriter* ow) {
switch (data.type()) {
case DataPiece::TYPE_INT32: {
ow->RenderInt32(name, data.ToInt32().value());
diff --git a/src/google/protobuf/util/internal/object_writer.h b/src/google/protobuf/util/internal/object_writer.h
index bc4095b..a91c628 100644
--- a/src/google/protobuf/util/internal/object_writer.h
+++ b/src/google/protobuf/util/internal/object_writer.h
@@ -33,11 +33,12 @@
#include <cstdint>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/strutil.h>
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/port.h"
+#include "absl/strings/string_view.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -63,56 +64,59 @@
// and get rid the need to call EndXXX().
class PROTOBUF_EXPORT ObjectWriter {
public:
+ ObjectWriter(const ObjectWriter&) = delete;
+ ObjectWriter& operator=(const ObjectWriter&) = delete;
virtual ~ObjectWriter() {}
// Starts an object. If the name is empty, the object will not be named.
- virtual ObjectWriter* StartObject(StringPiece name) = 0;
+ virtual ObjectWriter* StartObject(absl::string_view name) = 0;
// Ends an object.
virtual ObjectWriter* EndObject() = 0;
// Starts a list. If the name is empty, the list will not be named.
- virtual ObjectWriter* StartList(StringPiece name) = 0;
+ virtual ObjectWriter* StartList(absl::string_view name) = 0;
// Ends a list.
virtual ObjectWriter* EndList() = 0;
// Renders a boolean value.
- virtual ObjectWriter* RenderBool(StringPiece name, bool value) = 0;
+ virtual ObjectWriter* RenderBool(absl::string_view name, bool value) = 0;
// Renders an 32-bit integer value.
- virtual ObjectWriter* RenderInt32(StringPiece name, int32_t value) = 0;
+ virtual ObjectWriter* RenderInt32(absl::string_view name, int32_t value) = 0;
// Renders an 32-bit unsigned integer value.
- virtual ObjectWriter* RenderUint32(StringPiece name,
+ virtual ObjectWriter* RenderUint32(absl::string_view name,
uint32_t value) = 0;
// Renders a 64-bit integer value.
- virtual ObjectWriter* RenderInt64(StringPiece name, int64_t value) = 0;
+ virtual ObjectWriter* RenderInt64(absl::string_view name, int64_t value) = 0;
// Renders an 64-bit unsigned integer value.
- virtual ObjectWriter* RenderUint64(StringPiece name,
+ virtual ObjectWriter* RenderUint64(absl::string_view name,
uint64_t value) = 0;
// Renders a double value.
- virtual ObjectWriter* RenderDouble(StringPiece name, double value) = 0;
+ virtual ObjectWriter* RenderDouble(absl::string_view name, double value) = 0;
// Renders a float value.
- virtual ObjectWriter* RenderFloat(StringPiece name, float value) = 0;
+ virtual ObjectWriter* RenderFloat(absl::string_view name, float value) = 0;
- // Renders a StringPiece value. This is for rendering strings.
- virtual ObjectWriter* RenderString(StringPiece name,
- StringPiece value) = 0;
+ // Renders a string value.
+ virtual ObjectWriter* RenderString(absl::string_view name,
+ absl::string_view value) = 0;
// Renders a bytes value.
- virtual ObjectWriter* RenderBytes(StringPiece name, StringPiece value) = 0;
+ virtual ObjectWriter* RenderBytes(absl::string_view name,
+ absl::string_view value) = 0;
// Renders a Null value.
- virtual ObjectWriter* RenderNull(StringPiece name) = 0;
+ virtual ObjectWriter* RenderNull(absl::string_view name) = 0;
// Renders a DataPiece object to a ObjectWriter.
- static void RenderDataPieceTo(const DataPiece& data, StringPiece name,
+ static void RenderDataPieceTo(const DataPiece& data, absl::string_view name,
ObjectWriter* ow);
@@ -136,9 +140,6 @@
// If set to true, we use the stricter version of base64 decoding for byte
// fields by making sure decoded version encodes back to the original string.
bool use_strict_base64_decoding_;
-
- // Do not add any data members to this class.
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ObjectWriter);
};
} // namespace converter
@@ -146,6 +147,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_UTIL_INTERNAL_OBJECT_WRITER_H__
diff --git a/src/google/protobuf/util/internal/proto_writer.cc b/src/google/protobuf/util/internal/proto_writer.cc
index afa5e2e..7924437 100644
--- a/src/google/protobuf/util/internal/proto_writer.cc
+++ b/src/google/protobuf/util/internal/proto_writer.cc
@@ -28,27 +28,29 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/util/internal/proto_writer.h>
+#include "google/protobuf/util/internal/proto_writer.h"
#include <cstdint>
#include <functional>
#include <stack>
#include <unordered_set>
-#include <google/protobuf/stubs/once.h>
-#include <google/protobuf/wire_format_lite.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/statusor.h>
-#include <google/protobuf/stubs/time.h>
-#include <google/protobuf/util/internal/constants.h>
-#include <google/protobuf/util/internal/field_mask_utility.h>
-#include <google/protobuf/util/internal/object_location_tracker.h>
-#include <google/protobuf/util/internal/utility.h>
-#include <google/protobuf/stubs/map_util.h>
+#include "google/protobuf/wire_format_lite.h"
+#include "absl/base/call_once.h"
+#include "absl/status/statusor.h"
+#include "absl/strings/ascii.h"
+#include "absl/strings/escaping.h"
+#include "absl/strings/str_cat.h"
+#include "absl/time/clock.h"
+#include "absl/time/time.h"
+#include "google/protobuf/util/internal/constants.h"
+#include "google/protobuf/util/internal/field_mask_utility.h"
+#include "google/protobuf/util/internal/object_location_tracker.h"
+#include "google/protobuf/util/internal/utility.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -73,7 +75,6 @@
element_(nullptr),
size_insert_(),
output_(output),
- buffer_(),
adapter_(&buffer_),
stream_(new CodedOutputStream(&adapter_)),
listener_(listener),
@@ -95,7 +96,6 @@
element_(nullptr),
size_insert_(),
output_(output),
- buffer_(),
adapter_(&buffer_),
stream_(new CodedOutputStream(&adapter_)),
listener_(listener),
@@ -121,9 +121,9 @@
namespace {
// Writes an INT32 field, including tag to the stream.
-inline util::Status WriteInt32(int field_number, const DataPiece& data,
+inline absl::Status WriteInt32(int field_number, const DataPiece& data,
CodedOutputStream* stream) {
- util::StatusOr<int32_t> i32 = data.ToInt32();
+ absl::StatusOr<int32_t> i32 = data.ToInt32();
if (i32.ok()) {
WireFormatLite::WriteInt32(field_number, i32.value(), stream);
}
@@ -131,9 +131,9 @@
}
// writes an SFIXED32 field, including tag, to the stream.
-inline util::Status WriteSFixed32(int field_number, const DataPiece& data,
+inline absl::Status WriteSFixed32(int field_number, const DataPiece& data,
CodedOutputStream* stream) {
- util::StatusOr<int32_t> i32 = data.ToInt32();
+ absl::StatusOr<int32_t> i32 = data.ToInt32();
if (i32.ok()) {
WireFormatLite::WriteSFixed32(field_number, i32.value(), stream);
}
@@ -141,9 +141,9 @@
}
// Writes an SINT32 field, including tag, to the stream.
-inline util::Status WriteSInt32(int field_number, const DataPiece& data,
+inline absl::Status WriteSInt32(int field_number, const DataPiece& data,
CodedOutputStream* stream) {
- util::StatusOr<int32_t> i32 = data.ToInt32();
+ absl::StatusOr<int32_t> i32 = data.ToInt32();
if (i32.ok()) {
WireFormatLite::WriteSInt32(field_number, i32.value(), stream);
}
@@ -151,9 +151,9 @@
}
// Writes a FIXED32 field, including tag, to the stream.
-inline util::Status WriteFixed32(int field_number, const DataPiece& data,
+inline absl::Status WriteFixed32(int field_number, const DataPiece& data,
CodedOutputStream* stream) {
- util::StatusOr<uint32_t> u32 = data.ToUint32();
+ absl::StatusOr<uint32_t> u32 = data.ToUint32();
if (u32.ok()) {
WireFormatLite::WriteFixed32(field_number, u32.value(), stream);
}
@@ -161,9 +161,9 @@
}
// Writes a UINT32 field, including tag, to the stream.
-inline util::Status WriteUInt32(int field_number, const DataPiece& data,
+inline absl::Status WriteUInt32(int field_number, const DataPiece& data,
CodedOutputStream* stream) {
- util::StatusOr<uint32_t> u32 = data.ToUint32();
+ absl::StatusOr<uint32_t> u32 = data.ToUint32();
if (u32.ok()) {
WireFormatLite::WriteUInt32(field_number, u32.value(), stream);
}
@@ -171,9 +171,9 @@
}
// Writes an INT64 field, including tag, to the stream.
-inline util::Status WriteInt64(int field_number, const DataPiece& data,
+inline absl::Status WriteInt64(int field_number, const DataPiece& data,
CodedOutputStream* stream) {
- util::StatusOr<int64_t> i64 = data.ToInt64();
+ absl::StatusOr<int64_t> i64 = data.ToInt64();
if (i64.ok()) {
WireFormatLite::WriteInt64(field_number, i64.value(), stream);
}
@@ -181,9 +181,9 @@
}
// Writes an SFIXED64 field, including tag, to the stream.
-inline util::Status WriteSFixed64(int field_number, const DataPiece& data,
+inline absl::Status WriteSFixed64(int field_number, const DataPiece& data,
CodedOutputStream* stream) {
- util::StatusOr<int64_t> i64 = data.ToInt64();
+ absl::StatusOr<int64_t> i64 = data.ToInt64();
if (i64.ok()) {
WireFormatLite::WriteSFixed64(field_number, i64.value(), stream);
}
@@ -191,9 +191,9 @@
}
// Writes an SINT64 field, including tag, to the stream.
-inline util::Status WriteSInt64(int field_number, const DataPiece& data,
+inline absl::Status WriteSInt64(int field_number, const DataPiece& data,
CodedOutputStream* stream) {
- util::StatusOr<int64_t> i64 = data.ToInt64();
+ absl::StatusOr<int64_t> i64 = data.ToInt64();
if (i64.ok()) {
WireFormatLite::WriteSInt64(field_number, i64.value(), stream);
}
@@ -201,9 +201,9 @@
}
// Writes a FIXED64 field, including tag, to the stream.
-inline util::Status WriteFixed64(int field_number, const DataPiece& data,
+inline absl::Status WriteFixed64(int field_number, const DataPiece& data,
CodedOutputStream* stream) {
- util::StatusOr<uint64_t> u64 = data.ToUint64();
+ absl::StatusOr<uint64_t> u64 = data.ToUint64();
if (u64.ok()) {
WireFormatLite::WriteFixed64(field_number, u64.value(), stream);
}
@@ -211,9 +211,9 @@
}
// Writes a UINT64 field, including tag, to the stream.
-inline util::Status WriteUInt64(int field_number, const DataPiece& data,
+inline absl::Status WriteUInt64(int field_number, const DataPiece& data,
CodedOutputStream* stream) {
- util::StatusOr<uint64_t> u64 = data.ToUint64();
+ absl::StatusOr<uint64_t> u64 = data.ToUint64();
if (u64.ok()) {
WireFormatLite::WriteUInt64(field_number, u64.value(), stream);
}
@@ -221,9 +221,9 @@
}
// Writes a DOUBLE field, including tag, to the stream.
-inline util::Status WriteDouble(int field_number, const DataPiece& data,
+inline absl::Status WriteDouble(int field_number, const DataPiece& data,
CodedOutputStream* stream) {
- util::StatusOr<double> d = data.ToDouble();
+ absl::StatusOr<double> d = data.ToDouble();
if (d.ok()) {
WireFormatLite::WriteDouble(field_number, d.value(), stream);
}
@@ -231,9 +231,9 @@
}
// Writes a FLOAT field, including tag, to the stream.
-inline util::Status WriteFloat(int field_number, const DataPiece& data,
+inline absl::Status WriteFloat(int field_number, const DataPiece& data,
CodedOutputStream* stream) {
- util::StatusOr<float> f = data.ToFloat();
+ absl::StatusOr<float> f = data.ToFloat();
if (f.ok()) {
WireFormatLite::WriteFloat(field_number, f.value(), stream);
}
@@ -241,9 +241,9 @@
}
// Writes a BOOL field, including tag, to the stream.
-inline util::Status WriteBool(int field_number, const DataPiece& data,
+inline absl::Status WriteBool(int field_number, const DataPiece& data,
CodedOutputStream* stream) {
- util::StatusOr<bool> b = data.ToBool();
+ absl::StatusOr<bool> b = data.ToBool();
if (b.ok()) {
WireFormatLite::WriteBool(field_number, b.value(), stream);
}
@@ -251,9 +251,9 @@
}
// Writes a BYTES field, including tag, to the stream.
-inline util::Status WriteBytes(int field_number, const DataPiece& data,
+inline absl::Status WriteBytes(int field_number, const DataPiece& data,
CodedOutputStream* stream) {
- util::StatusOr<std::string> c = data.ToBytes();
+ absl::StatusOr<std::string> c = data.ToBytes();
if (c.ok()) {
WireFormatLite::WriteBytes(field_number, c.value(), stream);
}
@@ -261,9 +261,9 @@
}
// Writes a STRING field, including tag, to the stream.
-inline util::Status WriteString(int field_number, const DataPiece& data,
+inline absl::Status WriteString(int field_number, const DataPiece& data,
CodedOutputStream* stream) {
- util::StatusOr<std::string> s = data.ToString();
+ absl::StatusOr<std::string> s = data.ToString();
if (s.ok()) {
WireFormatLite::WriteString(field_number, s.value(), stream);
}
@@ -410,22 +410,22 @@
std::string name = now->parent_field_->name();
int i = 0;
while (i < name.size() &&
- (ascii_isalnum(name[i]) || name[i] == '_'))
+ (absl::ascii_isalnum(name[i]) || name[i] == '_'))
++i;
if (i > 0 && i == name.size()) { // safe field name
if (loc.empty()) {
loc = name;
} else {
- StrAppend(&loc, ".", name);
+ absl::StrAppend(&loc, ".", name);
}
} else {
- StrAppend(&loc, "[\"", CEscape(name), "\"]");
+ absl::StrAppend(&loc, "[\"", absl::CEscape(name), "\"]");
}
}
int array_index_now = now->array_index_;
if (ow_->IsRepeated(*(now->parent_field_)) && array_index_now > 0) {
- StrAppend(&loc, "[", array_index_now - 1, "]");
+ absl::StrAppend(&loc, "[", array_index_now - 1, "]");
}
}
@@ -440,22 +440,22 @@
oneof_indices_[index] = true;
}
-void ProtoWriter::InvalidName(StringPiece unknown_name,
- StringPiece message) {
+void ProtoWriter::InvalidName(absl::string_view unknown_name,
+ absl::string_view message) {
listener_->InvalidName(location(), unknown_name, message);
}
-void ProtoWriter::InvalidValue(StringPiece type_name,
- StringPiece value) {
+void ProtoWriter::InvalidValue(absl::string_view type_name,
+ absl::string_view value) {
listener_->InvalidValue(location(), type_name, value);
}
-void ProtoWriter::MissingField(StringPiece missing_name) {
+void ProtoWriter::MissingField(absl::string_view missing_name) {
listener_->MissingField(location(), missing_name);
}
ProtoWriter* ProtoWriter::StartObject(
- StringPiece name) {
+ absl::string_view name) {
// Starting the root message. Create the root ProtoElement and return.
if (element_ == nullptr) {
if (!name.empty()) {
@@ -479,7 +479,7 @@
const google::protobuf::Type* type = LookupType(field);
if (type == nullptr) {
++invalid_depth_;
- InvalidName(name, StrCat("Missing descriptor for field: ",
+ InvalidName(name, absl::StrCat("Missing descriptor for field: ",
field->type_url()));
return this;
}
@@ -508,7 +508,7 @@
}
ProtoWriter* ProtoWriter::StartList(
- StringPiece name) {
+ absl::string_view name) {
const google::protobuf::Field* field = BeginNamed(name, true);
@@ -522,7 +522,7 @@
const google::protobuf::Type* type = LookupType(field);
if (type == nullptr) {
++invalid_depth_;
- InvalidName(name, StrCat("Missing descriptor for field: ",
+ InvalidName(name, absl::StrCat("Missing descriptor for field: ",
field->type_url()));
return this;
}
@@ -541,8 +541,8 @@
}
ProtoWriter* ProtoWriter::RenderDataPiece(
- StringPiece name, const DataPiece& data) {
- util::Status status;
+ absl::string_view name, const DataPiece& data) {
+ absl::Status status;
if (invalid_depth_ > 0) return this;
const google::protobuf::Field* field = Lookup(name);
@@ -553,7 +553,7 @@
const google::protobuf::Type* type = LookupType(field);
if (type == nullptr) {
- InvalidName(name, StrCat("Missing descriptor for field: ",
+ InvalidName(name, absl::StrCat("Missing descriptor for field: ",
field->type_url()));
return this;
}
@@ -562,14 +562,14 @@
}
bool ProtoWriter::ValidOneof(const google::protobuf::Field& field,
- StringPiece unnormalized_name) {
+ absl::string_view unnormalized_name) {
if (element_ == nullptr) return true;
if (field.oneof_index() > 0) {
if (element_->IsOneofIndexTaken(field.oneof_index())) {
InvalidValue(
"oneof",
- StrCat(
+ absl::StrCat(
"oneof field '", element_->type().oneofs(field.oneof_index() - 1),
"' is already set. Cannot set '", unnormalized_name, "'"));
return false;
@@ -596,14 +596,14 @@
return this;
}
-util::Status ProtoWriter::WriteEnum(int field_number, const DataPiece& data,
+absl::Status ProtoWriter::WriteEnum(int field_number, const DataPiece& data,
const google::protobuf::Enum* enum_type,
CodedOutputStream* stream,
bool use_lower_camel_for_enums,
bool case_insensitive_enum_parsing,
bool ignore_unknown_values) {
bool is_unknown_enum_value = false;
- util::StatusOr<int> e = data.ToEnum(
+ absl::StatusOr<int> e = data.ToEnum(
enum_type, use_lower_camel_for_enums, case_insensitive_enum_parsing,
ignore_unknown_values, &is_unknown_enum_value);
if (e.ok() && !is_unknown_enum_value) {
@@ -615,7 +615,7 @@
ProtoWriter* ProtoWriter::RenderPrimitiveField(
const google::protobuf::Field& field, const google::protobuf::Type& type,
const DataPiece& data) {
- util::Status status;
+ absl::Status status;
// Pushing a ProtoElement and then pop it off at the end for 2 purposes:
// error location reporting and required field accounting.
@@ -695,7 +695,7 @@
break;
}
default: // TYPE_GROUP, TYPE_MESSAGE, TYPE_UNKNOWN.
- status = util::InvalidArgumentError(data.ValueAsStringOrDefault(""));
+ status = absl::InvalidArgumentError(data.ValueAsStringOrDefault(""));
}
if (!status.ok()) {
@@ -716,7 +716,7 @@
return this;
}
-const google::protobuf::Field* ProtoWriter::BeginNamed(StringPiece name,
+const google::protobuf::Field* ProtoWriter::BeginNamed(absl::string_view name,
bool is_list) {
if (invalid_depth_ > 0) {
++invalid_depth_;
@@ -737,7 +737,7 @@
}
const google::protobuf::Field* ProtoWriter::Lookup(
- StringPiece unnormalized_name) {
+ absl::string_view unnormalized_name) {
ProtoElement* e = element();
if (e == nullptr) {
InvalidName(unnormalized_name, "Root element must be a message.");
diff --git a/src/google/protobuf/util/internal/proto_writer.h b/src/google/protobuf/util/internal/proto_writer.h
index a7cf6ac..81c8b25 100644
--- a/src/google/protobuf/util/internal/proto_writer.h
+++ b/src/google/protobuf/util/internal/proto_writer.h
@@ -37,23 +37,22 @@
#include <unordered_set>
#include <vector>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/type.pb.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/stubs/bytestream.h>
-#include <google/protobuf/stubs/status.h>
-#include <google/protobuf/util/internal/datapiece.h>
-#include <google/protobuf/util/internal/error_listener.h>
-#include <google/protobuf/util/internal/structured_objectwriter.h>
-#include <google/protobuf/util/internal/type_info.h>
-#include <google/protobuf/util/type_resolver.h>
-#include <google/protobuf/stubs/hash.h>
-#include <google/protobuf/stubs/status.h>
+#include "google/protobuf/type.pb.h"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/io/zero_copy_stream_impl.h"
+#include "google/protobuf/descriptor.h"
+#include "absl/status/status.h"
+#include "google/protobuf/stubs/bytestream.h"
+#include "google/protobuf/port.h"
+#include "google/protobuf/util/internal/datapiece.h"
+#include "google/protobuf/util/internal/error_listener.h"
+#include "google/protobuf/util/internal/structured_objectwriter.h"
+#include "google/protobuf/util/internal/type_info.h"
+#include "google/protobuf/util/type_resolver.h"
+
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -74,53 +73,57 @@
// Constructor. Does not take ownership of any parameter passed in.
ProtoWriter(TypeResolver* type_resolver, const google::protobuf::Type& type,
strings::ByteSink* output, ErrorListener* listener);
+ ProtoWriter() = delete;
+ ProtoWriter(const ProtoWriter&) = delete;
+ ProtoWriter& operator=(const ProtoWriter&) = delete;
~ProtoWriter() override;
// ObjectWriter methods.
- ProtoWriter* StartObject(StringPiece name) override;
+ ProtoWriter* StartObject(absl::string_view name) override;
ProtoWriter* EndObject() override;
- ProtoWriter* StartList(StringPiece name) override;
+ ProtoWriter* StartList(absl::string_view name) override;
ProtoWriter* EndList() override;
- ProtoWriter* RenderBool(StringPiece name, bool value) override {
+ ProtoWriter* RenderBool(absl::string_view name, bool value) override {
return RenderDataPiece(name, DataPiece(value));
}
- ProtoWriter* RenderInt32(StringPiece name, int32_t value) override {
+ ProtoWriter* RenderInt32(absl::string_view name, int32_t value) override {
return RenderDataPiece(name, DataPiece(value));
}
- ProtoWriter* RenderUint32(StringPiece name, uint32_t value) override {
+ ProtoWriter* RenderUint32(absl::string_view name, uint32_t value) override {
return RenderDataPiece(name, DataPiece(value));
}
- ProtoWriter* RenderInt64(StringPiece name, int64_t value) override {
+ ProtoWriter* RenderInt64(absl::string_view name, int64_t value) override {
return RenderDataPiece(name, DataPiece(value));
}
- ProtoWriter* RenderUint64(StringPiece name, uint64_t value) override {
+ ProtoWriter* RenderUint64(absl::string_view name, uint64_t value) override {
return RenderDataPiece(name, DataPiece(value));
}
- ProtoWriter* RenderDouble(StringPiece name, double value) override {
+ ProtoWriter* RenderDouble(absl::string_view name, double value) override {
return RenderDataPiece(name, DataPiece(value));
}
- ProtoWriter* RenderFloat(StringPiece name, float value) override {
+ ProtoWriter* RenderFloat(absl::string_view name, float value) override {
return RenderDataPiece(name, DataPiece(value));
}
- ProtoWriter* RenderString(StringPiece name,
- StringPiece value) override {
+ ProtoWriter* RenderString(absl::string_view name,
+ absl::string_view value) override {
return RenderDataPiece(name,
DataPiece(value, use_strict_base64_decoding()));
}
- ProtoWriter* RenderBytes(StringPiece name, StringPiece value) override {
+ ProtoWriter* RenderBytes(absl::string_view name,
+ absl::string_view value) override {
return RenderDataPiece(
name, DataPiece(value, false, use_strict_base64_decoding()));
}
- ProtoWriter* RenderNull(StringPiece name) override {
+ ProtoWriter* RenderNull(absl::string_view name) override {
return RenderDataPiece(name, DataPiece::NullData());
}
// Renders a DataPiece 'value' into a field whose wire type is determined
// from the given field 'name'.
- virtual ProtoWriter* RenderDataPiece(StringPiece name,
+ virtual ProtoWriter* RenderDataPiece(absl::string_view name,
const DataPiece& data);
@@ -178,6 +181,9 @@
// Constructor for a field of an element.
ProtoElement(ProtoElement* parent, const google::protobuf::Field* field,
const google::protobuf::Type& type, bool is_list);
+ ProtoElement() = delete;
+ ProtoElement(const ProtoElement&) = delete;
+ ProtoElement& operator=(const ProtoElement&) = delete;
~ProtoElement() override {}
@@ -245,8 +251,6 @@
// Set of oneof indices already seen for the type_. Used to validate
// incoming messages so no more than one oneof is set.
std::vector<bool> oneof_indices_;
-
- GOOGLE_DISALLOW_IMPLICIT_CONSTRUCTORS(ProtoElement);
};
// Container for inserting 'size' information at the 'pos' position.
@@ -261,20 +265,20 @@
ProtoElement* element() override { return element_.get(); }
// Helper methods for calling ErrorListener. See error_listener.h.
- void InvalidName(StringPiece unknown_name, StringPiece message);
- void InvalidValue(StringPiece type_name, StringPiece value);
- void MissingField(StringPiece missing_name);
+ void InvalidName(absl::string_view unknown_name, absl::string_view message);
+ void InvalidValue(absl::string_view type_name, absl::string_view value);
+ void MissingField(absl::string_view missing_name);
// Common code for BeginObject() and BeginList() that does invalid_depth_
// bookkeeping associated with name lookup.
- const google::protobuf::Field* BeginNamed(StringPiece name,
+ const google::protobuf::Field* BeginNamed(absl::string_view name,
bool is_list);
// Lookup the field in the current element. Looks in the base descriptor
// and in any extension. This will report an error if the field cannot be
// found when ignore_unknown_names_ is false or if multiple matching
// extensions are found.
- const google::protobuf::Field* Lookup(StringPiece name);
+ const google::protobuf::Field* Lookup(absl::string_view name);
// Lookup the field type in the type descriptor. Returns nullptr if the type
// is not known.
@@ -296,7 +300,7 @@
// false. It also calls the appropriate error callback.
// unnormalized_name is used for error string.
bool ValidOneof(const google::protobuf::Field& field,
- StringPiece unnormalized_name);
+ absl::string_view unnormalized_name);
// Returns true if the field is repeated.
bool IsRepeated(const google::protobuf::Field& field);
@@ -316,7 +320,7 @@
private:
// Writes an ENUM field, including tag, to the stream.
- static util::Status WriteEnum(int field_number, const DataPiece& data,
+ static absl::Status WriteEnum(int field_number, const DataPiece& data,
const google::protobuf::Enum* enum_type,
io::CodedOutputStream* stream,
bool use_lower_camel_for_enums,
@@ -375,8 +379,6 @@
ErrorListener* listener_;
int invalid_depth_;
std::unique_ptr<LocationTrackerInterface> tracker_;
-
- GOOGLE_DISALLOW_IMPLICIT_CONSTRUCTORS(ProtoWriter);
};
} // namespace converter
@@ -384,6 +386,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_UTIL_INTERNAL_PROTO_WRITER_H__
diff --git a/src/google/protobuf/util/internal/protostream_objectsource.cc b/src/google/protobuf/util/internal/protostream_objectsource.cc
index cf6c99a..367205f 100644
--- a/src/google/protobuf/util/internal/protostream_objectsource.cc
+++ b/src/google/protobuf/util/internal/protostream_objectsource.cc
@@ -28,35 +28,36 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/util/internal/protostream_objectsource.h>
+#include "google/protobuf/util/internal/protostream_objectsource.h"
#include <cstdint>
#include <unordered_map>
#include <utility>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/stubs/once.h>
-#include <google/protobuf/unknown_field_set.h>
-#include <google/protobuf/wire_format.h>
-#include <google/protobuf/wire_format_lite.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/casts.h>
-#include <google/protobuf/stubs/status.h>
-#include <google/protobuf/stubs/stringprintf.h>
-#include <google/protobuf/stubs/time.h>
-#include <google/protobuf/util/internal/constants.h>
-#include <google/protobuf/util/internal/field_mask_utility.h>
-#include <google/protobuf/util/internal/utility.h>
-#include <google/protobuf/stubs/map_util.h>
-#include <google/protobuf/stubs/status_macros.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/io/zero_copy_stream_impl.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/unknown_field_set.h"
+#include "google/protobuf/wire_format.h"
+#include "google/protobuf/wire_format_lite.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "absl/base/call_once.h"
+#include "absl/base/casts.h"
+#include "absl/status/status.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/str_format.h"
+#include "absl/strings/string_view.h"
+#include "absl/time/time.h"
+#include "google/protobuf/util/internal/constants.h"
+#include "google/protobuf/util/internal/field_mask_utility.h"
+#include "google/protobuf/util/internal/utility.h"
+#include "google/protobuf/stubs/status_macros.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
@@ -83,9 +84,9 @@
const google::protobuf::Enum& tech_enum, int number);
// Utility function to format nanos.
-const std::string FormatNanos(uint32_t nanos, bool with_trailing_zeros);
+std::string FormatNanos(uint32_t nanos, bool with_trailing_zeros);
-util::StatusOr<std::string> MapKeyDefaultValueAsString(
+absl::StatusOr<std::string> MapKeyDefaultValueAsString(
const google::protobuf::Field& field) {
switch (field.kind()) {
case google::protobuf::Field::TYPE_BOOL:
@@ -104,7 +105,7 @@
case google::protobuf::Field::TYPE_STRING:
return std::string();
default:
- return util::InternalError("Invalid map key type.");
+ return absl::InternalError("Invalid map key type.");
}
}
} // namespace
@@ -142,7 +143,7 @@
}
}
-util::Status ProtoStreamObjectSource::NamedWriteTo(StringPiece name,
+absl::Status ProtoStreamObjectSource::NamedWriteTo(absl::string_view name,
ObjectWriter* ow) const {
return WriteMessage(type_, name, 0, true, ow);
}
@@ -167,8 +168,8 @@
return field;
}
-util::Status ProtoStreamObjectSource::WriteMessage(
- const google::protobuf::Type& type, StringPiece name,
+absl::Status ProtoStreamObjectSource::WriteMessage(
+ const google::protobuf::Type& type, absl::string_view name,
const uint32_t end_tag, bool include_start_and_end,
ObjectWriter* ow) const {
@@ -228,11 +229,11 @@
if (include_start_and_end) {
ow->EndObject();
}
- return util::Status();
+ return absl::Status();
}
-util::StatusOr<uint32_t> ProtoStreamObjectSource::RenderList(
- const google::protobuf::Field* field, StringPiece name,
+absl::StatusOr<uint32_t> ProtoStreamObjectSource::RenderList(
+ const google::protobuf::Field* field, absl::string_view name,
uint32_t list_tag, ObjectWriter* ow) const {
uint32_t tag_to_return = 0;
ow->StartList(name);
@@ -253,8 +254,8 @@
return tag_to_return;
}
-util::StatusOr<uint32_t> ProtoStreamObjectSource::RenderMap(
- const google::protobuf::Field* field, StringPiece /* name */,
+absl::StatusOr<uint32_t> ProtoStreamObjectSource::RenderMap(
+ const google::protobuf::Field* field, absl::string_view /* name */,
uint32_t list_tag, ObjectWriter* ow) const {
const google::protobuf::Type* field_type =
typeinfo_->GetTypeByTypeUrl(field->type_url());
@@ -284,7 +285,7 @@
if (key_field == nullptr) {
// The Type info for this map entry is incorrect. It should always
// have a field named "key" and with field number 1.
- return util::InternalError("Invalid map entry.");
+ return absl::InternalError("Invalid map entry.");
}
ASSIGN_OR_RETURN(map_key, MapKeyDefaultValueAsString(*key_field));
}
@@ -292,7 +293,7 @@
} else {
// The Type info for this map entry is incorrect. It should contain
// exactly two fields with field number 1 and 2.
- return util::InternalError("Invalid map entry.");
+ return absl::InternalError("Invalid map entry.");
}
}
stream_->PopLimit(old_limit);
@@ -300,61 +301,69 @@
return tag_to_return;
}
-util::Status ProtoStreamObjectSource::RenderPacked(
+absl::Status ProtoStreamObjectSource::RenderPacked(
const google::protobuf::Field* field, ObjectWriter* ow) const {
uint32_t length;
stream_->ReadVarint32(&length);
int old_limit = stream_->PushLimit(length);
while (stream_->BytesUntilLimit() > 0) {
- RETURN_IF_ERROR(RenderField(field, StringPiece(), ow));
+ RETURN_IF_ERROR(RenderField(field, absl::string_view(), ow));
}
stream_->PopLimit(old_limit);
- return util::Status();
+ return absl::Status();
}
-util::Status ProtoStreamObjectSource::RenderTimestamp(
+absl::Status ProtoStreamObjectSource::RenderTimestamp(
const ProtoStreamObjectSource* os, const google::protobuf::Type& type,
- StringPiece field_name, ObjectWriter* ow) {
+ absl::string_view field_name, ObjectWriter* ow) {
std::pair<int64_t, int32_t> p = os->ReadSecondsAndNanos(type);
int64_t seconds = p.first;
int32_t nanos = p.second;
if (seconds > kTimestampMaxSeconds || seconds < kTimestampMinSeconds) {
- return util::InternalError(StrCat(
+ return absl::InternalError(absl::StrCat(
"Timestamp seconds exceeds limit for field: ", field_name));
}
if (nanos < 0 || nanos >= kNanosPerSecond) {
- return util::InternalError(
- StrCat("Timestamp nanos exceeds limit for field: ", field_name));
+ return absl::InternalError(
+ absl::StrCat("Timestamp nanos exceeds limit for field: ", field_name));
}
- ow->RenderString(field_name,
- ::google::protobuf::internal::FormatTime(seconds, nanos));
-
- return util::Status();
+ absl::Time tm = absl::FromUnixSeconds(seconds);
+ std::string formatted_seconds =
+ absl::FormatTime(kRfc3339TimeFormat, tm, absl::UTCTimeZone());
+ std::string formatted_time = absl::StrFormat(
+ "%s%sZ", formatted_seconds.c_str(),
+ FormatNanos(
+ nanos,
+ false
+ )
+ .c_str());
+ ow->RenderString(field_name, formatted_time);
+ return absl::Status();
}
-util::Status ProtoStreamObjectSource::RenderDuration(
+absl::Status ProtoStreamObjectSource::RenderDuration(
const ProtoStreamObjectSource* os, const google::protobuf::Type& type,
- StringPiece field_name, ObjectWriter* ow) {
+ absl::string_view field_name, ObjectWriter* ow) {
std::pair<int64_t, int32_t> p = os->ReadSecondsAndNanos(type);
int64_t seconds = p.first;
int32_t nanos = p.second;
if (seconds > kDurationMaxSeconds || seconds < kDurationMinSeconds) {
- return util::InternalError(
- StrCat("Duration seconds exceeds limit for field: ", field_name));
+ return absl::InternalError(
+ absl::StrCat("Duration seconds exceeds limit for field: ", field_name));
}
if (nanos <= -kNanosPerSecond || nanos >= kNanosPerSecond) {
- return util::InternalError(
- StrCat("Duration nanos exceeds limit for field: ", field_name));
+ return absl::InternalError(
+ absl::StrCat("Duration nanos exceeds limit for field: ", field_name));
}
std::string sign = "";
if (seconds < 0) {
if (nanos > 0) {
- return util::InternalError(
- StrCat("Duration nanos is non-negative, but seconds is "
+ return absl::InternalError(
+ absl::StrCat("Duration nanos is non-negative, but seconds is "
"negative for field: ",
field_name));
}
@@ -365,7 +374,7 @@
sign = "-";
nanos = -nanos;
}
- std::string formatted_duration = StringPrintf(
+ std::string formatted_duration = absl::StrFormat(
"%s%lld%ss", sign.c_str(), static_cast<long long>(seconds), // NOLINT
FormatNanos(
nanos,
@@ -373,90 +382,90 @@
)
.c_str());
ow->RenderString(field_name, formatted_duration);
- return util::Status();
+ return absl::Status();
}
-util::Status ProtoStreamObjectSource::RenderDouble(
+absl::Status ProtoStreamObjectSource::RenderDouble(
const ProtoStreamObjectSource* os, const google::protobuf::Type& /*type*/,
- StringPiece field_name, ObjectWriter* ow) {
+ absl::string_view field_name, ObjectWriter* ow) {
uint32_t tag = os->stream_->ReadTag();
uint64_t buffer64 = 0; // default value of Double wrapper value
if (tag != 0) {
os->stream_->ReadLittleEndian64(&buffer64);
os->stream_->ReadTag();
}
- ow->RenderDouble(field_name, bit_cast<double>(buffer64));
- return util::Status();
+ ow->RenderDouble(field_name, absl::bit_cast<double>(buffer64));
+ return absl::Status();
}
-util::Status ProtoStreamObjectSource::RenderFloat(
+absl::Status ProtoStreamObjectSource::RenderFloat(
const ProtoStreamObjectSource* os, const google::protobuf::Type& /*type*/,
- StringPiece field_name, ObjectWriter* ow) {
+ absl::string_view field_name, ObjectWriter* ow) {
uint32_t tag = os->stream_->ReadTag();
uint32_t buffer32 = 0; // default value of Float wrapper value
if (tag != 0) {
os->stream_->ReadLittleEndian32(&buffer32);
os->stream_->ReadTag();
}
- ow->RenderFloat(field_name, bit_cast<float>(buffer32));
- return util::Status();
+ ow->RenderFloat(field_name, absl::bit_cast<float>(buffer32));
+ return absl::Status();
}
-util::Status ProtoStreamObjectSource::RenderInt64(
+absl::Status ProtoStreamObjectSource::RenderInt64(
const ProtoStreamObjectSource* os, const google::protobuf::Type& /*type*/,
- StringPiece field_name, ObjectWriter* ow) {
+ absl::string_view field_name, ObjectWriter* ow) {
uint32_t tag = os->stream_->ReadTag();
uint64_t buffer64 = 0; // default value of Int64 wrapper value
if (tag != 0) {
os->stream_->ReadVarint64(&buffer64);
os->stream_->ReadTag();
}
- ow->RenderInt64(field_name, bit_cast<int64_t>(buffer64));
- return util::Status();
+ ow->RenderInt64(field_name, absl::bit_cast<int64_t>(buffer64));
+ return absl::Status();
}
-util::Status ProtoStreamObjectSource::RenderUInt64(
+absl::Status ProtoStreamObjectSource::RenderUInt64(
const ProtoStreamObjectSource* os, const google::protobuf::Type& /*type*/,
- StringPiece field_name, ObjectWriter* ow) {
+ absl::string_view field_name, ObjectWriter* ow) {
uint32_t tag = os->stream_->ReadTag();
uint64_t buffer64 = 0; // default value of UInt64 wrapper value
if (tag != 0) {
os->stream_->ReadVarint64(&buffer64);
os->stream_->ReadTag();
}
- ow->RenderUint64(field_name, bit_cast<uint64_t>(buffer64));
- return util::Status();
+ ow->RenderUint64(field_name, absl::bit_cast<uint64_t>(buffer64));
+ return absl::Status();
}
-util::Status ProtoStreamObjectSource::RenderInt32(
+absl::Status ProtoStreamObjectSource::RenderInt32(
const ProtoStreamObjectSource* os, const google::protobuf::Type& /*type*/,
- StringPiece field_name, ObjectWriter* ow) {
+ absl::string_view field_name, ObjectWriter* ow) {
uint32_t tag = os->stream_->ReadTag();
uint32_t buffer32 = 0; // default value of Int32 wrapper value
if (tag != 0) {
os->stream_->ReadVarint32(&buffer32);
os->stream_->ReadTag();
}
- ow->RenderInt32(field_name, bit_cast<int32_t>(buffer32));
- return util::Status();
+ ow->RenderInt32(field_name, absl::bit_cast<int32_t>(buffer32));
+ return absl::Status();
}
-util::Status ProtoStreamObjectSource::RenderUInt32(
+absl::Status ProtoStreamObjectSource::RenderUInt32(
const ProtoStreamObjectSource* os, const google::protobuf::Type& /*type*/,
- StringPiece field_name, ObjectWriter* ow) {
+ absl::string_view field_name, ObjectWriter* ow) {
uint32_t tag = os->stream_->ReadTag();
uint32_t buffer32 = 0; // default value of UInt32 wrapper value
if (tag != 0) {
os->stream_->ReadVarint32(&buffer32);
os->stream_->ReadTag();
}
- ow->RenderUint32(field_name, bit_cast<uint32_t>(buffer32));
- return util::Status();
+ ow->RenderUint32(field_name, absl::bit_cast<uint32_t>(buffer32));
+ return absl::Status();
}
-util::Status ProtoStreamObjectSource::RenderBool(
+absl::Status ProtoStreamObjectSource::RenderBool(
const ProtoStreamObjectSource* os, const google::protobuf::Type& /*type*/,
- StringPiece field_name, ObjectWriter* ow) {
+ absl::string_view field_name, ObjectWriter* ow) {
uint32_t tag = os->stream_->ReadTag();
uint64_t buffer64 = 0; // results in 'false' value as default, which is the
// default value of Bool wrapper
@@ -465,12 +474,12 @@
os->stream_->ReadTag();
}
ow->RenderBool(field_name, buffer64 != 0);
- return util::Status();
+ return absl::Status();
}
-util::Status ProtoStreamObjectSource::RenderString(
+absl::Status ProtoStreamObjectSource::RenderString(
const ProtoStreamObjectSource* os, const google::protobuf::Type& /*type*/,
- StringPiece field_name, ObjectWriter* ow) {
+ absl::string_view field_name, ObjectWriter* ow) {
uint32_t tag = os->stream_->ReadTag();
uint32_t buffer32;
std::string str; // default value of empty for String wrapper
@@ -480,12 +489,12 @@
os->stream_->ReadTag();
}
ow->RenderString(field_name, str);
- return util::Status();
+ return absl::Status();
}
-util::Status ProtoStreamObjectSource::RenderBytes(
+absl::Status ProtoStreamObjectSource::RenderBytes(
const ProtoStreamObjectSource* os, const google::protobuf::Type& /*type*/,
- StringPiece field_name, ObjectWriter* ow) {
+ absl::string_view field_name, ObjectWriter* ow) {
uint32_t tag = os->stream_->ReadTag();
uint32_t buffer32;
std::string str;
@@ -495,12 +504,12 @@
os->stream_->ReadTag();
}
ow->RenderBytes(field_name, str);
- return util::Status();
+ return absl::Status();
}
-util::Status ProtoStreamObjectSource::RenderStruct(
+absl::Status ProtoStreamObjectSource::RenderStruct(
const ProtoStreamObjectSource* os, const google::protobuf::Type& type,
- StringPiece field_name, ObjectWriter* ow) {
+ absl::string_view field_name, ObjectWriter* ow) {
const google::protobuf::Field* field = nullptr;
uint32_t tag = os->stream_->ReadTag();
ow->StartObject(field_name);
@@ -518,12 +527,12 @@
}
}
ow->EndObject();
- return util::Status();
+ return absl::Status();
}
-util::Status ProtoStreamObjectSource::RenderStructValue(
+absl::Status ProtoStreamObjectSource::RenderStructValue(
const ProtoStreamObjectSource* os, const google::protobuf::Type& type,
- StringPiece field_name, ObjectWriter* ow) {
+ absl::string_view field_name, ObjectWriter* ow) {
const google::protobuf::Field* field = nullptr;
for (uint32_t tag = os->stream_->ReadTag(); tag != 0;
tag = os->stream_->ReadTag()) {
@@ -534,20 +543,20 @@
}
RETURN_IF_ERROR(os->RenderField(field, field_name, ow));
}
- return util::Status();
+ return absl::Status();
}
// TODO(skarvaje): Avoid code duplication of for loops and SkipField logic.
-util::Status ProtoStreamObjectSource::RenderStructListValue(
+absl::Status ProtoStreamObjectSource::RenderStructListValue(
const ProtoStreamObjectSource* os, const google::protobuf::Type& type,
- StringPiece field_name, ObjectWriter* ow) {
+ absl::string_view field_name, ObjectWriter* ow) {
uint32_t tag = os->stream_->ReadTag();
// Render empty list when we find empty ListValue message.
if (tag == 0) {
ow->StartList(field_name);
ow->EndList();
- return util::Status();
+ return absl::Status();
}
while (tag != 0) {
@@ -559,12 +568,12 @@
}
ASSIGN_OR_RETURN(tag, os->RenderList(field, field_name, tag, ow));
}
- return util::Status();
+ return absl::Status();
}
-util::Status ProtoStreamObjectSource::RenderAny(
+absl::Status ProtoStreamObjectSource::RenderAny(
const ProtoStreamObjectSource* os, const google::protobuf::Type& type,
- StringPiece field_name, ObjectWriter* ow) {
+ absl::string_view field_name, ObjectWriter* ow) {
// An Any is of the form { string type_url = 1; bytes value = 2; }
uint32_t tag;
std::string type_url;
@@ -600,22 +609,22 @@
ow->RenderString("@type", type_url);
}
ow->EndObject();
- return util::Status();
+ return absl::Status();
}
// If there is a value but no type, we cannot render it, so report an error.
if (type_url.empty()) {
// TODO(sven): Add an external message once those are ready.
- return util::InternalError("Invalid Any, the type_url is missing.");
+ return absl::InternalError("Invalid Any, the type_url is missing.");
}
- util::StatusOr<const google::protobuf::Type*> resolved_type =
+ absl::StatusOr<const google::protobuf::Type*> resolved_type =
os->typeinfo_->ResolveTypeUrl(type_url);
if (!resolved_type.ok()) {
// Convert into an internal error, since this means the backend gave us
// an invalid response (missing or invalid type information).
- return util::InternalError(resolved_type.status().message());
+ return absl::InternalError(resolved_type.status().message());
}
// nested_type cannot be null at this time.
const google::protobuf::Type* nested_type = resolved_type.value();
@@ -630,15 +639,15 @@
// We manually call start and end object here so we can inject the @type.
ow->StartObject(field_name);
ow->RenderString("@type", type_url);
- util::Status result =
+ absl::Status result =
nested_os.WriteMessage(nested_os.type_, "value", 0, false, ow);
ow->EndObject();
return result;
}
-util::Status ProtoStreamObjectSource::RenderFieldMask(
+absl::Status ProtoStreamObjectSource::RenderFieldMask(
const ProtoStreamObjectSource* os, const google::protobuf::Type& type,
- StringPiece field_name, ObjectWriter* ow) {
+ absl::string_view field_name, ObjectWriter* ow) {
std::string combined;
uint32_t buffer32;
uint32_t paths_field_tag = 0;
@@ -652,7 +661,7 @@
}
}
if (paths_field_tag != tag) {
- return util::InternalError("Invalid FieldMask, unexpected field.");
+ return absl::InternalError("Invalid FieldMask, unexpected field.");
}
std::string str;
os->stream_->ReadVarint32(&buffer32); // string size.
@@ -663,13 +672,13 @@
combined.append(ConvertFieldMaskPath(str, &ToCamelCase));
}
ow->RenderString(field_name, combined);
- return util::Status();
+ return absl::Status();
}
std::unordered_map<std::string, ProtoStreamObjectSource::TypeRenderer>*
ProtoStreamObjectSource::renderers_ = nullptr;
-PROTOBUF_NAMESPACE_ID::internal::once_flag source_renderers_init_;
+absl::once_flag source_renderers_init_;
void ProtoStreamObjectSource::InitRendererMap() {
@@ -717,13 +726,14 @@
// static
ProtoStreamObjectSource::TypeRenderer*
ProtoStreamObjectSource::FindTypeRenderer(const std::string& type_url) {
- PROTOBUF_NAMESPACE_ID::internal::call_once(source_renderers_init_,
- InitRendererMap);
- return FindOrNull(*renderers_, type_url);
+ absl::call_once(source_renderers_init_, InitRendererMap);
+ auto it = renderers_->find(type_url);
+ if (it == renderers_->end()) return nullptr;
+ return &it->second;
}
-util::Status ProtoStreamObjectSource::RenderField(
- const google::protobuf::Field* field, StringPiece field_name,
+absl::Status ProtoStreamObjectSource::RenderField(
+ const google::protobuf::Field* field, absl::string_view field_name,
ObjectWriter* ow) const {
// Short-circuit message types as it tends to call WriteMessage recursively
// and ends up using a lot of stack space. Keep the stack usage of this
@@ -736,8 +746,8 @@
const google::protobuf::Type* type =
typeinfo_->GetTypeByTypeUrl(field->type_url());
if (type == nullptr) {
- return util::InternalError(
- StrCat("Invalid configuration. Could not find the type: ",
+ return absl::InternalError(
+ absl::StrCat("Invalid configuration. Could not find the type: ",
field->type_url()));
}
@@ -753,7 +763,7 @@
--recursion_depth_;
if (!stream_->ConsumedEntireMessage()) {
- return util::InvalidArgumentError(
+ return absl::InvalidArgumentError(
"Nested protocol message not parsed in its entirety.");
}
stream_->PopLimit(old_limit);
@@ -761,11 +771,11 @@
// Render all other non-message types.
return RenderNonMessageField(field, field_name, ow);
}
- return util::Status();
+ return absl::Status();
}
-util::Status ProtoStreamObjectSource::RenderNonMessageField(
- const google::protobuf::Field* field, StringPiece field_name,
+absl::Status ProtoStreamObjectSource::RenderNonMessageField(
+ const google::protobuf::Field* field, absl::string_view field_name,
ObjectWriter* ow) const {
// Temporary buffers of different types.
uint32_t buffer32 = 0;
@@ -779,22 +789,22 @@
}
case google::protobuf::Field::TYPE_INT32: {
stream_->ReadVarint32(&buffer32);
- ow->RenderInt32(field_name, bit_cast<int32_t>(buffer32));
+ ow->RenderInt32(field_name, absl::bit_cast<int32_t>(buffer32));
break;
}
case google::protobuf::Field::TYPE_INT64: {
stream_->ReadVarint64(&buffer64);
- ow->RenderInt64(field_name, bit_cast<int64_t>(buffer64));
+ ow->RenderInt64(field_name, absl::bit_cast<int64_t>(buffer64));
break;
}
case google::protobuf::Field::TYPE_UINT32: {
stream_->ReadVarint32(&buffer32);
- ow->RenderUint32(field_name, bit_cast<uint32_t>(buffer32));
+ ow->RenderUint32(field_name, absl::bit_cast<uint32_t>(buffer32));
break;
}
case google::protobuf::Field::TYPE_UINT64: {
stream_->ReadVarint64(&buffer64);
- ow->RenderUint64(field_name, bit_cast<uint64_t>(buffer64));
+ ow->RenderUint64(field_name, absl::bit_cast<uint64_t>(buffer64));
break;
}
case google::protobuf::Field::TYPE_SINT32: {
@@ -809,32 +819,32 @@
}
case google::protobuf::Field::TYPE_SFIXED32: {
stream_->ReadLittleEndian32(&buffer32);
- ow->RenderInt32(field_name, bit_cast<int32_t>(buffer32));
+ ow->RenderInt32(field_name, absl::bit_cast<int32_t>(buffer32));
break;
}
case google::protobuf::Field::TYPE_SFIXED64: {
stream_->ReadLittleEndian64(&buffer64);
- ow->RenderInt64(field_name, bit_cast<int64_t>(buffer64));
+ ow->RenderInt64(field_name, absl::bit_cast<int64_t>(buffer64));
break;
}
case google::protobuf::Field::TYPE_FIXED32: {
stream_->ReadLittleEndian32(&buffer32);
- ow->RenderUint32(field_name, bit_cast<uint32_t>(buffer32));
+ ow->RenderUint32(field_name, absl::bit_cast<uint32_t>(buffer32));
break;
}
case google::protobuf::Field::TYPE_FIXED64: {
stream_->ReadLittleEndian64(&buffer64);
- ow->RenderUint64(field_name, bit_cast<uint64_t>(buffer64));
+ ow->RenderUint64(field_name, absl::bit_cast<uint64_t>(buffer64));
break;
}
case google::protobuf::Field::TYPE_FLOAT: {
stream_->ReadLittleEndian32(&buffer32);
- ow->RenderFloat(field_name, bit_cast<float>(buffer32));
+ ow->RenderFloat(field_name, absl::bit_cast<float>(buffer32));
break;
}
case google::protobuf::Field::TYPE_DOUBLE: {
stream_->ReadLittleEndian64(&buffer64);
- ow->RenderDouble(field_name, bit_cast<double>(buffer64));
+ ow->RenderDouble(field_name, absl::bit_cast<double>(buffer64));
break;
}
case google::protobuf::Field::TYPE_ENUM: {
@@ -888,11 +898,11 @@
default:
break;
}
- return util::Status();
+ return absl::Status();
}
// TODO(skarvaje): Fix this to avoid code duplication.
-const std::string ProtoStreamObjectSource::ReadFieldValueAsString(
+std::string ProtoStreamObjectSource::ReadFieldValueAsString(
const google::protobuf::Field& field) const {
std::string result;
switch (field.kind()) {
@@ -905,73 +915,73 @@
case google::protobuf::Field::TYPE_INT32: {
uint32_t buffer32;
stream_->ReadVarint32(&buffer32);
- result = StrCat(bit_cast<int32_t>(buffer32));
+ result = absl::StrCat(absl::bit_cast<int32_t>(buffer32));
break;
}
case google::protobuf::Field::TYPE_INT64: {
uint64_t buffer64;
stream_->ReadVarint64(&buffer64);
- result = StrCat(bit_cast<int64_t>(buffer64));
+ result = absl::StrCat(absl::bit_cast<int64_t>(buffer64));
break;
}
case google::protobuf::Field::TYPE_UINT32: {
uint32_t buffer32;
stream_->ReadVarint32(&buffer32);
- result = StrCat(bit_cast<uint32_t>(buffer32));
+ result = absl::StrCat(absl::bit_cast<uint32_t>(buffer32));
break;
}
case google::protobuf::Field::TYPE_UINT64: {
uint64_t buffer64;
stream_->ReadVarint64(&buffer64);
- result = StrCat(bit_cast<uint64_t>(buffer64));
+ result = absl::StrCat(absl::bit_cast<uint64_t>(buffer64));
break;
}
case google::protobuf::Field::TYPE_SINT32: {
uint32_t buffer32;
stream_->ReadVarint32(&buffer32);
- result = StrCat(WireFormatLite::ZigZagDecode32(buffer32));
+ result = absl::StrCat(WireFormatLite::ZigZagDecode32(buffer32));
break;
}
case google::protobuf::Field::TYPE_SINT64: {
uint64_t buffer64;
stream_->ReadVarint64(&buffer64);
- result = StrCat(WireFormatLite::ZigZagDecode64(buffer64));
+ result = absl::StrCat(WireFormatLite::ZigZagDecode64(buffer64));
break;
}
case google::protobuf::Field::TYPE_SFIXED32: {
uint32_t buffer32;
stream_->ReadLittleEndian32(&buffer32);
- result = StrCat(bit_cast<int32_t>(buffer32));
+ result = absl::StrCat(absl::bit_cast<int32_t>(buffer32));
break;
}
case google::protobuf::Field::TYPE_SFIXED64: {
uint64_t buffer64;
stream_->ReadLittleEndian64(&buffer64);
- result = StrCat(bit_cast<int64_t>(buffer64));
+ result = absl::StrCat(absl::bit_cast<int64_t>(buffer64));
break;
}
case google::protobuf::Field::TYPE_FIXED32: {
uint32_t buffer32;
stream_->ReadLittleEndian32(&buffer32);
- result = StrCat(bit_cast<uint32_t>(buffer32));
+ result = absl::StrCat(absl::bit_cast<uint32_t>(buffer32));
break;
}
case google::protobuf::Field::TYPE_FIXED64: {
uint64_t buffer64;
stream_->ReadLittleEndian64(&buffer64);
- result = StrCat(bit_cast<uint64_t>(buffer64));
+ result = absl::StrCat(absl::bit_cast<uint64_t>(buffer64));
break;
}
case google::protobuf::Field::TYPE_FLOAT: {
uint32_t buffer32;
stream_->ReadLittleEndian32(&buffer32);
- result = SimpleFtoa(bit_cast<float>(buffer32));
+ result = SimpleFtoa(absl::bit_cast<float>(buffer32));
break;
}
case google::protobuf::Field::TYPE_DOUBLE: {
uint64_t buffer64;
stream_->ReadLittleEndian64(&buffer64);
- result = SimpleDtoa(bit_cast<double>(buffer64));
+ result = SimpleDtoa(absl::bit_cast<double>(buffer64));
break;
}
case google::protobuf::Field::TYPE_ENUM: {
@@ -1039,24 +1049,24 @@
if (field->number() == 1) {
// read seconds
stream_->ReadVarint64(&seconds);
- signed_seconds = bit_cast<int64_t>(seconds);
+ signed_seconds = absl::bit_cast<int64_t>(seconds);
} else if (field->number() == 2) {
// read nanos
stream_->ReadVarint32(&nanos);
- signed_nanos = bit_cast<int32_t>(nanos);
+ signed_nanos = absl::bit_cast<int32_t>(nanos);
}
}
return std::pair<int64_t, int32_t>(signed_seconds, signed_nanos);
}
-util::Status ProtoStreamObjectSource::IncrementRecursionDepth(
- StringPiece type_name, StringPiece field_name) const {
+absl::Status ProtoStreamObjectSource::IncrementRecursionDepth(
+ absl::string_view type_name, absl::string_view field_name) const {
if (++recursion_depth_ > max_recursion_depth_) {
- return util::InvalidArgumentError(
- StrCat("Message too deep. Max recursion depth reached for type '",
+ return absl::InvalidArgumentError(
+ absl::StrCat("Message too deep. Max recursion depth reached for type '",
type_name, "', field '", field_name, "'"));
}
- return util::Status();
+ return absl::Status();
}
namespace {
@@ -1093,7 +1103,7 @@
// TODO(skarvaje): Look into optimizing this by not doing computation on
// double.
-const std::string FormatNanos(uint32_t nanos, bool with_trailing_zeros) {
+std::string FormatNanos(uint32_t nanos, bool with_trailing_zeros) {
if (nanos == 0) {
return with_trailing_zeros ? ".000" : "";
}
@@ -1101,7 +1111,7 @@
const int precision = (nanos % 1000 != 0) ? 9
: (nanos % 1000000 != 0) ? 6
: 3;
- std::string formatted = StringPrintf(
+ std::string formatted = absl::StrFormat(
"%.*f", precision, static_cast<double>(nanos) / kNanosPerSecond);
// remove the leading 0 before decimal.
return formatted.substr(1);
diff --git a/src/google/protobuf/util/internal/protostream_objectsource.h b/src/google/protobuf/util/internal/protostream_objectsource.h
index 8ed2ca9..350966b 100644
--- a/src/google/protobuf/util/internal/protostream_objectsource.h
+++ b/src/google/protobuf/util/internal/protostream_objectsource.h
@@ -36,22 +36,21 @@
#include <string>
#include <unordered_map>
-#include <google/protobuf/stubs/status.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/type.pb.h>
-#include <google/protobuf/stubs/statusor.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/util/internal/object_source.h>
-#include <google/protobuf/util/internal/object_writer.h>
-#include <google/protobuf/util/internal/type_info.h>
-#include <google/protobuf/util/type_resolver.h>
-#include <google/protobuf/stubs/hash.h>
-#include <google/protobuf/stubs/status.h>
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/type.pb.h"
+#include "absl/status/status.h"
+#include "absl/status/statusor.h"
+#include "absl/strings/string_view.h"
+#include "google/protobuf/port.h"
+#include "google/protobuf/util/internal/object_source.h"
+#include "google/protobuf/util/internal/object_writer.h"
+#include "google/protobuf/util/internal/type_info.h"
+#include "google/protobuf/util/type_resolver.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -77,9 +76,6 @@
public:
struct RenderOptions {
- RenderOptions() = default;
- RenderOptions(const RenderOptions&) = default;
-
// Sets whether or not to use lowerCamelCase casing for enum values. If set
// to false, enum values are output without any case conversions.
//
@@ -123,10 +119,12 @@
TypeResolver* type_resolver,
const google::protobuf::Type& type,
const RenderOptions& render_options);
-
+ ProtoStreamObjectSource() = delete;
+ ProtoStreamObjectSource(const ProtoStreamObjectSource&) = delete;
+ ProtoStreamObjectSource& operator=(const ProtoStreamObjectSource&) = delete;
~ProtoStreamObjectSource() override;
- util::Status NamedWriteTo(StringPiece name,
+ absl::Status NamedWriteTo(absl::string_view name,
ObjectWriter* ow) const override;
// Sets the max recursion depth of proto message to be deserialized. Proto
@@ -142,8 +140,8 @@
// nested messages (end with 0) and nested groups (end with group end tag).
// The include_start_and_end parameter allows this method to be called when
// already inside of an object, and skip calling StartObject and EndObject.
- virtual util::Status WriteMessage(const google::protobuf::Type& type,
- StringPiece name,
+ virtual absl::Status WriteMessage(const google::protobuf::Type& type,
+ absl::string_view name,
const uint32_t end_tag,
bool include_start_and_end,
ObjectWriter* ow) const;
@@ -151,8 +149,8 @@
// Renders a repeating field (packed or unpacked). Returns the next tag after
// reading all sequential repeating elements. The caller should use this tag
// before reading more tags from the stream.
- virtual util::StatusOr<uint32_t> RenderList(
- const google::protobuf::Field* field, StringPiece name,
+ virtual absl::StatusOr<uint32_t> RenderList(
+ const google::protobuf::Field* field, absl::string_view name,
uint32_t list_tag, ObjectWriter* ow) const;
// Looks up a field and verify its consistency with wire type in tag.
@@ -160,14 +158,14 @@
const google::protobuf::Type& type, uint32_t tag) const;
// Renders a field value to the ObjectWriter.
- virtual util::Status RenderField(const google::protobuf::Field* field,
- StringPiece field_name,
+ virtual absl::Status RenderField(const google::protobuf::Field* field,
+ absl::string_view field_name,
ObjectWriter* ow) const;
// Reads field value according to Field spec in 'field' and returns the read
// value as string. This only works for primitive datatypes (no message
// types).
- const std::string ReadFieldValueAsString(
+ std::string ReadFieldValueAsString(
const google::protobuf::Field& field) const;
@@ -180,9 +178,9 @@
const google::protobuf::Type& type,
const RenderOptions& render_options);
// Function that renders a well known type with a modified behavior.
- typedef util::Status (*TypeRenderer)(const ProtoStreamObjectSource*,
+ typedef absl::Status (*TypeRenderer)(const ProtoStreamObjectSource*,
const google::protobuf::Type&,
- StringPiece, ObjectWriter*);
+ absl::string_view, ObjectWriter*);
// TODO(skarvaje): Mark these methods as non-const as they modify internal
// state (stream_).
@@ -190,82 +188,82 @@
// Renders a NWP map.
// Returns the next tag after reading all map entries. The caller should use
// this tag before reading more tags from the stream.
- util::StatusOr<uint32_t> RenderMap(const google::protobuf::Field* field,
- StringPiece name, uint32_t list_tag,
+ absl::StatusOr<uint32_t> RenderMap(const google::protobuf::Field* field,
+ absl::string_view name, uint32_t list_tag,
ObjectWriter* ow) const;
// Renders a packed repeating field. A packed field is stored as:
// {tag length item1 item2 item3} instead of the less efficient
// {tag item1 tag item2 tag item3}.
- util::Status RenderPacked(const google::protobuf::Field* field,
+ absl::Status RenderPacked(const google::protobuf::Field* field,
ObjectWriter* ow) const;
// Renders a google.protobuf.Timestamp value to ObjectWriter
- static util::Status RenderTimestamp(const ProtoStreamObjectSource* os,
+ static absl::Status RenderTimestamp(const ProtoStreamObjectSource* os,
const google::protobuf::Type& type,
- StringPiece name, ObjectWriter* ow);
+ absl::string_view name, ObjectWriter* ow);
// Renders a google.protobuf.Duration value to ObjectWriter
- static util::Status RenderDuration(const ProtoStreamObjectSource* os,
+ static absl::Status RenderDuration(const ProtoStreamObjectSource* os,
const google::protobuf::Type& type,
- StringPiece name, ObjectWriter* ow);
+ absl::string_view name, ObjectWriter* ow);
// Following RenderTYPE functions render well known types in
// google/protobuf/wrappers.proto corresponding to TYPE.
- static util::Status RenderDouble(const ProtoStreamObjectSource* os,
+ static absl::Status RenderDouble(const ProtoStreamObjectSource* os,
const google::protobuf::Type& type,
- StringPiece name, ObjectWriter* ow);
- static util::Status RenderFloat(const ProtoStreamObjectSource* os,
+ absl::string_view name, ObjectWriter* ow);
+ static absl::Status RenderFloat(const ProtoStreamObjectSource* os,
const google::protobuf::Type& type,
- StringPiece name, ObjectWriter* ow);
- static util::Status RenderInt64(const ProtoStreamObjectSource* os,
+ absl::string_view name, ObjectWriter* ow);
+ static absl::Status RenderInt64(const ProtoStreamObjectSource* os,
const google::protobuf::Type& type,
- StringPiece name, ObjectWriter* ow);
- static util::Status RenderUInt64(const ProtoStreamObjectSource* os,
+ absl::string_view name, ObjectWriter* ow);
+ static absl::Status RenderUInt64(const ProtoStreamObjectSource* os,
const google::protobuf::Type& type,
- StringPiece name, ObjectWriter* ow);
- static util::Status RenderInt32(const ProtoStreamObjectSource* os,
+ absl::string_view name, ObjectWriter* ow);
+ static absl::Status RenderInt32(const ProtoStreamObjectSource* os,
const google::protobuf::Type& type,
- StringPiece name, ObjectWriter* ow);
- static util::Status RenderUInt32(const ProtoStreamObjectSource* os,
+ absl::string_view name, ObjectWriter* ow);
+ static absl::Status RenderUInt32(const ProtoStreamObjectSource* os,
const google::protobuf::Type& type,
- StringPiece name, ObjectWriter* ow);
- static util::Status RenderBool(const ProtoStreamObjectSource* os,
+ absl::string_view name, ObjectWriter* ow);
+ static absl::Status RenderBool(const ProtoStreamObjectSource* os,
const google::protobuf::Type& type,
- StringPiece name, ObjectWriter* ow);
- static util::Status RenderString(const ProtoStreamObjectSource* os,
+ absl::string_view name, ObjectWriter* ow);
+ static absl::Status RenderString(const ProtoStreamObjectSource* os,
const google::protobuf::Type& type,
- StringPiece name, ObjectWriter* ow);
- static util::Status RenderBytes(const ProtoStreamObjectSource* os,
+ absl::string_view name, ObjectWriter* ow);
+ static absl::Status RenderBytes(const ProtoStreamObjectSource* os,
const google::protobuf::Type& type,
- StringPiece name, ObjectWriter* ow);
+ absl::string_view name, ObjectWriter* ow);
// Renders a google.protobuf.Struct to ObjectWriter.
- static util::Status RenderStruct(const ProtoStreamObjectSource* os,
+ static absl::Status RenderStruct(const ProtoStreamObjectSource* os,
const google::protobuf::Type& type,
- StringPiece name, ObjectWriter* ow);
+ absl::string_view name, ObjectWriter* ow);
// Helper to render google.protobuf.Struct's Value fields to ObjectWriter.
- static util::Status RenderStructValue(const ProtoStreamObjectSource* os,
+ static absl::Status RenderStructValue(const ProtoStreamObjectSource* os,
const google::protobuf::Type& type,
- StringPiece name,
+ absl::string_view name,
ObjectWriter* ow);
// Helper to render google.protobuf.Struct's ListValue fields to ObjectWriter.
- static util::Status RenderStructListValue(const ProtoStreamObjectSource* os,
+ static absl::Status RenderStructListValue(const ProtoStreamObjectSource* os,
const google::protobuf::Type& type,
- StringPiece name,
+ absl::string_view name,
ObjectWriter* ow);
// Render the "Any" type.
- static util::Status RenderAny(const ProtoStreamObjectSource* os,
+ static absl::Status RenderAny(const ProtoStreamObjectSource* os,
const google::protobuf::Type& type,
- StringPiece name, ObjectWriter* ow);
+ absl::string_view name, ObjectWriter* ow);
// Render the "FieldMask" type.
- static util::Status RenderFieldMask(const ProtoStreamObjectSource* os,
+ static absl::Status RenderFieldMask(const ProtoStreamObjectSource* os,
const google::protobuf::Type& type,
- StringPiece name, ObjectWriter* ow);
+ absl::string_view name, ObjectWriter* ow);
static std::unordered_map<std::string, TypeRenderer>* renderers_;
static void InitRendererMap();
@@ -274,8 +272,8 @@
// Same as above but renders all non-message field types. Callers don't call
// this function directly. They just use RenderField.
- util::Status RenderNonMessageField(const google::protobuf::Field* field,
- StringPiece field_name,
+ absl::Status RenderNonMessageField(const google::protobuf::Field* field,
+ absl::string_view field_name,
ObjectWriter* ow) const;
@@ -290,8 +288,8 @@
// Helper function to check recursion depth and increment it. It will return
// OkStatus() if the current depth is allowed. Otherwise an error is returned.
// type_name and field_name are used for error reporting.
- util::Status IncrementRecursionDepth(StringPiece type_name,
- StringPiece field_name) const;
+ absl::Status IncrementRecursionDepth(absl::string_view type_name,
+ absl::string_view field_name) const;
// Input stream to read from. Ownership rests with the caller.
mutable io::CodedInputStream* stream_;
@@ -315,8 +313,6 @@
// Maximum allowed recursion depth.
int max_recursion_depth_;
-
- GOOGLE_DISALLOW_IMPLICIT_CONSTRUCTORS(ProtoStreamObjectSource);
};
} // namespace converter
@@ -324,6 +320,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_UTIL_INTERNAL_PROTOSTREAM_OBJECTSOURCE_H__
diff --git a/src/google/protobuf/util/internal/protostream_objectsource_test.cc b/src/google/protobuf/util/internal/protostream_objectsource_test.cc
index e16db78..4fde30b 100644
--- a/src/google/protobuf/util/internal/protostream_objectsource_test.cc
+++ b/src/google/protobuf/util/internal/protostream_objectsource_test.cc
@@ -28,29 +28,30 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/util/internal/protostream_objectsource.h>
+#include "google/protobuf/util/internal/protostream_objectsource.h"
#include <cstdint>
#include <memory>
#include <sstream>
-#include <google/protobuf/any.pb.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/util/internal/expecting_objectwriter.h>
-#include <google/protobuf/util/internal/testdata/anys.pb.h>
-#include <google/protobuf/util/internal/testdata/books.pb.h>
-#include <google/protobuf/util/internal/testdata/field_mask.pb.h>
-#include <google/protobuf/util/internal/testdata/maps.pb.h>
-#include <google/protobuf/util/internal/testdata/proto3.pb.h>
-#include <google/protobuf/util/internal/testdata/struct.pb.h>
-#include <google/protobuf/util/internal/testdata/timestamp_duration.pb.h>
+#include "google/protobuf/any.pb.h"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/io/zero_copy_stream_impl_lite.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/util/internal/expecting_objectwriter.h"
#include <gtest/gtest.h>
-#include <google/protobuf/stubs/casts.h>
-#include <google/protobuf/stubs/status.h>
-#include <google/protobuf/util/internal/constants.h>
-#include <google/protobuf/util/internal/type_info_test_helper.h>
+#include "absl/base/casts.h"
+#include "absl/status/status.h"
+#include "absl/strings/str_cat.h"
+#include "google/protobuf/util/internal/constants.h"
+#include "google/protobuf/util/internal/testdata/anys.pb.h"
+#include "google/protobuf/util/internal/testdata/books.pb.h"
+#include "google/protobuf/util/internal/testdata/field_mask.pb.h"
+#include "google/protobuf/util/internal/testdata/maps.pb.h"
+#include "google/protobuf/util/internal/testdata/proto3.pb.h"
+#include "google/protobuf/util/internal/testdata/struct.pb.h"
+#include "google/protobuf/util/internal/testdata/timestamp_duration.pb.h"
+#include "google/protobuf/util/internal/type_info_test_helper.h"
namespace google {
@@ -106,11 +107,11 @@
~ProtostreamObjectSourceTest() override {}
void DoTest(const Message& msg, const Descriptor* descriptor) {
- util::Status status = ExecuteTest(msg, descriptor);
- EXPECT_EQ(util::Status(), status);
+ absl::Status status = ExecuteTest(msg, descriptor);
+ EXPECT_EQ(absl::Status(), status);
}
- util::Status ExecuteTest(const Message& msg, const Descriptor* descriptor) {
+ absl::Status ExecuteTest(const Message& msg, const Descriptor* descriptor) {
std::ostringstream oss;
msg.SerializePartialToOstream(&oss);
std::string proto = oss.str();
@@ -130,13 +131,13 @@
void PrepareExpectingObjectWriterForRepeatedPrimitive() {
ow_.StartObject("")
->StartList("repFix32")
- ->RenderUint32("", bit_cast<uint32_t>(3201))
- ->RenderUint32("", bit_cast<uint32_t>(0))
- ->RenderUint32("", bit_cast<uint32_t>(3202))
+ ->RenderUint32("", absl::bit_cast<uint32_t>(3201))
+ ->RenderUint32("", absl::bit_cast<uint32_t>(0))
+ ->RenderUint32("", absl::bit_cast<uint32_t>(3202))
->EndList()
->StartList("repU32")
- ->RenderUint32("", bit_cast<uint32_t>(3203))
- ->RenderUint32("", bit_cast<uint32_t>(0))
+ ->RenderUint32("", absl::bit_cast<uint32_t>(3203))
+ ->RenderUint32("", absl::bit_cast<uint32_t>(0))
->EndList()
->StartList("repI32")
->RenderInt32("", 0)
@@ -153,13 +154,13 @@
->RenderInt32("", 3208)
->EndList()
->StartList("repFix64")
- ->RenderUint64("", bit_cast<uint64_t>(int64_t{6401}))
- ->RenderUint64("", bit_cast<uint64_t>(int64_t{0}))
+ ->RenderUint64("", absl::bit_cast<uint64_t>(int64_t{6401}))
+ ->RenderUint64("", absl::bit_cast<uint64_t>(int64_t{0}))
->EndList()
->StartList("repU64")
- ->RenderUint64("", bit_cast<uint64_t>(int64_t{0}))
- ->RenderUint64("", bit_cast<uint64_t>(int64_t{6402}))
- ->RenderUint64("", bit_cast<uint64_t>(int64_t{6403}))
+ ->RenderUint64("", absl::bit_cast<uint64_t>(int64_t{0}))
+ ->RenderUint64("", absl::bit_cast<uint64_t>(int64_t{6402}))
+ ->RenderUint64("", absl::bit_cast<uint64_t>(int64_t{6403}))
->EndList()
->StartList("repI64")
->RenderInt64("", 6404L)
@@ -321,13 +322,13 @@
primitive.set_bool_(true);
ow_.StartObject("")
- ->RenderUint32("fix32", bit_cast<uint32_t>(3201))
- ->RenderUint32("u32", bit_cast<uint32_t>(3202))
+ ->RenderUint32("fix32", absl::bit_cast<uint32_t>(3201))
+ ->RenderUint32("u32", absl::bit_cast<uint32_t>(3202))
->RenderInt32("i32", 3203)
->RenderInt32("sf32", 3204)
->RenderInt32("s32", 3205)
- ->RenderUint64("fix64", bit_cast<uint64_t>(int64_t{6401}))
- ->RenderUint64("u64", bit_cast<uint64_t>(int64_t{6402}))
+ ->RenderUint64("fix64", absl::bit_cast<uint64_t>(int64_t{6401}))
+ ->RenderUint64("u64", absl::bit_cast<uint64_t>(int64_t{6402}))
->RenderInt64("i64", 6403L)
->RenderInt64("sf64", 6404L)
->RenderInt64("s64", 6405L)
@@ -478,8 +479,8 @@
int repeat = 10000;
for (int i = 0; i < repeat; ++i) {
Book_Label* label = book.add_labels();
- label->set_key(StrCat("i", i));
- label->set_value(StrCat("v", i));
+ label->set_key(absl::StrCat("i", i));
+ label->set_value(absl::StrCat("v", i));
}
// Make sure StartList and EndList are called exactly once (see b/18227499 for
@@ -584,7 +585,7 @@
for (int i = 0; i < 63; ++i) {
Author* next = current_author->add_friend_();
next->set_id(i);
- next->set_name(StrCat("author_name_", i));
+ next->set_name(absl::StrCat("author_name_", i));
next->set_alive(true);
current_author = next;
}
@@ -592,12 +593,12 @@
// Recursive message with depth (65) > max (max is 64).
for (int i = 0; i < 64; ++i) {
Cyclic* next = current->mutable_m_cyclic();
- next->set_m_str(StrCat("count_", i));
+ next->set_m_str(absl::StrCat("count_", i));
current = next;
}
- util::Status status = ExecuteTest(cyclic, Cyclic::descriptor());
- EXPECT_TRUE(util::IsInvalidArgument(status));
+ absl::Status status = ExecuteTest(cyclic, Cyclic::descriptor());
+ EXPECT_TRUE(absl::IsInvalidArgument(status));
}
class ProtostreamObjectSourceMapsTest : public ProtostreamObjectSourceTest {
@@ -942,8 +943,8 @@
// We start the "AnyOut" part and then fail when we hit the Any object.
ow_.StartObject("");
- util::Status status = ExecuteTest(out, AnyOut::descriptor());
- EXPECT_TRUE(util::IsInternal(status));
+ absl::Status status = ExecuteTest(out, AnyOut::descriptor());
+ EXPECT_TRUE(absl::IsInternal(status));
}
TEST_P(ProtostreamObjectSourceAnysTest, UnknownTypeServiceError) {
@@ -958,8 +959,8 @@
// We start the "AnyOut" part and then fail when we hit the Any object.
ow_.StartObject("");
- util::Status status = ExecuteTest(out, AnyOut::descriptor());
- EXPECT_TRUE(util::IsInternal(status));
+ absl::Status status = ExecuteTest(out, AnyOut::descriptor());
+ EXPECT_TRUE(absl::IsInternal(status));
}
TEST_P(ProtostreamObjectSourceAnysTest, UnknownTypeError) {
@@ -974,8 +975,8 @@
// We start the "AnyOut" part and then fail when we hit the Any object.
ow_.StartObject("");
- util::Status status = ExecuteTest(out, AnyOut::descriptor());
- EXPECT_TRUE(util::IsInternal(status));
+ absl::Status status = ExecuteTest(out, AnyOut::descriptor());
+ EXPECT_TRUE(absl::IsInternal(status));
}
class ProtostreamObjectSourceStructTest : public ProtostreamObjectSourceTest {
@@ -1107,8 +1108,8 @@
ts->set_seconds(kTimestampMinSeconds - 1);
ow_.StartObject("");
- util::Status status = ExecuteTest(out, TimestampDuration::descriptor());
- EXPECT_TRUE(util::IsInternal(status));
+ absl::Status status = ExecuteTest(out, TimestampDuration::descriptor());
+ EXPECT_TRUE(absl::IsInternal(status));
}
TEST_P(ProtostreamObjectSourceTimestampTest, InvalidTimestampAboveMaxTest) {
@@ -1118,8 +1119,8 @@
ts->set_seconds(kTimestampMaxSeconds + 1);
ow_.StartObject("");
- util::Status status = ExecuteTest(out, TimestampDuration::descriptor());
- EXPECT_TRUE(util::IsInternal(status));
+ absl::Status status = ExecuteTest(out, TimestampDuration::descriptor());
+ EXPECT_TRUE(absl::IsInternal(status));
}
TEST_P(ProtostreamObjectSourceTimestampTest, InvalidDurationBelowMinTest) {
@@ -1129,8 +1130,8 @@
dur->set_seconds(kDurationMinSeconds - 1);
ow_.StartObject("");
- util::Status status = ExecuteTest(out, TimestampDuration::descriptor());
- EXPECT_TRUE(util::IsInternal(status));
+ absl::Status status = ExecuteTest(out, TimestampDuration::descriptor());
+ EXPECT_TRUE(absl::IsInternal(status));
}
TEST_P(ProtostreamObjectSourceTimestampTest, InvalidDurationAboveMaxTest) {
@@ -1140,8 +1141,8 @@
dur->set_seconds(kDurationMaxSeconds + 1);
ow_.StartObject("");
- util::Status status = ExecuteTest(out, TimestampDuration::descriptor());
- EXPECT_TRUE(util::IsInternal(status));
+ absl::Status status = ExecuteTest(out, TimestampDuration::descriptor());
+ EXPECT_TRUE(absl::IsInternal(status));
}
TEST_P(ProtostreamObjectSourceTimestampTest, TimestampDurationDefaultValue) {
diff --git a/src/google/protobuf/util/internal/protostream_objectwriter.cc b/src/google/protobuf/util/internal/protostream_objectwriter.cc
index ecb219e..2c4d5ef 100644
--- a/src/google/protobuf/util/internal/protostream_objectwriter.cc
+++ b/src/google/protobuf/util/internal/protostream_objectwriter.cc
@@ -28,7 +28,7 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/util/internal/protostream_objectwriter.h>
+#include "google/protobuf/util/internal/protostream_objectwriter.h"
#include <cstdint>
#include <functional>
@@ -36,28 +36,30 @@
#include <unordered_map>
#include <unordered_set>
-#include <google/protobuf/stubs/once.h>
-#include <google/protobuf/wire_format_lite.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/status.h>
-#include <google/protobuf/stubs/statusor.h>
-#include <google/protobuf/stubs/time.h>
-#include <google/protobuf/util/internal/constants.h>
-#include <google/protobuf/util/internal/field_mask_utility.h>
-#include <google/protobuf/util/internal/object_location_tracker.h>
-#include <google/protobuf/util/internal/utility.h>
-#include <google/protobuf/stubs/map_util.h>
+#include "google/protobuf/wire_format_lite.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "absl/base/call_once.h"
+#include "absl/status/status.h"
+#include "absl/status/statusor.h"
+#include "absl/strings/match.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/strip.h"
+#include "absl/time/time.h"
+#include "google/protobuf/util/internal/constants.h"
+#include "google/protobuf/util/internal/field_mask_utility.h"
+#include "google/protobuf/util/internal/object_location_tracker.h"
+#include "google/protobuf/util/internal/utility.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
namespace util {
namespace converter {
-using util::Status;
+using ::absl::Status;
using ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite;
using std::placeholders::_1;
@@ -115,19 +117,19 @@
namespace {
// Utility method to split a string representation of Timestamp or Duration and
// return the parts.
-void SplitSecondsAndNanos(StringPiece input, StringPiece* seconds,
- StringPiece* nanos) {
+void SplitSecondsAndNanos(absl::string_view input, absl::string_view* seconds,
+ absl::string_view* nanos) {
size_t idx = input.rfind('.');
if (idx != std::string::npos) {
*seconds = input.substr(0, idx);
*nanos = input.substr(idx + 1);
} else {
*seconds = input;
- *nanos = StringPiece();
+ *nanos = absl::string_view();
}
}
-Status GetNanosFromStringPiece(StringPiece s_nanos,
+Status GetNanosFromStringPiece(absl::string_view s_nanos,
const char* parse_failure_message,
const char* exceeded_limit_message,
int32_t* nanos) {
@@ -135,7 +137,7 @@
// Count the number of leading 0s and consume them.
int num_leading_zeros = 0;
- while (s_nanos.Consume("0")) {
+ while (absl::ConsumePrefix(&s_nanos, "0")) {
num_leading_zeros++;
}
int32_t i_nanos = 0;
@@ -144,14 +146,14 @@
// conversion to 'nanos', rather than a double, so that there is no
// loss of precision.
if (!s_nanos.empty() && !safe_strto32(s_nanos, &i_nanos)) {
- return util::InvalidArgumentError(parse_failure_message);
+ return absl::InvalidArgumentError(parse_failure_message);
}
if (i_nanos > kNanosPerSecond || i_nanos < 0) {
- return util::InvalidArgumentError(exceeded_limit_message);
+ return absl::InvalidArgumentError(exceeded_limit_message);
}
// s_nanos should only have digits. No whitespace.
- if (s_nanos.find_first_not_of("0123456789") != StringPiece::npos) {
- return util::InvalidArgumentError(parse_failure_message);
+ if (s_nanos.find_first_not_of("0123456789") != absl::string_view::npos) {
+ return absl::InvalidArgumentError(parse_failure_message);
}
if (i_nanos > 0) {
@@ -191,7 +193,7 @@
conversion = 1;
break;
default:
- return util::InvalidArgumentError(exceeded_limit_message);
+ return absl::InvalidArgumentError(exceeded_limit_message);
}
*nanos = i_nanos * conversion;
}
@@ -199,6 +201,26 @@
return Status();
}
+// If successful, stores the offset in seconds in "value" and returns true.
+// Caller must ensure the first character of "offset" is "+" or "-".
+bool ParseTimezoneOffset(absl::string_view offset, int* value) {
+ GOOGLE_DCHECK(offset[0] == '+' || offset[0] == '-');
+ // Format of the offset: +DD:DD or -DD:DD. E.g., +08:00.
+ if (offset.length() != 6 || offset[3] != ':') {
+ return false;
+ }
+ int hours = 0, minutes = 0;
+ if (!safe_strto32(offset.substr(1, 2), &hours) ||
+ !safe_strto32(offset.substr(4, 2), &minutes) || hours < 0 ||
+ hours >= 24 || minutes < 0 || minutes >= 60) {
+ return false;
+ }
+ *value = (hours * 60 + minutes) * 60;
+ if (offset[0] == '-') {
+ *value = -*value;
+ }
+ return true;
+}
} // namespace
ProtoStreamObjectWriter::AnyWriter::AnyWriter(ProtoStreamObjectWriter* parent)
@@ -213,7 +235,7 @@
ProtoStreamObjectWriter::AnyWriter::~AnyWriter() {}
-void ProtoStreamObjectWriter::AnyWriter::StartObject(StringPiece name) {
+void ProtoStreamObjectWriter::AnyWriter::StartObject(absl::string_view name) {
++depth_;
// If an object writer is absent, that means we have not called StartAny()
// before reaching here, which happens when we have data before the "@type"
@@ -260,7 +282,7 @@
return true;
}
-void ProtoStreamObjectWriter::AnyWriter::StartList(StringPiece name) {
+void ProtoStreamObjectWriter::AnyWriter::StartList(absl::string_view name) {
++depth_;
if (ow_ == nullptr) {
// Save data before the "@type" field for later replay.
@@ -292,7 +314,7 @@
}
void ProtoStreamObjectWriter::AnyWriter::RenderDataPiece(
- StringPiece name, const DataPiece& value) {
+ absl::string_view name, const DataPiece& value) {
// Start an Any only at depth_ 0. Other RenderDataPiece calls with "@type"
// should go to the contained ow_ as they indicate nested Anys.
if (depth_ == 0 && ow_ == nullptr && name == "@type") {
@@ -330,7 +352,7 @@
if (value.type() == DataPiece::TYPE_STRING) {
type_url_ = std::string(value.str());
} else {
- util::StatusOr<std::string> s = value.ToString();
+ absl::StatusOr<std::string> s = value.ToString();
if (!s.ok()) {
parent_->InvalidValue("String", s.status().message());
invalid_ = true;
@@ -339,7 +361,7 @@
type_url_ = s.value();
}
// Resolve the type url, and report an error if we failed to resolve it.
- util::StatusOr<const google::protobuf::Type*> resolved_type =
+ absl::StatusOr<const google::protobuf::Type*> resolved_type =
parent_->typeinfo()->ResolveTypeUrl(type_url_);
if (!resolved_type.ok()) {
parent_->InvalidValue("Any", resolved_type.status().message());
@@ -393,7 +415,7 @@
// There are uninterpreted data, but we never got a "@type" field.
if (!invalid_) {
parent_->InvalidValue("Any",
- StrCat("Missing @type for any field in ",
+ absl::StrCat("Missing @type for any field in ",
parent_->master_type_.name()));
invalid_ = true;
}
@@ -434,7 +456,7 @@
// string value stays valid, we make a copy of the string value and update
// DataPiece to reference our own copy.
if (value_.type() == DataPiece::TYPE_STRING) {
- StrAppend(&value_storage_, value_.str());
+ absl::StrAppend(&value_storage_, value_.str());
value_ = DataPiece(value_storage_, value_.use_strict_base64_decoding());
} else if (value_.type() == DataPiece::TYPE_BYTES) {
value_storage_ = value_.ToBytes().value();
@@ -455,9 +477,6 @@
if (item_type_ == ANY) {
any_.reset(new AnyWriter(ow_));
}
- if (item_type == MAP) {
- map_keys_.reset(new std::unordered_set<std::string>);
- }
}
ProtoStreamObjectWriter::Item::Item(ProtoStreamObjectWriter::Item* parent,
@@ -472,19 +491,16 @@
if (item_type == ANY) {
any_.reset(new AnyWriter(ow_));
}
- if (item_type == MAP) {
- map_keys_.reset(new std::unordered_set<std::string>);
- }
}
bool ProtoStreamObjectWriter::Item::InsertMapKeyIfNotPresent(
- StringPiece map_key) {
- return InsertIfNotPresent(map_keys_.get(), std::string(map_key));
+ absl::string_view map_key) {
+ return map_keys_.insert(std::string(map_key)).second;
}
ProtoStreamObjectWriter* ProtoStreamObjectWriter::StartObject(
- StringPiece name) {
+ absl::string_view name) {
if (invalid_depth() > 0) {
IncrementInvalidDepth();
return this;
@@ -680,7 +696,7 @@
ProtoStreamObjectWriter* ProtoStreamObjectWriter::StartList(
- StringPiece name) {
+ absl::string_view name) {
if (invalid_depth() > 0) {
IncrementInvalidDepth();
return this;
@@ -788,7 +804,7 @@
}
// Report an error.
- InvalidValue("Map", StrCat("Cannot have repeated items ('", name,
+ InvalidValue("Map", absl::StrCat("Cannot have repeated items ('", name,
"') within a map."));
return this;
}
@@ -885,7 +901,7 @@
Push(name, Item::MESSAGE, false, true);
return this;
}
- InvalidValue("Map", StrCat("Cannot bind a list to map for field '",
+ InvalidValue("Map", absl::StrCat("Cannot bind a list to map for field '",
name, "'."));
IncrementInvalidDepth();
return this;
@@ -921,7 +937,7 @@
switch (data.type()) {
case DataPiece::TYPE_INT32: {
if (ow->options_.struct_integers_as_strings) {
- util::StatusOr<int32_t> int_value = data.ToInt32();
+ absl::StatusOr<int32_t> int_value = data.ToInt32();
if (int_value.ok()) {
ow->ProtoWriter::RenderDataPiece(
"string_value",
@@ -934,7 +950,7 @@
}
case DataPiece::TYPE_UINT32: {
if (ow->options_.struct_integers_as_strings) {
- util::StatusOr<uint32_t> int_value = data.ToUint32();
+ absl::StatusOr<uint32_t> int_value = data.ToUint32();
if (int_value.ok()) {
ow->ProtoWriter::RenderDataPiece(
"string_value",
@@ -949,10 +965,10 @@
// If the option to treat integers as strings is set, then render them as
// strings. Otherwise, fallback to rendering them as double.
if (ow->options_.struct_integers_as_strings) {
- util::StatusOr<int64_t> int_value = data.ToInt64();
+ absl::StatusOr<int64_t> int_value = data.ToInt64();
if (int_value.ok()) {
ow->ProtoWriter::RenderDataPiece(
- "string_value", DataPiece(StrCat(int_value.value()), true));
+ "string_value", DataPiece(absl::StrCat(int_value.value()), true));
return Status();
}
}
@@ -963,10 +979,10 @@
// If the option to treat integers as strings is set, then render them as
// strings. Otherwise, fallback to rendering them as double.
if (ow->options_.struct_integers_as_strings) {
- util::StatusOr<uint64_t> int_value = data.ToUint64();
+ absl::StatusOr<uint64_t> int_value = data.ToUint64();
if (int_value.ok()) {
ow->ProtoWriter::RenderDataPiece(
- "string_value", DataPiece(StrCat(int_value.value()), true));
+ "string_value", DataPiece(absl::StrCat(int_value.value()), true));
return Status();
}
}
@@ -975,7 +991,7 @@
}
case DataPiece::TYPE_FLOAT: {
if (ow->options_.struct_integers_as_strings) {
- util::StatusOr<float> float_value = data.ToFloat();
+ absl::StatusOr<float> float_value = data.ToFloat();
if (float_value.ok()) {
ow->ProtoWriter::RenderDataPiece(
"string_value",
@@ -988,7 +1004,7 @@
}
case DataPiece::TYPE_DOUBLE: {
if (ow->options_.struct_integers_as_strings) {
- util::StatusOr<double> double_value = data.ToDouble();
+ absl::StatusOr<double> double_value = data.ToDouble();
if (double_value.ok()) {
ow->ProtoWriter::RenderDataPiece(
"string_value",
@@ -1012,7 +1028,7 @@
break;
}
default: {
- return util::InvalidArgumentError(
+ return absl::InvalidArgumentError(
"Invalid struct data type. Only number, string, boolean or null "
"values are supported.");
}
@@ -1025,28 +1041,57 @@
const DataPiece& data) {
if (data.type() == DataPiece::TYPE_NULL) return Status();
if (data.type() != DataPiece::TYPE_STRING) {
- return util::InvalidArgumentError(
- StrCat("Invalid data type for timestamp, value is ",
+ return absl::InvalidArgumentError(
+ absl::StrCat("Invalid data type for timestamp, value is ",
data.ValueAsStringOrDefault("")));
}
- StringPiece value(data.str());
+ absl::string_view value(data.str());
- int64_t seconds;
- int32_t nanos;
- if (!::google::protobuf::internal::ParseTime(value.ToString(), &seconds,
- &nanos)) {
- return util::InvalidArgumentError(StrCat("Invalid time format: ", value));
+ int timezone_offset_seconds = 0;
+ if (absl::EndsWith(value, "Z")) {
+ value = value.substr(0, value.size() - 1);
+ } else {
+ size_t pos = value.find_last_of("+-");
+ if (pos == std::string::npos ||
+ !ParseTimezoneOffset(value.substr(pos), &timezone_offset_seconds)) {
+ return Status(absl::StatusCode::kInvalidArgument,
+ "Illegal timestamp format; timestamps must end with 'Z' "
+ "or have a valid timezone offset.");
+ }
+ value = value.substr(0, pos);
}
+ absl::string_view s_secs, s_nanos;
+ SplitSecondsAndNanos(value, &s_secs, &s_nanos);
+ absl::Time tm;
+ std::string err;
+ if (!absl::ParseTime(kRfc3339TimeFormatNoPadding, s_secs, &tm, &err)) {
+ return Status(absl::StatusCode::kInvalidArgument,
+ absl::StrCat("Invalid time format: ", err));
+ }
+
+ int32_t nanos = 0;
+ Status nanos_status = GetNanosFromStringPiece(
+ s_nanos, "Invalid time format, failed to parse nano seconds",
+ "Timestamp value exceeds limits", &nanos);
+ if (!nanos_status.ok()) {
+ return nanos_status;
+ }
+
+ int64_t seconds = absl::ToUnixSeconds(tm) - timezone_offset_seconds;
+ if (seconds > kTimestampMaxSeconds || seconds < kTimestampMinSeconds) {
+ return Status(absl::StatusCode::kInvalidArgument,
+ "Timestamp value exceeds limits");
+ }
ow->ProtoWriter::RenderDataPiece("seconds", DataPiece(seconds));
ow->ProtoWriter::RenderDataPiece("nanos", DataPiece(nanos));
return Status();
}
-static inline util::Status RenderOneFieldPath(ProtoStreamObjectWriter* ow,
- StringPiece path) {
+static inline absl::Status RenderOneFieldPath(ProtoStreamObjectWriter* ow,
+ absl::string_view path) {
ow->ProtoWriter::RenderDataPiece(
"paths", DataPiece(ConvertFieldMaskPath(path, &ToSnakeCase), true));
return Status();
@@ -1056,8 +1101,8 @@
const DataPiece& data) {
if (data.type() == DataPiece::TYPE_NULL) return Status();
if (data.type() != DataPiece::TYPE_STRING) {
- return util::InvalidArgumentError(
- StrCat("Invalid data type for field mask, value is ",
+ return absl::InvalidArgumentError(
+ absl::StrCat("Invalid data type for field mask, value is ",
data.ValueAsStringOrDefault("")));
}
@@ -1072,29 +1117,29 @@
const DataPiece& data) {
if (data.type() == DataPiece::TYPE_NULL) return Status();
if (data.type() != DataPiece::TYPE_STRING) {
- return util::InvalidArgumentError(
- StrCat("Invalid data type for duration, value is ",
+ return absl::InvalidArgumentError(
+ absl::StrCat("Invalid data type for duration, value is ",
data.ValueAsStringOrDefault("")));
}
- StringPiece value(data.str());
+ absl::string_view value(data.str());
- if (!HasSuffixString(value, "s")) {
- return util::InvalidArgumentError(
+ if (!absl::EndsWith(value, "s")) {
+ return absl::InvalidArgumentError(
"Illegal duration format; duration must end with 's'");
}
value = value.substr(0, value.size() - 1);
int sign = 1;
- if (HasPrefixString(value, "-")) {
+ if (absl::StartsWith(value, "-")) {
sign = -1;
value = value.substr(1);
}
- StringPiece s_secs, s_nanos;
+ absl::string_view s_secs, s_nanos;
SplitSecondsAndNanos(value, &s_secs, &s_nanos);
uint64_t unsigned_seconds;
if (!safe_strtou64(s_secs, &unsigned_seconds)) {
- return util::InvalidArgumentError(
+ return absl::InvalidArgumentError(
"Invalid duration format, failed to parse seconds");
}
@@ -1110,7 +1155,7 @@
int64_t seconds = sign * unsigned_seconds;
if (seconds > kDurationMaxSeconds || seconds < kDurationMinSeconds ||
nanos <= -kNanosPerSecond || nanos >= kNanosPerSecond) {
- return util::InvalidArgumentError("Duration value exceeds limits");
+ return absl::InvalidArgumentError("Duration value exceeds limits");
}
ow->ProtoWriter::RenderDataPiece("seconds", DataPiece(seconds));
@@ -1126,7 +1171,7 @@
}
ProtoStreamObjectWriter* ProtoStreamObjectWriter::RenderDataPiece(
- StringPiece name, const DataPiece& data) {
+ absl::string_view name, const DataPiece& data) {
Status status;
if (invalid_depth() > 0) return this;
@@ -1145,7 +1190,7 @@
status = (*type_renderer)(this, data);
if (!status.ok()) {
InvalidValue(master_type_.name(),
- StrCat("Field '", name, "', ", status.message()));
+ absl::StrCat("Field '", name, "', ", status.message()));
}
ProtoWriter::EndObject();
return this;
@@ -1191,7 +1236,7 @@
status = (*type_renderer)(this, data);
if (!status.ok()) {
InvalidValue(field->type_url(),
- StrCat("Field '", name, "', ", status.message()));
+ absl::StrCat("Field '", name, "', ", status.message()));
}
Pop();
return this;
@@ -1225,7 +1270,7 @@
status = (*type_renderer)(this, data);
if (!status.ok()) {
InvalidValue(field->type_url(),
- StrCat("Field '", name, "', ", status.message()));
+ absl::StrCat("Field '", name, "', ", status.message()));
}
Pop();
}
@@ -1260,7 +1305,7 @@
// represented by the key.
std::unordered_map<std::string, ProtoStreamObjectWriter::TypeRenderer>*
ProtoStreamObjectWriter::renderers_ = nullptr;
-PROTOBUF_NAMESPACE_ID::internal::once_flag writer_renderers_init_;
+absl::once_flag writer_renderers_init_;
void ProtoStreamObjectWriter::InitRendererMap() {
renderers_ = new std::unordered_map<std::string,
@@ -1319,18 +1364,19 @@
ProtoStreamObjectWriter::TypeRenderer*
ProtoStreamObjectWriter::FindTypeRenderer(const std::string& type_url) {
- PROTOBUF_NAMESPACE_ID::internal::call_once(writer_renderers_init_,
- InitRendererMap);
- return FindOrNull(*renderers_, type_url);
+ absl::call_once(writer_renderers_init_, InitRendererMap);
+ auto it = renderers_->find(type_url);
+ if (it == renderers_->end()) return nullptr;
+ return &it->second;
}
-bool ProtoStreamObjectWriter::ValidMapKey(StringPiece unnormalized_name) {
+bool ProtoStreamObjectWriter::ValidMapKey(absl::string_view unnormalized_name) {
if (current_ == nullptr) return true;
if (!current_->InsertMapKeyIfNotPresent(unnormalized_name)) {
listener()->InvalidName(
location(), unnormalized_name,
- StrCat("Repeated map key: '", unnormalized_name,
+ absl::StrCat("Repeated map key: '", unnormalized_name,
"' is already set."));
return false;
}
@@ -1339,7 +1385,7 @@
}
void ProtoStreamObjectWriter::Push(
- StringPiece name, Item::ItemType item_type, bool is_placeholder,
+ absl::string_view name, Item::ItemType item_type, bool is_placeholder,
bool is_list) {
is_list ? ProtoWriter::StartList(name) : ProtoWriter::StartObject(name);
diff --git a/src/google/protobuf/util/internal/protostream_objectwriter.h b/src/google/protobuf/util/internal/protostream_objectwriter.h
index ce2517f..35933c1 100644
--- a/src/google/protobuf/util/internal/protostream_objectwriter.h
+++ b/src/google/protobuf/util/internal/protostream_objectwriter.h
@@ -36,23 +36,25 @@
#include <unordered_map>
#include <unordered_set>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/type.pb.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/stubs/bytestream.h>
-#include <google/protobuf/stubs/status.h>
-#include <google/protobuf/util/internal/datapiece.h>
-#include <google/protobuf/util/internal/error_listener.h>
-#include <google/protobuf/util/internal/proto_writer.h>
-#include <google/protobuf/util/internal/structured_objectwriter.h>
-#include <google/protobuf/util/internal/type_info.h>
-#include <google/protobuf/util/type_resolver.h>
-#include <google/protobuf/stubs/hash.h>
+#include "google/protobuf/type.pb.h"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/io/zero_copy_stream_impl.h"
+#include "google/protobuf/descriptor.h"
+#include "absl/container/flat_hash_set.h"
+#include "absl/status/status.h"
+#include "google/protobuf/stubs/bytestream.h"
+#include "absl/strings/string_view.h"
+#include "google/protobuf/port.h"
+#include "google/protobuf/util/internal/datapiece.h"
+#include "google/protobuf/util/internal/error_listener.h"
+#include "google/protobuf/util/internal/proto_writer.h"
+#include "google/protobuf/util/internal/structured_objectwriter.h"
+#include "google/protobuf/util/internal/type_info.h"
+#include "google/protobuf/util/type_resolver.h"
+
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -151,22 +153,25 @@
strings::ByteSink* output, ErrorListener* listener,
const ProtoStreamObjectWriter::Options& options =
ProtoStreamObjectWriter::Options::Defaults());
+ ProtoStreamObjectWriter() = delete;
+ ProtoStreamObjectWriter(const ProtoStreamObjectWriter&) = delete;
+ ProtoStreamObjectWriter& operator=(const ProtoStreamObjectWriter&) = delete;
~ProtoStreamObjectWriter() override;
// ObjectWriter methods.
- ProtoStreamObjectWriter* StartObject(StringPiece name) override;
+ ProtoStreamObjectWriter* StartObject(absl::string_view name) override;
ProtoStreamObjectWriter* EndObject() override;
- ProtoStreamObjectWriter* StartList(StringPiece name) override;
+ ProtoStreamObjectWriter* StartList(absl::string_view name) override;
ProtoStreamObjectWriter* EndList() override;
// Renders a DataPiece 'value' into a field whose wire type is determined
// from the given field 'name'.
- ProtoStreamObjectWriter* RenderDataPiece(StringPiece name,
+ ProtoStreamObjectWriter* RenderDataPiece(absl::string_view name,
const DataPiece& data) override;
protected:
// Function that renders a well known type with modified behavior.
- typedef util::Status (*TypeRenderer)(ProtoStreamObjectWriter*,
+ typedef absl::Status (*TypeRenderer)(ProtoStreamObjectWriter*,
const DataPiece&);
// Handles writing Anys out using nested object writers and the like.
@@ -176,7 +181,7 @@
~AnyWriter();
// Passes a StartObject call through to the Any writer.
- void StartObject(StringPiece name);
+ void StartObject(absl::string_view name);
// Passes an EndObject call through to the Any. Returns true if the any
// handled the EndObject call, false if the Any is now all done and is no
@@ -184,13 +189,13 @@
bool EndObject();
// Passes a StartList call through to the Any writer.
- void StartList(StringPiece name);
+ void StartList(absl::string_view name);
// Passes an EndList call through to the Any writer.
void EndList();
// Renders a data piece on the any.
- void RenderDataPiece(StringPiece name, const DataPiece& value);
+ void RenderDataPiece(absl::string_view name, const DataPiece& value);
private:
// Before the "@type" field is encountered, we store all incoming data
@@ -209,11 +214,11 @@
explicit Event(Type type) : type_(type), value_(DataPiece::NullData()) {}
// Constructor for START_OBJECT and START_LIST events.
- explicit Event(Type type, StringPiece name)
+ explicit Event(Type type, absl::string_view name)
: type_(type), name_(name), value_(DataPiece::NullData()) {}
// Constructor for RENDER_DATA_PIECE events.
- explicit Event(StringPiece name, const DataPiece& value)
+ explicit Event(absl::string_view name, const DataPiece& value)
: type_(RENDER_DATA_PIECE), name_(name), value_(value) {
DeepCopy();
}
@@ -299,6 +304,9 @@
// Constructor for a field of a message.
Item(Item* parent, ItemType item_type, bool is_placeholder, bool is_list);
+ Item() = delete;
+ Item(const Item&) = delete;
+ Item& operator=(const Item&) = delete;
~Item() override {}
@@ -318,7 +326,7 @@
// The hash set (map_keys_) is ONLY used to keep track of map keys.
// Return true if insert successfully; returns false if the map key was
// already present.
- bool InsertMapKeyIfNotPresent(StringPiece map_key);
+ bool InsertMapKeyIfNotPresent(absl::string_view map_key);
bool is_placeholder() const { return is_placeholder_; }
bool is_list() const { return is_list_; }
@@ -336,7 +344,7 @@
// Set of map keys already seen for the type_. Used to validate incoming
// messages so no map key appears more than once.
- std::unique_ptr<std::unordered_set<std::string> > map_keys_;
+ absl::flat_hash_set<std::string> map_keys_;
// Conveys whether this Item is a placeholder or not. Placeholder items are
// pushed to stack to account for special types.
@@ -345,8 +353,6 @@
// Conveys whether this Item is a list or not. This is used to send
// StartList or EndList calls to underlying ObjectWriter.
bool is_list_;
-
- GOOGLE_DISALLOW_IMPLICIT_CONSTRUCTORS(Item);
};
ProtoStreamObjectWriter(const TypeInfo* typeinfo,
@@ -375,24 +381,24 @@
// Renders google.protobuf.Value in struct.proto. It picks the right oneof
// type based on value's type.
- static util::Status RenderStructValue(ProtoStreamObjectWriter* ow,
+ static absl::Status RenderStructValue(ProtoStreamObjectWriter* ow,
const DataPiece& data);
// Renders google.protobuf.Timestamp value.
- static util::Status RenderTimestamp(ProtoStreamObjectWriter* ow,
+ static absl::Status RenderTimestamp(ProtoStreamObjectWriter* ow,
const DataPiece& data);
// Renders google.protobuf.FieldMask value.
- static util::Status RenderFieldMask(ProtoStreamObjectWriter* ow,
+ static absl::Status RenderFieldMask(ProtoStreamObjectWriter* ow,
const DataPiece& data);
// Renders google.protobuf.Duration value.
- static util::Status RenderDuration(ProtoStreamObjectWriter* ow,
+ static absl::Status RenderDuration(ProtoStreamObjectWriter* ow,
const DataPiece& data);
// Renders wrapper message types for primitive types in
// google/protobuf/wrappers.proto.
- static util::Status RenderWrapperType(ProtoStreamObjectWriter* ow,
+ static absl::Status RenderWrapperType(ProtoStreamObjectWriter* ow,
const DataPiece& data);
static void InitRendererMap();
@@ -405,7 +411,7 @@
// is of element type MAP or STRUCT_MAP.
// It also calls the appropriate error callback and unnormalzied_name is used
// for error string.
- bool ValidMapKey(StringPiece unnormalized_name);
+ bool ValidMapKey(absl::string_view unnormalized_name);
// Pushes an item on to the stack. Also calls either StartObject or StartList
// on the underlying ObjectWriter depending on whether is_list is false or
@@ -413,7 +419,7 @@
// is_placeholder conveys whether the item is a placeholder item or not.
// Placeholder items are pushed when adding auxiliary types' StartObject or
// StartList calls.
- void Push(StringPiece name, Item::ItemType item_type,
+ void Push(absl::string_view name, Item::ItemType item_type,
bool is_placeholder, bool is_list);
@@ -439,8 +445,6 @@
// Reference to the options that control this class's behavior.
const ProtoStreamObjectWriter::Options options_;
-
- GOOGLE_DISALLOW_IMPLICIT_CONSTRUCTORS(ProtoStreamObjectWriter);
};
} // namespace converter
@@ -448,6 +452,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_UTIL_INTERNAL_PROTOSTREAM_OBJECTWRITER_H__
diff --git a/src/google/protobuf/util/internal/protostream_objectwriter_test.cc b/src/google/protobuf/util/internal/protostream_objectwriter_test.cc
index 3348999..22a2bf0 100644
--- a/src/google/protobuf/util/internal/protostream_objectwriter_test.cc
+++ b/src/google/protobuf/util/internal/protostream_objectwriter_test.cc
@@ -28,36 +28,36 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/util/internal/protostream_objectwriter.h>
+#include "google/protobuf/util/internal/protostream_objectwriter.h"
#include <stddef.h> // For size_t
-#include <google/protobuf/field_mask.pb.h>
-#include <google/protobuf/timestamp.pb.h>
-#include <google/protobuf/type.pb.h>
-#include <google/protobuf/wrappers.pb.h>
-#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/message.h>
-#include <google/protobuf/util/internal/mock_error_listener.h>
-#include <google/protobuf/util/internal/testdata/anys.pb.h>
-#include <google/protobuf/util/internal/testdata/books.pb.h>
-#include <google/protobuf/util/internal/testdata/field_mask.pb.h>
-#include <google/protobuf/util/internal/testdata/maps.pb.h>
-#include <google/protobuf/util/internal/testdata/oneofs.pb.h>
-#include <google/protobuf/util/internal/testdata/proto3.pb.h>
-#include <google/protobuf/util/internal/testdata/struct.pb.h>
-#include <google/protobuf/util/internal/testdata/timestamp_duration.pb.h>
-#include <google/protobuf/util/internal/testdata/wrappers.pb.h>
-#include <google/protobuf/stubs/bytestream.h>
-#include <google/protobuf/stubs/strutil.h>
+#include "google/protobuf/field_mask.pb.h"
+#include "google/protobuf/timestamp.pb.h"
+#include "google/protobuf/type.pb.h"
+#include "google/protobuf/wrappers.pb.h"
+#include "google/protobuf/io/zero_copy_stream_impl_lite.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/message.h"
+#include "google/protobuf/util/internal/mock_error_listener.h"
#include <gtest/gtest.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/dynamic_message.h>
-#include <google/protobuf/util/internal/constants.h>
-#include <google/protobuf/util/internal/type_info_test_helper.h>
-#include <google/protobuf/util/message_differencer.h>
-#include <google/protobuf/util/type_resolver_util.h>
+#include "google/protobuf/stubs/bytestream.h"
+#include "absl/strings/string_view.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/dynamic_message.h"
+#include "google/protobuf/util/internal/constants.h"
+#include "google/protobuf/util/internal/testdata/anys.pb.h"
+#include "google/protobuf/util/internal/testdata/books.pb.h"
+#include "google/protobuf/util/internal/testdata/field_mask.pb.h"
+#include "google/protobuf/util/internal/testdata/maps.pb.h"
+#include "google/protobuf/util/internal/testdata/oneofs.pb.h"
+#include "google/protobuf/util/internal/testdata/proto3.pb.h"
+#include "google/protobuf/util/internal/testdata/struct.pb.h"
+#include "google/protobuf/util/internal/testdata/timestamp_duration.pb.h"
+#include "google/protobuf/util/internal/testdata/wrappers.pb.h"
+#include "google/protobuf/util/internal/type_info_test_helper.h"
+#include "google/protobuf/util/message_differencer.h"
+#include "google/protobuf/util/type_resolver_util.h"
namespace google {
@@ -543,17 +543,17 @@
ResetTypeInfo(Primitive::descriptor());
- EXPECT_CALL(listener_, InvalidValue(_, StringPiece("TYPE_INT32"),
- StringPiece("\"Infinity\"")))
+ EXPECT_CALL(listener_, InvalidValue(_, absl::string_view("TYPE_INT32"),
+ absl::string_view("\"Infinity\"")))
.With(Args<0>(HasObjectLocation("i32")));
- EXPECT_CALL(listener_, InvalidValue(_, StringPiece("TYPE_UINT32"),
- StringPiece("\"Infinity\"")))
+ EXPECT_CALL(listener_, InvalidValue(_, absl::string_view("TYPE_UINT32"),
+ absl::string_view("\"Infinity\"")))
.With(Args<0>(HasObjectLocation("u32")));
- EXPECT_CALL(listener_, InvalidValue(_, StringPiece("TYPE_SFIXED64"),
- StringPiece("\"-Infinity\"")))
+ EXPECT_CALL(listener_, InvalidValue(_, absl::string_view("TYPE_SFIXED64"),
+ absl::string_view("\"-Infinity\"")))
.With(Args<0>(HasObjectLocation("sf64")));
- EXPECT_CALL(listener_, InvalidValue(_, StringPiece("TYPE_BOOL"),
- StringPiece("\"Infinity\"")))
+ EXPECT_CALL(listener_, InvalidValue(_, absl::string_view("TYPE_BOOL"),
+ absl::string_view("\"Infinity\"")))
.With(Args<0>(HasObjectLocation("bool")));
ow_->StartObject("")
@@ -576,17 +576,17 @@
ResetTypeInfo(Primitive::descriptor());
- EXPECT_CALL(listener_, InvalidValue(_, StringPiece("TYPE_INT32"),
- StringPiece("\"NaN\"")))
+ EXPECT_CALL(listener_, InvalidValue(_, absl::string_view("TYPE_INT32"),
+ absl::string_view("\"NaN\"")))
.With(Args<0>(HasObjectLocation("i32")));
- EXPECT_CALL(listener_, InvalidValue(_, StringPiece("TYPE_UINT32"),
- StringPiece("\"NaN\"")))
+ EXPECT_CALL(listener_, InvalidValue(_, absl::string_view("TYPE_UINT32"),
+ absl::string_view("\"NaN\"")))
.With(Args<0>(HasObjectLocation("u32")));
- EXPECT_CALL(listener_, InvalidValue(_, StringPiece("TYPE_SFIXED64"),
- StringPiece("\"NaN\"")))
+ EXPECT_CALL(listener_, InvalidValue(_, absl::string_view("TYPE_SFIXED64"),
+ absl::string_view("\"NaN\"")))
.With(Args<0>(HasObjectLocation("sf64")));
- EXPECT_CALL(listener_, InvalidValue(_, StringPiece("TYPE_BOOL"),
- StringPiece("\"NaN\"")))
+ EXPECT_CALL(listener_, InvalidValue(_, absl::string_view("TYPE_BOOL"),
+ absl::string_view("\"NaN\"")))
.With(Args<0>(HasObjectLocation("bool")));
ow_->StartObject("")
@@ -659,8 +659,8 @@
EXPECT_CALL(
listener_,
- InvalidName(_, StringPiece("name"),
- StringPiece(
+ InvalidName(_, absl::string_view("name"),
+ absl::string_view(
"Proto field is not repeating, cannot start list.")))
.With(Args<0>(HasObjectLocation("author")));
ow_->StartObject("")
@@ -734,8 +734,8 @@
EXPECT_CALL(
listener_,
InvalidValue(
- _, StringPiece("friend"),
- StringPiece(
+ _, absl::string_view("friend"),
+ absl::string_view(
"Starting an object in a repeated field but the parent object "
"is not a list")))
.With(Args<0>(HasObjectLocation("author")))
@@ -810,8 +810,8 @@
EXPECT_CALL(
listener_,
- InvalidName(_, StringPiece("publisher"),
- StringPiece(
+ InvalidName(_, absl::string_view("publisher"),
+ absl::string_view(
"Proto field is not repeating, cannot start list.")))
.With(Args<0>(HasObjectLocation("")));
ow_->StartObject("")
@@ -833,8 +833,8 @@
TEST_P(ProtoStreamObjectWriterTest, UnknownFieldAtRoot) {
Book empty;
- EXPECT_CALL(listener_, InvalidName(_, StringPiece("unknown"),
- StringPiece("Cannot find field.")))
+ EXPECT_CALL(listener_, InvalidName(_, absl::string_view("unknown"),
+ absl::string_view("Cannot find field.")))
.With(Args<0>(HasObjectLocation("")));
ow_->StartObject("")->RenderString("unknown", "Nope!")->EndObject();
CheckOutput(empty, 0);
@@ -851,8 +851,8 @@
Author* luke = paul->add_friend_();
luke->set_name("Luke");
- EXPECT_CALL(listener_, InvalidName(_, StringPiece("address"),
- StringPiece("Cannot find field.")))
+ EXPECT_CALL(listener_, InvalidName(_, absl::string_view("address"),
+ absl::string_view("Cannot find field.")))
.With(Args<0>(HasObjectLocation("author.friend[1]")));
ow_->StartObject("")
->StartObject("author")
@@ -877,8 +877,8 @@
TEST_P(ProtoStreamObjectWriterTest, UnknownObjectAtRoot) {
Book empty;
- EXPECT_CALL(listener_, InvalidName(_, StringPiece("unknown"),
- StringPiece("Cannot find field.")))
+ EXPECT_CALL(listener_, InvalidName(_, absl::string_view("unknown"),
+ absl::string_view("Cannot find field.")))
.With(Args<0>(HasObjectLocation("")));
ow_->StartObject("")->StartObject("unknown")->EndObject()->EndObject();
CheckOutput(empty, 0);
@@ -890,8 +890,8 @@
author->set_name("William");
author->add_pseudonym("Bill");
- EXPECT_CALL(listener_, InvalidName(_, StringPiece("wife"),
- StringPiece("Cannot find field.")))
+ EXPECT_CALL(listener_, InvalidName(_, absl::string_view("wife"),
+ absl::string_view("Cannot find field.")))
.With(Args<0>(HasObjectLocation("author")));
ow_->StartObject("")
->StartObject("author")
@@ -908,8 +908,8 @@
TEST_P(ProtoStreamObjectWriterTest, UnknownListAtRoot) {
Book empty;
- EXPECT_CALL(listener_, InvalidName(_, StringPiece("unknown"),
- StringPiece("Cannot find field.")))
+ EXPECT_CALL(listener_, InvalidName(_, absl::string_view("unknown"),
+ absl::string_view("Cannot find field.")))
.With(Args<0>(HasObjectLocation("")));
ow_->StartObject("")->StartList("unknown")->EndList()->EndObject();
CheckOutput(empty, 0);
@@ -921,8 +921,8 @@
Publisher* publisher = expected.mutable_publisher();
publisher->set_name("propaganda");
- EXPECT_CALL(listener_, InvalidName(_, StringPiece("alliance"),
- StringPiece("Cannot find field.")))
+ EXPECT_CALL(listener_, InvalidName(_, absl::string_view("alliance"),
+ absl::string_view("Cannot find field.")))
.With(Args<0>(HasObjectLocation("publisher")));
ow_->StartObject("")
->StartObject("publisher")
@@ -987,8 +987,8 @@
options_.ignore_unknown_fields = true;
ResetProtoWriter();
- EXPECT_CALL(listener_, InvalidName(_, StringPiece("unknown"),
- StringPiece("Cannot find field.")))
+ EXPECT_CALL(listener_, InvalidName(_, absl::string_view("unknown"),
+ absl::string_view("Cannot find field.")))
.Times(0);
ow_->StartObject("")->StartObject("unknown")->EndObject()->EndObject();
CheckOutput(empty, 0);
@@ -1056,10 +1056,10 @@
EXPECT_CALL(
listener_,
InvalidValue(_,
- StringPiece(
+ absl::string_view(
"type.googleapis.com/"
"proto_util_converter.testing.Proto3Message.NestedEnum"),
- StringPiece("\"someunknownvalueyouwillneverknow\"")))
+ absl::string_view("\"someunknownvalueyouwillneverknow\"")))
.With(Args<0>(HasObjectLocation("enum_value")));
ow_->StartObject("")
->RenderString("enumValue", "someunknownvalueyouwillneverknow")
@@ -1083,7 +1083,7 @@
expected.set_title("My Title");
expected.set_allocated_publisher(new Publisher());
- EXPECT_CALL(listener_, MissingField(_, StringPiece("name")))
+ EXPECT_CALL(listener_, MissingField(_, absl::string_view("name")))
.With(Args<0>(HasObjectLocation("publisher")));
ow_->StartObject("")
->StartObject("publisher")
@@ -1096,8 +1096,8 @@
TEST_P(ProtoStreamObjectWriterTest, InvalidFieldValueAtRoot) {
Book empty;
- EXPECT_CALL(listener_, InvalidValue(_, StringPiece("TYPE_UINT32"),
- StringPiece("\"garbage\"")))
+ EXPECT_CALL(listener_, InvalidValue(_, absl::string_view("TYPE_UINT32"),
+ absl::string_view("\"garbage\"")))
.With(Args<0>(HasObjectLocation("length")));
ow_->StartObject("")->RenderString("length", "garbage")->EndObject();
CheckOutput(empty, 0);
@@ -1107,11 +1107,11 @@
Book expected;
expected.set_title("My Title");
- EXPECT_CALL(listener_, InvalidValue(_, StringPiece("TYPE_UINT32"),
- StringPiece("\"-400\"")))
+ EXPECT_CALL(listener_, InvalidValue(_, absl::string_view("TYPE_UINT32"),
+ absl::string_view("\"-400\"")))
.With(Args<0>(HasObjectLocation("length")));
- EXPECT_CALL(listener_, InvalidValue(_, StringPiece("TYPE_INT64"),
- StringPiece("\"3.14\"")))
+ EXPECT_CALL(listener_, InvalidValue(_, absl::string_view("TYPE_INT64"),
+ absl::string_view("\"3.14\"")))
.With(Args<0>(HasObjectLocation("published")));
ow_->StartObject("")
->RenderString("length", "-400")
@@ -1125,8 +1125,8 @@
Book empty;
EXPECT_CALL(listener_,
- InvalidName(_, StringPiece(""),
- StringPiece("Proto fields must have a name.")))
+ InvalidName(_, absl::string_view(""),
+ absl::string_view("Proto fields must have a name.")))
.With(Args<0>(HasObjectLocation("")));
ow_->StartObject("")->RenderFloat("", 3.14)->EndObject();
CheckOutput(empty, 0);
@@ -1138,8 +1138,8 @@
expected.set_allocated_author(new Author());
EXPECT_CALL(listener_,
- InvalidName(_, StringPiece(""),
- StringPiece("Proto fields must have a name.")))
+ InvalidName(_, absl::string_view(""),
+ absl::string_view("Proto fields must have a name.")))
.With(Args<0>(HasObjectLocation("author")));
ow_->StartObject("")
->StartObject("author")
@@ -1155,8 +1155,8 @@
expected.set_title("noname");
EXPECT_CALL(listener_,
- InvalidName(_, StringPiece(""),
- StringPiece("Proto fields must have a name.")))
+ InvalidName(_, absl::string_view(""),
+ absl::string_view("Proto fields must have a name.")))
.With(Args<0>(HasObjectLocation("")));
ow_->StartObject("")
->StartList("")
@@ -1172,8 +1172,8 @@
EXPECT_CALL(
listener_,
- InvalidName(_, StringPiece("oops"),
- StringPiece("Root element should not be named.")))
+ InvalidName(_, absl::string_view("oops"),
+ absl::string_view("Root element should not be named.")))
.With(Args<0>(HasObjectLocation("")));
ow_->StartObject("oops")->RenderString("title", "Annie")->EndObject();
CheckOutput(expected, 7);
@@ -1184,8 +1184,8 @@
EXPECT_CALL(
listener_,
- InvalidName(_, StringPiece("oops"),
- StringPiece("Root element should not be named.")))
+ InvalidName(_, absl::string_view("oops"),
+ absl::string_view("Root element should not be named.")))
.With(Args<0>(HasObjectLocation("")));
ow_->StartList("oops")->RenderString("", "item")->EndList();
CheckOutput(empty, 0);
@@ -1195,8 +1195,8 @@
Book empty;
EXPECT_CALL(listener_,
- InvalidName(_, StringPiece(""),
- StringPiece("Root element must be a message.")))
+ InvalidName(_, absl::string_view(""),
+ absl::string_view("Root element must be a message.")))
.With(Args<0>(HasObjectLocation("")));
ow_->RenderBool("", true);
CheckOutput(empty, 0);
@@ -1206,8 +1206,8 @@
Book empty;
EXPECT_CALL(listener_,
- InvalidName(_, StringPiece("oops"),
- StringPiece("Root element must be a message.")))
+ InvalidName(_, absl::string_view("oops"),
+ absl::string_view("Root element must be a message.")))
.With(Args<0>(HasObjectLocation("")));
ow_->RenderBool("oops", true);
CheckOutput(empty, 0);
@@ -1322,9 +1322,10 @@
EXPECT_CALL(
listener_,
InvalidValue(
- _, StringPiece("type.googleapis.com/google.protobuf.Timestamp"),
- StringPiece("Field 'ts', Invalid time format: "
- "2016-03-07T15:14:23+")));
+ _, absl::string_view("type.googleapis.com/google.protobuf.Timestamp"),
+ absl::string_view(
+ "Field 'ts', Illegal timestamp format; timestamps "
+ "must end with 'Z' or have a valid timezone offset.")));
ow_->StartObject("")->RenderString("ts", "2016-03-07T15:14:23+")->EndObject();
CheckOutput(timestamp);
@@ -1337,9 +1338,10 @@
EXPECT_CALL(
listener_,
InvalidValue(
- _, StringPiece("type.googleapis.com/google.protobuf.Timestamp"),
- StringPiece("Field 'ts', Invalid time format: "
- "2016-03-07T15:14:23+08-10")));
+ _, absl::string_view("type.googleapis.com/google.protobuf.Timestamp"),
+ absl::string_view(
+ "Field 'ts', Illegal timestamp format; timestamps "
+ "must end with 'Z' or have a valid timezone offset.")));
ow_->StartObject("")
->RenderString("ts", "2016-03-07T15:14:23+08-10")
@@ -1354,9 +1356,10 @@
EXPECT_CALL(
listener_,
InvalidValue(
- _, StringPiece("type.googleapis.com/google.protobuf.Timestamp"),
- StringPiece("Field 'ts', Invalid time format: "
- "2016-03-07T15:14:23+24:10")));
+ _, absl::string_view("type.googleapis.com/google.protobuf.Timestamp"),
+ absl::string_view(
+ "Field 'ts', Illegal timestamp format; timestamps "
+ "must end with 'Z' or have a valid timezone offset.")));
ow_->StartObject("")
->RenderString("ts", "2016-03-07T15:14:23+24:10")
@@ -1371,9 +1374,10 @@
EXPECT_CALL(
listener_,
InvalidValue(
- _, StringPiece("type.googleapis.com/google.protobuf.Timestamp"),
- StringPiece("Field 'ts', Invalid time format: "
- "2016-03-07T15:14:23+04:60")));
+ _, absl::string_view("type.googleapis.com/google.protobuf.Timestamp"),
+ absl::string_view(
+ "Field 'ts', Illegal timestamp format; timestamps "
+ "must end with 'Z' or have a valid timezone offset.")));
ow_->StartObject("")
->RenderString("ts", "2016-03-07T15:14:23+04:60")
@@ -1387,8 +1391,10 @@
EXPECT_CALL(
listener_,
InvalidValue(
- _, StringPiece("type.googleapis.com/google.protobuf.Timestamp"),
- StringPiece("Field 'ts', Invalid time format: ")));
+ _, absl::string_view("type.googleapis.com/google.protobuf.Timestamp"),
+ absl::string_view(
+ "Field 'ts', Illegal timestamp format; timestamps "
+ "must end with 'Z' or have a valid timezone offset.")));
ow_->StartObject("")->RenderString("ts", "")->EndObject();
CheckOutput(timestamp);
@@ -1400,8 +1406,9 @@
EXPECT_CALL(
listener_,
InvalidValue(
- _, StringPiece("type.googleapis.com/google.protobuf.Timestamp"),
- StringPiece("Field 'ts', Invalid time format: Z")));
+ _, absl::string_view("type.googleapis.com/google.protobuf.Timestamp"),
+ absl::string_view("Field 'ts', Invalid time format: Failed to "
+ "parse input")));
ow_->StartObject("")->RenderString("ts", "Z")->EndObject();
CheckOutput(timestamp);
@@ -1413,9 +1420,10 @@
EXPECT_CALL(
listener_,
InvalidValue(
- _, StringPiece("type.googleapis.com/google.protobuf.Timestamp"),
- StringPiece("Field 'ts', Invalid time format: "
- "1970-01-01T00:00:00.ABZ")));
+ _, absl::string_view("type.googleapis.com/google.protobuf.Timestamp"),
+ absl::string_view(
+ "Field 'ts', Invalid time format, failed to parse nano "
+ "seconds")));
ow_->StartObject("")
->RenderString("ts", "1970-01-01T00:00:00.ABZ")
@@ -1429,9 +1437,8 @@
EXPECT_CALL(
listener_,
InvalidValue(
- _, StringPiece("type.googleapis.com/google.protobuf.Timestamp"),
- StringPiece("Field 'ts', Invalid time format: "
- "-8031-10-18T00:00:00.000Z")));
+ _, absl::string_view("type.googleapis.com/google.protobuf.Timestamp"),
+ absl::string_view("Field 'ts', Timestamp value exceeds limits")));
ow_->StartObject("")
->RenderString("ts", "-8031-10-18T00:00:00.000Z")
@@ -1445,9 +1452,10 @@
EXPECT_CALL(
listener_,
InvalidValue(
- _, StringPiece("type.googleapis.com/google.protobuf.Timestamp"),
- StringPiece("Field 'ts', Invalid time format: "
- "2015-11-23T03:37:35.033155 Z")));
+ _, absl::string_view("type.googleapis.com/google.protobuf.Timestamp"),
+ absl::string_view(
+ "Field 'ts', Invalid time format, failed to parse nano "
+ "seconds")));
ow_->StartObject("")
// Whitespace in the Timestamp nanos is not allowed.
@@ -1462,9 +1470,10 @@
EXPECT_CALL(
listener_,
InvalidValue(
- _, StringPiece("type.googleapis.com/google.protobuf.Timestamp"),
- StringPiece("Field 'ts', Invalid time format: "
- "2015-11-23T03:37:35.033155 1234Z")));
+ _, absl::string_view("type.googleapis.com/google.protobuf.Timestamp"),
+ absl::string_view(
+ "Field 'ts', Invalid time format, failed to parse nano "
+ "seconds")));
ow_->StartObject("")
// Whitespace in the Timestamp nanos is not allowed.
@@ -1479,9 +1488,10 @@
EXPECT_CALL(
listener_,
InvalidValue(
- _, StringPiece("type.googleapis.com/google.protobuf.Timestamp"),
- StringPiece("Field 'ts', Invalid time format: "
- "2015-11-23T03:37:35.033abc155Z")));
+ _, absl::string_view("type.googleapis.com/google.protobuf.Timestamp"),
+ absl::string_view(
+ "Field 'ts', Invalid time format, failed to parse nano "
+ "seconds")));
ow_->StartObject("")
// Non-numeric characters in the Timestamp nanos is not allowed.
@@ -1496,9 +1506,8 @@
EXPECT_CALL(
listener_,
InvalidValue(
- _, StringPiece("type.googleapis.com/google.protobuf.Timestamp"),
- StringPiece("Field 'ts', Invalid time format: "
- "0-12-31T23:59:59.000Z")));
+ _, absl::string_view("type.googleapis.com/google.protobuf.Timestamp"),
+ absl::string_view("Field 'ts', Timestamp value exceeds limits")));
ow_->StartObject("")
->RenderString("ts", "0-12-31T23:59:59.000Z")
@@ -1522,8 +1531,8 @@
EXPECT_CALL(
listener_,
InvalidValue(
- _, StringPiece("type.googleapis.com/google.protobuf.Duration"),
- StringPiece(
+ _, absl::string_view("type.googleapis.com/google.protobuf.Duration"),
+ absl::string_view(
"Field 'dur', Illegal duration format; duration must "
"end with 's'")));
@@ -1537,8 +1546,8 @@
EXPECT_CALL(
listener_,
InvalidValue(
- _, StringPiece("type.googleapis.com/google.protobuf.Duration"),
- StringPiece(
+ _, absl::string_view("type.googleapis.com/google.protobuf.Duration"),
+ absl::string_view(
"Field 'dur', Invalid duration format, failed to parse "
"seconds")));
@@ -1552,8 +1561,8 @@
EXPECT_CALL(
listener_,
InvalidValue(
- _, StringPiece("type.googleapis.com/google.protobuf.Duration"),
- StringPiece("Field 'dur', Invalid duration format, failed to "
+ _, absl::string_view("type.googleapis.com/google.protobuf.Duration"),
+ absl::string_view("Field 'dur', Invalid duration format, failed to "
"parse nano seconds")));
ow_->StartObject("")->RenderString("dur", "123.DEFs")->EndObject();
@@ -1566,8 +1575,8 @@
EXPECT_CALL(
listener_,
InvalidValue(
- _, StringPiece("type.googleapis.com/google.protobuf.Duration"),
- StringPiece("Field 'dur', Duration value exceeds limits")));
+ _, absl::string_view("type.googleapis.com/google.protobuf.Duration"),
+ absl::string_view("Field 'dur', Duration value exceeds limits")));
ow_->StartObject("")->RenderString("dur", "315576000002s")->EndObject();
CheckOutput(duration);
@@ -1579,8 +1588,8 @@
EXPECT_CALL(
listener_,
InvalidValue(
- _, StringPiece("type.googleapis.com/google.protobuf.Duration"),
- StringPiece("Field 'dur', Duration value exceeds limits")));
+ _, absl::string_view("type.googleapis.com/google.protobuf.Duration"),
+ absl::string_view("Field 'dur', Duration value exceeds limits")));
ow_->StartObject("")->RenderString("dur", "0.1000000001s")->EndObject();
CheckOutput(duration);
@@ -1592,8 +1601,8 @@
EXPECT_CALL(
listener_,
InvalidValue(
- _, StringPiece("type.googleapis.com/google.protobuf.Timestamp"),
- StringPiece(
+ _, absl::string_view("type.googleapis.com/google.protobuf.Timestamp"),
+ absl::string_view(
"Field 'ts', Invalid data type for timestamp, value is 1")))
.With(Args<0>(HasObjectLocation("ts")));
ow_->StartObject("")->RenderInt32("ts", 1)->EndObject();
@@ -1606,8 +1615,8 @@
EXPECT_CALL(
listener_,
InvalidValue(
- _, StringPiece("type.googleapis.com/google.protobuf.Duration"),
- StringPiece(
+ _, absl::string_view("type.googleapis.com/google.protobuf.Duration"),
+ absl::string_view(
"Field 'dur', Invalid data type for duration, value is 1")))
.With(Args<0>(HasObjectLocation("dur")));
ow_->StartObject("")->RenderInt32("dur", 1)->EndObject();
@@ -1666,8 +1675,8 @@
TEST_P(ProtoStreamObjectWriterStructTest, StructNullInputSuccess) {
StructType struct_type;
EXPECT_CALL(listener_,
- InvalidName(_, StringPiece(""),
- StringPiece("Proto fields must have a name.")))
+ InvalidName(_, absl::string_view(""),
+ absl::string_view("Proto fields must have a name.")))
.With(Args<0>(HasObjectLocation("")));
ow_->StartObject("")->RenderNull("")->EndObject();
CheckOutput(struct_type);
@@ -1678,8 +1687,8 @@
EXPECT_CALL(
listener_,
InvalidValue(
- _, StringPiece("type.googleapis.com/google.protobuf.Struct"),
- StringPiece("true")))
+ _, absl::string_view("type.googleapis.com/google.protobuf.Struct"),
+ absl::string_view("true")))
.With(Args<0>(HasObjectLocation("object")));
ow_->StartObject("")->RenderBool("object", true)->EndObject();
@@ -1710,8 +1719,8 @@
TEST_P(ProtoStreamObjectWriterStructTest, SimpleRepeatedStructMapKeyTest) {
EXPECT_CALL(listener_,
- InvalidName(_, StringPiece("gBike"),
- StringPiece(
+ InvalidName(_, absl::string_view("gBike"),
+ absl::string_view(
"Repeated map key: 'gBike' is already set.")));
ow_->StartObject("")
->StartObject("object")
@@ -1724,8 +1733,8 @@
TEST_P(ProtoStreamObjectWriterStructTest, RepeatedStructMapListKeyTest) {
EXPECT_CALL(
listener_,
- InvalidName(_, StringPiece("k1"),
- StringPiece("Repeated map key: 'k1' is already set.")));
+ InvalidName(_, absl::string_view("k1"),
+ absl::string_view("Repeated map key: 'k1' is already set.")));
ow_->StartObject("")
->StartObject("object")
->RenderString("k1", "v1")
@@ -1739,8 +1748,8 @@
TEST_P(ProtoStreamObjectWriterStructTest, RepeatedStructMapObjectKeyTest) {
EXPECT_CALL(
listener_,
- InvalidName(_, StringPiece("k1"),
- StringPiece("Repeated map key: 'k1' is already set.")));
+ InvalidName(_, absl::string_view("k1"),
+ absl::string_view("Repeated map key: 'k1' is already set.")));
ow_->StartObject("")
->StartObject("object")
->StartObject("k1")
@@ -1842,8 +1851,8 @@
MapIn mm;
EXPECT_CALL(
listener_,
- InvalidValue(_, StringPiece("Map"),
- StringPiece(
+ InvalidValue(_, absl::string_view("Map"),
+ absl::string_view(
"Cannot bind a list to map for field 'map_input'.")));
ow_->StartObject("")
->StartList("map_input")
@@ -1886,8 +1895,8 @@
TEST_P(ProtoStreamObjectWriterMapTest, RepeatedMapKeyTest) {
EXPECT_CALL(
listener_,
- InvalidName(_, StringPiece("k1"),
- StringPiece("Repeated map key: 'k1' is already set.")));
+ InvalidName(_, absl::string_view("k1"),
+ absl::string_view("Repeated map key: 'k1' is already set.")));
ow_->StartObject("")
->RenderString("other", "test")
->StartObject("map_input")
@@ -2051,7 +2060,7 @@
}
// Same as TypeUrlAtEnd, but use temporary string values to make sure we don't
-// mistakenly store StringPiece objects pointing to invalid memory.
+// mistakenly store absl::string_view objects pointing to invalid memory.
TEST_P(ProtoStreamObjectWriterAnyTest, TypeUrlAtEndWithTemporaryStrings) {
Book book;
book.set_title("C++");
@@ -2120,8 +2129,8 @@
EXPECT_CALL(
listener_,
- InvalidValue(_, StringPiece("Any"),
- StringPiece("Missing @type for any field in "
+ InvalidValue(_, absl::string_view("Any"),
+ absl::string_view("Missing @type for any field in "
"proto_util_converter.testing.AnyOut")));
ow_->StartObject("")
@@ -2138,8 +2147,8 @@
EXPECT_CALL(
listener_,
- InvalidValue(_, StringPiece("Any"),
- StringPiece("Missing @type for any field in "
+ InvalidValue(_, absl::string_view("Any"),
+ absl::string_view("Missing @type for any field in "
"proto_util_converter.testing.AnyOut")));
ow_->StartObject("")
@@ -2156,8 +2165,8 @@
EXPECT_CALL(
listener_,
- InvalidValue(_, StringPiece("Any"),
- StringPiece("Missing @type for any field in "
+ InvalidValue(_, absl::string_view("Any"),
+ absl::string_view("Missing @type for any field in "
"proto_util_converter.testing.AnyOut")));
ow_->StartObject("")
@@ -2174,8 +2183,8 @@
EXPECT_CALL(
listener_,
InvalidValue(
- _, StringPiece("Any"),
- StringPiece("Invalid type URL, type URLs must be of the form "
+ _, absl::string_view("Any"),
+ absl::string_view("Invalid type URL, type URLs must be of the form "
"'type.googleapis.com/<typename>', got: "
"type.other.com/some.Type")));
@@ -2192,8 +2201,8 @@
AnyOut any;
EXPECT_CALL(listener_,
- InvalidValue(_, StringPiece("Any"),
- StringPiece(
+ InvalidValue(_, absl::string_view("Any"),
+ absl::string_view(
"Invalid type URL, unknown type: some.Type")));
ow_->StartObject("")
->StartObject("any")
@@ -2210,8 +2219,8 @@
EXPECT_CALL(
listener_,
InvalidValue(_,
- StringPiece("type.googleapis.com/google.protobuf.Any"),
- StringPiece("1")));
+ absl::string_view("type.googleapis.com/google.protobuf.Any"),
+ absl::string_view("1")));
ow_->StartObject("")->RenderInt32("any", 1)->EndObject();
CheckOutput(any);
}
@@ -2225,8 +2234,12 @@
}
TEST_P(ProtoStreamObjectWriterAnyTest, AnyWellKnownTypeErrorTest) {
- EXPECT_CALL(listener_, InvalidValue(_, StringPiece("Any"),
- StringPiece("Invalid time format: ")));
+ EXPECT_CALL(listener_,
+ InvalidValue(_, absl::string_view("Any"),
+ absl::string_view("Illegal timestamp format; "
+ "timestamps must end with "
+ "'Z' or have a valid "
+ "timezone offset.")));
AnyOut any;
google::protobuf::Any* any_type = any.mutable_any();
@@ -2337,8 +2350,8 @@
EXPECT_CALL(
listener_,
InvalidValue(
- _, StringPiece("Any"),
- StringPiece("Expect a \"value\" field for well-known types.")));
+ _, absl::string_view("Any"),
+ absl::string_view("Expect a \"value\" field for well-known types.")));
AnyOut any;
google::protobuf::Any* any_type = any.mutable_any();
any_type->set_type_url("type.googleapis.com/google.protobuf.Value");
@@ -2364,8 +2377,8 @@
EXPECT_CALL(
listener_,
InvalidValue(
- _, StringPiece("Any"),
- StringPiece("Expect a \"value\" field for well-known types.")));
+ _, absl::string_view("Any"),
+ absl::string_view("Expect a \"value\" field for well-known types.")));
AnyOut any;
google::protobuf::Any* any_type = any.mutable_any();
any_type->set_type_url("type.googleapis.com/google.protobuf.Value");
@@ -2392,8 +2405,8 @@
EXPECT_CALL(
listener_,
InvalidValue(
- _, StringPiece("Any"),
- StringPiece("Expect a \"value\" field for well-known types.")));
+ _, absl::string_view("Any"),
+ absl::string_view("Expect a \"value\" field for well-known types.")));
AnyOut any;
google::protobuf::Any* any_type = any.mutable_any();
any_type->set_type_url("type.googleapis.com/google.protobuf.Value");
@@ -2419,8 +2432,8 @@
// }
TEST_P(ProtoStreamObjectWriterAnyTest, AnyWellKnownTypesExpectObjectForStruct) {
EXPECT_CALL(listener_,
- InvalidValue(_, StringPiece("Any"),
- StringPiece("Expect a JSON object.")));
+ InvalidValue(_, absl::string_view("Any"),
+ absl::string_view("Expect a JSON object.")));
AnyOut any;
google::protobuf::Any* any_type = any.mutable_any();
any_type->set_type_url("type.googleapis.com/google.protobuf.Struct");
@@ -2444,8 +2457,8 @@
// }
TEST_P(ProtoStreamObjectWriterAnyTest, AnyWellKnownTypesExpectObjectForAny) {
EXPECT_CALL(listener_,
- InvalidValue(_, StringPiece("Any"),
- StringPiece("Expect a JSON object.")));
+ InvalidValue(_, absl::string_view("Any"),
+ absl::string_view("Expect a JSON object.")));
AnyOut any;
google::protobuf::Any* any_type = any.mutable_any();
any_type->set_type_url("type.googleapis.com/google.protobuf.Any");
@@ -2704,8 +2717,8 @@
EXPECT_CALL(
listener_,
InvalidValue(
- _, StringPiece("type.googleapis.com/google.protobuf.FieldMask"),
- StringPiece("Field 'single_mask', Invalid FieldMask 'a(b,c))'. "
+ _, absl::string_view("type.googleapis.com/google.protobuf.FieldMask"),
+ absl::string_view("Field 'single_mask', Invalid FieldMask 'a(b,c))'. "
"Cannot find matching '(' for all ')'.")));
ow_->StartObject("");
@@ -2718,8 +2731,8 @@
EXPECT_CALL(
listener_,
InvalidValue(
- _, StringPiece("type.googleapis.com/google.protobuf.FieldMask"),
- StringPiece(
+ _, absl::string_view("type.googleapis.com/google.protobuf.FieldMask"),
+ absl::string_view(
"Field 'single_mask', Invalid FieldMask 'a(((b,c)'. Cannot "
"find matching ')' for all '('.")));
@@ -2750,8 +2763,8 @@
EXPECT_CALL(
listener_,
InvalidValue(
- _, StringPiece("type.googleapis.com/google.protobuf.FieldMask"),
- StringPiece(
+ _, absl::string_view("type.googleapis.com/google.protobuf.FieldMask"),
+ absl::string_view(
"Field 'single_mask', Invalid FieldMask "
"'path.to.map[\"key1\"]a,path.to.map[\"key2\"]'. "
"Map keys should be at the end of a path segment.")));
@@ -2766,8 +2779,8 @@
EXPECT_CALL(
listener_,
InvalidValue(
- _, StringPiece("type.googleapis.com/google.protobuf.FieldMask"),
- StringPiece("Field 'single_mask', Invalid FieldMask "
+ _, absl::string_view("type.googleapis.com/google.protobuf.FieldMask"),
+ absl::string_view("Field 'single_mask', Invalid FieldMask "
"'path.to.map[\"key1\"'. Map keys should be "
"represented as [\"some_key\"].")));
@@ -2780,8 +2793,8 @@
EXPECT_CALL(
listener_,
InvalidValue(
- _, StringPiece("type.googleapis.com/google.protobuf.FieldMask"),
- StringPiece("Field 'single_mask', Invalid FieldMask "
+ _, absl::string_view("type.googleapis.com/google.protobuf.FieldMask"),
+ absl::string_view("Field 'single_mask', Invalid FieldMask "
"'path.to.map[\"ke\"y1\"]'. Map keys should be "
"represented as [\"some_key\"].")));
@@ -2861,8 +2874,8 @@
EXPECT_CALL(
listener_,
InvalidValue(
- _, StringPiece("oneof"),
- StringPiece(
+ _, absl::string_view("oneof"),
+ absl::string_view(
"oneof field 'data' is already set. Cannot set 'intData'")));
ow_->StartObject("");
@@ -2874,8 +2887,8 @@
TEST_P(ProtoStreamObjectWriterOneOfsTest,
MultipleOneofsFailForMessageTypesPrimitiveFirstTest) {
// Test for setting primitive oneof field first and then message field.
- EXPECT_CALL(listener_, InvalidValue(_, StringPiece("oneof"),
- StringPiece(
+ EXPECT_CALL(listener_, InvalidValue(_, absl::string_view("oneof"),
+ absl::string_view(
"oneof field 'data' is already set. "
"Cannot set 'messageData'")));
@@ -2891,8 +2904,8 @@
TEST_P(ProtoStreamObjectWriterOneOfsTest,
MultipleOneofsFailForMessageTypesMessageFirstTest) {
// Test for setting message oneof field first and then primitive field.
- EXPECT_CALL(listener_, InvalidValue(_, StringPiece("oneof"),
- StringPiece(
+ EXPECT_CALL(listener_, InvalidValue(_, absl::string_view("oneof"),
+ absl::string_view(
"oneof field 'data' is already set. "
"Cannot set 'strData'")));
@@ -2907,8 +2920,8 @@
TEST_P(ProtoStreamObjectWriterOneOfsTest,
MultipleOneofsFailForStructTypesPrimitiveFirstTest) {
- EXPECT_CALL(listener_, InvalidValue(_, StringPiece("oneof"),
- StringPiece(
+ EXPECT_CALL(listener_, InvalidValue(_, absl::string_view("oneof"),
+ absl::string_view(
"oneof field 'data' is already set. "
"Cannot set 'structData'")));
@@ -2923,8 +2936,8 @@
TEST_P(ProtoStreamObjectWriterOneOfsTest,
MultipleOneofsFailForStructTypesStructFirstTest) {
- EXPECT_CALL(listener_, InvalidValue(_, StringPiece("oneof"),
- StringPiece(
+ EXPECT_CALL(listener_, InvalidValue(_, absl::string_view("oneof"),
+ absl::string_view(
"oneof field 'data' is already set. "
"Cannot set 'strData'")));
@@ -2939,8 +2952,8 @@
TEST_P(ProtoStreamObjectWriterOneOfsTest,
MultipleOneofsFailForStructValueTypesTest) {
- EXPECT_CALL(listener_, InvalidValue(_, StringPiece("oneof"),
- StringPiece(
+ EXPECT_CALL(listener_, InvalidValue(_, absl::string_view("oneof"),
+ absl::string_view(
"oneof field 'data' is already set. "
"Cannot set 'valueData'")));
@@ -2957,8 +2970,8 @@
TEST_P(ProtoStreamObjectWriterOneOfsTest,
MultipleOneofsFailForWellKnownTypesPrimitiveFirstTest) {
- EXPECT_CALL(listener_, InvalidValue(_, StringPiece("oneof"),
- StringPiece(
+ EXPECT_CALL(listener_, InvalidValue(_, absl::string_view("oneof"),
+ absl::string_view(
"oneof field 'data' is already set. "
"Cannot set 'tsData'")));
@@ -2971,8 +2984,8 @@
TEST_P(ProtoStreamObjectWriterOneOfsTest,
MultipleOneofsFailForWellKnownTypesWktFirstTest) {
- EXPECT_CALL(listener_, InvalidValue(_, StringPiece("oneof"),
- StringPiece(
+ EXPECT_CALL(listener_, InvalidValue(_, absl::string_view("oneof"),
+ absl::string_view(
"oneof field 'data' is already set. "
"Cannot set 'intData'")));
@@ -2985,8 +2998,8 @@
TEST_P(ProtoStreamObjectWriterOneOfsTest,
MultipleOneofsFailForWellKnownTypesAndMessageTest) {
- EXPECT_CALL(listener_, InvalidValue(_, StringPiece("oneof"),
- StringPiece(
+ EXPECT_CALL(listener_, InvalidValue(_, absl::string_view("oneof"),
+ absl::string_view(
"oneof field 'data' is already set. "
"Cannot set 'messageData'")));
@@ -3002,8 +3015,8 @@
TEST_P(ProtoStreamObjectWriterOneOfsTest,
MultipleOneofsFailForOneofWithinAnyTest) {
- EXPECT_CALL(listener_, InvalidValue(_, StringPiece("oneof"),
- StringPiece(
+ EXPECT_CALL(listener_, InvalidValue(_, absl::string_view("oneof"),
+ absl::string_view(
"oneof field 'data' is already set. "
"Cannot set 'intData'")));
diff --git a/src/google/protobuf/util/internal/structured_objectwriter.h b/src/google/protobuf/util/internal/structured_objectwriter.h
index f6f7c89..9fe59e3 100644
--- a/src/google/protobuf/util/internal/structured_objectwriter.h
+++ b/src/google/protobuf/util/internal/structured_objectwriter.h
@@ -33,12 +33,12 @@
#include <memory>
-#include <google/protobuf/stubs/casts.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/util/internal/object_writer.h>
+#include "absl/base/casts.h"
+#include "google/protobuf/port.h"
+#include "google/protobuf/util/internal/object_writer.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -58,6 +58,8 @@
// Derived classes could be thread-unsafe.
class PROTOBUF_EXPORT StructuredObjectWriter : public ObjectWriter {
public:
+ StructuredObjectWriter(const StructuredObjectWriter&) = delete;
+ StructuredObjectWriter& operator=(const StructuredObjectWriter&) = delete;
~StructuredObjectWriter() override {}
protected:
@@ -72,12 +74,15 @@
explicit BaseElement(BaseElement* parent)
: parent_(parent),
level_(parent == nullptr ? 0 : parent->level() + 1) {}
+ BaseElement() = delete;
+ BaseElement(const BaseElement&) = delete;
+ BaseElement& operator=(const BaseElement&) = delete;
virtual ~BaseElement() {}
// Releases ownership of the parent and returns a pointer to it.
template <typename ElementType>
ElementType* pop() {
- return down_cast<ElementType*>(parent_.release());
+ return google::protobuf::internal::DownCast<ElementType*>(parent_.release());
}
// Returns true if this element is the root.
@@ -97,8 +102,6 @@
// Number of hops to the root Element.
// The root Element has nullptr parent_ and a level_ of 0.
const int level_;
-
- GOOGLE_DISALLOW_IMPLICIT_CONSTRUCTORS(BaseElement);
};
StructuredObjectWriter() {}
@@ -108,7 +111,6 @@
private:
// Do not add any data members to this class.
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(StructuredObjectWriter);
};
} // namespace converter
@@ -116,6 +118,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_UTIL_INTERNAL_STRUCTURED_OBJECTWRITER_H__
diff --git a/src/google/protobuf/util/internal/type_info.cc b/src/google/protobuf/util/internal/type_info.cc
index b6cf536..927fb93 100644
--- a/src/google/protobuf/util/internal/type_info.cc
+++ b/src/google/protobuf/util/internal/type_info.cc
@@ -28,19 +28,16 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/util/internal/type_info.h>
+#include "google/protobuf/util/internal/type_info.h"
#include <map>
#include <set>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/type.pb.h>
-#include <google/protobuf/stubs/status.h>
-#include <google/protobuf/stubs/statusor.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/util/internal/utility.h>
-#include <google/protobuf/stubs/map_util.h>
-#include <google/protobuf/stubs/status.h>
+#include "google/protobuf/type.pb.h"
+#include "absl/status/status.h"
+#include "absl/status/statusor.h"
+#include "absl/strings/string_view.h"
+#include "google/protobuf/util/internal/utility.h"
namespace google {
namespace protobuf {
@@ -59,19 +56,18 @@
DeleteCachedTypes(&cached_enums_);
}
- util::StatusOr<const google::protobuf::Type*> ResolveTypeUrl(
- StringPiece type_url) const override {
- std::map<StringPiece, StatusOrType>::iterator it =
- cached_types_.find(type_url);
+ absl::StatusOr<const google::protobuf::Type*> ResolveTypeUrl(
+ absl::string_view type_url) const override {
+ auto it = cached_types_.find(type_url);
if (it != cached_types_.end()) {
return it->second;
}
- // Stores the string value so it can be referenced using StringPiece in the
- // cached_types_ map.
+ // Stores the string value so it can be referenced using absl::string_view
+ // in the cached_types_ map.
const std::string& string_type_url =
*string_storage_.insert(std::string(type_url)).first;
std::unique_ptr<google::protobuf::Type> type(new google::protobuf::Type());
- util::Status status =
+ absl::Status status =
type_resolver_->ResolveMessageType(string_type_url, type.get());
StatusOrType result =
status.ok() ? StatusOrType(type.release()) : StatusOrType(status);
@@ -80,25 +76,25 @@
}
const google::protobuf::Type* GetTypeByTypeUrl(
- StringPiece type_url) const override {
+ absl::string_view type_url) const override {
StatusOrType result = ResolveTypeUrl(type_url);
return result.ok() ? result.value() : NULL;
}
const google::protobuf::Enum* GetEnumByTypeUrl(
- StringPiece type_url) const override {
- std::map<StringPiece, StatusOrEnum>::iterator it =
+ absl::string_view type_url) const override {
+ std::map<absl::string_view, StatusOrEnum>::iterator it =
cached_enums_.find(type_url);
if (it != cached_enums_.end()) {
return it->second.ok() ? it->second.value() : NULL;
}
- // Stores the string value so it can be referenced using StringPiece in the
- // cached_enums_ map.
+ // Stores the string value so it can be referenced using absl::string_view
+ // in the cached_enums_ map.
const std::string& string_type_url =
*string_storage_.insert(std::string(type_url)).first;
std::unique_ptr<google::protobuf::Enum> enum_type(
new google::protobuf::Enum());
- util::Status status =
+ absl::Status status =
type_resolver_->ResolveEnumType(string_type_url, enum_type.get());
StatusOrEnum result =
status.ok() ? StatusOrEnum(enum_type.release()) : StatusOrEnum(status);
@@ -108,30 +104,29 @@
const google::protobuf::Field* FindField(
const google::protobuf::Type* type,
- StringPiece camel_case_name) const override {
- std::map<const google::protobuf::Type*, CamelCaseNameTable>::const_iterator
- it = indexed_types_.find(type);
+ absl::string_view camel_case_name) const override {
+ auto it = indexed_types_.find(type);
const CamelCaseNameTable& camel_case_name_table =
- (it == indexed_types_.end())
+ it == indexed_types_.end()
? PopulateNameLookupTable(type, &indexed_types_[type])
: it->second;
- StringPiece name = FindWithDefault(
- camel_case_name_table, camel_case_name, StringPiece());
- if (name.empty()) {
- // Didn't find a mapping. Use whatever provided.
- name = camel_case_name;
+
+ absl::string_view name = camel_case_name;
+ auto cc_it = camel_case_name_table.find(name);
+ if (cc_it != camel_case_name_table.end()) {
+ name = cc_it->second;
}
return FindFieldInTypeOrNull(type, name);
}
private:
- typedef util::StatusOr<const google::protobuf::Type*> StatusOrType;
- typedef util::StatusOr<const google::protobuf::Enum*> StatusOrEnum;
- typedef std::map<StringPiece, StringPiece> CamelCaseNameTable;
+ typedef absl::StatusOr<const google::protobuf::Type*> StatusOrType;
+ typedef absl::StatusOr<const google::protobuf::Enum*> StatusOrEnum;
+ typedef std::map<absl::string_view, absl::string_view> CamelCaseNameTable;
template <typename T>
- static void DeleteCachedTypes(std::map<StringPiece, T>* cached_types) {
- for (typename std::map<StringPiece, T>::iterator it =
+ static void DeleteCachedTypes(std::map<absl::string_view, T>* cached_types) {
+ for (typename std::map<absl::string_view, T>::iterator it =
cached_types->begin();
it != cached_types->end(); ++it) {
if (it->second.ok()) {
@@ -145,14 +140,13 @@
CamelCaseNameTable* camel_case_name_table) const {
for (int i = 0; i < type->fields_size(); ++i) {
const google::protobuf::Field& field = type->fields(i);
- StringPiece name = field.name();
- StringPiece camel_case_name = field.json_name();
- const StringPiece* existing = InsertOrReturnExisting(
- camel_case_name_table, camel_case_name, name);
- if (existing && *existing != name) {
- GOOGLE_LOG(WARNING) << "Field '" << name << "' and '" << *existing
- << "' map to the same camel case name '" << camel_case_name
- << "'.";
+ absl::string_view existing =
+ camel_case_name_table->insert({field.json_name(), field.name()})
+ .first->second;
+ if (existing != field.name()) {
+ GOOGLE_LOG(WARNING) << "Field '" << field.name() << "' and '" << existing
+ << "' map to the same camel case name '"
+ << field.json_name() << "'.";
}
}
return *camel_case_name_table;
@@ -164,8 +158,8 @@
// cached_types_, cached_enums_.
mutable std::set<std::string> string_storage_;
- mutable std::map<StringPiece, StatusOrType> cached_types_;
- mutable std::map<StringPiece, StatusOrEnum> cached_enums_;
+ mutable std::map<absl::string_view, StatusOrType> cached_types_;
+ mutable std::map<absl::string_view, StatusOrEnum> cached_enums_;
mutable std::map<const google::protobuf::Type*, CamelCaseNameTable>
indexed_types_;
diff --git a/src/google/protobuf/util/internal/type_info.h b/src/google/protobuf/util/internal/type_info.h
index 257df5b..801bfba 100644
--- a/src/google/protobuf/util/internal/type_info.h
+++ b/src/google/protobuf/util/internal/type_info.h
@@ -31,15 +31,16 @@
#ifndef GOOGLE_PROTOBUF_UTIL_INTERNAL_TYPE_INFO_H__
#define GOOGLE_PROTOBUF_UTIL_INTERNAL_TYPE_INFO_H__
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/type.pb.h>
-#include <google/protobuf/stubs/statusor.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/util/type_resolver.h>
-#include <google/protobuf/stubs/status.h>
+#include "google/protobuf/type.pb.h"
+#include "absl/status/status.h"
+#include "absl/status/statusor.h"
+#include "absl/strings/string_view.h"
+#include "google/protobuf/port.h"
+#include "google/protobuf/util/type_resolver.h"
+
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -50,6 +51,8 @@
class PROTOBUF_EXPORT TypeInfo {
public:
TypeInfo() {}
+ TypeInfo(const TypeInfo&) = delete;
+ TypeInfo& operator=(const TypeInfo&) = delete;
virtual ~TypeInfo() {}
// Resolves a type url into a Type. If the type url is invalid, returns
@@ -57,34 +60,31 @@
// corresponding type cannot be found, returns a NOT_FOUND error status.
//
// This TypeInfo class retains the ownership of the returned pointer.
- virtual util::StatusOr<const google::protobuf::Type*> ResolveTypeUrl(
- StringPiece type_url) const = 0;
+ virtual absl::StatusOr<const google::protobuf::Type*> ResolveTypeUrl(
+ absl::string_view type_url) const = 0;
// Resolves a type url into a Type. Like ResolveTypeUrl() but returns
// NULL if the type url is invalid or the type cannot be found.
//
// This TypeInfo class retains the ownership of the returned pointer.
virtual const google::protobuf::Type* GetTypeByTypeUrl(
- StringPiece type_url) const = 0;
+ absl::string_view type_url) const = 0;
// Resolves a type url for an enum. Returns NULL if the type url is
// invalid or the type cannot be found.
//
// This TypeInfo class retains the ownership of the returned pointer.
virtual const google::protobuf::Enum* GetEnumByTypeUrl(
- StringPiece type_url) const = 0;
+ absl::string_view type_url) const = 0;
// Looks up a field in the specified type given a CamelCase name.
virtual const google::protobuf::Field* FindField(
const google::protobuf::Type* type,
- StringPiece camel_case_name) const = 0;
+ absl::string_view camel_case_name) const = 0;
// Creates a TypeInfo object that looks up type information from a
// TypeResolver. Caller takes ownership of the returned pointer.
static TypeInfo* NewTypeInfo(TypeResolver* type_resolver);
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TypeInfo);
};
} // namespace converter
@@ -92,6 +92,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_UTIL_INTERNAL_TYPE_INFO_H__
diff --git a/src/google/protobuf/util/internal/type_info_test_helper.cc b/src/google/protobuf/util/internal/type_info_test_helper.cc
index 088f412..e73efae 100644
--- a/src/google/protobuf/util/internal/type_info_test_helper.cc
+++ b/src/google/protobuf/util/internal/type_info_test_helper.cc
@@ -28,21 +28,21 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/util/internal/type_info_test_helper.h>
+#include "google/protobuf/util/internal/type_info_test_helper.h"
#include <memory>
#include <vector>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/util/internal/constants.h>
-#include <google/protobuf/util/internal/default_value_objectwriter.h>
-#include <google/protobuf/util/internal/protostream_objectsource.h>
-#include <google/protobuf/util/internal/protostream_objectwriter.h>
-#include <google/protobuf/util/internal/type_info.h>
-#include <google/protobuf/util/type_resolver.h>
-#include <google/protobuf/util/type_resolver_util.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/util/internal/constants.h"
+#include "google/protobuf/util/internal/default_value_objectwriter.h"
+#include "google/protobuf/util/internal/protostream_objectsource.h"
+#include "google/protobuf/util/internal/protostream_objectwriter.h"
+#include "google/protobuf/util/internal/type_info.h"
+#include "google/protobuf/util/type_resolver.h"
+#include "google/protobuf/util/type_resolver_util.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/util/internal/type_info_test_helper.h b/src/google/protobuf/util/internal/type_info_test_helper.h
index 1110a34..9999c2c 100644
--- a/src/google/protobuf/util/internal/type_info_test_helper.h
+++ b/src/google/protobuf/util/internal/type_info_test_helper.h
@@ -34,13 +34,13 @@
#include <memory>
#include <vector>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/util/internal/default_value_objectwriter.h>
-#include <google/protobuf/util/internal/protostream_objectsource.h>
-#include <google/protobuf/util/internal/protostream_objectwriter.h>
-#include <google/protobuf/util/internal/type_info.h>
-#include <google/protobuf/util/type_resolver.h>
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/util/internal/default_value_objectwriter.h"
+#include "google/protobuf/util/internal/protostream_objectsource.h"
+#include "google/protobuf/util/internal/protostream_objectwriter.h"
+#include "google/protobuf/util/internal/type_info.h"
+#include "google/protobuf/util/type_resolver.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/util/internal/utility.cc b/src/google/protobuf/util/internal/utility.cc
index 918ee17..c2488e8 100644
--- a/src/google/protobuf/util/internal/utility.cc
+++ b/src/google/protobuf/util/internal/utility.cc
@@ -28,26 +28,30 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/util/internal/utility.h>
+#include "google/protobuf/util/internal/utility.h"
#include <algorithm>
#include <cmath>
#include <cstdint>
+#include <iterator>
#include <limits>
-#include <google/protobuf/stubs/callback.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/wrappers.pb.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/util/internal/constants.h>
-#include <google/protobuf/stubs/map_util.h>
+#include "google/protobuf/stubs/callback.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/wrappers.pb.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "absl/container/flat_hash_set.h"
+#include "absl/strings/ascii.h"
+#include "absl/strings/match.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/string_view.h"
+#include "google/protobuf/util/internal/constants.h"
-// clang-format off
-#include <google/protobuf/port_def.inc>
-// clang-format on
+// must be last
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -56,7 +60,7 @@
bool GetBoolOptionOrDefault(
const RepeatedPtrField<google::protobuf::Option>& options,
- StringPiece option_name, bool default_value) {
+ absl::string_view option_name, bool default_value) {
const google::protobuf::Option* opt = FindOptionOrNull(options, option_name);
if (opt == nullptr) {
return default_value;
@@ -66,7 +70,7 @@
int64_t GetInt64OptionOrDefault(
const RepeatedPtrField<google::protobuf::Option>& options,
- StringPiece option_name, int64_t default_value) {
+ absl::string_view option_name, int64_t default_value) {
const google::protobuf::Option* opt = FindOptionOrNull(options, option_name);
if (opt == nullptr) {
return default_value;
@@ -76,7 +80,7 @@
double GetDoubleOptionOrDefault(
const RepeatedPtrField<google::protobuf::Option>& options,
- StringPiece option_name, double default_value) {
+ absl::string_view option_name, double default_value) {
const google::protobuf::Option* opt = FindOptionOrNull(options, option_name);
if (opt == nullptr) {
return default_value;
@@ -86,7 +90,7 @@
std::string GetStringOptionOrDefault(
const RepeatedPtrField<google::protobuf::Option>& options,
- StringPiece option_name, StringPiece default_value) {
+ absl::string_view option_name, absl::string_view default_value) {
const google::protobuf::Option* opt = FindOptionOrNull(options, option_name);
if (opt == nullptr) {
return std::string(default_value);
@@ -125,7 +129,7 @@
return s.value();
}
-const StringPiece GetTypeWithoutUrl(StringPiece type_url) {
+absl::string_view GetTypeWithoutUrl(absl::string_view type_url) {
if (type_url.size() > kTypeUrlSize && type_url[kTypeUrlSize] == '/') {
return type_url.substr(kTypeUrlSize + 1);
} else {
@@ -137,13 +141,13 @@
}
}
-const std::string GetFullTypeWithUrl(StringPiece simple_type) {
- return StrCat(kTypeServiceBaseUrl, "/", simple_type);
+std::string GetFullTypeWithUrl(absl::string_view simple_type) {
+ return absl::StrCat(kTypeServiceBaseUrl, "/", simple_type);
}
const google::protobuf::Option* FindOptionOrNull(
const RepeatedPtrField<google::protobuf::Option>& options,
- StringPiece option_name) {
+ absl::string_view option_name) {
for (int i = 0; i < options.size(); ++i) {
const google::protobuf::Option& opt = options.Get(i);
if (opt.name() == option_name) {
@@ -154,7 +158,7 @@
}
const google::protobuf::Field* FindFieldInTypeOrNull(
- const google::protobuf::Type* type, StringPiece field_name) {
+ const google::protobuf::Type* type, absl::string_view field_name) {
if (type != nullptr) {
for (int i = 0; i < type->fields_size(); ++i) {
const google::protobuf::Field& field = type->fields(i);
@@ -167,7 +171,7 @@
}
const google::protobuf::Field* FindJsonFieldInTypeOrNull(
- const google::protobuf::Type* type, StringPiece json_name) {
+ const google::protobuf::Type* type, absl::string_view json_name) {
if (type != nullptr) {
for (int i = 0; i < type->fields_size(); ++i) {
const google::protobuf::Field& field = type->fields(i);
@@ -193,7 +197,7 @@
}
const google::protobuf::EnumValue* FindEnumValueByNameOrNull(
- const google::protobuf::Enum* enum_type, StringPiece enum_name) {
+ const google::protobuf::Enum* enum_type, absl::string_view enum_name) {
if (enum_type != nullptr) {
for (int i = 0; i < enum_type->enumvalue_size(); ++i) {
const google::protobuf::EnumValue& enum_value = enum_type->enumvalue(i);
@@ -219,7 +223,7 @@
}
const google::protobuf::EnumValue* FindEnumValueByNameWithoutUnderscoreOrNull(
- const google::protobuf::Enum* enum_type, StringPiece enum_name) {
+ const google::protobuf::Enum* enum_type, absl::string_view enum_name) {
if (enum_type != nullptr) {
for (int i = 0; i < enum_type->enumvalue_size(); ++i) {
const google::protobuf::EnumValue& enum_value = enum_type->enumvalue(i);
@@ -233,7 +237,7 @@
// Make the name uppercase.
for (std::string::iterator it = enum_name_without_underscore.begin();
it != enum_name_without_underscore.end(); ++it) {
- *it = ascii_toupper(*it);
+ *it = absl::ascii_toupper(*it);
}
if (enum_name_without_underscore == enum_name) {
@@ -244,14 +248,11 @@
return nullptr;
}
-std::string EnumValueNameToLowerCamelCase(StringPiece input) {
- std::string input_string(input);
- std::transform(input_string.begin(), input_string.end(), input_string.begin(),
- ::tolower);
- return ToCamelCase(input_string);
+std::string EnumValueNameToLowerCamelCase(absl::string_view input) {
+ return ToCamelCase(absl::AsciiStrToLower(input));
}
-std::string ToCamelCase(StringPiece input) {
+std::string ToCamelCase(absl::string_view input) {
bool capitalize_next = false;
bool was_cap = true;
bool is_cap = false;
@@ -260,7 +261,7 @@
result.reserve(input.size());
for (size_t i = 0; i < input.size(); ++i, was_cap = is_cap) {
- is_cap = ascii_isupper(input[i]);
+ is_cap = absl::ascii_isupper(input[i]);
if (input[i] == '_') {
capitalize_next = true;
if (!result.empty()) first_word = false;
@@ -272,37 +273,37 @@
// 2) followed by a lowercase: "...ABc..."
if (!result.empty() && is_cap &&
(!was_cap ||
- (i + 1 < input.size() && ascii_islower(input[i + 1])))) {
+ (i + 1 < input.size() && absl::ascii_islower(input[i + 1])))) {
first_word = false;
result.push_back(input[i]);
} else {
- result.push_back(ascii_tolower(input[i]));
+ result.push_back(absl::ascii_tolower(input[i]));
continue;
}
} else if (capitalize_next) {
capitalize_next = false;
- if (ascii_islower(input[i])) {
- result.push_back(ascii_toupper(input[i]));
+ if (absl::ascii_islower(input[i])) {
+ result.push_back(absl::ascii_toupper(input[i]));
continue;
} else {
result.push_back(input[i]);
continue;
}
} else {
- result.push_back(ascii_tolower(input[i]));
+ result.push_back(absl::ascii_tolower(input[i]));
}
}
return result;
}
-std::string ToSnakeCase(StringPiece input) {
+std::string ToSnakeCase(absl::string_view input) {
bool was_not_underscore = false; // Initialize to false for case 1 (below)
bool was_not_cap = false;
std::string result;
result.reserve(input.size() << 1);
for (size_t i = 0; i < input.size(); ++i) {
- if (ascii_isupper(input[i])) {
+ if (absl::ascii_isupper(input[i])) {
// Consider when the current character B is capitalized:
// 1) At beginning of input: "B..." => "b..."
// (e.g. "Biscuit" => "biscuit")
@@ -315,11 +316,11 @@
if (was_not_underscore && // case 1 out
(was_not_cap || // case 2 in, case 3 out
(i + 1 < input.size() && // case 3 out
- ascii_islower(input[i + 1])))) { // case 4 in
+ absl::ascii_islower(input[i + 1])))) { // case 4 in
// We add an underscore for case 2 and case 4.
result.push_back('_');
}
- result.push_back(ascii_tolower(input[i]));
+ result.push_back(absl::ascii_tolower(input[i]));
was_not_underscore = true;
was_not_cap = false;
} else {
@@ -331,8 +332,8 @@
return result;
}
-std::set<std::string>* well_known_types_ = nullptr;
-PROTOBUF_NAMESPACE_ID::internal::once_flag well_known_types_init_;
+absl::flat_hash_set<absl::string_view>* well_known_types_ = nullptr;
+absl::once_flag well_known_types_init_;
const char* well_known_types_name_array_[] = {
"google.protobuf.Timestamp", "google.protobuf.Duration",
"google.protobuf.DoubleValue", "google.protobuf.FloatValue",
@@ -344,20 +345,18 @@
void DeleteWellKnownTypes() { delete well_known_types_; }
void InitWellKnownTypes() {
- well_known_types_ = new std::set<std::string>;
- for (int i = 0; i < GOOGLE_ARRAYSIZE(well_known_types_name_array_); ++i) {
- well_known_types_->insert(well_known_types_name_array_[i]);
- }
+ well_known_types_ = new absl::flat_hash_set<absl::string_view>(
+ std::begin(well_known_types_name_array_),
+ std::end(well_known_types_name_array_));
google::protobuf::internal::OnShutdown(&DeleteWellKnownTypes);
}
bool IsWellKnownType(const std::string& type_name) {
- PROTOBUF_NAMESPACE_ID::internal::call_once(well_known_types_init_,
- InitWellKnownTypes);
- return ContainsKey(*well_known_types_, type_name);
+ absl::call_once(well_known_types_init_, InitWellKnownTypes);
+ return well_known_types_->contains(type_name);
}
-bool IsValidBoolString(StringPiece bool_string) {
+bool IsValidBoolString(absl::string_view bool_string) {
return bool_string == "true" || bool_string == "false" ||
bool_string == "1" || bool_string == "0";
}
@@ -392,7 +391,7 @@
return DoubleAsString(value);
}
-bool SafeStrToFloat(StringPiece str, float* value) {
+bool SafeStrToFloat(absl::string_view str, float* value) {
double double_value;
if (!safe_strtod(str, &double_value)) {
return false;
diff --git a/src/google/protobuf/util/internal/utility.h b/src/google/protobuf/util/internal/utility.h
index 79d6779..552873d 100644
--- a/src/google/protobuf/util/internal/utility.h
+++ b/src/google/protobuf/util/internal/utility.h
@@ -36,17 +36,20 @@
#include <string>
#include <utility>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/any.pb.h>
-#include <google/protobuf/type.pb.h>
-#include <google/protobuf/repeated_field.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/statusor.h>
-#include <google/protobuf/stubs/status.h>
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/any.pb.h"
+#include "google/protobuf/type.pb.h"
+#include "google/protobuf/repeated_field.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "absl/status/status.h"
+#include "absl/status/statusor.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/string_view.h"
+
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -61,25 +64,25 @@
// When the option with the given name is not found, default_value is returned.
PROTOBUF_EXPORT bool GetBoolOptionOrDefault(
const RepeatedPtrField<google::protobuf::Option>& options,
- StringPiece option_name, bool default_value);
+ absl::string_view option_name, bool default_value);
// Returns int64 option value. If the option isn't found, returns the
// default_value.
PROTOBUF_EXPORT int64_t GetInt64OptionOrDefault(
const RepeatedPtrField<google::protobuf::Option>& options,
- StringPiece option_name, int64_t default_value);
+ absl::string_view option_name, int64_t default_value);
// Returns double option value. If the option isn't found, returns the
// default_value.
PROTOBUF_EXPORT double GetDoubleOptionOrDefault(
const RepeatedPtrField<google::protobuf::Option>& options,
- StringPiece option_name, double default_value);
+ absl::string_view option_name, double default_value);
// Returns string option value. If the option isn't found, returns the
// default_value.
PROTOBUF_EXPORT std::string GetStringOptionOrDefault(
const RepeatedPtrField<google::protobuf::Option>& options,
- StringPiece option_name, StringPiece default_value);
+ absl::string_view option_name, absl::string_view default_value);
// Returns a boolean value contained in Any type.
// TODO(skarvaje): Make these utilities dealing with Any types more generic,
@@ -98,8 +101,8 @@
// Returns the type string without the url prefix. e.g.: If the passed type is
// 'type.googleapis.com/tech.type.Bool', the returned value is 'tech.type.Bool'.
-PROTOBUF_EXPORT const StringPiece GetTypeWithoutUrl(
- StringPiece type_url);
+PROTOBUF_EXPORT absl::string_view GetTypeWithoutUrl(
+ absl::string_view type_url);
// Returns the simple_type with the base type url (kTypeServiceBaseUrl)
// prefixed.
@@ -107,24 +110,24 @@
// E.g:
// GetFullTypeWithUrl("google.protobuf.Timestamp") returns the string
// "type.googleapis.com/google.protobuf.Timestamp".
-PROTOBUF_EXPORT const std::string GetFullTypeWithUrl(
- StringPiece simple_type);
+PROTOBUF_EXPORT std::string GetFullTypeWithUrl(
+ absl::string_view simple_type);
// Finds and returns option identified by name and option_name within the
// provided map. Returns nullptr if none found.
const google::protobuf::Option* FindOptionOrNull(
const RepeatedPtrField<google::protobuf::Option>& options,
- StringPiece option_name);
+ absl::string_view option_name);
// Finds and returns the field identified by field_name in the passed tech Type
// object. Returns nullptr if none found.
const google::protobuf::Field* FindFieldInTypeOrNull(
- const google::protobuf::Type* type, StringPiece field_name);
+ const google::protobuf::Type* type, absl::string_view field_name);
// Similar to FindFieldInTypeOrNull, but this looks up fields with given
// json_name.
const google::protobuf::Field* FindJsonFieldInTypeOrNull(
- const google::protobuf::Type* type, StringPiece json_name);
+ const google::protobuf::Type* type, absl::string_view json_name);
// Similar to FindFieldInTypeOrNull, but this looks up fields by number.
const google::protobuf::Field* FindFieldInTypeByNumberOrNull(
@@ -133,7 +136,7 @@
// Finds and returns the EnumValue identified by enum_name in the passed tech
// Enum object. Returns nullptr if none found.
const google::protobuf::EnumValue* FindEnumValueByNameOrNull(
- const google::protobuf::Enum* enum_type, StringPiece enum_name);
+ const google::protobuf::Enum* enum_type, absl::string_view enum_name);
// Finds and returns the EnumValue identified by value in the passed tech
// Enum object. Returns nullptr if none found.
@@ -145,23 +148,23 @@
// For Ex. if enum_name is ACTIONANDADVENTURE it can get accepted if
// EnumValue's name is action_and_adventure or ACTION_AND_ADVENTURE.
const google::protobuf::EnumValue* FindEnumValueByNameWithoutUnderscoreOrNull(
- const google::protobuf::Enum* enum_type, StringPiece enum_name);
+ const google::protobuf::Enum* enum_type, absl::string_view enum_name);
// Converts input to camel-case and returns it.
-PROTOBUF_EXPORT std::string ToCamelCase(const StringPiece input);
+PROTOBUF_EXPORT std::string ToCamelCase(const absl::string_view input);
// Converts enum name string to camel-case and returns it.
-std::string EnumValueNameToLowerCamelCase(const StringPiece input);
+std::string EnumValueNameToLowerCamelCase(const absl::string_view input);
// Converts input to snake_case and returns it.
-PROTOBUF_EXPORT std::string ToSnakeCase(StringPiece input);
+PROTOBUF_EXPORT std::string ToSnakeCase(absl::string_view input);
// Returns true if type_name represents a well-known type.
PROTOBUF_EXPORT bool IsWellKnownType(const std::string& type_name);
// Returns true if 'bool_string' represents a valid boolean value. Only "true",
// "false", "0" and "1" are allowed.
-PROTOBUF_EXPORT bool IsValidBoolString(StringPiece bool_string);
+PROTOBUF_EXPORT bool IsValidBoolString(absl::string_view bool_string);
// Returns true if "field" is a protobuf map field based on its type.
PROTOBUF_EXPORT bool IsMap(const google::protobuf::Field& field,
@@ -177,7 +180,7 @@
// Convert from int32, int64, uint32, uint64, double or float to string.
template <typename T>
std::string ValueAsString(T value) {
- return StrCat(value);
+ return absl::StrCat(value);
}
template <>
@@ -192,13 +195,13 @@
// Converts a string to float. Unlike safe_strtof, conversion will fail if the
// value fits into double but not float (e.g., DBL_MAX).
-PROTOBUF_EXPORT bool SafeStrToFloat(StringPiece str, float* value);
+PROTOBUF_EXPORT bool SafeStrToFloat(absl::string_view str, float* value);
} // namespace converter
} // namespace util
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_UTIL_INTERNAL_UTILITY_H__
diff --git a/src/google/protobuf/util/json_format_proto3.proto b/src/google/protobuf/util/json_format_proto3.proto
index 0eec9da..4df5eb9 100644
--- a/src/google/protobuf/util/json_format_proto3.proto
+++ b/src/google/protobuf/util/json_format_proto3.proto
@@ -46,6 +46,7 @@
enum EnumType {
FOO = 0;
BAR = 1;
+ TLSv1_2 = 2;
}
message MessageType {
@@ -179,10 +180,23 @@
map<bool, int32> bool_map = 2;
}
+message TestNullValue {
+ google.protobuf.NullValue null_value = 20;
+ repeated google.protobuf.NullValue repeated_null_value = 21;
+}
+
message TestCustomJsonName {
int32 value = 1 [json_name = "@value"];
}
+message TestEvilJson {
+ int32 regular_value = 1 [json_name = "regular_name"];
+ int32 script = 2 [json_name = "</script>"];
+ int32 quotes = 3 [json_name = "unbalanced\"quotes"];
+ int32 script_and_quotes = 4
+ [json_name = "\"<script>alert('hello!);</script>"];
+}
+
message TestExtensions {
.protobuf_unittest.TestAllExtensions extensions = 1;
}
diff --git a/src/google/protobuf/util/json_util.cc b/src/google/protobuf/util/json_util.cc
index c39c10d..2942eeb 100644
--- a/src/google/protobuf/util/json_util.cc
+++ b/src/google/protobuf/util/json_util.cc
@@ -28,67 +28,44 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/util/json_util.h>
+#include "google/protobuf/util/json_util.h"
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/once.h>
-#include <google/protobuf/stubs/status.h>
-#include <google/protobuf/stubs/bytestream.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/util/internal/default_value_objectwriter.h>
-#include <google/protobuf/util/internal/error_listener.h>
-#include <google/protobuf/util/internal/json_objectwriter.h>
-#include <google/protobuf/util/internal/json_stream_parser.h>
-#include <google/protobuf/util/internal/protostream_objectsource.h>
-#include <google/protobuf/util/internal/protostream_objectwriter.h>
-#include <google/protobuf/util/type_resolver.h>
-#include <google/protobuf/util/type_resolver_util.h>
-#include <google/protobuf/stubs/status_macros.h>
+#include "absl/base/call_once.h"
+#include "absl/status/status.h"
+#include "absl/strings/ascii.h"
+#include "google/protobuf/stubs/bytestream.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/string_view.h"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/io/zero_copy_sink.h"
+#include "google/protobuf/io/zero_copy_stream.h"
+#include "google/protobuf/util/internal/default_value_objectwriter.h"
+#include "google/protobuf/util/internal/error_listener.h"
+#include "google/protobuf/util/internal/json_objectwriter.h"
+#include "google/protobuf/util/internal/json_stream_parser.h"
+#include "google/protobuf/util/internal/protostream_objectsource.h"
+#include "google/protobuf/util/internal/protostream_objectwriter.h"
+#include "google/protobuf/util/type_resolver.h"
+#include "google/protobuf/util/type_resolver_util.h"
+#include "google/protobuf/stubs/status_macros.h"
+
// clang-format off
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
// clang-format on
+
namespace google {
namespace protobuf {
namespace util {
+using ::google::protobuf::io::zc_sink_internal::ZeroCopyStreamByteSink;
-namespace internal {
-ZeroCopyStreamByteSink::~ZeroCopyStreamByteSink() {
- if (buffer_size_ > 0) {
- stream_->BackUp(buffer_size_);
- }
-}
-
-void ZeroCopyStreamByteSink::Append(const char* bytes, size_t len) {
- while (true) {
- if (len <= buffer_size_) { // NOLINT
- memcpy(buffer_, bytes, len);
- buffer_ = static_cast<char*>(buffer_) + len;
- buffer_size_ -= len;
- return;
- }
- if (buffer_size_ > 0) {
- memcpy(buffer_, bytes, buffer_size_);
- bytes += buffer_size_;
- len -= buffer_size_;
- }
- if (!stream_->Next(&buffer_, &buffer_size_)) {
- // There isn't a way for ByteSink to report errors.
- buffer_size_ = 0;
- return;
- }
- }
-}
-} // namespace internal
-
-util::Status BinaryToJsonStream(TypeResolver* resolver,
+absl::Status BinaryToJsonStream(TypeResolver* resolver,
const std::string& type_url,
io::ZeroCopyInputStream* binary_input,
io::ZeroCopyOutputStream* json_output,
const JsonPrintOptions& options) {
+
io::CodedInputStream in_stream(binary_input);
google::protobuf::Type type;
RETURN_IF_ERROR(resolver->ResolveMessageType(type_url, &type));
@@ -114,7 +91,7 @@
}
}
-util::Status BinaryToJsonString(TypeResolver* resolver,
+absl::Status BinaryToJsonString(TypeResolver* resolver,
const std::string& type_url,
const std::string& binary_input,
std::string* json_output,
@@ -129,59 +106,60 @@
class StatusErrorListener : public converter::ErrorListener {
public:
StatusErrorListener() {}
+ StatusErrorListener(const StatusErrorListener&) = delete;
+ StatusErrorListener& operator=(const StatusErrorListener&) = delete;
~StatusErrorListener() override {}
- util::Status GetStatus() { return status_; }
+ absl::Status GetStatus() { return status_; }
void InvalidName(const converter::LocationTrackerInterface& loc,
- StringPiece unknown_name,
- StringPiece message) override {
+ absl::string_view unknown_name,
+ absl::string_view message) override {
std::string loc_string = GetLocString(loc);
if (!loc_string.empty()) {
loc_string.append(" ");
}
- status_ = util::InvalidArgumentError(
- StrCat(loc_string, unknown_name, ": ", message));
+ status_ = absl::InvalidArgumentError(
+ absl::StrCat(loc_string, unknown_name, ": ", message));
}
void InvalidValue(const converter::LocationTrackerInterface& loc,
- StringPiece type_name,
- StringPiece value) override {
- status_ = util::InvalidArgumentError(
- StrCat(GetLocString(loc), ": invalid value ", std::string(value),
+ absl::string_view type_name,
+ absl::string_view value) override {
+ status_ = absl::InvalidArgumentError(
+ absl::StrCat(GetLocString(loc), ": invalid value ", std::string(value),
" for type ", std::string(type_name)));
}
void MissingField(const converter::LocationTrackerInterface& loc,
- StringPiece missing_name) override {
- status_ = util::InvalidArgumentError(StrCat(
+ absl::string_view missing_name) override {
+ status_ = absl::InvalidArgumentError(absl::StrCat(
GetLocString(loc), ": missing field ", std::string(missing_name)));
}
private:
- util::Status status_;
+ absl::Status status_;
std::string GetLocString(const converter::LocationTrackerInterface& loc) {
std::string loc_string = loc.ToString();
- StripWhitespace(&loc_string);
+ absl::StripAsciiWhitespace(&loc_string);
if (!loc_string.empty()) {
- loc_string = StrCat("(", loc_string, ")");
+ loc_string = absl::StrCat("(", loc_string, ")");
}
return loc_string;
}
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(StatusErrorListener);
};
} // namespace
-util::Status JsonToBinaryStream(TypeResolver* resolver,
+absl::Status JsonToBinaryStream(TypeResolver* resolver,
const std::string& type_url,
io::ZeroCopyInputStream* json_input,
io::ZeroCopyOutputStream* binary_output,
const JsonParseOptions& options) {
+
google::protobuf::Type type;
RETURN_IF_ERROR(resolver->ResolveMessageType(type_url, &type));
- internal::ZeroCopyStreamByteSink sink(binary_output);
+ ZeroCopyStreamByteSink sink(binary_output);
StatusErrorListener listener;
converter::ProtoStreamObjectWriter::Options proto_writer_options;
proto_writer_options.ignore_unknown_fields = options.ignore_unknown_fields;
@@ -191,6 +169,7 @@
options.case_insensitive_enum_parsing;
converter::ProtoStreamObjectWriter proto_writer(
resolver, type, &sink, &listener, proto_writer_options);
+ proto_writer.set_use_strict_base64_decoding(false);
converter::JsonStreamParser parser(&proto_writer);
const void* buffer;
@@ -198,16 +177,16 @@
while (json_input->Next(&buffer, &length)) {
if (length == 0) continue;
RETURN_IF_ERROR(parser.Parse(
- StringPiece(static_cast<const char*>(buffer), length)));
+ absl::string_view(static_cast<const char*>(buffer), length)));
}
RETURN_IF_ERROR(parser.FinishParse());
return listener.GetStatus();
}
-util::Status JsonToBinaryString(TypeResolver* resolver,
+absl::Status JsonToBinaryString(TypeResolver* resolver,
const std::string& type_url,
- StringPiece json_input,
+ absl::string_view json_input,
std::string* binary_output,
const JsonParseOptions& options) {
io::ArrayInputStream input_stream(json_input.data(), json_input.size());
@@ -219,7 +198,7 @@
namespace {
const char* kTypeUrlPrefix = "type.googleapis.com";
TypeResolver* generated_type_resolver_ = nullptr;
-PROTOBUF_NAMESPACE_ID::internal::once_flag generated_type_resolver_init_;
+absl::once_flag generated_type_resolver_init_;
std::string GetTypeUrl(const Message& message) {
return std::string(kTypeUrlPrefix) + "/" +
@@ -237,20 +216,20 @@
}
TypeResolver* GetGeneratedTypeResolver() {
- PROTOBUF_NAMESPACE_ID::internal::call_once(generated_type_resolver_init_,
- InitGeneratedTypeResolver);
+ absl::call_once(generated_type_resolver_init_, InitGeneratedTypeResolver);
return generated_type_resolver_;
}
} // namespace
-util::Status MessageToJsonString(const Message& message, std::string* output,
+absl::Status MessageToJsonString(const Message& message, std::string* output,
const JsonOptions& options) {
+
const DescriptorPool* pool = message.GetDescriptor()->file()->pool();
TypeResolver* resolver =
pool == DescriptorPool::generated_pool()
? GetGeneratedTypeResolver()
: NewTypeResolverForDescriptorPool(kTypeUrlPrefix, pool);
- util::Status result =
+ absl::Status result =
BinaryToJsonString(resolver, GetTypeUrl(message),
message.SerializeAsString(), output, options);
if (pool != DescriptorPool::generated_pool()) {
@@ -259,18 +238,19 @@
return result;
}
-util::Status JsonStringToMessage(StringPiece input, Message* message,
+absl::Status JsonStringToMessage(absl::string_view input, Message* message,
const JsonParseOptions& options) {
+
const DescriptorPool* pool = message->GetDescriptor()->file()->pool();
TypeResolver* resolver =
pool == DescriptorPool::generated_pool()
? GetGeneratedTypeResolver()
: NewTypeResolverForDescriptorPool(kTypeUrlPrefix, pool);
std::string binary;
- util::Status result = JsonToBinaryString(resolver, GetTypeUrl(*message),
+ absl::Status result = JsonToBinaryString(resolver, GetTypeUrl(*message),
input, &binary, options);
if (result.ok() && !message->ParseFromString(binary)) {
- result = util::InvalidArgumentError(
+ result = absl::InvalidArgumentError(
"JSON transcoder produced invalid protobuf output.");
}
if (pool != DescriptorPool::generated_pool()) {
diff --git a/src/google/protobuf/util/json_util.h b/src/google/protobuf/util/json_util.h
index 0f1c4d8..fe74441 100644
--- a/src/google/protobuf/util/json_util.h
+++ b/src/google/protobuf/util/json_util.h
@@ -33,14 +33,15 @@
#ifndef GOOGLE_PROTOBUF_UTIL_JSON_UTIL_H__
#define GOOGLE_PROTOBUF_UTIL_JSON_UTIL_H__
-#include <google/protobuf/stubs/bytestream.h>
-#include <google/protobuf/stubs/status.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/message.h>
-#include <google/protobuf/util/type_resolver.h>
+
+#include "absl/status/status.h"
+#include "google/protobuf/stubs/bytestream.h"
+#include "absl/strings/string_view.h"
+#include "google/protobuf/message.h"
+#include "google/protobuf/util/type_resolver.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -93,11 +94,14 @@
// Converts from protobuf message to JSON and appends it to |output|. This is a
// simple wrapper of BinaryToJsonString(). It will use the DescriptorPool of the
// passed-in message to resolve Any types.
-PROTOBUF_EXPORT util::Status MessageToJsonString(const Message& message,
+//
+// Please note that non-OK statuses are not a stable output of this API and
+// subject to change without notice.
+PROTOBUF_EXPORT absl::Status MessageToJsonString(const Message& message,
std::string* output,
const JsonOptions& options);
-inline util::Status MessageToJsonString(const Message& message,
+inline absl::Status MessageToJsonString(const Message& message,
std::string* output) {
return MessageToJsonString(message, output, JsonOptions());
}
@@ -105,10 +109,13 @@
// Converts from JSON to protobuf message. This is a simple wrapper of
// JsonStringToBinary(). It will use the DescriptorPool of the passed-in
// message to resolve Any types.
-PROTOBUF_EXPORT util::Status JsonStringToMessage(
- StringPiece input, Message* message, const JsonParseOptions& options);
+//
+// Please note that non-OK statuses are not a stable output of this API and
+// subject to change without notice.
+PROTOBUF_EXPORT absl::Status JsonStringToMessage(
+ absl::string_view input, Message* message, const JsonParseOptions& options);
-inline util::Status JsonStringToMessage(StringPiece input,
+inline absl::Status JsonStringToMessage(absl::string_view input,
Message* message) {
return JsonStringToMessage(input, message, JsonParseOptions());
}
@@ -119,12 +126,15 @@
// 2. input is not valid protobuf wire format, or conflicts with the type
// information returned by TypeResolver.
// Note that unknown fields will be discarded silently.
-PROTOBUF_EXPORT util::Status BinaryToJsonStream(
+//
+// Please note that non-OK statuses are not a stable output of this API and
+// subject to change without notice.
+PROTOBUF_EXPORT absl::Status BinaryToJsonStream(
TypeResolver* resolver, const std::string& type_url,
io::ZeroCopyInputStream* binary_input,
io::ZeroCopyOutputStream* json_output, const JsonPrintOptions& options);
-inline util::Status BinaryToJsonStream(TypeResolver* resolver,
+inline absl::Status BinaryToJsonStream(TypeResolver* resolver,
const std::string& type_url,
io::ZeroCopyInputStream* binary_input,
io::ZeroCopyOutputStream* json_output) {
@@ -132,12 +142,12 @@
JsonPrintOptions());
}
-PROTOBUF_EXPORT util::Status BinaryToJsonString(
+PROTOBUF_EXPORT absl::Status BinaryToJsonString(
TypeResolver* resolver, const std::string& type_url,
const std::string& binary_input, std::string* json_output,
const JsonPrintOptions& options);
-inline util::Status BinaryToJsonString(TypeResolver* resolver,
+inline absl::Status BinaryToJsonString(TypeResolver* resolver,
const std::string& type_url,
const std::string& binary_input,
std::string* json_output) {
@@ -150,12 +160,15 @@
// 1. TypeResolver fails to resolve a type.
// 2. input is not valid JSON format, or conflicts with the type
// information returned by TypeResolver.
-PROTOBUF_EXPORT util::Status JsonToBinaryStream(
+//
+// Please note that non-OK statuses are not a stable output of this API and
+// subject to change without notice.
+PROTOBUF_EXPORT absl::Status JsonToBinaryStream(
TypeResolver* resolver, const std::string& type_url,
io::ZeroCopyInputStream* json_input,
io::ZeroCopyOutputStream* binary_output, const JsonParseOptions& options);
-inline util::Status JsonToBinaryStream(
+inline absl::Status JsonToBinaryStream(
TypeResolver* resolver, const std::string& type_url,
io::ZeroCopyInputStream* json_input,
io::ZeroCopyOutputStream* binary_output) {
@@ -163,42 +176,22 @@
JsonParseOptions());
}
-PROTOBUF_EXPORT util::Status JsonToBinaryString(
+PROTOBUF_EXPORT absl::Status JsonToBinaryString(
TypeResolver* resolver, const std::string& type_url,
- StringPiece json_input, std::string* binary_output,
+ absl::string_view json_input, std::string* binary_output,
const JsonParseOptions& options);
-inline util::Status JsonToBinaryString(TypeResolver* resolver,
+inline absl::Status JsonToBinaryString(TypeResolver* resolver,
const std::string& type_url,
- StringPiece json_input,
+ absl::string_view json_input,
std::string* binary_output) {
return JsonToBinaryString(resolver, type_url, json_input, binary_output,
JsonParseOptions());
}
-
-namespace internal {
-// Internal helper class. Put in the header so we can write unit-tests for it.
-class PROTOBUF_EXPORT ZeroCopyStreamByteSink : public strings::ByteSink {
- public:
- explicit ZeroCopyStreamByteSink(io::ZeroCopyOutputStream* stream)
- : stream_(stream), buffer_(nullptr), buffer_size_(0) {}
- ~ZeroCopyStreamByteSink() override;
-
- void Append(const char* bytes, size_t len) override;
-
- private:
- io::ZeroCopyOutputStream* stream_;
- void* buffer_;
- int buffer_size_;
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ZeroCopyStreamByteSink);
-};
-} // namespace internal
-
} // namespace util
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_UTIL_JSON_UTIL_H__
diff --git a/src/google/protobuf/util/json_util_test.cc b/src/google/protobuf/util/json_util_test.cc
index 7216199..3b582c4 100644
--- a/src/google/protobuf/util/json_util_test.cc
+++ b/src/google/protobuf/util/json_util_test.cc
@@ -28,175 +28,321 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/util/json_util.h>
+#include "google/protobuf/util/json_util.h"
+#include <algorithm>
#include <cstdint>
#include <list>
+#include <memory>
#include <string>
+#include <vector>
-#include <google/protobuf/util/internal/testdata/maps.pb.h>
-#include <google/protobuf/util/json_format.pb.h>
-#include <google/protobuf/util/json_format_proto3.pb.h>
+#include "google/protobuf/duration.pb.h"
+#include "google/protobuf/field_mask.pb.h"
+#include "google/protobuf/struct.pb.h"
+#include "google/protobuf/timestamp.pb.h"
+#include "google/protobuf/wrappers.pb.h"
+#include "google/protobuf/unittest.pb.h"
+#include <gmock/gmock.h>
#include <gtest/gtest.h>
-#include <google/protobuf/descriptor_database.h>
-#include <google/protobuf/dynamic_message.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/util/type_resolver.h>
-#include <google/protobuf/util/type_resolver_util.h>
+#include "absl/status/status.h"
+#include "absl/status/statusor.h"
+#include "absl/strings/escaping.h"
+#include "absl/strings/string_view.h"
+#include "google/protobuf/descriptor_database.h"
+#include "google/protobuf/dynamic_message.h"
+#include "google/protobuf/io/zero_copy_stream.h"
+#include "google/protobuf/io/zero_copy_stream_impl_lite.h"
+#include "google/protobuf/util/internal/testdata/maps.pb.h"
+#include "google/protobuf/util/json_format.pb.h"
+#include "google/protobuf/util/json_format.pb.h"
+#include "google/protobuf/util/json_format_proto3.pb.h"
+#include "google/protobuf/util/json_format_proto3.pb.h"
+#include "google/protobuf/util/type_resolver.h"
+#include "google/protobuf/util/type_resolver_util.h"
+#include "google/protobuf/stubs/status_macros.h"
+
+// Must be included last.
+#include "google/protobuf/port_def.inc"
+
+bool IsJson2() {
+ // Pay no attention to the person behind the curtain.
+ return false;
+}
namespace google {
namespace protobuf {
namespace util {
namespace {
+using ::proto3::TestAny;
+using ::proto3::TestEnumValue;
+using ::proto3::TestMap;
+using ::proto3::TestMessage;
+using ::proto3::TestOneof;
+using ::proto3::TestWrapper;
+using ::proto_util_converter::testing::MapIn;
+using ::testing::ElementsAre;
+using ::testing::IsEmpty;
+using ::testing::Not;
+using ::testing::Pair;
+using ::testing::SizeIs;
-using proto3::BAR;
-using proto3::FOO;
-using proto3::TestAny;
-using proto3::TestEnumValue;
-using proto3::TestMap;
-using proto3::TestMessage;
-using proto3::TestOneof;
-using proto_util_converter::testing::MapIn;
+// TODO(b/234474291): Use the gtest versions once that's available in OSS.
+MATCHER_P(IsOkAndHolds, inner,
+ absl::StrCat("is OK and holds ", testing::PrintToString(inner))) {
+ if (!arg.ok()) {
+ *result_listener << arg.status();
+ return false;
+ }
+ return testing::ExplainMatchResult(inner, *arg, result_listener);
+}
-// As functions defined in json_util.h are just thin wrappers around the
-// JSON conversion code in //net/proto2/util/converter, in this test we
-// only cover some very basic cases to make sure the wrappers have forwarded
-// parameters to the underlying implementation correctly. More detailed
-// tests are contained in the //net/proto2/util/converter directory.
-class JsonUtilTest : public ::testing::Test {
+absl::Status GetStatus(const absl::Status& s) { return s; }
+template <typename T>
+absl::Status GetStatus(const absl::StatusOr<T>& s) {
+ return s.status();
+}
+
+MATCHER_P(StatusIs, status,
+ absl::StrCat(".status() is ", testing::PrintToString(status))) {
+ return GetStatus(arg).code() == status;
+}
+
+#define EXPECT_OK(x) EXPECT_THAT(x, StatusIs(absl::StatusCode::kOk))
+#define ASSERT_OK(x) ASSERT_THAT(x, StatusIs(absl::StatusCode::kOk))
+
+enum class Codec {
+ kReflective,
+ kResolver,
+};
+
+class JsonTest : public testing::TestWithParam<Codec> {
protected:
- JsonUtilTest() {}
+ absl::StatusOr<std::string> ToJson(const Message& proto,
+ JsonPrintOptions options = {}) {
+ if (GetParam() == Codec::kReflective) {
+ std::string result;
+ RETURN_IF_ERROR(MessageToJsonString(proto, &result, options));
+ return result;
+ }
+ std::string proto_data = proto.SerializeAsString();
+ io::ArrayInputStream in(proto_data.data(), proto_data.size());
- std::string ToJson(const Message& message, const JsonPrintOptions& options) {
std::string result;
- GOOGLE_CHECK_OK(MessageToJsonString(message, &result, options));
+ io::StringOutputStream out(&result);
+
+ RETURN_IF_ERROR(BinaryToJsonStream(
+ resolver_.get(),
+ absl::StrCat("type.googleapis.com/", proto.GetTypeName()), &in, &out,
+ options));
return result;
}
- bool FromJson(const std::string& json, Message* message,
- const JsonParseOptions& options) {
- return JsonStringToMessage(json, message, options).ok();
+ // The out parameter comes first since `json` tends to be a very long string,
+ // and clang-format does a poor job if it is not the last parameter.
+ absl::Status ToProto(Message& proto, absl::string_view json,
+ JsonParseOptions options = {}) {
+ if (GetParam() == Codec::kReflective) {
+ return JsonStringToMessage(json, &proto, options);
+ }
+ io::ArrayInputStream in(json.data(), json.size());
+
+ std::string result;
+ io::StringOutputStream out(&result);
+
+ RETURN_IF_ERROR(JsonToBinaryStream(
+ resolver_.get(),
+ absl::StrCat("type.googleapis.com/", proto.GetTypeName()), &in, &out,
+ options));
+
+ if (!proto.ParseFromString(result)) {
+ return absl::InternalError("wire format parse failed");
+ }
+ return absl::OkStatus();
}
- bool FromJson(const std::string& json, Message* message) {
- return FromJson(json, message, JsonParseOptions());
+ template <typename Proto>
+ absl::StatusOr<Proto> ToProto(absl::string_view json,
+ JsonParseOptions options = {}) {
+ Proto proto;
+ RETURN_IF_ERROR(ToProto(proto, json, options));
+ return proto;
}
- std::unique_ptr<TypeResolver> resolver_;
+ std::unique_ptr<TypeResolver> resolver_{NewTypeResolverForDescriptorPool(
+ "type.googleapis.com", DescriptorPool::generated_pool())};
};
-TEST_F(JsonUtilTest, TestWhitespaces) {
+INSTANTIATE_TEST_SUITE_P(JsonTestSuite, JsonTest,
+ testing::Values(Codec::kReflective, Codec::kResolver));
+
+TEST_P(JsonTest, TestWhitespaces) {
TestMessage m;
m.mutable_message_value();
+ m.set_string_value("foo");
+ m.add_repeated_bool_value(true);
+ m.add_repeated_bool_value(false);
+
+ EXPECT_THAT(
+ ToJson(m),
+ IsOkAndHolds(
+ R"({"stringValue":"foo","messageValue":{},"repeatedBoolValue":[true,false]})"));
JsonPrintOptions options;
- EXPECT_EQ("{\"messageValue\":{}}", ToJson(m, options));
options.add_whitespace = true;
- EXPECT_EQ(
- "{\n"
- " \"messageValue\": {}\n"
- "}\n",
- ToJson(m, options));
+ // Note: whitespace here is significant.
+ EXPECT_THAT(ToJson(m, options), IsOkAndHolds(R"({
+ "stringValue": "foo",
+ "messageValue": {},
+ "repeatedBoolValue": [
+ true,
+ false
+ ]
+}
+)"));
}
-TEST_F(JsonUtilTest, TestDefaultValues) {
+TEST_P(JsonTest, TestDefaultValues) {
TestMessage m;
+ EXPECT_THAT(ToJson(m), IsOkAndHolds("{}"));
+
JsonPrintOptions options;
- EXPECT_EQ("{}", ToJson(m, options));
options.always_print_primitive_fields = true;
- EXPECT_EQ(
- "{\"boolValue\":false,"
- "\"int32Value\":0,"
- "\"int64Value\":\"0\","
- "\"uint32Value\":0,"
- "\"uint64Value\":\"0\","
- "\"floatValue\":0,"
- "\"doubleValue\":0,"
- "\"stringValue\":\"\","
- "\"bytesValue\":\"\","
- "\"enumValue\":\"FOO\","
- "\"repeatedBoolValue\":[],"
- "\"repeatedInt32Value\":[],"
- "\"repeatedInt64Value\":[],"
- "\"repeatedUint32Value\":[],"
- "\"repeatedUint64Value\":[],"
- "\"repeatedFloatValue\":[],"
- "\"repeatedDoubleValue\":[],"
- "\"repeatedStringValue\":[],"
- "\"repeatedBytesValue\":[],"
- "\"repeatedEnumValue\":[],"
- "\"repeatedMessageValue\":[]"
- "}",
- ToJson(m, options));
+ EXPECT_THAT(ToJson(m, options), IsOkAndHolds("{\"boolValue\":false,"
+ "\"int32Value\":0,"
+ "\"int64Value\":\"0\","
+ "\"uint32Value\":0,"
+ "\"uint64Value\":\"0\","
+ "\"floatValue\":0,"
+ "\"doubleValue\":0,"
+ "\"stringValue\":\"\","
+ "\"bytesValue\":\"\","
+ "\"enumValue\":\"FOO\","
+ "\"repeatedBoolValue\":[],"
+ "\"repeatedInt32Value\":[],"
+ "\"repeatedInt64Value\":[],"
+ "\"repeatedUint32Value\":[],"
+ "\"repeatedUint64Value\":[],"
+ "\"repeatedFloatValue\":[],"
+ "\"repeatedDoubleValue\":[],"
+ "\"repeatedStringValue\":[],"
+ "\"repeatedBytesValue\":[],"
+ "\"repeatedEnumValue\":[],"
+ "\"repeatedMessageValue\":[]"
+ "}"));
- options.always_print_primitive_fields = true;
m.set_string_value("i am a test string value");
m.set_bytes_value("i am a test bytes value");
- EXPECT_EQ(
- "{\"boolValue\":false,"
- "\"int32Value\":0,"
- "\"int64Value\":\"0\","
- "\"uint32Value\":0,"
- "\"uint64Value\":\"0\","
- "\"floatValue\":0,"
- "\"doubleValue\":0,"
- "\"stringValue\":\"i am a test string value\","
- "\"bytesValue\":\"aSBhbSBhIHRlc3QgYnl0ZXMgdmFsdWU=\","
- "\"enumValue\":\"FOO\","
- "\"repeatedBoolValue\":[],"
- "\"repeatedInt32Value\":[],"
- "\"repeatedInt64Value\":[],"
- "\"repeatedUint32Value\":[],"
- "\"repeatedUint64Value\":[],"
- "\"repeatedFloatValue\":[],"
- "\"repeatedDoubleValue\":[],"
- "\"repeatedStringValue\":[],"
- "\"repeatedBytesValue\":[],"
- "\"repeatedEnumValue\":[],"
- "\"repeatedMessageValue\":[]"
- "}",
- ToJson(m, options));
+ EXPECT_THAT(
+ ToJson(m, options),
+ IsOkAndHolds("{\"boolValue\":false,"
+ "\"int32Value\":0,"
+ "\"int64Value\":\"0\","
+ "\"uint32Value\":0,"
+ "\"uint64Value\":\"0\","
+ "\"floatValue\":0,"
+ "\"doubleValue\":0,"
+ "\"stringValue\":\"i am a test string value\","
+ "\"bytesValue\":\"aSBhbSBhIHRlc3QgYnl0ZXMgdmFsdWU=\","
+ "\"enumValue\":\"FOO\","
+ "\"repeatedBoolValue\":[],"
+ "\"repeatedInt32Value\":[],"
+ "\"repeatedInt64Value\":[],"
+ "\"repeatedUint32Value\":[],"
+ "\"repeatedUint64Value\":[],"
+ "\"repeatedFloatValue\":[],"
+ "\"repeatedDoubleValue\":[],"
+ "\"repeatedStringValue\":[],"
+ "\"repeatedBytesValue\":[],"
+ "\"repeatedEnumValue\":[],"
+ "\"repeatedMessageValue\":[]"
+ "}"));
- options.preserve_proto_field_names = true;
- m.set_string_value("i am a test string value");
- m.set_bytes_value("i am a test bytes value");
- EXPECT_EQ(
- "{\"bool_value\":false,"
- "\"int32_value\":0,"
- "\"int64_value\":\"0\","
- "\"uint32_value\":0,"
- "\"uint64_value\":\"0\","
- "\"float_value\":0,"
- "\"double_value\":0,"
- "\"string_value\":\"i am a test string value\","
- "\"bytes_value\":\"aSBhbSBhIHRlc3QgYnl0ZXMgdmFsdWU=\","
- "\"enum_value\":\"FOO\","
- "\"repeated_bool_value\":[],"
- "\"repeated_int32_value\":[],"
- "\"repeated_int64_value\":[],"
- "\"repeated_uint32_value\":[],"
- "\"repeated_uint64_value\":[],"
- "\"repeated_float_value\":[],"
- "\"repeated_double_value\":[],"
- "\"repeated_string_value\":[],"
- "\"repeated_bytes_value\":[],"
- "\"repeated_enum_value\":[],"
- "\"repeated_message_value\":[]"
- "}",
- ToJson(m, options));
+ EXPECT_THAT(
+ ToJson(protobuf_unittest::TestAllTypes(), options),
+ IsOkAndHolds(
+ R"({"optionalInt32":0,"optionalInt64":"0","optionalUint32":0,)"
+ R"("optionalUint64":"0","optionalSint32":0,"optionalSint64":"0","optionalFixed32":0,)"
+ R"("optionalFixed64":"0","optionalSfixed32":0,"optionalSfixed64":"0",)"
+ R"("optionalFloat":0,"optionalDouble":0,"optionalBool":false,"optionalString":"",)"
+ R"("optionalBytes":"","optionalgroup":null,"optionalNestedEnum":"FOO","optionalForeignEnum":"FOREIGN_FOO",)"
+ R"("optionalImportEnum":"IMPORT_FOO","optionalStringPiece":"","optionalCord":"",)"
+ R"("repeatedInt32":[],"repeatedInt64":[],"repeatedUint32":[],"repeatedUint64":[],)"
+ R"("repeatedSint32":[],"repeatedSint64":[],"repeatedFixed32":[],"repeatedFixed64":[],)"
+ R"("repeatedSfixed32":[],"repeatedSfixed64":[],"repeatedFloat":[],"repeatedDouble":[],)"
+ R"("repeatedBool":[],"repeatedString":[],"repeatedBytes":[],"repeatedgroup":[],)"
+ R"("repeatedNestedMessage":[],"repeatedForeignMessage":[],"repeatedImportMessage":[],)"
+ R"("repeatedNestedEnum":[],"repeatedForeignEnum":[],"repeatedImportEnum":[],)"
+ R"("repeatedStringPiece":[],"repeatedCord":[],"repeatedLazyMessage":[],"defaultInt32":41,)"
+ R"("defaultInt64":"42","defaultUint32":43,"defaultUint64":"44","defaultSint32":-45,)"
+ R"("defaultSint64":"46","defaultFixed32":47,"defaultFixed64":"48","defaultSfixed32":49,)"
+ R"("defaultSfixed64":"-50","defaultFloat":51.5,"defaultDouble":52000,"defaultBool":true,)"
+ R"("defaultString":"hello","defaultBytes":"d29ybGQ=","defaultNestedEnum":"BAR",)"
+ R"("defaultForeignEnum":"FOREIGN_BAR","defaultImportEnum":"IMPORT_BAR",)"
+ R"("defaultStringPiece":"abc","defaultCord":"123"})"));
+
+ // The ESF parser actually gets this wrong, and serializes floats whose
+ // default value is non-finite as 0. We make sure to reproduce this bug.
+ if (IsJson2()) {
+ EXPECT_THAT(
+ ToJson(protobuf_unittest::TestExtremeDefaultValues(), options),
+ IsOkAndHolds(
+ R"({"escapedBytes":"XDAwMFwwMDFcMDA3XDAxMFwwMTRcblxyXHRcMDEzXFxcJ1wiXDM3Ng==")"
+ R"(,"largeUint32":4294967295,"largeUint64":"18446744073709551615",)"
+ R"("smallInt32":-2147483647,"smallInt64":"-9223372036854775807",)"
+ R"("utf8String":"ሴ","zeroFloat":0,"oneFloat":1,"smallFloat":1.5,)"
+ R"("negativeOneFloat":-1,"negativeFloat":-1.5,"largeFloat":2e+08,)"
+ R"("smallNegativeFloat":-8e-28,"infDouble":0,"negInfDouble":0,)"
+ R"("nanDouble":0,"infFloat":0,"negInfFloat":0,"nanFloat":0,)"
+ R"("cppTrigraph":"? ? ?? ?? ??? ??/ ??-","reallySmallInt32":-2147483648)"
+ R"(,"reallySmallInt64":"-9223372036854775808","stringWithZero":"hel\u0000lo")"
+ R"(,"bytesWithZero":"d29yXDAwMGxk","stringPieceWithZero":"ab\u0000c")"
+ R"(,"cordWithZero":"12\u00003","replacementString":"${unknown}"})"));
+ } else {
+ EXPECT_THAT(
+ ToJson(protobuf_unittest::TestExtremeDefaultValues(), options),
+ IsOkAndHolds(
+ R"({"escapedBytes":"XDAwMFwwMDFcMDA3XDAxMFwwMTRcblxyXHRcMDEzXFxcJ1wiXDM3Ng==")"
+ R"(,"largeUint32":4294967295,"largeUint64":"18446744073709551615",)"
+ R"("smallInt32":-2147483647,"smallInt64":"-9223372036854775807")"
+ R"(,"reallySmallInt32":-2147483648,"reallySmallInt64":"-9223372036854775808",)"
+ R"("utf8String":"ሴ","zeroFloat":0,"oneFloat":1,"smallFloat":1.5,)"
+ R"("negativeOneFloat":-1,"negativeFloat":-1.5,"largeFloat":2e+08,)"
+ R"("smallNegativeFloat":-8e-28,"infDouble":0,"negInfDouble":0)"
+ R"(,"nanDouble":0,"infFloat":0,"negInfFloat":0,"nanFloat":0)"
+ R"(,"cppTrigraph":"? ? ?? ?? ??? ??/ ??-","stringWithZero":"hel\u0000lo")"
+ R"(,"bytesWithZero":"d29yXDAwMGxk","stringPieceWithZero":"ab\u0000c")"
+ R"(,"cordWithZero":"12\u00003","replacementString":"${unknown}"})"));
+ }
}
-TEST_F(JsonUtilTest, TestPreserveProtoFieldNames) {
+TEST_P(JsonTest, TestPreserveProtoFieldNames) {
TestMessage m;
m.mutable_message_value();
JsonPrintOptions options;
options.preserve_proto_field_names = true;
- EXPECT_EQ("{\"message_value\":{}}", ToJson(m, options));
+ EXPECT_THAT(ToJson(m, options), IsOkAndHolds("{\"message_value\":{}}"));
+
}
-TEST_F(JsonUtilTest, TestAlwaysPrintEnumsAsInts) {
+TEST_P(JsonTest, Camels) {
+ protobuf_unittest::TestCamelCaseFieldNames m;
+ m.set_stringfield("sTRINGfIELD");
+
+ EXPECT_THAT(ToJson(m), IsOkAndHolds(R"({"StringField":"sTRINGfIELD"})"));
+}
+
+TEST_P(JsonTest, EvilString) {
+ auto m = ToProto<TestMessage>(R"json(
+ {"string_value": ")json"
+ "\n\r\b\f\1\2\3"
+ "\"}");
+ ASSERT_OK(m);
+ EXPECT_EQ(m->string_value(), "\n\r\b\f\1\2\3");
+}
+
+TEST_P(JsonTest, TestAlwaysPrintEnumsAsInts) {
TestMessage orig;
orig.set_enum_value(proto3::BAR);
orig.add_repeated_enum_value(proto3::FOO);
@@ -205,20 +351,19 @@
JsonPrintOptions print_options;
print_options.always_print_enums_as_ints = true;
- std::string expected_json = "{\"enumValue\":1,\"repeatedEnumValue\":[0,1]}";
- EXPECT_EQ(expected_json, ToJson(orig, print_options));
+ auto printed = ToJson(orig, print_options);
+ ASSERT_THAT(printed,
+ IsOkAndHolds("{\"enumValue\":1,\"repeatedEnumValue\":[0,1]}"));
- TestMessage parsed;
- JsonParseOptions parse_options;
- ASSERT_TRUE(FromJson(expected_json, &parsed, parse_options));
+ auto parsed = ToProto<TestMessage>(*printed);
+ ASSERT_OK(parsed);
- EXPECT_EQ(proto3::BAR, parsed.enum_value());
- EXPECT_EQ(2, parsed.repeated_enum_value_size());
- EXPECT_EQ(proto3::FOO, parsed.repeated_enum_value(0));
- EXPECT_EQ(proto3::BAR, parsed.repeated_enum_value(1));
+ EXPECT_EQ(parsed->enum_value(), proto3::BAR);
+ EXPECT_THAT(parsed->repeated_enum_value(),
+ ElementsAre(proto3::FOO, proto3::BAR));
}
-TEST_F(JsonUtilTest, TestPrintEnumsAsIntsWithDefaultValue) {
+TEST_P(JsonTest, TestPrintEnumsAsIntsWithDefaultValue) {
TestEnumValue orig;
// orig.set_enum_value1(proto3::FOO)
orig.set_enum_value2(proto3::FOO);
@@ -228,133 +373,296 @@
print_options.always_print_enums_as_ints = true;
print_options.always_print_primitive_fields = true;
- std::string expected_json =
- "{\"enumValue1\":0,\"enumValue2\":0,\"enumValue3\":1}";
- EXPECT_EQ(expected_json, ToJson(orig, print_options));
+ auto printed = ToJson(orig, print_options);
+ ASSERT_THAT(
+ printed,
+ IsOkAndHolds("{\"enumValue1\":0,\"enumValue2\":0,\"enumValue3\":1}"));
- TestEnumValue parsed;
- JsonParseOptions parse_options;
- ASSERT_TRUE(FromJson(expected_json, &parsed, parse_options));
+ auto parsed = ToProto<TestEnumValue>(*printed);
- EXPECT_EQ(proto3::FOO, parsed.enum_value1());
- EXPECT_EQ(proto3::FOO, parsed.enum_value2());
- EXPECT_EQ(proto3::BAR, parsed.enum_value3());
+ EXPECT_EQ(parsed->enum_value1(), proto3::FOO);
+ EXPECT_EQ(parsed->enum_value2(), proto3::FOO);
+ EXPECT_EQ(parsed->enum_value3(), proto3::BAR);
}
-TEST_F(JsonUtilTest, TestPrintProto2EnumAsIntWithDefaultValue) {
+TEST_P(JsonTest, TestPrintProto2EnumAsIntWithDefaultValue) {
protobuf_unittest::TestDefaultEnumValue orig;
JsonPrintOptions print_options;
- // use enum as int
print_options.always_print_enums_as_ints = true;
print_options.always_print_primitive_fields = true;
- // result should be int rather than string
- std::string expected_json = "{\"enumValue\":2}";
- EXPECT_EQ(expected_json, ToJson(orig, print_options));
+ auto printed = ToJson(orig, print_options);
+ ASSERT_THAT(printed, IsOkAndHolds("{\"enumValue\":2}"));
- protobuf_unittest::TestDefaultEnumValue parsed;
- JsonParseOptions parse_options;
- ASSERT_TRUE(FromJson(expected_json, &parsed, parse_options));
+ auto parsed = ToProto<protobuf_unittest::TestDefaultEnumValue>(*printed);
+ ASSERT_OK(parsed);
- EXPECT_EQ(protobuf_unittest::DEFAULT, parsed.enum_value());
+ EXPECT_EQ(parsed->enum_value(), protobuf_unittest::DEFAULT);
}
-TEST_F(JsonUtilTest, ParseMessage) {
- // Some random message but good enough to verify that the parsing wrapper
- // functions are working properly.
- std::string input =
- "{\n"
- " \"int32Value\": 1234567891,\n"
- " \"int64Value\": 5302428716536692736,\n"
- " \"floatValue\": 3.4028235e+38,\n"
- " \"repeatedInt32Value\": [1, 2],\n"
- " \"messageValue\": {\n"
- " \"value\": 2048\n"
- " },\n"
- " \"repeatedMessageValue\": [\n"
- " {\"value\": 40}, {\"value\": 96}\n"
- " ]\n"
- "}\n";
- JsonParseOptions options;
- TestMessage m;
- ASSERT_TRUE(FromJson(input, &m, options));
- EXPECT_EQ(1234567891, m.int32_value());
- EXPECT_EQ(5302428716536692736, m.int64_value());
- EXPECT_EQ(3.402823466e+38f, m.float_value());
- ASSERT_EQ(2, m.repeated_int32_value_size());
- EXPECT_EQ(1, m.repeated_int32_value(0));
- EXPECT_EQ(2, m.repeated_int32_value(1));
- EXPECT_EQ(2048, m.message_value().value());
- ASSERT_EQ(2, m.repeated_message_value_size());
- EXPECT_EQ(40, m.repeated_message_value(0).value());
- EXPECT_EQ(96, m.repeated_message_value(1).value());
+TEST_P(JsonTest, QuotedEnumValue) {
+ auto m = ToProto<TestEnumValue>(R"json(
+ {"enumValue1": "1"}
+ )json");
+ ASSERT_OK(m);
+ EXPECT_THAT(m->enum_value1(), proto3::BAR);
}
-TEST_F(JsonUtilTest, ParseMap) {
+TEST_P(JsonTest, WebSafeBytes) {
+ auto m = ToProto<TestMessage>(R"json({
+ "bytesValue": "-_"
+ })json");
+ ASSERT_OK(m);
+
+ EXPECT_EQ(m->bytes_value(), "\xfb");
+}
+
+TEST_P(JsonTest, ParseMessage) {
+ auto m = ToProto<TestMessage>(R"json(
+ {
+ "boolValue": true,
+ "int32Value": 1234567891,
+ "int64Value": -5302428716536692736,
+ "uint32Value": 42,
+ "uint64Value": 530242871653669,
+ "floatValue": 3.4e+38,
+ "doubleValue": -55.3,
+ "stringValue": "foo bar baz",
+ "enumValue": "BAR",
+ "messageValue": {
+ "value": 2048
+ },
+
+ "repeatedBoolValue": [true],
+ "repeatedInt32Value": [0, -42],
+ "repeatedUint64Value": [1, 2],
+ "repeatedDoubleValue": [1.5, -2],
+ "repeatedStringValue": ["foo", "bar ", ""],
+ "repeatedEnumValue": [1, "FOO"],
+ "repeatedMessageValue": [
+ {"value": 40},
+ {},
+ {"value": 96}
+ ]
+ }
+ )json");
+ ASSERT_OK(m);
+
+ EXPECT_TRUE(m->bool_value());
+ EXPECT_EQ(m->int32_value(), 1234567891);
+ EXPECT_EQ(m->int64_value(), -5302428716536692736);
+ EXPECT_EQ(m->uint32_value(), 42);
+ EXPECT_EQ(m->uint64_value(), 530242871653669);
+ EXPECT_EQ(m->float_value(), 3.4e+38f);
+ EXPECT_EQ(m->double_value(),
+ -55.3); // This value is intentionally not a nice
+ // round number in base 2, so its floating point
+ // representation has many digits at the end, which
+ // printing back to JSON must handle well.
+ EXPECT_EQ(m->string_value(), "foo bar baz");
+ EXPECT_EQ(m->enum_value(), proto3::EnumType::BAR);
+ EXPECT_EQ(m->message_value().value(), 2048);
+
+ EXPECT_THAT(m->repeated_bool_value(), ElementsAre(true));
+ EXPECT_THAT(m->repeated_int32_value(), ElementsAre(0, -42));
+ EXPECT_THAT(m->repeated_uint64_value(), ElementsAre(1, 2));
+ EXPECT_THAT(m->repeated_double_value(), ElementsAre(1.5, -2));
+ EXPECT_THAT(m->repeated_string_value(), ElementsAre("foo", "bar ", ""));
+ EXPECT_THAT(m->repeated_enum_value(), ElementsAre(proto3::BAR, proto3::FOO));
+
+ ASSERT_THAT(m->repeated_message_value(), SizeIs(3));
+ EXPECT_EQ(m->repeated_message_value(0).value(), 40);
+ EXPECT_EQ(m->repeated_message_value(1).value(), 0);
+ EXPECT_EQ(m->repeated_message_value(2).value(), 96);
+
+ EXPECT_THAT(
+ ToJson(*m),
+ IsOkAndHolds(
+ R"({"boolValue":true,"int32Value":1234567891,"int64Value":"-5302428716536692736",)"
+ R"("uint32Value":42,"uint64Value":"530242871653669","floatValue":3.4e+38,)"
+ R"("doubleValue":-55.3,"stringValue":"foo bar baz","enumValue":"BAR",)"
+ R"("messageValue":{"value":2048},"repeatedBoolValue":[true],"repeatedInt32Value":[0,-42])"
+ R"(,"repeatedUint64Value":["1","2"],"repeatedDoubleValue":[1.5,-2],)"
+ R"("repeatedStringValue":["foo","bar ",""],"repeatedEnumValue":["BAR","FOO"],)"
+ R"("repeatedMessageValue":[{"value":40},{},{"value":96}]})"));
+}
+
+TEST_P(JsonTest, CurseOfAtob) {
+ auto m = ToProto<TestMessage>(R"json(
+ {
+ repeatedBoolValue: ["0", "1", "false", "true", "f", "t", "no", "yes", "n", "y"]
+ }
+ )json");
+ ASSERT_OK(m);
+ EXPECT_THAT(m->repeated_bool_value(),
+ ElementsAre(false, true, false, true, false, true, false, true,
+ false, true));
+}
+
+TEST_P(JsonTest, FloatPrecision) {
+ google::protobuf::Value v;
+ v.mutable_list_value()->add_values()->set_number_value(0.9900000095367432);
+ v.mutable_list_value()->add_values()->set_number_value(0.8799999952316284);
+
+ EXPECT_THAT(ToJson(v),
+ IsOkAndHolds("[0.99000000953674316,0.87999999523162842]"));
+}
+
+TEST_P(JsonTest, FloatMinMaxValue) {
+ // 3.4028235e38 is FLT_MAX to 8-significant-digits. The final digit (5)
+ // is rounded up; that means that when parsing this as a 64-bit FP number,
+ // the value ends up higher than FLT_MAX. We still want to accept it though,
+ // as a reasonable representation of FLT_MAX.
+ auto m = ToProto<TestMessage>(R"json(
+ {
+ "repeatedFloatValue": [3.4028235e38, -3.4028235e38],
+ }
+ )json");
+ ASSERT_OK(m);
+ EXPECT_THAT(m->repeated_float_value(), ElementsAre(FLT_MAX, -FLT_MAX));
+}
+
+TEST_P(JsonTest, FloatOutOfRange) {
+ // Check that the slightly-lenient parsing demonstrated in FloatMinMaxValue
+ // doesn't mean we allow all values. The value being parsed differs only
+ // in the least significant (represented) digit.
+ auto m = ToProto<TestMessage>(R"json(
+ {
+ "floatValue": 3.4028236e38
+ }
+ )json");
+ EXPECT_THAT(m, StatusIs(absl::StatusCode::kInvalidArgument));
+}
+
+TEST_P(JsonTest, ParseLegacySingleRepeatedField) {
+ auto m = ToProto<TestMessage>(R"json({
+ "repeatedInt32Value": 1997,
+ "repeatedStringValue": "oh no",
+ "repeatedEnumValue": "BAR",
+ "repeatedMessageValue": {"value": -1}
+ })json");
+ ASSERT_OK(m);
+
+ EXPECT_THAT(m->repeated_int32_value(), ElementsAre(1997));
+ EXPECT_THAT(m->repeated_string_value(), ElementsAre("oh no"));
+ EXPECT_THAT(m->repeated_enum_value(), ElementsAre(proto3::EnumType::BAR));
+
+ ASSERT_THAT(m->repeated_message_value(), SizeIs(1));
+ EXPECT_EQ(m->repeated_message_value(0).value(), -1);
+
+ EXPECT_THAT(ToJson(*m),
+ IsOkAndHolds(R"({"repeatedInt32Value":[1997],)"
+ R"("repeatedStringValue":["oh no"],)"
+ R"("repeatedEnumValue":["BAR"],)"
+ R"("repeatedMessageValue":[{"value":-1}]})"));
+}
+
+TEST_P(JsonTest, ParseMap) {
TestMap message;
(*message.mutable_string_map())["hello"] = 1234;
- JsonPrintOptions print_options;
- JsonParseOptions parse_options;
- EXPECT_EQ("{\"stringMap\":{\"hello\":1234}}", ToJson(message, print_options));
- TestMap other;
- ASSERT_TRUE(FromJson(ToJson(message, print_options), &other, parse_options));
- EXPECT_EQ(message.DebugString(), other.DebugString());
+ auto printed = ToJson(message);
+ ASSERT_THAT(printed, IsOkAndHolds(R"({"stringMap":{"hello":1234}})"));
+
+ auto other = ToProto<TestMap>(*printed);
+ ASSERT_OK(other);
+ EXPECT_EQ(other->DebugString(), message.DebugString());
}
-TEST_F(JsonUtilTest, ParsePrimitiveMapIn) {
+TEST_P(JsonTest, RepeatedMapKey) {
+ EXPECT_THAT(ToProto<TestMap>(R"json({
+ "string_map": {
+ "twiceKey": 0,
+ "twiceKey": 1
+ }
+ })json"), StatusIs(absl::StatusCode::kInvalidArgument));
+}
+
+TEST_P(JsonTest, ParsePrimitiveMapIn) {
MapIn message;
JsonPrintOptions print_options;
print_options.always_print_primitive_fields = true;
- JsonParseOptions parse_options;
- EXPECT_EQ("{\"other\":\"\",\"things\":[],\"mapInput\":{},\"mapAny\":{}}",
- ToJson(message, print_options));
- MapIn other;
- ASSERT_TRUE(FromJson(ToJson(message, print_options), &other, parse_options));
- EXPECT_EQ(message.DebugString(), other.DebugString());
+ auto printed = ToJson(message, print_options);
+ ASSERT_THAT(
+ ToJson(message, print_options),
+ IsOkAndHolds(R"({"other":"","things":[],"mapInput":{},"mapAny":{}})"));
+
+ auto other = ToProto<MapIn>(*printed);
+ ASSERT_OK(other);
+ EXPECT_EQ(other->DebugString(), message.DebugString());
}
-TEST_F(JsonUtilTest, PrintPrimitiveOneof) {
+TEST_P(JsonTest, PrintPrimitiveOneof) {
TestOneof message;
JsonPrintOptions options;
options.always_print_primitive_fields = true;
message.mutable_oneof_message_value();
- EXPECT_EQ("{\"oneofMessageValue\":{\"value\":0}}", ToJson(message, options));
+ EXPECT_THAT(ToJson(message, options),
+ IsOkAndHolds(R"({"oneofMessageValue":{"value":0}})"));
message.set_oneof_int32_value(1);
- EXPECT_EQ("{\"oneofInt32Value\":1}", ToJson(message, options));
+ EXPECT_THAT(ToJson(message, options),
+ IsOkAndHolds(R"({"oneofInt32Value":1})"));
}
-TEST_F(JsonUtilTest, TestParseIgnoreUnknownFields) {
- TestMessage m;
+TEST_P(JsonTest, ParseOverOneof) {
+ TestOneof m;
+ m.set_oneof_string_value("foo");
+ ASSERT_OK(ToProto(m, R"json({
+ "oneofInt32Value": 5,
+ })json"));
+ EXPECT_EQ(m.oneof_int32_value(), 5);
+}
+
+TEST_P(JsonTest, RepeatedSingularKeys) {
+ auto m = ToProto<TestMessage>(R"json({
+ "int32Value": 1,
+ "int32Value": 2
+ })json");
+ EXPECT_OK(m);
+ EXPECT_EQ(m->int32_value(), 2);
+}
+
+TEST_P(JsonTest, RepeatedRepeatedKeys) {
+ auto m = ToProto<TestMessage>(R"json({
+ "repeatedInt32Value": [1],
+ "repeatedInt32Value": [2, 3]
+ })json");
+ EXPECT_OK(m);
+ EXPECT_THAT(m->repeated_int32_value(), ElementsAre(1, 2, 3));
+}
+
+TEST_P(JsonTest, RepeatedOneofKeys) {
+ EXPECT_THAT(ToProto<TestOneof>(R"json({
+ "oneofInt32Value": 1,
+ "oneofStringValue": "foo"
+ })json"),
+ StatusIs(absl::StatusCode::kInvalidArgument));
+}
+
+TEST_P(JsonTest, TestParseIgnoreUnknownFields) {
JsonParseOptions options;
options.ignore_unknown_fields = true;
- EXPECT_TRUE(FromJson("{\"unknownName\":0}", &m, options));
-}
+ EXPECT_OK(ToProto<TestMessage>(R"({"unknownName":0})", options));
-TEST_F(JsonUtilTest, TestParseErrors) {
TestMessage m;
- JsonParseOptions options;
- // Parsing should fail if the field name can not be recognized.
- EXPECT_FALSE(FromJson("{\"unknownName\":0}", &m, options));
- // Parsing should fail if the value is invalid.
- EXPECT_FALSE(FromJson("{\"int32Value\":2147483648}", &m, options));
+ m.GetReflection()->MutableUnknownFields(&m)->AddFixed32(9001, 9001);
+ m.GetReflection()->MutableUnknownFields(&m)->AddFixed64(9001, 9001);
+ m.GetReflection()->MutableUnknownFields(&m)->AddVarint(9001, 9001);
+ m.GetReflection()->MutableUnknownFields(&m)->AddLengthDelimited(9001, "9001");
+ EXPECT_THAT(ToJson(m), IsOkAndHolds("{}"));
}
-TEST_F(JsonUtilTest, TestDynamicMessage) {
- // Some random message but good enough to test the wrapper functions.
- std::string input =
- "{\n"
- " \"int32Value\": 1024,\n"
- " \"repeatedInt32Value\": [1, 2],\n"
- " \"messageValue\": {\n"
- " \"value\": 2048\n"
- " },\n"
- " \"repeatedMessageValue\": [\n"
- " {\"value\": 40}, {\"value\": 96}\n"
- " ]\n"
- "}\n";
+TEST_P(JsonTest, TestParseErrors) {
+ // Parsing should fail if the field name can not be recognized.
+ EXPECT_THAT(ToProto<TestMessage>(R"({"unknownName": 0})"),
+ StatusIs(absl::StatusCode::kInvalidArgument));
+ // Parsing should fail if the value is invalid.
+ EXPECT_THAT(ToProto<TestMessage>(R"("{"int32Value": 2147483648})"),
+ StatusIs(absl::StatusCode::kInvalidArgument));
+}
+TEST_P(JsonTest, TestDynamicMessage) {
// Create a new DescriptorPool with the same protos as the generated one.
DescriptorPoolDatabase database(*DescriptorPool::generated_pool());
DescriptorPool pool(&database);
@@ -363,307 +671,664 @@
std::unique_ptr<Message> message(
factory.GetPrototype(pool.FindMessageTypeByName("proto3.TestMessage"))
->New());
- EXPECT_TRUE(FromJson(input, message.get()));
+ ASSERT_OK(ToProto(*message, R"json(
+ {
+ "int32Value": 1024,
+ "repeatedInt32Value": [1, 2],
+ "messageValue": {
+ "value": 2048
+ },
+ "repeatedMessageValue": [
+ {"value": 40},
+ {"value": 96}
+ ]
+ }
+ )json"));
// Convert to generated message for easy inspection.
TestMessage generated;
EXPECT_TRUE(generated.ParseFromString(message->SerializeAsString()));
- EXPECT_EQ(1024, generated.int32_value());
- ASSERT_EQ(2, generated.repeated_int32_value_size());
- EXPECT_EQ(1, generated.repeated_int32_value(0));
- EXPECT_EQ(2, generated.repeated_int32_value(1));
- EXPECT_EQ(2048, generated.message_value().value());
- ASSERT_EQ(2, generated.repeated_message_value_size());
- EXPECT_EQ(40, generated.repeated_message_value(0).value());
- EXPECT_EQ(96, generated.repeated_message_value(1).value());
- JsonOptions options;
- EXPECT_EQ(ToJson(generated, options), ToJson(*message, options));
+ EXPECT_EQ(generated.int32_value(), 1024);
+ EXPECT_THAT(generated.repeated_int32_value(), ElementsAre(1, 2));
+
+ EXPECT_EQ(generated.message_value().value(), 2048);
+ ASSERT_EQ(generated.repeated_message_value_size(), 2);
+ EXPECT_EQ(generated.repeated_message_value(0).value(), 40);
+ EXPECT_EQ(generated.repeated_message_value(1).value(), 96);
+
+ auto message_json = ToJson(*message);
+ ASSERT_OK(message_json);
+ auto generated_json = ToJson(generated);
+ ASSERT_OK(generated_json);
+ EXPECT_EQ(*message_json, *generated_json);
}
-TEST_F(JsonUtilTest, TestParsingUnknownAnyFields) {
- std::string input =
- "{\n"
- " \"value\": {\n"
- " \"@type\": \"type.googleapis.com/proto3.TestMessage\",\n"
- " \"unknown_field\": \"UNKNOWN_VALUE\",\n"
- " \"string_value\": \"expected_value\"\n"
- " }\n"
- "}";
-
- TestAny m;
- JsonParseOptions options;
- EXPECT_FALSE(FromJson(input, &m, options));
-
- options.ignore_unknown_fields = true;
- EXPECT_TRUE(FromJson(input, &m, options));
+TEST_P(JsonTest, TestParsingAny) {
+ auto m = ToProto<TestAny>(R"json(
+ {
+ "value": {
+ "@type": "type.googleapis.com/proto3.TestMessage",
+ "int32_value": 5,
+ "string_value": "expected_value",
+ "message_value": {"value": 1}
+ }
+ }
+ )json");
+ ASSERT_OK(m);
TestMessage t;
- EXPECT_TRUE(m.value().UnpackTo(&t));
- EXPECT_EQ("expected_value", t.string_value());
+ ASSERT_TRUE(m->value().UnpackTo(&t));
+ EXPECT_EQ(t.int32_value(), 5);
+ EXPECT_EQ(t.string_value(), "expected_value");
+ EXPECT_EQ(t.message_value().value(), 1);
+
+ EXPECT_THAT(
+ ToJson(*m),
+ IsOkAndHolds(
+ R"({"value":{"@type":"type.googleapis.com/proto3.TestMessage",)"
+ R"("int32Value":5,"stringValue":"expected_value","messageValue":{"value":1}}})"));
}
-TEST_F(JsonUtilTest, TestParsingUnknownEnumsProto2) {
- std::string input =
- "{\n"
- " \"a\": \"UNKNOWN_VALUE\"\n"
- "}";
- protobuf_unittest::TestNumbers m;
+TEST_P(JsonTest, TestParsingAnyMiddleAtType) {
+ auto m = ToProto<TestAny>(R"json(
+ {
+ "value": {
+ "int32_value": 5,
+ "string_value": "expected_value",
+ "@type": "type.googleapis.com/proto3.TestMessage",
+ "message_value": {"value": 1}
+ }
+ }
+ )json");
+ ASSERT_OK(m);
+
+ TestMessage t;
+ ASSERT_TRUE(m->value().UnpackTo(&t));
+ EXPECT_EQ(t.int32_value(), 5);
+ EXPECT_EQ(t.string_value(), "expected_value");
+ EXPECT_EQ(t.message_value().value(), 1);
+}
+
+TEST_P(JsonTest, TestParsingAnyEndAtType) {
+ auto m = ToProto<TestAny>(R"json(
+ {
+ "value": {
+ "int32_value": 5,
+ "string_value": "expected_value",
+ "message_value": {"value": 1},
+ "@type": "type.googleapis.com/proto3.TestMessage"
+ }
+ }
+ )json");
+ ASSERT_OK(m);
+
+ TestMessage t;
+ ASSERT_TRUE(m->value().UnpackTo(&t));
+ EXPECT_EQ(t.int32_value(), 5);
+ EXPECT_EQ(t.string_value(), "expected_value");
+ EXPECT_EQ(t.message_value().value(), 1);
+}
+
+TEST_P(JsonTest, TestParsingNestedAnys) {
+ auto m = ToProto<TestAny>(R"json(
+ {
+ "value": {
+ "value": {
+ "int32_value": 5,
+ "string_value": "expected_value",
+ "message_value": {"value": 1},
+ "@type": "type.googleapis.com/proto3.TestMessage"
+ },
+ "@type": "type.googleapis.com/google.protobuf.Any"
+ }
+ }
+ )json");
+ ASSERT_OK(m);
+
+ google::protobuf::Any inner;
+ ASSERT_TRUE(m->value().UnpackTo(&inner));
+
+ TestMessage t;
+ ASSERT_TRUE(inner.UnpackTo(&t));
+ EXPECT_EQ(t.int32_value(), 5);
+ EXPECT_EQ(t.string_value(), "expected_value");
+ EXPECT_EQ(t.message_value().value(), 1);
+
+ EXPECT_THAT(
+ ToJson(*m),
+ IsOkAndHolds(
+ R"({"value":{"@type":"type.googleapis.com/google.protobuf.Any",)"
+ R"("value":{"@type":"type.googleapis.com/proto3.TestMessage",)"
+ R"("int32Value":5,"stringValue":"expected_value","messageValue":{"value":1}}}})"));
+}
+
+TEST_P(JsonTest, TestParsingBrokenAny) {
+ auto m = ToProto<TestAny>(R"json(
+ {
+ "value": {}
+ }
+ )json");
+ ASSERT_OK(m);
+ EXPECT_EQ(m->value().type_url(), "");
+ EXPECT_EQ(m->value().value(), "");
+
+ EXPECT_THAT(ToProto<TestAny>(R"json(
+ {
+ "value": {
+ "type_url": "garbage",
+ "value": "bW9yZSBnYXJiYWdl"
+ }
+ }
+ )json"),
+ StatusIs(absl::StatusCode::kInvalidArgument));
+
+ TestAny m2;
+ m2.mutable_value();
+ EXPECT_THAT(ToJson(m2), IsOkAndHolds(R"({"value":{}})"));
+ m2.mutable_value()->set_value("garbage");
+ // The ESF parser does not return InvalidArgument for this error.
+ EXPECT_THAT(ToJson(m2), Not(StatusIs(absl::StatusCode::kOk)));
+
+ m2.Clear();
+ m2.mutable_value()->set_type_url("type.googleapis.com/proto3.TestMessage");
+ EXPECT_THAT(
+ ToJson(m2),
+ IsOkAndHolds(
+ R"({"value":{"@type":"type.googleapis.com/proto3.TestMessage"}})"));
+}
+
+TEST_P(JsonTest, TestFlatList) {
+ auto m = ToProto<TestMessage>(R"json(
+ {
+ "repeatedInt32Value": [[[5]], [6]]
+ }
+ )json");
+ ASSERT_OK(m);
+ EXPECT_THAT(m->repeated_int32_value(), ElementsAre(5, 6));
+
+ // The above flatteing behavior is suppressed for google::protobuf::ListValue.
+ auto m2 = ToProto<google::protobuf::Value>(R"json(
+ {
+ "repeatedInt32Value": [[[5]], [6]]
+ }
+ )json");
+ ASSERT_OK(m2);
+ auto fields = m2->struct_value().fields();
+ auto list = fields["repeatedInt32Value"].list_value();
+ EXPECT_EQ(list.values(0)
+ .list_value()
+ .values(0)
+ .list_value()
+ .values(0)
+ .number_value(),
+ 5);
+ EXPECT_EQ(list.values(1).list_value().values(0).number_value(), 6);
+}
+
+TEST_P(JsonTest, ParseWrappers) {
+ auto m = ToProto<TestWrapper>(R"json(
+ {
+ "boolValue": true,
+ "int32Value": 42,
+ "stringValue": "ieieo",
+ }
+ )json");
+ ASSERT_OK(m);
+
+ EXPECT_TRUE(m->bool_value().value());
+ EXPECT_EQ(m->int32_value().value(), 42);
+ EXPECT_EQ(m->string_value().value(), "ieieo");
+
+ EXPECT_THAT(
+ ToJson(*m),
+ IsOkAndHolds(
+ R"({"boolValue":true,"int32Value":42,"stringValue":"ieieo"})"));
+
+ auto m2 = ToProto<TestWrapper>(R"json(
+ {
+ "boolValue": { "value": true },
+ "int32Value": { "value": 42 },
+ "stringValue": { "value": "ieieo" },
+ }
+ )json");
+ ASSERT_OK(m2);
+
+ EXPECT_TRUE(m2->bool_value().value());
+ EXPECT_EQ(m2->int32_value().value(), 42);
+ EXPECT_EQ(m2->string_value().value(), "ieieo");
+}
+
+TEST_P(JsonTest, TestParsingUnknownAnyFields) {
+ absl::string_view input = R"json(
+ {
+ "value": {
+ "@type": "type.googleapis.com/proto3.TestMessage",
+ "unknown_field": "UNKNOWN_VALUE",
+ "string_value": "expected_value"
+ }
+ }
+ )json";
+
+ EXPECT_THAT(ToProto<TestAny>(input),
+ StatusIs(absl::StatusCode::kInvalidArgument));
+
JsonParseOptions options;
- EXPECT_FALSE(FromJson(input, &m, options));
-
options.ignore_unknown_fields = true;
- EXPECT_TRUE(FromJson(input, &m, options));
- EXPECT_FALSE(m.has_a());
+ auto m = ToProto<TestAny>(input, options);
+ ASSERT_OK(m);
+
+ TestMessage t;
+ ASSERT_TRUE(m->value().UnpackTo(&t));
+ EXPECT_EQ(t.string_value(), "expected_value");
}
-TEST_F(JsonUtilTest, TestParsingUnknownEnumsProto3) {
+TEST_P(JsonTest, TestHugeBareString) {
+ auto m = ToProto<TestMessage>(R"json({
+ "int64Value": 6009652459062546621
+ })json");
+ ASSERT_OK(m);
+ EXPECT_EQ(m->int64_value(), 6009652459062546621);
+}
+
+TEST_P(JsonTest, TestParsingUnknownEnumsProto2) {
+ absl::string_view input = R"json({"ayuLmao": "UNKNOWN_VALUE"})json";
+
+ EXPECT_THAT(ToProto<protobuf_unittest::TestNumbers>(input),
+ StatusIs(absl::StatusCode::kInvalidArgument));
+
+ JsonParseOptions options;
+ options.ignore_unknown_fields = true;
+ auto m = ToProto<protobuf_unittest::TestNumbers>(input, options);
+ ASSERT_OK(m);
+ EXPECT_FALSE(m->has_a());
+}
+
+TEST_P(JsonTest, TestParsingUnknownEnumsProto3) {
TestMessage m;
- {
- JsonParseOptions options;
- ASSERT_FALSE(options.ignore_unknown_fields);
- std::string input =
- "{\n"
- " \"enum_value\":\"UNKNOWN_VALUE\"\n"
- "}";
- m.set_enum_value(proto3::BAR);
- EXPECT_FALSE(FromJson(input, &m, options));
- ASSERT_EQ(proto3::BAR, m.enum_value()); // Keep previous value
+ absl::string_view input = R"json({"enum_value":"UNKNOWN_VALUE"})json";
- options.ignore_unknown_fields = true;
- EXPECT_TRUE(FromJson(input, &m, options));
- EXPECT_EQ(0, m.enum_value()); // Unknown enum value must be decoded as 0
- }
- // Integer values are read as usual
- {
- JsonParseOptions options;
- std::string input =
- "{\n"
- " \"enum_value\":12345\n"
- "}";
- m.set_enum_value(proto3::BAR);
- EXPECT_TRUE(FromJson(input, &m, options));
- ASSERT_EQ(12345, m.enum_value());
+ m.set_enum_value(proto3::BAR);
+ ASSERT_THAT(ToProto(m, input), StatusIs(absl::StatusCode::kInvalidArgument));
+ EXPECT_EQ(m.enum_value(), proto3::BAR); // Keep previous value
- options.ignore_unknown_fields = true;
- EXPECT_TRUE(FromJson(input, &m, options));
- EXPECT_EQ(12345, m.enum_value());
- }
-
- // Trying to pass an object as an enum field value is always treated as an
- // error
- {
- JsonParseOptions options;
- std::string input =
- "{\n"
- " \"enum_value\":{}\n"
- "}";
- options.ignore_unknown_fields = true;
- EXPECT_FALSE(FromJson(input, &m, options));
- options.ignore_unknown_fields = false;
- EXPECT_FALSE(FromJson(input, &m, options));
- }
- // Trying to pass an array as an enum field value is always treated as an
- // error
- {
- JsonParseOptions options;
- std::string input =
- "{\n"
- " \"enum_value\":[]\n"
- "}";
- EXPECT_FALSE(FromJson(input, &m, options));
- options.ignore_unknown_fields = true;
- EXPECT_FALSE(FromJson(input, &m, options));
- }
+ JsonParseOptions options;
+ options.ignore_unknown_fields = true;
+ ASSERT_OK(ToProto(m, input, options));
+ EXPECT_EQ(m.enum_value(), 0); // Unknown enum value must be decoded as 0
}
-TEST_F(JsonUtilTest, TestParsingEnumIgnoreCase) {
+TEST_P(JsonTest, TestParsingUnknownEnumsProto3FromInt) {
TestMessage m;
- {
- JsonParseOptions options;
- std::string input =
- "{\n"
- " \"enum_value\":\"bar\"\n"
- "}";
- m.set_enum_value(proto3::FOO);
- EXPECT_FALSE(FromJson(input, &m, options));
- // Default behavior is case-sensitive, so keep previous value.
- ASSERT_EQ(proto3::FOO, m.enum_value());
- }
- {
- JsonParseOptions options;
- options.case_insensitive_enum_parsing = false;
- std::string input =
- "{\n"
- " \"enum_value\":\"bar\"\n"
- "}";
- m.set_enum_value(proto3::FOO);
- EXPECT_FALSE(FromJson(input, &m, options));
- ASSERT_EQ(proto3::FOO, m.enum_value()); // Keep previous value
- }
- {
- JsonParseOptions options;
- options.case_insensitive_enum_parsing = true;
- std::string input =
- "{\n"
- " \"enum_value\":\"bar\"\n"
- "}";
- m.set_enum_value(proto3::FOO);
- EXPECT_TRUE(FromJson(input, &m, options));
- ASSERT_EQ(proto3::BAR, m.enum_value());
- }
+ absl::string_view input = R"json({"enum_value":12345})json";
+
+ m.set_enum_value(proto3::BAR);
+ ASSERT_OK(ToProto(m, input));
+ EXPECT_EQ(m.enum_value(), 12345);
+
+ JsonParseOptions options;
+ options.ignore_unknown_fields = true;
+ ASSERT_OK(ToProto(m, input, options));
+ EXPECT_EQ(m.enum_value(), 12345);
}
-typedef std::pair<char*, int> Segment;
-// A ZeroCopyOutputStream that writes to multiple buffers.
-class SegmentedZeroCopyOutputStream : public io::ZeroCopyOutputStream {
- public:
- explicit SegmentedZeroCopyOutputStream(std::list<Segment> segments)
- : segments_(segments),
- last_segment_(static_cast<char*>(NULL), 0),
- byte_count_(0) {}
+// Trying to pass an object as an enum field value is always treated as an
+// error
+TEST_P(JsonTest, TestParsingUnknownEnumsProto3FromObject) {
+ absl::string_view input = R"json({"enum_value": {}})json";
- bool Next(void** buffer, int* length) override {
- if (segments_.empty()) {
- return false;
- }
- last_segment_ = segments_.front();
- segments_.pop_front();
- *buffer = last_segment_.first;
- *length = last_segment_.second;
- byte_count_ += *length;
- return true;
- }
+ EXPECT_THAT(ToProto<TestMessage>(input),
+ StatusIs(absl::StatusCode::kInvalidArgument));
- void BackUp(int length) override {
- GOOGLE_CHECK(length <= last_segment_.second);
- segments_.push_front(
- Segment(last_segment_.first + last_segment_.second - length, length));
- last_segment_ = Segment(last_segment_.first, last_segment_.second - length);
- byte_count_ -= length;
- }
-
- int64_t ByteCount() const override { return byte_count_; }
-
- private:
- std::list<Segment> segments_;
- Segment last_segment_;
- int64_t byte_count_;
-};
-
-// This test splits the output buffer and also the input data into multiple
-// segments and checks that the implementation of ZeroCopyStreamByteSink
-// handles all possible cases correctly.
-TEST(ZeroCopyStreamByteSinkTest, TestAllInputOutputPatterns) {
- static const int kOutputBufferLength = 10;
- // An exhaustive test takes too long, skip some combinations to make the test
- // run faster.
- static const int kSkippedPatternCount = 7;
-
- char buffer[kOutputBufferLength];
- for (int split_pattern = 0; split_pattern < (1 << (kOutputBufferLength - 1));
- split_pattern += kSkippedPatternCount) {
- // Split the buffer into small segments according to the split_pattern.
- std::list<Segment> segments;
- int segment_start = 0;
- for (int i = 0; i < kOutputBufferLength - 1; ++i) {
- if (split_pattern & (1 << i)) {
- segments.push_back(
- Segment(buffer + segment_start, i - segment_start + 1));
- segment_start = i + 1;
- }
- }
- segments.push_back(
- Segment(buffer + segment_start, kOutputBufferLength - segment_start));
-
- // Write exactly 10 bytes through the ByteSink.
- std::string input_data = "0123456789";
- for (int input_pattern = 0; input_pattern < (1 << (input_data.size() - 1));
- input_pattern += kSkippedPatternCount) {
- memset(buffer, 0, sizeof(buffer));
- {
- SegmentedZeroCopyOutputStream output_stream(segments);
- internal::ZeroCopyStreamByteSink byte_sink(&output_stream);
- int start = 0;
- for (int j = 0; j < input_data.length() - 1; ++j) {
- if (input_pattern & (1 << j)) {
- byte_sink.Append(&input_data[start], j - start + 1);
- start = j + 1;
- }
- }
- byte_sink.Append(&input_data[start], input_data.length() - start);
- }
- EXPECT_EQ(input_data, std::string(buffer, input_data.length()));
- }
-
- // Write only 9 bytes through the ByteSink.
- input_data = "012345678";
- for (int input_pattern = 0; input_pattern < (1 << (input_data.size() - 1));
- input_pattern += kSkippedPatternCount) {
- memset(buffer, 0, sizeof(buffer));
- {
- SegmentedZeroCopyOutputStream output_stream(segments);
- internal::ZeroCopyStreamByteSink byte_sink(&output_stream);
- int start = 0;
- for (int j = 0; j < input_data.length() - 1; ++j) {
- if (input_pattern & (1 << j)) {
- byte_sink.Append(&input_data[start], j - start + 1);
- start = j + 1;
- }
- }
- byte_sink.Append(&input_data[start], input_data.length() - start);
- }
- EXPECT_EQ(input_data, std::string(buffer, input_data.length()));
- EXPECT_EQ(0, buffer[input_data.length()]);
- }
-
- // Write 11 bytes through the ByteSink. The extra byte will just
- // be ignored.
- input_data = "0123456789A";
- for (int input_pattern = 0; input_pattern < (1 << (input_data.size() - 1));
- input_pattern += kSkippedPatternCount) {
- memset(buffer, 0, sizeof(buffer));
- {
- SegmentedZeroCopyOutputStream output_stream(segments);
- internal::ZeroCopyStreamByteSink byte_sink(&output_stream);
- int start = 0;
- for (int j = 0; j < input_data.length() - 1; ++j) {
- if (input_pattern & (1 << j)) {
- byte_sink.Append(&input_data[start], j - start + 1);
- start = j + 1;
- }
- }
- byte_sink.Append(&input_data[start], input_data.length() - start);
- }
- EXPECT_EQ(input_data.substr(0, kOutputBufferLength),
- std::string(buffer, kOutputBufferLength));
- }
- }
+ JsonParseOptions options;
+ options.ignore_unknown_fields = true;
+ EXPECT_THAT(ToProto<TestMessage>(input, options),
+ StatusIs(absl::StatusCode::kInvalidArgument));
}
-TEST_F(JsonUtilTest, TestWrongJsonInput) {
- const char json[] = "{\"unknown_field\":\"some_value\"}";
- io::ArrayInputStream input_stream(json, strlen(json));
- char proto_buffer[10000];
- io::ArrayOutputStream output_stream(proto_buffer, sizeof(proto_buffer));
- std::string message_type = "type.googleapis.com/proto3.TestMessage";
- TypeResolver* resolver = NewTypeResolverForDescriptorPool(
- "type.googleapis.com", DescriptorPool::generated_pool());
+TEST_P(JsonTest, TestParsingUnknownEnumsProto3FromArray) {
+ absl::string_view input = R"json({"enum_value": []})json";
- auto result_status = util::JsonToBinaryStream(resolver, message_type,
- &input_stream, &output_stream);
+ EXPECT_THAT(ToProto<TestMessage>(input),
+ StatusIs(absl::StatusCode::kInvalidArgument));
- delete resolver;
-
- EXPECT_FALSE(result_status.ok());
- EXPECT_TRUE(util::IsInvalidArgument(result_status));
+ JsonParseOptions options;
+ options.ignore_unknown_fields = true;
+ EXPECT_THAT(ToProto<TestMessage>(input, options),
+ StatusIs(absl::StatusCode::kInvalidArgument));
}
-TEST_F(JsonUtilTest, HtmlEscape) {
+TEST_P(JsonTest, TestParsingEnumCaseSensitive) {
+ TestMessage m;
+ m.set_enum_value(proto3::FOO);
+ EXPECT_THAT(ToProto(m, R"json({"enum_value": "bar"})json"),
+ StatusIs(absl::StatusCode::kInvalidArgument));
+ // Default behavior is case-sensitive, so keep previous value.
+ EXPECT_EQ(m.enum_value(), proto3::FOO);
+}
+
+TEST_P(JsonTest, TestParsingEnumLowercase) {
+ JsonParseOptions options;
+ options.case_insensitive_enum_parsing = true;
+ auto m =
+ ToProto<TestMessage>(R"json({"enum_value": "TLSv1_2"})json", options);
+ ASSERT_OK(m);
+ EXPECT_THAT(m->enum_value(), proto3::TLSv1_2);
+}
+
+TEST_P(JsonTest, TestParsingEnumIgnoreCase) {
+ TestMessage m;
+ m.set_enum_value(proto3::FOO);
+
+ JsonParseOptions options;
+ options.case_insensitive_enum_parsing = true;
+ ASSERT_OK(ToProto(m, R"json({"enum_value":"bar"})json", options));
+ EXPECT_EQ(m.enum_value(), proto3::BAR);
+}
+
+// This functionality is not correctly implemented by the ESF parser, so
+// the test is only turned on when testing json2.
+TEST_P(JsonTest, Extensions) {
+ if (GetParam() == Codec::kResolver || !IsJson2()) {
+ GTEST_SKIP();
+ }
+
+ auto m = ToProto<protobuf_unittest::TestMixedFieldsAndExtensions>(R"json({
+ "[protobuf_unittest.TestMixedFieldsAndExtensions.c]": 42,
+ "a": 5,
+ "b": [1, 2, 3],
+ "[protobuf_unittest.TestMixedFieldsAndExtensions.d]": [1, 1, 2, 3, 5, 8, 13]
+ })json");
+ ASSERT_OK(m);
+ EXPECT_EQ(m->a(), 5);
+ EXPECT_THAT(m->b(), ElementsAre(1, 2, 3));
+ EXPECT_EQ(m->GetExtension(protobuf_unittest::TestMixedFieldsAndExtensions::c),
+ 42);
+ EXPECT_THAT(
+ m->GetRepeatedExtension(protobuf_unittest::TestMixedFieldsAndExtensions::d),
+ ElementsAre(1, 1, 2, 3, 5, 8, 13));
+
+ EXPECT_THAT(
+ ToJson(*m),
+ IsOkAndHolds(
+ R"({"a":5,)"
+ R"("[protobuf_unittest.TestMixedFieldsAndExtensions.c]":42,)"
+ R"("b":[1,2,3],)"
+ R"("[protobuf_unittest.TestMixedFieldsAndExtensions.d]":[1,1,2,3,5,8,13]})"));
+}
+
+// Parsing does NOT work like MergeFrom: existing repeated field values are
+// clobbered, not appended to.
+TEST_P(JsonTest, TestOverwriteRepeated) {
+ TestMessage m;
+ m.add_repeated_int32_value(5);
+
+ ASSERT_OK(ToProto(m, R"json({"repeated_int32_value": [1, 2, 3]})json"));
+ EXPECT_THAT(m.repeated_int32_value(), ElementsAre(1, 2, 3));
+}
+
+
+TEST_P(JsonTest, TestDuration) {
+ auto m = ToProto<proto3::TestDuration>(R"json(
+ {
+ "value": "123456.789s",
+ "repeated_value": ["0.1s", "999s"]
+ }
+ )json");
+ ASSERT_OK(m);
+
+ EXPECT_EQ(m->value().seconds(), 123456);
+ EXPECT_EQ(m->value().nanos(), 789000000);
+
+ EXPECT_THAT(m->repeated_value(), SizeIs(2));
+ EXPECT_EQ(m->repeated_value(0).seconds(), 0);
+ EXPECT_EQ(m->repeated_value(0).nanos(), 100000000);
+ EXPECT_EQ(m->repeated_value(1).seconds(), 999);
+ EXPECT_EQ(m->repeated_value(1).nanos(), 0);
+
+ EXPECT_THAT(
+ ToJson(*m),
+ IsOkAndHolds(
+ R"({"value":"123456.789s","repeatedValue":["0.100s","999s"]})"));
+
+ auto m2 = ToProto<proto3::TestDuration>(R"json(
+ {
+ "value": {"seconds": 4, "nanos": 5},
+ }
+ )json");
+ ASSERT_OK(m2);
+
+ EXPECT_EQ(m2->value().seconds(), 4);
+ EXPECT_EQ(m2->value().nanos(), 5);
+
+ // Negative duration with zero seconds.
+ auto m3 = ToProto<proto3::TestDuration>(R"json(
+ {
+ "value": {"nanos": -5},
+ }
+ )json");
+ ASSERT_OK(m3);
+ EXPECT_EQ(m3->value().seconds(), 0);
+ EXPECT_EQ(m3->value().nanos(), -5);
+ EXPECT_THAT(ToJson(m3->value()), IsOkAndHolds("\"-0.000000005s\""));
+
+ // Negative duration with zero nanos.
+ auto m4 = ToProto<proto3::TestDuration>(R"json(
+ {
+ "value": {"seconds": -5},
+ }
+ )json");
+ ASSERT_OK(m4);
+ EXPECT_EQ(m4->value().seconds(), -5);
+ EXPECT_EQ(m4->value().nanos(), 0);
+ EXPECT_THAT(ToJson(m4->value()), IsOkAndHolds("\"-5s\""));
+
+ // Parse "0.5s" as a JSON string.
+ auto m5 = ToProto<proto3::TestDuration>(R"json(
+ {
+ "value": "0.5s",
+ }
+ )json");
+ ASSERT_OK(m5);
+ EXPECT_EQ(m5->value().seconds(), 0);
+ EXPECT_EQ(m5->value().nanos(), 500000000);
+ EXPECT_THAT(ToJson(m5->value()), IsOkAndHolds("\"0.500s\""));
+}
+
+// These tests are not exhaustive; tests in //third_party/protobuf/conformance
+// are more comprehensive.
+TEST_P(JsonTest, TestTimestamp) {
+ auto m = ToProto<proto3::TestTimestamp>(R"json(
+ {
+ "value": "1996-02-27T12:00:00Z",
+ "repeated_value": ["9999-12-31T23:59:59Z"]
+ }
+ )json");
+ ASSERT_OK(m);
+
+ EXPECT_EQ(m->value().seconds(), 825422400);
+ EXPECT_EQ(m->value().nanos(), 0);
+ EXPECT_THAT(m->repeated_value(), SizeIs(1));
+ EXPECT_EQ(m->repeated_value(0).seconds(), 253402300799);
+ EXPECT_EQ(m->repeated_value(0).nanos(), 0);
+
+ EXPECT_THAT(
+ ToJson(*m),
+ IsOkAndHolds(
+ R"({"value":"1996-02-27T12:00:00Z","repeatedValue":["9999-12-31T23:59:59Z"]})"));
+
+ auto m2 = ToProto<proto3::TestTimestamp>(R"json(
+ {
+ "value": {"seconds": 4, "nanos": 5},
+ }
+ )json");
+ ASSERT_OK(m2);
+
+ EXPECT_EQ(m2->value().seconds(), 4);
+ EXPECT_EQ(m2->value().nanos(), 5);
+}
+
+// This test case comes from Envoy's tests. They like to parse a Value out of
+// YAML, turn it into JSON, and then parse it as a different proto. This means
+// we must be extremely careful with integer fields, because they need to
+// round-trip through doubles. This happens all over Envoy. :(
+TEST_P(JsonTest, TestEnvoyRoundTrip) {
+ auto m = ToProto<google::protobuf::Value>(R"json(
+ {
+ "value": {"seconds": 1234567891, "nanos": 234000000},
+ }
+ )json");
+ ASSERT_OK(m);
+
+ auto j = ToJson(*m);
+ ASSERT_OK(j);
+
+ auto m2 = ToProto<proto3::TestTimestamp>(*j);
+ ASSERT_OK(m2);
+
+ EXPECT_EQ(m2->value().seconds(), 1234567891);
+ EXPECT_EQ(m2->value().nanos(), 234000000);
+}
+
+TEST_P(JsonTest, TestFieldMask) {
+ auto m = ToProto<proto3::TestFieldMask>(R"json(
+ {
+ "value": "foo,bar.bazBaz"
+ }
+ )json");
+ ASSERT_OK(m);
+
+ EXPECT_THAT(m->value().paths(), ElementsAre("foo", "bar.baz_baz"));
+ EXPECT_THAT(ToJson(*m), IsOkAndHolds(R"({"value":"foo,bar.bazBaz"})"));
+
+ auto m2 = ToProto<proto3::TestFieldMask>(R"json(
+ {
+ "value": {
+ "paths": ["yep.really"]
+ },
+ }
+ )json");
+ ASSERT_OK(m2);
+
+ EXPECT_THAT(m2->value().paths(), ElementsAre("yep.really"));
+}
+
+TEST_P(JsonTest, TestFieldMaskSnakeCase) {
+ auto m = ToProto<proto3::TestFieldMask>(R"json(
+ {
+ "value": "foo_bar"
+ }
+ )json");
+ ASSERT_OK(m);
+
+ EXPECT_THAT(m->value().paths(), ElementsAre("foo_bar"));
+}
+
+TEST_P(JsonTest, TestLegalNullsInArray) {
+ auto m = ToProto<proto3::TestNullValue>(R"json({
+ "repeatedNullValue": [null]
+ })json");
+ ASSERT_OK(m);
+
+ EXPECT_THAT(m->repeated_null_value(),
+ ElementsAre(google::protobuf::NULL_VALUE));
+
+ auto m2 = ToProto<proto3::TestValue>(R"json({
+ "repeatedValue": [null]
+ })json");
+ ASSERT_OK(m2);
+
+ ASSERT_THAT(m2->repeated_value(), SizeIs(1));
+ EXPECT_TRUE(m2->repeated_value(0).has_null_value());
+
+ m2->Clear();
+ m2->mutable_value(); // Materialize an empty singular Value.
+ m2->add_repeated_value();
+ m2->add_repeated_value()->set_string_value("solitude");
+ m2->add_repeated_value();
+ EXPECT_THAT(ToJson(*m2), IsOkAndHolds(R"({"repeatedValue":["solitude"]})"));
+}
+
+TEST_P(JsonTest, EmptyValue) {
+ EXPECT_THAT(ToJson(google::protobuf::Value()), IsOkAndHolds(""));
+
+ google::protobuf::Struct s;
+ s.mutable_fields()->emplace("empty", google::protobuf::Value());
+ EXPECT_THAT(ToJson(s), IsOkAndHolds("{}"));
+}
+
+TEST_P(JsonTest, TrailingGarbage) {
+ EXPECT_THAT(ToProto<TestMessage>("{}garbage"),
+ StatusIs(absl::StatusCode::kInvalidArgument));
+}
+
+TEST_P(JsonTest, ListList) {
+ auto m = ToProto<proto3::TestListValue>(R"json({
+ "repeated_value": [["ayy", "lmao"]]
+ })json");
+ ASSERT_OK(m);
+
+ EXPECT_EQ(m->repeated_value(0).values(0).string_value(), "ayy");
+ EXPECT_EQ(m->repeated_value(0).values(1).string_value(), "lmao");
+
+ m = ToProto<proto3::TestListValue>(R"json({
+ "repeated_value": [{
+ "values": ["ayy", "lmao"]
+ }]
+ })json");
+ ASSERT_OK(m);
+
+ EXPECT_EQ(m->repeated_value(0).values(0).string_value(), "ayy");
+ EXPECT_EQ(m->repeated_value(0).values(1).string_value(), "lmao");
+}
+
+TEST_P(JsonTest, HtmlEscape) {
TestMessage m;
m.set_string_value("</script>");
- JsonPrintOptions options;
- EXPECT_EQ("{\"stringValue\":\"\\u003c/script\\u003e\"}", ToJson(m, options));
+ EXPECT_THAT(ToJson(m),
+ IsOkAndHolds(R"({"stringValue":"\u003c/script\u003e"})"));
+
+ proto3::TestEvilJson m2;
+ JsonPrintOptions opts;
+ opts.always_print_primitive_fields = true;
+ EXPECT_THAT(
+ ToJson(m2, opts),
+ IsOkAndHolds(
+ R"({"regular_name":0,"\u003c/script\u003e":0,)"
+ R"("unbalanced\"quotes":0,)"
+ R"("\"\u003cscript\u003ealert('hello!);\u003c/script\u003e":0})"));
+}
+
+TEST_P(JsonTest, FieldOrder) {
+ // $ protoscope -s <<< "3: 3 22: 2 1: 1 22: 2"
+ std::string out;
+ absl::Status s = BinaryToJsonString(
+ resolver_.get(), "type.googleapis.com/proto3.TestMessage",
+ "\x18\x03\xb0\x01\x02\x08\x01\xb0\x01\x02", &out);
+ ASSERT_OK(s);
+ if (IsJson2()) {
+ EXPECT_EQ(
+ out,
+ R"({"boolValue":true,"int64Value":"3","repeatedInt32Value":[2,2]})");
+ } else {
+ EXPECT_EQ(
+ out,
+ R"({"int64Value":"3","repeatedInt32Value":[2],"boolValue":true,"repeatedInt32Value":[2]})");
+ }
+}
+
+// JSON values get special treatment when it comes to pre-existing values in
+// their repeated fields, when parsing through their dedicated syntax.
+TEST_P(JsonTest, ClearPreExistingRepeatedInJsonValues) {
+ google::protobuf::ListValue l;
+ l.add_values()->set_string_value("hello");
+ ASSERT_OK(JsonStringToMessage("[]", &l));
+ EXPECT_THAT(l.values(), IsEmpty());
+
+ google::protobuf::Struct s;
+ (*s.mutable_fields())["hello"].set_string_value("world");
+ ASSERT_OK(JsonStringToMessage("{}", &s));
+ EXPECT_THAT(s.fields(), IsEmpty());
}
} // namespace
diff --git a/src/google/protobuf/util/message_differencer.cc b/src/google/protobuf/util/message_differencer.cc
index 30560ed..00a0e9d 100644
--- a/src/google/protobuf/util/message_differencer.cc
+++ b/src/google/protobuf/util/message_differencer.cc
@@ -32,7 +32,7 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/util/message_differencer.h>
+#include "google/protobuf/util/message_differencer.h"
#include <algorithm>
#include <cstddef>
@@ -42,24 +42,28 @@
#include <memory>
#include <utility>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/dynamic_message.h>
-#include <google/protobuf/generated_enum_reflection.h>
-#include <google/protobuf/map_field.h>
-#include <google/protobuf/message.h>
-#include <google/protobuf/text_format.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/stringprintf.h>
-#include <google/protobuf/util/field_comparator.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/io/zero_copy_stream.h"
+#include "google/protobuf/io/zero_copy_stream_impl.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/dynamic_message.h"
+#include "google/protobuf/generated_enum_reflection.h"
+#include "google/protobuf/map_field.h"
+#include "google/protobuf/message.h"
+#include "google/protobuf/text_format.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "absl/container/fixed_array.h"
+#include "absl/strings/escaping.h"
+#include "absl/strings/match.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/str_format.h"
+#include "google/protobuf/util/field_comparator.h"
// Always include as last one, otherwise it can break compilation
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -152,6 +156,10 @@
key_field_path.push_back(key);
key_field_paths_.push_back(key_field_path);
}
+ MultipleFieldsMapKeyComparator(const MultipleFieldsMapKeyComparator&) =
+ delete;
+ MultipleFieldsMapKeyComparator& operator=(
+ const MultipleFieldsMapKeyComparator&) = delete;
bool IsMatch(const Message& message1, const Message& message2,
const std::vector<SpecificField>& parent_fields) const override {
for (const auto& path : key_field_paths_) {
@@ -203,7 +211,6 @@
}
MessageDifferencer* message_differencer_;
std::vector<std::vector<const FieldDescriptor*> > key_field_paths_;
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MultipleFieldsMapKeyComparator);
};
// Preserve the order when treating repeated field as SMART_LIST. The current
@@ -337,14 +344,14 @@
field_comparator_.base = comparator;
}
-#ifdef PROTOBUF_FUTURE_BREAKING_CHANGES
+#ifdef PROTOBUF_FUTURE_REMOVE_DEFAULT_FIELD_COMPARATOR
void MessageDifferencer::set_field_comparator(
DefaultFieldComparator* comparator) {
GOOGLE_CHECK(comparator) << "Field comparator can't be NULL.";
field_comparator_kind_ = kFCDefault;
field_comparator_.default_impl = comparator;
}
-#endif // PROTOBUF_FUTURE_BREAKING_CHANGES
+#endif // PROTOBUF_FUTURE_REMOVE_DEFAULT_FIELD_COMPARATOR
void MessageDifferencer::set_message_field_comparison(
MessageFieldComparison comparison) {
@@ -1688,6 +1695,8 @@
// match_list1[i] == -1 means the node is not matched. Same with match_list2.
MaximumMatcher(int count1, int count2, NodeMatchCallback callback,
std::vector<int>* match_list1, std::vector<int>* match_list2);
+ MaximumMatcher(const MaximumMatcher&) = delete;
+ MaximumMatcher& operator=(const MaximumMatcher&) = delete;
// Find a maximum match and return the number of matched node pairs.
// If early_return is true, this method will return 0 immediately when it
// finds that not all nodes on the left side can be matched.
@@ -1708,7 +1717,6 @@
std::map<std::pair<int, int>, bool> cached_match_results_;
std::vector<int>* match_list1_;
std::vector<int>* match_list2_;
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MaximumMatcher);
};
MaximumMatcher::MaximumMatcher(int count1, int count2,
@@ -2000,14 +2008,14 @@
continue;
}
} else {
- printer_->PrintRaw(StrCat(specific_field.unknown_field_number));
+ printer_->PrintRaw(absl::StrCat(specific_field.unknown_field_number));
}
if (left_side && specific_field.index >= 0) {
- printer_->Print("[$name$]", "name", StrCat(specific_field.index));
+ printer_->Print("[$name$]", "name", absl::StrCat(specific_field.index));
}
if (!left_side && specific_field.new_index >= 0) {
printer_->Print("[$name$]", "name",
- StrCat(specific_field.new_index));
+ absl::StrCat(specific_field.new_index));
}
}
}
@@ -2072,19 +2080,19 @@
std::string output;
switch (unknown_field->type()) {
case UnknownField::TYPE_VARINT:
- output = StrCat(unknown_field->varint());
+ output = absl::StrCat(unknown_field->varint());
break;
case UnknownField::TYPE_FIXED32:
- output = StrCat(
- "0x", strings::Hex(unknown_field->fixed32(), strings::ZERO_PAD_8));
+ output = absl::StrCat(
+ "0x", absl::Hex(unknown_field->fixed32(), absl::kZeroPad8));
break;
case UnknownField::TYPE_FIXED64:
- output = StrCat(
- "0x", strings::Hex(unknown_field->fixed64(), strings::ZERO_PAD_16));
+ output = absl::StrCat(
+ "0x", absl::Hex(unknown_field->fixed64(), absl::kZeroPad16));
break;
case UnknownField::TYPE_LENGTH_DELIMITED:
- output = StringPrintf(
- "\"%s\"", CEscape(unknown_field->length_delimited()).c_str());
+ output = absl::StrFormat(
+ "\"%s\"", absl::CEscape(unknown_field->length_delimited()).c_str());
break;
case UnknownField::TYPE_GROUP:
// TODO(kenton): Print the contents of the group like we do for
@@ -2126,7 +2134,7 @@
if (key_string.empty()) {
key_string = "''";
}
- printer_->PrintRaw(StrCat("[", key_string, "]"));
+ printer_->PrintRaw(absl::StrCat("[", key_string, "]"));
}
}
diff --git a/src/google/protobuf/util/message_differencer.h b/src/google/protobuf/util/message_differencer.h
index f63cd54..7d1e6ac 100644
--- a/src/google/protobuf/util/message_differencer.h
+++ b/src/google/protobuf/util/message_differencer.h
@@ -51,13 +51,14 @@
#include <string>
#include <vector>
-#include <google/protobuf/descriptor.h> // FieldDescriptor
-#include <google/protobuf/message.h> // Message
-#include <google/protobuf/unknown_field_set.h>
-#include <google/protobuf/util/field_comparator.h>
+#include "google/protobuf/descriptor.h" // FieldDescriptor
+#include "google/protobuf/message.h" // Message
+#include "google/protobuf/unknown_field_set.h"
+#include "absl/container/fixed_array.h"
+#include "google/protobuf/util/field_comparator.h"
// Always include as last one, otherwise it can break compilation
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -79,7 +80,7 @@
// In case of internal google codebase we are using absl::FixedArray instead
// of vector. It significantly speeds up proto comparison (by ~30%) by
// reducing the number of malloc/free operations
-typedef std::vector<const FieldDescriptor*> FieldDescriptorArray;
+typedef absl::FixedArray<const FieldDescriptor*, 16> FieldDescriptorArray;
// A basic differencer that can be used to determine
// the differences between two specified Protocol Messages. If any differences
@@ -238,21 +239,23 @@
class PROTOBUF_EXPORT Reporter {
public:
Reporter();
+ Reporter(const Reporter&) = delete;
+ Reporter& operator=(const Reporter&) = delete;
virtual ~Reporter();
// Reports that a field has been added into Message2.
virtual void ReportAdded(const Message& message1, const Message& message2,
- const std::vector<SpecificField>& field_path) = 0;
+ const std::vector<SpecificField>& field_path) {}
// Reports that a field has been deleted from Message1.
virtual void ReportDeleted(
const Message& message1, const Message& message2,
- const std::vector<SpecificField>& field_path) = 0;
+ const std::vector<SpecificField>& field_path) {}
// Reports that the value of a field has been modified.
virtual void ReportModified(
const Message& message1, const Message& message2,
- const std::vector<SpecificField>& field_path) = 0;
+ const std::vector<SpecificField>& field_path) {}
// Reports that a repeated field has been moved to another location. This
// only applies when using TreatAsSet or TreatAsMap() -- see below. Also
@@ -300,9 +303,6 @@
virtual void ReportUnknownFieldIgnored(
const Message& /* message1 */, const Message& /* message2 */,
const std::vector<SpecificField>& /* field_path */) {}
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Reporter);
};
// MapKeyComparator is used to determine if two elements have the same key
@@ -310,6 +310,8 @@
class PROTOBUF_EXPORT MapKeyComparator {
public:
MapKeyComparator();
+ MapKeyComparator(const MapKeyComparator&) = delete;
+ MapKeyComparator& operator=(const MapKeyComparator&) = delete;
virtual ~MapKeyComparator();
virtual bool IsMatch(
@@ -318,9 +320,6 @@
GOOGLE_CHECK(false) << "IsMatch() is not implemented.";
return false;
}
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MapKeyComparator);
};
// Abstract base class from which all IgnoreCriteria derive.
@@ -354,6 +353,8 @@
// To add a Reporter, construct default here, then use ReportDifferencesTo or
// ReportDifferencesToString.
explicit MessageDifferencer();
+ MessageDifferencer(const MessageDifferencer&) = delete;
+ MessageDifferencer& operator=(const MessageDifferencer&) = delete;
~MessageDifferencer();
@@ -524,9 +525,9 @@
// Note that this method must be called before Compare for the comparator to
// be used.
void set_field_comparator(FieldComparator* comparator);
-#ifdef PROTOBUF_FUTURE_BREAKING_CHANGES
+#ifdef PROTOBUF_FUTURE_REMOVE_DEFAULT_FIELD_COMPARATOR
void set_field_comparator(DefaultFieldComparator* comparator);
-#endif // PROTOBUF_FUTURE_BREAKING_CHANGES
+#endif // PROTOBUF_FUTURE_REMOVE_DEFAULT_FIELD_COMPARATOR
// DEPRECATED. Pass a DefaultFieldComparator instance instead.
// Sets the fraction and margin for the float comparison of a given field.
@@ -648,6 +649,8 @@
public:
explicit StreamReporter(io::ZeroCopyOutputStream* output);
explicit StreamReporter(io::Printer* printer); // delimiter '$'
+ StreamReporter(const StreamReporter&) = delete;
+ StreamReporter& operator=(const StreamReporter&) = delete;
~StreamReporter() override;
// When set to true, the stream reporter will also output aggregates nodes
@@ -715,7 +718,6 @@
const Message* message1_;
const Message* message2_;
MessageDifferencer::UnpackAnyField unpack_any_field_;
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(StreamReporter);
};
private:
@@ -952,7 +954,6 @@
match_indices_for_smart_list_callback_;
MessageDifferencer::UnpackAnyField unpack_any_field_;
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageDifferencer);
};
// This class provides extra information to the FieldComparator::Compare
@@ -975,6 +976,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_UTIL_MESSAGE_DIFFERENCER_H__
diff --git a/src/google/protobuf/util/message_differencer_unittest.cc b/src/google/protobuf/util/message_differencer_unittest.cc
index f8e44df..93a4553 100644
--- a/src/google/protobuf/util/message_differencer_unittest.cc
+++ b/src/google/protobuf/util/message_differencer_unittest.cc
@@ -39,25 +39,25 @@
#include <string>
#include <vector>
-#include <google/protobuf/stubs/common.h>
+#include "google/protobuf/stubs/common.h"
-#include <google/protobuf/stubs/strutil.h>
+#include "google/protobuf/stubs/strutil.h"
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/any_test.pb.h>
-#include <google/protobuf/map_test_util.h>
-#include <google/protobuf/map_unittest.pb.h>
-#include <google/protobuf/test_util.h>
-#include <google/protobuf/unittest.pb.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/text_format.h>
-#include <google/protobuf/wire_format.h>
-#include <google/protobuf/util/message_differencer_unittest.pb.h>
-#include <google/protobuf/util/field_comparator.h>
-#include <google/protobuf/util/message_differencer.h>
-#include <google/protobuf/testing/googletest.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/any_test.pb.h"
+#include "google/protobuf/map_test_util.h"
+#include "google/protobuf/map_unittest.pb.h"
+#include "google/protobuf/test_util.h"
+#include "google/protobuf/unittest.pb.h"
+#include "google/protobuf/text_format.h"
+#include "google/protobuf/wire_format.h"
+#include "google/protobuf/util/field_comparator.h"
+#include "google/protobuf/util/message_differencer.h"
+#include "google/protobuf/testing/googletest.h"
#include <gtest/gtest.h>
+#include "absl/functional/bind_front.h"
+#include "absl/strings/str_split.h"
+#include "google/protobuf/util/message_differencer_unittest.pb.h"
namespace google {
namespace protobuf {
@@ -68,7 +68,7 @@
const FieldDescriptor* GetFieldDescriptor(const Message& message,
const std::string& field_name) {
std::vector<std::string> field_path =
- Split(field_name, ".", true);
+ absl::StrSplit(field_name, ".", absl::SkipEmpty());
const Descriptor* descriptor = message.GetDescriptor();
const FieldDescriptor* field = nullptr;
for (int i = 0; i < field_path.size(); i++) {
@@ -1869,7 +1869,7 @@
name += parent_fields[i].field->name() + ".";
}
name += field->name();
- for (int i = 0; i < GOOGLE_ARRAYSIZE(kIgnoredFields); ++i) {
+ for (int i = 0; i < ABSL_ARRAYSIZE(kIgnoredFields); ++i) {
if (name.compare(kIgnoredFields[i]) == 0) {
return true;
}
@@ -3472,9 +3472,6 @@
}
return output;
}
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MatchingTest);
};
TEST_F(MatchingTest, StreamReporterMatching) {
diff --git a/src/google/protobuf/util/time_util.cc b/src/google/protobuf/util/time_util.cc
index 9893aa3..0d5a173 100644
--- a/src/google/protobuf/util/time_util.cc
+++ b/src/google/protobuf/util/time_util.cc
@@ -28,19 +28,21 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/util/time_util.h>
+#include "google/protobuf/util/time_util.h"
#include <cstdint>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/duration.pb.h>
-#include <google/protobuf/timestamp.pb.h>
-#include <google/protobuf/stubs/int128.h>
-#include <google/protobuf/stubs/stringprintf.h>
-#include <google/protobuf/stubs/time.h>
+#include "google/protobuf/stubs/strutil.h"
+#include "google/protobuf/duration.pb.h"
+#include "google/protobuf/timestamp.pb.h"
+#include "absl/numeric/int128.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/str_format.h"
+#include "absl/time/clock.h"
+#include "absl/time/time.h"
// Must go after other includes.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -50,19 +52,24 @@
using google::protobuf::Timestamp;
namespace {
-static const int kNanosPerSecond = 1000000000;
-static const int kMicrosPerSecond = 1000000;
-static const int kMillisPerSecond = 1000;
-static const int kNanosPerMillisecond = 1000000;
-static const int kNanosPerMicrosecond = 1000;
-static const int kSecondsPerMinute = 60; // Note that we ignore leap seconds.
-static const int kSecondsPerHour = 3600;
+static constexpr int32_t kNanosPerSecond = 1000000000;
+static constexpr int32_t kMicrosPerSecond = 1000000;
+static constexpr int32_t kMillisPerSecond = 1000;
+static constexpr int32_t kNanosPerMillisecond = 1000000;
+static constexpr int32_t kNanosPerMicrosecond = 1000;
+static constexpr int32_t kSecondsPerMinute =
+ 60; // Note that we ignore leap seconds.
+static constexpr int32_t kSecondsPerHour = 3600;
template <typename T>
-T CreateNormalized(int64_t seconds, int64_t nanos);
+T CreateNormalized(int64_t seconds, int32_t nanos);
template <>
-Timestamp CreateNormalized(int64_t seconds, int64_t nanos) {
+Timestamp CreateNormalized(int64_t seconds, int32_t nanos) {
+ GOOGLE_DCHECK(seconds >= TimeUtil::kTimestampMinSeconds &&
+ seconds <= TimeUtil::kTimestampMaxSeconds)
+ << "Timestamp seconds are outside of the valid range";
+
// Make sure nanos is in the range.
if (nanos <= -kNanosPerSecond || nanos >= kNanosPerSecond) {
seconds += nanos / kNanosPerSecond;
@@ -73,8 +80,12 @@
seconds -= 1;
nanos += kNanosPerSecond;
}
+
GOOGLE_DCHECK(seconds >= TimeUtil::kTimestampMinSeconds &&
- seconds <= TimeUtil::kTimestampMaxSeconds);
+ seconds <= TimeUtil::kTimestampMaxSeconds &&
+ nanos >= TimeUtil::kTimestampMinNanoseconds &&
+ nanos <= TimeUtil::kTimestampMaxNanoseconds)
+ << "Timestamp is outside of the valid range";
Timestamp result;
result.set_seconds(seconds);
result.set_nanos(static_cast<int32_t>(nanos));
@@ -82,7 +93,11 @@
}
template <>
-Duration CreateNormalized(int64_t seconds, int64_t nanos) {
+Duration CreateNormalized(int64_t seconds, int32_t nanos) {
+ GOOGLE_DCHECK(seconds >= TimeUtil::kDurationMinSeconds &&
+ seconds <= TimeUtil::kDurationMaxSeconds)
+ << "Duration seconds are outside of the valid range";
+
// Make sure nanos is in the range.
if (nanos <= -kNanosPerSecond || nanos >= kNanosPerSecond) {
seconds += nanos / kNanosPerSecond;
@@ -96,8 +111,12 @@
seconds -= 1;
nanos += kNanosPerSecond;
}
+
GOOGLE_DCHECK(seconds >= TimeUtil::kDurationMinSeconds &&
- seconds <= TimeUtil::kDurationMaxSeconds);
+ seconds <= TimeUtil::kDurationMaxSeconds &&
+ nanos >= TimeUtil::kDurationMinNanoseconds &&
+ nanos <= TimeUtil::kDurationMaxNanoseconds)
+ << "Duration is outside of the valid range";
Duration result;
result.set_seconds(seconds);
result.set_nanos(static_cast<int32_t>(nanos));
@@ -108,24 +127,49 @@
// precision to represent the exact value.
std::string FormatNanos(int32_t nanos) {
if (nanos % kNanosPerMillisecond == 0) {
- return StringPrintf("%03d", nanos / kNanosPerMillisecond);
+ return absl::StrFormat("%03d", nanos / kNanosPerMillisecond);
} else if (nanos % kNanosPerMicrosecond == 0) {
- return StringPrintf("%06d", nanos / kNanosPerMicrosecond);
+ return absl::StrFormat("%06d", nanos / kNanosPerMicrosecond);
} else {
- return StringPrintf("%09d", nanos);
+ return absl::StrFormat("%09d", nanos);
}
}
std::string FormatTime(int64_t seconds, int32_t nanos) {
- return ::google::protobuf::internal::FormatTime(seconds, nanos);
+ static const char kTimestampFormat[] = "%E4Y-%m-%dT%H:%M:%S";
+
+ timespec spec;
+ spec.tv_sec = seconds;
+ // We only use absl::FormatTime to format the seconds part because we need
+ // finer control over the precision of nanoseconds.
+ spec.tv_nsec = 0;
+ std::string result = absl::FormatTime(
+ kTimestampFormat, absl::TimeFromTimespec(spec), absl::UTCTimeZone());
+ // We format the nanoseconds part separately to meet the precision
+ // requirement.
+ if (nanos != 0) {
+ result += "." + FormatNanos(nanos);
+ }
+ result += "Z";
+ return result;
}
bool ParseTime(const std::string& value, int64_t* seconds, int32_t* nanos) {
- return ::google::protobuf::internal::ParseTime(value, seconds, nanos);
+ absl::Time result;
+ if (!absl::ParseTime(absl::RFC3339_full, value, &result, nullptr)) {
+ return false;
+ }
+ timespec spec = absl::ToTimespec(result);
+ *seconds = spec.tv_sec;
+ *nanos = spec.tv_nsec;
+ return true;
}
void CurrentTime(int64_t* seconds, int32_t* nanos) {
- return ::google::protobuf::internal::GetCurrentTime(seconds, nanos);
+ absl::Time now = absl::Now();
+ timespec spec = absl::ToTimespec(now);
+ *seconds = spec.tv_sec;
+ *nanos = spec.tv_nsec;
}
// Truncates the remainder part after division.
@@ -148,10 +192,14 @@
// Actually define these static const integers. Required by C++ standard (but
// some compilers don't like it).
#ifndef _MSC_VER
-const int64_t TimeUtil::kTimestampMinSeconds;
-const int64_t TimeUtil::kTimestampMaxSeconds;
-const int64_t TimeUtil::kDurationMaxSeconds;
-const int64_t TimeUtil::kDurationMinSeconds;
+constexpr int64_t TimeUtil::kTimestampMinSeconds;
+constexpr int64_t TimeUtil::kTimestampMaxSeconds;
+constexpr int32_t TimeUtil::kTimestampMinNanoseconds;
+constexpr int32_t TimeUtil::kTimestampMaxNanoseconds;
+constexpr int64_t TimeUtil::kDurationMaxSeconds;
+constexpr int64_t TimeUtil::kDurationMinSeconds;
+constexpr int32_t TimeUtil::kDurationMaxNanoseconds;
+constexpr int32_t TimeUtil::kDurationMinNanoseconds;
#endif // !_MSC_VER
std::string TimeUtil::ToString(const Timestamp& timestamp) {
@@ -186,7 +234,7 @@
seconds = -seconds;
nanos = -nanos;
}
- result += StrCat(seconds);
+ result += absl::StrCat(seconds);
if (nanos != 0) {
result += "." + FormatNanos(nanos);
}
@@ -261,37 +309,43 @@
}
Duration TimeUtil::MinutesToDuration(int64_t minutes) {
- return CreateNormalized<Duration>(minutes * kSecondsPerMinute, 0);
+ GOOGLE_DCHECK(minutes >= TimeUtil::kDurationMinSeconds / kSecondsPerMinute &&
+ minutes <= TimeUtil::kDurationMaxSeconds / kSecondsPerMinute)
+ << "Duration minutes are outside of the valid range";
+ return SecondsToDuration(minutes * kSecondsPerMinute);
}
Duration TimeUtil::HoursToDuration(int64_t hours) {
- return CreateNormalized<Duration>(hours * kSecondsPerHour, 0);
+ GOOGLE_DCHECK(hours >= TimeUtil::kDurationMinSeconds / kSecondsPerHour &&
+ hours <= TimeUtil::kDurationMaxSeconds / kSecondsPerHour)
+ << "Duration hours are outside of the valid range";
+ return SecondsToDuration(hours * kSecondsPerHour);
}
int64_t TimeUtil::DurationToNanoseconds(const Duration& duration) {
+ GOOGLE_DCHECK(IsDurationValid(duration)) << "Duration is outside of the valid range";
return duration.seconds() * kNanosPerSecond + duration.nanos();
}
int64_t TimeUtil::DurationToMicroseconds(const Duration& duration) {
- return duration.seconds() * kMicrosPerSecond +
- RoundTowardZero(duration.nanos(), kNanosPerMicrosecond);
+ return RoundTowardZero(DurationToNanoseconds(duration), kNanosPerMicrosecond);
}
int64_t TimeUtil::DurationToMilliseconds(const Duration& duration) {
- return duration.seconds() * kMillisPerSecond +
- RoundTowardZero(duration.nanos(), kNanosPerMillisecond);
+ return RoundTowardZero(DurationToNanoseconds(duration), kNanosPerMillisecond);
}
int64_t TimeUtil::DurationToSeconds(const Duration& duration) {
+ GOOGLE_DCHECK(IsDurationValid(duration)) << "Duration is outside of the valid range";
return duration.seconds();
}
int64_t TimeUtil::DurationToMinutes(const Duration& duration) {
- return RoundTowardZero(duration.seconds(), kSecondsPerMinute);
+ return RoundTowardZero(DurationToSeconds(duration), kSecondsPerMinute);
}
int64_t TimeUtil::DurationToHours(const Duration& duration) {
- return RoundTowardZero(duration.seconds(), kSecondsPerHour);
+ return RoundTowardZero(DurationToSeconds(duration), kSecondsPerHour);
}
Timestamp TimeUtil::NanosecondsToTimestamp(int64_t nanos) {
@@ -316,20 +370,28 @@
}
int64_t TimeUtil::TimestampToNanoseconds(const Timestamp& timestamp) {
+ GOOGLE_DCHECK(IsTimestampValid(timestamp))
+ << "Timestamp is outside of the valid range";
return timestamp.seconds() * kNanosPerSecond + timestamp.nanos();
}
int64_t TimeUtil::TimestampToMicroseconds(const Timestamp& timestamp) {
+ GOOGLE_DCHECK(IsTimestampValid(timestamp))
+ << "Timestamp is outside of the valid range";
return timestamp.seconds() * kMicrosPerSecond +
RoundTowardZero(timestamp.nanos(), kNanosPerMicrosecond);
}
int64_t TimeUtil::TimestampToMilliseconds(const Timestamp& timestamp) {
+ GOOGLE_DCHECK(IsTimestampValid(timestamp))
+ << "Timestamp is outside of the valid range";
return timestamp.seconds() * kMillisPerSecond +
RoundTowardZero(timestamp.nanos(), kNanosPerMillisecond);
}
int64_t TimeUtil::TimestampToSeconds(const Timestamp& timestamp) {
+ GOOGLE_DCHECK(IsTimestampValid(timestamp))
+ << "Timestamp is outside of the valid range";
return timestamp.seconds();
}
@@ -381,7 +443,7 @@
using ::PROTOBUF_NAMESPACE_ID::util::kNanosPerSecond;
// Convert a Duration to uint128.
-void ToUint128(const Duration& value, uint128* result, bool* negative) {
+void ToUint128(const Duration& value, absl::uint128* result, bool* negative) {
if (value.seconds() < 0 || value.nanos() < 0) {
*negative = true;
*result = static_cast<uint64_t>(-value.seconds());
@@ -393,11 +455,11 @@
}
}
-void ToDuration(const uint128& value, bool negative, Duration* duration) {
+void ToDuration(const absl::uint128& value, bool negative, Duration* duration) {
int64_t seconds =
- static_cast<int64_t>(Uint128Low64(value / kNanosPerSecond));
+ static_cast<int64_t>(absl::Uint128Low64(value / kNanosPerSecond));
int32_t nanos =
- static_cast<int32_t>(Uint128Low64(value % kNanosPerSecond));
+ static_cast<int32_t>(absl::Uint128Low64(value % kNanosPerSecond));
if (negative) {
seconds = -seconds;
nanos = -nanos;
@@ -421,7 +483,7 @@
Duration& operator*=(Duration& d, int64_t r) { // NOLINT
bool negative;
- uint128 value;
+ absl::uint128 value;
ToUint128(d, &value, &negative);
if (r > 0) {
value *= static_cast<uint64_t>(r);
@@ -450,7 +512,7 @@
Duration& operator/=(Duration& d, int64_t r) { // NOLINT
bool negative;
- uint128 value;
+ absl::uint128 value;
ToUint128(d, &value, &negative);
if (r > 0) {
value /= static_cast<uint64_t>(r);
@@ -468,10 +530,10 @@
Duration& operator%=(Duration& d1, const Duration& d2) { // NOLINT
bool negative1, negative2;
- uint128 value1, value2;
+ absl::uint128 value1, value2;
ToUint128(d1, &value1, &negative1);
ToUint128(d2, &value2, &negative2);
- uint128 result = value1 % value2;
+ absl::uint128 result = value1 % value2;
// When negative values are involved in division, we round the division
// result towards zero. With this semantics, sign of the remainder is the
// same as the dividend. For example:
@@ -484,10 +546,10 @@
int64_t operator/(const Duration& d1, const Duration& d2) {
bool negative1, negative2;
- uint128 value1, value2;
+ absl::uint128 value1, value2;
ToUint128(d1, &value1, &negative1);
ToUint128(d2, &value2, &negative2);
- int64_t result = Uint128Low64(value1 / value2);
+ int64_t result = absl::Uint128Low64(value1 / value2);
if (negative1 != negative2) {
result = -result;
}
diff --git a/src/google/protobuf/util/time_util.h b/src/google/protobuf/util/time_util.h
index 709527e..c272199 100644
--- a/src/google/protobuf/util/time_util.h
+++ b/src/google/protobuf/util/time_util.h
@@ -50,11 +50,11 @@
#include <sys/time.h>
#endif
-#include <google/protobuf/duration.pb.h>
-#include <google/protobuf/timestamp.pb.h>
+#include "google/protobuf/duration.pb.h"
+#include "google/protobuf/timestamp.pb.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -69,11 +69,31 @@
// The min/max Timestamp/Duration values we support.
//
// For "0001-01-01T00:00:00Z".
- static const int64_t kTimestampMinSeconds = -62135596800LL;
+ static constexpr int64_t kTimestampMinSeconds = -62135596800LL;
// For "9999-12-31T23:59:59.999999999Z".
- static const int64_t kTimestampMaxSeconds = 253402300799LL;
- static const int64_t kDurationMinSeconds = -315576000000LL;
- static const int64_t kDurationMaxSeconds = 315576000000LL;
+ static constexpr int64_t kTimestampMaxSeconds = 253402300799LL;
+ static constexpr int32_t kTimestampMinNanoseconds = 0;
+ static constexpr int32_t kTimestampMaxNanoseconds = 999999999;
+ static constexpr int64_t kDurationMinSeconds = -315576000000LL;
+ static constexpr int64_t kDurationMaxSeconds = 315576000000LL;
+ static constexpr int32_t kDurationMinNanoseconds = -999999999;
+ static constexpr int32_t kDurationMaxNanoseconds = 999999999;
+
+ static bool IsTimestampValid(const Timestamp& timestamp) {
+ return timestamp.seconds() <= kTimestampMaxSeconds &&
+ timestamp.seconds() >= kTimestampMinSeconds &&
+ timestamp.nanos() <= kTimestampMaxNanoseconds &&
+ timestamp.nanos() >= kTimestampMinNanoseconds;
+ }
+
+ static bool IsDurationValid(const Duration& duration) {
+ return duration.seconds() <= kDurationMaxSeconds &&
+ duration.seconds() >= kDurationMinSeconds &&
+ duration.nanos() <= kDurationMaxNanoseconds &&
+ duration.nanos() >= kDurationMinNanoseconds &&
+ !(duration.seconds() >= 1 && duration.nanos() < 0) &&
+ !(duration.seconds() <= -1 && duration.nanos() > 0);
+ }
// Converts Timestamp to/from RFC 3339 date string format.
// Generated output will always be Z-normalized and uses 3, 6 or 9
@@ -102,9 +122,6 @@
static std::string ToString(const Duration& duration);
static bool FromString(const std::string& value, Duration* timestamp);
-#ifdef GetCurrentTime
-#undef GetCurrentTime // Visual Studio has macro GetCurrentTime
-#endif
// Gets the current UTC time.
static Timestamp GetCurrentTime();
// Returns the Time representing "1970-01-01 00:00:00".
@@ -309,6 +326,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_UTIL_TIME_UTIL_H__
diff --git a/src/google/protobuf/util/time_util_test.cc b/src/google/protobuf/util/time_util_test.cc
index 79e2427..dceb6db 100644
--- a/src/google/protobuf/util/time_util_test.cc
+++ b/src/google/protobuf/util/time_util_test.cc
@@ -28,14 +28,14 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/util/time_util.h>
+#include "google/protobuf/util/time_util.h"
#include <cstdint>
#include <ctime>
-#include <google/protobuf/duration.pb.h>
-#include <google/protobuf/timestamp.pb.h>
-#include <google/protobuf/testing/googletest.h>
+#include "google/protobuf/duration.pb.h"
+#include "google/protobuf/timestamp.pb.h"
+#include "google/protobuf/testing/googletest.h"
#include <gtest/gtest.h>
namespace google {
@@ -48,15 +48,18 @@
namespace {
TEST(TimeUtilTest, TimestampStringFormat) {
- Timestamp begin, end;
- EXPECT_TRUE(TimeUtil::FromString("0001-01-01T00:00:00Z", &begin));
- EXPECT_EQ(TimeUtil::kTimestampMinSeconds, begin.seconds());
- EXPECT_EQ(0, begin.nanos());
- EXPECT_TRUE(TimeUtil::FromString("9999-12-31T23:59:59.999999999Z", &end));
- EXPECT_EQ(TimeUtil::kTimestampMaxSeconds, end.seconds());
- EXPECT_EQ(999999999, end.nanos());
- EXPECT_EQ("0001-01-01T00:00:00Z", TimeUtil::ToString(begin));
- EXPECT_EQ("9999-12-31T23:59:59.999999999Z", TimeUtil::ToString(end));
+ // These these are out of bounds for 32-bit architectures.
+ if(sizeof(time_t) >= sizeof(uint64_t)) {
+ Timestamp begin, end;
+ EXPECT_TRUE(TimeUtil::FromString("0001-01-01T00:00:00Z", &begin));
+ EXPECT_EQ(TimeUtil::kTimestampMinSeconds, begin.seconds());
+ EXPECT_EQ(0, begin.nanos());
+ EXPECT_TRUE(TimeUtil::FromString("9999-12-31T23:59:59.999999999Z", &end));
+ EXPECT_EQ(TimeUtil::kTimestampMaxSeconds, end.seconds());
+ EXPECT_EQ(999999999, end.nanos());
+ EXPECT_EQ("0001-01-01T00:00:00Z", TimeUtil::ToString(begin));
+ EXPECT_EQ("9999-12-31T23:59:59.999999999Z", TimeUtil::ToString(end));
+ }
// Test negative timestamps.
Timestamp time = TimeUtil::NanosecondsToTimestamp(-1);
@@ -94,9 +97,12 @@
EXPECT_TRUE(TimeUtil::FromString("0001-01-01T00:00:00Z", &begin));
EXPECT_TRUE(TimeUtil::FromString("9999-12-31T23:59:59.999999999Z", &end));
- EXPECT_EQ("315537897599.999999999s", TimeUtil::ToString(end - begin));
+ // These these are out of bounds for 32-bit architectures.
+ if(sizeof(time_t) >= sizeof(uint64_t)) {
+ EXPECT_EQ("315537897599.999999999s", TimeUtil::ToString(end - begin));
+ EXPECT_EQ("-315537897599.999999999s", TimeUtil::ToString(begin - end));
+ }
EXPECT_EQ(999999999, (end - begin).nanos());
- EXPECT_EQ("-315537897599.999999999s", TimeUtil::ToString(begin - end));
EXPECT_EQ(-999999999, (begin - end).nanos());
// Generated output should contain 3, 6, or 9 fractional digits.
@@ -378,6 +384,147 @@
EXPECT_TRUE(t2 != t1);
}
+TEST(TimeUtilTest, IsDurationValid) {
+ Duration valid;
+ Duration overflow;
+ overflow.set_seconds(TimeUtil::kDurationMaxSeconds + 1);
+ Duration underflow;
+ underflow.set_seconds(TimeUtil::kDurationMinSeconds - 1);
+ Duration overflow_nanos;
+ overflow_nanos.set_nanos(TimeUtil::kDurationMaxNanoseconds + 1);
+ Duration underflow_nanos;
+ underflow_nanos.set_nanos(TimeUtil::kDurationMinNanoseconds - 1);
+ Duration positive_seconds_negative_nanos;
+ positive_seconds_negative_nanos.set_seconds(1);
+ positive_seconds_negative_nanos.set_nanos(-1);
+ Duration negative_seconds_positive_nanos;
+ negative_seconds_positive_nanos.set_seconds(-1);
+ negative_seconds_positive_nanos.set_nanos(1);
+
+ EXPECT_TRUE(TimeUtil::IsDurationValid(valid));
+ EXPECT_FALSE(TimeUtil::IsDurationValid(overflow));
+ EXPECT_FALSE(TimeUtil::IsDurationValid(underflow));
+ EXPECT_FALSE(TimeUtil::IsDurationValid(overflow_nanos));
+ EXPECT_FALSE(TimeUtil::IsDurationValid(underflow_nanos));
+ EXPECT_FALSE(TimeUtil::IsDurationValid(positive_seconds_negative_nanos));
+ EXPECT_FALSE(TimeUtil::IsDurationValid(negative_seconds_positive_nanos));
+}
+
+TEST(TimeUtilTest, IsTimestampValid) {
+ Timestamp valid;
+ Timestamp overflow;
+ overflow.set_seconds(TimeUtil::kTimestampMaxSeconds + 1);
+ Timestamp underflow;
+ underflow.set_seconds(TimeUtil::kTimestampMinSeconds - 1);
+ Timestamp overflow_nanos;
+ overflow_nanos.set_nanos(TimeUtil::kTimestampMaxNanoseconds + 1);
+ Timestamp underflow_nanos;
+ underflow_nanos.set_nanos(TimeUtil::kTimestampMinNanoseconds - 1);
+
+ EXPECT_TRUE(TimeUtil::IsTimestampValid(valid));
+ EXPECT_FALSE(TimeUtil::IsTimestampValid(overflow));
+ EXPECT_FALSE(TimeUtil::IsTimestampValid(underflow));
+ EXPECT_FALSE(TimeUtil::IsTimestampValid(overflow_nanos));
+ EXPECT_FALSE(TimeUtil::IsTimestampValid(underflow_nanos));
+}
+
+#ifdef PROTOBUF_HAS_DEATH_TEST // death tests do not work on Windows yet.
+#ifndef NDEBUG
+
+TEST(TimeUtilTest, DurationBounds) {
+ Duration overflow;
+ overflow.set_seconds(TimeUtil::kDurationMaxSeconds + 1);
+ Duration underflow;
+ underflow.set_seconds(TimeUtil::kDurationMinSeconds - 1);
+ Duration overflow_nanos;
+ overflow_nanos.set_nanos(TimeUtil::kDurationMaxNanoseconds + 1);
+ Duration underflow_nanos;
+ underflow_nanos.set_nanos(TimeUtil::kDurationMinNanoseconds - 1);
+
+ EXPECT_DEATH({ TimeUtil::SecondsToDuration(overflow.seconds()); },
+ "Duration seconds");
+ EXPECT_DEATH({ TimeUtil::SecondsToDuration(underflow.seconds()); },
+ "Duration seconds");
+ EXPECT_DEATH(
+ { TimeUtil::MinutesToDuration(overflow.seconds() / 60 + 1); },
+ "Duration minutes");
+ EXPECT_DEATH(
+ { TimeUtil::MinutesToDuration(underflow.seconds() / 60 - 1); },
+ "Duration minutes");
+ EXPECT_DEATH(
+ { TimeUtil::HoursToDuration(overflow.seconds() / 60 + 1); },
+ "Duration hours");
+ EXPECT_DEATH(
+ { TimeUtil::HoursToDuration(underflow.seconds() / 60 - 1); },
+ "Duration hours");
+
+ EXPECT_DEATH({ TimeUtil::DurationToNanoseconds(overflow); },
+ "outside of the valid range");
+ EXPECT_DEATH({ TimeUtil::DurationToNanoseconds(underflow); },
+ "outside of the valid range");
+ EXPECT_DEATH({ TimeUtil::DurationToNanoseconds(overflow_nanos); },
+ "outside of the valid range");
+ EXPECT_DEATH({ TimeUtil::DurationToNanoseconds(underflow_nanos); },
+ "outside of the valid range");
+ EXPECT_DEATH({ TimeUtil::DurationToSeconds(overflow); },
+ "outside of the valid range");
+ EXPECT_DEATH({ TimeUtil::DurationToSeconds(underflow); },
+ "outside of the valid range");
+ EXPECT_DEATH({ TimeUtil::DurationToSeconds(overflow_nanos); },
+ "outside of the valid range");
+ EXPECT_DEATH({ TimeUtil::DurationToSeconds(underflow_nanos); },
+ "outside of the valid range");
+}
+
+TEST(TimeUtilTest, TimestampBounds) {
+ Timestamp overflow;
+ overflow.set_seconds(TimeUtil::kDurationMaxSeconds + 1);
+ Timestamp underflow;
+ underflow.set_seconds(TimeUtil::kDurationMinSeconds - 1);
+ Timestamp overflow_nanos;
+ overflow_nanos.set_nanos(TimeUtil::kDurationMaxNanoseconds + 1);
+ Timestamp underflow_nanos;
+ underflow_nanos.set_nanos(TimeUtil::kDurationMinNanoseconds - 1);
+
+ EXPECT_DEATH({ TimeUtil::TimestampToNanoseconds(overflow); },
+ "outside of the valid range");
+ EXPECT_DEATH({ TimeUtil::TimestampToNanoseconds(underflow); },
+ "outside of the valid range");
+ EXPECT_DEATH({ TimeUtil::TimestampToNanoseconds(overflow_nanos); },
+ "outside of the valid range");
+ EXPECT_DEATH({ TimeUtil::TimestampToNanoseconds(underflow_nanos); },
+ "outside of the valid range");
+
+ EXPECT_DEATH({ TimeUtil::TimestampToMicroseconds(overflow); },
+ "outside of the valid range");
+ EXPECT_DEATH({ TimeUtil::TimestampToMicroseconds(underflow); },
+ "outside of the valid range");
+ EXPECT_DEATH({ TimeUtil::TimestampToMicroseconds(overflow_nanos); },
+ "outside of the valid range");
+ EXPECT_DEATH({ TimeUtil::TimestampToMicroseconds(underflow_nanos); },
+ "outside of the valid range");
+
+ EXPECT_DEATH({ TimeUtil::TimestampToMilliseconds(overflow); },
+ "outside of the valid range");
+ EXPECT_DEATH({ TimeUtil::TimestampToMilliseconds(underflow); },
+ "outside of the valid range");
+ EXPECT_DEATH({ TimeUtil::TimestampToMilliseconds(overflow_nanos); },
+ "outside of the valid range");
+ EXPECT_DEATH({ TimeUtil::TimestampToMilliseconds(underflow_nanos); },
+ "outside of the valid range");
+
+ EXPECT_DEATH({ TimeUtil::TimestampToSeconds(overflow); },
+ "outside of the valid range");
+ EXPECT_DEATH({ TimeUtil::TimestampToSeconds(underflow); },
+ "outside of the valid range");
+ EXPECT_DEATH({ TimeUtil::TimestampToSeconds(overflow_nanos); },
+ "outside of the valid range");
+ EXPECT_DEATH({ TimeUtil::TimestampToSeconds(underflow_nanos); },
+ "outside of the valid range");
+}
+#endif // !NDEBUG
+#endif // PROTOBUF_HAS_DEATH_TEST
+
} // namespace
} // namespace util
} // namespace protobuf
diff --git a/src/google/protobuf/util/type_resolver.h b/src/google/protobuf/util/type_resolver.h
index b2e7b43..f5c3338 100644
--- a/src/google/protobuf/util/type_resolver.h
+++ b/src/google/protobuf/util/type_resolver.h
@@ -35,13 +35,13 @@
#include <string>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/type.pb.h>
-#include <google/protobuf/stubs/status.h>
-#include <google/protobuf/stubs/status.h>
+#include "google/protobuf/type.pb.h"
+#include "absl/status/status.h"
+#include "google/protobuf/port.h"
+
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -54,24 +54,23 @@
class PROTOBUF_EXPORT TypeResolver {
public:
TypeResolver() {}
+ TypeResolver(const TypeResolver&) = delete;
+ TypeResolver& operator=(const TypeResolver&) = delete;
virtual ~TypeResolver() {}
// Resolves a type url for a message type.
- virtual util::Status ResolveMessageType(
+ virtual absl::Status ResolveMessageType(
const std::string& type_url, google::protobuf::Type* message_type) = 0;
// Resolves a type url for an enum type.
- virtual util::Status ResolveEnumType(const std::string& type_url,
+ virtual absl::Status ResolveEnumType(const std::string& type_url,
google::protobuf::Enum* enum_type) = 0;
-
- private:
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TypeResolver);
};
} // namespace util
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_UTIL_TYPE_RESOLVER_H__
diff --git a/src/google/protobuf/util/type_resolver_util.cc b/src/google/protobuf/util/type_resolver_util.cc
index 8be0efb..49ae2d3 100644
--- a/src/google/protobuf/util/type_resolver_util.cc
+++ b/src/google/protobuf/util/type_resolver_util.cc
@@ -28,20 +28,21 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/util/type_resolver_util.h>
+#include "google/protobuf/util/type_resolver_util.h"
-#include <google/protobuf/type.pb.h>
-#include <google/protobuf/wrappers.pb.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/status.h>
-#include <google/protobuf/util/internal/utility.h>
-#include <google/protobuf/util/type_resolver.h>
-#include <google/protobuf/stubs/status.h>
+#include "google/protobuf/type.pb.h"
+#include "google/protobuf/wrappers.pb.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/stubs/strutil.h"
+#include "absl/status/status.h"
+#include "absl/strings/escaping.h"
+#include "absl/strings/str_cat.h"
+#include "google/protobuf/util/internal/utility.h"
+#include "google/protobuf/util/type_resolver.h"
// clang-format off
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
// clang-format on
namespace google {
@@ -70,38 +71,38 @@
const DescriptorPool* pool)
: url_prefix_(url_prefix), pool_(pool) {}
- util::Status ResolveMessageType(const std::string& type_url,
+ absl::Status ResolveMessageType(const std::string& type_url,
Type* type) override {
std::string type_name;
- util::Status status = ParseTypeUrl(type_url, &type_name);
+ absl::Status status = ParseTypeUrl(type_url, &type_name);
if (!status.ok()) {
return status;
}
const Descriptor* descriptor = pool_->FindMessageTypeByName(type_name);
if (descriptor == NULL) {
- return util::NotFoundError("Invalid type URL, unknown type: " +
+ return absl::NotFoundError("Invalid type URL, unknown type: " +
type_name);
}
ConvertDescriptor(descriptor, type);
- return util::Status();
+ return absl::Status();
}
- util::Status ResolveEnumType(const std::string& type_url,
+ absl::Status ResolveEnumType(const std::string& type_url,
Enum* enum_type) override {
std::string type_name;
- util::Status status = ParseTypeUrl(type_url, &type_name);
+ absl::Status status = ParseTypeUrl(type_url, &type_name);
if (!status.ok()) {
return status;
}
const EnumDescriptor* descriptor = pool_->FindEnumTypeByName(type_name);
if (descriptor == NULL) {
- return util::InvalidArgumentError("Invalid type URL, unknown type: " +
+ return absl::InvalidArgumentError("Invalid type URL, unknown type: " +
type_name);
}
ConvertEnumDescriptor(descriptor, enum_type);
- return util::Status();
+ return absl::Status();
}
private:
@@ -303,30 +304,30 @@
return url_prefix_ + "/" + descriptor->full_name();
}
- util::Status ParseTypeUrl(const std::string& type_url,
+ absl::Status ParseTypeUrl(const std::string& type_url,
std::string* type_name) {
if (type_url.substr(0, url_prefix_.size() + 1) != url_prefix_ + "/") {
- return util::InvalidArgumentError(
- StrCat("Invalid type URL, type URLs must be of the form '",
+ return absl::InvalidArgumentError(
+ absl::StrCat("Invalid type URL, type URLs must be of the form '",
url_prefix_, "/<typename>', got: ", type_url));
}
*type_name = type_url.substr(url_prefix_.size() + 1);
- return util::Status();
+ return absl::Status();
}
std::string DefaultValueAsString(const FieldDescriptor* descriptor) {
switch (descriptor->cpp_type()) {
case FieldDescriptor::CPPTYPE_INT32:
- return StrCat(descriptor->default_value_int32());
+ return absl::StrCat(descriptor->default_value_int32());
break;
case FieldDescriptor::CPPTYPE_INT64:
- return StrCat(descriptor->default_value_int64());
+ return absl::StrCat(descriptor->default_value_int64());
break;
case FieldDescriptor::CPPTYPE_UINT32:
- return StrCat(descriptor->default_value_uint32());
+ return absl::StrCat(descriptor->default_value_uint32());
break;
case FieldDescriptor::CPPTYPE_UINT64:
- return StrCat(descriptor->default_value_uint64());
+ return absl::StrCat(descriptor->default_value_uint64());
break;
case FieldDescriptor::CPPTYPE_FLOAT:
return SimpleFtoa(descriptor->default_value_float());
@@ -339,7 +340,7 @@
break;
case FieldDescriptor::CPPTYPE_STRING:
if (descriptor->type() == FieldDescriptor::TYPE_BYTES) {
- return CEscape(descriptor->default_value_string());
+ return absl::CEscape(descriptor->default_value_string());
} else {
return descriptor->default_value_string();
}
diff --git a/src/google/protobuf/util/type_resolver_util.h b/src/google/protobuf/util/type_resolver_util.h
index 7f6a4b9..0327e61 100644
--- a/src/google/protobuf/util/type_resolver_util.h
+++ b/src/google/protobuf/util/type_resolver_util.h
@@ -35,15 +35,15 @@
#include <string>
+// Must be included last.
+#include "google/protobuf/port_def.inc"
+
namespace google {
namespace protobuf {
class DescriptorPool;
namespace util {
class TypeResolver;
-// Must be included last.
-#include <google/protobuf/port_def.inc>
-
// Creates a TypeResolver that serves type information in the given descriptor
// pool. Caller takes ownership of the returned TypeResolver.
PROTOBUF_EXPORT TypeResolver* NewTypeResolverForDescriptorPool(
@@ -53,6 +53,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_UTIL_TYPE_RESOLVER_UTIL_H__
diff --git a/src/google/protobuf/util/type_resolver_util_test.cc b/src/google/protobuf/util/type_resolver_util_test.cc
index 2780a39..d926541 100644
--- a/src/google/protobuf/util/type_resolver_util_test.cc
+++ b/src/google/protobuf/util/type_resolver_util_test.cc
@@ -28,7 +28,7 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/util/type_resolver_util.h>
+#include "google/protobuf/util/type_resolver_util.h"
#include <cstdint>
#include <limits>
@@ -36,16 +36,16 @@
#include <string>
#include <vector>
-#include <google/protobuf/type.pb.h>
-#include <google/protobuf/wrappers.pb.h>
-#include <google/protobuf/map_unittest.pb.h>
-#include <google/protobuf/test_util.h>
-#include <google/protobuf/unittest.pb.h>
-#include <google/protobuf/unittest_custom_options.pb.h>
-#include <google/protobuf/util/json_format_proto3.pb.h>
-#include <google/protobuf/util/type_resolver.h>
-#include <google/protobuf/testing/googletest.h>
+#include "google/protobuf/type.pb.h"
+#include "google/protobuf/wrappers.pb.h"
+#include "google/protobuf/map_unittest.pb.h"
+#include "google/protobuf/test_util.h"
+#include "google/protobuf/unittest.pb.h"
+#include "google/protobuf/unittest_custom_options.pb.h"
+#include "google/protobuf/util/type_resolver.h"
+#include "google/protobuf/testing/googletest.h"
#include <gtest/gtest.h>
+#include "google/protobuf/util/json_format_proto3.pb.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/well_known_types_unittest.cc b/src/google/protobuf/well_known_types_unittest.cc
index c9a9aa1..2cc25b5 100644
--- a/src/google/protobuf/well_known_types_unittest.cc
+++ b/src/google/protobuf/well_known_types_unittest.cc
@@ -27,12 +27,12 @@
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <google/protobuf/unittest_well_known_types.pb.h>
-
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/testing/googletest.h>
#include <gtest/gtest.h>
-#include <google/protobuf/stubs/stl_util.h>
+
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/stubs/stl_util.h"
+#include "google/protobuf/testing/googletest.h"
+#include "google/protobuf/unittest_well_known_types.pb.h"
namespace google {
namespace protobuf {
diff --git a/src/google/protobuf/wire_format.cc b/src/google/protobuf/wire_format.cc
index 6fe63c8..d9d2913 100644
--- a/src/google/protobuf/wire_format.cc
+++ b/src/google/protobuf/wire_format.cc
@@ -32,30 +32,30 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/wire_format.h>
+#include "google/protobuf/wire_format.h"
#include <stack>
#include <string>
#include <vector>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/descriptor.pb.h>
-#include <google/protobuf/dynamic_message.h>
-#include <google/protobuf/map_field.h>
-#include <google/protobuf/map_field_inl.h>
-#include <google/protobuf/message.h>
-#include <google/protobuf/message_lite.h>
-#include <google/protobuf/parse_context.h>
-#include <google/protobuf/unknown_field_set.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/io/zero_copy_stream.h"
+#include "google/protobuf/io/zero_copy_stream_impl.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "google/protobuf/dynamic_message.h"
+#include "google/protobuf/map_field.h"
+#include "google/protobuf/map_field_inl.h"
+#include "google/protobuf/message.h"
+#include "google/protobuf/message_lite.h"
+#include "google/protobuf/parse_context.h"
+#include "google/protobuf/unknown_field_set.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
const size_t kMapEntryTagByteSize = 2;
@@ -1765,4 +1765,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/wire_format.h b/src/google/protobuf/wire_format.h
index 1acbf9e..027fcb3 100644
--- a/src/google/protobuf/wire_format.h
+++ b/src/google/protobuf/wire_format.h
@@ -40,22 +40,23 @@
#define GOOGLE_PROTOBUF_WIRE_FORMAT_H__
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/stubs/casts.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/generated_message_util.h>
-#include <google/protobuf/message.h>
-#include <google/protobuf/metadata_lite.h>
-#include <google/protobuf/parse_context.h>
-#include <google/protobuf/wire_format_lite.h>
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/io/coded_stream.h"
+#include "absl/base/casts.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/generated_message_util.h"
+#include "google/protobuf/message.h"
+#include "google/protobuf/metadata_lite.h"
+#include "google/protobuf/parse_context.h"
+#include "google/protobuf/port.h"
+#include "google/protobuf/wire_format_lite.h"
#ifdef SWIG
#error "You cannot SWIG proto headers"
#endif
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -79,6 +80,8 @@
// This class is really a namespace that contains only static methods
class PROTOBUF_EXPORT WireFormat {
public:
+ WireFormat() = delete;
+
// Given a field return its WireType
static inline WireFormatLite::WireType WireTypeForField(
const FieldDescriptor* field);
@@ -285,6 +288,7 @@
private:
struct MessageSetParser;
+ friend class TcParser;
// Skip a MessageSet field.
static bool SkipMessageSetField(io::CodedInputStream* input,
uint32_t field_number,
@@ -301,8 +305,6 @@
uint64_t tag,
const Reflection* reflection,
const FieldDescriptor* field);
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(WireFormat);
};
// Subclass of FieldSkipper which saves skipped fields to an UnknownFieldSet.
@@ -337,7 +339,7 @@
// Some compilers don't like enum -> enum casts, so we implicit_cast to
// int first.
return WireFormatLite::WireTypeForFieldType(
- static_cast<WireFormatLite::FieldType>(implicit_cast<int>(type)));
+ static_cast<WireFormatLite::FieldType>(absl::implicit_cast<int>(type)));
}
inline uint32_t WireFormat::MakeTag(const FieldDescriptor* field) {
@@ -350,7 +352,7 @@
// int first.
return WireFormatLite::TagSize(
field_number,
- static_cast<WireFormatLite::FieldType>(implicit_cast<int>(type)));
+ static_cast<WireFormatLite::FieldType>(absl::implicit_cast<int>(type)));
}
inline void WireFormat::VerifyUTF8String(const char* data, int size,
@@ -409,6 +411,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_WIRE_FORMAT_H__
diff --git a/src/google/protobuf/wire_format_lite.cc b/src/google/protobuf/wire_format_lite.cc
index 5ab1ca1..7241a9e 100644
--- a/src/google/protobuf/wire_format_lite.cc
+++ b/src/google/protobuf/wire_format_lite.cc
@@ -32,23 +32,24 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/wire_format_lite.h>
+#include "google/protobuf/wire_format_lite.h"
#include <limits>
#include <stack>
#include <string>
#include <vector>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
-#include <google/protobuf/stubs/stringprintf.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/io/zero_copy_stream.h"
+#include "google/protobuf/io/zero_copy_stream_impl_lite.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/str_format.h"
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -593,8 +594,8 @@
return ReadBytesToString(input, *p);
}
-void PrintUTF8ErrorLog(StringPiece message_name,
- StringPiece field_name, const char* operation_str,
+void PrintUTF8ErrorLog(absl::string_view message_name,
+ absl::string_view field_name, const char* operation_str,
bool emit_stacktrace) {
std::string stacktrace;
(void)emit_stacktrace; // Parameter is used by Google-internal code.
@@ -602,13 +603,13 @@
if (!field_name.empty()) {
if (!message_name.empty()) {
quoted_field_name =
- StrCat(" '", message_name, ".", field_name, "'");
+ absl::StrCat(" '", message_name, ".", field_name, "'");
} else {
- quoted_field_name = StrCat(" '", field_name, "'");
+ quoted_field_name = absl::StrCat(" '", field_name, "'");
}
}
std::string error_message =
- StrCat("String field", quoted_field_name,
+ absl::StrCat("String field", quoted_field_name,
" contains invalid UTF-8 data "
"when ",
operation_str,
@@ -815,4 +816,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/wire_format_lite.h b/src/google/protobuf/wire_format_lite.h
index 80d3961..1af4d06 100644
--- a/src/google/protobuf/wire_format_lite.h
+++ b/src/google/protobuf/wire_format_lite.h
@@ -44,16 +44,16 @@
#include <limits>
#include <string>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/port.h>
-#include <google/protobuf/stubs/casts.h>
-#include <google/protobuf/arenastring.h>
-#include <google/protobuf/message_lite.h>
-#include <google/protobuf/repeated_field.h>
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/port.h"
+#include "absl/base/casts.h"
+#include "google/protobuf/arenastring.h"
+#include "google/protobuf/message_lite.h"
+#include "google/protobuf/port.h"
+#include "google/protobuf/repeated_field.h"
-// Do UTF-8 validation on string type in Debug build only
#ifndef NDEBUG
#define GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
#endif
@@ -70,7 +70,7 @@
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -87,6 +87,7 @@
// This class is really a namespace that contains only static methods.
class PROTOBUF_EXPORT WireFormatLite {
public:
+ WireFormatLite() = delete;
// -----------------------------------------------------------------
// Helper constants and functions related to the format. These are
// mostly meant for internal and generated code to use.
@@ -102,7 +103,11 @@
// identifies the encoding of this data, it is possible to skip
// unrecognized fields for forwards compatibility.
- enum WireType {
+ enum WireType
+#ifndef SWIG
+ : int
+#endif // !SWIG
+ {
WIRETYPE_VARINT = 0,
WIRETYPE_FIXED64 = 1,
WIRETYPE_LENGTH_DELIMITED = 2,
@@ -742,8 +747,6 @@
static const WireFormatLite::WireType kWireTypeForFieldType[];
static void WriteSubMessageMaybeToArray(int size, const MessageLite& value,
io::CodedOutputStream* output);
-
- GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(WireFormatLite);
};
// A class which deals with unknown values. The default implementation just
@@ -818,19 +821,19 @@
}
inline uint32_t WireFormatLite::EncodeFloat(float value) {
- return bit_cast<uint32_t>(value);
+ return absl::bit_cast<uint32_t>(value);
}
inline float WireFormatLite::DecodeFloat(uint32_t value) {
- return bit_cast<float>(value);
+ return absl::bit_cast<float>(value);
}
inline uint64_t WireFormatLite::EncodeDouble(double value) {
- return bit_cast<uint64_t>(value);
+ return absl::bit_cast<uint64_t>(value);
}
inline double WireFormatLite::DecodeDouble(uint64_t value) {
- return bit_cast<double>(value);
+ return absl::bit_cast<double>(value);
}
// ZigZag Transform: Encodes signed integers so that they can be
@@ -1903,6 +1906,6 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
#endif // GOOGLE_PROTOBUF_WIRE_FORMAT_LITE_H__
diff --git a/src/google/protobuf/wire_format_unittest.cc b/src/google/protobuf/wire_format_unittest.cc
index f1ed951..f51cf53 100644
--- a/src/google/protobuf/wire_format_unittest.cc
+++ b/src/google/protobuf/wire_format_unittest.cc
@@ -32,12 +32,12 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/wire_format.h>
+#include "google/protobuf/wire_format.h"
-#include <google/protobuf/unittest.pb.h>
-#include <google/protobuf/unittest_mset.pb.h>
-#include <google/protobuf/unittest_mset_wire_format.pb.h>
-#include <google/protobuf/unittest_proto3_arena.pb.h>
+#include "google/protobuf/unittest.pb.h"
+#include "google/protobuf/unittest_mset.pb.h"
+#include "google/protobuf/unittest_mset_wire_format.pb.h"
+#include "google/protobuf/unittest_proto3_arena.pb.h"
#include <gmock/gmock.h>
#include <gtest/gtest.h>
@@ -49,12 +49,12 @@
// Must include after defining UNITTEST, etc.
// clang-format off
-#include <google/protobuf/test_util.inc>
-#include <google/protobuf/wire_format_unittest.inc>
+#include "google/protobuf/test_util.inc"
+#include "google/protobuf/wire_format_unittest.inc"
// clang-format on
// Must be included last.
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
namespace google {
namespace protobuf {
@@ -67,4 +67,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/wire_format_unittest.inc b/src/google/protobuf/wire_format_unittest.inc
index 0e3869c..6224ae7 100644
--- a/src/google/protobuf/wire_format_unittest.inc
+++ b/src/google/protobuf/wire_format_unittest.inc
@@ -32,26 +32,26 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/wire_format.h>
-#include <google/protobuf/wire_format_lite.h>
+#include "google/protobuf/stubs/logging.h"
+#include "google/protobuf/stubs/common.h"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/io/zero_copy_stream_impl.h"
+#include "google/protobuf/io/zero_copy_stream_impl_lite.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/wire_format.h"
+#include "google/protobuf/wire_format_lite.h"
#include <gmock/gmock.h>
-#include <google/protobuf/testing/googletest.h>
+#include "google/protobuf/testing/googletest.h"
#include <gtest/gtest.h>
-#include <google/protobuf/stubs/casts.h>
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/dynamic_message.h>
-#include <google/protobuf/test_util2.h>
-#include <google/protobuf/stubs/stl_util.h>
+#include "absl/base/casts.h"
+#include "google/protobuf/stubs/logging.h"
+#include "absl/strings/match.h"
+#include "google/protobuf/dynamic_message.h"
+#include "google/protobuf/test_util2.h"
+#include "google/protobuf/stubs/stl_util.h"
// clang-format off
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
// clang-format on
namespace google {
@@ -63,15 +63,15 @@
// Verify that WireFormatLite::FieldType and WireFormatLite::CppType match
// FieldDescriptor::Type and FieldDescriptor::CppType.
- EXPECT_EQ(implicit_cast<int>(FieldDescriptor::MAX_TYPE),
- implicit_cast<int>(WireFormatLite::MAX_FIELD_TYPE));
- EXPECT_EQ(implicit_cast<int>(FieldDescriptor::MAX_CPPTYPE),
- implicit_cast<int>(WireFormatLite::MAX_CPPTYPE));
+ EXPECT_EQ(absl::implicit_cast<int>(FieldDescriptor::MAX_TYPE),
+ absl::implicit_cast<int>(WireFormatLite::MAX_FIELD_TYPE));
+ EXPECT_EQ(absl::implicit_cast<int>(FieldDescriptor::MAX_CPPTYPE),
+ absl::implicit_cast<int>(WireFormatLite::MAX_CPPTYPE));
for (int i = 1; i <= WireFormatLite::MAX_FIELD_TYPE; i++) {
- EXPECT_EQ(implicit_cast<int>(FieldDescriptor::TypeToCppType(
+ EXPECT_EQ(absl::implicit_cast<int>(FieldDescriptor::TypeToCppType(
static_cast<FieldDescriptor::Type>(i))),
- implicit_cast<int>(WireFormatLite::FieldTypeToCppType(
+ absl::implicit_cast<int>(WireFormatLite::FieldTypeToCppType(
static_cast<WireFormatLite::FieldType>(i))));
}
}
@@ -1560,7 +1560,7 @@
#ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
ASSERT_EQ(1, errors.size());
EXPECT_TRUE(
- HasPrefixString(errors[0],
+ absl::StartsWith(errors[0],
"String field contains invalid UTF-8 data when "
"serializing a protocol buffer. Use the "
"'bytes' type if you intend to send raw bytes."));
@@ -1706,4 +1706,4 @@
} // namespace protobuf
} // namespace google
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/wrappers.pb.cc b/src/google/protobuf/wrappers.pb.cc
index 40ba60a..60846db 100644
--- a/src/google/protobuf/wrappers.pb.cc
+++ b/src/google/protobuf/wrappers.pb.cc
@@ -1,268 +1,316 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: google/protobuf/wrappers.proto
-#include <google/protobuf/wrappers.pb.h>
+#include "google/protobuf/wrappers.pb.h"
#include <algorithm>
-
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/extension_set.h>
-#include <google/protobuf/wire_format_lite.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/generated_message_reflection.h>
-#include <google/protobuf/reflection_ops.h>
-#include <google/protobuf/wire_format.h>
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/extension_set.h"
+#include "google/protobuf/wire_format_lite.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/generated_message_reflection.h"
+#include "google/protobuf/reflection_ops.h"
+#include "google/protobuf/wire_format.h"
// @@protoc_insertion_point(includes)
-#include <google/protobuf/port_def.inc>
+// Must be included last.
+#include "google/protobuf/port_def.inc"
PROTOBUF_PRAGMA_INIT_SEG
-
namespace _pb = ::PROTOBUF_NAMESPACE_ID;
-namespace _pbi = _pb::internal;
-
+namespace _pbi = ::PROTOBUF_NAMESPACE_ID::internal;
PROTOBUF_NAMESPACE_OPEN
PROTOBUF_CONSTEXPR DoubleValue::DoubleValue(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_.value_)*/0
, /*decltype(_impl_._cached_size_)*/{}} {}
struct DoubleValueDefaultTypeInternal {
- PROTOBUF_CONSTEXPR DoubleValueDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR DoubleValueDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~DoubleValueDefaultTypeInternal() {}
union {
DoubleValue _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 DoubleValueDefaultTypeInternal _DoubleValue_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 DoubleValueDefaultTypeInternal _DoubleValue_default_instance_;
PROTOBUF_CONSTEXPR FloatValue::FloatValue(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_.value_)*/0
, /*decltype(_impl_._cached_size_)*/{}} {}
struct FloatValueDefaultTypeInternal {
- PROTOBUF_CONSTEXPR FloatValueDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR FloatValueDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~FloatValueDefaultTypeInternal() {}
union {
FloatValue _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 FloatValueDefaultTypeInternal _FloatValue_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 FloatValueDefaultTypeInternal _FloatValue_default_instance_;
PROTOBUF_CONSTEXPR Int64Value::Int64Value(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_.value_)*/int64_t{0}
, /*decltype(_impl_._cached_size_)*/{}} {}
struct Int64ValueDefaultTypeInternal {
- PROTOBUF_CONSTEXPR Int64ValueDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR Int64ValueDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~Int64ValueDefaultTypeInternal() {}
union {
Int64Value _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 Int64ValueDefaultTypeInternal _Int64Value_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 Int64ValueDefaultTypeInternal _Int64Value_default_instance_;
PROTOBUF_CONSTEXPR UInt64Value::UInt64Value(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_.value_)*/uint64_t{0u}
, /*decltype(_impl_._cached_size_)*/{}} {}
struct UInt64ValueDefaultTypeInternal {
- PROTOBUF_CONSTEXPR UInt64ValueDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR UInt64ValueDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~UInt64ValueDefaultTypeInternal() {}
union {
UInt64Value _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 UInt64ValueDefaultTypeInternal _UInt64Value_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 UInt64ValueDefaultTypeInternal _UInt64Value_default_instance_;
PROTOBUF_CONSTEXPR Int32Value::Int32Value(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_.value_)*/0
, /*decltype(_impl_._cached_size_)*/{}} {}
struct Int32ValueDefaultTypeInternal {
- PROTOBUF_CONSTEXPR Int32ValueDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR Int32ValueDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~Int32ValueDefaultTypeInternal() {}
union {
Int32Value _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 Int32ValueDefaultTypeInternal _Int32Value_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 Int32ValueDefaultTypeInternal _Int32Value_default_instance_;
PROTOBUF_CONSTEXPR UInt32Value::UInt32Value(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_.value_)*/0u
, /*decltype(_impl_._cached_size_)*/{}} {}
struct UInt32ValueDefaultTypeInternal {
- PROTOBUF_CONSTEXPR UInt32ValueDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR UInt32ValueDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~UInt32ValueDefaultTypeInternal() {}
union {
UInt32Value _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 UInt32ValueDefaultTypeInternal _UInt32Value_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 UInt32ValueDefaultTypeInternal _UInt32Value_default_instance_;
PROTOBUF_CONSTEXPR BoolValue::BoolValue(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_.value_)*/false
, /*decltype(_impl_._cached_size_)*/{}} {}
struct BoolValueDefaultTypeInternal {
- PROTOBUF_CONSTEXPR BoolValueDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR BoolValueDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~BoolValueDefaultTypeInternal() {}
union {
BoolValue _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 BoolValueDefaultTypeInternal _BoolValue_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 BoolValueDefaultTypeInternal _BoolValue_default_instance_;
PROTOBUF_CONSTEXPR StringValue::StringValue(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_.value_)*/{&::_pbi::fixed_address_empty_string, ::_pbi::ConstantInitialized{}}
, /*decltype(_impl_._cached_size_)*/{}} {}
struct StringValueDefaultTypeInternal {
- PROTOBUF_CONSTEXPR StringValueDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR StringValueDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~StringValueDefaultTypeInternal() {}
union {
StringValue _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 StringValueDefaultTypeInternal _StringValue_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 StringValueDefaultTypeInternal _StringValue_default_instance_;
PROTOBUF_CONSTEXPR BytesValue::BytesValue(
::_pbi::ConstantInitialized): _impl_{
/*decltype(_impl_.value_)*/{&::_pbi::fixed_address_empty_string, ::_pbi::ConstantInitialized{}}
, /*decltype(_impl_._cached_size_)*/{}} {}
struct BytesValueDefaultTypeInternal {
- PROTOBUF_CONSTEXPR BytesValueDefaultTypeInternal()
- : _instance(::_pbi::ConstantInitialized{}) {}
+ PROTOBUF_CONSTEXPR BytesValueDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
~BytesValueDefaultTypeInternal() {}
union {
BytesValue _instance;
};
};
-PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 BytesValueDefaultTypeInternal _BytesValue_default_instance_;
+
+PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
+ PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 BytesValueDefaultTypeInternal _BytesValue_default_instance_;
PROTOBUF_NAMESPACE_CLOSE
static ::_pb::Metadata file_level_metadata_google_2fprotobuf_2fwrappers_2eproto[9];
-static constexpr ::_pb::EnumDescriptor const** file_level_enum_descriptors_google_2fprotobuf_2fwrappers_2eproto = nullptr;
-static constexpr ::_pb::ServiceDescriptor const** file_level_service_descriptors_google_2fprotobuf_2fwrappers_2eproto = nullptr;
-
-const uint32_t TableStruct_google_2fprotobuf_2fwrappers_2eproto::offsets[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
- ~0u, // no _has_bits_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DoubleValue, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DoubleValue, _impl_.value_),
- ~0u, // no _has_bits_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FloatValue, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FloatValue, _impl_.value_),
- ~0u, // no _has_bits_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Int64Value, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Int64Value, _impl_.value_),
- ~0u, // no _has_bits_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::UInt64Value, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::UInt64Value, _impl_.value_),
- ~0u, // no _has_bits_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Int32Value, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Int32Value, _impl_.value_),
- ~0u, // no _has_bits_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::UInt32Value, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::UInt32Value, _impl_.value_),
- ~0u, // no _has_bits_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::BoolValue, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::BoolValue, _impl_.value_),
- ~0u, // no _has_bits_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::StringValue, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::StringValue, _impl_.value_),
- ~0u, // no _has_bits_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::BytesValue, _internal_metadata_),
- ~0u, // no _extensions_
- ~0u, // no _oneof_case_
- ~0u, // no _weak_field_map_
- ~0u, // no _inlined_string_donated_
- PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::BytesValue, _impl_.value_),
+static constexpr const ::_pb::EnumDescriptor**
+ file_level_enum_descriptors_google_2fprotobuf_2fwrappers_2eproto = nullptr;
+static constexpr const ::_pb::ServiceDescriptor**
+ file_level_service_descriptors_google_2fprotobuf_2fwrappers_2eproto = nullptr;
+const uint32_t TableStruct_google_2fprotobuf_2fwrappers_2eproto::offsets[] PROTOBUF_SECTION_VARIABLE(
+ protodesc_cold) = {
+ ~0u, // no _has_bits_
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DoubleValue, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::DoubleValue, _impl_.value_),
+ ~0u, // no _has_bits_
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FloatValue, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::FloatValue, _impl_.value_),
+ ~0u, // no _has_bits_
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Int64Value, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Int64Value, _impl_.value_),
+ ~0u, // no _has_bits_
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::UInt64Value, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::UInt64Value, _impl_.value_),
+ ~0u, // no _has_bits_
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Int32Value, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::Int32Value, _impl_.value_),
+ ~0u, // no _has_bits_
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::UInt32Value, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::UInt32Value, _impl_.value_),
+ ~0u, // no _has_bits_
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::BoolValue, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::BoolValue, _impl_.value_),
+ ~0u, // no _has_bits_
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::StringValue, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::StringValue, _impl_.value_),
+ ~0u, // no _has_bits_
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::BytesValue, _internal_metadata_),
+ ~0u, // no _extensions_
+ ~0u, // no _oneof_case_
+ ~0u, // no _weak_field_map_
+ ~0u, // no _inlined_string_donated_
+ ~0u, // no _split_
+ ~0u, // no sizeof(Split)
+ PROTOBUF_FIELD_OFFSET(::PROTOBUF_NAMESPACE_ID::BytesValue, _impl_.value_),
};
-static const ::_pbi::MigrationSchema schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
- { 0, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::DoubleValue)},
- { 7, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::FloatValue)},
- { 14, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::Int64Value)},
- { 21, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::UInt64Value)},
- { 28, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::Int32Value)},
- { 35, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::UInt32Value)},
- { 42, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::BoolValue)},
- { 49, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::StringValue)},
- { 56, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::BytesValue)},
+
+static const ::_pbi::MigrationSchema
+ schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
+ { 0, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::DoubleValue)},
+ { 9, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::FloatValue)},
+ { 18, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::Int64Value)},
+ { 27, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::UInt64Value)},
+ { 36, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::Int32Value)},
+ { 45, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::UInt32Value)},
+ { 54, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::BoolValue)},
+ { 63, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::StringValue)},
+ { 72, -1, -1, sizeof(::PROTOBUF_NAMESPACE_ID::BytesValue)},
};
static const ::_pb::Message* const file_default_instances[] = {
- &::PROTOBUF_NAMESPACE_ID::_DoubleValue_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::_FloatValue_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::_Int64Value_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::_UInt64Value_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::_Int32Value_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::_UInt32Value_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::_BoolValue_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::_StringValue_default_instance_._instance,
- &::PROTOBUF_NAMESPACE_ID::_BytesValue_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_DoubleValue_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_FloatValue_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_Int64Value_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_UInt64Value_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_Int32Value_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_UInt32Value_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_BoolValue_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_StringValue_default_instance_._instance,
+ &::PROTOBUF_NAMESPACE_ID::_BytesValue_default_instance_._instance,
};
-
-const char descriptor_table_protodef_google_2fprotobuf_2fwrappers_2eproto[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) =
- "\n\036google/protobuf/wrappers.proto\022\017google"
- ".protobuf\"\034\n\013DoubleValue\022\r\n\005value\030\001 \001(\001\""
- "\033\n\nFloatValue\022\r\n\005value\030\001 \001(\002\"\033\n\nInt64Val"
- "ue\022\r\n\005value\030\001 \001(\003\"\034\n\013UInt64Value\022\r\n\005valu"
- "e\030\001 \001(\004\"\033\n\nInt32Value\022\r\n\005value\030\001 \001(\005\"\034\n\013"
- "UInt32Value\022\r\n\005value\030\001 \001(\r\"\032\n\tBoolValue\022"
- "\r\n\005value\030\001 \001(\010\"\034\n\013StringValue\022\r\n\005value\030\001"
- " \001(\t\"\033\n\nBytesValue\022\r\n\005value\030\001 \001(\014B\203\001\n\023co"
- "m.google.protobufB\rWrappersProtoP\001Z1goog"
- "le.golang.org/protobuf/types/known/wrapp"
- "erspb\370\001\001\242\002\003GPB\252\002\036Google.Protobuf.WellKno"
- "wnTypesb\006proto3"
- ;
-static ::_pbi::once_flag descriptor_table_google_2fprotobuf_2fwrappers_2eproto_once;
+const char descriptor_table_protodef_google_2fprotobuf_2fwrappers_2eproto[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
+ "\n\036google/protobuf/wrappers.proto\022\017google"
+ ".protobuf\"\034\n\013DoubleValue\022\r\n\005value\030\001 \001(\001\""
+ "\033\n\nFloatValue\022\r\n\005value\030\001 \001(\002\"\033\n\nInt64Val"
+ "ue\022\r\n\005value\030\001 \001(\003\"\034\n\013UInt64Value\022\r\n\005valu"
+ "e\030\001 \001(\004\"\033\n\nInt32Value\022\r\n\005value\030\001 \001(\005\"\034\n\013"
+ "UInt32Value\022\r\n\005value\030\001 \001(\r\"\032\n\tBoolValue\022"
+ "\r\n\005value\030\001 \001(\010\"\034\n\013StringValue\022\r\n\005value\030\001"
+ " \001(\t\"\033\n\nBytesValue\022\r\n\005value\030\001 \001(\014B\203\001\n\023co"
+ "m.google.protobufB\rWrappersProtoP\001Z1goog"
+ "le.golang.org/protobuf/types/known/wrapp"
+ "erspb\370\001\001\242\002\003GPB\252\002\036Google.Protobuf.WellKno"
+ "wnTypesb\006proto3"
+};
+static ::absl::once_flag descriptor_table_google_2fprotobuf_2fwrappers_2eproto_once;
const ::_pbi::DescriptorTable descriptor_table_google_2fprotobuf_2fwrappers_2eproto = {
- false, false, 455, descriptor_table_protodef_google_2fprotobuf_2fwrappers_2eproto,
+ false,
+ false,
+ 455,
+ descriptor_table_protodef_google_2fprotobuf_2fwrappers_2eproto,
"google/protobuf/wrappers.proto",
- &descriptor_table_google_2fprotobuf_2fwrappers_2eproto_once, nullptr, 0, 9,
- schemas, file_default_instances, TableStruct_google_2fprotobuf_2fwrappers_2eproto::offsets,
- file_level_metadata_google_2fprotobuf_2fwrappers_2eproto, file_level_enum_descriptors_google_2fprotobuf_2fwrappers_2eproto,
+ &descriptor_table_google_2fprotobuf_2fwrappers_2eproto_once,
+ nullptr,
+ 0,
+ 9,
+ schemas,
+ file_default_instances,
+ TableStruct_google_2fprotobuf_2fwrappers_2eproto::offsets,
+ file_level_metadata_google_2fprotobuf_2fwrappers_2eproto,
+ file_level_enum_descriptors_google_2fprotobuf_2fwrappers_2eproto,
file_level_service_descriptors_google_2fprotobuf_2fwrappers_2eproto,
};
+
+// This function exists to be marked as weak.
+// It can significantly speed up compilation by breaking up LLVM's SCC
+// in the .pb.cc translation units. Large translation units see a
+// reduction of more than 35% of walltime for optimized builds. Without
+// the weak attribute all the messages in the file, including all the
+// vtables and everything they use become part of the same SCC through
+// a cycle like:
+// GetMetadata -> descriptor table -> default instances ->
+// vtables -> GetMetadata
+// By adding a weak function here we break the connection from the
+// individual vtables back into the descriptor table.
PROTOBUF_ATTRIBUTE_WEAK const ::_pbi::DescriptorTable* descriptor_table_google_2fprotobuf_2fwrappers_2eproto_getter() {
return &descriptor_table_google_2fprotobuf_2fwrappers_2eproto;
}
-
// Force running AddDescriptors() at dynamic initialization time.
-PROTOBUF_ATTRIBUTE_INIT_PRIORITY2 static ::_pbi::AddDescriptorsRunner dynamic_init_dummy_google_2fprotobuf_2fwrappers_2eproto(&descriptor_table_google_2fprotobuf_2fwrappers_2eproto);
+PROTOBUF_ATTRIBUTE_INIT_PRIORITY2
+static ::_pbi::AddDescriptorsRunner dynamic_init_dummy_google_2fprotobuf_2fwrappers_2eproto(&descriptor_table_google_2fprotobuf_2fwrappers_2eproto);
PROTOBUF_NAMESPACE_OPEN
-
// ===================================================================
class DoubleValue::_Internal {
@@ -452,7 +500,6 @@
&descriptor_table_google_2fprotobuf_2fwrappers_2eproto_getter, &descriptor_table_google_2fprotobuf_2fwrappers_2eproto_once,
file_level_metadata_google_2fprotobuf_2fwrappers_2eproto[0]);
}
-
// ===================================================================
class FloatValue::_Internal {
@@ -642,7 +689,6 @@
&descriptor_table_google_2fprotobuf_2fwrappers_2eproto_getter, &descriptor_table_google_2fprotobuf_2fwrappers_2eproto_once,
file_level_metadata_google_2fprotobuf_2fwrappers_2eproto[1]);
}
-
// ===================================================================
class Int64Value::_Internal {
@@ -820,7 +866,6 @@
&descriptor_table_google_2fprotobuf_2fwrappers_2eproto_getter, &descriptor_table_google_2fprotobuf_2fwrappers_2eproto_once,
file_level_metadata_google_2fprotobuf_2fwrappers_2eproto[2]);
}
-
// ===================================================================
class UInt64Value::_Internal {
@@ -998,7 +1043,6 @@
&descriptor_table_google_2fprotobuf_2fwrappers_2eproto_getter, &descriptor_table_google_2fprotobuf_2fwrappers_2eproto_once,
file_level_metadata_google_2fprotobuf_2fwrappers_2eproto[3]);
}
-
// ===================================================================
class Int32Value::_Internal {
@@ -1176,7 +1220,6 @@
&descriptor_table_google_2fprotobuf_2fwrappers_2eproto_getter, &descriptor_table_google_2fprotobuf_2fwrappers_2eproto_once,
file_level_metadata_google_2fprotobuf_2fwrappers_2eproto[4]);
}
-
// ===================================================================
class UInt32Value::_Internal {
@@ -1354,7 +1397,6 @@
&descriptor_table_google_2fprotobuf_2fwrappers_2eproto_getter, &descriptor_table_google_2fprotobuf_2fwrappers_2eproto_once,
file_level_metadata_google_2fprotobuf_2fwrappers_2eproto[5]);
}
-
// ===================================================================
class BoolValue::_Internal {
@@ -1532,7 +1574,6 @@
&descriptor_table_google_2fprotobuf_2fwrappers_2eproto_getter, &descriptor_table_google_2fprotobuf_2fwrappers_2eproto_once,
file_level_metadata_google_2fprotobuf_2fwrappers_2eproto[6]);
}
-
// ===================================================================
class StringValue::_Internal {
@@ -1735,7 +1776,6 @@
&descriptor_table_google_2fprotobuf_2fwrappers_2eproto_getter, &descriptor_table_google_2fprotobuf_2fwrappers_2eproto_once,
file_level_metadata_google_2fprotobuf_2fwrappers_2eproto[7]);
}
-
// ===================================================================
class BytesValue::_Internal {
@@ -1933,7 +1973,6 @@
&descriptor_table_google_2fprotobuf_2fwrappers_2eproto_getter, &descriptor_table_google_2fprotobuf_2fwrappers_2eproto_once,
file_level_metadata_google_2fprotobuf_2fwrappers_2eproto[8]);
}
-
// @@protoc_insertion_point(namespace_scope)
PROTOBUF_NAMESPACE_CLOSE
PROTOBUF_NAMESPACE_OPEN
@@ -1974,6 +2013,5 @@
return Arena::CreateMessageInternal< ::PROTOBUF_NAMESPACE_ID::BytesValue >(arena);
}
PROTOBUF_NAMESPACE_CLOSE
-
// @@protoc_insertion_point(global_scope)
-#include <google/protobuf/port_undef.inc>
+#include "google/protobuf/port_undef.inc"
diff --git a/src/google/protobuf/wrappers.pb.h b/src/google/protobuf/wrappers.pb.h
index 01e860d..4f56846 100644
--- a/src/google/protobuf/wrappers.pb.h
+++ b/src/google/protobuf/wrappers.pb.h
@@ -1,38 +1,43 @@
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: google/protobuf/wrappers.proto
-#ifndef GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fwrappers_2eproto
-#define GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fwrappers_2eproto
+#ifndef GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fwrappers_2eproto_2epb_2eh
+#define GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fwrappers_2eproto_2epb_2eh
#include <limits>
#include <string>
+#include <type_traits>
-#include <google/protobuf/port_def.inc>
+#include "google/protobuf/port_def.inc"
#if PROTOBUF_VERSION < 3021000
-#error This file was generated by a newer version of protoc which is
-#error incompatible with your Protocol Buffer headers. Please update
-#error your headers.
-#endif
-#if 3021007 < PROTOBUF_MIN_PROTOC_VERSION
-#error This file was generated by an older version of protoc which is
-#error incompatible with your Protocol Buffer headers. Please
-#error regenerate this file with a newer version of protoc.
-#endif
+#error "This file was generated by a newer version of protoc which is"
+#error "incompatible with your Protocol Buffer headers. Please update"
+#error "your headers."
+#endif // PROTOBUF_VERSION
-#include <google/protobuf/port_undef.inc>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/arena.h>
-#include <google/protobuf/arenastring.h>
-#include <google/protobuf/generated_message_util.h>
-#include <google/protobuf/metadata_lite.h>
-#include <google/protobuf/generated_message_reflection.h>
-#include <google/protobuf/message.h>
-#include <google/protobuf/repeated_field.h> // IWYU pragma: export
-#include <google/protobuf/extension_set.h> // IWYU pragma: export
-#include <google/protobuf/unknown_field_set.h>
+#if 3021007 < PROTOBUF_MIN_PROTOC_VERSION
+#error "This file was generated by an older version of protoc which is"
+#error "incompatible with your Protocol Buffer headers. Please"
+#error "regenerate this file with a newer version of protoc."
+#endif // PROTOBUF_MIN_PROTOC_VERSION
+#include "google/protobuf/port_undef.inc"
+#include "google/protobuf/io/coded_stream.h"
+#include "google/protobuf/arena.h"
+#include "google/protobuf/arenastring.h"
+#include "google/protobuf/generated_message_util.h"
+#include "google/protobuf/metadata_lite.h"
+#include "google/protobuf/generated_message_reflection.h"
+#include "google/protobuf/message.h"
+#include "google/protobuf/repeated_field.h" // IWYU pragma: export
+#include "google/protobuf/extension_set.h" // IWYU pragma: export
+#include "google/protobuf/unknown_field_set.h"
// @@protoc_insertion_point(includes)
-#include <google/protobuf/port_def.inc>
+
+// Must be included last.
+#include "google/protobuf/port_def.inc"
+
#define PROTOBUF_INTERNAL_EXPORT_google_2fprotobuf_2fwrappers_2eproto PROTOBUF_EXPORT
+
PROTOBUF_NAMESPACE_OPEN
namespace internal {
class AnyMetadata;
@@ -43,7 +48,8 @@
struct PROTOBUF_EXPORT TableStruct_google_2fprotobuf_2fwrappers_2eproto {
static const uint32_t offsets[];
};
-PROTOBUF_EXPORT extern const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_google_2fprotobuf_2fwrappers_2eproto;
+PROTOBUF_EXPORT extern const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable
+ descriptor_table_google_2fprotobuf_2fwrappers_2eproto;
PROTOBUF_NAMESPACE_OPEN
class BoolValue;
struct BoolValueDefaultTypeInternal;
@@ -72,22 +78,33 @@
class UInt64Value;
struct UInt64ValueDefaultTypeInternal;
PROTOBUF_EXPORT extern UInt64ValueDefaultTypeInternal _UInt64Value_default_instance_;
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::BoolValue* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::BoolValue>(Arena*);
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::BytesValue* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::BytesValue>(Arena*);
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::DoubleValue* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::DoubleValue>(Arena*);
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::FloatValue* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::FloatValue>(Arena*);
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::Int32Value* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::Int32Value>(Arena*);
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::Int64Value* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::Int64Value>(Arena*);
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::StringValue* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::StringValue>(Arena*);
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::UInt32Value* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::UInt32Value>(Arena*);
+template <>
+PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::UInt64Value* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::UInt64Value>(Arena*);
PROTOBUF_NAMESPACE_CLOSE
-PROTOBUF_NAMESPACE_OPEN
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::BoolValue* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::BoolValue>(Arena*);
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::BytesValue* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::BytesValue>(Arena*);
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::DoubleValue* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::DoubleValue>(Arena*);
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::FloatValue* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::FloatValue>(Arena*);
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::Int32Value* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::Int32Value>(Arena*);
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::Int64Value* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::Int64Value>(Arena*);
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::StringValue* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::StringValue>(Arena*);
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::UInt32Value* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::UInt32Value>(Arena*);
-template<> PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::UInt64Value* Arena::CreateMaybeMessage<::PROTOBUF_NAMESPACE_ID::UInt64Value>(Arena*);
-PROTOBUF_NAMESPACE_CLOSE
+
PROTOBUF_NAMESPACE_OPEN
// ===================================================================
+
+// -------------------------------------------------------------------
+
class PROTOBUF_EXPORT DoubleValue final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.DoubleValue) */ {
public:
@@ -191,7 +208,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.DoubleValue";
}
protected:
@@ -233,8 +250,7 @@
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2fwrappers_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOBUF_EXPORT FloatValue final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.FloatValue) */ {
@@ -339,7 +355,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.FloatValue";
}
protected:
@@ -381,8 +397,7 @@
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2fwrappers_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOBUF_EXPORT Int64Value final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.Int64Value) */ {
@@ -487,7 +502,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.Int64Value";
}
protected:
@@ -529,8 +544,7 @@
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2fwrappers_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOBUF_EXPORT UInt64Value final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.UInt64Value) */ {
@@ -635,7 +649,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.UInt64Value";
}
protected:
@@ -677,8 +691,7 @@
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2fwrappers_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOBUF_EXPORT Int32Value final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.Int32Value) */ {
@@ -783,7 +796,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.Int32Value";
}
protected:
@@ -825,8 +838,7 @@
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2fwrappers_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOBUF_EXPORT UInt32Value final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.UInt32Value) */ {
@@ -931,7 +943,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.UInt32Value";
}
protected:
@@ -973,8 +985,7 @@
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2fwrappers_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOBUF_EXPORT BoolValue final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.BoolValue) */ {
@@ -1079,7 +1090,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.BoolValue";
}
protected:
@@ -1121,8 +1132,7 @@
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2fwrappers_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOBUF_EXPORT StringValue final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.StringValue) */ {
@@ -1227,7 +1237,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.StringValue";
}
protected:
@@ -1274,8 +1284,7 @@
};
union { Impl_ _impl_; };
friend struct ::TableStruct_google_2fprotobuf_2fwrappers_2eproto;
-};
-// -------------------------------------------------------------------
+};// -------------------------------------------------------------------
class PROTOBUF_EXPORT BytesValue final :
public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:google.protobuf.BytesValue) */ {
@@ -1380,7 +1389,7 @@
private:
friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
- static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+ static ::absl::string_view FullMessageName() {
return "google.protobuf.BytesValue";
}
protected:
@@ -1431,12 +1440,17 @@
// ===================================================================
+
+
// ===================================================================
+
#ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wstrict-aliasing"
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wstrict-aliasing"
#endif // __GNUC__
+// -------------------------------------------------------------------
+
// DoubleValue
// double value = 1;
@@ -1451,7 +1465,7 @@
return _internal_value();
}
inline void DoubleValue::_internal_set_value(double value) {
-
+
_impl_.value_ = value;
}
inline void DoubleValue::set_value(double value) {
@@ -1475,7 +1489,7 @@
return _internal_value();
}
inline void FloatValue::_internal_set_value(float value) {
-
+
_impl_.value_ = value;
}
inline void FloatValue::set_value(float value) {
@@ -1499,7 +1513,7 @@
return _internal_value();
}
inline void Int64Value::_internal_set_value(int64_t value) {
-
+
_impl_.value_ = value;
}
inline void Int64Value::set_value(int64_t value) {
@@ -1523,7 +1537,7 @@
return _internal_value();
}
inline void UInt64Value::_internal_set_value(uint64_t value) {
-
+
_impl_.value_ = value;
}
inline void UInt64Value::set_value(uint64_t value) {
@@ -1547,7 +1561,7 @@
return _internal_value();
}
inline void Int32Value::_internal_set_value(int32_t value) {
-
+
_impl_.value_ = value;
}
inline void Int32Value::set_value(int32_t value) {
@@ -1571,7 +1585,7 @@
return _internal_value();
}
inline void UInt32Value::_internal_set_value(uint32_t value) {
-
+
_impl_.value_ = value;
}
inline void UInt32Value::set_value(uint32_t value) {
@@ -1595,7 +1609,7 @@
return _internal_value();
}
inline void BoolValue::_internal_set_value(bool value) {
-
+
_impl_.value_ = value;
}
inline void BoolValue::set_value(bool value) {
@@ -1631,11 +1645,11 @@
return _impl_.value_.Get();
}
inline void StringValue::_internal_set_value(const std::string& value) {
-
+
_impl_.value_.Set(value, GetArenaForAllocation());
}
inline std::string* StringValue::_internal_mutable_value() {
-
+
return _impl_.value_.Mutable(GetArenaForAllocation());
}
inline std::string* StringValue::release_value() {
@@ -1644,9 +1658,9 @@
}
inline void StringValue::set_allocated_value(std::string* value) {
if (value != nullptr) {
-
+
} else {
-
+
}
_impl_.value_.SetAllocated(value, GetArenaForAllocation());
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
@@ -1685,11 +1699,11 @@
return _impl_.value_.Get();
}
inline void BytesValue::_internal_set_value(const std::string& value) {
-
+
_impl_.value_.Set(value, GetArenaForAllocation());
}
inline std::string* BytesValue::_internal_mutable_value() {
-
+
return _impl_.value_.Mutable(GetArenaForAllocation());
}
inline std::string* BytesValue::release_value() {
@@ -1698,9 +1712,9 @@
}
inline void BytesValue::set_allocated_value(std::string* value) {
if (value != nullptr) {
-
+
} else {
-
+
}
_impl_.value_.SetAllocated(value, GetArenaForAllocation());
#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
@@ -1712,30 +1726,15 @@
}
#ifdef __GNUC__
- #pragma GCC diagnostic pop
+#pragma GCC diagnostic pop
#endif // __GNUC__
-// -------------------------------------------------------------------
-
-// -------------------------------------------------------------------
-
-// -------------------------------------------------------------------
-
-// -------------------------------------------------------------------
-
-// -------------------------------------------------------------------
-
-// -------------------------------------------------------------------
-
-// -------------------------------------------------------------------
-
-// -------------------------------------------------------------------
-
// @@protoc_insertion_point(namespace_scope)
-
PROTOBUF_NAMESPACE_CLOSE
+
// @@protoc_insertion_point(global_scope)
-#include <google/protobuf/port_undef.inc>
-#endif // GOOGLE_PROTOBUF_INCLUDED_GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fwrappers_2eproto
+#include "google/protobuf/port_undef.inc"
+
+#endif // GOOGLE_PROTOBUF_INCLUDED_google_2fprotobuf_2fwrappers_2eproto_2epb_2eh
diff --git a/tests.sh b/tests.sh
deleted file mode 100755
index 180b870..0000000
--- a/tests.sh
+++ /dev/null
@@ -1,611 +0,0 @@
-#!/bin/bash
-#
-# Build and run tests for the protobuf project. We use this script to run
-# tests on kokoro (Ubuntu and MacOS). It can run locally as well but you
-# need to make sure the required compilers/tools are available.
-
-internal_build_cpp() {
- if [ -f src/protoc ]; then
- # Already built.
- return
- fi
-
- # Initialize any submodules.
- git submodule update --init --recursive
-
- ./autogen.sh
- ./configure CXXFLAGS="-fPIC -std=c++11" # -fPIC is needed for python cpp test.
- # See python/setup.py for more details
- make -j$(nproc)
-}
-
-build_cpp() {
- internal_build_cpp
- make check -j$(nproc) || (cat src/test-suite.log; false)
- cd conformance && make test_cpp && cd ..
-}
-
-build_cpp_tcmalloc() {
- internal_build_cpp
- ./configure LIBS=-ltcmalloc && make clean && make \
- PTHREAD_CFLAGS='-pthread -DGOOGLE_PROTOBUF_HEAP_CHECK_DRACONIAN' \
- check
- cd src
- PPROF_PATH=/usr/bin/google-pprof HEAPCHECK=strict ./protobuf-test
-}
-
-build_cpp_distcheck() {
- grep -q -- "-Og" src/Makefile.am &&
- echo "The -Og flag is incompatible with Clang versions older than 4.0." &&
- exit 1
-
- # Initialize any submodules.
- git submodule update --init --recursive
- ./autogen.sh
- ./configure
- make dist
-
- # List all files that should be included in the distribution package.
- git ls-files | grep "^\(java\|python\|objectivec\|csharp\|ruby\|php\|cmake\|examples\|src/google/protobuf/.*\.proto\)" |\
- grep -v ".gitignore" | grep -v "java/lite/proguard.pgcfg" |\
- grep -v "python/compatibility_tests" | grep -v "python/docs" | grep -v "python/.repo-metadata.json" |\
- grep -v "python/protobuf_distutils" | grep -v "csharp/compatibility_tests" > dist.lst
- # Unzip the dist tar file.
- DIST=`ls *.tar.gz`
- tar -xf $DIST
- cd ${DIST//.tar.gz}
- # Check if every file exists in the dist tar file.
- FILES_MISSING=""
- for FILE in $(<../dist.lst); do
- [ -f "$FILE" ] || {
- echo "$FILE is not found!"
- FILES_MISSING="$FILE $FILES_MISSING"
- }
- done
- cd ..
- if [ ! -z "$FILES_MISSING" ]; then
- echo "Missing files in EXTRA_DIST: $FILES_MISSING"
- exit 1
- fi
-
- # Do the regular dist-check for C++.
- make distcheck -j$(nproc)
-}
-
-build_dist_install() {
- # Create a symlink pointing to python2 and put it at the beginning of $PATH.
- # This is necessary because the googletest build system involves a Python
- # script that is not compatible with Python 3. More recent googletest
- # versions have fixed this, but they have also removed the autotools build
- # system support that we rely on. This is a temporary workaround to keep the
- # googletest build working when the default python binary is Python 3.
- mkdir tmp || true
- pushd tmp
- ln -s /usr/bin/python2 ./python
- popd
- PATH=$PWD/tmp:$PATH
-
- # Initialize any submodules.
- git submodule update --init --recursive
- ./autogen.sh
- ./configure
- make dist
-
- # Unzip the dist tar file and install it.
- DIST=`ls *.tar.gz`
- tar -xf $DIST
- pushd ${DIST//.tar.gz}
- ./configure && make check -j4 && make install
-
- export LD_LIBRARY_PATH=/usr/local/lib
-
- # Try to install Java
- pushd java
- use_java jdk11
- $MVN install
- popd
-
- # Try to install Python
- python3 -m venv venv
- source venv/bin/activate
- pushd python
- python3 setup.py clean build sdist
- pip3 install dist/protobuf-*.tar.gz
- popd
- deactivate
- rm -rf python/venv
-}
-
-build_csharp() {
- # Required for conformance tests and to regenerate protos.
- internal_build_cpp
- NUGET=/usr/local/bin/nuget.exe
-
- # Disable some unwanted dotnet options
- export DOTNET_SKIP_FIRST_TIME_EXPERIENCE=true
- export DOTNET_CLI_TELEMETRY_OPTOUT=true
-
- # TODO(jtattermusch): is this still needed with "first time experience"
- # disabled?
- # Perform "dotnet new" once to get the setup preprocessing out of the
- # way. That spews a lot of output (including backspaces) into logs
- # otherwise, and can cause problems. It doesn't matter if this step
- # is performed multiple times; it's cheap after the first time anyway.
- # (It also doesn't matter if it's unnecessary, which it will be on some
- # systems. It's necessary on Jenkins in order to avoid unprintable
- # characters appearing in the JUnit output.)
- mkdir dotnettmp
- (cd dotnettmp; dotnet new > /dev/null)
- rm -rf dotnettmp
-
- # Check that the protos haven't broken C# codegen.
- # TODO(jonskeet): Fail if regenerating creates any changes.
- csharp/generate_protos.sh
-
- csharp/buildall.sh
- cd conformance && make test_csharp && cd ..
-
- # Run csharp compatibility test between 3.0.0 and the current version.
- csharp/compatibility_tests/v3.0.0/test.sh 3.0.0
-
- # Regression test for https://github.com/protocolbuffers/protobuf/issues/9526
- # - all line endings in .proto and .cs (and .csproj) files should be LF.
- if git ls-files --eol csharp | grep -E '\.cs|\.proto' | grep -v w/lf
- then
- echo "The files listed above have mixed or CRLF line endings; please change to LF."
- exit 1
- fi
-}
-
-build_golang() {
- # Go build needs `protoc`.
- internal_build_cpp
- # Add protoc to the path so that the examples build finds it.
- export PATH="`pwd`/src:$PATH"
-
- export GOPATH="$HOME/gocode"
- mkdir -p "$GOPATH/src/github.com/protocolbuffers"
- mkdir -p "$GOPATH/src/github.com/golang"
- rm -f "$GOPATH/src/github.com/protocolbuffers/protobuf"
- rm -f "$GOPATH/src/github.com/golang/protobuf"
- ln -s "`pwd`" "$GOPATH/src/github.com/protocolbuffers/protobuf"
- export PATH="$GOPATH/bin:$PATH"
- (cd $GOPATH/src/github.com/golang && git clone https://github.com/golang/protobuf.git && cd protobuf && git checkout v1.3.5)
- go install github.com/golang/protobuf/protoc-gen-go
-
- cd examples && PROTO_PATH="-I../src -I." make gotest && cd ..
-}
-
-use_java() {
- version=$1
- case "$version" in
- jdk17)
- export PATH=/usr/lib/jvm/java-17-openjdk-amd64/bin:$PATH
- export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
- ;;
- jdk11)
- export PATH=/usr/lib/jvm/java-11-openjdk-amd64/bin:$PATH
- export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
- ;;
- jdk8)
- export PATH=/usr/lib/jvm/java-8-openjdk-amd64/bin:$PATH
- export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
- ;;
- jdk7)
- export PATH=/usr/lib/jvm/java-7-openjdk-amd64/bin:$PATH
- export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
- ;;
- oracle7)
- export PATH=/usr/lib/jvm/java-7-oracle/bin:$PATH
- export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
- ;;
- esac
-
- MAVEN_LOCAL_REPOSITORY=/var/maven_local_repository
- MVN="$MVN -e --quiet -Dhttps.protocols=TLSv1.2 -Dmaven.repo.local=$MAVEN_LOCAL_REPOSITORY"
-
- which java
- java -version
- $MVN -version
-}
-
-# --batch-mode suppresses download progress output that spams the logs.
-MVN="mvn --batch-mode"
-
-internal_build_java() {
- version=$1
- dir=java_$version
- # Java build needs `protoc`.
- internal_build_cpp
- cp -r java $dir
- cd $dir && $MVN clean
- # Skip tests here - callers will decide what tests they want to run
- $MVN install -Dmaven.test.skip=true
-}
-
-build_java() {
- version=$1
- internal_build_java $version
- # Skip the Kotlin tests on Oracle 7
- if [ "$version" == "oracle7" ]; then
- $MVN test -pl bom,lite,core,util
- else
- $MVN test
- fi
- cd ../..
-}
-
-# The conformance tests are hard-coded to work with the $ROOT/java directory.
-# So this can't run in parallel with two different sets of tests.
-build_java_with_conformance_tests() {
- # Java build needs `protoc`.
- internal_build_cpp
- # This local installation avoids the problem caused by a new version not yet in Maven Central
- cd java/bom && $MVN install
- cd ../..
- cd java/core && $MVN test && $MVN install
- cd ../lite && $MVN test && $MVN install
- cd ../util && $MVN test && $MVN install && $MVN package assembly:single
- if [ "$version" == "jdk8" ]; then
- cd ../kotlin && $MVN test && $MVN install
- cd ../kotlin-lite && $MVN test && $MVN install
- fi
- cd ../..
- cd conformance && make test_java && cd ..
-}
-
-build_java_jdk7() {
- use_java jdk7
- build_java_with_conformance_tests
-}
-
-build_java_oracle7() {
- use_java oracle7
- build_java oracle7
-}
-
-build_java_jdk8() {
- use_java jdk8
- build_java_with_conformance_tests
-}
-
-build_java_jdk11() {
- use_java jdk11
- build_java
-}
-
-build_java_jdk17() {
- use_java jdk17
- build_java
-}
-
-build_java_linkage_monitor() {
- # Linkage Monitor checks compatibility with other Google libraries
- # https://github.com/GoogleCloudPlatform/cloud-opensource-java/tree/master/linkage-monitor
-
- use_java jdk11
- internal_build_cpp
-
- # Linkage Monitor uses $HOME/.m2 local repository
- MVN="mvn -e -B -Dhttps.protocols=TLSv1.2"
- cd java
- # Installs the snapshot version locally
- $MVN install -Dmaven.test.skip=true
-
- # Linkage Monitor uses the snapshot versions installed in $HOME/.m2 to verify compatibility
- JAR=linkage-monitor-latest-all-deps.jar
- curl -v -O "https://storage.googleapis.com/cloud-opensource-java-linkage-monitor/${JAR}"
- # Fails if there's new linkage errors compared with baseline
- java -jar $JAR com.google.cloud:libraries-bom
-}
-
-build_objectivec_ios() {
- # Reused the build script that takes care of configuring and ensuring things
- # are up to date. The OS X test runs the objc conformance test, so skip it
- # here.
- objectivec/DevTools/full_mac_build.sh \
- --core-only --skip-xcode-osx --skip-xcode-tvos --skip-objc-conformance "$@"
-}
-
-build_objectivec_ios_debug() {
- build_objectivec_ios --skip-xcode-release
-}
-
-build_objectivec_ios_release() {
- build_objectivec_ios --skip-xcode-debug
-}
-
-build_objectivec_osx() {
- # Reused the build script that takes care of configuring and ensuring things
- # are up to date.
- objectivec/DevTools/full_mac_build.sh \
- --core-only --skip-xcode-ios --skip-xcode-tvos
-}
-
-build_objectivec_tvos() {
- # Reused the build script that takes care of configuring and ensuring things
- # are up to date. The OS X test runs the objc conformance test, so skip it
- # here.
- objectivec/DevTools/full_mac_build.sh \
- --core-only --skip-xcode-ios --skip-xcode-osx --skip-objc-conformance "$@"
-}
-
-build_objectivec_tvos_debug() {
- build_objectivec_tvos --skip-xcode-release
-}
-
-build_objectivec_tvos_release() {
- build_objectivec_tvos --skip-xcode-debug
-}
-
-build_python() {
- internal_build_cpp
- cd python
- tox --skip-missing-interpreters
- cd ..
-}
-
-build_python_version() {
- internal_build_cpp
- cd python
- envlist=$1
- tox -e $envlist
- cd ..
-}
-
-build_python37() {
- build_python_version py37-python
-}
-
-build_python38() {
- build_python_version py38-python
-}
-
-build_python39() {
- build_python_version py39-python
-}
-
-build_python310() {
- build_python_version py310-python
-}
-
-build_python_cpp() {
- internal_build_cpp
- export LD_LIBRARY_PATH=../src/.libs # for Linux
- export DYLD_LIBRARY_PATH=../src/.libs # for OS X
- cd python
- tox --skip-missing-interpreters
- cd ..
-}
-
-build_python_cpp_version() {
- internal_build_cpp
- export LD_LIBRARY_PATH=../src/.libs # for Linux
- export DYLD_LIBRARY_PATH=../src/.libs # for OS X
- cd python
- envlist=$1
- tox -e $envlist
- cd ..
-}
-
-build_python37_cpp() {
- build_python_cpp_version py37-cpp
-}
-
-build_python38_cpp() {
- build_python_cpp_version py38-cpp
-}
-
-build_python39_cpp() {
- build_python_cpp_version py39-cpp
-}
-
-build_python310_cpp() {
- build_python_cpp_version py310-cpp
-}
-
-build_ruby23() {
- internal_build_cpp # For conformance tests.
- cd ruby && bash travis-test.sh ruby-2.3.8 && cd ..
-}
-build_ruby24() {
- internal_build_cpp # For conformance tests.
- cd ruby && bash travis-test.sh ruby-2.4 && cd ..
-}
-build_ruby25() {
- internal_build_cpp # For conformance tests.
- cd ruby && bash travis-test.sh ruby-2.5.1 && cd ..
-}
-build_ruby26() {
- internal_build_cpp # For conformance tests.
- cd ruby && bash travis-test.sh ruby-2.6.0 && cd ..
-}
-build_ruby27() {
- internal_build_cpp # For conformance tests.
- cd ruby && bash travis-test.sh ruby-2.7.0 && cd ..
-}
-build_ruby30() {
- internal_build_cpp # For conformance tests.
- cd ruby && bash travis-test.sh ruby-3.0.2 && cd ..
-}
-build_ruby31() {
- internal_build_cpp # For conformance tests.
- cd ruby && bash travis-test.sh ruby-3.1.0 && cd ..
-}
-
-build_jruby92() {
- internal_build_cpp # For conformance tests.
- internal_build_java jdk8 && cd .. # For Maven protobuf jar with local changes
- cd ruby && bash travis-test.sh jruby-9.2.20.1 && cd ..
-}
-
-build_jruby93() {
- internal_build_cpp # For conformance tests.
- internal_build_java jdk8 && cd .. # For Maven protobuf jar with local changes
- cd ruby && bash travis-test.sh jruby-9.3.4.0 && cd ..
-}
-
-use_php() {
- VERSION=$1
- export PATH=/usr/local/php-${VERSION}/bin:$PATH
- internal_build_cpp
-}
-
-build_php() {
- use_php $1
- pushd php
- rm -rf vendor
- php -v
- php -m
- composer update
- composer test
- popd
- (cd conformance && make test_php)
-}
-
-test_php_c() {
- pushd php
- rm -rf vendor
- php -v
- php -m
- composer update
- composer test_c
- popd
- (cd conformance && make test_php_c)
-}
-
-build_php_c() {
- use_php $1
- test_php_c
-}
-
-build_php7.0_mac() {
- internal_build_cpp
- # Install PHP
- curl -s https://php-osx.liip.ch/install.sh | bash -s 7.0
- PHP_FOLDER=`find /usr/local -type d -name "php5-7.0*"` # The folder name may change upon time
- test ! -z "$PHP_FOLDER"
- export PATH="$PHP_FOLDER/bin:$PATH"
-
- # Install Composer
- wget https://getcomposer.org/download/2.0.13/composer.phar --progress=dot:mega -O /usr/local/bin/composer
- chmod a+x /usr/local/bin/composer
-
- # Install valgrind
- echo "#! /bin/bash" > valgrind
- chmod ug+x valgrind
- sudo mv valgrind /usr/local/bin/valgrind
-
- # Test
- test_php_c
-}
-
-build_php7.3_mac() {
- internal_build_cpp
- # Install PHP
- # We can't test PHP 7.4 with these binaries yet:
- # https://github.com/liip/php-osx/issues/276
- curl -s https://php-osx.liip.ch/install.sh | bash -s 7.3
- PHP_FOLDER=`find /usr/local -type d -name "php5-7.3*"` # The folder name may change upon time
- test ! -z "$PHP_FOLDER"
- export PATH="$PHP_FOLDER/bin:$PATH"
-
- # Install Composer
- wget https://getcomposer.org/download/2.0.13/composer.phar --progress=dot:mega -O /usr/local/bin/composer
- chmod a+x /usr/local/bin/composer
-
- # Install valgrind
- echo "#! /bin/bash" > valgrind
- chmod ug+x valgrind
- sudo mv valgrind /usr/local/bin/valgrind
-
- # Test
- test_php_c
-}
-
-build_php_compatibility() {
- internal_build_cpp
-}
-
-build_php_multirequest() {
- use_php 7.4
- php/tests/multirequest.sh
-}
-
-build_php8.0_all() {
- build_php 8.0
- build_php 8.1
- build_php_c 8.0
- build_php_c 8.1
-}
-
-build_php_all_32() {
- build_php 7.0
- build_php 7.1
- build_php 7.4
- build_php_c 7.0
- build_php_c 7.1
- build_php_c 7.4
- build_php_c 7.1-zts
- build_php_c 7.2-zts
- build_php_c 7.5-zts
-}
-
-build_php_all() {
- build_php_all_32
- build_php_multirequest
- build_php_compatibility
-}
-
-build_benchmark() {
- use_php 7.2
- cd kokoro/linux/benchmark && ./run.sh
-}
-
-# -------- main --------
-
-if [ "$#" -ne 1 ]; then
- echo "
-Usage: $0 { cpp |
- cpp_distcheck |
- csharp |
- java_jdk7 |
- java_oracle7 |
- java_jdk8 |
- java_jdk11 |
- java_jdk17 |
- java_linkage_monitor |
- objectivec_ios |
- objectivec_ios_debug |
- objectivec_ios_release |
- objectivec_osx |
- objectivec_tvos |
- objectivec_tvos_debug |
- objectivec_tvos_release |
- python |
- python_cpp |
- python_compatibility |
- ruby23 |
- ruby24 |
- ruby25 |
- ruby26 |
- ruby27 |
- ruby30 |
- ruby31 |
- jruby92 |
- jruby93 |
- ruby_all |
- php_all |
- php_all_32 |
- php7.0_mac |
- php7.3_mac |
- dist_install |
- benchmark }
-"
- exit 1
-fi
-
-set -e # exit immediately on error
-set -x # display all commands
-cd $(dirname $0)
-eval "build_$1"
diff --git a/third_party/abseil-cpp b/third_party/abseil-cpp
new file mode 160000
index 0000000..273292d
--- /dev/null
+++ b/third_party/abseil-cpp
@@ -0,0 +1 @@
+Subproject commit 273292d1cfc0a94a65082ee350509af1d113344d
diff --git a/third_party/benchmark b/third_party/benchmark
deleted file mode 160000
index 5b7683f..0000000
--- a/third_party/benchmark
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 5b7683f49e1e9223cf9927b24f6fd3d6bd82e3f8
diff --git a/third_party/googletest b/third_party/googletest
index 5ec7f0c..4c9a3bb 160000
--- a/third_party/googletest
+++ b/third_party/googletest
@@ -1 +1 @@
-Subproject commit 5ec7f0c4a113e2f18ac2c6cc7df51ad6afc24081
+Subproject commit 4c9a3bb62bf3ba1f1010bf96f9c8ed767b363774
diff --git a/third_party/utf8_range/BUILD.bazel b/third_party/utf8_range/BUILD.bazel
index 4a8a82b..693f390 100644
--- a/third_party/utf8_range/BUILD.bazel
+++ b/third_party/utf8_range/BUILD.bazel
@@ -1,3 +1,4 @@
+load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
# Pulled from: https://github.com/cyb70289/utf8
@@ -13,7 +14,24 @@
)
filegroup(
- name = "cmake_files",
- srcs = glob(["*"]),
- visibility = ["//cmake:__pkg__"],
+ name = "all_files",
+ srcs = glob([
+ "*.h",
+ "*.c",
+ ]) + [
+ "BUILD.bazel",
+ "LICENSE",
+ ],
+ visibility = [
+ "//cmake:__pkg__",
+ "//php:__pkg__",
+ "//ruby:__pkg__",
+ ],
+)
+
+pkg_files(
+ name = "dist_files",
+ srcs = [":all_files"],
+ strip_prefix = strip_prefix.from_root(""),
+ visibility = ["//pkg:__pkg__"],
)
diff --git a/toolchain/toolchains.bazelrc b/toolchain/toolchains.bazelrc
index fbd655b..908a26e 100644
--- a/toolchain/toolchains.bazelrc
+++ b/toolchain/toolchains.bazelrc
@@ -2,9 +2,12 @@
build:cross_config --host_crosstool_top=@bazel_tools//tools/cpp:toolchain
build:linux-aarch_64 --config=cross_config --cpu=linux-aarch_64
+build:linux-aarch64 --config=cross_config --cpu=linux-aarch_64
build:linux-ppcle_64 --config=cross_config --cpu=linux-ppcle_64
+build:linux-ppc64le --config=cross_config --cpu=linux-ppcle_64
build:linux-s390_64 --config=cross_config --cpu=linux-s390_64
build:linux-x86_32 --config=cross_config --cpu=linux-x86_32
+build:linux-i386 --config=cross_config --cpu=linux-x86_32
build:linux-x86_64 --config=cross_config --cpu=linux-x86_64
build:osx-aarch_64 --config=cross_config --action_env=MACOSX_DEPLOYMENT_TARGET=10.9 --cpu=osx-aarch_64
build:osx-x86_64 --config=cross_config --action_env=MACOSX_DEPLOYMENT_TARGET=10.9 --cpu=osx-x86_64
diff --git a/update_compatibility_version.py b/update_compatibility_version.py
deleted file mode 100755
index f93479b..0000000
--- a/update_compatibility_version.py
+++ /dev/null
@@ -1,56 +0,0 @@
-#!/usr/bin/env python
-"""Compatibility tests between last released and the current version.
-
-Usage: ./update_compatibility_version.py <MAJOR>.<MINOR>.<MICRO> [<RC version>]
-Example: ./update_compatibility_version.py 3.7.1
-"""
-
-from __future__ import print_function
-import re
-import sys
-
-if len(sys.argv) < 2 or len(sys.argv) > 3:
- print("""
-[ERROR] Please specify a version.
-
-./update_compatibility_version.py.py <MAJOR>.<MINOR>.<MICRO> [<RC version>]
-
-Example:
-./update_compatibility_version.py.py 3.7.1 2
-""")
- exit(1)
-
-NEW_VERSION = sys.argv[1]
-NEW_VERSION_INFO = NEW_VERSION.split('.')
-if len(NEW_VERSION_INFO) != 3:
- print("""
-[ERROR] Version must be in the format <MAJOR>.<MINOR>.<MICRO>
-
-Example:
-./update_compatibility_version.py.py 3.7.3
-""")
- exit(1)
-
-if len(sys.argv) > 2:
- RC_VERSION = int(sys.argv[2])
- # Do not update compatibility versions for rc release
- if RC_VERSION != 0:
- exit(0)
-
-
-def RewriteTextFile(filename, line_rewriter):
- lines = open(filename, 'r').readlines()
- updated_lines = []
- for line in lines:
- updated_lines.append(line_rewriter(line))
- if lines == updated_lines:
- print('%s was not updated. Please double check.' % filename)
- f = open(filename, 'w')
- f.write(''.join(updated_lines))
- f.close()
-
-
-def ReplaceVersion(line):
- return re.sub(r'LAST_RELEASED=.*$', 'LAST_RELEASED=%s' % NEW_VERSION, line)
-
-RewriteTextFile('tests.sh', ReplaceVersion)
diff --git a/update_file_lists.sh b/update_file_lists.sh
deleted file mode 100755
index 3ef366d..0000000
--- a/update_file_lists.sh
+++ /dev/null
@@ -1,195 +0,0 @@
-#!/bin/bash -u
-
-# This script copies source file lists from src/Makefile.am to cmake files.
-
-get_variable_value() {
- local FILENAME=$1
- local VARNAME=$2
- awk "
- BEGIN { start = 0; }
- /^$VARNAME =/ { start = 1; }
- { if (start) { print \$0; } }
- /\\\\\$/ { next; }
- { start = 0; }
- " $FILENAME \
- | sed "s/^$VARNAME =//" \
- | sed "s/[ \\]//g" \
- | grep -v "^\\$" \
- | grep -v "^$" \
- | LC_ALL=C sort | uniq
-}
-
-get_header_files() {
- get_variable_value $@ | grep '\.h$'
-}
-
-get_source_files() {
- get_variable_value $@ | grep "cc$\|inc$"
-}
-
-get_proto_files() {
- get_variable_value $@ | grep "pb.cc$" | sed "s/pb.cc/proto/"
-}
-
-sort_files() {
- for FILE in $@; do
- echo $FILE
- done | LC_ALL=C sort | uniq
-}
-
-MAKEFILE=src/Makefile.am
-
-[ -f "$MAKEFILE" ] || {
- echo "Cannot find: $MAKEFILE"
- exit 1
-}
-
-# Extract file lists from src/Makefile.am
-GZHEADERS=$(get_variable_value $MAKEFILE GZHEADERS)
-LIBPROTOBUF_HEADERS=$(get_variable_value $MAKEFILE nobase_include_HEADERS | grep -v /compiler/)
-LIBPROTOBUF_HEADERS=$(sort_files $GZHEADERS $LIBPROTOBUF_HEADERS)
-LIBPROTOBUF_LITE_SOURCES=$(get_source_files $MAKEFILE libprotobuf_lite_la_SOURCES)
-LIBPROTOBUF_SOURCES=$(get_source_files $MAKEFILE libprotobuf_la_SOURCES)
-LIBPROTOC_SOURCES=$(get_source_files $MAKEFILE libprotoc_la_SOURCES)
-LIBPROTOC_HEADERS=$(get_variable_value $MAKEFILE nobase_include_HEADERS | grep /compiler/)
-LITE_PROTOS=$(get_proto_files $MAKEFILE protoc_lite_outputs)
-PROTOS=$(get_proto_files $MAKEFILE protoc_outputs)
-WKT_PROTOS=$(get_variable_value $MAKEFILE nobase_dist_proto_DATA)
-COMMON_TEST_SOURCES=$(get_source_files $MAKEFILE COMMON_TEST_SOURCES)
-COMMON_LITE_TEST_SOURCES=$(get_source_files $MAKEFILE COMMON_LITE_TEST_SOURCES)
-TEST_SOURCES=$(get_source_files $MAKEFILE protobuf_test_SOURCES)
-NON_MSVC_TEST_SOURCES=$(get_source_files $MAKEFILE NON_MSVC_TEST_SOURCES)
-LITE_TEST_SOURCES=$(get_source_files $MAKEFILE protobuf_lite_test_SOURCES)
-LITE_ARENA_TEST_SOURCES=$(get_source_files $MAKEFILE protobuf_lite_arena_test_SOURCES)
-TEST_PLUGIN_SOURCES=$(get_source_files $MAKEFILE test_plugin_SOURCES)
-
-################################################################################
-# Update cmake files.
-################################################################################
-
-CMAKE_DIR=cmake
-EXTRACT_INCLUDES_BAT=cmake/extract_includes.bat.in
-[ -d "$CMAKE_DIR" ] || {
- echo "Cannot find: $CMAKE_DIR"
- exit 1
-}
-
-[ -f "$EXTRACT_INCLUDES_BAT" ] || {
- echo "Cannot find: $EXTRACT_INCLUDES_BAT"
- exit 1
-}
-
-set_cmake_value() {
- local FILENAME=$1
- local VARNAME=$2
- local PREFIX=$3
- shift
- shift
- shift
- awk -v values="$*" -v prefix="$PREFIX" "
- BEGIN { start = 0; }
- /^set\\($VARNAME/ {
- start = 1;
- print \$0;
- len = split(values, vlist, \" \");
- for (i = 1; i <= len; ++i) {
- printf(\" \");
- if (vlist[i] !~ /^\\\$/) {
- printf(\"%s\", prefix);
- }
- printf(\"%s\\n\", vlist[i]);
- }
- next;
- }
- start && /^\\)/ {
- start = 0;
- }
- !start {
- print \$0;
- }
- " $FILENAME > /tmp/$$
- cp /tmp/$$ $FILENAME
-}
-
-
-# Replace file lists in cmake files.
-CMAKE_PREFIX="\${protobuf_SOURCE_DIR}/src/"
-set_cmake_value $CMAKE_DIR/libprotobuf-lite.cmake libprotobuf_lite_files $CMAKE_PREFIX $LIBPROTOBUF_LITE_SOURCES
-set_cmake_value $CMAKE_DIR/libprotobuf.cmake libprotobuf_files $CMAKE_PREFIX $LIBPROTOBUF_SOURCES
-set_cmake_value $CMAKE_DIR/libprotoc.cmake libprotoc_files $CMAKE_PREFIX $LIBPROTOC_SOURCES
-set_cmake_value $CMAKE_DIR/libprotoc.cmake libprotoc_headers $CMAKE_PREFIX $LIBPROTOC_HEADERS
-set_cmake_value $CMAKE_DIR/tests.cmake lite_test_protos "" $LITE_PROTOS
-set_cmake_value $CMAKE_DIR/tests.cmake tests_protos "" $PROTOS
-set_cmake_value $CMAKE_DIR/tests.cmake common_test_files $CMAKE_PREFIX '${common_lite_test_files}' $COMMON_TEST_SOURCES
-set_cmake_value $CMAKE_DIR/tests.cmake common_lite_test_files $CMAKE_PREFIX $COMMON_LITE_TEST_SOURCES
-set_cmake_value $CMAKE_DIR/tests.cmake tests_files $CMAKE_PREFIX $TEST_SOURCES
-set_cmake_value $CMAKE_DIR/tests.cmake non_msvc_tests_files $CMAKE_PREFIX $NON_MSVC_TEST_SOURCES
-set_cmake_value $CMAKE_DIR/tests.cmake lite_test_files $CMAKE_PREFIX $LITE_TEST_SOURCES
-set_cmake_value $CMAKE_DIR/tests.cmake lite_arena_test_files $CMAKE_PREFIX $LITE_ARENA_TEST_SOURCES
-
-# Generate extract_includes.bat
-echo "mkdir include" > $EXTRACT_INCLUDES_BAT
-for INCLUDE in $LIBPROTOBUF_HEADERS $LIBPROTOC_HEADERS $WKT_PROTOS; do
- INCLUDE_DIR=$(dirname "$INCLUDE")
- while [ ! "$INCLUDE_DIR" = "." ]; do
- echo "mkdir include\\${INCLUDE_DIR//\//\\}"
- INCLUDE_DIR=$(dirname "$INCLUDE_DIR")
- done
-done | sort | uniq >> $EXTRACT_INCLUDES_BAT
-for INCLUDE in $(sort_files $LIBPROTOBUF_HEADERS $LIBPROTOC_HEADERS) $WKT_PROTOS; do
- WINPATH=${INCLUDE//\//\\}
- echo "copy \"\${PROTOBUF_SOURCE_WIN32_PATH}\\..\\src\\$WINPATH\" include\\$WINPATH" >> $EXTRACT_INCLUDES_BAT
-done
-
-################################################################################
-# Update bazel BUILD files.
-################################################################################
-
-set_bazel_value() {
- local FILENAME=$1
- local VARNAME=$2
- local PREFIX=$3
- shift
- shift
- shift
- awk -v values="$*" -v prefix="$PREFIX" "
- BEGIN { start = 0; }
- /# AUTOGEN\\($VARNAME\\)/ {
- start = 1;
- print \$0;
- # replace \$0 with indent.
- sub(/#.*/, \"\", \$0)
- len = split(values, vlist, \" \");
- for (i = 1; i <= len; ++i) {
- printf(\"%s\\\"%s%s\\\",\n\", \$0, prefix, vlist[i]);
- }
- next;
- }
- start && /\]/ {
- start = 0
- }
- !start {
- print \$0;
- }
- " $FILENAME > /tmp/$$
- cp /tmp/$$ $FILENAME
-}
-
-
-BAZEL_BUILD=./BUILD
-BAZEL_PREFIX="src/"
-if [ -f "$BAZEL_BUILD" ]; then
- set_bazel_value $BAZEL_BUILD protobuf_lite_srcs $BAZEL_PREFIX $LIBPROTOBUF_LITE_SOURCES
- set_bazel_value $BAZEL_BUILD protobuf_srcs $BAZEL_PREFIX $LIBPROTOBUF_SOURCES
- set_bazel_value $BAZEL_BUILD protoc_lib_srcs $BAZEL_PREFIX $LIBPROTOC_SOURCES
- set_bazel_value $BAZEL_BUILD lite_test_protos "" $LITE_PROTOS
- set_bazel_value $BAZEL_BUILD well_known_protos "" $WKT_PROTOS
- set_bazel_value $BAZEL_BUILD test_protos "" $PROTOS
- set_bazel_value $BAZEL_BUILD common_test_srcs $BAZEL_PREFIX $COMMON_LITE_TEST_SOURCES $COMMON_TEST_SOURCES
- set_bazel_value $BAZEL_BUILD test_srcs $BAZEL_PREFIX $TEST_SOURCES
- set_bazel_value $BAZEL_BUILD non_msvc_test_srcs $BAZEL_PREFIX $NON_MSVC_TEST_SOURCES
- set_bazel_value $BAZEL_BUILD test_plugin_srcs $BAZEL_PREFIX $TEST_PLUGIN_SOURCES
-else
- echo "Skipped BUILD file update."
-fi
-
diff --git a/update_version.py b/update_version.py
deleted file mode 100755
index 0ab9cc0..0000000
--- a/update_version.py
+++ /dev/null
@@ -1,405 +0,0 @@
-#!/usr/bin/env python3
-# Usage: ./update_version.py <MAJOR>.<MINOR>.<MICRO> [<RC version>]
-#
-# Example:
-# ./update_version.py 3.7.1 2
-# => Version will become 3.7.1-rc-2 (beta)
-# ./update_version.py 3.7.1
-# => Version will become 3.7.1 (stable)
-
-import datetime
-import re
-import sys
-from xml.dom import minidom
-
-if len(sys.argv) < 2 or len(sys.argv) > 3:
- print("""
-[ERROR] Please specify a version.
-
-./update_version.py <MAJOR>.<MINOR>.<MICRO> [<RC version>]
-
-Example:
-./update_version.py 3.7.1 2
-""")
- exit(1)
-
-NEW_VERSION = sys.argv[1]
-NEW_VERSION_INFO = [int(x) for x in NEW_VERSION.split('.')]
-if len(NEW_VERSION_INFO) != 3:
- print("""
-[ERROR] Version must be in the format <MAJOR>.<MINOR>.<MICRO>
-
-Example:
-./update_version.py 3.7.3
-""")
- exit(1)
-
-RC_VERSION = -1
-if len(sys.argv) > 2:
- RC_VERSION = int(sys.argv[2])
-
-
-def Find(elem, tagname):
- for child in elem.childNodes:
- if child.nodeName == tagname:
- return child
- return None
-
-
-def FindAndClone(elem, tagname):
- return Find(elem, tagname).cloneNode(True)
-
-
-def ReplaceText(elem, text):
- elem.firstChild.replaceWholeText(text)
-
-
-def GetFullVersion(rc_suffix = '-rc-'):
- if RC_VERSION < 0:
- return NEW_VERSION
- else:
- return '%s%s%s' % (NEW_VERSION, rc_suffix, RC_VERSION)
-
-
-def GetSharedObjectVersion():
- protobuf_version_offset = 11
- expected_major_version = 3
- if NEW_VERSION_INFO[0] != expected_major_version:
- print("""[ERROR] Major protobuf version has changed. Please update
-update_version.py to readjust the protobuf_version_offset and
-expected_major_version such that the PROTOBUF_VERSION in src/Makefile.am is
-always increasing.
- """)
- exit(1)
- return [NEW_VERSION_INFO[1] + protobuf_version_offset, NEW_VERSION_INFO[2], 0]
-
-
-def RewriteXml(filename, rewriter, add_xml_prefix=True):
- document = minidom.parse(filename)
- rewriter(document)
- # document.toxml() always prepend the XML version without inserting new line.
- # We wants to preserve as much of the original formatting as possible, so we
- # will remove the default XML version and replace it with our custom one when
- # whever necessary.
- content = document.toxml().replace('<?xml version="1.0" ?>', '')
- file_handle = open(filename, 'wb')
- if add_xml_prefix:
- file_handle.write(b'<?xml version="1.0" encoding="UTF-8"?>\n')
- file_handle.write(content.encode('utf-8'))
- file_handle.write(b'\n')
- file_handle.close()
-
-
-def RewriteTextFile(filename, line_rewriter):
- lines = open(filename, 'r').readlines()
- updated_lines = []
- for line in lines:
- updated_lines.append(line_rewriter(line))
- if lines == updated_lines:
- print('%s was not updated. Please double check.' % filename)
- f = open(filename, 'w')
- f.write(''.join(updated_lines))
- f.close()
-
-
-def UpdateCMake():
- cmake_files = (
- 'cmake/libprotobuf.cmake',
- 'cmake/libprotobuf-lite.cmake',
- 'cmake/libprotoc.cmake'
- )
- for cmake_file in cmake_files:
- RewriteTextFile(cmake_file,
- lambda line : re.sub(
- r'SOVERSION ([0-9]+)$',
- 'SOVERSION %s' % GetSharedObjectVersion()[0],
- line))
-
-
-def UpdateConfigure():
- RewriteTextFile('configure.ac',
- lambda line : re.sub(
- r'^AC_INIT\(\[Protocol Buffers\],\[.*\],\[protobuf@googlegroups.com\],\[protobuf\]\)$',
- ('AC_INIT([Protocol Buffers],[%s],[protobuf@googlegroups.com],[protobuf])'
- % GetFullVersion()),
- line))
-
-
-def UpdateCpp():
- cpp_version = '%d%03d%03d' % (
- NEW_VERSION_INFO[0], NEW_VERSION_INFO[1], NEW_VERSION_INFO[2])
- version_suffix = ''
- if RC_VERSION != -1:
- version_suffix = '-rc%s' % RC_VERSION
- def RewriteCommon(line):
- line = re.sub(
- r'^#define GOOGLE_PROTOBUF_VERSION .*$',
- '#define GOOGLE_PROTOBUF_VERSION %s' % cpp_version,
- line)
- line = re.sub(
- r'^#define PROTOBUF_VERSION .*$',
- '#define PROTOBUF_VERSION %s' % cpp_version,
- line)
- line = re.sub(
- r'^#define GOOGLE_PROTOBUF_VERSION_SUFFIX .*$',
- '#define GOOGLE_PROTOBUF_VERSION_SUFFIX "%s"' % version_suffix,
- line)
- line = re.sub(
- r'^#define PROTOBUF_VERSION_SUFFIX .*$',
- '#define PROTOBUF_VERSION_SUFFIX "%s"' % version_suffix,
- line)
- if NEW_VERSION_INFO[2] == 0:
- line = re.sub(
- r'^#define PROTOBUF_MIN_HEADER_VERSION_FOR_PROTOC .*$',
- '#define PROTOBUF_MIN_HEADER_VERSION_FOR_PROTOC %s' % cpp_version,
- line)
- line = re.sub(
- r'^#define GOOGLE_PROTOBUF_MIN_PROTOC_VERSION .*$',
- '#define GOOGLE_PROTOBUF_MIN_PROTOC_VERSION %s' % cpp_version,
- line)
- line = re.sub(
- r'^static const int kMinHeaderVersionForLibrary = .*$',
- 'static const int kMinHeaderVersionForLibrary = %s;' % cpp_version,
- line)
- line = re.sub(
- r'^static const int kMinHeaderVersionForProtoc = .*$',
- 'static const int kMinHeaderVersionForProtoc = %s;' % cpp_version,
- line)
- return line
-
- def RewritePortDef(line):
- line = re.sub(
- r'^#define PROTOBUF_VERSION .*$',
- '#define PROTOBUF_VERSION %s' % cpp_version,
- line)
- line = re.sub(
- r'^#define PROTOBUF_VERSION_SUFFIX .*$',
- '#define PROTOBUF_VERSION_SUFFIX "%s"' % version_suffix,
- line)
- if NEW_VERSION_INFO[2] == 0:
- line = re.sub(
- r'^#define PROTOBUF_MIN_HEADER_VERSION_FOR_PROTOC .*$',
- '#define PROTOBUF_MIN_HEADER_VERSION_FOR_PROTOC %s' % cpp_version,
- line)
- line = re.sub(
- r'^#define PROTOBUF_MIN_PROTOC_VERSION .*$',
- '#define PROTOBUF_MIN_PROTOC_VERSION %s' % cpp_version,
- line)
- line = re.sub(
- r'^#define GOOGLE_PROTOBUF_MIN_LIBRARY_VERSION .*$',
- '#define GOOGLE_PROTOBUF_MIN_LIBRARY_VERSION %s' % cpp_version,
- line)
- return line
-
- def RewritePbH(line):
- line = re.sub(
- r'^#if PROTOBUF_VERSION < .*$',
- '#if PROTOBUF_VERSION < %s' % cpp_version,
- line)
- line = re.sub(
- r'^#if .* < PROTOBUF_MIN_PROTOC_VERSION$',
- '#if %s < PROTOBUF_MIN_PROTOC_VERSION' % cpp_version,
- line)
- return line
-
- RewriteTextFile('src/google/protobuf/stubs/common.h', RewriteCommon)
- RewriteTextFile('src/google/protobuf/port_def.inc', RewritePortDef)
- RewriteTextFile('src/google/protobuf/any.pb.h', RewritePbH)
- RewriteTextFile('src/google/protobuf/api.pb.h', RewritePbH)
- RewriteTextFile('src/google/protobuf/descriptor.pb.h', RewritePbH)
- RewriteTextFile('src/google/protobuf/duration.pb.h', RewritePbH)
- RewriteTextFile('src/google/protobuf/empty.pb.h', RewritePbH)
- RewriteTextFile('src/google/protobuf/field_mask.pb.h', RewritePbH)
- RewriteTextFile('src/google/protobuf/source_context.pb.h', RewritePbH)
- RewriteTextFile('src/google/protobuf/struct.pb.h', RewritePbH)
- RewriteTextFile('src/google/protobuf/timestamp.pb.h', RewritePbH)
- RewriteTextFile('src/google/protobuf/type.pb.h', RewritePbH)
- RewriteTextFile('src/google/protobuf/wrappers.pb.h', RewritePbH)
- RewriteTextFile('src/google/protobuf/compiler/plugin.pb.h', RewritePbH)
-
-
-def UpdateCsharp():
- RewriteXml('csharp/src/Google.Protobuf/Google.Protobuf.csproj',
- lambda document : ReplaceText(
- Find(Find(document.documentElement, 'PropertyGroup'), 'VersionPrefix'),
- GetFullVersion(rc_suffix = '-rc')),
- add_xml_prefix=False)
-
- RewriteXml('csharp/Google.Protobuf.Tools.nuspec',
- lambda document : ReplaceText(
- Find(Find(document.documentElement, 'metadata'), 'version'),
- GetFullVersion(rc_suffix = '-rc')))
-
-
-def UpdateJava():
- RewriteXml('java/pom.xml',
- lambda document : ReplaceText(
- Find(document.documentElement, 'version'), GetFullVersion()))
-
- RewriteXml('java/bom/pom.xml',
- lambda document : ReplaceText(
- Find(document.documentElement, 'version'), GetFullVersion()))
-
- RewriteXml('java/core/pom.xml',
- lambda document : ReplaceText(
- Find(Find(document.documentElement, 'parent'), 'version'),
- GetFullVersion()))
-
- RewriteXml('java/lite/pom.xml',
- lambda document : ReplaceText(
- Find(Find(document.documentElement, 'parent'), 'version'),
- GetFullVersion()))
-
- RewriteXml('java/util/pom.xml',
- lambda document : ReplaceText(
- Find(Find(document.documentElement, 'parent'), 'version'),
- GetFullVersion()))
-
- RewriteXml('java/kotlin/pom.xml',
- lambda document : ReplaceText(
- Find(Find(document.documentElement, 'parent'), 'version'),
- GetFullVersion()))
-
- RewriteXml('java/kotlin-lite/pom.xml',
- lambda document : ReplaceText(
- Find(Find(document.documentElement, 'parent'), 'version'),
- GetFullVersion()))
-
- RewriteXml('protoc-artifacts/pom.xml',
- lambda document : ReplaceText(
- Find(document.documentElement, 'version'), GetFullVersion()))
-
- RewriteTextFile('java/README.md',
- lambda line : re.sub(
- r'<version>.*</version>',
- '<version>%s</version>' % GetFullVersion(),
- line))
-
- RewriteTextFile('java/README.md',
- lambda line : re.sub(
- r'implementation \'com.google.protobuf:protobuf-java:.*\'',
- 'implementation \'com.google.protobuf:protobuf-java:%s\'' % GetFullVersion(),
- line))
-
- RewriteTextFile('java/lite.md',
- lambda line : re.sub(
- r'<version>.*</version>',
- '<version>%s</version>' % GetFullVersion(),
- line))
-
-
-def UpdateMakefile():
- RewriteTextFile('src/Makefile.am',
- lambda line : re.sub(
- r'^PROTOBUF_VERSION = .*$',
- 'PROTOBUF_VERSION = %s' % ":".join(map(str,GetSharedObjectVersion())),
- line))
-
-
-def UpdateObjectiveC():
- RewriteTextFile('Protobuf.podspec',
- lambda line : re.sub(
- r"^ s.version = '.*'$",
- " s.version = '%s'" % GetFullVersion(rc_suffix = '-rc'),
- line))
- RewriteTextFile('Protobuf-C++.podspec',
- lambda line : re.sub(
- r"^ s.version = '.*'$",
- " s.version = '%s'" % GetFullVersion(rc_suffix = '-rc'),
- line))
-
-
-def UpdatePhp():
- def Callback(document):
- def CreateNode(tagname, indent, children):
- elem = document.createElement(tagname)
- indent += 1
- for child in children:
- elem.appendChild(document.createTextNode('\n' + (' ' * indent)))
- elem.appendChild(child)
- indent -= 1
- elem.appendChild(document.createTextNode('\n' + (' ' * indent)))
- return elem
-
- root = document.documentElement
- now = datetime.datetime.now()
- ReplaceText(Find(root, 'date'), now.strftime('%Y-%m-%d'))
- ReplaceText(Find(root, 'time'), now.strftime('%H:%M:%S'))
- version = Find(root, 'version')
- ReplaceText(Find(version, 'release'), GetFullVersion(rc_suffix = 'RC'))
- ReplaceText(Find(version, 'api'), NEW_VERSION)
- stability = Find(root, 'stability')
- ReplaceText(Find(stability, 'release'),
- 'stable' if RC_VERSION < 0 else 'beta')
- ReplaceText(Find(stability, 'api'), 'stable' if RC_VERSION < 0 else 'beta')
- changelog = Find(root, 'changelog')
- for old_version in changelog.getElementsByTagName('version'):
- if Find(old_version, 'release').firstChild.nodeValue == NEW_VERSION:
- print ('[WARNING] Version %s already exists in the change log.'
- % NEW_VERSION)
- return
- if RC_VERSION != 0:
- changelog.appendChild(document.createTextNode(' '))
- release = CreateNode('release', 2, [
- CreateNode('version', 3, [
- FindAndClone(version, 'release'),
- FindAndClone(version, 'api')
- ]),
- CreateNode('stability', 3, [
- FindAndClone(stability, 'release'),
- FindAndClone(stability, 'api')
- ]),
- FindAndClone(root, 'date'),
- FindAndClone(root, 'time'),
- FindAndClone(root, 'license'),
- CreateNode('notes', 3, []),
- ])
- changelog.appendChild(release)
- changelog.appendChild(document.createTextNode('\n '))
- RewriteXml('php/ext/google/protobuf/package.xml', Callback)
- RewriteTextFile('php/ext/google/protobuf/protobuf.h',
- lambda line : re.sub(
- r"^#define PHP_PROTOBUF_VERSION .*$",
- "#define PHP_PROTOBUF_VERSION \"%s\"" % GetFullVersion(rc_suffix = 'RC'),
- line))
-
-def UpdatePython():
- RewriteTextFile('python/google/protobuf/__init__.py',
- lambda line : re.sub(
- r"^__version__ = '.*'$",
- "__version__ = '%s'" % GetFullVersion(rc_suffix = 'rc'),
- line))
-
-def UpdateRuby():
- RewriteXml('ruby/pom.xml',
- lambda document : ReplaceText(
- Find(document.documentElement, 'version'), GetFullVersion()))
- RewriteXml('ruby/pom.xml',
- lambda document : ReplaceText(
- Find(Find(Find(document.documentElement, 'dependencies'), 'dependency'), 'version'),
- GetFullVersion()))
- RewriteTextFile('ruby/google-protobuf.gemspec',
- lambda line : re.sub(
- r'^ s.version = ".*"$',
- ' s.version = "%s"' % GetFullVersion(rc_suffix = '.rc.'),
- line))
-
-def UpdateBazel():
- RewriteTextFile('protobuf_version.bzl',
- lambda line : re.sub(
- r"^PROTOBUF_VERSION = '.*'$",
- "PROTOBUF_VERSION = '%s'" % GetFullVersion(),
- line))
-
-
-UpdateCMake()
-UpdateConfigure()
-UpdateCsharp()
-UpdateCpp()
-UpdateJava()
-UpdateMakefile()
-UpdateObjectiveC()
-UpdatePhp()
-UpdatePython()
-UpdateRuby()
-UpdateBazel()
diff --git a/util/python/BUILD.bazel b/util/python/BUILD.bazel
deleted file mode 100644
index 071efd2..0000000
--- a/util/python/BUILD.bazel
+++ /dev/null
@@ -1,22 +0,0 @@
-load("@rules_cc//cc:defs.bzl", "cc_library")
-
-exports_files(["BUILD.bazel"])
-
-# This is a placeholder for python headers. Projects needing to use
-# fast cpp protos in protobuf's python interface should build with
-# --define=use_fast_cpp_protos=true, and in addition, provide
-# //external:python_headers dependency that in turn provides Python.h.
-#
-# Projects that include protobuf using a Bazel external repository will need to
-# add a workspace rule to their WORKSPACE files to add an external workspace
-# that includes the Python headers. For example, the protobuf WORKSPACE file
-# includes the following local_repository rule that points to this directory:
-#
-# new_local_repository(
-# name = "python_headers",
-# path = __workspace_dir__ + "/util/python",
-# )
-cc_library(
- name = "python_headers",
- visibility = ["//visibility:public"],
-)
diff --git a/version.json b/version.json
index 28011e1..4244127 100644
--- a/version.json
+++ b/version.json
@@ -1,17 +1,17 @@
{
- "21.x": {
- "protoc_version": "21.8-dev",
+ "main": {
+ "protoc_version": "22-dev",
"lts": false,
- "date": "2022-09-29",
+ "date": "2022-07-21",
"languages": {
- "cpp": "3.21.8-dev",
- "csharp": "3.21.8-dev",
- "java": "3.21.8-dev",
- "javascript": "3.21.8-dev",
- "objectivec": "3.21.8-dev",
- "php": "3.21.8-dev",
- "python": "4.21.8-dev",
- "ruby": "3.21.8-dev"
+ "cpp": "3.22-dev",
+ "csharp": "3.22-dev",
+ "java": "3.22-dev",
+ "javascript": "3.22-dev",
+ "objectivec": "3.22-dev",
+ "php": "3.22-dev",
+ "python": "4.22-dev",
+ "ruby": "3.22-dev"
}
}
-}
\ No newline at end of file
+}